Brand API (Brandfetch) Agents API

The agents API from Brand API (Brandfetch) — 1 operation(s) for agents.

Operations 2

GET /v2/agents/access Describe the agent access offer #
POST /v2/agents/access Buy standing access with an x402 or MPP payment #

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/brand-api:brand-api-agents-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

brand-api-agents-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Brandfetch Agents API
  description: Our APIs help you personalize your customer journey through unique branded experiences.
  license:
    name: MIT
  version: 1.0.0
  contact:
    name: Brandfetch Support
    url: https://brandfetch.com
    email: support@brandfetch.io
servers:
- url: https://api.brandfetch.io
tags:
- name: Agents
paths:
  /v2/agents/access:
    get:
      summary: Describe the agent access offer
      description: 'What an agent can buy and how to pay for it: standing API access — an organization, an API key preloaded with prepaid credits and an MCP token — sold for one x402 or MPP payment. Needs no credential. Written for an agent that will act on it. See https://docs.brandfetch.com/agents/overview.'
      operationId: getAgentAccessOffer
      security: []
      tags:
      - Agents
      responses:
        '200':
          description: The offer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentAccessOffer'
    post:
      summary: Buy standing access with an x402 or MPP payment
      description: 'Pay a whole number of US dollars to receive a Brandfetch organization, an API key holding 20 prepaid API credits per dollar, and an MCP bearer token. One credit is one Brand API, Brand Context API or Transaction API request. Call once without a payment to receive the 402: its `PAYMENT-REQUIRED` header is the x402 challenge (USDC on Base), its `WWW-Authenticate` header the MPP challenges (USDC.e on Tempo, or a card through a Stripe shared payment token). Pay one and repeat the request with the result — `PAYMENT-SIGNATURE` for x402, `Authorization: Payment …` for MPP. A wallet owns the organization it buys: paying again from the same wallet adds credits to the same key, and `rotateKey=true` replaces the key while doing so. A card names no wallet, so each card payment buys its own organization and key. The API key and MCP token are returned once, in the response that completes the purchase, and a payment is never charged twice. A later request carrying the same payment is answered `409` without them: a settled payment is public (an x402 signature is on-chain), so presenting it proves nothing about who sent it. If the purchase is answered with a `500` that says to retry, or with no response at all, retry the exact request at once: the first retry to succeed within three minutes of the payment receives the credential, unless it was already returned in a response the client lost, which is answered `409` `credential_already_delivered`. The credits are granted whether or not the credential is returned. See https://docs.brandfetch.com/agents/overview.'
      operationId: purchaseAgentAccess
      tags:
      - Agents
      security:
      - x402Payment: []
      - mppPayment: []
      x-payment-info:
        price:
          mode: dynamic
          currency: USD
          min: '1'
          max: '500'
        protocols:
        - x402: {}
        - mpp:
            method: tempo
            intent: charge
            currency: '0x20C000000000000000000000b9537d11c60E8b50'
        - mpp:
            method: stripe
            intent: charge
            currency: usd
        offers:
        - amount: null
          currency: '0x20C000000000000000000000b9537d11c60E8b50'
          description: 'Standing Brandfetch API access: prepaid credits for the whole dollars named by ?usd='
          intent: charge
          method: tempo
        - amount: null
          currency: usd
          description: 'Standing Brandfetch API access: prepaid credits for the whole dollars named by ?usd='
          intent: charge
          method: stripe
      parameters:
      - name: usd
        in: query
        required: true
        description: Whole US dollars to pay, between 1 and 500. Buys `usd × 20` credits.
        schema:
          type: integer
          minimum: 1
          maximum: 500
        examples:
          usd:
            summary: Five dollars
            value: 5
      - name: rotateKey
        in: query
        required: false
        description: 'When `true` on a top-up, issues a new key holding the combined balance, returned once like any other. The wallet''s earlier keys stop working once the new key has been returned, even if the client never receives that response. If the rotation is answered with an error instead of the new key, they keep working. A retry answered `409` `credential_already_delivered` means the rotation completed: pay again with `rotateKey=true` for a new key.'
        schema:
          type: boolean
          default: false
      responses:
        '200':
          description: 'Topped up: the wallet already owned an organization. The credential is returned once, in this response.'
          headers:
            Cache-Control:
              description: '`private` — the response carries a credential, so no shared cache may store it.'
              schema:
                type: string
            PAYMENT-RESPONSE:
              description: 'On the response to the request that settled an x402 payment: the base64-encoded settlement receipt (`success`, `transaction`, `network`, `payer`). A retry that delivers the credential after a failed response does not carry it.'
              schema:
                type: string
            Payment-Receipt:
              description: 'On the response to the request that settled an MPP payment: the base64url-encoded receipt (`method`, `reference`, `status`, `timestamp`). A retry that delivers the credential after a failed response does not carry it.'
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentAccessCredential'
        '201':
          description: 'Provisioned: this wallet''s first purchase, or a card purchase, created its organization and key. The credential is returned once, in this response.'
          headers:
            Cache-Control:
              description: '`private` — the response carries a credential, so no shared cache may store it.'
              schema:
                type: string
            PAYMENT-RESPONSE:
              description: 'On the response to the request that settled an x402 payment: the base64-encoded settlement receipt (`success`, `transaction`, `network`, `payer`). A retry that delivers the credential after a failed response does not carry it.'
              schema:
                type: string
            Payment-Receipt:
              description: 'On the response to the request that settled an MPP payment: the base64url-encoded receipt (`method`, `reference`, `status`, `timestamp`). A retry that delivers the credential after a failed response does not carry it.'
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentAccessCredential'
        '400':
          description: The `usd` parameter is missing, not a whole number, or outside the bounds; or the payment does not name the paying wallet.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    enum:
                    - usd must be a whole number of US dollars between 1 and 500.
        '402':
          description: 'Payment required. Without a credential, the quote for `usd` dollars: the `PAYMENT-REQUIRED` header describes the x402 payment (USDC on Base) and `WWW-Authenticate` the MPP challenges. A settlement that was refused says so in the `message`: retry the exact request once before signing a new payment, since the retry is answered from the payment if another attempt settled it; refused again, request a fresh challenge and pay afresh. Otherwise, with a credential that was not accepted, the `reason` — nothing was charged; pay afresh and retry (a `credential_in_use` reason means another request of yours is settling the same credential: retry the exact request in a moment instead; a `challenge_invalid` reason means the MPP credential does not answer a challenge this API issued: answer one of the fresh challenges, unless this retries an MPP purchase already paid for: that purchase is complete and its credits are on the organization, so a Tempo wallet pays again with `rotateKey=true` for a working key and a card purchase contacts support).'
          headers:
            PAYMENT-REQUIRED:
              description: 'The x402 v2 payment challenge: base64-encoded JSON whose `accepts` array lists how to pay (scheme `exact`, network `eip155:8453`, the USDC asset, the `amount` in USDC''s six decimals and the receiving `payTo` address). Sign the payment with an x402 client and retry with the result in a `PAYMENT-SIGNATURE` header. See https://docs.brandfetch.com/agents/pay-per-request.'
              schema:
                type: string
            Cache-Control:
              description: '`no-store` — a challenge is issued for one request and must not be cached.'
              schema:
                type: string
            WWW-Authenticate:
              description: 'One `Payment` challenge per payment method Stripe offers for the amount (USDC.e on Tempo from a cent; cards via shared payment tokens from $0.50), comma-separated. Answer one with an `Authorization: Payment …` credential.'
              schema:
                type: string
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/PaymentChallenge'
                - $ref: '#/components/schemas/PaymentRejected'
        '409':
          description: 'The request carries a payment that is already being completed, or whose purchase is complete; it carries no credential and no challenge, and the payment is not charged again. `payment_in_progress`: another request carrying the same payment is completing the purchase and its response carries the credential; retry the exact request after `Retry-After` if it does not arrive, and never pay again. `credential_already_delivered`: the credential was returned with the response that completed the purchase and is not returned again; the credits are on the organization named in the body. To replace a lost key, pay again from the same wallet with `rotateKey=true`; a card purchase cannot be recovered, so make a new one. `credential_replaced`: a later rotation replaced the key this payment bought; the organization''s credits, these included, are intact. Pay again from the same wallet with `rotateKey=true` for a working key; for a card purchase, contact support with the `paymentReference`.'
          headers:
            Retry-After:
              description: Seconds to wait before retrying, on `payment_in_progress`.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: What happened and what to do next, for whoever is reading.
                  reason:
                    type: string
                    enum:
                    - payment_in_progress
                    - credential_already_delivered
                    - credential_replaced
                  paymentReference:
                    type: string
                    description: Identifies the payment; quote it to support.
                  organization:
                    type: object
                    description: The organization the purchase credited. Present on `credential_already_delivered` and `credential_replaced`.
                    properties:
                      id:
                        type: string
                      urn:
                        type: string
                        example: urn:brandfetch:organization:xig9b54wddtihs0dktyhau0i
        '500':
          description: 'The purchase did not finish, and the payment may have been taken. With a `paymentReference`, the `message` says which of two cases applies. If it says to retry, retry this exact request (same `PAYMENT-SIGNATURE` or `Authorization: Payment` header) at once: the first retry to succeed within three minutes of the payment receives the credential, and no later request does. If it says not to pay again, the credential can no longer be delivered automatically: do not pay again, and contact support with the `paymentReference`. Without a `paymentReference`, an unexpected error: retry the exact request, which never charges the payment twice, and do not pay again.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 'Says whether to retry this exact request or not to pay again, for instance: This payment may already have been taken, but what it bought could not be delivered automatically. Do not pay again for it: contact support with the payment reference.'
                    example: Provisioning failed after your payment was accepted. Retry this exact request to receive your credential, or contact support with the payment reference.
                  paymentReference:
                    type: string
                    description: Identifies the payment; quote it to support.
        '503':
          description: 'The request was not served. Without a `reason`, the payment service could not be reached and nothing was charged: retry after the `Retry-After` interval. With `reason: payment_outcome_unknown`, whether the payment went through is not known yet: retry the exact request after the interval, and do not sign a new payment for it.'
          headers:
            Retry-After:
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  reason:
                    type: string
                    enum:
                    - payment_outcome_unknown
                  paymentReference:
                    type: string
                    description: 'Present with `reason: payment_outcome_unknown`.'
components:
  schemas:
    PaymentChallenge:
      type: object
      description: 'Body of the 402 an unauthenticated request receives when the route can be paid for per request. The machine-readable challenges are in the `PAYMENT-REQUIRED` header for x402 and the `WWW-Authenticate: Payment` header for MPP; this body says the same in prose.'
      properties:
        message:
          type: string
          example: 'Payment required. Either authenticate with a Brandfetch API key (Authorization: Bearer <key>) or pay for this request with x402: sign the payment described in the PAYMENT-REQUIRED header and retry with a PAYMENT-SIGNATURE header.'
        documentation:
          type: string
          example: https://docs.brandfetch.com/agents/pay-per-request
        pricing:
          type: object
          properties:
            route:
              type: string
              example: GET /v2/brands/*
            price:
              type: string
              example: $0.10
        resource:
          type: string
          description: The URL the payment is for.
          example: https://api.brandfetch.io/v2/brands/nike.com
        standingAccess:
          type: string
          example: For many requests, POST /v2/agents/access (paid the same way) provisions an API key preloaded with prepaid credits.
    AgentAccessCredential:
      type: object
      properties:
        organization:
          type: object
          properties:
            id:
              type: string
            urn:
              type: string
              example: urn:brandfetch:organization:xig9b54wddtihs0dktyhau0i
        apiKey:
          type: object
          description: 'The API key. Returned once, in the response that completes the purchase: store it.'
          properties:
            id:
              type: string
            key:
              type: string
              description: 'Send as `Authorization: Bearer <key>`.'
            name:
              type: string
              example: Agent Key
        apiClient:
          type:
          - object
          - 'null'
          description: The Logo API client, for `cdn.brandfetch.io` URLs.
          properties:
            clientId:
              type: string
        mcp:
          type: object
          properties:
            url:
              type: string
              example: https://mcp.brandfetch.io/mcp
            token:
              type: string
              description: Bearer token for the Brandfetch MCP server; starts with `bf1.`.
        credits:
          type: object
          properties:
            granted:
              type: integer
              description: Credits this payment bought.
              example: 20
            balance:
              type: integer
              description: Credits the key holds now.
              example: 20
            creditsPerUsd:
              type: integer
              example: 20
            usdPaid:
              type: number
              example: 1
            deduplicated:
              type: boolean
              description: '`false` when this request granted the credits. `true` when an earlier attempt at the same purchase had already granted them, before its response failed: they are granted once either way.'
        usage:
          type: object
          properties:
            authorization:
              type: string
              example: Bearer <key>
            note:
              type: string
        topUp:
          type: object
          properties:
            method:
              type: string
              example: POST
            url:
              type: string
            note:
              type: string
        documentation:
          type: string
          example: https://docs.brandfetch.com/agents/overview
    AgentAccessOffer:
      type: object
      properties:
        documentation:
          type: string
          example: https://docs.brandfetch.com/agents/overview
        mcp:
          type: string
          example: https://mcp.brandfetch.io/mcp
        offer:
          type: object
          properties:
            method:
              type: string
              example: POST
            endpoint:
              type: string
              example: https://api.brandfetch.io/v2/agents/access
            minUsd:
              type: integer
              example: 1
            maxUsd:
              type: integer
              example: 500
            creditsPerUsd:
              type: integer
              example: 20
            description:
              type: string
        payment:
          type: object
          description: How to pay, per protocol. x402 is always on offer; `mpp` is listed, and described, exactly where the deployment's billing can take it — production does.
          properties:
            protocols:
              type: array
              items:
                type: string
              example:
              - x402
              - mpp
            x402:
              type: object
              properties:
                protocol:
                  type: string
                  example: x402
                network:
                  type: string
                  description: CAIP-2 network identifier.
                  example: eip155:8453
                steps:
                  type: array
                  items:
                    type: string
            mpp:
              type: object
              properties:
                protocol:
                  type: string
                  example: mpp
                methods:
                  type: array
                  description: 'The MPP payment methods on offer: `tempo` (USDC.e on Tempo) and `stripe` (a card via a shared payment token).'
                  items:
                    type: string
                  example:
                  - tempo
                  - stripe
                steps:
                  type: array
                  items:
                    type: string
        perRequestAlternative:
          type: object
          properties:
            description:
              type: string
            protocols:
              type: array
              description: 'The per-request payment protocols on offer: `x402`, plus `mpp` where billing takes it.'
              items:
                type: string
              example:
              - x402
              - mpp
            prices:
              type: object
              properties:
                brandApi:
                  type: string
                  example: $0.10
                brandContextApi:
                  type: string
                  example: $0.10
                transactionApi:
                  type: string
                  example: $0.10
    PaymentRejected:
      type: object
      description: 'Body of the 402 a request carrying a `PAYMENT-SIGNATURE`, or an `Authorization: Payment …` credential, receives when the payment was not accepted or could not be settled. The resource was not served. Nothing was charged, so pay afresh and retry, unless the `message` says to retry the exact request first (a refused settlement of a standing-access purchase).'
      properties:
        message:
          type: string
          example: The payment was not accepted, so the request was not served and nothing was charged. Sign a new payment for the PAYMENT-REQUIRED header and retry.
        reason:
          type: string
          description: 'The payment service''s reason code, e.g. `insufficient_funds`. An MPP credential adds `credential_spent` (it already paid for a request), `credential_in_use` (another request is settling it; retry this exact request in a moment) `credential_malformed` (it could not be read) and `challenge_invalid` (it answers a challenge this API did not issue; answer a fresh one). A Tempo transaction that cannot complete adds `nonce_already_used`, `transaction_rejected`, `transaction_reverted` and `transaction_expired`: the transfer did not happen, so answer a fresh challenge.'
          example: insufficient_funds
        documentation:
          type: string
          example: https://docs.brandfetch.com/agents/pay-per-request
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
    clientId:
      type: apiKey
      in: query
      name: c
      description: Your Brand Search client ID, sent as the `c` query parameter. Get one at https://developers.brandfetch.com.
    x402Payment:
      type: apiKey
      in: header
      name: PAYMENT-SIGNATURE
      description: 'An x402 payment for this one request: the signed payment for the challenge a bare request receives in its `PAYMENT-REQUIRED` header. Alternative to the bearer API key. See https://docs.brandfetch.com/agents/pay-per-request.'
    mppPayment:
      type: http
      scheme: Payment
      description: 'An MPP (Machine Payments Protocol) payment, settled through Stripe: the credential answering one of the `WWW-Authenticate: Payment` challenges a bare request receives. Alternative to the bearer API key. See https://docs.brandfetch.com/agents/pay-per-request#paying-with-mpp.'
x-service-info:
  categories:
  - brand-data
  - company-data
  - logos
  docs:
    homepage: https://docs.brandfetch.com
    apiReference: https://docs.brandfetch.com/reference/brand-api
    llms: https://brandfetch.com/llms.txt
x-provenance:
  method: harvested
  publisher: Brand API (Brandfetch)
  source: https://api.brandfetch.io/openapi.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)