Webhooks

Custara pushes workspace events to HTTPS endpoints you register. Registration is on Developers, POST /api/v1/webhooks, or custara webhooks create. The scope is connectors:write.

Create returns a signing secret once (whsec_…). It is stored encrypted. Disable an endpoint with DELETE /api/v1/webhooks/{id} or custara webhooks disable. Disabling sets is_active to false. It does not delete delivery history.

Events the server emits

EventWhen
invoice.ingestedA bill is stored
invoice.receivedSame ingest, second notification
invoice.analyzedPipeline finished
invoice.anomaly_detectedPipeline recorded an anomaly
approval.neededAn approval request is pending
approval.decidedAn approver approved or rejected
payment.intent_createdA payment intent was created
payment.executedNigeria export adapter finished
payment.failedTransfer or adapter failed
invoice.reconciledA settlement was recorded
receivable.reminderCollections sent a reminder
*Every event above

The subscription picker also lists approval.requested, payment.created, and payment.sent. Those three names are not delivered. For Arc settlement, subscribe to payment.intent_created and invoice.reconciled, or use *.

The payload is JSON:

{ "event": "payment.intent_created", "created_at": "2026-10-08T18:00:00.000Z", "data": {} }

Delivery sets X-Custara-Event to the event name and X-Custara-Signature to hex HMAC-SHA256 of the raw body using the endpoint secret.

Delivery

The worker queue webhooks delivers deliver_webhook jobs. Without Redis and npm run worker, deliveries stay pending in Postgres.

Each delivery is retried with backoff, up to eight attempts, then dead-lettered. Deliveries are visible from the developer tools and the WebhookDelivery records.

Verify the signature with the endpoint secret before you trust the body. Treat retries as at-least-once: key your handler on the event id and the payment or invoice id inside the payload.

Circle

Circle transfer notifications arrive at POST /api/webhooks/circle and are checked with CIRCLE_WEBHOOK_SECRET. That route is for Circle, not for your ERP. Your ERP subscribes to the Custara events above.

Paystack and Mono have their own inbound routes for bank reconciliation. They are configured with PAYSTACK_* and MONO_* and are not a substitute for Custara outbound webhooks.