AI visibility monitoring, as an API.

Your customers ask ChatGPT, Perplexity and Google before they ever reach your site, and what those surfaces say about your brand changes without notice. The dashboards that track this (Profound, Otterly, Peec) are products, not building blocks. If you are building the dashboard, or need the raw observations in your own warehouse, you need the capture layer underneath: real consumer-UI captures, re-run on a schedule by the Watch API, in a stable contract you can diff.

The workflow, end to end.

Real endpoints, real field names, nothing below is pseudocode.

  1. step 1 / 4

    Submit the prompt set across surfaces and markets

    One POST per prompt fans out across every surface and region you care about, each (surface × region) becomes an independent child capture. Use /v1/search/batch for up to 500 prompts per call.

    POST /v1/search
    curl -sS -X POST "https://api.aisearchapi.dev/v1/search" \
      -H "Authorization: Bearer $AISEARCH_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "query": "best crm for startups",
        "surfaces": ["chatgpt", "perplexity", "copilot",
                     "google_ai_overview", "google_ai_mode"],
        "regions": [{ "country": "US" }, { "country": "GB" }],
        "webhook": {
          "url": "https://yourapp.com/hooks/aisearch",
          "secret": "whsec_…"
        }
      }'
    # → 202 { "jobId": "…", "children": [ …10 child ids… ] }
  2. step 2 / 4

    Receive each Envelope on your webhook (or poll)

    Each child posts its terminal Envelope to your webhook, HMAC-signed (X-AISearch-Signature over the timestamp + raw body, with an X-AISearch-Timestamp header). No webhook? Poll GET /v1/jobs/:childId. Either way the payload is the same canonical Envelope for every surface.

  3. step 3 / 4

    Read the answer and pull the visibility signals

    The answer arrives as answer.text and always-populated answer.markdown, the same shape for every surface. Run your own extraction over it: was your brand named, roughly where in the answer, in what light, and which competitors got recommended. One stable answer field, no per-provider parsers.

  4. step 4 / 4

    Diff captures over time and alert on change

    Store Envelopes keyed by (prompt, surface, region) and diff runs: your brand dropping out of the answer, a competitor entering the recommendations, an AI Overview no longer triggering (surfacePresent flipping to false), each is a concrete, alertable delta against the previous capture.

The Envelope fields that do the work.

Every surface returns the same canonical Envelope, so these fields mean the same thing whether the capture came from ChatGPT, Perplexity or an AI Overview.

answer.markdown

The actual answer users saw, normalized to markdown, the ground truth you read brand mentions and recommendations out of, diffable across captures.

answer.text

The same answer as plain text, ready for your own entity extraction or sentiment pass, no per-provider parsing.

provenance.surfacePresent

Distinguishes "the surface said nothing" from "the capture failed", absence is a tracked, truthful data point.

provenance.region

Requested-vs-effective market per capture, so cross-country visibility comparisons are trustworthy.

provenance.model

Which engine and model answered, observed vs inferred, so every visibility reading is attributable to a specific surface.

Honest limits

Live coverage is the eight consumer surfaces (ChatGPT, Perplexity, Gemini, Copilot, Google AI Overview/Mode/Search/News) plus Claude via the official Anthropic API. Login-walled surfaces like Meta AI, Grok, DeepSeek and Amazon Rufus are phase-2 roadmap. We never report them as monitorable today. Captures are guest sessions; personalized logged-in visibility is a phase-2 concern.

Terms used here, defined precisely: AI visibility · Envelope · Absence-is-data · Provenance

Asked precisely.

Is this a dashboard like Profound or Otterly?

No, it is the API those kinds of products need underneath: submit prompts, get back the real answer text in structured Envelopes. The Watch API handles scheduling and re-runs, and you can turn on Auto Extract for a scored mentions layer; storage, scoring and UI stay yours. If you want a finished dashboard, buy one; if you are building one, this is the capture layer.

How often should I capture?

You decide. Let the Watch API re-run each prompt on your chosen interval (one watch per prompt), or drive it yourself, the API is stateless per request, so daily or weekly per (prompt, surface, region) is entirely your call. Batch submits (500 items per call) plus webhooks make a nightly sweep across hundreds of prompts one request cycle. Charged-on-success means empty results never burn budget.

Do you extract brand mentions for me?

Either way, your call. Turn on Auto Extract (in beta, free while it lasts) and every answer comes back with a mentions layer: which brands were named, where they ranked, in what light, and whether they were cited. Prefer to own the logic? Leave it off and run your own brand and sentiment extraction over answer.text and answer.markdown. For browser-captured surfaces you can also opt into a proof-of-page HTML snapshot (include.html:true) so any reading stays auditable against the page it came from.

What does monitoring a brand cost, roughly?

Per-surface credit costs are published on the pricing page (3–6 credits per successful capture). As a worked example: 20 prompts × 5 surfaces × 2 regions daily is 200 captures/day, comfortably inside the Starter plan’s 150,000 monthly credits.

Build it on the capture layer.

500 free credits, charged only on successful captures. The whole workflow above runs on two endpoints.