Integrations
Build any workflow with Crispy as your event source.
Crispy is an event-native LinkedIn engine. Every meaningful state change fires a signed v1 event by default — a Webhook-Signature header plus a structured Hybrid payload (stable identifiers + curated fields). Subscribe from Make, n8n, Zapier, or any HTTP endpoint, then compose the rest of your stack however you like. Older webhooks on the legacy X-Crispy-Signature scheme keep working unchanged.
The canonical use case
If an invitation hasn't been accepted in 7 days, fire a webhook into my cold-email sequencer.
No competitor solves this cleanly without locking your workflow inside their UI. Crispy ships invitation.not_accepted_after as a first-class scheduled event with automatic cancellation when the contact accepts inside the window.
Reference automations
Five end-to-end recipes plus a verification reference. Each page includes a sample payload, exact subscription config, and step-by-step setup for the platforms that matter.
Invitation not accepted in 7 days
CanonicalThe canonical use case. When an invitation isn't accepted within 7 days, fire a webhook into Instantly (or any cold-email tool) and start an email sequence. Cancellation is automatic if they accept.
invitation.not_accepted_afterFirst reply to HubSpot deal + Slack
When a contact replies for the first time, create a deal in HubSpot and post the message to a Slack channel so your team can jump on the warm lead.
contact.first_inbound_messageCompany replied: tag in Attio (ABM)
When any contact at a target account replies, tag the company as engaged in your CRM. Warm-the-committee logic for account-based outreach.
company.contact_repliedMigrating from Lemlist
Bring your Lemlist lead IDs across via custom_attrs, then push declined invitations back to a Lemlist email-only sequence.
invitation.declinedDynamic campaign pause via cron
Poll a campaign's acceptance rate daily. If it drops below 10%, pause its outreach automatically. Not webhook-driven, but uses the campaign read + outreach surfaces for cron-style logic.
campaign state polloutreach pauseHMAC verification (Node, Python, Go)
ReferenceCopy-pasteable code for verifying the v1 Webhook-Signature header. Includes timing-safe comparison, dual-secret rotation, and idempotency via Webhook-Event-Id. Legacy webhooks still supported.
Webhook-Signature: v1,t=..,s=..How it fits together
- Subscribe to one or more events via
POST /api/v1/subscriptionswith a target webhook URL and an optional filter. - Receive a signed v1 payload at your endpoint. The body input to the HMAC is
v1.<t>.<raw_body>; the header isWebhook-Signature: v1,t=<t>,s=<hex>(the timestamp is thet=field of that header). Thedatablock follows the Hybrid shape — a stableidentifiersobject plus curated fields, never raw rows. Legacy webhooks instead sendX-Crispy-Signatureovert=<ts>.<body>. - Verify the signature using your per-webhook signing secret. See the HMAC verification page for v1 Node, Python, and Go snippets (and the legacy verifiers).
- Idempotency: every v1 delivery includes a stable
Webhook-Event-Idheader (equal topayload.id) that is identical across retries. Store it for 7 days and reject duplicates. Legacy webhooks useX-Crispy-Delivery-Id. - Filter at the source: subscriptions accept a
filterwithis_first,match, and operators ($contains,$gte,$lte,$in) so you don't fan-out events you'll throw away.