COUNTCOUNT
Sign Up
WebhooksCreate webhook subscription

Create webhook subscription

POST/partners/webhooks

Subscribes 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 request

Request body

eventenumrequired

Event 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

callbackUrlstringrequired

Public HTTPS URL for deliveries.

signingSecretstring

Optional secret for HMAC verification of delivery payloads (1–512 characters).

statusenum

Initial 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. Troubleshoot
403The credential does not have access to this workspace or resource. Troubleshoot
429Rate limit exceeded (100 requests per minute per clientId). Retry after the Retry-After header. Troubleshoot
POSThttps://api.getcount.com/partners/webhooks
Request
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"
    }
  }
}