Receiving events
Create a webhook endpoint in FlowSign at Settings > Webhooks (my.flowsign.app/settings/webhooks), or with the API (see Webhooks).- In your Zap, add Webhooks by Zapier as the trigger app and choose the Catch Hook event.
- Zapier gives you a catch URL. Paste it into the endpoint’s URL field in FlowSign.
- Tick the events to subscribe to (for example Package Completed) and save. FlowSign shows the endpoint’s signing secret once; store it.
POST with three headers and a JSON body:
data differs per event. See Events for every event’s shape.
Verifying the signature
Compute a hex HMAC-SHA256 of the raw body with the endpoint secret and compare it toX-FlowSign-Signature. The Catch Hook event parses the body into fields before your Zap sees it, so re-serialising those fields to JSON isn’t guaranteed to match the exact bytes FlowSign signed (whitespace and key order can differ). For verification that has to match byte-for-byte, use the Catch Raw Hook event instead, which passes the unparsed body and headers through.
Add a Code by Zapier step (JavaScript) after the trigger:
inputData.rawBody and inputData.signature from the raw hook’s body and X-FlowSign-Signature header, and inputData.secret from a Zapier storage value or environment-style input holding the endpoint secret. Follow with a Filter by Zapier step that only continues when valid is true.
Calling the API
Use Webhooks by Zapier’s Custom Request action for any FlowSign API call. Base URL:https://my.flowsign.app. Every request needs:
Create the key at Settings > API keys; see Authentication.
List packages
Method GET, URLhttps://my.flowsign.app/api/v1/packages?status=IN_PROGRESS.
Create a package from a template
Method POST, URLhttps://my.flowsign.app/api/v1/packages/from-template, with a JSON body:
role must match one of the template’s role names and fields keys must match its merge field keys; a mismatch returns 422 with the unknown or missing names in details. status is "draft" (default) or "sent", which sends immediately. externalId is optional and makes the call idempotent: retrying with the same value returns the existing package instead of creating a duplicate.

