Asked Thrice Scans API

Start a paid scan, read its result, and buy scans.

Operations 4

POST /api/scan Start a scan of one site, charging one scan from the account #
GET /api/scan How many scans the signed-in account has left, and the prices #
GET /api/scan/{scanId} Read a scan: its stage while it runs, the full result when it is done #
POST /api/checkout/scan Open a payment page for one scan or a pack of five #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/askedthrice-com:askedthrice-com-scans-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

askedthrice-com-scans-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Asked Thrice Scans API
  version: 2.0.0
  summary: 'Scan a site: who ChatGPT, Gemini and Claude recommend for its customers'' questions, and which pages they cite.'
  description: 'The HTTP surface of askedthrice.com. A scan reads one site, writes six questions its customers would ask, asks them to ChatGPT, Gemini and Claude with web search on, and returns how many answers name the business, who they recommend instead, every page they cited and one step for each page where the business can get listed.


    **Scans are paid before they run.** One scan costs USD 15 and five cost USD 49 (in Argentina, ARS 19.000 and ARS 65.000 through Mercado Pago). Starting a scan or buying one needs the session cookie of an account signed in on the site: there is no API key and no free tier. Reading a finished scan by its id needs nothing.


    **Errors are always JSON**, including 404s for paths that do not exist. Every error body carries `error` (human sentence), `code` (stable identifier to branch on), `hint` (what to do next) and `docs`.


    Human documentation: https://askedthrice.com/developers · Pricing: https://askedthrice.com/pricing'
  contact:
    name: Asked Thrice support
    email: jorgenahuelsoria@gmail.com
    url: https://askedthrice.com/contact
  termsOfService: https://askedthrice.com/terms
  license:
    name: Proprietary
    url: https://askedthrice.com/terms
servers:
- url: https://askedthrice.com
  description: Production
tags:
- name: Scans
  description: Start a paid scan, read its result, and buy scans.
paths:
  /api/scan:
    post:
      operationId: startScan
      summary: Start a scan of one site, charging one scan from the account
      description: 'Charges one scan from the signed-in account and starts the scan in the background. Answers 202 with the scan `id` right away; poll `getScan` until `status` is `done` or `failed`. A scan takes about a minute.


        A scan that fails, or stops answering for six minutes, goes back to the account. Accounts that hold the lifetime pass sold until 2026-10-29 are not charged.


        Limits: 10 scans per hour and 30 per day per account.'
      tags:
      - Scans
      security:
      - sessionCookie: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScanRequest'
            examples:
              site:
                summary: A bare domain
                value:
                  website: askedthrice.com
      responses:
        '202':
          description: The scan was charged and started.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanStarted'
        '400':
          description: 'The site is missing or is not a public address. Code: `invalid_website`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '401':
          description: 'No signed-in account. Code: `sign_in`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '402':
          description: 'The account has no scans left. Besides the error fields, the body carries the packs for sale in the caller''s currency. Code: `no_credits`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '403':
          description: 'This site or account is not accepted. Code: `blocked`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '429':
          description: 'Hourly or daily limit for the account. Code: `rate_limited`.'
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds to wait before retrying. Always present on 429.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '503':
          description: 'Scans are paused, or the charge could not be written. Codes: `budget`, `budget_unavailable`, `charge_failed`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
    get:
      operationId: getScanAllowance
      summary: How many scans the signed-in account has left, and the prices
      description: Returns whether a session is present, the scans left on the account, whether it holds the lifetime pass, and the packs for sale in the caller's currency (pesos in Argentina, USD elsewhere). Without a session it still returns the prices.
      tags:
      - Scans
      security:
      - {}
      - sessionCookie: []
      responses:
        '200':
          description: The allowance and the packs.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanAllowance'
        '500':
          description: 'The balance could not be read. Code: `server_error`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
  /api/scan/{scanId}:
    parameters:
    - name: scanId
      in: path
      required: true
      description: The `id` returned by `startScan`.
      schema:
        type: string
        format: uuid
    get:
      operationId: getScan
      summary: 'Read a scan: its stage while it runs, the full result when it is done'
      description: 'Never spends anything and needs no account: the id is the share link of the scan. While `status` is `running`, `stage` says which step it is on; when `done`, `result` carries the questions, every answer with its citations, who was named, the cited pages and the steps.'
      tags:
      - Scans
      security:
      - {}
      responses:
        '200':
          description: The scan.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Scan'
        '404':
          description: 'No scan with that id. Code: `scan_not_found`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
  /api/checkout/scan:
    post:
      operationId: buyScans
      summary: Open a payment page for one scan or a pack of five
      description: 'Returns the URL of a hosted payment page: Mercado Pago in pesos for callers in Argentina, Polar in USD elsewhere. Open it in a browser; after paying, the provider sends the buyer back to `next` and the scans are credited to the account by webhook within seconds.'
      tags:
      - Scans
      security:
      - sessionCookie: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CheckoutRequest'
      responses:
        '200':
          description: The payment page.
          content:
            application/json:
              schema:
                type: object
                required:
                - url
                properties:
                  url:
                    type: string
                    format: uri
        '400':
          description: '`scans` is not 1 or 5. Code: `invalid_pack`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '401':
          description: 'No signed-in account. Code: `sign_in`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '502':
          description: 'The payment provider did not answer. Code: `checkout_failed`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
components:
  schemas:
    ScanAllowance:
      type: object
      title: ScanAllowance
      required:
      - signedIn
      - pass
      - balance
      - currency
      - packs
      properties:
        signedIn:
          type: boolean
        pass:
          type: boolean
          description: True when the account holds the lifetime pass, which scans without charging.
        balance:
          type: integer
          description: Scans left on the account.
        currency:
          type: string
          enum:
          - ars
          - usd
        packs:
          type: array
          items:
            $ref: '#/components/schemas/Pack'
    ApiError:
      type: object
      title: ApiError
      description: The shape of every error from this API, including 404s for paths that do not exist. Branch on `code`, show `error`, act on `hint`.
      required:
      - error
      - code
      - hint
      - docs
      properties:
        error:
          type: string
          description: One sentence, safe to show to a person.
        code:
          type: string
          description: Stable identifier for this failure. Branch on this one; the wording of `error` can change.
          examples:
          - sign_in
          - no_credits
          - invalid_website
          - endpoint_not_found
        hint:
          type: string
          description: 'What to do next: sign in, buy scans, fix a field, or wait.'
        docs:
          type: string
          format: uri
          description: Human documentation for this API.
    ScanStarted:
      type: object
      title: ScanStarted
      required:
      - id
      properties:
        id:
          type: string
          format: uuid
          description: Pass this to `getScan`.
    Pack:
      type: object
      title: Pack
      required:
      - scans
      - price
      properties:
        scans:
          type: integer
          enum:
          - 1
          - 5
        price:
          type: string
          description: Formatted price with its currency code, e.g. `USD 15` or `ARS 19.000`.
    Scan:
      type: object
      title: Scan
      required:
      - id
      - status
      - domain
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          enum:
          - running
          - done
          - failed
        stage:
          type:
          - string
          - 'null'
          enum:
          - reading_site
          - asking
          - analyzing
          - done
          - null
        brand:
          type:
          - string
          - 'null'
        domain:
          type: string
        result:
          type: object
          additionalProperties: true
          description: 'Present when `status` is `done`: the profile read from the site, the questions, every answer with its citations, the businesses named, the cited sources and the steps.'
    CheckoutRequest:
      type: object
      title: CheckoutRequest
      required:
      - scans
      properties:
        scans:
          type: integer
          enum:
          - 1
          - 5
          description: How many scans to buy.
        next:
          type: string
          description: Same-site path to return to after paying. `paid=1` is appended on success.
          default: /
    ScanRequest:
      type: object
      title: ScanRequest
      required:
      - website
      properties:
        website:
          type: string
          description: The site to scan. A bare domain is accepted and normalised to https. Must be a public host. Brand, market, language and questions are read from the site.
          examples:
          - askedthrice.com
  securitySchemes:
    sessionCookie:
      type: apiKey
      in: cookie
      name: sb-access-token
      description: The session cookie set by signing in on the site. There is no way to obtain one from this API.
externalDocs:
  description: Asked Thrice developer and agent resources
  url: https://askedthrice.com/developers