Developers

Your AI visibility, from code or chat.

A REST API and an MCP server on every plan, free included. Same numbers as the dashboard.

01

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).

02

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.

EndpointWhat it returns
/domainsDomains in the workspace
/domains/{d}/metricsVisibility, share of voice, position, citations, with n, 95% range and significance-tested change
/domains/{d}/timeseriesPer-run visibility for you and top competitors
/domains/{d}/competitorsBenchmark of tracked brands and untracked brands named
/domains/{d}/promptsPrompt set with per-prompt performance
/domains/{d}/sourcesCited domains and URLs; view=gap for outreach targets
/domains/{d}/answersThe answers behind the numbers (include_text=true for full text)
/domains/{d}/changesRun-over-run changes beyond noise
/domains/{d}/opportunitiesOpportunities with evidence and measured impact
POST /domains/{d}/promptsAdd prompts as suggestions (write key)
03

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.”

ToolDoes
list_domainsList the domains tracked in this workspace, with last run dates.
get_visibilityHeadline 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_trendVisibility per run for the brand and its top competitors.
get_competitorsEvery tracked competitor's visibility, share of voice, position and change, plus untracked brands the engines name.
get_promptsThe domain's prompts with per-prompt visibility, change and the competitor named most.
get_promptMetrics, brands, sources and the latest answer per surface for one prompt.
get_sourcesDomains and URLs the AI answers cite. view=gap lists third-party pages cited when competitors are named and the brand isn't.
search_answersFind the actual AI answers. show=missing returns answers that name a competitor but not the brand.
get_answerFull text, brands in order, citations and the searches the engine ran.
get_changesSignificant run-over-run changes (only those beyond normal noise).
get_opportunitiesRanked opportunities (content to publish, pages to get on) with evidence, and measured impact for shipped ones.
add_promptsAdd questions to track. They arrive as suggestions and cost nothing until activated in the dashboard. Needs a write key.
04

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.

EventWhen
run.completedAfter each scheduled run: visibility (k, n, range) and how many real changes.
change.detectedThe run produced changes beyond noise; includes each event.
opportunity.measuredA 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.

05

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).