> ## 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.

# Set your webhook URL

> Store one webhook URL on the account so you do not have to send `X-Webhook-URL` on every call. Free.

**There is nothing to subscribe to.** That one URL receives every event for the account — `enrichment.completed`, `enrichment.failed`, `enrichment.no_data_found`. No `events` array, no per-event filtering.

Your signing secret is not returned here; it lives in the API Panel, where you can also rotate it.



## OpenAPI

````yaml /openapi.json post /account/webhook
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:
  /account/webhook:
    post:
      tags:
        - Account
      summary: Set your webhook URL
      description: >-
        Store one webhook URL on the account so you do not have to send
        `X-Webhook-URL` on every call. Free.


        **There is nothing to subscribe to.** That one URL receives every event
        for the account — `enrichment.completed`, `enrichment.failed`,
        `enrichment.no_data_found`. No `events` array, no per-event filtering.


        Your signing secret is not returned here; it lives in the API Panel,
        where you can also rotate it.
      operationId: setWebhook
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - webhook_url
              properties:
                webhook_url:
                  type: string
                  format: uri
                  maxLength: 255
                  description: >-
                    Must be `https://`. Plain http is rejected — the payload
                    identifies the account, and the signature is only worth
                    having over a channel nobody can rewrite in transit.
                  examples:
                    - https://webhook.site/YOUR-ID
      responses:
        '200':
          description: Stored.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    examples:
                      - true
                  message:
                    type: string
                    examples:
                      - Webhook URL updated successfully
                  data:
                    type: object
                    properties:
                      webhook_url:
                        type: string
                        examples:
                          - https://webhook.site/YOUR-ID
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          description: >-
            `invalid_webhook_url` — a placeholder host was sent. `example.com`,
            `your-domain.com`, `your-unique-url`, `localhost` and `127.0.0.1`
            are all refused, so do not paste the literal example from a
            tutorial.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalid_webhook_url:
                  value:
                    success: false
                    error: invalid_webhook_url
                    message: >-
                      Please provide a real webhook URL, not a placeholder or
                      example domain.
                    hint: >-
                      For quick testing, get a free URL from
                      https://webhook.site
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  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
    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
  schemas:
    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
  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).

````