Outbound webhooks

Centerfy POSTs a JSON event to your URL when something changes: 45 events across contacts, appointments, opportunities, messages, notes, conversations, contracts, invoices, quotes and team.

Outbound webhooks push changes to you; the inbound API is how you push changes to Centerfy. Each event is one HTTP POST with a JSON body, sent immediately after the change is saved.

Set up

In the app: Settings → API & Webhooks → Webhooks. Enter a default URL, tick the events you want (each event can override the URL), optionally set a Source label, and use Send test to check your endpoint. The panel also shows the example payload for every event.

Through the API: the outbound webhook subscription endpoints create subscriptions with a generated secret token and an optional Source, rotate the secret, list deliveries and re-send one.

Delivery

MethodPOST, Content-Type: application/json. The body is one event object.
AuthenticationIf the subscription has a secret token, every request carries it twice: Authorization: Bearer <token> and X-Webhook-Token: <token>. Reject requests without it.
TimingSent once, right after the change is saved. Respond with any 2xx quickly; do your work asynchronously.
RetriesNo automatic retries. Every attempt is logged with its status code and response, and a failed delivery can be re-sent from the panel or with Redeliver.
Test sendsSend test and the test endpoint post an example payload with the header X-Webhook-Test: true.
Loop preventionChanges made through the API with X-Webhook-Source equal to the subscription’s Source are not sent to that subscription.
OrderingOne change can produce several events: moving an opportunity sends opportunity.updated and opportunity.stage_changed. Don’t rely on their order; use occurred_at.

Envelope

Every payload has these top-level fields, plus an object for the entity (contact, opportunity, invoice, …) and, for change events, the previous values.

FieldDescription
eventEvent name, e.g. opportunity.stage_changed.
occurred_atISO 8601 timestamp of the change (UTC).
sub_account_idSub-account the event belongs to.
organization_idAgency that owns the sub-account.
{
  "event": "contact.created",
  "occurred_at": "2026-06-20T14:30:00.000Z",
  "sub_account_id": "<sub account uuid>",
  "organization_id": "<organization uuid>",
  "contact": { "id": "<uuid>", "name": "Jane Doe", "email": "[email protected]", "…": "…" }
}

Events

Each page lists when every event fires and the exact JSON payload.

© 2026 Centerfy AI. All rights reserved.