Create webhook subscription
POST
/partners/webhooksSubscribes to a single event type for the workspace.
Provide a public HTTPS callback URL. Optionally set a signing secret for delivery verification. Defaults to status `active`.
HMAC signature + Bearer access token
Try this requestRequest body
eventenumrequiredEvent type to subscribe to.
One of: customer.created, customer.updated, customer.deleted, vendor.created, vendor.updated, vendor.deleted, transaction.created, transaction.updated, transaction.deleted, invoice.created, invoice.updated, invoice.deleted, bill.created, bill.updated, bill.deleted
callbackUrlstringrequiredPublic HTTPS URL for deliveries.
signingSecretstringOptional secret for HMAC verification of delivery payloads (1–512 characters).
statusenumInitial status. Defaults to active.
One of: active, paused, disabled
Responses
201Subscription created. Returned under data.webhook.400Invalid callback URL, duplicate event subscription, or validation error.401Missing or invalid HMAC signature, expired timestamp, or invalid Bearer token. Troubleshoot403The credential does not have access to this workspace or resource. Troubleshoot429Rate limit exceeded (100 requests per minute per clientId). Retry after the Retry-After header. TroubleshootPOST
https://api.getcount.com/partners/webhooksRequest
import crypto from 'node:crypto';
const BASE_URL = 'https://api.getcount.com';
const CLIENT_ID = process.env.COUNT_CLIENT_ID;
const CLIENT_SECRET = process.env.COUNT_CLIENT_SECRET;
const ACCESS_TOKEN = process.env.COUNT_ACCESS_TOKEN;
const method = 'POST';
const signingPath = '/webhooks';
const timestamp = Math.floor(Date.now() / 1000).toString();
const body = {
"event": "customer.created",
"callbackUrl": "https://webhook.site/your-unique-id",
"status": "active"
};
const bodyString = JSON.stringify(body);
const bodyHash = crypto.createHash('sha256').update(bodyString).digest('hex');
const baseString = `${method}:${signingPath}:${timestamp}:${bodyHash}`;
const signature = crypto.createHmac('sha256', CLIENT_SECRET).update(baseString).digest('hex');
const response = await fetch(`${BASE_URL}/partners/webhooks`, {
method,
headers: {
'x-client-id': CLIENT_ID,
'x-timestamp': timestamp,
'x-signature': signature,
'Content-Type': 'application/json',
Authorization: `Bearer ${ACCESS_TOKEN}`,
},
body: bodyString,
});
console.log(await response.json());Response · 201
{
"status": "success",
"data": {
"webhook": {
"uuid": "e0f1a2b3-c4d5-6789-ef01-234567890abc",
"event": "customer.created",
"callbackUrl": "https://webhook.site/your-unique-id",
"status": "active",
"createdAt": "2026-03-01T09:00:00.000Z",
"updatedAt": "2026-03-01T09:00:00.000Z"
}
}
}