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