Manage Webhooks

Create, list, update, and delete webhook subscriptions via the API. Each subscription listens for specific event types and delivers payloads to your URL.

Create a Webhook

Subscribe to one or more event types. The response includes your signing secret — store it securely.

curl -X POST https://api.repull.dev/v1/webhooks \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.com/webhooks/repull",
    "events": ["reservation.created", "reservation.updated", "message.received"],
    "description": "Production webhook"
  }'
{
  "id": "wh_abc123",
  "url": "https://your-app.com/webhooks/repull",
  "events": ["reservation.created", "reservation.updated", "message.received"],
  "description": "Production webhook",
  "signing_secret": "whsec_k7d9f2...",
  "active": true,
  "created_at": "2025-06-15T10:00:00Z"
}

Save your signing secret

The signing_secret is only returned once at creation time. Store it in your environment variables immediately. If you lose it, delete the webhook and create a new one.

List Webhooks

Retrieve all webhook subscriptions for your workspace:

curl https://api.repull.dev/v1/webhooks \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
{
  "data": [
    {
      "id": "wh_abc123",
      "url": "https://your-app.com/webhooks/repull",
      "events": ["reservation.created", "reservation.updated", "message.received"],
      "active": true,
      "created_at": "2025-06-15T10:00:00Z"
    }
  ]
}

Update a Webhook

Update the URL, events, or active status of an existing subscription:

curl -X PATCH https://api.repull.dev/v1/webhooks/wh_abc123 \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "events": ["reservation.created", "reservation.updated", "reservation.cancelled", "message.received"],
    "active": true
  }'

Delete a Webhook

Permanently remove a webhook subscription. Pending deliveries will be cancelled.

curl -X DELETE https://api.repull.dev/v1/webhooks/wh_abc123 \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Test a Webhook

Send a test event to verify your endpoint is working. The event type is a path segment, not a body field, and the delivery carries a realistic fixture payload of that type:

curl -X POST https://api.repull.dev/v1/webhooks/wh_abc123/test/reservation.created \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

The full delivery cycle comes back inline, so you can see how your endpoint answered without opening the deliveries list:

{
  "deliveryId": "cc09d6db-b38c-4c11-9b72-b18488bd9c1a",
  "eventId": "fc938305-6022-4af7-a040-fe789f2087a5",
  "eventType": "reservation.created",
  "success": true,
  "statusCode": 200,
  "responseTimeMs": 142,
  "payload": { "object": { "id": 900001, "uid": "HMEXAMPLE1", "channel": "airbnb" } },
  "signatureHeader": "t=1789140462,v1=b45fae136ce808a912ecd2f7d775b56796030943bc601e6b47ff9cc06e3c1f67"
}

A delivery your endpoint rejected still returns 200 from this call — the attempt is reported in success, statusCode and errorMessage rather than raised as an error.

Ping a Webhook

To check only that your endpoint is reachable, ping it. This fires a synthetic repull.ping with no fixture payload — the right probe for a health check or an uptime dashboard:

curl -X POST https://api.repull.dev/v1/webhooks/wh_abc123/ping \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Test before going live

Always send a test delivery after creating a webhook to verify your endpoint handles the payload correctly and returns a 200 status within 5 seconds.
AI