Developers and agents

Read Asked Thrice programmatically

Everything on askedthrice.com that a script, a crawler or an AI assistant can consume directly: the machine-readable index, the markdown version of every public page, and the embeds that live on your site instead of ours.

Machine-readable index

Two files describe the whole site to an assistant. Start with llms.txt: it links every entry point instead of dumping content.

  • llms.txt

    askedthrice.com/llms.txt

    Router file: core pages, comparisons, product facts, and the prompts worth evaluating.

  • llms-full.txt

    askedthrice.com/llms-full.txt

    Long-form companion with the decision-stage content inlined, so one fetch answers a comparison question.

  • sitemap.xml

    askedthrice.com/sitemap.xml

    Every indexable URL with an honest lastmod, which is bumped when the page changes and not on every crawl.

  • robots.txt

    askedthrice.com/robots.txt

    What is open to crawlers and what is not. The dashboards and the API are closed; the public pages are open.

  • openapi.json

    askedthrice.com/openapi.json

    OpenAPI 3.1 specification of every public HTTP endpoint: operation ids, typed request and response schemas, the error shape, and the rate limit on each one. Lives at the root and not under /api, because robots.txt disallows /api.

    curl https://askedthrice.com/openapi.json

Public API

The endpoints below answer without an account, an API key or a session cookie: they are the same ones the site's own forms and the MCP server call. Read the OpenAPI spec for the schemas; this is what each one is for. Every measurement spends real money at the model providers, so all of them are metered per caller and sit under a monthly budget that can pause them. Errors are always JSON, with a stable `code` and a `hint`.

  • POST /api/tools/repeat

    askedthrice.com/api/tools/repeat

    Ask one buyer question five times against one model and get back which brands were named every time, which appeared once, and the overlap between runs. The cheapest way to see the thesis: 3 calls per hour per IP.

    curl -X POST https://askedthrice.com/api/tools/repeat \
        -H "content-type: application/json" \
        -d '{"question":"What is the best password manager for a small team?","provider":"openai"}'
  • POST /api/check

    askedthrice.com/api/check

    One model, one pass: does it recognise the brand, does it name it in a blind list for the category, would it recommend it. Fast and shallow. 6 per hour and 20 per day per IP.

    curl -X POST https://askedthrice.com/api/check \
        -H "content-type: application/json" \
        -d '{"brand":"Asked Thrice","category":"AI visibility tools"}'
  • POST /api/audit

    askedthrice.com/api/audit

    The full free snapshot: crawls the site, classifies the vertical, asks several model APIs and repeats each prompt. Synchronous and slow (15 to 60 seconds, so allow 90). Returns an id for the buyer-question map. 6 per hour and 40 per day per caller.

    curl -X POST https://askedthrice.com/api/audit \
        -H "content-type: application/json" \
        -d '{"brand":"Asked Thrice","website":"askedthrice.com","category":"AI visibility tools"}'
  • POST and GET /api/audit/{id}/fanout-map

    askedthrice.com/api/audit/{id}/fanout-map

    Step two: asks the audit's buyer questions live and stores the answers. Idempotent, so the map comes back cached instead of costing a second measurement. POST starts it, GET polls it.

  • Error shape

    askedthrice.com/openapi.json

    Every error, including a 404 for a path that does not exist, is JSON with four fields: error (a sentence for a person), code (stable, branch on this), hint (what to do next) and docs. Rate limits answer 429 with Retry-After.

    {"error":"No API endpoint at /api/nope.","code":"endpoint_not_found","hint":"Read https://askedthrice.com/openapi.json ...","docs":"https://askedthrice.com/developers"}

MCP server

The markdown views let an assistant read this site. The MCP server lets it run a measurement. Point any MCP client at the endpoint below: no signup, no key, one free measurement per domain every 30 days.

  • Endpoint

    askedthrice.comhttps://mcp.askedthrice.com/mcp

    Streamable HTTP transport. Works with Claude, Cursor, VS Code, and anything else that speaks MCP.

    {"mcpServers":{"askedthrice":{"url":"https://mcp.askedthrice.com/mcp"}}}
  • Discovery manifest

    askedthrice.com/.well-known/mcp.json

    The server described in the official MCP registry format, served from this domain so a client can find the endpoint without reading this page. The two competing .well-known drafts are served too: /.well-known/mcp (SEP-1960) and /.well-known/mcp/server-card.json (SEP-1649). All three are generated from one source, so they cannot drift.

    curl https://askedthrice.com/.well-known/mcp.json
  • npm package (stdio bridge)

    askedthrice.comhttps://www.npmjs.com/package/askedthrice-mcp

    For clients that only launch a local command, like the Claude Desktop config file: npx askedthrice-mcp bridges stdio to the same remote endpoint. Same tools, same quota.

    {"mcpServers":{"askedthrice":{"command":"npx","args":["-y","askedthrice-mcp"]}}}
  • start_visibility_check

    askedthrice.comhttps://mcp.askedthrice.com/mcp

    Starts a measurement for a brand and returns a runId. Takes about a minute, because the buyer questions are asked live.

  • get_visibility_check

    askedthrice.comhttps://mcp.askedthrice.com/mcp

    Returns the verdict, how many buyer questions the brand won, which competitors were named instead, and which providers answered. It reports the measured answers, never a provider's self report.

Command line

The same measurements from a terminal or a shell script, without writing an HTTP client. Published on npm with no dependencies, so npx runs it without installing anything. Free, no account and no API key, under the same per-caller limits as the API.

  • askedthrice (npm)

    askedthrice.comhttps://www.npmjs.com/package/askedthrice

    Four commands over the public endpoints: check (does one model know the brand), repeat (ask one buyer question five times and see what moved), audit (the full free snapshot) and map (the buyer questions, asked live). Source at github.com/nahuelsoria/askedthrice-cli.

    npx askedthrice check "your brand" --category "your category"
  • Machine-readable output

    askedthrice.comhttps://www.npmjs.com/package/askedthrice

    --json prints the raw API response, so the CLI composes with jq and with anything that reads stdout. Errors go to stderr with exit code 1, and print the same code and hint the API returns.

    npx askedthrice repeat "best CRM for a small team" --json | jq '.metrics.once'

Markdown views

Every page listed below serves plain markdown from the same URL, either by adding .md or by asking for it with an Accept header. The site follows the acceptmarkdown.com convention: Content-Type: text/markdown; charset=utf-8 and Vary: Accept on both representations, and a 406 when the client refuses everything the URL can produce.

  • Any page, with .md

    askedthrice.com/pricing.md

    Add .md to the path: /pricing.md, /methodology.md, /developers.md, /changelog.md, /ai-instructions.md, /about.md, /contact.md, /reviews.md, /for/saas.md, /for/agencies.md, /alternatives.md, /compare.md, /blog.md, /rubros.md, /research.md, /learn.md, /es/visibilidad-ia.md, /es/herramientas-visibilidad-ia.md, plus every /compare/{slug} and /blog/{slug}.

    curl https://askedthrice.com/pricing.md
  • Any page, by content negotiation

    askedthrice.com/

    Ask for markdown with the Accept header and the canonical URL answers in markdown, without a redirect.

    curl -H "Accept: text/markdown" https://askedthrice.com/
  • Recoverable 404s

    askedthrice.com/llms.txt

    A path that does not exist returns a real 404 with a short markdown body pointing at the index files above, so an agent that guessed a URL can recover in one hop.

    curl -H "Accept: text/markdown" https://askedthrice.com/does-not-exist

Embeds and public links

Two surfaces are meant to live outside askedthrice.com: the badge you can paste on your own site and the read-only link to a report.

  • AI visibility badge (SVG)

    askedthrice.com/api/badge/{token}

    An SVG that states whether the brand was measured and when. The token is minted from your own report, and the badge falls back to a re-check state 60 days after the last run.

    <a href="https://askedthrice.com/badge/{token}"><img src="https://askedthrice.com/api/badge/{token}" alt="AI search visibility, measured by Asked Thrice" width="250" height="40"></a>
  • Badge landing page

    askedthrice.com/badge/{token}

    Where the badge links: the brand, the month it was measured, and what was asked. Not indexable, shareable.

  • Shared report

    askedthrice.com/share/{token}

    Read-only view of a report, created from the report itself. No account needed to open it.

What does not exist yet

Is there an API key, a paid tier or an SLA?
No. The endpoints above are open and free, and that is the whole offer: no key to request, no plan to buy, no uptime promise. Every measurement spends real money at three model providers, so the free tier is metered per caller and a monthly budget can pause it. Plan for 429 and 503 as normal states. If you need volume, a guaranteed response or a contract, write and say what you would automate.
Can I mint a badge or read someone else's report through the API?
No. Badge tokens and share links are minted from a report by whoever owns it, and there is no endpoint that creates one. Everything under /api that touches a stored report, credits or a workspace needs a signed-in session and is deliberately absent from the OpenAPI spec.

jorgenahuelsoria@gmail.com

How the measurement works