Webhooks

Signed HTTPS deliveries to your server when something happens in Outlevo: a job finishes, a company qualifies, a lead replies, a meeting is booked.

Subscribe

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://your.app/api/outlevo-webhook", "events": ["lead.replied", "company.qualified"] }'

The answer carries the signing secret once: keep it as OUTLEVO_WEBHOOK_SECRET. HTTPS and public addresses only; the key needs webhooks:manage. You can also add one in the Outlevo chat or at app.outlevo.com → Developers.

What a delivery looks like

POST /api/outlevo-webhook
content-type: application/json
user-agent: Outlevo-Webhooks/1.0
outlevo-signature: t=1760000000,v1=5f2b…
outlevo-event-id: 3f1c…
outlevo-event-type: lead.replied

{ "id": "3f1c…", "type": "lead.replied", "created_at": "2026-10-21T09:41:00.000Z", "data": { "campaign_id": "…", "lead_id": "…", "contact_id": "…", "company_id": "…", "external_id": "site-17", "reply_text": "…", "at": "…" } }

Verify every delivery

With the SDK:

import { verifyWebhook } from '@outlevo/sdk';
const event = await verifyWebhook(rawBody, req.headers['outlevo-signature'], process.env.OUTLEVO_WEBHOOK_SECRET!);

Without it, the ten-line check in Node and PHP is in llms.txt; a complete Node receiver is templates/webhook-receiver.ts.

Retries, tests and rotation

Events

GroupEvents
jobjob.completed job.failed
companycompany.qualified company.disqualified company.created
contactcontact.verified contact.discovered
revenue_actionrevenue_action.proposed revenue_action.blocked revenue_action.executed revenue_action.approved revenue_action.failed revenue_action.outcome_observed
handoffhandoff.created handoff.accepted handoff.rejected
campaigncampaign.status_changed
audienceaudience.ready
outcomeoutcome.recorded
usageusage.threshold
competitorcompetitor.added competitor.confirmed competitor.changed competitor.account_linked
leadlead.sent lead.replied lead.bounced lead.unsubscribed lead.answered
meetingmeeting.booked
evidenceevidence.added

Lead events carry campaign_id, lead_id, contact_id, company_id, external_id and at; lead.replied adds reply_text, lead.bounced adds hard, lead.answered adds by (autopilot or person) and meeting.booked adds starts_at, ends_at, title, booking_ref and outcome_id. Payload schemas for every event are in the API reference.