curl --request POST \
--url https://api.debbiecollect.com/v1/{tenantId}/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "ERP sync",
"url": "https://example.com/debbie/webhooks",
"events": [
"cases.create",
"cases.update"
],
"email": "integrations@example.com",
"creditorId": "0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11"
}
'import requests
url = "https://api.debbiecollect.com/v1/{tenantId}/webhooks"
payload = {
"name": "ERP sync",
"url": "https://example.com/debbie/webhooks",
"events": ["cases.create", "cases.update"],
"email": "integrations@example.com",
"creditorId": "0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'ERP sync',
url: 'https://example.com/debbie/webhooks',
events: ['cases.create', 'cases.update'],
email: 'integrations@example.com',
creditorId: '0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11'
})
};
fetch('https://api.debbiecollect.com/v1/{tenantId}/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.debbiecollect.com/v1/{tenantId}/webhooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'ERP sync',
'url' => 'https://example.com/debbie/webhooks',
'events' => [
'cases.create',
'cases.update'
],
'email' => 'integrations@example.com',
'creditorId' => '0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.debbiecollect.com/v1/{tenantId}/webhooks"
payload := strings.NewReader("{\n \"name\": \"ERP sync\",\n \"url\": \"https://example.com/debbie/webhooks\",\n \"events\": [\n \"cases.create\",\n \"cases.update\"\n ],\n \"email\": \"integrations@example.com\",\n \"creditorId\": \"0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.debbiecollect.com/v1/{tenantId}/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"ERP sync\",\n \"url\": \"https://example.com/debbie/webhooks\",\n \"events\": [\n \"cases.create\",\n \"cases.update\"\n ],\n \"email\": \"integrations@example.com\",\n \"creditorId\": \"0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.debbiecollect.com/v1/{tenantId}/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"ERP sync\",\n \"url\": \"https://example.com/debbie/webhooks\",\n \"events\": [\n \"cases.create\",\n \"cases.update\"\n ],\n \"email\": \"integrations@example.com\",\n \"creditorId\": \"0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11\"\n}"
response = http.request(request)
puts response.read_body{
"id": "b963f219-255e-47b7-a3f2-0fe6180514a1",
"name": "ERP sync",
"url": "https://example.com/debbie/webhooks",
"events": [
"cases.create",
"cases.update"
],
"creditorId": "0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11",
"verificationToken": "5f2e6a55-6f7d-4d0e-8f1c-2f5a2f8d7c11",
"email": "integrations@example.com",
"headers": {
"X-Custom": "value"
},
"deepFlattenBody": false,
"pull": false,
"enabled": true,
"createdAt": "2026-08-29T11:21:10.100Z",
"createdBy": {
"id": "b1a2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
"type": "KEY"
},
"bodyMappers": null
}Create webhook
Creates a webhook that POSTs the events it is subscribed to. The response carries the verification token sent with every delivery — store it, it is not shown again.
Required scope: write:webhooks
curl --request POST \
--url https://api.debbiecollect.com/v1/{tenantId}/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "ERP sync",
"url": "https://example.com/debbie/webhooks",
"events": [
"cases.create",
"cases.update"
],
"email": "integrations@example.com",
"creditorId": "0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11"
}
'import requests
url = "https://api.debbiecollect.com/v1/{tenantId}/webhooks"
payload = {
"name": "ERP sync",
"url": "https://example.com/debbie/webhooks",
"events": ["cases.create", "cases.update"],
"email": "integrations@example.com",
"creditorId": "0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'ERP sync',
url: 'https://example.com/debbie/webhooks',
events: ['cases.create', 'cases.update'],
email: 'integrations@example.com',
creditorId: '0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11'
})
};
fetch('https://api.debbiecollect.com/v1/{tenantId}/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.debbiecollect.com/v1/{tenantId}/webhooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'ERP sync',
'url' => 'https://example.com/debbie/webhooks',
'events' => [
'cases.create',
'cases.update'
],
'email' => 'integrations@example.com',
'creditorId' => '0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.debbiecollect.com/v1/{tenantId}/webhooks"
payload := strings.NewReader("{\n \"name\": \"ERP sync\",\n \"url\": \"https://example.com/debbie/webhooks\",\n \"events\": [\n \"cases.create\",\n \"cases.update\"\n ],\n \"email\": \"integrations@example.com\",\n \"creditorId\": \"0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.debbiecollect.com/v1/{tenantId}/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"ERP sync\",\n \"url\": \"https://example.com/debbie/webhooks\",\n \"events\": [\n \"cases.create\",\n \"cases.update\"\n ],\n \"email\": \"integrations@example.com\",\n \"creditorId\": \"0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.debbiecollect.com/v1/{tenantId}/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"ERP sync\",\n \"url\": \"https://example.com/debbie/webhooks\",\n \"events\": [\n \"cases.create\",\n \"cases.update\"\n ],\n \"email\": \"integrations@example.com\",\n \"creditorId\": \"0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11\"\n}"
response = http.request(request)
puts response.read_body{
"id": "b963f219-255e-47b7-a3f2-0fe6180514a1",
"name": "ERP sync",
"url": "https://example.com/debbie/webhooks",
"events": [
"cases.create",
"cases.update"
],
"creditorId": "0f6c7a3e-6e4e-4f0c-9a2a-2f6cba3f9a11",
"verificationToken": "5f2e6a55-6f7d-4d0e-8f1c-2f5a2f8d7c11",
"email": "integrations@example.com",
"headers": {
"X-Custom": "value"
},
"deepFlattenBody": false,
"pull": false,
"enabled": true,
"createdAt": "2026-08-29T11:21:10.100Z",
"createdBy": {
"id": "b1a2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
"type": "KEY"
},
"bodyMappers": null
}Authorizations
Authentication with an API key can be done by using a bearer token in the Authorization header. This is done using the following format Authorization: Bearer {token}. API keys are issued and revoked directly from the creditor portal under Developers > API.
Path Parameters
Id of the tenant
Body
Name of the webhook. Shown in the portal and on every delivery.
Public HTTP(S) address every delivery is POSTed to. Addresses on a private network are rejected.
Events to subscribe to. A creditor webhook can subscribe to cases.create, cases.update, cases.delete and billings.create.
1Id of the creditor the webhook is scoped to. Must be the creditor the key is issued for.
Address notified when deliveries keep failing.
Extra headers sent with every delivery, for example an authorization header the receiver expects.
Show child attributes
Show child attributes
Flatten nested objects in the body into single level keys joined by "_", for receivers that cannot read nested JSON. Defaults to false.
Response
Successful operation
Id of the webhook
Name of the webhook
Address every delivery is POSTed to
Events the webhook is subscribed to
Id of the creditor the webhook is scoped to. A creditor webhook only receives events for this creditor.
Sent as the X-Verification-Token header on every delivery. Compare it with this value and reject requests that do not match.
Address notified when deliveries keep failing. null when no address was given.
Extra headers sent with every delivery
Show child attributes
Show child attributes
Per event field maps that reshape the body before it is sent. null when the body is sent as it is.
Whether nested objects in the body are flattened into single level keys joined by "_"
Whether deliveries wait to be pulled through the webhook items endpoints instead of being POSTed
Whether the webhook is receiving events
When the webhook was created
Who created the webhook
Show child attributes
Show child attributes