Webhooks
/api/v1/event-typesCatalogue of all webhook events with the read scope a receiver needs.
Any valid API key or OAuth token.
Response 200
object"list"requireddataArray<EventType>requiredtypeenumrequiredValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.testdescriptionstringrequiredscopestringrequiredRequired read scope
curl 'https://www.debt-flow.io/api/v1/event-types' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"object": "list",
"data": [
{
"type": "contact.created",
"description": "string",
"scope": "string"
}
]
}/api/v1/eventsAll events of the account, newest first – the same payloads as for webhooks. Suitable for polling triggers (Zapier, Make, n8n). Events for which the key has no read scope are omitted. Retention: processed events 30 days (events not yet delivered longer).
Permission: webhooks:read
Query parameters
typeenumValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.testlimitintegerNumber of entries (1–100)1–100 · Default: 25cursorstring`nextCursor` of the previous pagemax. 500 characters
Response 200
object"list"requireddataArray<Event>requiredidstringrequiredobject"event"requiredtypeenumrequiredValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.testapiVersionstringrequiredcreatedAtstring (date-time)requireddataobjectrequiredobjectobjectrequiredResource in REST API v1 formatpreviousobjectPrevious values of changed fields (only for *.updated)
hasMorebooleanrequirednextCursorstring | nullrequired
curl 'https://www.debt-flow.io/api/v1/events' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"object": "list",
"data": [
{
"id": "evt_3kR9xY2mQ7pL0aB4cD1e",
"object": "event",
"type": "contact.created",
"apiVersion": "string",
"createdAt": "2026-11-01T09:30:00.000Z",
"data": {
"object": {},
"previous": {}
}
}
],
"hasMore": false,
"nextCursor": "string"
}/api/v1/events/{id}Permission: webhooks:read
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 200 · Event
idstringrequiredobject"event"requiredtypeenumrequiredValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.testapiVersionstringrequiredcreatedAtstring (date-time)requireddataobjectrequiredobjectobjectrequiredResource in REST API v1 formatpreviousobjectPrevious values of changed fields (only for *.updated)
curl 'https://www.debt-flow.io/api/v1/events/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"id": "evt_3kR9xY2mQ7pL0aB4cD1e",
"object": "event",
"type": "contact.created",
"apiVersion": "string",
"createdAt": "2026-11-01T09:30:00.000Z",
"data": {
"object": {},
"previous": {}
}
}/api/v1/webhook-deliveriesDeliveries from the last 30 days, newest first; with response status and attempts.
Permission: webhooks:read
Query parameters
endpointIdstringmax. 128 characterslimitintegerNumber of entries (1–100)1–100 · Default: 25cursorstring`nextCursor` of the previous pagemax. 500 characters
Response 200
object"list"requireddataArray<WebhookDelivery>requiredidstringrequiredobject"webhook_delivery"requiredendpointIdstringrequiredeventIdstringrequiredeventTypeenumrequiredValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.teststatus"pending" | "succeeded" | "failed"requiredtestbooleanrequiredattemptsintegerrequired-9007199254740991–9007199254740991nextAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991responseBodystring | nullrequiredStart of the response (max. 200 characters; values of sensitive headers and tokens removed)errorstring | nullrequireddurationMsinteger | nullrequired-9007199254740991–9007199254740991attemptLogArray<object>requiredRecent attemptsatstring (date-time)requiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991errorstring | nullrequireddurationMsintegerrequired-9007199254740991–9007199254740991
createdAtstring (date-time)requiredTimestamp (ISO 8601)
hasMorebooleanrequirednextCursorstring | nullrequired
curl 'https://www.debt-flow.io/api/v1/webhook-deliveries' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"object": "list",
"data": [
{
"id": "string",
"object": "webhook_delivery",
"endpointId": "string",
"eventId": "string",
"eventType": "contact.created",
"status": "pending",
"test": false,
"attempts": 0,
"nextAttemptAt": "2026-11-01T09:30:00.000Z",
"lastAttemptAt": "2026-11-01T09:30:00.000Z",
"responseStatus": 0,
"responseBody": "string",
"error": "string",
"durationMs": 0,
"attemptLog": [
{
"at": "2026-11-01T09:30:00.000Z",
"responseStatus": null,
"error": "string",
"durationMs": 0
}
],
"createdAt": "2026-11-01T09:30:00.000Z"
}
],
"hasMore": false,
"nextCursor": "string"
}/api/v1/webhook-deliveries/{id}Permission: webhooks:read
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 200 · WebhookDelivery
idstringrequiredobject"webhook_delivery"requiredendpointIdstringrequiredeventIdstringrequiredeventTypeenumrequiredValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.teststatus"pending" | "succeeded" | "failed"requiredtestbooleanrequiredattemptsintegerrequired-9007199254740991–9007199254740991nextAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991responseBodystring | nullrequiredStart of the response (max. 200 characters; values of sensitive headers and tokens removed)errorstring | nullrequireddurationMsinteger | nullrequired-9007199254740991–9007199254740991attemptLogArray<object>requiredRecent attemptsatstring (date-time)requiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991errorstring | nullrequireddurationMsintegerrequired-9007199254740991–9007199254740991
createdAtstring (date-time)requiredTimestamp (ISO 8601)
curl 'https://www.debt-flow.io/api/v1/webhook-deliveries/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"id": "string",
"object": "webhook_delivery",
"endpointId": "string",
"eventId": "string",
"eventType": "contact.created",
"status": "pending",
"test": false,
"attempts": 0,
"nextAttemptAt": "2026-11-01T09:30:00.000Z",
"lastAttemptAt": "2026-11-01T09:30:00.000Z",
"responseStatus": 0,
"responseBody": "string",
"error": "string",
"durationMs": 0,
"attemptLog": [
{
"at": "2026-11-01T09:30:00.000Z",
"responseStatus": 0,
"error": "string",
"durationMs": 0
}
],
"createdAt": "2026-11-01T09:30:00.000Z"
}/api/v1/webhook-deliveries/{id}/retryRetries the delivery immediately – even after it has finally failed.
Permission: webhooks:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 200 · WebhookDelivery
idstringrequiredobject"webhook_delivery"requiredendpointIdstringrequiredeventIdstringrequiredeventTypeenumrequiredValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.teststatus"pending" | "succeeded" | "failed"requiredtestbooleanrequiredattemptsintegerrequired-9007199254740991–9007199254740991nextAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991responseBodystring | nullrequiredStart of the response (max. 200 characters; values of sensitive headers and tokens removed)errorstring | nullrequireddurationMsinteger | nullrequired-9007199254740991–9007199254740991attemptLogArray<object>requiredRecent attemptsatstring (date-time)requiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991errorstring | nullrequireddurationMsintegerrequired-9007199254740991–9007199254740991
createdAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X POST 'https://www.debt-flow.io/api/v1/webhook-deliveries/ID/retry' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"id": "string",
"object": "webhook_delivery",
"endpointId": "string",
"eventId": "string",
"eventType": "contact.created",
"status": "pending",
"test": false,
"attempts": 0,
"nextAttemptAt": "2026-11-01T09:30:00.000Z",
"lastAttemptAt": "2026-11-01T09:30:00.000Z",
"responseStatus": 0,
"responseBody": "string",
"error": "string",
"durationMs": 0,
"attemptLog": [
{
"at": "2026-11-01T09:30:00.000Z",
"responseStatus": 0,
"error": "string",
"durationMs": 0
}
],
"createdAt": "2026-11-01T09:30:00.000Z"
}/api/v1/webhook-endpointsPermission: webhooks:read
Query parameters
limitintegerNumber of entries (1–100)1–100 · Default: 25cursorstring`nextCursor` of the previous pagemax. 500 characters
Response 200
object"list"requireddataArray<WebhookEndpoint>requiredidstringrequiredobject"webhook_endpoint"requiredurlstringrequireddescriptionstringrequiredeventsArray<enum | "*">requiredEvent type or "*" for allpayloadFormat"json" | "text"requiredContent-Type of the delivery: json = application/json (default), text = text/plain with an identical body (for platforms that only provide the raw text for signature verification this way, e.g. Make)activebooleanrequireddisabledReasonstring | nullrequiredReason for automatic deactivationdisabledAtstring (date-time) | nullrequiredTimestamp (ISO 8601)secretHintstringrequiredFirst characters of the signing secretcreatedVia"session" | "api_key" | "oauth"requiredconsecutiveFailuresintegerrequired-9007199254740991–9007199254740991failingSincestring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryStatus"succeeded" | "failed" | nullrequiredcreatedAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
hasMorebooleanrequirednextCursorstring | nullrequired
curl 'https://www.debt-flow.io/api/v1/webhook-endpoints' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"object": "list",
"data": [
{
"id": "string",
"object": "webhook_endpoint",
"url": "string",
"description": "string",
"events": [
"contact.created"
],
"payloadFormat": "json",
"active": false,
"disabledReason": "string",
"disabledAt": "2026-11-01T09:30:00.000Z",
"secretHint": "string",
"createdVia": "session",
"consecutiveFailures": 0,
"failingSince": "2026-11-01T09:30:00.000Z",
"lastDeliveryAt": "2026-11-01T09:30:00.000Z",
"lastDeliveryStatus": "succeeded",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}
],
"hasMore": false,
"nextCursor": "string"
}/api/v1/webhook-endpointsDebtFlow sends subscribed events via POST (JSON Event) to the HTTPS URL. Every request is signed: DebtFlow-Signature: t=<Unix-Zeit>,v1=<HMAC-SHA256(secret, "<t>.<Body>") hex> (also sent identically as X-DebtFlow-Signature). The secret (secret) is only included in this response. Endpoints created with an API key only receive events for which the key has the read scope.
Permission: webhooks:write
Body (JSON) · WebhookEndpointCreate
urlstring (uri)requiredHTTPS address that accepts POST requestsmax. 2048 characterseventsArray<enum | "*">requiredEvent type or "*" for alldescriptionstringmax. 200 characterspayloadFormat"json" | "text"Default jsonactiveboolean
Response 201 · WebhookEndpointCreated
idstringrequiredobject"webhook_endpoint"requiredurlstringrequireddescriptionstringrequiredeventsArray<enum | "*">requiredEvent type or "*" for allpayloadFormat"json" | "text"requiredContent-Type of the delivery: json = application/json (default), text = text/plain with an identical body (for platforms that only provide the raw text for signature verification this way, e.g. Make)activebooleanrequireddisabledReasonstring | nullrequiredReason for automatic deactivationdisabledAtstring (date-time) | nullrequiredTimestamp (ISO 8601)secretHintstringrequiredFirst characters of the signing secretcreatedVia"session" | "api_key" | "oauth"requiredconsecutiveFailuresintegerrequired-9007199254740991–9007199254740991failingSincestring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryStatus"succeeded" | "failed" | nullrequiredcreatedAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)secretstringrequiredSigning secret (whsec_…) – only in this response
curl -X POST 'https://www.debt-flow.io/api/v1/webhook-endpoints' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com",
"events": [
"contact.created"
],
"description": "string",
"payloadFormat": "json",
"active": false
}'{
"id": "string",
"object": "webhook_endpoint",
"url": "string",
"description": "string",
"events": [
"contact.created"
],
"payloadFormat": "json",
"active": false,
"disabledReason": "string",
"disabledAt": "2026-11-01T09:30:00.000Z",
"secretHint": "string",
"createdVia": "session",
"consecutiveFailures": 0,
"failingSince": "2026-11-01T09:30:00.000Z",
"lastDeliveryAt": "2026-11-01T09:30:00.000Z",
"lastDeliveryStatus": "succeeded",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"secret": "string"
}/api/v1/webhook-endpoints/{id}Permission: webhooks:read
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 200 · WebhookEndpoint
idstringrequiredobject"webhook_endpoint"requiredurlstringrequireddescriptionstringrequiredeventsArray<enum | "*">requiredEvent type or "*" for allpayloadFormat"json" | "text"requiredContent-Type of the delivery: json = application/json (default), text = text/plain with an identical body (for platforms that only provide the raw text for signature verification this way, e.g. Make)activebooleanrequireddisabledReasonstring | nullrequiredReason for automatic deactivationdisabledAtstring (date-time) | nullrequiredTimestamp (ISO 8601)secretHintstringrequiredFirst characters of the signing secretcreatedVia"session" | "api_key" | "oauth"requiredconsecutiveFailuresintegerrequired-9007199254740991–9007199254740991failingSincestring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryStatus"succeeded" | "failed" | nullrequiredcreatedAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl 'https://www.debt-flow.io/api/v1/webhook-endpoints/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"id": "string",
"object": "webhook_endpoint",
"url": "string",
"description": "string",
"events": [
"contact.created"
],
"payloadFormat": "json",
"active": false,
"disabledReason": "string",
"disabledAt": "2026-11-01T09:30:00.000Z",
"secretHint": "string",
"createdVia": "session",
"consecutiveFailures": 0,
"failingSince": "2026-11-01T09:30:00.000Z",
"lastDeliveryAt": "2026-11-01T09:30:00.000Z",
"lastDeliveryStatus": "succeeded",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}/api/v1/webhook-endpoints/{id}active: true reactivates an automatically deactivated endpoint and resets the failure counter. An endpoint's target URL can only be changed with all the read permissions it was created with (otherwise 403 insufficient_scope).
Permission: webhooks:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Body (JSON) · WebhookEndpointUpdate
urlstring (uri)HTTPS address that accepts POST requestsmax. 2048 characterseventsArray<enum | "*">Event type or "*" for alldescriptionstringmax. 200 characterspayloadFormat"json" | "text"activebooleantrue reactivates (resets the failure counter)
Response 200 · WebhookEndpoint
idstringrequiredobject"webhook_endpoint"requiredurlstringrequireddescriptionstringrequiredeventsArray<enum | "*">requiredEvent type or "*" for allpayloadFormat"json" | "text"requiredContent-Type of the delivery: json = application/json (default), text = text/plain with an identical body (for platforms that only provide the raw text for signature verification this way, e.g. Make)activebooleanrequireddisabledReasonstring | nullrequiredReason for automatic deactivationdisabledAtstring (date-time) | nullrequiredTimestamp (ISO 8601)secretHintstringrequiredFirst characters of the signing secretcreatedVia"session" | "api_key" | "oauth"requiredconsecutiveFailuresintegerrequired-9007199254740991–9007199254740991failingSincestring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryStatus"succeeded" | "failed" | nullrequiredcreatedAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X PATCH 'https://www.debt-flow.io/api/v1/webhook-endpoints/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com",
"events": [
"contact.created"
],
"description": "string",
"payloadFormat": "json",
"active": false
}'{
"id": "string",
"object": "webhook_endpoint",
"url": "string",
"description": "string",
"events": [
"contact.created"
],
"payloadFormat": "json",
"active": false,
"disabledReason": "string",
"disabledAt": "2026-11-01T09:30:00.000Z",
"secretHint": "string",
"createdVia": "session",
"consecutiveFailures": 0,
"failingSince": "2026-11-01T09:30:00.000Z",
"lastDeliveryAt": "2026-11-01T09:30:00.000Z",
"lastDeliveryStatus": "succeeded",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}/api/v1/webhook-endpoints/{id}Also deletes the endpoint's delivery log.
Permission: webhooks:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 204
Success, no content
curl -X DELETE 'https://www.debt-flow.io/api/v1/webhook-endpoints/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"/api/v1/webhook-endpoints/{id}/rotate-secretThe old secret becomes invalid immediately. The new one is only included in this response. Only with all the read permissions the endpoint was created with (otherwise 403 insufficient_scope).
Permission: webhooks:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 200 · WebhookEndpointCreated
idstringrequiredobject"webhook_endpoint"requiredurlstringrequireddescriptionstringrequiredeventsArray<enum | "*">requiredEvent type or "*" for allpayloadFormat"json" | "text"requiredContent-Type of the delivery: json = application/json (default), text = text/plain with an identical body (for platforms that only provide the raw text for signature verification this way, e.g. Make)activebooleanrequireddisabledReasonstring | nullrequiredReason for automatic deactivationdisabledAtstring (date-time) | nullrequiredTimestamp (ISO 8601)secretHintstringrequiredFirst characters of the signing secretcreatedVia"session" | "api_key" | "oauth"requiredconsecutiveFailuresintegerrequired-9007199254740991–9007199254740991failingSincestring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastDeliveryStatus"succeeded" | "failed" | nullrequiredcreatedAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)secretstringrequiredSigning secret (whsec_…) – only in this response
curl -X POST 'https://www.debt-flow.io/api/v1/webhook-endpoints/ID/rotate-secret' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"id": "string",
"object": "webhook_endpoint",
"url": "string",
"description": "string",
"events": [
"contact.created"
],
"payloadFormat": "json",
"active": false,
"disabledReason": "string",
"disabledAt": "2026-11-01T09:30:00.000Z",
"secretHint": "string",
"createdVia": "session",
"consecutiveFailures": 0,
"failingSince": "2026-11-01T09:30:00.000Z",
"lastDeliveryAt": "2026-11-01T09:30:00.000Z",
"lastDeliveryStatus": "succeeded",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z",
"secret": "string"
}/api/v1/webhook-endpoints/{id}/testImmediately sends a signed webhook.test event to this endpoint and returns the result. No retries; does not count towards automatic deactivation.
Permission: webhooks:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 200 · WebhookDelivery
idstringrequiredobject"webhook_delivery"requiredendpointIdstringrequiredeventIdstringrequiredeventTypeenumrequiredValues: contact.created, contact.updated, contact.deleted, communication.created, debt.created, debt.updated, debt.phase_changed, debt.overdue, debt.paid, debt.deleted, payment.received, payment.deleted, payment.refunded, payment.reversed, installment_plan.created, installment_plan.updated, installment_plan.deleted, installment.due, installment.missed, residence_registry_inquiry.created, recommendation.created, letter.sent, letter.delivered, letter.returned, letter.failed, invoice.created, invoice.updated, invoice.finalized, invoice.sent, invoice.partially_paid, invoice.paid, invoice.overdue, invoice.canceled, invoice.deleted, invoice.handed_to_collection, credit_note.finalized, offer.created, offer.sent, offer.accepted, offer.rejected, offer.expired, offer.converted, receipt.created, receipt.processed, receipt.updated, receipt.booked, receipt.deleted, bank_transaction.imported, bank_transaction.matched, project.created, project.updated, project.archived, project.deleted, time_entry.created, time_entry.updated, time_entry.deleted, export.ready, accounting_period.closed, webhook.teststatus"pending" | "succeeded" | "failed"requiredtestbooleanrequiredattemptsintegerrequired-9007199254740991–9007199254740991nextAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)lastAttemptAtstring (date-time) | nullrequiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991responseBodystring | nullrequiredStart of the response (max. 200 characters; values of sensitive headers and tokens removed)errorstring | nullrequireddurationMsinteger | nullrequired-9007199254740991–9007199254740991attemptLogArray<object>requiredRecent attemptsatstring (date-time)requiredTimestamp (ISO 8601)responseStatusinteger | nullrequired-9007199254740991–9007199254740991errorstring | nullrequireddurationMsintegerrequired-9007199254740991–9007199254740991
createdAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X POST 'https://www.debt-flow.io/api/v1/webhook-endpoints/ID/test' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"id": "string",
"object": "webhook_delivery",
"endpointId": "string",
"eventId": "string",
"eventType": "contact.created",
"status": "pending",
"test": false,
"attempts": 0,
"nextAttemptAt": "2026-11-01T09:30:00.000Z",
"lastAttemptAt": "2026-11-01T09:30:00.000Z",
"responseStatus": 0,
"responseBody": "string",
"error": "string",
"durationMs": 0,
"attemptLog": [
{
"at": "2026-11-01T09:30:00.000Z",
"responseStatus": 0,
"error": "string",
"durationMs": 0
}
],
"createdAt": "2026-11-01T09:30:00.000Z"
}