Bootic Webhooks API

Event webhooks. Subscribe to events such as `orders.created`, `products.updated`, etc. Inactive subscriptions can be reactivated and their delivery history inspected.

Operations 8

GET /webhooks List webhooks #
POST /webhooks Create a webhook #
GET /webhooks/{id} Get a webhook #
DELETE /webhooks/{id} Delete a webhook #
PUT /webhooks/{id}/reactivate Reactivate a failed webhook #
GET /webhooks/{id}/history Get webhook delivery history #
GET /sellers/{seller_id}/webhooks List webhooks for a seller #
POST /sellers/{seller_id}/webhooks Create a webhook for a seller #

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/bootic-webhooks-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

bootic-webhooks-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Bolder API v2 Webhooks API
  version: '2.0'
  description: '## Getting Started


    The Bolder API provides programmatic access to your Bolder Shop data through a

    hypermedia-driven REST interface.'
  contact:
    name: Bolder API Support
    url: https://www.onbolder.com
servers:
- url: https://api.onbolder.com/v2
  description: Production
security:
- bearerAuth: []
tags:
- name: Webhooks
  description: 'Event webhooks. Subscribe to events such as `orders.created`, `products.updated`, etc.

    Inactive subscriptions can be reactivated and their delivery history inspected.'
paths:
  /webhooks:
    get:
      tags:
      - Webhooks
      summary: List webhooks
      operationId: listWebhooksFlattened
      parameters:
      - name: shop_id
        in: query
        schema:
          type: integer
        description: Filter by shop ID
      - name: seller_id
        in: query
        schema:
          type: integer
        description: Filter by seller ID
      - name: page
        in: query
        schema:
          type: integer
          default: 1
      - name: per_page
        in: query
        schema:
          type: integer
          default: 30
      - name: status
        in: query
        schema:
          type: string
        description: Filter by status (active, failed_activation, failed, disabled)
      x-codeSamples:
      - lang: Shell
        label: cURL
        source: "# List all webhooks for account\ncurl -s -H \"Authorization: Bearer $BOLDER_TOKEN\" \\\n  \"https://api.onbolder.com/v2/webhooks\"\n\n# Filter by shop\ncurl -s -H \"Authorization: Bearer $BOLDER_TOKEN\" \\\n  \"https://api.onbolder.com/v2/webhooks?shop_id=1\"\n"
      description: 'Returns webhooks across the account.

        Optionally filter by `shop_id` or `seller_id` query parameter.


        ## Delivery payload guarantees


        Every order-related event payload (`orders.created`, `orders.updated`,

        `orders.updated.*`) is built from the same serializer and always includes

        both `id` (numeric order id) and `code` (the order''s public-facing

        reference/permalink) — neither is ever omitted.


        ## Retries and automatic disabling


        Two independent counters are involved — don''t confuse them:


        - **Per-event retries (up to 10, over ~24h)**: each individual event

        delivery (e.g. one order''s `orders.updated`) is retried by the

        delivery worker up to 10 times with growing backoff, spread across

        roughly a day (a few minutes after the 1st failure, up to ~24h

        after it by the 10th and final attempt) — this gives a

        temporarily-down endpoint a full day to recover before this

        specific event delivery is given up on.

        - **Subscription-wide `error_count` (disables at 100)**: every

        failed attempt across *all* events (including each of the 10

        per-event retries above) increments `error_count` on the

        subscription. Reaching 100 sets `status` to `failed` and stops all

        further delivery — in practice that means roughly 10 different

        order events each exhausting their full retry chain with no

        successful delivery in between, since **any single successful

        delivery resets `error_count` to 0**. There''s no fixed time bound

        on this: it depends on how many order events fire while your

        endpoint is down.


        Delivery outcomes are tracked on the subscription independent of the

        worker retries:


        - A `410 Gone` response from your endpoint immediately sets the

        subscription''s `status` to `disabled` — no further attempts are made,

        regardless of `error_count`.

        - Any other non-2xx response (or timeout) increments `error_count`.

        Timeouts and a handful of transient upstream errors (502/512/523) don''t

        count toward the disable threshold; other non-2xx responses do.

        - A `failed` (or `disabled`) subscription can be re-enabled at any time via

        `PUT /webhooks/{id}/reactivate`, which resets the error count.'
      responses:
        '200':
          description: Webhooks list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookList'
    post:
      tags:
      - Webhooks
      summary: Create a webhook
      description: '`shop_id` is required when creating via this flat endpoint. Alternatively, use `POST /sellers/{seller_id}/webhooks`.'
      operationId: createWebhookFlattened
      parameters:
      - name: shop_id
        in: query
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookInput'
            example:
              topic: orders.created
              url: https://myapp.com/webhook
      responses:
        '201':
          description: Webhook created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
        '403':
          description: Token lacks the scope required to subscribe to this topic
  /webhooks/{id}:
    parameters:
    - name: id
      in: path
      required: true
      schema:
        type: integer
    get:
      tags:
      - Webhooks
      summary: Get a webhook
      operationId: getWebhookFlattened
      responses:
        '200':
          description: Webhook details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
    delete:
      tags:
      - Webhooks
      summary: Delete a webhook
      operationId: deleteWebhookFlattened
      responses:
        '204':
          description: Webhook deleted
  /webhooks/{id}/reactivate:
    parameters:
    - name: id
      in: path
      required: true
      schema:
        type: integer
    put:
      tags:
      - Webhooks
      summary: Reactivate a failed webhook
      operationId: reactivateWebhookFlattened
      responses:
        '200':
          description: Webhook reactivated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
  /webhooks/{id}/history:
    parameters:
    - name: id
      in: path
      required: true
      schema:
        type: integer
    get:
      tags:
      - Webhooks
      summary: Get webhook delivery history
      operationId: webhookHistoryFlattened
      responses:
        '200':
          description: Delivery history
  /sellers/{seller_id}/webhooks:
    parameters:
    - name: seller_id
      in: path
      required: true
      schema:
        type: integer
    get:
      tags:
      - Webhooks
      summary: List webhooks for a seller
      description: Seller-nested equivalent of `GET /webhooks?seller_id=X`.
      operationId: listSellerWebhooks
      x-codeSamples:
      - lang: Shell
        label: cURL
        source: "curl -s -H \"Authorization: Bearer $BOLDER_TOKEN\" \\\n  \"https://api.onbolder.com/v2/sellers/5/webhooks\"\n"
      responses:
        '200':
          description: Webhooks list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookList'
    post:
      tags:
      - Webhooks
      summary: Create a webhook for a seller
      operationId: createSellerWebhook
      x-codeSamples:
      - lang: Shell
        label: cURL
        source: "curl -s -X POST \\\n  -H \"Authorization: Bearer $BOLDER_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"topic\":\"orders.created\",\"url\":\"https://myapp.com/webhook\"}' \\\n  \"https://api.onbolder.com/v2/sellers/5/webhooks\"\n"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookInput'
            example:
              topic: orders.created
              url: https://myapp.com/webhook
      responses:
        '201':
          description: Webhook created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Webhook'
              example:
                id: 101
                channel_id: 5
                topic: orders.created
                url: https://myapp.com/webhook
                status: pending
                notify_origin: false
                _links:
                  self:
                    href: https://api.onbolder.com/v2/webhooks/101
        '403':
          description: Token lacks the scope required to subscribe to this topic
components:
  schemas:
    WebhookInput:
      type: object
      required:
      - topic
      - url
      properties:
        topic:
          type: string
          example: orders.created
          description: 'Supported topics: `orders.created`, `orders.updated`,

            `orders.updated.closed`, `orders.updated.shipped`,

            `contacts.created`, `contacts.updated`, `products.created`,

            `products.updated`, `products.deleted`

            '
        url:
          type: string
          example: https://myapp.com/webhook
        notify_origin:
          type: boolean
          default: false
          description: If false, does not notify the request-originating host
        auth:
          type: object
          properties:
            type:
              type: string
              enum:
              - none
              - basic
              default: none
            username:
              type: string
            password:
              type: string
    Pagination:
      type: object
      properties:
        total_items:
          type: integer
          example: 42
        per_page:
          type: integer
          example: 20
        page:
          type: integer
          example: 1
    Webhook:
      type: object
      properties:
        _links:
          $ref: '#/components/schemas/HalLinks'
        id:
          type: integer
        channel_id:
          type: integer
        topic:
          type: string
          example: orders.created
        url:
          type: string
          example: https://myapp.com/events
        status:
          type: string
          enum:
          - active
          - failed_activation
          - failed
          - disabled
          description: '`active` — receiving deliveries normally.

            `failed_activation` — the initial activation handshake failed.

            `failed` — disabled automatically after 100 consecutive non-2xx delivery

            responses (see `error_count`); can be re-enabled via

            `PUT /webhooks/{id}/reactivate`.

            `disabled` — the target URL returned `410 Gone`; disabled immediately,

            with no retry threshold. Also reactivatable via the same endpoint.

            '
        auth:
          type: object
        notify_origin:
          type: boolean
        app_id:
          type: integer
        error_count:
          type: integer
        last_error:
          type: string
        last_error_on:
          type: string
          format: date-time
        created_on:
          type: string
          format: date-time
        updated_on:
          type: string
          format: date-time
    WebhookList:
      allOf:
      - $ref: '#/components/schemas/Pagination'
      - type: object
        properties:
          _links:
            $ref: '#/components/schemas/HalLinks'
          _class:
            type: array
            items:
              type: string
            example:
            - results
            - hubSubscriptions
          _embedded:
            type: object
            properties:
              subscriptions:
                type: array
                items:
                  $ref: '#/components/schemas/Webhook'
    HalLinks:
      type: object
      additionalProperties:
        oneOf:
        - $ref: '#/components/schemas/HalLink'
        - type: array
          items:
            $ref: '#/components/schemas/HalLink'
    HalLink:
      type: object
      required:
      - href
      properties:
        href:
          type: string
        templated:
          type: boolean
        method:
          type: string
          enum:
          - get
          - post
          - put
          - patch
          - delete
        title:
          type: string
        type:
          type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
    oauth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://auth.onbolder.com/oauth/token
          scopes:
            products.read: View products, variants and collections
            products.write: Create and update products
            orders.read: View orders
            orders.write: Create and update orders
            customers.read: View customer profiles
            customers.write: Update customer profiles
            shops.read: View shop configuration
            shops.write: Update shop configuration
            hub.read: View content (posts, pages)
            hub.write: Create and update content
            store.read: View themes and assets
            store.write: Manage themes and assets
            sellers.read: View seller information
            batches.read: View batch job status
            batches.write: Create and run batch jobs
        authorizationCode:
          authorizationUrl: https://auth.onbolder.com/oauth/authorize
          tokenUrl: https://auth.onbolder.com/oauth/token
          scopes:
            products.read: View products, variants and collections
            products.write: Create and update products
            orders.read: View orders
            orders.write: Create and update orders
            customers.read: View customer profiles
            customers.write: Update customer profiles
            shops.read: View shop configuration
            shops.write: Update shop configuration
            hub.read: View content (posts, pages)
            hub.write: Create and update content
            store.read: View themes and assets
            store.write: Manage themes and assets
            sellers.read: View seller information
            batches.read: View batch job status
            batches.write: Create and run batch jobs