Incoming Messages Webhook

Seleqt can forward new incoming messages to your webhook URL on a per-user basis.

Configure

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 });
});