Docs
Webhooks
POST
/webhooks

Up to 10 per organization. The signing secret is returned once, in this response.

Requires webhooks:write and a key with access to all profiles.

Authorization

bearerAuth
AuthorizationBearer <token>

API key starting with fh_

In: header

Header Parameters

Idempotency-Key?string

Any unique string up to 255 characters. A retry with the same key within 24 hours returns the first response instead of running again.

Lengthlength <= 255

Request Body

application/json

url*string
Formaturi
Lengthlength <= 2048
events*array<>
Items1 <= items
name?string
Lengthlength <= 50
secret?string

Your own signing secret. Generated when left out

Length16 <= length <= 256
isActive?boolean
customHeaders?

Extra headers sent with every delivery, e.g. for your own auth

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://feedhorizon.com/api/v1/webhooks" \  -H "Content-Type: application/json" \  -d '{    "url": "http://example.com",    "events": [      "post.scheduled"    ]  }'
{
  "data": {
    "id": "wh_0195f0a27b3c7d4e8f5a1b2c3d4e5f60",
    "name": "My server",
    "url": "https://example.com/webhooks/feedhorizon",
    "events": [
      "post.published",
      "post.failed"
    ],
    "isActive": true,
    "failCount": 0,
    "lastFiredAt": "2026-11-10T08:00:00.000Z",
    "customHeaders": {
      "property1": "string",
      "property2": "string"
    },
    "createdAt": "2026-11-10T08:00:00.000Z",
    "updatedAt": "2026-11-10T08:00:00.000Z",
    "secret": "string"
  }
}
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_json",
    "message": "The body is not valid JSON",
    "docUrl": "https://feedhorizon.com/docs/api/errors#invalid_request_error",
    "requestId": "req_m2x81a0kfd3h9s"
  }
}
{
  "error": {
    "type": "authentication_error",
    "code": "missing_api_key",
    "message": "No Authorization: Bearer header",
    "docUrl": "https://feedhorizon.com/docs/api/errors#authentication_error",
    "requestId": "req_m2x81a0kfd3h9s"
  }
}
{
  "error": {
    "type": "permission_error",
    "code": "insufficient_scope",
    "message": "The key lacks the scope for this endpoint",
    "docUrl": "https://feedhorizon.com/docs/api/errors#permission_error",
    "requestId": "req_m2x81a0kfd3h9s"
  }
}
{
  "error": {
    "type": "conflict_error",
    "code": "webhook_limit_reached",
    "message": "The organization already has 10 webhooks",
    "docUrl": "https://feedhorizon.com/docs/api/errors#conflict_error",
    "requestId": "req_m2x81a0kfd3h9s"
  }
}
{
  "error": {
    "type": "idempotency_error",
    "code": "idempotency_key_reused",
    "message": "The key was used for a different request. Use a new key",
    "docUrl": "https://feedhorizon.com/docs/api/errors#idempotency_error",
    "requestId": "req_m2x81a0kfd3h9s"
  }
}
{
  "error": {
    "type": "rate_limit_error",
    "code": "rate_limited",
    "message": "Too many requests. Wait the seconds in Retry-After",
    "docUrl": "https://feedhorizon.com/docs/api/errors#rate_limit_error",
    "requestId": "req_m2x81a0kfd3h9s"
  }
}
{
  "error": {
    "type": "api_error",
    "code": "internal_error",
    "message": "Something failed on our side. Retry with backoff, using the same Idempotency-Key for writes",
    "docUrl": "https://feedhorizon.com/docs/api/errors#api_error",
    "requestId": "req_m2x81a0kfd3h9s"
  }
}