AI Search
Brand radar, prompt explorer, and AI citation checks — /seo/ai/brand-lookup, /seo/ai/brand-lookup/:jobId/status, /seo/ai/prompt-explorer, /seo/citations.
How a brand shows up inside AI answer engines: whether it is mentioned, what those engines actually say, and whether they cite the site.
Entitlement-gated
Brand radar and prompt explorer require AI search to be enabled on the account — otherwise 403 AI_SEARCH_NOT_ENABLED. A billing problem on an entitled account returns 402 AI_SEARCH_BILLING_ISSUE. POST /seo/citations is not gated.
Start a brand lookup
/seo/ai/brand-lookupQueues a brand-radar job. Returns immediately with a job handle — this is asynchronous work.
Request body
projectIdstringbodyrequiredOwning project.
querystringbodyrequiredThe brand name or domain to look up.
locationCodenumberbodydefault: 2840Numeric location code.
languageCodestringbodydefault: enTwo-letter language code.
competitorsstring[]bodyUp to 50 competitor names or domains to compare against.
Response fields
jobIdstringPoll this with the status endpoint.
lookupKeystringCache key identifying this lookup.
statusstringAlways queued on creation.
statusUrlstringReady-made URL for the status endpoint.
curl -X POST https://api.misar.io/seo/ai/brand-lookup \
-H "Authorization: Bearer $MISARSEO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "5b1c7d2e-…",
"query": "acme.com",
"competitors": ["competitor-a.com", "competitor-b.com"]
}'{
"jobId": "brl_9d3f2a10",
"lookupKey": "acme.com:2840:en",
"status": "queued",
"statusUrl": "/api/seo/ai/brand-lookup/brl_9d3f2a10/status?projectId=5b1c7d2e-…"
}Rate limit: 5 requests per 60 s.
There is no GET on this path
/seo/ai/brand-lookup accepts POST only. Results are read from the status endpoint below.
Poll a brand lookup
/seo/ai/brand-lookup/:jobId/statusNot rate limited — safe to poll.
Path parameters
jobIdstringpathrequiredFrom the queue response.
Query parameters
projectIdstringqueryrequiredOwning project.
Response fields
statusstringOne of queued, running, complete, errored, unknown.
resultobjectThe brand-radar payload. Present only when status is complete.
errorobject{ message }. Present only when status is errored.
progressnumber | nullPresent while the job is not terminal.
curl "https://api.misar.io/seo/ai/brand-lookup/brl_9d3f2a10/status?projectId=5b1c7d2e-…" \
-H "Authorization: Bearer $MISARSEO_API_KEY"{ "status": "running", "progress": 0.4 }{ "status": "complete", "result": { "mentions": 12, "sentiment": "positive" } }{ "status": "errored", "error": { "message": "provider timeout" } }Reading a completed result is free
The completed payload is served from cache. Polling after completion is idempotent and never re-charges. A job belonging to another organization returns 404, not 403.
Prompt explorer
/seo/ai/prompt-explorerRuns one prompt against up to four AI models and returns what each says — synchronously.
Request body
projectIdstringbodyrequiredOwning project.
promptstringbodyrequiredThe prompt to run.
modelsstring[]bodyrequiredBetween 1 and 4 entries, each one of chat_gpt, claude, gemini, perplexity. An unrecognised value rejects the whole request.
highlightBrandstringbodyA brand to highlight in the returned answers.
webSearchbooleanbodydefault: trueWhether models may search the web while answering.
webSearchCountryCodestringbodyTwo-letter country code scoping the web search. Validated against the supported list.
Response fields
resultobjectPer-model answers.
curl -X POST https://api.misar.io/seo/ai/prompt-explorer \
-H "Authorization: Bearer $MISARSEO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "5b1c7d2e-…",
"prompt": "What is the best SEO audit tool?",
"models": ["chat_gpt", "perplexity"],
"highlightBrand": "Acme",
"webSearch": true
}'{
"error": "Unknown model(s): gpt4. Valid values: chat_gpt, claude, gemini, perplexity",
"code": "VALIDATION_ERROR"
}Rate limit: 10 requests per 60 s.
Citation check
/seo/citationsChecks whether a domain is cited in grounded AI answers for a set of queries.
This endpoint is unauthenticated
It resolves no caller, takes no projectId, and is not rate limited. Treat it as a public utility and send nothing sensitive.
Request body
domainstringbodyrequiredThe domain to look for in the answers.
queriesstring[]bodyrequiredQueries to run. Only the first 10 are used; the rest are ignored silently.
Response fields
domainstringEcho of the requested domain.
checkednumberHow many queries were actually run.
citationsArray<{query, url, title?}>One entry per query where the domain was cited.
summaryobject{ queries, cited } — how many were run and how many produced a citation.
curl -X POST https://api.misar.io/seo/citations \
-H "Content-Type: application/json" \
-d '{
"domain": "acme.com",
"queries": ["best seo audit tool", "acme seo review"]
}'{
"domain": "acme.com",
"checked": 2,
"citations": [
{ "query": "best seo audit tool", "url": "https://acme.com/audit", "title": "Acme Site Audit" }
],
"summary": { "queries": 2, "cited": 1 }
}{ "error": "domain and queries[] required" }An empty result is ambiguous
If the grounded model is unavailable, this endpoint degrades to 200 with citations: [] rather than failing. An empty array means "not cited or the check could not run" — do not treat it as proof of absence.
Status codes
| Code | Meaning |
|---|---|
200 | Result returned |
202 | Brand lookup queued |
400 | VALIDATION_ERROR — bad model list, missing fields, too many competitors |
401 | UNAUTHENTICATED (not applicable to /seo/citations) |
402 | AI_SEARCH_BILLING_ISSUE |
403 | AI_SEARCH_NOT_ENABLED |
404 | NOT_FOUND — project or job not found |
422 | /seo/citations only — domain and queries[] required |
429 | RATE_LIMITED |
502 | /seo/citations only — citation detection unavailable |