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

# Get company data

> Returns company data for a domain, enriching it first when we do not already hold something recent.

**Two outcomes, and both are success:**

- `200` — the domain was enriched within the last 24 hours, so you get the data straight away and spend **0 credits**.
- `202` — nothing recent on file, so enrichment is queued. Credits are reserved now; results arrive at your webhook, or you poll `status_endpoint`.

A `409` is normal too: we deduplicate per domain, so a second request while one is in flight is refused rather than charged twice.

**A webhook URL is required** for anything that triggers enrichment — send `X-Webhook-URL` here, or store one once via `POST /account/webhook`.



## OpenAPI

````yaml /openapi.json get /company/{domain}
openapi: 3.1.0
info:
  title: BounceWatch API
  version: 1.0.0
  description: >-
    Company enrichment and buying-signal data.


    Every endpoint below is live — put your API key in the panel above and press
    **Send**.


    Account endpoints are free. Enrichment spends credits, and a domain enriched
    within the last 24 hours comes back instantly at no cost.
  contact:
    name: BounceWatch Support
    email: sedat@bouncewatch.com
    url: https://docs.bouncewatch.com
servers:
  - url: https://api.bouncewatch.com/api/v1
    description: Production
security:
  - apiKey: []
tags:
  - name: Company
    description: Enrich a company by domain.
  - name: Enrichment
    description: Track an enrichment batch while it runs, and collect the results.
  - name: Account
    description: >-
      Plan, credits, usage and webhook configuration. None of these consume
      credits.
  - name: Status
    description: Liveness. No key, no credits — point your uptime monitor here.
paths:
  /company/{domain}:
    get:
      tags:
        - Company
      summary: Get company data
      description: >-
        Returns company data for a domain, enriching it first when we do not
        already hold something recent.


        **Two outcomes, and both are success:**


        - `200` — the domain was enriched within the last 24 hours, so you get
        the data straight away and spend **0 credits**.

        - `202` — nothing recent on file, so enrichment is queued. Credits are
        reserved now; results arrive at your webhook, or you poll
        `status_endpoint`.


        A `409` is normal too: we deduplicate per domain, so a second request
        while one is in flight is refused rather than charged twice.


        **A webhook URL is required** for anything that triggers enrichment —
        send `X-Webhook-URL` here, or store one once via `POST
        /account/webhook`.
      operationId: getCompany
      parameters:
        - name: domain
          in: path
          required: true
          description: >-
            Company domain. `stripe.com`, `www.stripe.com` and
            `https://stripe.com/pricing` all resolve to the same company.
          schema:
            type: string
            examples:
              - stripe.com
        - name: enrich
          in: query
          required: false
          description: >-
            Comma-separated enrichment modules. Base data (10 credits) is always
            included; each module adds its own cost. Requesting all six costs 60
            credits.
          schema:
            type: string
            examples:
              - funding,team
        - name: X-Webhook-URL
          in: header
          required: false
          description: >-
            Where to deliver the results. Must be `https://`. Overrides the URL
            stored on the account. Required unless one is already stored —
            without either, enrichment is refused with `400 webhook_required`
            before any credits are spent.
          schema:
            type: string
            format: uri
            examples:
              - https://webhook.site/YOUR-ID
      responses:
        '200':
          description: Enriched within the last 24 hours — served from cache, 0 credits.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyCached'
        '202':
          description: Enrichment queued. Credits reserved; results follow by webhook.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnrichmentQueued'
        '400':
          description: >-
            `webhook_required` — no usable https webhook. `invalid_domain` — the
            domain could not be parsed. `invalid_module` — an unknown name in
            `enrich`; the response lists the valid ones.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                webhook_required:
                  summary: No webhook configured
                  value:
                    success: false
                    error: webhook_required
                    message: Webhook URL is required for enrichment requests
                    hint: >-
                      Configure a webhook URL in your API panel at
                      https://bouncewatch.com/api-panel/webhooks or provide it
                      via the X-Webhook-URL header.
                    quick_test: >-
                      For quick testing, you can get a free webhook URL from
                      https://webhook.site
                    documentation: https://docs.bouncewatch.com/webhooks
                invalid_module:
                  summary: Unknown enrichment module
                  value:
                    success: false
                    error: invalid_module
                    message: Invalid enrichment module requested
                    valid_modules:
                      - business
                      - technology
                      - funding
                      - team
                      - signals
                      - competitors
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '404':
          description: '`company_not_found` — nothing on this domain and nothing to enrich.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: >-
            Deduplicated, not failed. `enrichment_in_progress` — one is already
            running for this domain. `recently_enriched` — ask again and the
            data comes back free. `no_data_cooldown` — we looked recently and
            found nothing, so we are not looking again yet.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                enrichment_in_progress:
                  summary: Already running
                  value:
                    success: false
                    error: enrichment_in_progress
                    message: An enrichment is already in progress for this domain
                    hint: >-
                      Please wait for the current enrichment to complete.
                      Results will be delivered via webhook.
                    batch_id: batch_1gVwXby8PsYHoMQR
        '410':
          description: >-
            `deprecated_parameter` — `mode=cached` and `mode=realtime` were
            retired. Drop the parameter; the API is single-mode now.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  headers:
    RateLimitLimit:
      description: Requests allowed per minute on this plan.
      schema:
        type: integer
        examples:
          - 150
    RateLimitRemaining:
      description: Requests left in the current minute.
      schema:
        type: integer
        examples:
          - 145
    RateLimitReset:
      description: Unix timestamp when the current window resets.
      schema:
        type: integer
        examples:
          - 1786011345
  schemas:
    CompanyCached:
      type: object
      properties:
        success:
          type: boolean
          examples:
            - true
        data:
          type: object
          description: >-
            The enriched company. Which keys are present depends on the modules
            requested — see [Response Schema](/api-reference/response-schema)
            for the full shape.
          additionalProperties: true
          examples:
            - company:
                name: Stripe
                domain: stripe.com
                description: Financial infrastructure for the internet
                founded_year: 2010
                employee_count: 8000
              funding:
                total_funding: 8700000000
                funding_stage: Series I
        credits_used:
          type: integer
          description: '`0` when served from the 24-hour cache.'
          examples:
            - 0
        from_recent_enrichment:
          type: boolean
          examples:
            - true
        credits_remaining:
          type: integer
          examples:
            - 4500
    EnrichmentQueued:
      type: object
      description: >-
        The 202 comes in two shapes depending on whether we already hold the
        company. Both always carry `success`, `batch_id`, `credits_reserved`,
        `status_endpoint` and `results_endpoint` — key your integration on those
        five.


        When we already hold the company you also get `current_data` (possibly
        stale, there so you have something to show while the refresh runs) and
        `modules_requested`. When the domain is new to us there is no
        `current_data`, the module list is called `requested_modules`, and
        `credits_remaining` is included.
      properties:
        success:
          type: boolean
          examples:
            - true
        batch_id:
          type: string
          examples:
            - batch_1gVwXby8PsYHoMQR
        enrichment_status:
          type: string
          examples:
            - processing
        credits_reserved:
          type: integer
          description: Reserved now, refunded in full if the batch produces nothing.
          examples:
            - 26
        credits_remaining:
          type: integer
          examples:
            - 4974
        status_endpoint:
          type: string
          examples:
            - >-
              https://api.bouncewatch.com/api/v1/enrichment/batch_1gVwXby8PsYHoMQR/status
        results_endpoint:
          type: string
          examples:
            - >-
              https://api.bouncewatch.com/api/v1/enrichment/batch_1gVwXby8PsYHoMQR/results
        webhook_notification:
          type: string
          examples:
            - enabled
        current_data:
          type: object
          description: >-
            Only when we already held the company. Possibly stale, possibly
            incomplete.
          additionalProperties: true
        modules_requested:
          type: array
          items:
            type: string
          examples:
            - - business
              - funding
        requested_modules:
          type: array
          description: The same list, under this name, when the domain is new to us.
          items:
            type: string
        message:
          type: string
        hint:
          type: string
      required:
        - success
        - batch_id
        - credits_reserved
        - status_endpoint
        - results_endpoint
    Error:
      type: object
      description: >-
        Every failure carries a machine-readable `error` code. Branch on that,
        never on `message` — the wording changes, the code does not.
      properties:
        success:
          type: boolean
          examples:
            - false
        error:
          type: string
          description: Stable machine-readable code.
          examples:
            - webhook_required
        message:
          type: string
          description: Human-readable explanation. Not stable — do not parse it.
          examples:
            - Webhook URL is required for enrichment requests
        hint:
          type: string
        documentation:
          type: string
      required:
        - success
        - error
  responses:
    Unauthorized:
      description: >-
        `missing_api_key` — no key was sent. `invalid_api_key` — the key is not
        valid. `api_key_disabled`, `ip_not_allowed` and `subscription_required`
        also land here.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missing_api_key:
              value:
                success: false
                error: missing_api_key
                message: >-
                  Please provide your API key in X-API-Key header or api_key
                  parameter
    InsufficientCredits:
      description: >-
        `insufficient_credits` — not enough balance for the modules requested.
        Nothing was charged.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            insufficient_credits:
              value:
                success: false
                error: insufficient_credits
                message: Insufficient credits for enrichment
                credits_required: 26
                credits_available: 15
    RateLimited:
      description: >-
        `rate_limit_exceeded` — too many requests. `concurrent_limit_reached` —
        too many enrichments running at once. `Retry-After` says how long to
        wait.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            examples:
              - 45
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            rate_limit_exceeded:
              value:
                success: false
                error: rate_limit_exceeded
                message: Rate limit exceeded. Please retry after 45 seconds.
                retry_after: 45
                limits:
                  per_minute: 150
                  per_day: 5000
                  current_minute: 150
                  current_day: 3204
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Your API key, from the [API
        Panel](https://bouncewatch.com/api-panel/api-keys).

````