Webhook endpoints
Hear when a package is sent, viewed, signed, declined, voided or expires.
The SigWebhook object
Attributes
idrequired Type:stringurlrequired Type:stringeventsrequired Type:string[]created_atrequired Type:string
List Sig's webhook endpoints
GET /sig/webhooks
Needs sig:settings:manage: Sig settings: Folio filing and Nib checks
Sig's endpoints only.
Returns
200Type:SigWebhookListThe 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/sig/webhooks" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" import requests
r = requests.get(
"https://api.unforged.sh/sig/webhooks",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/sig/webhooks', {
method: 'GET',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14' },
});
console.log(await res.json()); Create a Sig webhook endpoint
POST /sig/webhooks
Needs sig:settings:manage: Sig settings: Folio filing and Nib checks
Like POST /nib/webhooks (the same signing, retries, delivery log and connection test), for Sig's events: sig.package.sent, sig.signer.viewed, sig.signer.signed, sig.package.completed, sig.package.declined, sig.package.voided, sig.package.expired. Each event carries the package_id; one about a signer carries their signer_id too, and sig.signer.signed and sig.package.declined say what they did in outcome (signed, approved or declined), the same as a package's return link. The secret is shown once. No Idempotency-Key: a retry creates another endpoint.
Request body
urlrequired Type:stringeventsrequired Type:"sig.package.sent""sig.signer.viewed""sig.signer.signed""sig.package.completed""sig.package.declined""sig.package.voided""sig.package.expired"[]
Returns
201Type:SigWebhookCreatedCreated400Type: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/sig/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/sig/webhooks",
headers={"Authorization": f"Bearer {UNFORGED_KEY}", "Unforged-Version": "2026-10-14"},
json={},
)
print(r.json()) const res = await fetch('https://api.unforged.sh/sig/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 Sig webhook endpoint
DELETE /sig/webhooks/{webhook_id}
Needs sig:settings:manage: Sig settings: Folio filing and Nib checks
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/sig/webhooks/{webhook_id}" \
-H "Authorization: Bearer $UNFORGED_KEY" \
-H "Unforged-Version: 2026-10-14" import requests
r = requests.delete(
"https://api.unforged.sh/sig/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/sig/webhooks/{webhook_id}', {
method: 'DELETE',
headers: { Authorization: `Bearer ${process.env.UNFORGED_KEY}`, 'Unforged-Version': '2026-10-14' },
});
console.log(await res.json());