Receiving events
Create a webhook endpoint in FlowSign at Settings > Webhooks (my.flowsign.app/settings/webhooks), or with the API (see Webhooks).- Create a flow that starts with When an HTTP request is received and save it once so Power Automate generates its URL.
- Paste that URL 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. Power Automate’s workflow expression language has no built-in keyed-hash function, so this isn’t a one-line expression the way it is on the other platforms. The practical option is a small HTTP endpoint you control (an Azure Function is the usual choice) that takes the raw body and the signature header, does the HMAC-SHA256 comparison, and returns a boolean; call it from an HTTP action right after the trigger and branch the flow on its response with a Condition.
Set the body of that request to the trigger’s raw output and the X-FlowSign-Signature header along with it, so the function verifies against the exact bytes FlowSign signed rather than Power Automate’s re-serialised JSON.
Calling the API
Use the HTTP action for any FlowSign API call. Base URL:https://my.flowsign.app. Every request needs:
Create the key at Settings > API keys; see Authentication. Keep it in an environment variable or Azure Key Vault reference rather than typing it into the action.
List packages
Method GET, URIhttps://my.flowsign.app/api/v1/packages?status=IN_PROGRESS.
Create a package from a template
Method POST, URIhttps://my.flowsign.app/api/v1/packages/from-template, 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.

