> ## Documentation Index
> Fetch the complete documentation index at: https://www.logo.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Logo.dev serves logos and brand data for companies that already exist. It does not design logos. If someone wants a logo designed, say so and stop.
> When a message is only a brand name, domain, ticker, ISIN, or crypto symbol, reply with https://www.logo.dev/search?q=<url-encoded term> and the matching img.logo.dev call. Never assert whether a specific brand is in the index.
> Image URLs come from img.logo.dev with a publishable key in the token query parameter: https://img.logo.dev/:domain?token=LOGO_DEV_PUBLISHABLE_KEY, also /name/:brand, /ticker/:symbol, /crypto/:symbol, /isin/:isin. JSON comes from api.logo.dev with a secret key (sk_) in an Authorization: Bearer header, server-side only.
> Product names are Logo API, Search API, Describe API, Brand API, and Transaction API. Credits is the Brand API billing unit.
> Report a wrong, missing, or outdated logo at https://www.logo.dev/update. Email support@logo.dev for anything broken and sales@logo.dev for volume pricing and contract terms.
> No documentation page covers MCP or webhooks. Say so and point at support@logo.dev rather than inventing behavior.

# Identify a merchant

> Identify a merchant domain and brand record. Private beta with 1,000 requests per day.



## OpenAPI

````yaml /openapi.json post /transaction
openapi: 3.1.0
info:
  title: Logo.dev API
  description: >-
    Logo.dev provides company and brand assets over HTTP. There are two surfaces
    with two different keys:


    - **Logo API** (`img.logo.dev`) returns a logo image directly. Authenticate
    with a **publishable key** via the `token` query parameter — safe for
    client-side use.

    - **REST APIs** (`api.logo.dev`) return JSON. Authenticate with a **secret
    key** via the `Authorization: Bearer` header — server-side only.


    Get your keys from the [dashboard](https://www.logo.dev/dashboard/api-keys).
  version: 1.0.0
  contact:
    name: Logo.dev Support
    email: support@logo.dev
    url: https://docs.logo.dev
servers:
  - url: https://api.logo.dev
    description: REST APIs (Brand Search, Brand Data)
security: []
tags:
  - name: Logo API
    description: >-
      Logo images by domain, ticker, crypto symbol, ISIN, or brand name. Served
      from img.logo.dev with a publishable key.
  - name: REST API
    description: JSON endpoints served from api.logo.dev with a secret key.
  - name: Transaction API
    description: Turn a card transaction descriptor into a merchant identity. Gated beta.
paths:
  /transaction:
    servers:
      - url: https://www.logo.dev/api
        description: Transaction API beta on Vercel
    post:
      tags:
        - Transaction API
      summary: Identify a merchant
      description: >-
        Identify a merchant from a name or card descriptor with an optional
        country hint. Private beta: access must be enabled on your account. Your
        transaction-only beta key is always shown in the dashboard playground.
        Limited to 1,000 requests per user per UTC day, shared with playground
        runs. Each dispatched lookup counts, including cleaned results and
        provider failures. Beta requests do not use Credits. Descriptor accuracy
        is experimental.
      operationId: identifyMerchant
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - transaction
              properties:
                transaction:
                  type: string
                  minLength: 1
                  maxLength: 1024
                  description: >-
                    Merchant name or card descriptor. Leading and trailing
                    whitespace is removed.
                  examples:
                    - Starbucks
                country_code:
                  type: string
                  minLength: 2
                  maxLength: 2
                  description: >-
                    Optional ISO 3166-1 alpha-2 country hint, case-insensitive.
                    Omit for no country preference. AQ, AX, TF, and VA are
                    unsupported when transaction_context is supplied.
                  examples:
                    - US
                transaction_context:
                  type: object
                  additionalProperties: false
                  description: >-
                    Optional as a group. All four transaction fields are
                    required when supplied. Use actual values; no defaults are
                    inferred.
                  required:
                    - date
                    - amount
                    - currency
                    - entry_type
                  properties:
                    date:
                      type: string
                      format: date
                      description: >-
                        Posted date in YYYY-MM-DD format, from 1970-01-01 to
                        tomorrow in UTC.
                    amount:
                      type: number
                      minimum: 0
                      maximum: 1000000000000
                      description: Amount in major currency units, such as dollars.
                    currency:
                      type: string
                      description: >-
                        Supported ISO 4217 code. Lowercase is also accepted.
                        Supported codes: EUR, AED, AFN, XCD, ALL, AMD, AOA, ARS,
                        USD, AUD, AWG, AZN, BAM, BBD, BDT, XOF, BGN, BHD, BIF,
                        BMD, BND, BOB, BRL, BSD, INR, NOK, BWP, BYR, BZD, CAD,
                        CDF, XAF, CHF, NZD, CLP, CNY, COP, CRC, CUP, CVE, ANG,
                        CZK, DJF, DKK, DOP, DZD, EGP, MAD, ERN, ETB, FJD, FKP,
                        GBP, GEL, GHS, GIP, GMD, GNF, GTQ, GYD, HKD, HNL, HUF,
                        IDR, ILS, IQD, IRR, ISK, JMD, JOD, JPY, KES, KGS, KHR,
                        KMF, KPW, KRW, KWD, KYD, KZT, LAK, LBP, LKR, LRD, ZAR,
                        LYD, MDL, MGA, MKD, MMK, MNT, MOP, MRO, MUR, MVR, MWK,
                        MXN, MYR, MZN, XPF, NGN, NIO, NPR, OMR, PEN, PGK, PHP,
                        PKR, PLN, PYG, QAR, RON, RSD, RUB, RWF, SAR, SBD, SCR,
                        SDG, SEK, SGD, SHP, SLL, SOS, SRD, SSP, STD, SYP, SZL,
                        THB, TJS, TMT, TND, TOP, TRY, TTD, TWD, TZS, UAH, UGX,
                        UYU, UZS, VEF, VND, VUV, WST, YER, ZMW, ZWL, HRK.
                      examples:
                        - USD
                    entry_type:
                      type: string
                      enum:
                        - incoming
                        - outgoing
                      description: Direction from the bank account owner's perspective.
                    account_holder:
                      type: object
                      additionalProperties: false
                      required:
                        - type
                      description: >-
                        Optional context about the actual bank account owner.
                        Separate context is created for each lookup.
                      properties:
                        type:
                          type: string
                          enum:
                            - consumer
                            - business
                        name:
                          type: string
                          minLength: 1
                          maxLength: 1024
                          description: >-
                            Optional account-owner name; surrounding whitespace
                            is trimmed.
            examples:
              merchant:
                value:
                  transaction: Starbucks
                  country_code: US
              context:
                value:
                  transaction: SQ* STARBUCKS 10 Union Sq
                  country_code: US
                  transaction_context:
                    date: '2026-09-04'
                    amount: 10
                    currency: USD
                    entry_type: outgoing
                    account_holder:
                      type: consumer
      responses:
        '200':
          description: >-
            A matched merchant or a cleaned descriptor. Every non-empty
            transaction returns a row. Illustrative response examples; fields
            vary by lookup.
          headers:
            X-RateLimit-Limit:
              description: Daily request limit (1,000).
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests remaining after this call.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: Next midnight UTC as Unix seconds.
              schema:
                type: integer
          content:
            application/json:
              schema:
                type: object
                required:
                  - domain
                  - name
                  - entity_id
                  - logo_url
                  - parent
                  - intermediary
                  - status
                  - match_type
                  - confidence
                properties:
                  domain:
                    type:
                      - string
                      - 'null'
                    description: Identified merchant domain, or null on a cleaned row.
                  name:
                    type: string
                    description: >-
                      Display name for the row, populated for every non-empty
                      transaction. The Brand API's name where it resolves a
                      brand for the domain, the name the transaction lookup
                      returned for the long tail, and the descriptor tidied into
                      a display name where nothing was identified.
                    examples:
                      - Starbucks
                  entity_type:
                    type:
                      - string
                      - 'null'
                    enum:
                      - person
                      - organization
                      - null
                    description: >-
                      Returned only when transaction_context is supplied. The
                      enrichment provider's classification of the party it
                      identified, or null when the provider classified nobody. A
                      null value is not proof that no merchant was found: a
                      later step can identify one, so a matched row with a
                      domain may still carry null here. A person never returns a
                      merchant domain; the row comes back cleaned. Unrelated to
                      intermediary, which describes the platform a purchase ran
                      through.
                  entity_id:
                    type:
                      - string
                      - 'null'
                    description: >-
                      The merchant's Logo.dev brand id, the same id the Brand
                      API uses for that brand, or null when the Brand API
                      resolves no brand for the domain and null on a cleaned
                      row. It holds still when a company changes its domain: key
                      your own records off it rather than off domain, and a
                      rebrand leaves one merchant rather than two. It is also
                      the corroboration test, since a row carrying an id is one
                      two sources agree on: a stage of the pipeline identified
                      the merchant, and the Brand API resolves a brand for the
                      same domain. Branch on it rather than on the score.
                    examples:
                      - 2f0a6d2e-4c19-4a7b-9f31-8c6e0b4d7a52
                  logo_url:
                    type:
                      - string
                      - 'null'
                    format: uri
                    description: >-
                      img.logo.dev URL for the merchant's logo, or null on a
                      cleaned row. It carries no token: append your own
                      publishable key before rendering it, as
                      https://img.logo.dev/starbucks.com?token=LOGO_DEV_PUBLISHABLE_KEY.
                    examples:
                      - https://img.logo.dev/starbucks.com
                  parent:
                    type:
                      - object
                      - 'null'
                    description: >-
                      The company that owns the merchant, returned beside the
                      merchant rather than instead of it: a lookup for
                      facebook.com comes back as Facebook with Meta here. It is
                      never the merchant, and never replaces it in domain. Use
                      it as a grouping key: totalling spend on parent.entity_id
                      adds a company's brands up to one line, and that id is the
                      company's own entity_id when it turns up as a merchant
                      itself. It names the nearest owner Logo.dev records rather
                      than the top of the chain, so jaguar.com returns JLR and a
                      lookup for JLR returns Tata Motors. Coverage is thin:
                      Logo.dev records 194 hand-verified ownership pairs across
                      108 companies, against the more than 50 million companies
                      the Brand API covers, so most rows return null. Null means
                      Logo.dev records no owner for this merchant. It does not
                      mean the merchant is independent. Null also when the Brand
                      API resolves no brand for the owner's domain, since no
                      owner is published that cannot be named, and null on a
                      cleaned row. One case it does not cover: a company that
                      rebrands onto a new domain can come back as a new
                      identity, and this joins it to the old one only when both
                      domains are in the ownership list. The fields are the same
                      four as intermediary, so one shape covers both.
                    required:
                      - domain
                      - name
                      - entity_id
                      - logo_url
                    properties:
                      domain:
                        type:
                          - string
                          - 'null'
                        description: >-
                          The owner's domain. Build a logo URL from it the same
                          way you do for the merchant.
                        examples:
                          - meta.com
                      name:
                        type:
                          - string
                          - 'null'
                        description: >-
                          The owner's display name, as the Brand API resolves
                          it.
                        examples:
                          - Meta
                      entity_id:
                        type:
                          - string
                          - 'null'
                        description: >-
                          The owner's Logo.dev brand id, the same id the Brand
                          API uses for that brand. Group totals by company off
                          it.
                        examples:
                          - c31d8b06-5e4f-4a91-bb27-9d0e6f2a41c5
                      logo_url:
                        type:
                          - string
                          - 'null'
                        description: >-
                          Tokenless image URL for the owner's logo. Append your
                          own publishable key, as you do for the merchant's.
                        examples:
                          - https://img.logo.dev/meta.com
                  intermediary:
                    type:
                      - object
                      - 'null'
                    description: >-
                      The platform the purchase ran through, returned beside the
                      merchant rather than instead of it. It is never the
                      merchant: the merchant is domain. Null when nothing stood
                      between the account holder and the merchant, and null when
                      the platform sold the thing itself: a DashPass
                      subscription names DoorDash in domain and leaves this
                      null. A descriptor that starts with a platform prefix
                      fills it without context: the text after the prefix is
                      resolved as its own lookup, so the seller is the merchant
                      and the platform stands beside it. A cleaned row can still
                      carry one: a purchase that ran through a platform whose
                      merchant could not be identified. The platform gets the
                      same identity treatment as the merchant, from the same
                      lookup, keyed by its own domain: its name, its Logo.dev
                      brand id, and a tokenless logo URL. It carries no role;
                      the lookup states none.
                    required:
                      - domain
                      - name
                      - entity_id
                      - logo_url
                    properties:
                      domain:
                        type:
                          - string
                          - 'null'
                        description: >-
                          The platform's domain, or null. Build a logo URL from
                          it the same way you do for the merchant.
                        examples:
                          - squareup.com
                      name:
                        type:
                          - string
                          - 'null'
                        description: >-
                          The platform's display name, or null. The Brand API's
                          name for the platform wins where there is one.
                        examples:
                          - Square
                      entity_id:
                        type:
                          - string
                          - 'null'
                        description: >-
                          The platform's Logo.dev brand id, the same id the
                          Brand API uses for that brand, or null when the Brand
                          API resolves no brand for its domain. Key totals by
                          platform off it, the same way you key merchants.
                        examples:
                          - 9b2e7c31-6d04-4f8a-b1c5-2e7d0a4f6c18
                      logo_url:
                        type:
                          - string
                          - 'null'
                        description: >-
                          Tokenless image URL for the platform's logo, or null
                          when it has no domain. Append your own publishable
                          key, as you do for the merchant's.
                        examples:
                          - https://img.logo.dev/squareup.com
                  status:
                    type: string
                    enum:
                      - matched
                      - cleaned
                    description: >-
                      matched when a merchant domain was identified. cleaned
                      when the descriptor was tidied into a display name and no
                      merchant was identified. A non-empty transaction returns
                      one of the two. There is no not-found result.
                  match_type:
                    type: string
                    enum:
                      - enriched_context
                      - descriptor_domain
                      - resolved_entity
                      - searched_name
                      - cleaned_descriptor
                    description: >-
                      Which stage of the Logo.dev pipeline produced the row,
                      strongest first. enriched_context: identified from the
                      full transaction, where entry type and account holder are
                      available. descriptor_domain: the descriptor printed the
                      merchant's own domain, resolved like any other merchant
                      domain. resolved_entity: identified from the descriptor
                      alone, with no transaction context. searched_name: the
                      Logo.dev brand corpus of more than 50 million companies
                      recognized the cleaned name. cleaned_descriptor: nothing
                      was identified, and name carries the descriptor, tidied.
                      descriptor_domain and searched_name are new values on rows
                      that returned cleaned_descriptor before; nothing was
                      removed.
                  confidence:
                    type: number
                    minimum: 0
                    maximum: 1
                    description: >-
                      How sure Logo.dev is about this row, from 0 to 1. Two
                      inputs move it: which stage of the pipeline produced the
                      row, and whether the Brand API resolves a brand for the
                      same domain. Corroboration is the input that does not come
                      from the transaction lookup itself, so the score is not a
                      restatement of match_type. A quality rule firing sends the
                      row to the floor. The same input scores the same number
                      every time. Logo.dev publishes no cut-off: rank and triage
                      on this number, and branch on entity_id. The corroboration
                      input outlived the verified flag that was removed from
                      this response: that flag restated entity_id !== null,
                      while the score combines corroboration with the match
                      path.
              examples:
                matched:
                  value:
                    domain: starbucks.com
                    name: Starbucks
                    entity_id: 2f0a6d2e-4c19-4a7b-9f31-8c6e0b4d7a52
                    logo_url: https://img.logo.dev/starbucks.com
                    parent: null
                    intermediary: null
                    status: matched
                    match_type: resolved_entity
                    confidence: 0.8
                matchedWithContext:
                  value:
                    domain: starbucks.com
                    name: Starbucks
                    entity_type: organization
                    entity_id: 2f0a6d2e-4c19-4a7b-9f31-8c6e0b4d7a52
                    logo_url: https://img.logo.dev/starbucks.com
                    parent: null
                    intermediary:
                      domain: squareup.com
                      name: Square
                      entity_id: 9b2e7c31-6d04-4f8a-b1c5-2e7d0a4f6c18
                      logo_url: https://img.logo.dev/squareup.com
                    status: matched
                    match_type: enriched_context
                    confidence: 0.95
                ownedByAParent:
                  value:
                    domain: facebook.com
                    name: Facebook
                    entity_id: 0f4a2c7e-91d3-4b6a-8c25-3ad70b1e9f44
                    logo_url: https://img.logo.dev/facebook.com
                    parent:
                      domain: meta.com
                      name: Meta
                      entity_id: c31d8b06-5e4f-4a91-bb27-9d0e6f2a41c5
                      logo_url: https://img.logo.dev/meta.com
                    intermediary: null
                    status: matched
                    match_type: resolved_entity
                    confidence: 0.8
                uncorroborated:
                  value:
                    domain: bluedoorpub.com
                    name: Blue Door Pub
                    entity_id: null
                    logo_url: https://img.logo.dev/bluedoorpub.com
                    parent: null
                    intermediary: null
                    status: matched
                    match_type: resolved_entity
                    confidence: 0.55
                cleaned:
                  value:
                    domain: null
                    name: Jane Doe
                    entity_id: null
                    logo_url: null
                    parent: null
                    intermediary: null
                    status: cleaned
                    match_type: cleaned_descriptor
                    confidence: 0.1
                cleanedWithPlatform:
                  value:
                    domain: null
                    name: Xqzv Deli
                    entity_type: organization
                    entity_id: null
                    logo_url: null
                    parent: null
                    intermediary:
                      domain: squareup.com
                      name: Square
                      entity_id: 9b2e7c31-6d04-4f8a-b1c5-2e7d0a4f6c18
                      logo_url: https://img.logo.dev/squareup.com
                    status: cleaned
                    match_type: cleaned_descriptor
                    confidence: 0.1
                person:
                  value:
                    domain: null
                    name: Jane Doe
                    entity_type: person
                    entity_id: null
                    logo_url: null
                    parent: null
                    intermediary: null
                    status: cleaned
                    match_type: cleaned_descriptor
                    confidence: 0.1
        '400':
          description: >-
            Invalid JSON or input fields, including incomplete
            transaction_context. Does not consume the daily allowance.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '401':
          description: Missing, invalid, or revoked transaction beta key.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '403':
          description: Transaction beta access is not enabled for this user.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '409':
          description: >-
            The same transaction is already being looked up by another request.
            Retry after the delay in Retry-After to get the saved result.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
          headers:
            Retry-After:
              description: Seconds to wait before retrying (2).
              schema:
                type: integer
        '413':
          description: Request body exceeds 8,192 bytes.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '415':
          description: Content-Type must be application/json.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '429':
          description: >-
            Daily limit reached, or too many requests in one minute. Wait for
            the reset before retrying.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
          headers:
            X-RateLimit-Limit:
              description: Daily request limit (1,000).
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests remaining after this call.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: Next midnight UTC as Unix seconds.
              schema:
                type: integer
            Retry-After:
              description: Seconds until the daily allowance resets.
              schema:
                type: integer
        '503':
          description: >-
            Provider, database, or access check unavailable. A dispatched lookup
            still counts toward the daily limit.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
          headers:
            X-RateLimit-Limit:
              description: Daily request limit (1,000).
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests remaining after this call.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: Next midnight UTC as Unix seconds.
              schema:
                type: integer
      security:
        - transactionBetaKey: []
components:
  securitySchemes:
    transactionBetaKey:
      type: http
      scheme: bearer
      bearerFormat: tx_beta_…
      description: >-
        Transaction-only beta key, issued with your beta access and always
        visible in the Transaction Playground. Existing Logo.dev secret keys do
        not authenticate this beta.

````