Webhooks
Subscribe to changes rather than polling for them. A webhook costs nothing against your request quota, which makes it much cheaper than re-reading a market on a timer.
/v1/api/webhookswebhooks:manageList webhooks
Every endpoint your organisation has registered.
The signing secret is never included. It is shown once when the endpoint is created, and an endpoint list that returned it would hand it to everyone who can read this call.
Response
{
"data": [
{
"id": "whk_1b7e6c19a139404cb173d23fcb3331c4",
"url": "https://example.com/hooks/skautik",
"events": ["property.created", "property.withdrawn"],
"active": true,
"created_at": "2026-08-13T10:43:37Z",
"updated_at": "2026-08-13T10:43:37Z"
}
]
}https://api.skautik.com/v1/api/webhooks
GET /v1/api/webhooks HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/webhooks/eventswebhooks:manageList available events
The events an endpoint may subscribe to, with what each means.
Served from the same list the API validates against, so it cannot fall behind what is actually deliverable.
Response
{
"data": [
{
"name": "property.created",
"description": "A property was added to your organisation."
}
]
}https://api.skautik.com/v1/api/webhooks/events
GET /v1/api/webhooks/events HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/webhookswebhooks:manageCreate a webhook
Register an HTTPS endpoint for a set of events.
The response includes a signing secret, shown once. Store it immediately: every delivery is signed with it, and a handler that does not verify the signature will accept forged calls from anyone who learns the URL.
Body fields
| Name | Type | Description |
|---|---|---|
urlrequired | string | HTTPS endpoint. Plain HTTP is rejected. example: https://example.com/hooks/skautik |
eventsrequired | array | Event names to subscribe to. Every name must be one of the events listed above; an unrecognised one is refused rather than silently never firing. example: ["property.created", "inquiry.created"] |
Request body
{
"url": "https://example.com/hooks/skautik",
"events": ["property.created", "property.withdrawn"]
}Response
{
"data": {
"webhook": {
"id": "whk_1b7e6c19a139404cb173d23fcb3331c4",
"url": "https://example.com/hooks/skautik",
"events": ["property.created", "property.withdrawn"],
"active": true,
"created_at": "2026-08-13T10:43:37Z",
"updated_at": "2026-08-13T10:43:37Z"
},
"secret": "whsec_uEw7ugUA3saVyNo087Sg3XvhBnWI0txICtik-ySKD2k"
}
}Notable responses
- 201
- Created. signing_secret appears in this response only.
- 422
- URL is not HTTPS, unreachable, or an event name is unknown.
https://api.skautik.com/v1/api/webhooks
POST /v1/api/webhooks HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"url": "https://example.com/hooks/skautik",
"events": ["property.created", "property.withdrawn"]
}/v1/api/webhooks/{webhook_id}webhooks:manageRetrieve a webhook
One endpoint with its recent delivery health.
Path parameters
| Name | Type | Description |
|---|---|---|
webhook_idrequired | string | Webhook identifier. example: whk_1b7e6c19a139404cb173d23fcb3331c4 |
https://api.skautik.com/v1/api/webhooks/{webhook_id}
GET /v1/api/webhooks/whk_1b7e6c19a139404cb173d23fcb3331c4 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/webhooks/{webhook_id}webhooks:manageUpdate a webhook
Change the URL, the events, or whether it is active.
A partial update: anything you omit is left alone. Setting active to false stops deliveries without losing the registration, which is what to reach for while you are fixing a handler.
Path parameters
| Name | Type | Description |
|---|---|---|
webhook_idrequired | string | Webhook identifier. example: whk_1b7e6c19a139404cb173d23fcb3331c4 |
Body fields
| Name | Type | Description |
|---|---|---|
url | string | New HTTPS endpoint. example: https://example.com/hooks/skautik |
events | array | Replaces the whole subscription list rather than adding to it. example: ["property.created", "property.withdrawn"] |
active | boolean | False pauses deliveries; the registration and its secret survive. example: true |
Request body
{ "active": false }https://api.skautik.com/v1/api/webhooks/{webhook_id}
PATCH /v1/api/webhooks/whk_1b7e6c19a139404cb173d23fcb3331c4 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{ "active": false }/v1/api/webhooks/{webhook_id}/rotate-secretwebhooks:manageRotate the signing secret
Issue a new secret and stop the old one immediately.
What to reach for if a secret leaks. The previous secret stops working the moment this returns, so deliveries signed with it will fail verification: deploy the new one before rotating, or accept a gap.
Path parameters
| Name | Type | Description |
|---|---|---|
webhook_idrequired | string | Webhook identifier. example: whk_1b7e6c19a139404cb173d23fcb3331c4 |
Response
{
"data": {
"secret": "whsec_4_j7SxmfWXaoJnLbkypLXAw-Pjs8J74_OyWb-oj7fik",
"note": "The previous secret stopped working immediately."
}
}https://api.skautik.com/v1/api/webhooks/{webhook_id}/rotate-secret
POST /v1/api/webhooks/whk_1b7e6c19a139404cb173d23fcb3331c4/rotate-secret HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/webhooks/{webhook_id}webhooks:manageDelete a webhook
Stop deliveries and forget the endpoint.
Path parameters
| Name | Type | Description |
|---|---|---|
webhook_idrequired | string | Webhook identifier. example: whk_1b7e6c19a139404cb173d23fcb3331c4 |
https://api.skautik.com/v1/api/webhooks/{webhook_id}
DELETE /v1/api/webhooks/whk_1b7e6c19a139404cb173d23fcb3331c4 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/webhooks/{webhook_id}/testwebhooks:manageSend a test delivery
Fire a synthetic event to prove your handler works.
Sends a webhook.test event with the same signing and retry behaviour as a real delivery, so you can verify signature checking before anything real depends on it.
Path parameters
| Name | Type | Description |
|---|---|---|
webhook_idrequired | string | Webhook identifier. example: whk_1b7e6c19a139404cb173d23fcb3331c4 |
https://api.skautik.com/v1/api/webhooks/{webhook_id}/test
POST /v1/api/webhooks/whk_1b7e6c19a139404cb173d23fcb3331c4/test HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/webhooks/{webhook_id}/deliverieswebhooks:manageList deliveries
Recent attempts, their response codes, and retry state.
Retained for 30 days. The place to look when a handler silently stopped working.
Path parameters
| Name | Type | Description |
|---|---|---|
webhook_idrequired | string | Webhook identifier. example: whk_1b7e6c19a139404cb173d23fcb3331c4 |
Query parameters
| Name | Type | Description |
|---|---|---|
status | enum | Filter by outcome. succeeded | failed | pending example: succeeded |
limit | integer | How many attempts to return, newest first. Capped at 100. example: 100 |
https://api.skautik.com/v1/api/webhooks/{webhook_id}/deliveries
GET /v1/api/webhooks/whk_1b7e6c19a139404cb173d23fcb3331c4/deliveries?status=succeeded&limit=100 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…