Curviate x n8n
Trigger n8n workflows from LinkedIn events. Connect the two with Curviate’s webhooks and API, then build the flow you need.
What is n8n?
n8n is a workflow automation platform with a visual editor that can be self-hosted. Technical teams use it to connect apps and APIs and to build automations, including AI agent workflows.
Visit n8n.ioHow n8n works with Curviate
An n8n Webhook node receives Curviate events and the HTTP Request node calls the Curviate API back. With a body template Curviate sends exactly the JSON your workflow reads, enrollment_id included, and the workflow can post its answer to a Curviate incoming event so a waiting Motion moves on. Cloud or self-hosted, nothing to install.
message.receivedconnection.acceptedenrollment.finishedadd contactsstart a Motionsend a messageWhat you can build
Three flows teams set up first. Each one takes a few minutes.
Qualify before the pitch
A Motion step emits the custom event qualify. Your workflow scores the Contact, posts the tier back, and the Sequence pitches only tier A.
motion.custom_eventReplies routed by an IF node
Replies from Motion Contacts go to the deal channel in Slack, everything else to the rep who owns the Account.
message.received
Accepted invites in HubSpot
The HubSpot node’s Create/Update a contact operation files each new connection with their LinkedIn URL and job title.
connection.acceptedSet up n8n with Curviate
Everything runs on two things Curviate gives every account: signed webhooks out and a REST API in.
- 1
Copy your Curviate API key
In the Curviate dashboard, open Settings, then API & Webhooks, and copy your key.
# keep it in your tool's credentials, never in plain text
CURVIATE_API_KEY=cvt_live_••••3f9a - 2
Start with the Webhook node
Create a new flow in n8n, start it with the Webhook node and copy the URL it gives you.
# the URL your Webhook node gives you
https://your-n8n-webhook-url - 3
Send Curviate events to it
Create a webhook in Curviate for the events you need, then send a test event so n8n can read the fields. You can do the same in the dashboard under Settings, then API & Webhooks. Each webhook covers one source:
messagingfor replies,userfor accepted invitations,motionfor Motion outcomes,account_statusfor account alerts.curl https://api.curviate.com/v1/webhooks \
-H "Authorization: Bearer $CURVIATE_API_KEY" \
-d '{
"source": "messaging",
"events": ["message.received"],
"account_ids": ["acc_…"],
"request_url": "https://your-n8n-webhook-url"
}' - 4
Call Curviate from n8n
Add the HTTP Request node with the headers
Authorization: Bearerplus your key andContent-Type: application/json, and call any Curviate action. This one adds a person and starts a Motion.# add the person as a contact
POST https://api.curviate.com/v1/contacts
{ "linkedin_url": "linkedin.com/in/lenaweber", "first_name": "Lena" }
# start your Motion for them
POST https://api.curviate.com/v1/motions/mot_…/contacts
{ "contact_ids": ["con_…"] } - 5
Check the signature
Every delivery carries a
Curviate-Signatureheader: an HMAC-SHA256 of the timestamp and the raw body, made with your webhook’s secret. Compare it before you act, and drop anything older than five minutes.Curviate-Signature: t=1792230000,v1=5f2c9a…e81b
# expected = HMAC_SHA256(secret, t + "." + raw_body)
n8n details that matter
What the n8n and Curviate docs say about wiring the two together.
- 1
Test URL, then production URL
n8n listens on the test URL only while you click Listen for Test Event, and shows the data in the editor. The production URL works once you publish the workflow; its runs show under Executions. Build against the test URL with
curviate webhook test, then point the Curviate webhook’srequest_urlat the production URL. - 2
Lock the node with Header Auth
Give the Curviate webhook a custom header and choose Header auth on the Webhook node with the same name and value. Curviate stores header values encrypted and only ever shows a fingerprint of them.
curviate webhook create --source motion \
--events motion.custom_event \
--request-url https://YOUR_N8N_HOST/webhook/… \
--template-file ./n8n.json - 3
Answer within 10 seconds
Curviate waits 10 seconds for a 2xx and retries anything slower, up to 5 attempts in 24 hours. For a long workflow set the node to respond Immediately rather than when the last node finishes, and deduplicate on the delivery
id. - 4
Match on enrollment_id
Send
{{enrollment_id}}in the body template and post it back to the incoming event. The match then never depends on an email address, and the Enrollment’suntil event.qualifiedStep can save the tier withsave.
Events you can use
message.receivedA LinkedIn message or InMail arrivedconnection.acceptedSomeone accepted an invitation you sent through Curviateenrollment.finishedA contact finished a Motion, with the reasonenrollment.repliedA contact replied to a Motion, with the reply textmotion.custom_eventA Motion ran a step you marked to notify youpost.publishedA scheduled post went liveaccount.reconnect_neededAn account needs to sign in againActions you can call
POST /v1/contactsAdd or update a contactPOST /v1/motions/{id}/contactsStart a Motion for contactsPOST /v1/{account_id}/chats/{chat_id}/messagesSend a messagePOST /v1/enrollments/{id}/eventsTell a waiting Motion to continueGET /v1/{account_id}/companies/{identifier}Read a company pageQuestions about Curviate x n8n
Does it work with self-hosted n8n?
Yes. Curviate delivers to any n8n instance that is reachable over HTTPS, in the cloud or on your own server.
Which LinkedIn events can start a n8n flow?
Messages, accepted invitations, published posts, account status changes and every step of a Motion, from a contact starting it to a reply that ends it.
Can n8n act on LinkedIn too?
Yes. Every Curviate action is a plain HTTPS call, so n8n can search, message, invite or start a Motion, inside the limits you set for each account.
More automation
Connect n8n today.Free for 7 days.
Create your API key, point a webhook at n8n and run your first flow.


