POST requests with a JSON body.
To manage subscriptions programmatically (create, list, delete), see the Webhooks API reference. This page covers what your receiver needs to do once a subscription is in place.
Headers
Every delivery includes:Body
data is event-specific:
lead.*events carrydata.lead.project.*events carrydata.project.unit.*events carrydata.unitanddata.project.lead.note_addedcarriesdata.leadIdanddata.note.lead.communication_loggedcarriesdata.leadIdanddata.communication.
Verifying the signature
Always verify the signature before trusting a payload. Anyone who knows your URL can hit it; only FlowEstate has the secret.POST /webhooks/subscriptions and is shown only once. If you lose it, delete the subscription and create a new one.
Acknowledging
Return any2xx HTTP status to acknowledge receipt. FlowEstate doesn’t read the response body — empty 200 is fine.
If your handler does heavy work (calling other APIs, writing to a slow database), acknowledge first, process later:
Retry policy
Failed deliveries (network error, timeout, or HTTP≥ 400) are retried with this backoff:
After five failed attempts the delivery is marked
failed and won’t be retried again. The X-FlowEstate-Delivery header stays the same across retries — use it as your idempotency key when processing.
Preventing loops
When you write to FlowEstate via this REST API, the resulting webhook fans out withX-FlowEstate-Source: api. If your receiver also writes back into FlowEstate, drop events with source api to avoid an infinite loop.
ui— change made by a user clicking in the FlowEstate dashboard.system— change made by an internal worker (assignments, automations).api— change made through this REST API (your own writes, partner platforms).