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

# Resolve many brands

> The same lookup for up to 50 domains at once. Only resolved brands are billed.



## OpenAPI

````yaml https://api.hydrafetch.com/openapi.json post /v1/web/brand
openapi: 3.0.0
info:
  title: Hydrafetch API
  description: >-
    Hydrafetch is a web data API for developers and agents. Send a URL and get
    back clean Markdown, the page's own structured data, schema-shaped JSON,
    links, or a summary, with the navigation, banners and boilerplate stripped
    out. Scrape one page, crawl a whole site, run a search, or extract to a
    schema, all through one API with one response shape. Every call costs one
    credit a page whatever it took to fetch, and failures are never billed.


    Point us at a whole site and get every page. Ask a question and get answers
    with per-field

    confidence and the passage each value came from. You describe the outcome
    you want — the

    pipeline decides how to get it.


    ## Authentication


    Every request is authenticated with your API key in the `X-API-Key` header.
    Keys are scoped to a

    workspace and carry its credit balance.


    ## Credits


    Calls are billed in credits and charged only on success. A standard scrape
    is one credit; richer

    formats and the extraction tier cost more. Each response reports what it
    consumed.


    ## Conventions


    All timestamps are UTC ISO 8601. Long-running jobs (crawl, batch) return a
    job id you poll, or a

    webhook you register.


    ## Errors


    Every failure returns the same shape, whatever the status:


    ```json

    { "success": false, "error": { "code": "INSUFFICIENT_CREDITS", "message":
    "Insufficient credits" },
      "meta": { "requestId": "019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c" } }
    ```


    Branch on `error.code`, which is stable. `error.message` is written for a
    person and may be

    reworded without notice. Validation failures add `error.details`. Quote
    `meta.requestId` when

    asking us about a specific failure. Every operation documents the codes it
    can return.


    ## Rate limits


    Limits are per workspace, not per key, over a 60 second window, and the
    ceiling comes from your

    plan. Every response carries the IETF RateLimit header fields so you can
    self-throttle rather

    than discovering the limit by hitting it:


    ```http

    RateLimit-Policy: "workspace";q=600;w=60

    RateLimit: "workspace";r=599;t=42

    ```


    `q` is the quota, `w` the window in seconds, `r` the requests remaining and
    `t` the seconds until

    the window resets. A 429 also carries `Retry-After` in seconds; wait that
    long rather than

    retrying immediately. The older `X-RateLimit-Limit`, `X-RateLimit-Remaining`
    and

    `X-RateLimit-Reset` headers are still sent and mean the same thing.


    ## Versioning and deprecation


    The version is in the path: every endpoint on this API lives under `/v1/`.
    Within a version we

    only make additive changes — new endpoints, new optional parameters, new
    fields in a response.

    Adding a field to a response is not a breaking change, so parse defensively
    and ignore what you

    do not recognise.


    Anything that would break an existing integration ships under a new version
    path instead. When an

    endpoint or a version is retired, the responses say so before it stops
    working:


    ```http

    Deprecation: @1780272000

    Sunset: Sat, 01 May 2027 00:00:00 GMT

    Link: <https://docs.hydrafetch.com/changelog>; rel="deprecation"

    ```


    `Deprecation` (RFC 9745) marks when the endpoint became deprecated, `Sunset`
    (RFC 8594) when it

    stops responding, and the `deprecation` link relation points at what to move
    to. Nothing on this

    API is deprecated today, so you will not see these headers yet. Watch for
    them rather than for an

    announcement: the headers are the notice, and the linked changelog carries
    what to move to.
  version: '1.0'
  contact:
    name: Hydrafetch
    url: https://hydrafetch.com
    email: support@hydrafetch.com
servers:
  - url: https://api.hydrafetch.com
    description: Production
security:
  - apiKey: []
tags:
  - name: Scrape
    description: >-
      Turn one URL into clean, LLM-ready content. Ask for Markdown, HTML, links,
      or the page’s own structured data, and poll a job id when a fetch runs
      long.
  - name: Crawl & batch
    description: >-
      Whole sites rather than single pages. Map every URL, crawl with depth and
      path rules, batch a list you already have, and read the webhook deliveries
      for either.
  - name: Search
    description: >-
      Search the web and get the ranked results back already scraped, so an
      agent has content to cite rather than links to fetch.
  - name: Extract
    description: >-
      Pull schema-shaped JSON out of one or many pages, with optional per-field
      confidence and the source passage behind each value.
  - name: Brand
    description: >-
      Resolve a domain into the company ready to render: logos for light and
      dark, the palette ranked by how the site uses it, fonts, socials, and the
      design system behind them.
  - name: Media
    description: >-
      Images and screenshots from a page, with source and alt text, or a
      rendered capture of the page as it appears.
paths:
  /v1/web/brand:
    post:
      tags:
        - Brand
      summary: Resolve many brands
      description: >-
        The same lookup for up to 50 domains at once. Only resolved brands are
        billed.
      operationId: batch
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrandBatchDto'
      responses:
        '201':
          description: One entry per requested domain, in the order you sent them.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandBatchResponseDto'
        '400':
          description: The request body or query failed validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: VALIDATION_ERROR
                  message: url must be a valid URL
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '401':
          description: >-
            The X-API-Key header is missing, malformed, or names a key that no
            longer exists.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: UNAUTHORIZED
                  message: >-
                    Missing X-API-Key header. Agents:
                    https://hydrafetch.com/auth.md
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '402':
          description: >-
            The workspace has no credits left for this request. Nothing was
            charged and nothing was fetched.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: INSUFFICIENT_CREDITS
                  message: Insufficient credits
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '403':
          description: The key is valid but the workspace may not make this request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: WORKSPACE_BANNED
                  message: >-
                    This workspace has been suspended and cannot make API
                    requests.
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '404':
          description: No such job, or the id belongs to another workspace.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: NOT_FOUND
                  message: Job not found
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '422':
          description: >-
            The target site did not respond, so there was nothing to return.
            This is a fact about that URL rather than a fault on our side, and
            retrying it will not change the answer. Nothing was charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: UPSTREAM_UNREACHABLE
                  message: The origin did not respond to any attempt we made.
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '429':
          description: >-
            The workspace exceeded its per-minute request limit. Read the
            RateLimit headers, or Retry-After on this response, and retry after
            the window resets.
          headers:
            Retry-After:
              description: >-
                Seconds to wait before retrying. Prefer this over a fixed
                backoff.
              schema:
                type: integer
                example: 17
            RateLimit:
              description: Requests remaining (r) and seconds until the window resets (t).
              schema:
                type: string
                example: '"workspace";r=0;t=17'
            RateLimit-Policy:
              description: >-
                The quota (q) for your plan and the window it applies over (w),
                in seconds.
              schema:
                type: string
                example: '"workspace";q=600;w=60'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: TOO_MANY_REQUESTS
                  message: Rate limit exceeded for this workspace and plan.
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '500':
          description: Unexpected server error. Nothing was charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: INTERNAL_SERVER_ERROR
                  message: Internal server error
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
        '503':
          description: >-
            A dependency needed for the requested formats is unavailable. Safe
            to retry.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebError'
              example:
                success: false
                error:
                  code: SERVICE_UNAVAILABLE
                  message: The summary and json formats are not available.
                meta:
                  requestId: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
components:
  schemas:
    BrandBatchDto:
      type: object
      properties:
        domains:
          example:
            - stripe.com
            - linear.app
          type: array
          items:
            type: string
    BrandBatchResponseDto:
      type: object
      properties:
        data:
          nullable: true
          description: >-
            One entry per requested domain, in the order you sent them. Null
            where unresolved.
          type: array
          items:
            $ref: '#/components/schemas/WebBrandDataDto'
      required:
        - data
    WebError:
      type: object
      required:
        - success
        - error
        - meta
      description: >-
        Every failure on this API returns this shape, whatever the status.
        Successful responses never carry it.
      properties:
        success:
          type: boolean
          enum:
            - false
          example: false
        error:
          $ref: '#/components/schemas/WebErrorBody'
        meta:
          $ref: '#/components/schemas/WebErrorMeta'
    WebBrandDataDto:
      type: object
      properties:
        domain:
          type: string
          example: stripe.com
          description: The canonical domain for this company.
        queriedDomain:
          type: string
          example: stripe.co.uk
          description: Only when you asked for a different domain that resolved here.
        aliases:
          description: Only when this brand is known by more than its canonical domain.
          type: array
          items:
            type: string
        name:
          type: object
          nullable: true
          example: Stripe
        description:
          type: object
          nullable: true
          example: >-
            Stripe powers online and in-person payment processing and financial
            solutions for businesses of all sizes.
        tagline:
          type: object
          nullable: true
          example: Financial infrastructure to grow your revenue.
        naics:
          description: >-
            Industry, as a real NAICS code rather than a phrase nobody can group
            on.
          allOf:
            - $ref: '#/components/schemas/BrandNaicsDto'
        assets:
          type: array
          items:
            $ref: '#/components/schemas/BrandAssetDto'
        colors:
          type: array
          items:
            $ref: '#/components/schemas/BrandColorDto'
        fonts:
          type: array
          items:
            $ref: '#/components/schemas/BrandFontDto'
        socials:
          type: array
          items:
            $ref: '#/components/schemas/BrandSocialDto'
        links:
          $ref: '#/components/schemas/BrandLinksDto'
        email:
          type: string
          example: support@stripe.com
        legalName:
          type: string
          example: Stripe, Inc.
        sources:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/BrandFieldProvenanceDto'
          description: >-
            Per-field provenance, keyed by field name. Lets you tell "their
            markup says this" from "a model guessed this".
        resolvedAt:
          type: object
          nullable: true
          example: '2026-08-22T10:14:03.000Z'
      required:
        - domain
        - name
        - description
        - tagline
        - assets
        - colors
        - fonts
        - socials
        - links
        - sources
        - resolvedAt
    WebErrorBody:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          enum:
            - VALIDATION_ERROR
            - INVALID_INPUT
            - UNAUTHORIZED
            - INSUFFICIENT_CREDITS
            - FORBIDDEN
            - WORKSPACE_BANNED
            - NOT_FOUND
            - TOO_MANY_REQUESTS
            - UPSTREAM_UNREACHABLE
            - SERVICE_UNAVAILABLE
            - INTERNAL_SERVER_ERROR
          description: >-
            Stable, machine-readable reason. Branch on this rather than on the
            message, which may be reworded.
          example: INSUFFICIENT_CREDITS
        message:
          type: string
          description: Human-readable explanation. Safe to show a user, not to parse.
          example: Insufficient credits
        details:
          type: object
          additionalProperties: true
          description: Optional machine-readable context, present on validation failures.
    WebErrorMeta:
      type: object
      properties:
        requestId:
          type: string
          description: Quote this when contacting support about a specific failure.
          example: 019e8a3c-9f0b-7c12-88ab-1d2e3f4a5b6c
    BrandNaicsDto:
      type: object
      properties:
        code:
          type: string
          example: '5223'
        title:
          type: string
          example: Activities Related to Credit Intermediation
        level:
          type: string
          enum:
            - sector
            - industry_group
            - national_industry
          example: industry_group
          description: >-
            How specific the answer is. `industry_group` is the 4-digit level,
            `national_industry` the 6-digit one.
        sector:
          $ref: '#/components/schemas/BrandNaicsSectorDto'
        confidence:
          type: number
          example: 0.8
          minimum: 0
          maximum: 1
          description: >-
            How much evidence the classification found, not a model's
            self-report.
      required:
        - code
        - title
        - level
        - sector
        - confidence
    BrandAssetDto:
      type: object
      properties:
        kind:
          type: string
          enum:
            - wordmark
            - symbol
            - favicon
            - backdrop
          example: symbol
          description: What kind of mark this is.
        variant:
          type: string
          enum:
            - light
            - dark
            - mono
          example: light
          description: >-
            Which background the asset is legible on. `mono` is a single-colour
            mark that works on both.
        url:
          type: string
          example: https://media.hydrafetch.com/brand/a0/a07c2695173dde0a1ffa.svg
          description: Public and immutable, so it can be embedded anywhere.
        format:
          type: string
          example: svg
        resolution:
          nullable: true
          type: object
          allOf:
            - $ref: '#/components/schemas/BrandResolutionDto'
        colors:
          description: >-
            The colours in the asset itself. A logo's own palette is the
            brand's, by definition.
          type: array
          items:
            $ref: '#/components/schemas/BrandColorDto'
        blurhash:
          type: object
          nullable: true
          example: LmGk_aoh4sWHohWEWDt506WD?Sod
          description: >-
            Tiny placeholder hash, so a client can render something before the
            image lands.
      required:
        - kind
        - variant
        - url
        - format
        - resolution
        - colors
        - blurhash
    BrandColorDto:
      type: object
      properties:
        hex:
          type: string
          example: '#533afd'
        name:
          type: string
          example: Indigo
          description: >-
            Nearest CSS colour name, so a swatch reads as something and not only
            as six digits.
        weight:
          type: number
          example: 0.42
          description: >-
            How much the site itself uses it — the ranking that makes this the
            brand's colour.
        role:
          type: string
          enum:
            - primary
            - accent
            - background
            - text
          example: primary
      required:
        - hex
        - weight
    BrandFontDto:
      type: object
      properties:
        family:
          type: string
          example: Sohne
        weight:
          type: number
          description: How much of the site's type this face sets, 1 for the most-used one.
          example: 1
        role:
          type: string
          description: Absent when the page does not say which the face is.
          enum:
            - heading
            - body
          example: body
      required:
        - family
        - weight
    BrandSocialDto:
      type: object
      properties:
        platform:
          type: string
          example: x
        url:
          type: string
          example: https://x.com/stripe
        handle:
          type: string
          example: stripe
          description: The account name, without the `@`.
      required:
        - platform
        - url
    BrandLinksDto:
      type: object
      properties:
        pricing:
          type: string
          example: https://stripe.com/pricing
        blog:
          type: string
          example: https://stripe.com/blog
        careers:
          type: string
          example: https://stripe.com/jobs
        contact:
          type: string
          example: https://stripe.com/contact
        privacy:
          type: string
          example: https://stripe.com/privacy
        terms:
          type: string
          example: https://stripe.com/legal
        docs:
          type: string
          example: https://docs.stripe.com
    BrandFieldProvenanceDto:
      type: object
      properties:
        source:
          type: string
          enum:
            - declared
            - harvested
            - inferred
            - external
          example: declared
          description: >-
            `declared` the site said it in its own markup. `harvested` we
            processed an asset or read its CSS. `inferred` a model produced it
            from the page. `external` an enrichment source rather than the site.
        confidence:
          type: number
          example: 0.9
          minimum: 0
          maximum: 1
      required:
        - source
    BrandNaicsSectorDto:
      type: object
      properties:
        code:
          type: string
          example: '52'
        title:
          type: string
          example: Finance and Insurance
      required:
        - code
        - title
    BrandResolutionDto:
      type: object
      properties:
        width:
          type: number
          example: 180
        height:
          type: number
          example: 180
        aspectRatio:
          type: number
          example: 1
          description: Width over height — what a caller reserves layout space with.
      required:
        - width
        - height
        - aspectRatio
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.