A REST API over contacts, conversations, messages and leads, signed webhooks for every event, and flow steps that call your systems — all included in every plan, no add-on.
Read and create contacts and leads, list conversations, and send a real message on any connected channel.
Get pushed every new message, status change and won deal, signed so you can trust what you receive.
A flow step can call your own endpoint and keep a value from the reply on the contact — no middleware needed.
Append a row to a spreadsheet from any flow — the no-code path when a full integration is overkill.
Drop one script tag on your site and conversations land in the same inbox as every other channel.
Send lead and purchase events back to Meta so your ad campaigns optimize on real outcomes.
Everything is a token away — there is no separate developer account and no approval queue.
Sign up and connect at least one channel so there is something to talk to.
Settings → Integrations → Developer API. Pick the abilities the token may use; it can never exceed your own permissions.
Send the token as a Bearer header. Start with /me to confirm which workspace you are talking to.
# List your contacts
curl https://app.labeeq.com/api/v1/contacts \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/json"
# Send a message into a conversation
curl -X POST https://app.labeeq.com/api/v1/conversations/42/messages \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body": "Your order is on its way!"}'
Base URL: https://app.labeeq.com/api/v1
| Endpoint | Token ability | What it does |
|---|---|---|
GET/me
|
— |
Who am I: the token's user, workspace, and abilities. |
GET/contacts?search=
|
contacts:read |
List contacts, newest first; search matches name and email. |
GET/contacts/{id}
|
contacts:read |
One contact by id. |
POST/contacts
|
contacts:write |
Create a contact (name required; email, phone, lifecycle_stage_id optional). |
GET/conversations?status=&contact_id=&channel_id=
|
conversations:read |
List conversations with status, contact and channel filters. |
GET/conversations/{id}
|
conversations:read |
One conversation with its channel and assignee. |
GET/conversations/{id}/messages
|
conversations:read |
A conversation's messages, newest first. |
POST/conversations/{id}/messages
|
messages:send |
Send an outbound message ({"body": "…"}) — real channel delivery, as the token's user. |
GET/leads?outcome=&contact_id=
|
leads:read |
List leads; outcome takes open, won, or lost. |
POST/leads
|
leads:write |
Open a lead (contact_id and name required; value and source optional). |
Point an endpoint at your server, pick your events, and Labeeq POSTs each one as it happens — with retries and automatic back-off if you are down.
message.received
message.sent
conversation.created
conversation.opened
conversation.closed
conversation.assigned
contact.created
contact.lifecycle_changed
lead.created
lead.won
lead.lost
Every request carries an HMAC-SHA256 of the raw body in X-Labeeq-Signature. Compare it with your endpoint secret before trusting the payload.
expected = "sha256=" + HMAC_SHA256(secret, raw_body)
if (expected !== header("X-Labeeq-Signature")) reject()
Create a workspace, issue a token, and you are calling the API in minutes. Zapier, Make and n8n connect the same way.