{"info":{"name":"Labeeq API","description":"The Labeeq API lets you build on top of your own workspace: read contacts and\nconversations, send a real message on any connected channel, and open deals in\nyour pipeline. It is a JSON REST API over HTTPS, included in every plan.\n\nRather click around first? Import the [Postman collection](https://labeeq.com/developers/postman_collection.json) — every\nendpoint below, with example bodies and the auth header already pointed at a\n`token` variable. It is generated from this document, so the two cannot disagree.\n\n## Authentication\n\nEvery request carries a personal access token as a bearer token:\n\n```\nAuthorization: Bearer YOUR_TOKEN\n```\n\nCreate tokens in **Settings → Integrations → Developer API**. The plain token is\nshown once, at creation — only its hash is stored, so a lost token is replaced,\nnever recovered.\n\nA token belongs in the header and nowhere else. Requests carrying a `token` or\n`api_token` **query parameter are refused with `400`**, because a token in a URL\nis copied into access logs, proxy caches and browser history. Requests over plain\nHTTP are refused with `403`; every call must be TLS.\n\nCall `GET /me` first: it answers with the workspace the token belongs to and the\nabilities it carries, which is the quickest way to confirm your setup.\n\nA token can also be **pinned to the addresses it may be used from** — an exact\naddress or a CIDR range, set when you create it. Used from anywhere else it\nanswers `403`, which makes a leaked token far less useful to whoever found it.\nEvery write your tokens make is recorded with its token, address and result, and\nthe trail is visible in the same settings page.\n\n## Abilities\n\nA token carries a fixed set of abilities, chosen when you create it. **An ability\ncan only narrow what its owner may already do** — the call must pass *both* the\ntoken's abilities and the owning teammate's own role permissions. Revoking a\nteammate's access therefore revokes their tokens' reach at the same time.\n\n| Ability | Grants |\n| --- | --- |\n| `contacts:read` | قراءة جهات الاتصال |\n| `contacts:write` | إنشاء وتعديل جهات الاتصال |\n| `conversations:read` | قراءة المحادثات |\n| `messages:send` | إرسال الرسائل |\n| `leads:read` | قراءة العملاء المحتملين |\n| `leads:write` | إنشاء وتعديل العملاء المحتملين |\n| `webhooks:manage` | إدارة اشتراكات الويب هوك |\n\n## Workspaces\n\nA token is bound to the workspace of the teammate who created it. Every response is\nscoped to that workspace: a record belonging to another one answers `404`, never\nanother company's data.\n\n## Pagination\n\nCollections are cursor-paginated. Follow `meta.next_cursor` and pass it back as\n`?cursor=`; `per_page` defaults to 50 and caps at 100. Cursors are opaque — treat\nthem as strings and do not construct them yourself.\n\n## Rate limits\n\n60 requests per minute per token. Every response carries `X-RateLimit-Limit` and\n`X-RateLimit-Remaining`, so you can slow down before you are cut off; exceeding\nthe limit answers `429` with a `Retry-After` header saying how many seconds to\nwait. Back off and retry rather than hammering — the counter is per token, so a\nrunaway script starves your other integrations too.\n\n## Retrying a write safely\n\nA timeout tells you nothing about whether the work happened. Send an\n`Idempotency-Key` header on any `POST` — any unique string of your own, an order\nid or a UUID — and retrying with the same key returns the **first** response\ninstead of sending a second message or opening a second deal.\n\n```\nIdempotency-Key: order-4821-shipped\n```\n\nA replayed response carries `Idempotent-Replay: true`. Keys are remembered for 24\nhours and are scoped to your workspace, so they cannot collide with another\ncustomer's. Reusing a key with a *different* body answers `422` — that is a bug\non your side, and returning the earlier result would hide it. A request that\nfailed is not recorded, so you can fix the body and retry with the same key.\nSending no key keeps the old behaviour: every call does the work.\n\n## Errors\n\nEvery error is JSON of the same shape — a `message`, plus an `errors` map when a\nbody failed validation — so one handler covers them all. Internal details are\nnever returned: an unexpected failure is a plain `500`, with nothing about the\nframework or the database in it.\n\n`400` the request itself was malformed (a token in the URL, for instance), `401`\nno or bad token, `403` the token or the teammate lacks permission — or the call\nwas not over HTTPS, `404` the record does not exist in this workspace, `422` the\nbody failed validation, `429` rate limited.","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{token}}","type":"string"}]},"variable":[{"key":"base_url","value":"https://labeeq.com/api/v1","type":"string","description":"Every path is relative to this."},{"key":"token","value":"","type":"string","description":"A personal access token from Settings → Integrations → Developer API. Shown once, at creation."},{"key":"contact_id","value":"","type":"string","description":"The id used by the requests that address a single record."},{"key":"conversation_id","value":"","type":"string","description":"The id used by the requests that address a single record."},{"key":"webhook_id","value":"","type":"string","description":"The id used by the requests that address a single record."}],"item":[{"name":"Account","description":"Who the token belongs to.","item":[{"name":"Who am I","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/me","host":["{{base_url}}"],"path":["me"]},"description":"The token's teammate, their workspace, and the abilities the token carries. Costs nothing and touches no data — the call to make first."},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/me","host":["{{base_url}}"],"path":["me"]},"description":"The token's teammate, their workspace, and the abilities the token carries. Costs nothing and touches no data — the call to make first."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": {\n        \"user\": {\n            \"id\": 7,\n            \"name\": \"Mona Zaki\",\n            \"email\": \"mona@hadayek.com\"\n        },\n        \"company\": {\n            \"id\": 3,\n            \"name\": \"Hadayek Clinics\"\n        },\n        \"abilities\": [\n            \"contacts:read\",\n            \"messages:send\"\n        ]\n    }\n}","_postman_previewlanguage":"json"}]}]},{"name":"Contacts","description":"The people who talk to you — one record per person, across every channel.","item":[{"name":"List contacts","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/contacts","host":["{{base_url}}"],"path":["contacts"],"query":[{"key":"search","value":"","description":"Matches name and email (and phone, when the token's teammate may see phone numbers).","disabled":true},{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"Contacts in the workspace, newest first. `search` matches name and email; it also matches phone numbers when the token's teammate may see them.\n\n**Required ability:** `contacts:read`"},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/contacts","host":["{{base_url}}"],"path":["contacts"],"query":[{"key":"search","value":"","description":"Matches name and email (and phone, when the token's teammate may see phone numbers).","disabled":true},{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"Contacts in the workspace, newest first. `search` matches name and email; it also matches phone numbers when the token's teammate may see them.\n\n**Required ability:** `contacts:read`"},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": [\n        {\n            \"id\": 42,\n            \"name\": \"Mona Zaki\",\n            \"phone\": \"+201001234567\",\n            \"email\": \"mona@example.com\",\n            \"lifecycle_stage_id\": 3,\n            \"blocked\": false,\n            \"created_at\": \"2026-07-26T09:41:00+00:00\",\n            \"updated_at\": \"2026-07-26T09:41:00+00:00\"\n        }\n    ],\n    \"meta\": {\n        \"next_cursor\": null,\n        \"per_page\": 50\n    }\n}","_postman_previewlanguage":"json"}]},{"name":"Create a contact","request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/contacts","host":["{{base_url}}"],"path":["contacts"]},"description":"Adds a person to the workspace. A contact needs a name; give a phone or an email so you can reach them.\n\n**Required ability:** `contacts:write`","body":{"mode":"raw","raw":"{\n    \"name\": \"Mona Zaki\",\n    \"email\": \"mona@example.com\",\n    \"phone\": \"+201001234567\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Created","originalRequest":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/contacts","host":["{{base_url}}"],"path":["contacts"]},"description":"Adds a person to the workspace. A contact needs a name; give a phone or an email so you can reach them.\n\n**Required ability:** `contacts:write`","body":{"mode":"raw","raw":"{\n    \"name\": \"Mona Zaki\",\n    \"email\": \"mona@example.com\",\n    \"phone\": \"+201001234567\"\n}","options":{"raw":{"language":"json"}}}},"status":"Created","code":201,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": {\n        \"id\": 42,\n        \"name\": \"Mona Zaki\",\n        \"phone\": \"+201001234567\",\n        \"email\": \"mona@example.com\",\n        \"lifecycle_stage_id\": 3,\n        \"blocked\": false,\n        \"created_at\": \"2026-07-26T09:41:00+00:00\",\n        \"updated_at\": \"2026-07-26T09:41:00+00:00\"\n    }\n}","_postman_previewlanguage":"json"}]},{"name":"Get a contact","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/contacts/{{contact_id}}","host":["{{base_url}}"],"path":["contacts","{{contact_id}}"]},"description":"One contact by id. A contact in another workspace answers `404`.\n\n**Required ability:** `contacts:read`"},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/contacts/{{contact_id}}","host":["{{base_url}}"],"path":["contacts","{{contact_id}}"]},"description":"One contact by id. A contact in another workspace answers `404`.\n\n**Required ability:** `contacts:read`"},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": {\n        \"id\": 42,\n        \"name\": \"Mona Zaki\",\n        \"phone\": \"+201001234567\",\n        \"email\": \"mona@example.com\",\n        \"lifecycle_stage_id\": 3,\n        \"blocked\": false,\n        \"created_at\": \"2026-07-26T09:41:00+00:00\",\n        \"updated_at\": \"2026-07-26T09:41:00+00:00\"\n    }\n}","_postman_previewlanguage":"json"}]}]},{"name":"Conversations","description":"Threads with a contact on a channel.","item":[{"name":"List conversations","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/conversations","host":["{{base_url}}"],"path":["conversations"],"query":[{"key":"status","value":"","description":"Only threads in this status.","disabled":true},{"key":"contact_id","value":"","description":"","disabled":true},{"key":"channel_id","value":"","description":"","disabled":true},{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"Threads in the workspace, newest first, each with the channel it runs on.\n\n**Required ability:** `conversations:read`"},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/conversations","host":["{{base_url}}"],"path":["conversations"],"query":[{"key":"status","value":"","description":"Only threads in this status.","disabled":true},{"key":"contact_id","value":"","description":"","disabled":true},{"key":"channel_id","value":"","description":"","disabled":true},{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"Threads in the workspace, newest first, each with the channel it runs on.\n\n**Required ability:** `conversations:read`"},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": [\n        {\n            \"id\": 1024,\n            \"contact_id\": 42,\n            \"channel\": {\n                \"id\": 2,\n                \"name\": \"Clinic WhatsApp\",\n                \"type\": \"whatsapp\"\n            },\n            \"status\": \"open\",\n            \"subject\": null,\n            \"assignee\": {\n                \"type\": \"user\",\n                \"id\": 7\n            },\n            \"last_message_at\": \"2026-07-26T09:41:00+00:00\",\n            \"closed_at\": null,\n            \"created_at\": \"2026-07-26T09:12:00+00:00\"\n        }\n    ],\n    \"meta\": {\n        \"next_cursor\": null,\n        \"per_page\": 50\n    }\n}","_postman_previewlanguage":"json"}]},{"name":"Get a conversation","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/conversations/{{conversation_id}}","host":["{{base_url}}"],"path":["conversations","{{conversation_id}}"]},"description":"One thread with its channel and current assignee.\n\n**Required ability:** `conversations:read`"},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/conversations/{{conversation_id}}","host":["{{base_url}}"],"path":["conversations","{{conversation_id}}"]},"description":"One thread with its channel and current assignee.\n\n**Required ability:** `conversations:read`"},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": {\n        \"id\": 1024,\n        \"contact_id\": 42,\n        \"channel\": {\n            \"id\": 2,\n            \"name\": \"Clinic WhatsApp\",\n            \"type\": \"whatsapp\"\n        },\n        \"status\": \"open\",\n        \"subject\": null,\n        \"assignee\": {\n            \"type\": \"user\",\n            \"id\": 7\n        },\n        \"last_message_at\": \"2026-07-26T09:41:00+00:00\",\n        \"closed_at\": null,\n        \"created_at\": \"2026-07-26T09:12:00+00:00\"\n    }\n}","_postman_previewlanguage":"json"}]}]},{"name":"Messages","description":"Reading a thread, and sending into it.","item":[{"name":"List messages","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/conversations/{{conversation_id}}/messages","host":["{{base_url}}"],"path":["conversations","{{conversation_id}}","messages"],"query":[{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"A thread's messages, newest first.\n\n**Required ability:** `conversations:read`"},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/conversations/{{conversation_id}}/messages","host":["{{base_url}}"],"path":["conversations","{{conversation_id}}","messages"],"query":[{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"A thread's messages, newest first.\n\n**Required ability:** `conversations:read`"},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": [\n        {\n            \"id\": 9001,\n            \"conversation_id\": 1024,\n            \"type\": \"message\",\n            \"direction\": \"inbound\",\n            \"sender_type\": \"contact\",\n            \"user_id\": null,\n            \"body\": \"Do you open on Friday?\",\n            \"content_type\": \"text\",\n            \"status\": null,\n            \"created_at\": \"2026-07-26T09:41:00+00:00\"\n        }\n    ],\n    \"meta\": {\n        \"next_cursor\": null,\n        \"per_page\": 50\n    }\n}","_postman_previewlanguage":"json"}]},{"name":"Send a message","request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/conversations/{{conversation_id}}/messages","host":["{{base_url}}"],"path":["conversations","{{conversation_id}}","messages"]},"description":"Sends an outbound message into the thread, on whichever channel it runs on,\nattributed to the token's teammate. This is a real send: it takes the same\npath as the inbox composer, so delivery, automation and reporting all behave\nidentically.\n\nWhatsApp applies Meta's rules — outside the 24-hour customer service window\na free-form message is refused by Meta and arrives back as a failed message.\n\n**Required ability:** `messages:send`","body":{"mode":"raw","raw":"{\n    \"body\": \"Your order is on its way!\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Created","originalRequest":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/conversations/{{conversation_id}}/messages","host":["{{base_url}}"],"path":["conversations","{{conversation_id}}","messages"]},"description":"Sends an outbound message into the thread, on whichever channel it runs on,\nattributed to the token's teammate. This is a real send: it takes the same\npath as the inbox composer, so delivery, automation and reporting all behave\nidentically.\n\nWhatsApp applies Meta's rules — outside the 24-hour customer service window\na free-form message is refused by Meta and arrives back as a failed message.\n\n**Required ability:** `messages:send`","body":{"mode":"raw","raw":"{\n    \"body\": \"Your order is on its way!\"\n}","options":{"raw":{"language":"json"}}}},"status":"Created","code":201,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": {\n        \"id\": 9001,\n        \"conversation_id\": 1024,\n        \"type\": \"message\",\n        \"direction\": \"outbound\",\n        \"sender_type\": \"contact\",\n        \"user_id\": null,\n        \"body\": \"Your order is on its way!\",\n        \"content_type\": \"text\",\n        \"status\": null,\n        \"created_at\": \"2026-07-26T09:41:00+00:00\"\n    }\n}","_postman_previewlanguage":"json"}]}]},{"name":"Leads","description":"Deals on the pipeline, attached to a contact.","item":[{"name":"List leads","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/leads","host":["{{base_url}}"],"path":["leads"],"query":[{"key":"outcome","value":"","description":"`open` for deals still in play, or a closed outcome.","disabled":true},{"key":"contact_id","value":"","description":"","disabled":true},{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"Deals in the pipeline, newest first.\n\n**Required ability:** `leads:read`"},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/leads","host":["{{base_url}}"],"path":["leads"],"query":[{"key":"outcome","value":"","description":"`open` for deals still in play, or a closed outcome.","disabled":true},{"key":"contact_id","value":"","description":"","disabled":true},{"key":"per_page","value":"","description":"Rows per page. Defaults to 50, capped at 100.","disabled":true},{"key":"cursor","value":"","description":"The `meta.next_cursor` from the previous page. Opaque — pass it back unchanged.","disabled":true}]},"description":"Deals in the pipeline, newest first.\n\n**Required ability:** `leads:read`"},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": [\n        {\n            \"id\": 88,\n            \"contact_id\": 42,\n            \"name\": \"Clinic fit-out\",\n            \"value\": \"25000.00\",\n            \"source\": \"website\",\n            \"outcome\": null,\n            \"assigned_to\": 7,\n            \"closed_at\": null,\n            \"created_at\": \"2026-07-26T09:41:00+00:00\"\n        }\n    ],\n    \"meta\": {\n        \"next_cursor\": null,\n        \"per_page\": 50\n    }\n}","_postman_previewlanguage":"json"}]},{"name":"Create a lead","request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/leads","host":["{{base_url}}"],"path":["leads"]},"description":"Opens a deal against a contact. The contact must belong to this workspace, or the call answers `422`.\n\n**Required ability:** `leads:write`","body":{"mode":"raw","raw":"{\n    \"contact_id\": 42,\n    \"name\": \"Clinic fit-out\",\n    \"value\": 25000,\n    \"source\": \"website\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Created","originalRequest":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/leads","host":["{{base_url}}"],"path":["leads"]},"description":"Opens a deal against a contact. The contact must belong to this workspace, or the call answers `422`.\n\n**Required ability:** `leads:write`","body":{"mode":"raw","raw":"{\n    \"contact_id\": 42,\n    \"name\": \"Clinic fit-out\",\n    \"value\": 25000,\n    \"source\": \"website\"\n}","options":{"raw":{"language":"json"}}}},"status":"Created","code":201,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": {\n        \"id\": 88,\n        \"contact_id\": 42,\n        \"name\": \"Clinic fit-out\",\n        \"value\": \"25000.00\",\n        \"source\": \"website\",\n        \"outcome\": null,\n        \"assigned_to\": 7,\n        \"closed_at\": null,\n        \"created_at\": \"2026-07-26T09:41:00+00:00\"\n    }\n}","_postman_previewlanguage":"json"}]}]},{"name":"Webhooks","description":"Subscribe your own URL to events, so a trigger fires the moment something happens instead of polling for it.","item":[{"name":"List subscriptions","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/webhooks","host":["{{base_url}}"],"path":["webhooks"]},"description":"Every webhook subscription in the workspace, however it was created — this endpoint, or the Webhooks screen in the panel.\n\n**Required ability:** `webhooks:manage`"},"response":[{"name":"OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/webhooks","host":["{{base_url}}"],"path":["webhooks"]},"description":"Every webhook subscription in the workspace, however it was created — this endpoint, or the Webhooks screen in the panel.\n\n**Required ability:** `webhooks:manage`"},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": [\n        {\n            \"id\": 12,\n            \"name\": \"Zapier\",\n            \"target_url\": \"https://hooks.zapier.com/hooks/catch/1/abcdef/\",\n            \"events\": [\n                \"message.received\"\n            ],\n            \"is_active\": true,\n            \"consecutive_failures\": 0,\n            \"disabled_at\": null,\n            \"created_at\": \"2026-07-26T09:41:00+00:00\"\n        }\n    ],\n    \"meta\": {\n        \"next_cursor\": null,\n        \"per_page\": 50\n    }\n}","_postman_previewlanguage":"json"}]},{"name":"Subscribe to events","request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/webhooks","host":["{{base_url}}"],"path":["webhooks"]},"description":"Registers a URL to receive the events you name. Build a trigger on this rather than polling a list endpoint.\n\nThe signing secret is returned **once**, in `meta.secret` — store it, and verify every delivery against the `X-Labeeq-Signature` header. The target must be a public `https` address, re-checked at delivery time. A workspace may hold 25 subscriptions.\n\n**Required ability:** `webhooks:manage`","body":{"mode":"raw","raw":"{\n    \"target_url\": \"https://hooks.zapier.com/hooks/catch/1/abcdef/\",\n    \"events\": [\n        \"message.received\",\n        \"conversation.closed\"\n    ],\n    \"name\": \"Zapier\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Created","originalRequest":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}","description":"Any unique string of your own. Retrying with the same key returns the first response instead of repeating the work. Remembered for 24 hours."}],"url":{"raw":"{{base_url}}/webhooks","host":["{{base_url}}"],"path":["webhooks"]},"description":"Registers a URL to receive the events you name. Build a trigger on this rather than polling a list endpoint.\n\nThe signing secret is returned **once**, in `meta.secret` — store it, and verify every delivery against the `X-Labeeq-Signature` header. The target must be a public `https` address, re-checked at delivery time. A workspace may hold 25 subscriptions.\n\n**Required ability:** `webhooks:manage`","body":{"mode":"raw","raw":"{\n    \"target_url\": \"https://hooks.zapier.com/hooks/catch/1/abcdef/\",\n    \"events\": [\n        \"message.received\",\n        \"conversation.closed\"\n    ],\n    \"name\": \"Zapier\"\n}","options":{"raw":{"language":"json"}}}},"status":"Created","code":201,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n    \"data\": {\n        \"id\": 12,\n        \"name\": \"Zapier\",\n        \"target_url\": \"https://hooks.zapier.com/hooks/catch/1/abcdef/\",\n        \"events\": [\n            \"message.received\"\n        ],\n        \"is_active\": true,\n        \"consecutive_failures\": 0,\n        \"disabled_at\": null,\n        \"created_at\": \"2026-07-26T09:41:00+00:00\"\n    }\n}","_postman_previewlanguage":"json"}]},{"name":"Unsubscribe","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{base_url}}/webhooks/{{webhook_id}}","host":["{{base_url}}"],"path":["webhooks","{{webhook_id}}"]},"description":"Removes the subscription and stops delivery. A subscription that is already gone answers `404`.\n\n**Required ability:** `webhooks:manage`"},"response":[]}]}]}