Developers

AI visibility data for agents and applications.

Connect with MCP or REST, ask a user to approve access once, then run asynchronous brand visibility audits. No demo required. Setup takes about two minutes: follow the four steps below.

REST  https://api.ako.tools/v1MCP  https://api.ako.tools/mcp
§ 1 — Start here

Set up ako.tools in four steps

  1. Connect. Pick the first option that fits.
    • Your MCP client supports OAuth: add https://api.ako.tools/mcp and approve in the browser. Nothing else is needed.
    • A headless or scheduled agent: a person opens https://ako.tools/agents, signs in, names the agent, chooses its permissions, clicks Create API key and copies the key once. The agent sends it as Authorization: Bearer br_agent_….
    • Neither: use enrollment. The agent asks for access, a person approves it, and the agent collects its key. The steps are in Enrollment for clients without OAuth, and every enrollment response includes a nextSteps list saying what to do.
  2. Check it works. Call get_credit_balance (GET /v1/billing). It returns the balance and the free credit every new account gets.
  3. Set up a brand. Call create_brand with the website and wait until the profile is ready. Show the person what was found (get_brand: the market in profile.country and what the business does) and ask whether it is right; fix it with update_brand_market and update_brand_profile before spending credit. Competitors are not set up front: each audit reports the other brands AI assistants offer the buyer. Then call generate_brand_questions, which uses the brand's market, and wait until the questions are ready.
  4. Estimate, then run. For a new account, start with a preview: pass preview: true to the estimate and to run_visibility_audit. It asks three questions (discovery, comparison, a customer need) of every AI assistant and writes the recommended actions, and fits the free credit. Read get_brand_visibility, show the person the findings and ask whether they want the full audit; its upgrade.fullAudit carries the cost and whether they can start it. If not, share a link from create_credit_top_up. For a full audit, call estimate_visibility_audit (POST /v1/audits/estimate) for the cost. It is free and creates nothing. If canStart is false, ask a person to add credit with create_credit_top_up. Then call run_visibility_audit, poll until it finishes and read the results. To assess a whole website in one step, use estimate_agent_readiness_audit then run_agent_readiness_audit.

Which route fits

  • Claude Code, Claude, ChatGPT, Cursor or any MCP client that supports remote servers with OAuth: add https://api.ako.tools/mcp and approve in the browser. In Claude Code: claude mcp add --transport http ako-tools https://api.ako.tools/mcp, then run /mcp and choose Authenticate.
  • An MCP client without OAuth that accepts headers: create an API key and send it as Authorization: Bearer br_agent_….
  • A chat or hosted agent with no MCP client, such as a bot you ask to add ako.tools: enrollment. The agent starts it, shows you the approval link, and collects its own key once you approve. If you would rather not involve the agent, create an API key yourself and give it the key.
  • Scripts, scheduled jobs, CI and automation tools: an API key over REST or MCP, stored as a secret.
  • Always a person: approving an enrollment, creating an API key and paying for credit are done by a person. Credit belongs to the account, so every route spends the same balance.
§ 2 — Overview

What the API measures

ako.tools tests whether AI assistants mention, recommend and directly cite a target brand. Each audit creates 15 grounded buyer questions, runs them across the selected engines and returns summary metrics plus prompt-level evidence.

Measurement note

Results use the consumer app where one can be measured (ChatGPT and Gemini) and a search-assisted API where not. Neither is a signed-in or personalised view.

§ 3 — MCP

Connect with OAuth

Add https://api.ako.tools/mcp to your MCP client and choose Connect. Sign in to ako.tools and allow the connection. The client stores the connection and renews access across conversations. No enrollment tool or polling token is needed.

Request offline_access for renewal. Access tokens last one day and refresh tokens rotate each time they are used. A connection has full access to your account; disconnect it on the agents page. If renewal fails, reconnect through your client using your existing account.

For headless agents, manage connected agents and create a scoped API key. OAuth tokens and API keys both work with REST and MCP.

Enrollment for clients without OAuth

Share the approval link. Enrollment sends no email.

Show the returned claimUrl as a clickable link in your conversation. The user opens it, signs in with a code emailed to them (or Google), then clicks Approve agent access. Already signed-in users can approve directly.

The optional enrollment email restricts which account can approve; it does not send an invitation. Keep pollToken private. The link expires after one hour while pending; ask for a new one with refresh_signup_link and the same pollToken. After approval, credentials can be retrieved for 24 hours. Save enrollmentId and pollToken privately so later runs can resume.

  1. Connect the agent to https://api.ako.tools/mcp/enroll.
  2. Call start_user_signup and show the returned claim URL as a clickable link in the current conversation. Creating enrollment sends no email.
  3. Call get_signup_status with waitSeconds 25. It returns as soon as the user approves, so repeat it while status is pending instead of polling. The agent token is returned repeatedly for 24 hours after approval, including when status is consumed. Retry the same enrollment after a missed response.
  4. Reconnect to https://api.ako.tools/mcp with Authorization: Bearer br_agent_….
  5. Call create_brand and poll get_brand until the profile is ready, then confirm the market and what the business does with the person.
  6. Call generate_brand_questions, review the tracked questions, then call run_visibility_audit.
  7. Poll get_visibility_audit before fetching results.
MCP enrollment endpoint: https://api.ako.tools/mcp/enroll
Authenticated MCP endpoint: https://api.ako.tools/mcp
Authorization: Bearer br_agent_…

The MCP server advertises tool descriptions and input schemas. Request audits:cancel during enrollment if the agent must cancel audits.

§ 4 — REST

REST quickstart

Use your OAuth access token or a scoped API key in the Authorization: Bearer header. OAuth requests must use resource=https://api.ako.tools/mcp and S256 PKCE. The enrollment sequence below remains available as a fallback.

1. Start enrollment (clients without OAuth)

curl -X POST https://api.ako.tools/v1/enrollments \
  -H 'Content-Type: application/json' \
  -d '{"agentName":"My agent","scopes":["audits:create","audits:read"]}'

Share the returned claimUrl as a clickable link in the conversation. This request sends no email. The user opens the link and requests their secure sign-in email there. After the user signs in and approves access, wait for the result with the private poll token: ?wait=25 holds the request until the user approves (up to 25 seconds), so repeat it instead of polling. If the link expires, POST /v1/enrollments/{enrollmentId}/refresh with the same token returns a new one.

curl 'https://api.ako.tools/v1/enrollments/{enrollmentId}?wait=25' \
  -H 'Authorization: Bearer br_enroll_…'

2. Create a brand

curl -X POST https://api.ako.tools/v1/brands \
  -H 'Authorization: Bearer br_agent_…' \
  -H 'Content-Type: application/json' \
  -d '{"website":"https://example.com","country":"United Kingdom","language":"English"}'

3. Generate tracked questions

curl -X POST https://api.ako.tools/v1/brands/{brandId}/questions/generate \
  -H 'Authorization: Bearer br_agent_…' \
  -H 'Content-Type: application/json' \
  -d '{}'

4. Run the audit

curl -X POST https://api.ako.tools/v1/brands/{brandId}/audits \
  -H 'Authorization: Bearer br_agent_…' \
  -H 'Idempotency-Key: customer-123-2026-10-01' \
  -H 'Content-Type: application/json' \
  -d '{"config":{"repetitions":1,"maxCostUsd":5}}'

5. Poll and fetch results

curl https://api.ako.tools/v1/audits/{auditId} -H 'Authorization: Bearer br_agent_…'
curl https://api.ako.tools/v1/audits/{auditId}/results -H 'Authorization: Bearer br_agent_…'
curl https://api.ako.tools/v1/audits/{auditId}/runs -H 'Authorization: Bearer br_agent_…'
§ 5 — Lifecycle

Asynchronous by design

queued→testing→evaluating→completed

Terminal statuses are completed, partial, cancelled, and failed. Poll conservatively, such as every 10 to 20 seconds. A partial audit can still contain valid results from completed model runs.

§ 6 — Result model

Summary and evidence

The results endpoint returns aggregate metrics, the other brands AI named and the cited sites, ranked by share, a table of every tracked question and the newest report. The brand visibility endpoint returns the same for a brand's latest audit, with recommended actions an agent can carry out.

  • unbrandedMentionRate: target-brand mentions in non-branded questions.
  • unbrandedRecommendationRate: supported recommendations in non-branded questions.
  • brandedRecognitionRate: target-brand recognition in branded questions.
  • brandedDirectCitationRate: branded answers directly citing the target domain.
  • byCategory / byModel: totals, mentions and recommendations grouped for comparison.

Use /runs for stored requests, raw model responses, citations, search execution, evaluations and per-run costs.

§ 7 — Reference

Endpoints and schemas

POST/v1/enrollmentsStart user-approved enrollment
GET/v1/enrollments/:idPoll enrollment status
POST/v1/brandsCreate a brand and profile
POST/v1/brands/:id/questions/generateGenerate stable tracked questions
POST/v1/brands/:id/questionsAdd a custom tracked question
POST/v1/brands/:id/auditsRun active tracked questions
GET/v1/auditsList recent audits
GET/v1/audits/:idRead status, progress and cost
GET/v1/audits/:id/resultsRead aggregate results
GET/v1/audits/:id/runsRead question-level evidence
POST/v1/audits/:id/cancelRequest cancellation between calls
§ 8 — Reliability

Errors and paid-call recovery

Errors use {"error":{"code":"…","message":"…"}}. Common codes include invalid_request, unauthorized, forbidden, not_found, not_ready, and rate_limited.

Planning and answer requests are recorded before dispatch. An uncertain paid request is not automatically replayed. Completed work is preserved and may be returned as a partial audit. Reusing the same idempotency key safely returns the existing audit.

Audits default to ChatGPT and Gemini (consumer apps, as app/chatgpt and app/gemini), Claude, Grok, Meta Muse Spark 1.3 and Perplexity Sonar (APIs), with one repetition. Supply config.models with 1–6 engine IDs to replace that panel. Muse results do not reproduce the consumer Muse agent.

REST and MCP share account limits: 60 reads per minute, 5 new audits per hour and 10 per day, and one active audit. Profiling and question generation each allow 5 operations per hour. Custom-question writes and cancellation allow 30 operations per minute. Enrollment creation allows 10 per hour per IP; enrollment polling allows 6 per minute. Limits use fixed UTC windows and may be configured by the operator. REST returns 429 with Retry-After; MCP returns the same structured error with retryAfterSeconds. Idempotent audit retries do not consume another audit allowance. Every response carries an X-Request-Id header (yours if you sent one) and every error body and MCP tool result repeats it as requestId; quote it when reporting a problem.

Cost control

Every audit accepts a maxCostUsd limit: the most it may cost your account. Start with one repetition and a small model set for lead-generation workflows. Reads remain available when the service is at capacity, and paid work that cannot start returns capacity_limited with a retry time.

Credit and pricing

Work is paid from prepaid credit in US dollars: no subscription and no seats, and the same price for people, REST and MCP. Only work that succeeds is charged; a failed call or audit costs nothing. Technical audits are $0.01 per page. New accounts get $5 free. Read the balance and the per-page technical price with GET /v1/billing or get_credit_balance, and add credit with POST /v1/billing/top-ups or create_credit_top_up, which return a Stripe checkout link for a person to open. Work the account cannot cover returns 402 insufficient_credits with requiredUsd and availableUsd and is not queued. An audit that runs out of credit stops with status partial and the results so far. Audits report estimatedCostUsd and costUsd. What an audit costs depends on the engines, questions and repetitions you choose, and its estimate is returned when it is accepted.

§ 9 — Technical audits

Technical audits

Audit public-site technical eligibility independently of AI visibility testing. Call run_technical_audit through MCP or POST /v1/technical-audits through REST with a website URL (or a brandId, which supplies the website and links the audit to that brand) and an idempotency key, then read status and saved results. List a brand's audits with brandId.

Results include site access, sitemap health, raw HTML and browser comparisons, explicit coverage and grouped fixes. Audits cover 50 pages by default (options.maxPages, up to 500) and render a sample of key pages and templates in a browser (10 by default, options.maxRenderedPages, up to 50). Unknown measurements remain unknown; these results do not guarantee citations or traffic. Page evidence is paginated usingoffset and limit.

Existing audit scopes apply. Technical audits have separate admission limits of 5 per hour, 10 per day and one active job per account by default. They make no paid model calls; browser and evidence storage incur usage costs.

§ 10 — Agent readiness

Agent readiness audits

To find out whether a website is agent ready, call run_agent_readiness_audit through MCP or POST /v1/agent-readiness-audits through REST with a website or brandId and an idempotency key. One operation creates or reuses the brand, runs the technical audit, generates tracked questions automatically and runs the AI visibility audit. Poll get_agent_readiness_audit, then read get_agent_readiness_results.

The market is the one the brand's site serves by default. Pass country (and optionally language) to audit visibility for one market; the technical audit is market-independent. Results return the brand, technical results, visibility results, the questions used, cost and limitations as data, with no score, so your agent can write the report. The technical and visibility audits stay available as separate operations.