New — AI visibility: see whether ChatGPT, Perplexity and Google AI answers cite your site. Run a free scan

Developers

Everything in the product is reachable from a terminal, a pipeline, or an AI agent. No SDK required — plain HTTPS and JSON.

Quickstart

# Scan any URL, no key needed (30/hour per IP)
curl "https://www.fastrank.ai/api/scan?url=example.com"

# Or from the terminal
npx visibility scan example.com

# With a key: unlimited scans + your projects
export VISIBILITY_API_KEY=vis_…      # Settings → API key
curl -H "Authorization: Bearer $VISIBILITY_API_KEY" https://www.fastrank.ai/api/v1/projects

Authentication

Create a key in Settings → API key. Send it as Authorization: Bearer vis_… or X-Api-Key: vis_…. Keys are scoped to your workspace; rotate or revoke anytime. Browser sessions also work for every endpoint, which makes the API easy to explore from the address bar.

REST API openapi.json

MethodPathWhat it does
GET/api/scan?url=Instant single-page scan: score, grade, issues, vitals, TLS, email auth. Public; &vitals=false for speed.
GET/api/pagespeed?url=&strategy=PageSpeed report: real-user Core Web Vitals, Lighthouse category scores, lab metrics, opportunities and diagnostics. strategy=mobile|desktop. Public, 10/hour without a key; 10–40 s on a cold URL.
GET/api/v1/checksAll 83 check definitions (id, name, severity, category).
GET/api/v1/meWorkspace, plan, limits, usage.
GET / POST/api/v1/projectsList projects, or create one ({"domain":"example.com"}) and queue its first audit.
GET/api/v1/projects/{id}Project, alerts config, latest audit with Core Web Vitals and TLS expiry.
GET/api/v1/projects/{id}/readinessReadiness score 0–100, grade, points to goal, next actions, failing checks.
GET/api/v1/projects/{id}/issuesIssues from the latest audit; filter ?check=, ?severity=.
GET/api/v1/projects/{id}/pagesCrawled pages with status, title, depth, words.
GET/api/v1/projects/{id}/keywordsTracked keywords with engine, device, locale and latest position.
GET/api/v1/projects/{id}/uptimeAvailability % and check history (?hours=).
GET / POST/api/v1/projects/{id}/auditsAudit history, or queue a new crawl.
GET/api/protect/projects/{id}CI gate: 200 pass, 412 fail, body explains why.

Rate limits: anonymous scans 30/hour/IP. Keyed requests are limited by plan. Responses are JSON; errors are {"error": "…", "hint": "…"}.

CLI

Zero-install via npx. Prints a scorecard, exits non-zero when the score is below --min — perfect for pre-deploy checks.

npx visibility scan https://example.com --min 80
npx visibility scan example.com --json | jq '.issues[] | select(.severity=="error")'
npx visibility projects                     # needs VISIBILITY_API_KEY
npx visibility readiness <project-id> --min 85
npx visibility audit <project-id> --wait    # queue a crawl and wait for the result
VISIBILITY_URL=https://www.fastrank.ai npx visibility scan example.com   # point at this instance

Source: packages/visibility-cli. Node 18+. Publish with npm publish from that folder.

CI gate & GitHub Action

Fail a pull request when a page regresses or when a project's thresholds are exceeded. Thresholds live in project settings.

# .github/workflows/seo.yml
name: SEO gate
on: [pull_request, deployment_status]
jobs:
  seo:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/visibility-audit        # or your-org/visibility-action@v1
        with:
          url: https://preview.example.com
          min-score: 80
          api-key: ${{ secrets.VISIBILITY_API_KEY }}    # optional
          base-url: https://www.fastrank.ai

Plain HTTP for any CI:

curl -fsS -H "Authorization: Bearer $VISIBILITY_API_KEY" https://www.fastrank.ai/api/protect/projects/$PROJECT_ID \
  || { echo "SEO gate failed"; exit 1; }

MCP server

Let Claude Desktop, Cursor, or any Model Context Protocol client scan sites and read your audits as tools: scan_url, compare_urls, list_projects, get_readiness, list_issues, trigger_audit, list_checks.

// claude_desktop_config.json / .cursor/mcp.json
{
  "mcpServers": {
    "visibility": {
      "command": "npx",
      "args": ["-y", "visibility-mcp"],
      "env": { "VISIBILITY_API_KEY": "vis_…", "VISIBILITY_URL": "https://www.fastrank.ai" }
    }
  }
}

Source: packages/visibility-mcp. Then ask: “Scan example.com and open GitHub issues for every error.”

Webhooks

Set a webhook URL per project (Alerts & integrations). We POST JSON with header X-Visibility-Event:

  • audit.completed — { projectId, domain, auditId, healthScore, previousHealthScore, pagesCrawled, errors }
  • audit.health_drop — same payload, sent when the drop exceeds your threshold
  • uptime.down / uptime.recovered — { project, statusCode, responseMs }
  • test — from the “Send test notification” button

Slack incoming webhooks work directly: the subject field renders as the message.

Badges

Project badge (updates with every audit, needs a public scorecard link): https://www.fastrank.ai/badge/<token>.svg.
Live badge for any URL: https://www.fastrank.ai/badge.svg?url=example.com

example badge [![SEO](https://www.fastrank.ai/badge.svg?url=example.com)](https://www.fastrank.ai/scan?url=example.com)

Embeddable audit widget

Drop a lead-capturing “free audit” form on your agency site. Results open on our scan page; the visitor's URL and email are POSTed to your data-lead endpoint.

<script src="https://www.fastrank.ai/embed/widget.js"
        data-title="Free SEO audit by Acme"
        data-lead="https://acme.example/api/leads"></script>

Browser extension beta

Scan the page you're on from the toolbar. Load packages/visibility-extension as an unpacked extension in Chrome (chrome://extensions → Developer mode → Load unpacked). Set the instance URL in the popup if you self-host.