Webhook endpoints
Hear when a check finishes.
The LoupeWebhook object
Attributes
idrequired Type:stringurlrequired Type:stringeventsrequired Type:string[]created_atrequired Type:string
The LoupeWebhookEvent object
What your endpoint receives. type says which event it is, and data has the check: status_url is the check to fetch for the whole result.
List Loupe's webhook endpoints
GET /loupe/webhooks
Needs loupe:settings:manage: Loupe settings: webhooks
Loupe's endpoints only.
Returns
200Type:LoupeWebhookListThe endpoints400Type:Probleminvalid_request,invalid_version,idempotency_key_requiredorinvalid_signature401Type:Problemunauthorized403Type:Problempermission_denied,org_suspended, oraddress_not_allowed(your organisation only accepts requests from the addresses it has listed)404Type:Problemnot_found421Type:Problemwrong_region429Type:Problemrate_limitedorquota_exceededdefaultType:Probleminternal
curl "https://api.unforged.sh/loupe/webhooks" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" import requests
r = requests.get(
"https://api.unforged.sh/loupe/webhooks",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/loupe/webhooks', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14' },
});
console.log(await res.json()); Create a Loupe webhook endpoint
POST /loupe/webhooks
Needs loupe:settings:manage: Loupe settings: webhooks
Like POST /nib/webhooks (the same signing, retries, delivery log and connection test), for Loupe's events: loupe.check.completed and loupe.check.failed. The secret is shown once. No Idempotency-Key: a retry creates another endpoint.
Request body
urlrequired Type:stringeventsrequired Type:"loupe.check.completed""loupe.check.failed"[]
Returns
201Type:LoupeWebhookCreatedCreated400Type:Probleminvalid_request,invalid_version,idempotency_key_requiredorinvalid_signature401Type:Problemunauthorized403Type:Problempermission_denied,org_suspended, oraddress_not_allowed(your organisation only accepts requests from the addresses it has listed)404Type:Problemnot_found409Type:Problemconflict,idempotency_conflict,idempotency_in_progressoridempotency_not_replayable421Type:Problemwrong_region429Type:Problemrate_limitedorquota_exceededdefaultType:Probleminternal
curl -X POST "https://api.unforged.sh/loupe/webhooks" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" \
-H "Content-Type: application/json" \
-d '{}' import requests
r = requests.post(
"https://api.unforged.sh/loupe/webhooks",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
json={},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/loupe/webhooks', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14', 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});
console.log(await res.json()); Delete a Loupe webhook endpoint
DELETE /loupe/webhooks/{webhook_id}
Needs loupe:settings:manage: Loupe settings: webhooks
404 for an unknown endpoint and for another product's.
Parameters
webhook_idpathrequired Type:stringThe endpoint's id.
Returns
204Deleted400Type:Probleminvalid_request,invalid_version,idempotency_key_requiredorinvalid_signature401Type:Problemunauthorized403Type:Problempermission_denied,org_suspended, oraddress_not_allowed(your organisation only accepts requests from the addresses it has listed)404Type:Problemnot_found421Type:Problemwrong_region429Type:Problemrate_limitedorquota_exceededdefaultType:Probleminternal
curl -X DELETE "https://api.unforged.sh/loupe/webhooks/{webhook_id}" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" import requests
r = requests.delete(
"https://api.unforged.sh/loupe/webhooks/{webhook_id}",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/loupe/webhooks/{webhook_id}', {
method: 'DELETE',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14' },
});
console.log(await res.json());