Set up ako.tools in four steps
- Connect. Pick the first option that fits.
- Your MCP client supports OAuth: add
https://api.ako.tools/mcpand 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
nextStepslist saying what to do.
- Your MCP client supports OAuth: add
- Check it works. Call
get_credit_balance(GET /v1/billing). It returns the balance and the free credit every new account gets. - Set up a brand. Call
create_brandwith the website and wait until the profile is ready. Show the person what was found (get_brand: the market inprofile.countryand what the business does) and ask whether it is right; fix it withupdate_brand_marketandupdate_brand_profilebefore spending credit. Competitors are not set up front: each audit reports the other brands AI assistants offer the buyer. Then callgenerate_brand_questions, which uses the brand's market, and wait until the questions are ready. - Estimate, then run. For a new account, start with a preview: pass
preview: trueto the estimate and torun_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. Readget_brand_visibility, show the person the findings and ask whether they want the full audit; itsupgrade.fullAuditcarries the cost and whether they can start it. If not, share a link fromcreate_credit_top_up. For a full audit, callestimate_visibility_audit(POST /v1/audits/estimate) for the cost. It is free and creates nothing. IfcanStartis false, ask a person to add credit withcreate_credit_top_up. Then callrun_visibility_audit, poll until it finishes and read the results. To assess a whole website in one step, useestimate_agent_readiness_auditthenrun_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/mcpand approve in the browser. In Claude Code:claude mcp add --transport http ako-tools https://api.ako.tools/mcp, then run/mcpand 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.
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.
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.
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
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.
- Connect the agent to
https://api.ako.tools/mcp/enroll. - Call
start_user_signupand show the returned claim URL as a clickable link in the current conversation. Creating enrollment sends no email. - Call
get_signup_statuswithwaitSeconds25. 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. - Reconnect to
https://api.ako.tools/mcpwithAuthorization: Bearer br_agent_…. - Call
create_brandand pollget_branduntil the profile is ready, then confirm the market and what the business does with the person. - Call
generate_brand_questions, review the tracked questions, then callrun_visibility_audit. - Poll
get_visibility_auditbefore 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.
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_…'Asynchronous by design
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.
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.
Endpoints and schemas
/v1/enrollmentsStart user-approved enrollment/v1/enrollments/:idPoll enrollment status/v1/brandsCreate a brand and profile/v1/brands/:id/questions/generateGenerate stable tracked questions/v1/brands/:id/questionsAdd a custom tracked question/v1/brands/:id/auditsRun active tracked questions/v1/auditsList recent audits/v1/audits/:idRead status, progress and cost/v1/audits/:id/resultsRead aggregate results/v1/audits/:id/runsRead question-level evidence/v1/audits/:id/cancelRequest cancellation between callsErrors 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.
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.
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.
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.
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.