Documentation Index
Fetch the complete documentation index at: https://docs.seleqt.ai/llms.txt
Use this file to discover all available pages before exploring further.
Incoming Messages Webhook
Seleqt can forward new incoming messages to your webhook URL on a per-user basis.
PUT /api/v1/user/webhook/
Body
{ "webhook_url": "https://your-app.com/seleqt-webhook" }
- Send
null (or empty string in UI) to disable.
Delivery
When a new message is received on a connected account in your organization, Seleqt will POST:
{
"event": "incoming_message",
"message": {
"id": 123,
"message_id": "abc123",
"message": "Hello there",
"sent_by_lead": true,
"sent_at": "2025-06-09T11:22:33Z",
"created_at": "2025-06-09T11:22:33Z",
"updated_at": "2025-06-09T11:22:33Z",
"campaign": {
"id": 456,
"name": "Outbound - SaaS founders",
"status": "ACTIVE"
},
"lead": {
"id": 789,
"first_name": "Alex",
"last_name": "Doe",
"profile_picture_url": "https://example.com/alex.jpg",
"linkedin_profile_url": "https://www.linkedin.com/in/alex-doe/",
"linkedin_public_id": "alex-doe",
"job_title": "Head of Sales",
"industry": "SaaS",
"headline": "Helping teams close more deals",
"email": "alex@example.com",
"phone_number": "+1 555 0100",
"location": "Amsterdam, NL",
"status": "IN_REVIEW",
"company": {
"id": 321,
"name": "Acme Inc",
"linkedin_url": "https://www.linkedin.com/company/acme/",
"logo_url": "https://example.com/logo.png",
"website_url": "https://acme.com",
"location": "Amsterdam, NL",
"industry": "Software",
"revenue": "$10M-$50M",
"amount_of_employees": "51-200"
},
"custom_fields": { "plan": "pro" }
}
}
}
- Retries are not currently guaranteed; implement idempotency by checking
message.message_id on your side.
Security
- Consider hosting your endpoint behind a firewall that allows only Seleqt IPs or implement your own signature verification.
- For now, no signature header is included in this webhook.
Example handler (Node/Express)
app.post("/seleqt-webhook", async (req, res) => {
const { event, message } = req.body || {};
if (event !== "incoming_message") return res.status(200).send("ignored");
// TODO: process message
res.status(200).send({ ok: true });
});