Hookdeck Publish API

Use the Publish endpoint to send events into Outpost. Events are matched against all destinations whose topic subscriptions and filters match the event. Requires Admin API Key.

Operations 1

POST /publish Publish Event #

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/hookdeck:hookdeck-publish-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

hookdeck-publish-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Outpost Publish API
  version: 0.0.1
  description: 'The Outpost API is a REST-based JSON API for managing tenants, destinations, and publishing events.


    Outpost runs in two deployment models: **managed** (hosted by Hookdeck) and **self-hosted**. They differ in where the API is served and in which API key authenticates server-side calls. On managed Outpost, use a Hookdeck project API key from your Outpost project. On self-hosted Outpost, use the key set in the `API_KEY` environment variable. A few endpoints exist in one model only and say so in their description.'
  contact:
    name: Outpost Support
    email: support@hookdeck.com
    url: https://hookdeck.com/docs/outpost
servers:
- url: https://api.outpost.hookdeck.com/2025-07-01
  description: Managed Outpost, hosted by Hookdeck at `api.outpost.hookdeck.com`. The Hookdeck Event Gateway API at `api.hookdeck.com` is a separate API.
- url: http://localhost:3333/api/v1
  description: Self-hosted Outpost, at its default local address. A deployed instance serves the same paths under its own host.
security:
- AdminApiKey: []
- TenantJwt: []
tags:
- name: Publish
  description: Use the Publish endpoint to send events into Outpost. Events are matched against all destinations whose topic subscriptions and filters match the event. Requires Admin API Key.
paths:
  /publish:
    post:
      tags:
      - Publish
      summary: Publish Event
      description: Publishes an event to the specified topic, potentially routed to a specific destination. Requires Admin API Key.
      operationId: publishEvent
      security:
      - AdminApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublishRequest'
            example:
              id: evt_abc123xyz789
              tenant_id: tenant_123
              topic: user.created
              eligible_for_retry: true
              metadata:
                source: crm
              data:
                user_id: userid
                status: active
      responses:
        '202':
          description: Event accepted for publishing. Returns the event ID.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublishResponse'
              example:
                id: evt_abc123xyz789
                duplicate: false
                destination_ids:
                - des_webhook_123
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '409':
          description: Conflict. Another request with the same event `id` is in progress or has just failed. Retry the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse'
        '422':
          description: The event topic was either required or was invalid.
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    APIErrorResponse:
      type: object
      description: Standard error response format.
      properties:
        status:
          type: integer
          description: HTTP status code.
          example: 422
        message:
          type: string
          description: Human-readable error message.
          example: validation error
        data:
          description: Additional error details. For validation errors, this is an array of human-readable messages.
          oneOf:
          - type: array
            items:
              type: string
            description: Array of validation error messages.
            example:
            - email is required
            - password must be at least 6 characters
          - type: object
            additionalProperties: true
            description: Additional contextual data about the error.
    PublishResponse:
      type: object
      required:
      - id
      - duplicate
      - destination_ids
      properties:
        id:
          type: string
          description: The ID of the event that was accepted for publishing. This will be the ID provided in the request's `id` field if present, otherwise it's a server-generated ID.
          example: evt_abc123xyz789
        duplicate:
          type: boolean
          description: Whether this event was already processed (idempotency hit). If true, the event was not queued again.
          example: false
        destination_ids:
          type: array
          items:
            type: string
          description: The IDs of destinations that matched this event. Empty array if no destinations matched.
          example:
          - des_456
          - des_789
    PublishRequest:
      type: object
      required:
      - data
      properties:
        id:
          type: string
          description: Optional. A unique identifier for the event. If not provided, a ID will be generated.
          example: evt_custom_123
        tenant_id:
          type: string
          description: The ID of the tenant to publish for.
          example: <TENANT_ID>
        destination_id:
          type: string
          description: Optional. Route event to a specific destination.
          example: <DESTINATION_ID>
        topic:
          type: string
          description: Topic name for the event. Required if Outpost has been configured with topics.
          example: topic.name
        eligible_for_retry:
          type: boolean
          description: Should event delivery be retried on failure.
        time:
          type: string
          format: date-time
          description: Optional. Custom timestamp for the event. If not provided, defaults to the current time.
          example: '2024-01-15T10:30:00Z'
        metadata:
          type: object
          description: Any key-value string pairs for metadata.
          additionalProperties:
            type: string
          example:
            source: crm
        data:
          type: object
          description: Any JSON payload for the event data.
          additionalProperties: true
          example:
            user_id: userid
            status: active
  responses:
    InternalServerError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/APIErrorResponse'
    Unauthorized:
      description: Missing or invalid authentication credentials.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/APIErrorResponse'
    Forbidden:
      description: The credentials are valid but not allowed to perform the request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/APIErrorResponse'
  securitySchemes:
    AdminApiKey:
      type: http
      scheme: bearer
      description: "Bearer token for server-side calls. Where it comes from depends on the\ndeployment:\n\n- **Managed:** a Hookdeck **project API key belonging to your\n  Outpost project** (Hookdeck Dashboard → your Outpost project →\n  Settings → Secrets). A key from a different Hookdeck project\n  authenticates but returns `404` on most Outpost routes.\n- **Self-hosted:** the admin API key set in the `API_KEY` environment\n  variable.\n\nThe scheme is named for the self-hosted credential. Managed Outpost has\nno separate admin key to create. The project API key takes its place.\n"
    TenantJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: "Per-tenant JWT token valid for 24 hours.\n\n**JWT Structure:**\nThe token is a standard JWT signed with HS256 algorithm containing the following claims:\n- `iss` (issuer): Always \"outpost\"\n- `sub` (subject): The tenant_id this token is scoped to\n- `iat` (issued at): Unix timestamp when the token was created\n- `exp` (expiration): Unix timestamp when the token expires (24 hours after issuance)\n\n**Example decoded payload:**\n```json\n{\n  \"iss\": \"outpost\",\n  \"sub\": \"tenant_123\",\n  \"iat\": 1704067200,\n  \"exp\": 1704153600\n}\n```\n"
x-provenance:
  method: harvested
  publisher: Hookdeck
  source: https://raw.githubusercontent.com/hookdeck/outpost/main/docs/apis/openapi.yaml
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)