Documentation
Foglift Developer Docs: API, CLI, MCP, and Webhooks
Everything you need to integrate Foglift, whether you're a developer building a pipeline, an AI agent scanning autonomously, or a team adding AI Readiness checks to CI/CD.
API answer
AI search monitoring API
Monitor ChatGPT, Perplexity, Claude, Gemini, and Google AI Overview from a single base URL, https://foglift.io/api/v1. Authenticate with X-API-Key and retrieve prompt-level mention, citation, competitor, and sentiment rows through the REST API, CLI, or MCP server. Answer text and provider errors remain separate, and citation evidence is available only where the engine exposes it.
Launch limits: 50 requests/day and 1,000 requests/month
Open the monitoring API reference →Quick Start
Three ways to use Foglift. Pick the one that fits your workflow.
For Humans (CLI)
foglift scan mysite.comColored output in terminal
For Code (API)
GET /api/v1/scan?url=...Structured JSON response
For AI Agents (MCP)
npx foglift-mcpClaude Code, Cursor, Windsurf
CLI Tool
Scan any website from your terminal. No signup, no API key required for basic scans.
Basic Usage
# Scan a website (colored output with scores and issues)
foglift scan https://example.com
# Output as JSON (for scripting)
foglift scan https://example.com --json
# Verbose mode (show all issues, not just top 5)
foglift scan https://example.com --verbose
# Fail CI if Site Technical Health is below threshold
foglift scan https://example.com --threshold 80Example Output
$ foglift scan https://example.com
Foglift Technical Audit
URL: https://example.com
Scanned: 2026-03-15 14:30:00 (12 seconds)
┌──────────────────────────────────────────────┐
│ Overall: C (79/100) │
├──────────────────────────────────────────────┤
│ SEO: █████████░ 85/100 A │
│ GEO: ███████░░░ 65/100 C │
│ AEO: ███████░░░ 71/100 C │
│ Performance: ████████░░ 78/100 C │
│ Security: ██████░░░░ 60/100 C │
│ Accessibility: █████████░ 91/100 A │
└──────────────────────────────────────────────┘
Issues Found: 8 (2 critical, 3 warnings, 3 info)
[AI Readiness] AI crawlers blocked by robots.txt
[AI Readiness] Missing FAQ schema markup
[Security] No Content-Security-Policy header
[SEO] Missing Open Graph image tag
[Security] No Permissions-Policy header
Full report → https://foglift.io/scan/abc123In current CLI output, Overall is Site Technical Health: the rounded equal mean of SEO, performance, security, and accessibility. GEO and AEO are compatibility labels from the raw scan. Use --json and read scores.aiReadiness for the separate canonical AI Readiness score.
CLI Flags
| Flag | Description |
|---|---|
| --json | Output raw JSON (for piping to jq, scripts, etc.) |
| --verbose | Show all issues (not just top 5) |
| --no-color | Disable colored output |
| --threshold=N | Exit with code 1 if Site Technical Health is below N (CI/CD use) |
| --workspace-id | Target a specific brand (multi-brand accounts). Get UUIDs at /dashboard/developer |
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Scan completed successfully (or Site Technical Health met the threshold) |
| 1 | Site Technical Health below --threshold, or scan error |
| 2 | Invalid URL or network error |
Advanced Commands (API key required)
Set FOGLIFT_API_KEY to unlock AI visibility monitoring, prompt management, and analytics.
| Command | Description |
|---|---|
| foglift scan batch <urls...> | Batch scan up to 10 URLs at once |
| foglift scan ai-check | Run AI visibility check across models |
| foglift scan results | Get historical AI visibility results |
| foglift scan prompts list | List saved monitoring prompts |
| foglift scan prompts add "text" | Add a new monitoring prompt |
| foglift scan prompts remove <id> | Delete a monitoring prompt |
| foglift scan models | Show enabled AI models and frequency |
| foglift scan sentiment | Get sentiment analysis trends |
| foglift scan referrers | Get AI-engine referrer visits by engine, path, and day |
| foglift scan usage | Show API usage and token balance |
| foglift scan history <url> | View scan history for a URL |
# Run AI visibility check with specific prompts and models
export FOGLIFT_API_KEY=sk_fog_your_key_here
foglift scan ai-check --prompt "best seo tools" --models chatgpt,perplexity
# View results from the last 7 days
foglift scan results --days 7 --model chatgpt --json
# Show AI-engine referrals by engine, path, and day
foglift scan referrers --days 30 --domain example.com
# Manage monitoring prompts
foglift scan prompts list
foglift scan prompts add "best alternatives to semrush"
# Check token usage
foglift scan usageREST API
The Foglift REST API provides programmatic access to website intelligence. Free, no auth required for basic scans.
Base URL
https://foglift.io/api/v1GET /api/v1/scan
Scan a website and return Technical Audit results: SEO, AI Readiness, performance, security, and accessibility.
A plain request reuses an eligible capture for the same URL within the one hour reuse window. A cache hit returnscached: true with the originalscannedAt value and does not debit a monitoring token. Pass refresh=true orforce=true to require a fresh crawl. Fresh and forced responses return cached: false with their new capture time.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Full URL to scan (include https://) |
| format | string | No | "json" (default) or "text" |
| refresh | boolean | No | Set true to require a fresh crawl instead of one-hour reuse |
| force | boolean | No | Alias for refresh=true |
Examples
# Reuse an eligible capture from the previous hour
curl "https://foglift.io/api/v1/scan?url=https://example.com"
# Require a fresh crawl (force=true is an equivalent alias)
curl "https://foglift.io/api/v1/scan?url=https://example.com&refresh=true"const response = await fetch(
"https://foglift.io/api/v1/scan?url=https://example.com"
);
const data = await response.json();
console.log(data.cached, data.scannedAt);
// true, "2026-09-17T18:30:00.000Z"
const issues = data.issues ?? data.topIssues;
console.log(data.scores, issues);import requests
response = requests.get(
"https://foglift.io/api/v1/scan",
params={"url": "https://example.com", "force": "true"}
)
data = response.json()
print(f"Site Technical Health: {data['scores']['overall']}/100")
print(f"AI Readiness: {data['scores']['aiReadiness']}/100")
print(f"Cached: {data['cached']} · captured {data['scannedAt']}")
for issue in data.get("issues", data.get("topIssues", [])):
print(f" [{issue['severity']}] {issue['title']}")Response Schema
Authenticated API-key or signed-in callers receive the complete issues list. Unauthenticated callers receive topIssues with the first three findings, plus the report and upgrade handoff shown below.
scores.overall is Site Technical Health. It excludes AI Readiness and equals the rounded mean of the four technical pillars. aiVisibility, geo, and aeo remain in scan responses for compatibility. They are not answer-level AI Visibility evidence. Use the AI Visibility endpoints below for mentions, citations, answer text, and provider errors.{
"url": "https://example.com",
"scores": {
"overall": 73,
"seo": 85,
"aiReadiness": 71,
"aiVisibility": 65,
"geo": 65,
"aeo": 71,
"performance": 78,
"security": 60,
"accessibility": 70
},
"issues": [
{
"category": "AI Visibility",
"severity": "critical",
"title": "AI crawlers blocked by robots.txt",
"description": "GPTBot and ClaudeBot are blocked. Add User-agent: GPTBot\nAllow: / to robots.txt"
}
],
"totalIssues": 12,
"cached": true,
"scannedAt": "2026-09-17T18:30:00.000Z",
"scoreContractVersion": "technical-audit-v3",
"scanId": "scan_abc123",
"fullReport": "https://foglift.io/scan/scan_abc123",
"_meta": {
"tool": "Foglift",
"version": "1.0",
"docs": "https://foglift.io/developers"
}
}{
"topIssues": [
{
"category": "AI Visibility",
"severity": "critical",
"title": "AI crawlers blocked by robots.txt",
"description": "..."
}
],
"totalIssues": 12,
"upgrade": "https://foglift.io/pricing",
"_meta": {
"tool": "Foglift",
"version": "1.0",
"docs": "https://foglift.io/developers",
"note": "Found 12 issues. Get the full report with all issues and AI action plan at the fullReport URL."
}
}Issue Severity Levels
| Severity | Impact | Action |
|---|---|---|
| critical | Directly hurts rankings or blocks AI indexing | Fix immediately |
| warning | Suboptimal, reduces visibility over time | Fix within a week |
| info | Best practice recommendation | Consider implementing |
Score Methodology
Site Technical Health is the public scores.overall value. Technical Audit v3 takes the rounded equal mean of four pillars:
AI Readiness is reported separately in scores.aiReadiness. It does not raise or lower Site Technical Health. AI Visibility is also separate: it comes from answer-level monitoring, not the page audit.
SEO Score (25% of Site Technical Health)
Traditional search engine optimization health. Based on Google Lighthouse SEO audit + custom checks.
- Title tag: present, 30-60 chars, unique, contains target keywords
- Meta description: present, 120-160 chars, compelling copy
- Heading hierarchy: single H1, logical H2-H6 nesting
- Open Graph tags: og:title, og:description, og:image for social sharing
- Twitter Card: twitter:card, twitter:title, twitter:image
- Canonical URL: present and self-referencing
- Image alt text: all images have descriptive alt attributes
- Language attribute: html lang="en" set for screen readers
- Robots directives: no accidental noindex/nofollow
- Sitemap.xml: discoverable at /sitemap.xml
- Robots.txt: present and not blocking important pages
AI Readiness Score (reported separately)
AI Readiness measures whether a page presents accessible, well-structured information that AI systems can parse. It does not claim that an engine cited the page.
- AI crawler access: GPTBot, ClaudeBot, PerplexityBot, Google-Extended not blocked in robots.txt
- Structured data depth: JSON-LD schemas such as Organization, FAQPage, Article, Product, HowTo, and LocalBusiness
- FAQ sections: direct question-and-answer content with clear context
- Entity markup: clear entity definitions (brand, people, products) via schema.org
- Content structure: clear headings, short paragraphs, bullet lists, tables
- Citation formatting: statistics with sources, expert quotes, attributed data points
- Meta quality: comprehensive, accurate metadata that helps AI understand page purpose
Performance Score (25% of Site Technical Health)
Page speed via Google PageSpeed Insights (Lighthouse). Directly from Google's scoring.
- LCP: Largest Contentful Paint (should be < 2.5s)
- CLS: Cumulative Layout Shift (should be < 0.1)
- INP: Interaction to Next Paint (should be < 200ms)
- FCP: First Contentful Paint
- Speed Index: visual progress of page load
- Total Blocking Time: main thread responsiveness
Security Score (25% of Site Technical Health)
HTTP security headers. Each missing header deducts points.
- HTTPS: valid SSL certificate, no mixed content
- Strict-Transport-Security: HSTS header with max-age
- Content-Security-Policy: CSP header present
- X-Frame-Options: clickjacking protection
- X-Content-Type-Options: MIME sniffing prevention (nosniff)
- Referrer-Policy: controls information leakage
- Permissions-Policy: restricts browser features
Accessibility Score (25% of Site Technical Health)
WCAG 2.1 compliance via Google Lighthouse accessibility audit.
- Color contrast: text meets WCAG AA ratio (4.5:1)
- Alt text: all informational images have descriptive alt
- Keyboard navigation: interactive elements reachable via Tab
- ARIA labels: dynamic/custom elements properly labeled
- Form labels: every input has an associated label
- Document language: lang attribute set
Score Interpretation Guide
These grade bands interpret Site Technical Health only. Use AI Readiness for page structure and AI Visibility for answer-level outcomes. A technical grade does not predict a mention, citation, or referral visit.
90-100: Excellent
Strong technical health across SEO, performance, security, and accessibility.
Action: Maintain current setup. Free workspaces include weekly Perplexity monitoring while active. Scheduled Free monitoring pauses after more than 42 days without qualifying activity; paid plans do not use this inactivity pause. Launch adds daily multi-engine monitoring.
80-89: Good
Solid foundation with a few areas to improve.
Action: Fix remaining critical and warning issues. Usually 2-5 specific items will push you to an A. Check the action recipes below.
60-79: Needs Work
Several technical pillars need attention.
Action: Prioritize critical issues, then improve the lowest of the four technical pillars. Review AI Readiness separately.
40-59: Poor
Major technical issues across multiple pillars.
Action: Start with the basics: ensure HTTPS, add meta tags, allow AI crawlers, add structured data. Each fix will have a significant impact at this level.
0-39: Critical
Fundamental technical issues need immediate attention.
Action: This usually means the site is blocking crawlers, has no meta tags, or has major technical issues. Follow the action recipes in order. Start with robots.txt and meta tags.
Action Recipes
For every issue Foglift can detect, here's the exact fix. AI agents: use these as copy-paste solutions when fixing issues programmatically.
AI Readiness Issues
AI crawlers blocked by robots.txt
GPTBot, ClaudeBot, or PerplexityBot is blocked. This means AI models cannot read your content.
Fix: Add these lines to your robots.txt:
User-agent: GPTBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /Verify: Rescan the site. AI Readiness should improve if crawler access was the primary blocker.
Missing structured data / JSON-LD
No JSON-LD schemas detected. AI models use structured data to understand your content type and key facts.
Fix: Add JSON-LD to your page's <head>:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Your Company",
"url": "https://yoursite.com",
"description": "What your company does in one sentence.",
"logo": "https://yoursite.com/logo.png",
"sameAs": [
"https://twitter.com/yourcompany",
"https://linkedin.com/company/yourcompany"
]
}
</script>Missing FAQ schema
No FAQPage schema detected. FAQ schemas are one of the highest-impact AI Readiness fixes because they give AI systems direct Q&A content to cite.
Fix:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What does your product do?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Our product does X, Y, and Z for [target audience]."
}
},
{
"@type": "Question",
"name": "How much does it cost?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Free to start. Paid plans from $X/month."
}
}
]
}
</script>SEO Issues
Missing or poor meta description
No meta description, or it's too short/long. This is the snippet shown in Google search results.
Fix: Add to <head>:
<meta name="description" content="120-160 characters describing what this page offers. Include your primary keyword naturally. Make it compelling because this is your ad copy in search results.">Missing Open Graph tags
No og:title, og:description, or og:image. Links shared on social media will look blank.
Fix:
<meta property="og:title" content="Page Title | Brand Name">
<meta property="og:description" content="Compelling description for social sharing.">
<meta property="og:image" content="https://yoursite.com/og-image.png">
<meta property="og:url" content="https://yoursite.com/this-page">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Page Title | Brand Name">
<meta name="twitter:description" content="Compelling description for Twitter.">
<meta name="twitter:image" content="https://yoursite.com/og-image.png">Security Issues
Missing security headers
Missing HSTS, CSP, X-Frame-Options, or other security headers. Affects both security and SEO ranking.
Fix (Next.js next.config.js):
const securityHeaders = [
{ key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload' },
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'X-XSS-Protection', value: '1; mode=block' },
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
];
module.exports = {
async headers() {
return [{ source: '/(.*)', headers: securityHeaders }];
},
};Fix (Vercel vercel.json):
{
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
{ "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
]
}
]
}MCP Server (AI Agents)
Foglift is available as an MCP (Model Context Protocol) server. AI coding assistants like Claude Code, Cursor, and Windsurf can scan websites and fix issues directly from your IDE.
Connecting from Claude.ai (web)
Add Foglift as a custom connector at claude.ai/customize:
- Click Add custom connector
- URL:
https://foglift.io/api/mcp - Click Connect, then sign in to Foglift when the consent screen appears. That's it. OAuth handles the rest.
Prefer an API key instead of OAuth? Open Advanced while adding the connector and set an Authorization header to Bearer sk_fog_… (create a key in Dashboard → Developer). https://mcp.foglift.io/api/mcp is an equivalent alternate endpoint. Both hosts support OAuth and API-key headers.
Installation (Claude Code CLI / IDEs)
npm install -g foglift-mcpClaude Code Setup
Add to ~/.claude/mcp.json:
{
"mcpServers": {
"foglift": {
"command": "npx",
"args": ["foglift-mcp"]
}
}
}Cursor Setup
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"foglift": {
"command": "npx",
"args": ["foglift-mcp"]
}
}
}Windsurf Setup
Add to ~/.windsurf/mcp.json:
{
"mcpServers": {
"foglift": {
"command": "npx",
"args": ["foglift-mcp"]
}
}
}Available MCP Tools
| Tool | Description | Parameters |
|---|---|---|
| scan_website | Run a full Technical Audit | url (required) |
| batch_scan | Scan multiple URLs at once | urls (required, array) |
| run_ai_visibility | Check AI visibility across engines | domain (required), brand_id, prompts, models, use_saved_prompts |
| get_ai_results | Retrieve AI visibility results | brand_id |
| get_prompts | List saved monitoring prompts | brand_id |
| add_prompt | Add a prompt to monitor | brand_id, prompt |
| delete_prompt | Remove a prompt | brand_id, prompt_id |
| get_models | Get AI model preferences (account-level) | none |
| set_models | Configure which AI models to track (account-level) | enabled_models, monitoring_frequency |
| get_sentiment | Get AI sentiment analysis | brand_id |
| get_usage | Check API usage and limits | none |
| get_scan_history | View past scan results | url (required) |
| get_geo_monitor | Get AI Visibility monitoring status | brand_id |
| get_referrer_analytics | Get AI-engine referral traffic by engine, path, and day | brand_id, days |
| estimate_cost | Pre-flight token cost before running AI visibility scans | brand_id, prompts, models |
| get_recommendations | Get source-tagged recommendations, diagnostics, and an agent reasoning recipe without Foglift generation spend | brand_id |
| submit_recommendation | Store an agent-generated recommendation as customer_agent | brand_id, title, description, rationale, expected_impact |
| apply_recommendation | Return the precise change-set or next action for a stored recommendation | brand_id, recommendation_id |
| generate_content_brief | Generate a brand-aware content brief for a recommendation target page | brand_id, url, recTitle |
| report_issue | Submit a structured bug, question, or feature request for Foglift triage | brand_id, summary, type, tool_or_endpoint, agent_hypothesis |
| whoami | Get account identity, plan, and token balance | none |
| recommend_setup | Calculate the sustainable prompt count from your saved account setup | none |
| apply_setup_recommendation | Create categorized prompts from a setup recommendation | brand_id, brand_name, competitors, industry, recommendation |
brand_id (get_ai_results, get_prompts, add_prompt, delete_prompt, get_sentiment, get_geo_monitor, get_referrer_analytics, estimate_cost, get_recommendations, submit_recommendation, apply_recommendation, generate_content_brief, report_issue, apply_setup_recommendation) require it when your account has more than one brand. workspace_id is accepted as a legacy alias. If omitted on a multi-brand account, the tool returns a structured error with your brand list instead of silently falling back. Get your brand UUIDs at /dashboard/developer.{
"error": "Account has multiple brands. Pass brand_id to disambiguate.",
"code": "multi_brand_disambiguation_required",
"docs_url": "https://foglift.io/docs/api-errors#multi_brand_disambiguation_required",
"request_id": "req_m3k7x9...",
"details": {
"brands": [
{ "id": "8f4c2a10-6c2f-4b2e-b2a1-4c5e7f8a9b10", "name": "Brand A", "domain": "branda.com" },
{ "id": "1f2e3d4c-5b6a-4789-8abc-0def12345678", "name": "Brand B", "domain": "brandb.com" }
]
}
}Example MCP Tool Response
MCP uses the same Technical Audit v3 contract as REST. scores.overall is Site Technical Health; scores.aiReadiness remains separate.
{
"url": "https://example.com",
"scores": { "overall": 79, "seo": 85, "aiReadiness": 71, "performance": 78, "security": 60, "accessibility": 91 },
"topIssues": [
{ "category": "AI Visibility", "severity": "critical", "title": "AI crawlers blocked by robots.txt", "description": "..." },
{ "category": "AI Visibility", "severity": "critical", "title": "No FAQ schema markup", "description": "..." },
{ "category": "Security", "severity": "warning", "title": "Missing CSP header", "description": "..." }
],
"totalIssues": 9,
"cached": true,
"scannedAt": "2026-09-17T18:30:00.000Z",
"scoreContractVersion": "technical-audit-v3",
"scanId": "scan_abc123",
"fullReport": "https://foglift.io/scan/scan_abc123",
"upgrade": "https://foglift.io/pricing",
"_meta": { "tool": "Foglift", "version": "1.0", "docs": "https://foglift.io/developers" }
}Agent Workflows
Complete workflows for AI agents using Foglift. Copy these patterns to build autonomous Technical Audit fix pipelines.
Workflow: Scan and Fix All Issues
The most common agent workflow: scan a site, then fix every issue found.
- Scan the site: Call
scan_websitewith the URL. Read the full response. - Prioritize by severity: Fix critical issues first, then warnings, then info.
- For each issue, look up the action recipe: Match the issue title to the recipes in this docs page.
- Apply the fix: Edit the relevant file (robots.txt, HTML head, config, etc.).
- Rescan to verify: Run
scan_websiteagain. Score should improve. - Commit and deploy: Push changes and redeploy the site.
Workflow: CI/CD Quality Gate
Block deploys when Technical Audit scores drop below a threshold.
- After deploy to staging: Scan the staging URL.
- Check Site Technical Health: If
scores.overallis below the threshold (for example, 70), fail the build. - Inspect AI Readiness separately: Report
scores.aiReadinesswithout folding it into the technical-health threshold. - Check for new critical issues: Compare with previous scan. Any new critical = fail.
- Report results: Post scores as a PR comment or CI artifact.
Workflow: New Site Setup
You just deployed a new Next.js/React site. Use Foglift to get it optimized from day one.
- Scan the deployed URL: Get baseline scores.
- Fix robots.txt: Allow all search engines and AI crawlers.
- Add meta tags: title, description, OG tags, Twitter card to every page.
- Add JSON-LD structured data: Organization + FAQPage at minimum.
- Add security headers: HSTS, CSP, X-Frame-Options, etc.
- Generate sitemap.xml: List all public pages.
- Submit to Google Search Console: Verify domain, submit sitemap.
- Rescan: Verify all scores are 80+.
Public API Reference
The full programmatic surface: scan websites, run AI visibility checks, manage monitoring prompts, pull sentiment and history, verify Sensor installs. Everything the CLI can do, your code and AI agents can do too.
Authentication
Authentication is operation-specific. Most endpoints use X-API-Key; batch audit, Search Trace, and analytics reads also accept Authorization: Bearer <key>, while sitemap audit is Bearer-only. Keys look like sk_fog_…. Generate and rotate keys at Dashboard → Developer. Keys are hashed with SHA-256 server-side and shown only once at creation.
Use the OpenAPI 3.1 JSON contract for code generation and operation-specific authentication, parameters, responses, pagination, rate limits, and token costs.
One API key is scoped to one account; if you have multiple brands under that account, pass brand_id where the endpoint supports it. Single-brand accounts auto-resolve without it. workspace_id is accepted as a legacy alias.
Multi-brand customers: always pass brand_id explicitly.
If omitted, per-brand endpoints return 400 with a multi_brand_disambiguation_required error and your brand list. Single-brand accounts auto-resolve without it. workspace_id is accepted as a legacy alias. Get your brand UUIDs at /dashboard/developer.
Endpoint Index
Every API-key-authenticated v1 endpoint currently live in production. Tier column lists the minimum paid tier required; Public means no auth needed.
| Method | Endpoint | Tier | Description |
|---|---|---|---|
| GET | /api/v1/scan | Public | Run a technical audit. Free for 10 scans/day per IP; higher per-plan limits with an API key. |
| POST | /api/v1/scan/batch | Launch+ | Scan up to 10 URLs in one request. |
| POST | /api/v1/scan/sitemap | Growth+ | Fetch sitemap.xml and scan up to 25 of its URLs. |
| POST | /api/v1/ai-visibility | Launch+ | Query ChatGPT, Perplexity, Claude, Gemini, and Google AI Overview for saved or custom prompts. Debits tokens per model. |
| GET | /api/v1/ai-visibility/results | Launch+ | Historical AI visibility results with filters and pagination. |
| GET | /api/v1/results/{result_id}/trace | Free preview; Launch+ full | Ordered Search Trace evidence for ChatGPT, Claude, Perplexity, and Google AI Overview; Gemini is unsupported. |
| GET | /api/v1/prompts | Launch+ | List tracked monitoring prompts for the workspace. |
| POST | /api/v1/prompts | Launch+ | Add one or more monitoring prompts. |
| DELETE | /api/v1/prompts | Launch+ | Remove a monitoring prompt by id. |
| GET | /api/v1/models | Launch+ | Get enabled AI models and monitoring frequency. |
| POST | /api/v1/models | Launch+ | Update enabled models and monitoring frequency. |
| GET | /api/v1/sentiment | Launch+ | Net Sentiment Score, daily trend, and per-engine breakdown. |
| GET | /api/v1/history | Launch+ | Paginated AI Visibility monitoring result rows for a workspace. |
| GET | /api/v1/monitor | Launch+ | Mention-rate summaries, citations where supported, and prompts over a 7/14/30-day window. |
| GET | /api/v1/sensor/verify | Launch+ | Validate an API key and report how many AI crawler visits have been logged in the last 30 days for the @foglift/sensor install. |
| GET | /api/v1/crawler-analytics | Launch+ | Read recognized AI crawler visits by agent, path, and time. |
| POST | /api/v1/crawler-analytics | Launch+ | Log a single AI crawler visit. Called by the @foglift/sensor middleware; 60 req/min per IP rate limit. |
| GET | /api/v1/referrer-analytics | Launch+ | Read AI-engine referrer visits (humans clicking through from ChatGPT, Claude, Perplexity, Gemini, Copilot, NotebookLM). Pairs with senseAITraffic in @foglift/sensor v1.0.0+. |
Tier naming: Launch+ means Launch ($49/mo), Growth ($129/mo), or Enterprise (Custom). Growth+ means Growth or Enterprise. See pricing.
POST /api/v1/ai-visibility
Run an AI visibility check across specified AI models. Debits tokens per model queried.
brand_id explicitly. If omitted on a multi-brand account, this endpoint returns a structured brand-disambiguation error instead of silently falling back.curl -X POST https://foglift.io/api/v1/ai-visibility \
-H "X-API-Key: sk_fog_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"brand_id": "WS_UUID",
"prompts": ["best project management tools", "top CRM software 2026"],
"models": ["chatgpt", "perplexity", "claude"]
}'Both prompts and models are optional. Omit prompts to use your saved monitoring prompts. Omit models to use your enabled models from preferences.
{
"success": true,
"outcome": "complete",
"code": "scan_complete",
"summary": {
"visibility_pct": 60,
"total_queries": 6,
"successful": 6,
"errors": 0,
"brand_mentions": 4,
"models_queried": ["chatgpt", "perplexity", "claude"],
"prompts_checked": 2,
"persisted_results": 6,
"unmatched_prompts": 0,
"dry_run": false,
"total_cost_usd": 0.038,
"brand_used": "Your Brand",
"domain_used": "yoursite.com",
"aliases_used": []
},
"results": [
{
"model": "ChatGPT",
"prompt": "best project management tools",
"brand_mentioned": true,
"position": 3,
"sentiment": "positive",
"sentiment_score": 0.82,
"response_text": "Here are the top project management...",
"citations": ["https://yoursite.com/features"],
"competitor_mentions": ["Asana", "Monday.com"],
"error": null
}
]
}brand_mentioned records whether the answer named the tracked brand; citations contains provider-supplied source URLs where available. Gemini monitoring does not currently expose citation tracking, so its citation array is empty even when the answer mentions the brand. Provider failures stay in error and in summary.errors; they are not counted as non-mentions in the visibility percentage.GET /api/v1/ai-visibility/results
Retrieve historical AI visibility results with filtering and pagination.
brand_id explicitly. If omitted, this endpoint returns multi_brand_disambiguation_required with your brand list. Single-brand accounts auto-resolve.# Last 7 days, all models
curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/ai-visibility/results?brand_id=WS_UUID&days=7"
# Filter by model and prompt
curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/ai-visibility/results?brand_id=WS_UUID&days=30&model=chatgpt&limit=100"GET /api/v1/results/{result_id}/trace
ChatGPT can return ordered queries, retrieved pages, citation labels, answer brands, and a coverage-aware 30-day prompt rollup. Claude, Perplexity, and Google AI Overview return ordered queries without page evidence. Gemini does not support Search Trace.
Evidence is tenant-scoped and retained for 90 days. Free preview; Launch+ full. Reading stored evidence does not run a new check.
curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/results/RESULT_UUID/trace?brand_id=WS_UUID"GET/POST /api/v1/models
Account-level settings: read or update which AI models are enabled and the monitoring frequency for every brand on the account.
# Get current settings
curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/models"
# Enable only ChatGPT and Perplexity, set weekly frequency
curl -X POST https://foglift.io/api/v1/models \
-H "X-API-Key: sk_fog_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled_models": { "chatgpt": true, "perplexity": true, "claude": false, "gemini": false, "ai-overview": false },
"monitoring_frequency": "weekly"
}'GET /api/v1/sentiment
Aggregated sentiment analysis. Returns a Net Sentiment Score (NSS, -100 to +100), daily trend, per-engine breakdown, and alerts. Accepts days (1-90, default 30).
brand_id explicitly. If omitted, this endpoint returns multi_brand_disambiguation_required with your brand list. Single-brand accounts auto-resolve.curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/sentiment?brand_id=WS_UUID&days=30"GET/POST/DELETE /api/v1/prompts
brand_id explicitly. If omitted, this endpoint returns multi_brand_disambiguation_required with your brand list. Single-brand accounts auto-resolve.Manage saved monitoring prompts. POST is server-side deduped (case-insensitive, against existing workspace prompts) and supports a Stripe-style Idempotency-Key header. Replays within 24h return the cached first response without re-inserting. Rate limits: 60 POSTs/minute and 1000 POSTs/day per account; over-limit responses return 429 with a Retry-After header.
# List prompts
curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/prompts?brand_id=WS_UUID"
# Add prompts (one POST can add multiple). Response shape:
# { "created": N, "inserted": N, "deduped": M, "prompts": [...] }
# Include Idempotency-Key for safe retry loops. Replays return the cached
# first response verbatim within a 24-hour window.
curl -X POST "https://foglift.io/api/v1/prompts" \
-H "X-API-Key: sk_fog_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: req-2026-05-11-001" \
-d '{"brand_id": "WS_UUID", "prompts": [{"text": "best AI search optimization tool"}, {"text": "tools to rank in ChatGPT"}]}'
# Remove a prompt by id
curl -X DELETE "https://foglift.io/api/v1/prompts" \
-H "X-API-Key: sk_fog_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"brand_id": "WS_UUID", "prompt_id": "prompt_abc123"}'GET /api/v1/history
Paginated historical AI Visibility result rows. Optional: limit (1-100, default 20), offset, prompt_id, model.
brand_id explicitly. If omitted, this endpoint returns multi_brand_disambiguation_required with your brand list. Single-brand accounts auto-resolve.curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/history?brand_id=WS_UUID&limit=50&model=chatgpt"GET /api/v1/monitor
Rolled-up monitoring snapshot: answer-level mention rates, recent citations where providers expose them, and active prompts over a period of 7d (default), 14d, or 30d.
brand_id explicitly. If omitted, this endpoint returns multi_brand_disambiguation_required with your brand list. Single-brand accounts auto-resolve.curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/monitor?brand_id=WS_UUID&period=30d"POST /api/v1/scan/batch
Scan up to 10 URLs in one request. Launch+ tier. Counts against your plan's daily scan limit.
curl -X POST "https://foglift.io/api/v1/scan/batch" \
-H "X-API-Key: sk_fog_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://site-a.com", "https://site-b.com", "https://site-c.com"]}'POST /api/v1/scan/sitemap
Fetch the target site's sitemap.xml and scan up to 25 URLs from it. Growth+ tier. Auth via Authorization: Bearer sk_fog_… header.
curl -X POST "https://foglift.io/api/v1/scan/sitemap" \
-H "Authorization: Bearer sk_fog_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "limit": 25}'GET /api/v1/sensor/verify
Validate an API key and return setup status for the @foglift/sensor package. The response includes valid, tier, and crawlers_tracked (30-day count).
curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/sensor/verify"POST /api/v1/crawler-analytics
Log a single AI crawler hit (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, etc.). Used by the @foglift/sensor middleware to record visits from bots. Rate-limited to 60 requests/minute per IP. Body: { path, userAgent, hostname, brand_id, timestamp }.
brand_id in the JSON body or query string. workspace_id is accepted as a legacy alias. If omitted, Foglift uses hostname when it matches one of your brands; otherwise it returns multi_brand_disambiguation_required with your brand list.curl -X POST "https://foglift.io/api/v1/crawler-analytics" \
-H "X-API-Key: sk_fog_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"path": "/pricing",
"userAgent": "Mozilla/5.0 (compatible; GPTBot/1.0)",
"hostname": "example.com",
"brand_id": "WS_UUID"
}'GET /api/v1/referrer-analytics
Read AI-engine referrer visits: humans who clicked through from ChatGPT, Claude, Perplexity, Gemini, Copilot, or NotebookLM. This is the Sensor counterpart for human traffic. It pairs with @foglift/sensor v1.0.0+ which dispatches both signals (UA-detected bot crawls and Referer-detected human visits) from one install. Optional days (1-365, default 30).
brand_id explicitly. If omitted, this endpoint returns multi_brand_disambiguation_required with your brand list. Single-brand accounts auto-resolve.curl -H "X-API-Key: sk_fog_YOUR_KEY" \
"https://foglift.io/api/v1/referrer-analytics?brand_id=WS_UUID&days=30"For customer-visible outcome totals, use this endpoint. The underlying referrer_visits_daily and referrer_visits_paths_daily tables are raw diagnostic history and can retain legacy infrastructure requests for auditability; the API filters those requests out.
Sensor SDK: senseAITraffic (v1.0.0)
The @foglift/sensor npm package ships one unified middleware function, senseAITraffic, that handles both signals in a single install: AI bot crawls (User-Agent matches GPTBot, ClaudeBot, PerplexityBot, etc.) and AI engine referrals (Referer header matches chatgpt.com, claude.ai, perplexity.ai, gemini.google.com, copilot.microsoft.com, notebooklm.google.com). Both classes of visit are POSTed to /api/v1/crawler-analytics with a source field of "crawler" or "referrer". Read aggregated referrer counts back via /api/v1/referrer-analytics (above).
import { senseAITraffic } from "@foglift/sensor/nextjs";
export const middleware = senseAITraffic({
apiKey: process.env.FOGLIFT_API_KEY!,
});
export const config = {
matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
};import express from "express";
import { senseAITraffic } from "@foglift/sensor/express";
const app = express();
app.use(senseAITraffic({ apiKey: process.env.FOGLIFT_API_KEY! }));Referrer-visit reporting starts automatically when the Sensor middleware is mounted. Existing installations keep working through compatibility aliases, while new installs should use the Sensor package and exports shown above.
Dashboard-Internal Endpoints
Foglift also exposes ~30 additional v1 endpoints that authenticate via the dashboard session cookie rather than an API key. These back the web dashboard and aren't meant for scripted use. From a server or automation, prefer the API-key endpoints above.
You can still call them from an authenticated browser context (e.g. a logged-in Foglift tab's DevTools console, or a Chrome extension running with the user's cookies). They are documented here for completeness and because AI agents sometimes need to reference them.
| Area | Endpoints |
|---|---|
| Scans & timeline | GET /api/v1/scan-history, GET /api/v1/scan-diff, GET /api/v1/scan-timeline, GET/POST /api/v1/scheduled-scans |
| AI Readiness scoring | GET /api/v1/aeo-score, GET /api/v1/aeo-history, GET /api/v1/workspace-aeo |
| Content briefs & recommendations | GET /api/v1/content-brief, GET /api/v1/content-recommendations, GET /api/v1/workspace-briefs |
| Competitive intel | GET /api/v1/competitor-suggestions, GET /api/v1/competitor-trends, GET /api/v1/competitors/per-engine |
| Crawler analytics (dashboard read) | GET /api/v1/crawler-analytics |
| Account & workspace | GET/POST /api/v1/brands, GET/POST/PATCH/DELETE /api/v1/team, GET/POST/DELETE /api/v1/keys, GET/PATCH /api/v1/preferences, GET/POST/PATCH/DELETE /api/v1/client-portal |
| Tokens & usage | GET /api/v1/tokens/balance, GET /api/v1/tokens/usage, GET /api/v1/usage |
| Notifications & webhooks | GET/PATCH /api/v1/notifications, GET/POST /api/v1/webhooks, GET /api/v1/webhook-logs |
| Integrations | GET/POST/DELETE /api/v1/integrations/slack, …/discord, …/teams |
| Search Console & export | GET /api/v1/search-console, GET /api/v1/search-console/sites, GET /api/v1/export, POST /api/v1/export/pdf |
| Misc | GET /api/v1/geo-monitor, GET/POST /api/v1/email-templates, POST/GET /api/v1/onboarding-analytics |
If you need one of these programmatically, open a support request: we can promote it to API-key auth or surface the same data through an existing public endpoint.
API Pricing, Limits & Authentication
Technical Audit requests count against the API request allowance below. AI Visibility checks also debit monthly tokens for every prompt-engine pair in the request. Multiply each selected engine's token cost by the number of prompts. A request with one prompt across all five engines costs 19 tokens.
AI Visibility token cost per prompt
| Engine | Tokens per prompt | Live web retrieval |
|---|---|---|
| ChatGPT | 3 | Included |
| Google AI Overview | 3 | Included |
| Gemini | 3 | Included |
| Claude | 5 | Included |
| Perplexity | 5 | Included |
Plan request and token allowances
| Tier | Auth | API requests | Included capability |
|---|---|---|---|
| Free | None | 10/day, 100/month | Technical Audits plus weekly Perplexity monitoring while active |
| Launch ($49/mo) | API Key | 50/day, 1,000/month | 4,000 tokens/month, all 5 AI engines, 3 brands, batch scans |
| Growth ($129/mo) | API Key | 200/day, 5,000/month | 11,500 tokens/month, all 5 AI engines, 10 brands, batch and sitemap scans |
| Enterprise (Custom) | API Key | Custom | Custom request and token allowances, unlimited brands |
For authenticated AI Visibility API requests, include: X-API-Key: sk_fog_YOUR_KEY
Error Handling
| HTTP | Error | Meaning | Action |
|---|---|---|---|
| 400 | invalid_url | URL missing or malformed | Include full URL with https:// |
| 429 | rate_limited | Daily limit exceeded | Wait 24 hours or upgrade plan |
| 500 | scan_failed | Target unreachable | Verify URL is accessible |
| 503 | service_unavailable | Foglift temporarily down | Retry in a few minutes |
{
"error": "Too many requests. Please retry after the rate limit window resets.",
"code": "rate_limited",
"docs_url": "https://foglift.io/docs/api-errors#rate_limited",
"request_id": "req_m3k7x9..."
}Every error includes a machine-readable code, a docs_url linking to recovery steps, and a request_id for support correlation. See the full API Error Reference for all 16 error codes with example requests, responses, and recovery steps.
CI/CD Integration
Add Foglift scans to your deployment pipeline to catch technical-health regressions before they ship. Read AI Readiness separately from the JSON response when content structure is also part of the gate.
GitHub Actions (Official Action)
Use the official Foglift GitHub Action for the simplest setup. Generates a Job Summary with scores and a link to the full report.
name: Website Health Check
on:
push:
branches: [main]
schedule:
- cron: '0 9 * * 1' # Weekly on Monday
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: banant2/Foglift@main
id: foglift
with:
url: 'https://yoursite.com'
threshold: '70' # Fail if Site Technical Health < 70
# Optional: Use outputs in subsequent steps
- run: echo "Score: ${{ steps.foglift.outputs.overall }}/100 (${{ steps.foglift.outputs.grade }})"
| Input | Required | Description |
|---|---|---|
| url | Yes | URL to scan |
| threshold | No | Minimum Site Technical Health (action fails if below) |
| categories | No | Categories to check (seo,geo,performance,security,accessibility) |
Outputs: overall, seo, geo, performance, security, accessibility, issues, grade, report_url. The overall output is Site Technical Health. geo is a legacy raw-scan compatibility output, not the canonical AI Readiness field. Read scores.aiReadiness from CLI JSON or the REST response when you need AI Readiness.
GitLab CI
foglift-scan:
stage: test
script:
- RESULT=$(curl -s "https://foglift.io/api/v1/scan?url=$SITE_URL")
- SCORE=$(echo $RESULT | jq '.scores.overall')
- echo "Site Technical Health: $SCORE/100"
- '[ "$SCORE" -ge 60 ] || (echo "Score below threshold" && exit 1)'Shell Script
#!/bin/bash
URL=${1:-"https://yoursite.com"}
THRESHOLD=${2:-70}
RESULT=$(curl -s "https://foglift.io/api/v1/scan?url=$URL")
SCORE=$(echo $RESULT | jq '.scores.overall')
echo "Site Technical Health for $URL: $SCORE/100"
if [ "$SCORE" -lt "$THRESHOLD" ]; then
echo "FAIL: Score $SCORE is below threshold $THRESHOLD"
echo $RESULT | jq '.issues[] | select(.severity == "critical") | .title'
exit 1
fi
echo "PASS: Score meets threshold"
exit 0Integrations
Connect Foglift to your existing tools and workflows. Use the REST API as the foundation for any integration.
GitHub Actions
AvailableOfficial action: uses: banant2/Foglift@main. See CI/CD section above.
Slack Notifications
Via WebhookSend scan results to a Slack channel using incoming webhooks. Trigger from CI/CD or a cron job.
Zapier / Make
Via WebhookUse Foglift's API as a webhook trigger in Zapier or Make to automate scan-report-act workflows.
Google Sheets
Via APIUse Apps Script + Foglift API to log scan results to a spreadsheet. Great for client reports.
BI Tools (Looker, Tableau)
Via REST APIConnect the REST API as a data source. Build dashboards with Technical Audit and AI Visibility trend data over time.
Webhooks
AvailableGet notified when scores change. Subscribe to events for automated workflows and alerting.
Slack Integration Example
#!/bin/bash
# Scan and send results to Slack
RESULT=$(curl -s "https://foglift.io/api/v1/scan?url=https://yoursite.com")
SCORE=$(echo $RESULT | jq -r '.scores.overall')
READINESS=$(echo $RESULT | jq -r '.scores.aiReadiness')
curl -X POST "$SLACK_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{
\"text\": \"Foglift Site Technical Health: $SCORE/100 for yoursite.com\",
\"blocks\": [{
\"type\": \"section\",
\"text\": { \"type\": \"mrkdwn\", \"text\": \"*Site Technical Health:* $SCORE/100\\nSEO: $(echo $RESULT | jq '.scores.seo') | AI Readiness: $READINESS | Perf: $(echo $RESULT | jq '.scores.performance')\\n<https://foglift.io|View full report>\" }
}]
}"Google Sheets Integration
function scanWithFoglift() {
const url = "https://yoursite.com";
const response = UrlFetchApp.fetch(
"https://foglift.io/api/v1/scan?url=" + encodeURIComponent(url)
);
const data = JSON.parse(response.getContentText());
const sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow([
new Date(),
url,
data.scores.overall,
data.scores.seo,
data.scores.aiReadiness,
data.scores.performance,
data.scores.security,
data.scores.accessibility
]);
}Frequently asked questions
Common developer questions about authentication, rate limits, scoring, and integration patterns. For account-level help see the general FAQ.
Do I need an API key to scan a website?
No. The unauthenticated GET /api/v1/scan endpoint allows up to 10 scans per day from a single IP. That is useful for local testing, quick checks from a script, or running the CLI without signing up. An API key (sk_fog_ prefix, generated at /dashboard/developer) is required for the AI Visibility endpoints, batch scans, prompt management, sentiment, history, and any request that needs your tier's higher daily allowance. Pass it as an X-API-Key request header.
Should I use the CLI, REST API, or MCP server?
Pick by who is making the call. The CLI (foglift scan <url>) is the right surface for terminals and CI/CD pipelines because it supports --threshold to fail builds and --json for piping into other tools. The REST API is for application backends and serverless functions where your code drives the request and parses JSON. The MCP server (Model Context Protocol, the open standard introduced by Anthropic in November 2024) is for AI coding agents like Claude Code, Cursor, and Windsurf. It lets the assistant invoke Foglift autonomously as a tool while it works on your codebase. All three sit on the same v1 API underneath, so switching surfaces never costs you data parity.
What's the difference between AI Readiness and AI Visibility?
AI Readiness is a separate, page-scoped structural score computed across 8 weighted dimensions: Structured Data Richness (20%), Heading Clarity (15%), FAQ Quality (15%), Content Depth (15%), Entity Identity (10%), Citation Formatting (10%), AI Crawler Access (10%), and Topical Authority (5%). It is not part of Site Technical Health. AI Visibility is answer-level evidence from ChatGPT, Perplexity, Claude, Gemini, and Google AI Overview. Each result keeps the answer text, brand mention, competitor mentions, sentiment, provider citations where supported, and provider errors as distinct fields. A mention is not a citation, and neither one proves a referral visit.
Which AI engines does the AI Visibility check query, and how are tokens billed?
The check fans out across five engines: ChatGPT, Perplexity, Claude, Gemini, and Google AI Overview. Each query consumes monthly tokens at different rates because the underlying providers price differently: Gemini, ChatGPT, and AI Overview cost 3 tokens each, while Claude and Perplexity cost 5. Choose the engines you want via POST /api/v1/models. Citation evidence depends on the provider: Gemini monitoring currently records mentions and answer text but does not expose citation tracking. Gartner's 2024 forecast projected traditional search engine volume would drop 25% by 2026 as users move queries to AI assistants (Gartner press release, Feb 2024).
What rate limits apply, and what happens when I hit one?
Limits are per UTC day and per calendar month, scoped to your account. Free tier: 10 scans/day via API (5 via the website), 100/month. Launch ($49/mo): 50/day, 1,000/month, plus 4,000 AI Visibility tokens/month. Growth ($129/mo): 200/day, 5,000/month, 11,500 tokens/month. Enterprise uses custom pricing, API limits, and token allowances. When you exceed the daily ceiling the API returns HTTP 429 with a JSON body { "error": "rate_limited", "limitReached": true }. The reset clock ticks at 00:00 UTC. A plain Scan request can reuse an eligible capture from the previous hour; that cache hit is a read and does not debit a monitoring token. Use refresh=true or force=true only when you need a new capture.
Can Foglift run inside a CI/CD pipeline as a quality gate?
Yes. Run `foglift scan https://your-staging-url --threshold 80` and the process exits with a non-zero code when Site Technical Health falls below 80. Pair it with --json to retain the separate AI Readiness score and full report as CI artifacts. The official GitHub Action `uses: banant2/Foglift@main` posts a Job Summary with scores and a report link. Use the threshold for the four-pillar Site Technical Health gate, then inspect AI Readiness separately for content-structure regressions.
How do I track a competitor's AI visibility?
Add the queries you want to monitor with POST /api/v1/prompts, then call POST /api/v1/ai-visibility across your enabled engines. Each answer row returns `brand_mentioned` and `competitor_mentions`; provider-supplied source URLs stay in `citations`, and failures stay in `error`. Do not infer a competitor mention from a citation URL or count an errored provider call as a non-mention. Tier caps how many brand workspaces you can track simultaneously: Launch supports 3 brands, Growth supports 10, Enterprise is unlimited. Compare answer-level rows via GET /api/v1/ai-visibility/results.
Are scan results cached, or do they run live every time?
A plain GET /api/v1/scan request reuses an eligible scan record for the same URL when it was captured within the previous hour. A cache hit returns cached: true and the original scannedAt timestamp, and it does not debit a monitoring token. Pass refresh=true or force=true to require a fresh crawl; fresh and forced responses return cached: false with the new capture time. Successful Technical Audit captures are stored as scan records so their full reports remain available. Pull historical scores via GET /api/v1/scan/history?url=... to trend a domain over time.
Ready to integrate?
Start scanning with no API key required for basic scans.