n8n, Zapier and Make
No extra integration to install: automations use the same /v1 API and signed webhooks as any server. A key (olv_live_…) goes in the tool's header credential as Authorization: Bearer …; give it only the scopes the flow needs.
n8n workflows
Download one, then in n8n: Workflows → Import from File. Fill in the credentials (an HTTP Header Auth credential named for the Outlevo key, Slack, HubSpot, Google Sheets) and activate it.
| Workflow | What it does |
|---|---|
| Interested reply → Slack and HubSpot | On lead.classified with class interested: verifies the signature, posts "Jane Doe at Acme is interested" to a Slack channel, reads the address (GET /v1/contacts/{id}) and creates or updates the contact in HubSpot. |
| New Google Sheet row → company in Accounts | Polls a sheet; each new row is added with POST /v1/companies (Website, Company and an optional ID column as external_id). A company already in Accounts answers 409 COMPANY_EXISTS with its id, so nothing is added twice. |
For the reply workflow: copy the Outlevo webhook node's production URL and subscribe it to lead.classified (the key needs webhooks:manage); keep the secret the answer returns as OUTLEVO_WEBHOOK_SECRET in n8n's environment. The Code node checks the Outlevo-Signature header over the raw body and refuses anything older than 5 minutes; on self-hosted n8n allow it the crypto module (NODE_FUNCTION_ALLOW_BUILTIN=crypto). The key needs contacts:read to read the address.
curl -s -X POST https://api.outlevo.com/v1/webhooks -H "authorization: Bearer $OUTLEVO_KEY" -H "idempotency-key: $(uuidgen)" \
-H "content-type: application/json" -d '{ "url": "https://n8n.example.com/webhook/outlevo-lead-classified", "events": ["lead.classified"] }'
The sheet workflow's key needs companies:write. Domains are normalized the way Outlevo does everywhere (https://www.Acme.com/pricing and app.acme.com are acme.com), and a domain Outlevo knows belongs to another account lands on that account.
Zapier
- Interested reply → Slack, HubSpot, a CRM: trigger "Webhooks by Zapier → Catch Raw Hook"; subscribe its URL to
lead.classifiedas above. Add "Code by Zapier" (JavaScript) to verifyOutlevo-Signaturewith the raw body (the same check as the n8n Code node), then a Filter:data.classisinterested. For the address, a "Webhooks by Zapier → GET" step tohttps://api.outlevo.com/v1/contacts/{{data.contact_id}}with the Authorization header. Then Slack "Send Channel Message" and HubSpot "Create or Update Contact". - New Google Sheet row → company: trigger "Google Sheets → New Spreadsheet Row"; action "Webhooks by Zapier → Custom Request", POST
https://api.outlevo.com/v1/companies, headersAuthorizationandIdempotency-Key(the row id), data{"domain": "<Website>", "name": "<Company>"}. A 409COMPANY_EXISTSmeans it was already there; tell the step not to stop on it.
Make
- Interested reply: "Webhooks → Custom webhook" (subscribe its address to
lead.classified; turn on "Get request headers" and "JSON pass-through" so the raw body is kept for the signature), a filter ondata.class = interested, "HTTP → Make a request" GET/v1/contacts/{contact_id}, then the Slack and HubSpot CRM modules. - Sheet row → company: "Google Sheets → Watch New Rows", then "HTTP → Make a request" POST
/v1/companieswith the two headers and a JSON body; set "Evaluate all states as errors" off so a 409 is not a failure.
Events worth automating
lead.classified, lead.replied, meeting.booked, company.qualified, contact.discovered, handoff.created, job.completed. Every event and its fields: webhooks.
Spreadsheets, Excel and Notion
Accounts, Contacts and a campaign's leads export as CSV or Excel with the same filters as the lists:
curl -s "https://api.outlevo.com/v1/companies/export.xlsx?status=qualified" -H "authorization: Bearer $OUTLEVO_KEY" -o accounts.xlsx
curl -s "https://api.outlevo.com/v1/contacts/export.csv?company_status=qualified" -H "authorization: Bearer $OUTLEVO_KEY" -o contacts.csv
curl -s "https://api.outlevo.com/v1/campaigns/$CAMPAIGN_ID/leads/export.csv" -H "authorization: Bearer $OUTLEVO_KEY" -o leads.csv
Up to 5,000 rows come at once; for more, POST /v1/companies/exports (or /v1/contacts/exports, /v1/campaigns/{id}/leads/exports) with { "format": "csv", "filters": { … } } starts a job, and GET …/exports/{id} answers with a download link valid for 10 minutes once it is built (files are kept 7 days). Starting an export needs only the read scope (companies:read, contacts:read; leads need both campaigns:read and contacts:read). Cells that would run as spreadsheet formulas are prefixed with '. People who opted out are exported with that status and can_email no.
Notion has no Outlevo connection: export CSV and use Notion's Import → CSV (or drag the file into a page) to get a database.