API / API reference
Webhooks
Registering endpoints for events.
data. Paginated collections add
links and meta.
Errors are never wrapped; see Errors.
/api/v1/webhooks
Scope
webhooks:write
List the webhooks this app registered
Only the endpoints YOUR app registered for this designer. Ones belonging to other apps are never visible.
Each entry reports is_active, last_delivered_at, last_status and consecutive_failures, which is enough to show an integration-health panel, or to notice that an endpoint was switched off after repeated failures and needs registering again.
curl "https://dustinsdesignerden.com/api/v1/webhooks" \
-H "Authorization: Bearer $DDD_TOKEN"
const res = await fetch('https://dustinsdesignerden.com/api/v1/webhooks', {
method: 'GET',
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();
$response = Http::withToken($token)->get('https://dustinsdesignerden.com/api/v1/webhooks');
$data = $response->json();
res = requests.get(
'https://dustinsdesignerden.com/api/v1/webhooks',
headers={'Authorization': f'Bearer {token}'},
)
data = res.json()
{
"data": [
{
"id": 1,
"url": "https://yourtool.example.com/hooks/ddd",
"events": [
"components.changed"
],
"is_active": true,
"last_delivered_at": null,
"last_status": null,
"consecutive_failures": 0,
"created_at": "2026-08-01T16:20:39+00:00"
}
]
}
Response: Webhook
-
idinteger - Webhook id, used to delete it.
-
urlstring - Where deliveries are POSTed.
-
eventsarray - Events this endpoint receives.
-
is_activeboolean - Set to false automatically after repeated delivery failures.
-
last_delivered_atstring|null - When a delivery last succeeded.
-
last_statusinteger|null - HTTP status your endpoint last returned.
-
consecutive_failuresinteger - Resets to zero on any success.
-
created_atstring - ISO 8601 timestamp.
-
secretstring - Signing secret. Returned ONLY when the webhook is created, and never again.
/api/v1/webhooks
Scope
webhooks:write
Register a webhook
Returns secret exactly once. Store it, you cannot read it back. Sign checks use X-DDD-Signature: sha256=HMAC_SHA256("{timestamp}.{body}", secret) with the timestamp from X-DDD-Timestamp.
Events: components.changed, project.updated. Public http(s) URLs only. Max 10 per app per account.
curl -X POST "https://dustinsdesignerden.com/api/v1/webhooks" \
-H "Authorization: Bearer $DDD_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://yourtool.example.com/hooks/ddd",
"events": [
"components.changed"
]
}'
const res = await fetch('https://dustinsdesignerden.com/api/v1/webhooks', {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://yourtool.example.com/hooks/ddd",
"events": [
"components.changed"
]
}),
});
const data = await res.json();
$response = Http::withToken($token)->post('https://dustinsdesignerden.com/api/v1/webhooks', [
'url' => 'https://yourtool.example.com/hooks/ddd',
'events' => [
'components.changed',
],
]);
$data = $response->json();
res = requests.post(
'https://dustinsdesignerden.com/api/v1/webhooks',
headers={'Authorization': f'Bearer {token}'},
json={
'url': 'https://yourtool.example.com/hooks/ddd',
'events': [
'components.changed'
]
},
)
data = res.json()
{
"id": 1,
"url": "https://yourtool.example.com/hooks/ddd",
"events": [
"components.changed"
],
"is_active": true,
"last_delivered_at": null,
"last_status": null,
"consecutive_failures": 0,
"created_at": "2026-08-01T16:20:39+00:00",
"secret": "whsec_epwMrVcFIU1NYOpQn5WkGd5DqWHHkGwcHMEBWi2H"
}
Body parameters
-
urlurl required - Public https endpoint to POST to. Same address rules as asset fetching.
-
eventsarray required - Which events to receive. See the event list under Webhooks.
Response: Webhook
-
idinteger - Webhook id, used to delete it.
-
urlstring - Where deliveries are POSTed.
-
eventsarray - Events this endpoint receives.
-
is_activeboolean - Set to false automatically after repeated delivery failures.
-
last_delivered_atstring|null - When a delivery last succeeded.
-
last_statusinteger|null - HTTP status your endpoint last returned.
-
consecutive_failuresinteger - Resets to zero on any success.
-
created_atstring - ISO 8601 timestamp.
-
secretstring - Signing secret. Returned ONLY when the webhook is created, and never again.
/api/v1/webhooks/{webhook}
Scope
webhooks:write
Delete a webhook
Stops deliveries and removes the registration. Anything still queued is dropped too, because every delivery re-checks that its webhook exists before sending.
There is no way to edit a webhook. To change its URL or its events, delete it and register again, which also issues a fresh secret.
curl -X DELETE "https://dustinsdesignerden.com/api/v1/webhooks/1" \
-H "Authorization: Bearer $DDD_TOKEN"
const res = await fetch('https://dustinsdesignerden.com/api/v1/webhooks/1', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();
$response = Http::withToken($token)->delete('https://dustinsdesignerden.com/api/v1/webhooks/1');
$data = $response->json();
res = requests.delete(
'https://dustinsdesignerden.com/api/v1/webhooks/1',
headers={'Authorization': f'Bearer {token}'},
)
data = res.json()
{
"deleted": true
}
Parameters
-
webhookinteger · path required - Webhook id.
Response: Deletion result
-
deletedboolean|integer truefor a single delete, or the number removed for a bulk one.-
components_retainedboolean - Only on a group delete. Confirms removing the deck or stack left its components in the project.