serpresult-com Usage API

Account-wide reporting read off the query log. Session only.

Operations 3

GET /v1/usage Usage summary #
GET /v1/query/recent Most recent queries #
GET /v1/query/history Paged query history #

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/serpresult-com:serpresult-com-usage-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

serpresult-com-usage-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: SerpResult Usage API
  version: 1.0.0
  summary: Search engine results as JSON.
  description: 'SerpResult returns the organic results of a web search as JSON. Two search

    endpoints, both synchronous: `GET /v1/query` runs one search and

    `POST /v1/bulk` runs up to 50 in one request. Everything else on this

    surface is the dashboard''s reporting and credential management. ## Authentication


    Public API calls send a secret key in the `Authorization` header:


    ```

    Authorization: Bearer sk_live_…

    ```


    Keys are minted in the dashboard (or through `POST /v1/api-keys` with a

    session cookie). `sk_live_` keys are for production traffic, `sk_test_` keys

    carry a lower rate limit. The dashboard''s session cookie is accepted on the

    same endpoints. Routes marked **session only** (usage, history, key

    management) refuse a bearer key: a key that could mint another key would

    make revoking the first one meaningless. Two more principals exist and are described as security schemes below:

    the marketing site''s keyless demo (`X-Demo-Origin`) and RapidAPI''s proxy

    (`X-RapidAPI-Proxy-Secret` + `X-RapidAPI-User`). Neither is something an

    integrator sends by hand. ## Targets and what each supports


    | target | page | num | safe |

    | --- | --- | --- | --- |

    | `google_search` | 1–5 | 1–20 | off, moderate, strict |

    | `bing_search` | 1 only | 1–20 | off, moderate, strict |

    | `duckduckgo_search` | 1 only | 1–10 | not supported |

    | `yahoo_search` | 1 only | 1–10 | off, moderate, strict |

    | `brave_search` | 1–5 | 1–20 | off, moderate, strict |

    | `yandex_search` | 1–5 | 1–10 | not supported |


    Anything outside a target''s row answers `400 unsupported_parameter`:

    `bing_search` refuses `page` above 1; `duckduckgo_search` refuses `page`

    above 1, `num` above 10 and any `safe` but `off`; `yahoo_search` refuses

    `page` above 1 and `num` above 10; `brave_search` refuses `page` above 5;

    `yandex_search` refuses `num` above 10 and any `safe` but `off`. A `geo` outside

    the supported list answers `400 unsupported_geo` with the list in `details`. ## Credits


    Every search costs one credit: one for `GET /v1/query`, one per row of

    `POST /v1/bulk`. A cache hit costs the same as a fresh search. An upstream

    failure (502 / 504) is still charged: the search was run and only the answer

    is missing. A request refused with 400 or 402, and a failure on our side

    (500), cost nothing. ## Plans and quotas


    Every account starts on the trial: 100 requests, granted once per email

    address, that never reset. The trial has no period at all — nothing rolls

    over, so there is no reset to wait for. A paid plan''s quota is measured over its subscription''s billing cycle, which

    renews monthly on the day the subscription started rather than on the 1st. `X-Quota-Reset` and `period.end` carry the exact moment it rolls over; read

    the reset off those rather than deriving it from a calendar. An account on a

    paid plan with no subscription cycle behind it — a RapidAPI subscriber, a

    plan set by hand — is measured over the calendar month in UTC instead,

    resetting at `00:00:00Z` on the 1st. | plan | $ / month | requests | extra requests | concurrency |

    | --- | --- | --- | --- | --- |

    | Trial | 0 | 100, once, for life | — | 1 concurrent request |

    | Starter | 9 | 5,000 / month | credit packs at $1.50 per 1,000 | 2 concurrent requests |

    | Growth | 49 | 75,000 / month | credit packs at $0.80 per 1,000 | 5 concurrent requests |

    | Business | 99 | 200,000 / month | credit packs at $0.60 per 1,000 | 10 concurrent requests |

    | Custom | contact us | quoted | quoted | 20 concurrent requests |


    A plan costs the same bought direct as it does through RapidAPI. Plans

    bought direct are sold through Polar, our Merchant of Record: Polar takes

    the payment, handles tax and issues the invoice, and the subscription,

    payment methods and invoice history are managed in its customer portal. ## Credit packs


    Every plan is hard-limited — nothing is ever served on credit.'
  contact:
    name: SerpResult support
    email: team@serpresult.com
  license:
    name: Proprietary
    url: https://serpresult.com/legal/terms
servers:
- url: https://api.serpresult.com
  description: Production.
- url: http://localhost:8787
  description: Local `wrangler dev`.
security:
- bearerAuth: []
- sessionCookie: []
tags:
- name: Usage
  description: Account-wide reporting read off the query log. Session only.
paths:
  /v1/usage:
    get:
      tags:
      - Usage
      operationId: usageSummary
      summary: Usage summary
      description: '**Session only.** Totals, time buckets and a per-key breakdown of the

        account''s queries inside a window. Defaults to the last 30 days ending

        now; the window may span at most 366 days. Buckets are zero-filled over

        the whole window so a quiet day shows as zero rather than as a gap.'
      security:
      - sessionCookie: []
      parameters:
      - $ref: '#/components/parameters/from'
      - $ref: '#/components/parameters/to'
      - name: granularity
        in: query
        description: Bucket size. `daily` labels are `YYYY-MM-DD`, `hourly` labels are `YYYY-MM-DDTHH:00`, both UTC.
        schema:
          type: string
          enum:
          - hourly
          - daily
          default: daily
      - $ref: '#/components/parameters/api_key_id'
      responses:
        '200':
          description: The summary.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UsageSummaryResponse'
              example:
                from: '2026-09-07T00:00:00.000Z'
                to: '2026-09-08T23:59:59.999Z'
                granularity: daily
                api_key_id: null
                totals:
                  requests: 11
                  credits: 5
                  cache_hits: 3
                  errors: 6
                  avg_latency_ms: 133
                buckets:
                - bucket: '2026-09-07'
                  requests: 0
                  credits: 0
                  cache_hits: 0
                  errors: 0
                - bucket: '2026-09-08'
                  requests: 11
                  credits: 5
                  cache_hits: 3
                  errors: 6
                by_key:
                - api_key_id: key_694d09fd793a451e8319a7859136b46b
                  label: Docs test key
                  requests: 11
                  credits: 5
        '400':
          $ref: '#/components/responses/ReportingBadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalError'
  /v1/query/recent:
    get:
      tags:
      - Usage
      operationId: recentQueries
      summary: Most recent queries
      description: '**Session only.** The account''s newest queries, newest first, served or refused alike.'
      security:
      - sessionCookie: []
      parameters:
      - name: limit
        in: query
        description: How many rows to answer.
        schema:
          type: integer
          minimum: 1
          maximum: 50
          default: 5
      responses:
        '200':
          description: The rows.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecentQueriesResponse'
              example:
                queries:
                - id: qry_c7b970c3619f49e3bb1ab1971773697e
                  target: bing_search
                  query: hono
                  geo: us
                  locale: en-us
                  status: error
                  cache_hit: false
                  latency_ms: 0
                  created_at: '2026-09-08T10:59:43.835Z'
                - id: qry_4595f489307f4bceb495c4263f3c5ce0
                  target: bing_search
                  query: bing webmaster guidelines
                  geo: gb
                  locale: en-gb
                  status: ok
                  cache_hit: true
                  latency_ms: 71
                  created_at: '2026-09-08T10:59:43.835Z'
                - id: qry_49eaefd2a3d24f4b960a6ea17c4ced18
                  target: google_search
                  query: serp api
                  geo: us
                  locale: en-us
                  status: ok
                  cache_hit: true
                  latency_ms: 71
                  created_at: '2026-09-08T10:59:43.835Z'
        '400':
          $ref: '#/components/responses/ValidationBadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalError'
  /v1/query/history:
    get:
      tags:
      - Usage
      operationId: queryHistory
      summary: Paged query history
      description: '**Session only.** Every query the account made, newest first, with the

        full log row for each: parameters, outcome, timings and credits.

        Filterable by window, key, target and status, and paged.'
      security:
      - sessionCookie: []
      parameters:
      - $ref: '#/components/parameters/from'
      - $ref: '#/components/parameters/to'
      - $ref: '#/components/parameters/api_key_id'
      - name: target
        in: query
        description: Only rows for this target.
        schema:
          $ref: '#/components/schemas/Target'
      - name: status
        in: query
        description: Only served (`ok`) or only refused / failed (`error`) rows.
        schema:
          $ref: '#/components/schemas/QueryStatus'
      - name: page
        in: query
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: page_size
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 25
      responses:
        '200':
          description: One page of rows plus the total match count.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QueryHistoryResponse'
              example:
                rows:
                - id: qry_c7b970c3619f49e3bb1ab1971773697e
                  target: bing_search
                  query: hono
                  geo: us
                  locale: en-us
                  status: error
                  cache_hit: false
                  latency_ms: 0
                  created_at: '2026-09-08T10:59:43.835Z'
                  api_key_id: key_694d09fd793a451e8319a7859136b46b
                  api_key_name: Docs test key
                  batch_id: bat_34218d7162344184bebcd4c1506b0e79
                  request_id: 0728a6ce-858f-43ae-8059-c1c3eeee2323
                  page: 2
                  num: 10
                  safe: 'off'
                  error_code: unsupported_parameter
                  http_status: 400
                  upstream_ms: null
                  result_count: 0
                  credits: 0
                - id: qry_c96b7bfc7b4a43239bae38d2c5b38ded
                  target: google_search
                  query: ''
                  geo: us
                  locale: ''
                  status: error
                  cache_hit: false
                  latency_ms: 1
                  created_at: '2026-09-08T10:59:42.530Z'
                  api_key_id: key_694d09fd793a451e8319a7859136b46b
                  api_key_name: Docs test key
                  batch_id: null
                  request_id: a9aedcc0-9234-48d2-8d43-4c8228755f61
                  page: 1
                  num: 10
                  safe: 'off'
                  error_code: invalid_request
                  http_status: 400
                  upstream_ms: null
                  result_count: 0
                  credits: 0
                page: 1
                page_size: 2
                total: 6
        '400':
          $ref: '#/components/responses/ReportingBadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  responses:
    ValidationBadRequest:
      description: A parameter or body field failed validation (`invalid_request`). `issues` lists each field.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error: invalid_request
            message: name must be between 1 and 64 characters.
            request_id: 7d1c2f34-1b7e-4d2a-9c33-1f6f0e2b8a90
            issues:
            - field: name
              message: name must be between 1 and 64 characters.
    Unauthorized:
      description: No accepted credential (`unauthorized`). A session-only route answers this to a bearer key; the demo header answers this when a credential rides along with it.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error: unauthorized
            message: API key is not valid.
            request_id: 7d1c2f34-1b7e-4d2a-9c33-1f6f0e2b8a90
    ReportingBadRequest:
      description: '`invalid_request`. Either a parameter failed validation (`issues` lists

        each field: an unparseable date, `from` after `to`, a window over 366

        days) or `api_key_id` names a key that is not on this account (no

        `issues`).

        '
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            range:
              value:
                error: invalid_request
                message: from must not be after to
                request_id: 7d1c2f34-1b7e-4d2a-9c33-1f6f0e2b8a90
                issues:
                - field: from
                  message: from must not be after to
            foreign_key:
              value:
                error: invalid_request
                message: No API key with that id exists on this account.
                request_id: 7d1c2f34-1b7e-4d2a-9c33-1f6f0e2b8a90
    InternalError:
      description: Something failed on our side (`internal_error`). The detail is in our logs under `request_id`. Nothing is charged.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error: internal_error
            message: The request could not be completed.
            request_id: 7d1c2f34-1b7e-4d2a-9c33-1f6f0e2b8a90
  schemas:
    Target:
      type: string
      description: 'The engine to search.

        - `google_search`: pages 1–5, `num` up to 20, safe search supported.

        - `bing_search`: page 1 only, `num` up to 20, safe search supported.

        - `duckduckgo_search`: page 1 only, `num` up to 10, no safe search.

        - `yahoo_search`: page 1 only, `num` up to 10, safe search supported.

        - `brave_search`: pages 1–5, `num` up to 20, safe search supported.

        - `yandex_search`: pages 1–5, `num` up to 10, no safe search.

        '
      enum:
      - google_search
      - bing_search
      - duckduckgo_search
      - yahoo_search
      - brave_search
      - yandex_search
      default: google_search
    ErrorCode:
      type: string
      description: 'Every code the API emits.

        - `invalid_request` — validation failed; `issues` lists the fields.

        - `unsupported_geo` — `geo` is not supported; `details` lists the supported codes.

        - `unsupported_parameter` — the target cannot serve `page`, `num` or `safe` as sent.

        - `unauthorized` — no accepted credential.

        - `not_found` — unknown route, or an API key id not on this account.

        - `rate_limited` — per-minute limit spent.

        - `quota_exceeded` — the period''s quota and the credit balance are both spent. Not charged.

        - `upstream_error` — the search provider failed. Charged.

        - `upstream_timeout` — the search provider did not answer in time. Charged.

        - `no_subscription` — a plan change or a credit-pack purchase was asked for on an account with no active subscription.

        - `plan_unchanged` — a plan change was asked for on the plan the account is already on.

        - `billing_unavailable` — purchases are closed on this deployment: either it is not wired to Polar, or direct checkout is switched off while the same plans are sold on RapidAPI.

        - `internal_error` — a fault on our side. Not charged.

        '
      enum:
      - invalid_request
      - unsupported_geo
      - unsupported_parameter
      - unauthorized
      - not_found
      - rate_limited
      - quota_exceeded
      - upstream_error
      - upstream_timeout
      - no_subscription
      - plan_unchanged
      - billing_unavailable
      - internal_error
    UsageByKey:
      type: object
      required:
      - api_key_id
      - label
      - requests
      - credits
      properties:
        api_key_id:
          type:
          - string
          - 'null'
          description: '`null` for calls made with the session cookie.'
        label:
          type: string
          description: The key's name, `Dashboard` for session calls, `Deleted key` for a key row that no longer exists.
        requests:
          type: integer
        credits:
          type: integer
    HistoryQuery:
      allOf:
      - $ref: '#/components/schemas/RecentQuery'
      - type: object
        required:
        - api_key_id
        - api_key_name
        - batch_id
        - request_id
        - page
        - num
        - safe
        - error_code
        - http_status
        - upstream_ms
        - result_count
        - credits
        properties:
          api_key_id:
            type:
            - string
            - 'null'
          api_key_name:
            type:
            - string
            - 'null'
            description: The key's current name, `null` for a session call or a deleted key.
          batch_id:
            type:
            - string
            - 'null'
            description: Set for rows made through `POST /v1/bulk`.
          request_id:
            type: string
          page:
            type: integer
          num:
            type: integer
          safe:
            type: string
          error_code:
            type:
            - string
            - 'null'
            description: The `ErrorCode` answered, `null` on a served row.
          http_status:
            type: integer
          upstream_ms:
            type:
            - integer
            - 'null'
            description: Time spent in the search provider, `null` unless the row was served.
          result_count:
            type: integer
          credits:
            type: integer
    QueryHistoryResponse:
      type: object
      required:
      - rows
      - page
      - page_size
      - total
      properties:
        rows:
          type: array
          items:
            $ref: '#/components/schemas/HistoryQuery'
        page:
          type: integer
        page_size:
          type: integer
        total:
          type: integer
          description: Rows matching the filters across all pages.
    QueryStatus:
      type: string
      enum:
      - ok
      - error
    UsageBucket:
      type: object
      required:
      - bucket
      - requests
      - credits
      - cache_hits
      - errors
      properties:
        bucket:
          type: string
          description: '`YYYY-MM-DD` for daily, `YYYY-MM-DDTHH:00` for hourly. UTC.'
        requests:
          type: integer
        credits:
          type: integer
        cache_hits:
          type: integer
        errors:
          type: integer
    RecentQuery:
      type: object
      required:
      - id
      - target
      - query
      - geo
      - locale
      - status
      - cache_hit
      - latency_ms
      - created_at
      properties:
        id:
          type: string
        target:
          type: string
          description: Usually a `Target`; a refused request logs whatever was sent, clamped to 64 characters.
        query:
          type: string
        geo:
          type: string
        locale:
          type: string
        status:
          $ref: '#/components/schemas/QueryStatus'
        cache_hit:
          type: boolean
        latency_ms:
          type: integer
        created_at:
          type: string
          format: date-time
    ErrorEnvelope:
      type: object
      description: The shape of every error response.
      required:
      - error
      - message
      - request_id
      properties:
        error:
          $ref: '#/components/schemas/ErrorCode'
        message:
          type: string
          description: Human-readable, safe to show to an end user.
        request_id:
          type: string
          format: uuid
          description: Same value as the `X-Request-Id` header.
        details:
          type: array
          description: On `unsupported_geo` only, the supported country codes.
          items:
            $ref: '#/components/schemas/Geo'
        issues:
          type: array
          description: On `invalid_request` from a validator, one entry per failed field.
          items:
            type: object
            required:
            - field
            - message
            properties:
              field:
                type: string
                description: Dotted path of the field. Empty for the whole input.
              message:
                type: string
    UsageTotals:
      type: object
      required:
      - requests
      - credits
      - cache_hits
      - errors
      - avg_latency_ms
      properties:
        requests:
          type: integer
        credits:
          type: integer
        cache_hits:
          type: integer
        errors:
          type: integer
        avg_latency_ms:
          type: integer
          description: Rounded mean of `latency_ms` over the window's rows; 0 when there are none.
    RecentQueriesResponse:
      type: object
      required:
      - queries
      properties:
        queries:
          type: array
          items:
            $ref: '#/components/schemas/RecentQuery'
    UsageSummaryResponse:
      type: object
      required:
      - from
      - to
      - granularity
      - api_key_id
      - totals
      - buckets
      - by_key
      properties:
        from:
          type: string
          format: date-time
          description: The resolved lower bound.
        to:
          type: string
          format: date-time
          description: The resolved upper bound.
        granularity:
          type: string
          enum:
          - hourly
          - daily
        api_key_id:
          type:
          - string
          - 'null'
          description: The filter that was applied, or `null`.
        totals:
          $ref: '#/components/schemas/UsageTotals'
        buckets:
          type: array
          description: Ascending by `bucket`, one entry per bucket in the window, zero-filled.
          items:
            $ref: '#/components/schemas/UsageBucket'
        by_key:
          type: array
          description: Descending by `requests`.
          items:
            $ref: '#/components/schemas/UsageByKey'
    Geo:
      type: string
      description: 'A supported country, as an ISO 3166-1 alpha-2 code. Results are

        localized to this country, the same ones a user searching there would

        see, and the code also picks the default `locale`.

        '
      enum:
      - us
      - in
      - gb
      - ca
      - au
      - de
      - fr
      - sg
      - ae
      - jp
      - ad
      - af
      - ag
      - al
      - am
      - ao
      - ar
      - at
      - aw
      - az
      - ba
      - bb
      - bd
      - be
      - bf
      - bg
      - bh
      - bi
      - bj
      - bn
      - bo
      - br
      - bs
      - bw
      - by
      - bz
      - cd
      - cg
      - ch
      - ci
      - cl
      - cm
      - cn
      - co
      - cr
      - cu
      - cv
      - cy
      - cz
      - dk
      - do
      - dz
      - ec
      - ee
      - eg
      - es
      - et
      - fi
      - fj
      - fm
      - fo
      - ga
      - gd
      - ge
      - gf
      - gg
      - gh
      - gm
      - gp
      - gq
      - gr
      - gt
      - gu
      - gy
      - hk
      - hn
      - hr
      - ht
      - hu
      - id
      - ie
      - il
      - iq
      - ir
      - is
      - it
      - jm
      - jo
      - ke
      - kg
      - kh
      - km
      - kn
      - kr
      - kw
      - ky
      - kz
      - la
      - lb
      - lc
      - lk
      - lr
      - ls
      - lt
      - lu
      - lv
      - ly
      - ma
      - md
      - me
      - mg
      - mk
      - ml
      - mm
      - mn
      - mo
      - mp
      - mq
      - mr
      - mt
      - mu
      - mv
      - mw
      - mx
      - my
      - mz
      - na
      - nc
      - ne
      - ng
      - ni
      - nl
      - 'no'
      - np
      - nz
      - om
      - pa
      - pe
      - pf
      - pg
      - ph
      - pk
      - pl
      - pr
      - ps
      - pt
      - pw
      - py
      - qa
      - re
      - ro
      - rs
      - ru
      - rw
      - sa
      - sb
      - sd
      - se
      - si
      - sk
      - sl
      - sn
      - so
      - sr
      - st
      - sv
      - sy
      - sz
      - td
      - tg
      - th
      - tj
      - tl
      - tn
      - to
      - tr
      - tt
      - tw
      - tz
      - ua
      - ug
      - uy
      - uz
      - vc
      - ve
      - vg
      - vi
      - vn
      - vu
      - ye
      - za
      - zm
      - zw
      default: us
  headers:
    X-Request-Id:
      description: The id of this request, identical to `request_id` in any error body. Quote it in a support request.
      schema:
        type: string
        format: uuid
  parameters:
    to:
      name: to
      in: query
      description: Inclusive upper bound. A bare date (`2026-09-07`) covers the whole of that UTC day. Must not be before `from`.
      schema:
        type: string
      example: '2026-09-08'
    api_key_id:
      name: api_key_id
      in: query
      description: Only rows made with this key. Revoked keys are accepted. A key that is not on this account answers `400 invalid_request`.
      schema:
        type: string
      example: key_0f3ab2f0d0c845feb2cbb2dbbd1b2fa7
    from:
      name: from
      in: query
      description: Inclusive lower bound, an ISO 8601 date (`2026-09-07`, read as that day's start) or timestamp (`2026-09-07T13:00:00Z`), UTC.
      schema:
        type: string
      example: '2026-09-01'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'A secret key from the dashboard: `Authorization: Bearer sk_live_…` or

        `Bearer sk_test_…`. Both are held to the account plan''s rate — 60 a

        minute on the trial, up to 1200 on a custom plan — and both spend the

        same quota. Accepted on `/v1/query`, `/v1/bulk`, `/v1/me` and the MCP

        endpoint `POST /mcp` only; a session-only route answers 401 to a key.

        '
    sessionCookie:
      type: apiKey
      in: cookie
      name: better-auth.session_token
      description: 'The dashboard''s session cookie (`__Secure-better-auth.session_token` when

        served over HTTPS). Accepted everywhere a key is, and the only credential

        the session-only routes take. On the search routes it gets the plan''s

        per-minute limit or 120, whichever is higher.

        '
    demoOrigin:
      type: apiKey
      in: header
      name: X-Demo-Origin
      description: 'The marketing site''s keyless hero search. The header must equal the

        deployment''s configured demo origin, and the request must carry no

        `Authorization` header and no session cookie — a credential sent beside

        it is refused rather than re-metered. The principal is the client IP,

        limited to 5 requests a minute, with no account behind it. Accepted on

        `/v1/query` and `/v1/bulk`.

        '
    rapidApiProxy:
      type: apiKey
      in: header
      name: X-RapidAPI-Proxy-Secret
      description: 'Requests relayed by the RapidAPI marketplace. The proxy injects

        `X-RapidAPI-Proxy-Secret` (compared in constant time against the

        deployment''s secret) and `X-RapidAPI-User` (the marketplace account the

        call is attributed to). Integrators never send these themselves. When

        the marketplace secret is not configured, or the marketplace account

        mapping has not landed, every request on this path answers

        `401 unauthorized` — this branch currently answers 401.

        '