Sequencer contract
ReadyBuyerFinder follows the Surge multichannel contract, which OutreachSender and ReachDak also use:
- Authentication:
Authorization: Bearer <key>, using a key created in the sequencer with scopemultichannel. - Retries: every POST has an
Idempotency-Key, so retrying is safe. - Identifying people: by
person_key, which isemail:<lowercased email>orli:<linkedin public id>. - Webhook signatures:
X-Surge-Signature: t=<unix>,v1=<hex HMAC-SHA256(secret, t + "." + body)>.
ReadyBuyerFinder → sequencer
POST {sequencer}/api/v1/multichannel/enroll
{
"external_id": "signaldak:<lead_id>:<push_id>",
"source": "signaldak",
"person": { "person_key": "email:[email protected]", "email": "[email protected]", "email_status": "valid",
"first_name": "Ana", "last_name": "Roy", "title": "CTO", "company": "Acme", "company_domain": "acme.com",
"linkedin_url": null, "country": "IN", "timezone": "Asia/Kolkata",
"custom": { "signal": "...", "signal_url": "...", "why_now": "...", "score": 82, "icebreaker": "..." } },
"sequence_id": "optional",
"campaign_id": "ReachDak only",
"message": { "subject": "...", "body_text": "...", "body_html": "..." },
"send_after": "2026-10-27T04:30:00.000Z"
}
send_after is filled for leads in India: the next time inside your IST send window (weekdays 10:00–13:00 by default, see Languages). For other leads it is null and the sequencer uses its own schedule.
| Response | What ReadyBuyerFinder does |
|---|---|
201 {enrollment_id} | Marks the lead as pushed |
409 (person unsubscribed or blacklisted) | Suppresses the person |
429 or 5xx | Retries the push |
Sequencer → ReadyBuyerFinder
POST https://readybuyerfinder.com/api/v1/hooks/sequencer/<integration_id>, with the envelope { id, type, created_at, workspace_id, person_key, external_id, data }.
| Event | Effect in ReadyBuyerFinder |
|---|---|
email.replied, linkedin.replied | With data.snippet: a reply is created in the Replies inbox, labelled by rules and then the AI, and the lead's status follows the label. Without a snippet: lead marked as replied, or as meeting when data.sentiment is meeting or interested |
meeting.booked | Lead marked as meeting |
email.bounced | Email marked invalid |
email.unsubscribed, linkedin.unsubscribed | Person suppressed in all agents |
enrollment.finished | Outcome set to "no reply" if nothing else happened |
Replies also feed the learning loop, send alerts to the agent's Slack, Telegram or WhatsApp, and fire reply.received REST hooks.
Version 0.2 additions
All additive; nothing breaks for a sequencer built on 0.1.
send_afteris now filled for leads in India.- Lead payloads sent to webhooks and REST hooks carry a
languagefield (the draft's language, e.g.Hinglish). - Replies with
data.snippetbecome labelled replies, andreply.receivedevents go out to downstream REST hooks.