Your AI visibility, from code or chat.
A REST API and an MCP server on every plan, free included. Same numbers as the dashboard.
Create a key
In your dashboard, open Settings → API and MCP and create a key. Read keys see every domain in the workspace; write keys can also add prompts (they arrive as suggestions and cost nothing until activated).
Call the API
curl https://getonym.com/api/v1/domains \ -H "Authorization: Bearer nod_..." curl "https://getonym.com/api/v1/domains/example.com/metrics?range=30d&branded=unbranded" \ -H "Authorization: Bearer nod_..."
Full reference with every parameter: /api/v1/docs (OpenAPI at /api/v1/openapi.json). 600 requests per minute per key. Domains can be addressed by id or host.
| Endpoint | What it returns |
|---|---|
| /domains | Domains in the workspace |
| /domains/{d}/metrics | Visibility, share of voice, position, citations, with n, 95% range and significance-tested change |
| /domains/{d}/timeseries | Per-run visibility for you and top competitors |
| /domains/{d}/competitors | Benchmark of tracked brands and untracked brands named |
| /domains/{d}/prompts | Prompt set with per-prompt performance |
| /domains/{d}/sources | Cited domains and URLs; view=gap for outreach targets |
| /domains/{d}/answers | The answers behind the numbers (include_text=true for full text) |
| /domains/{d}/changes | Run-over-run changes beyond noise |
| /domains/{d}/opportunities | Opportunities with evidence and measured impact |
| POST /domains/{d}/prompts | Add prompts as suggestions (write key) |
Connect an AI assistant (MCP)
Endpoint: https://getonym.com/mcp (Streamable HTTP, Bearer auth with the same key).
CLAUDE CODE
claude mcp add --transport http onym https://getonym.com/mcp \ --header "Authorization: Bearer nod_..."
CURSOR (~/.cursor/mcp.json)
{ "mcpServers": { "onym": {
"url": "https://getonym.com/mcp",
"headers": { "Authorization": "Bearer nod_..." } } } }Then ask things like “Which competitor gained on ChatGPT this month, and on which questions?” or “List the gap sources for example.com and draft outreach notes.”
| Tool | Does |
|---|---|
| list_domains | List the domains tracked in this workspace, with last run dates. |
| get_visibility | Headline metrics for a domain: visibility, share of voice, average position and citation rate, each with sample size, 95% range and a significance-tested change vs the previous period. |
| get_trend | Visibility per run for the brand and its top competitors. |
| get_competitors | Every tracked competitor's visibility, share of voice, position and change, plus untracked brands the engines name. |
| get_prompts | The domain's prompts with per-prompt visibility, change and the competitor named most. |
| get_prompt | Metrics, brands, sources and the latest answer per surface for one prompt. |
| get_sources | Domains and URLs the AI answers cite. view=gap lists third-party pages cited when competitors are named and the brand isn't. |
| search_answers | Find the actual AI answers. show=missing returns answers that name a competitor but not the brand. |
| get_answer | Full text, brands in order, citations and the searches the engine ran. |
| get_changes | Significant run-over-run changes (only those beyond normal noise). |
| get_opportunities | Ranked opportunities (content to publish, pages to get on) with evidence, and measured impact for shipped ones. |
| add_prompts | Add questions to track. They arrive as suggestions and cost nothing until activated in the dashboard. Needs a write key. |
Webhooks
Admins add endpoints in Settings → Webhooks. We POST JSON to public HTTPS URLs and retry up to three times; an endpoint is switched off after 20 consecutive failures.
| Event | When |
|---|---|
| run.completed | After each scheduled run: visibility (k, n, range) and how many real changes. |
| change.detected | The run produced changes beyond noise; includes each event. |
| opportunity.measured | A shipped opportunity reached a verdict: lift, drop or no clear change, with before/after. |
Every request carries X-Onym-Event and X-Onym-Signature: t=<unix>,v1=<hex>, where v1 is HMAC-SHA256 of "{t}.{raw body}" with your signing secret.
import hmac, hashlib, time
def verify(secret: str, body: bytes, header: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
t = int(parts["t"])
if abs(time.time() - t) > 300:
return False
mac = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(mac, parts["v1"])CHATGPT, CLAUDE.AI AND OTHER CONNECTOR UIS (OAUTH)
Add a custom connector with the URL https://getonym.com/mcp and no key. The app registers itself, sends you here to sign in and pick a workspace, and gets a token that refreshes automatically. Admins see and disconnect connected apps in Settings.
Looker Studio and Google Sheets
Flat, typed datasets built for BI tools: visibility (run date × surface × brand), prompts, sources and answers, as JSON or CSV at /api/v1/domains/{d}/datasets/{name}.
=IMPORTDATA("https://getonym.com/api/v1/domains/example.com/datasets/visibility.csv?range=90d&key=nod_...")Paste into Google Sheets, then use the sheet as a Looker Studio data source. Use a dedicated read key: it lives in the sheet. For a native Looker Studio connector, deploy the community connector in integrations/looker-studio/ (instructions in its README).