{
    "info": {
        "name": "Whapier API",
        "description": "A token-authenticated REST API for WhatsApp messages, templates, contacts, campaigns, flows, webhooks, the inbox and per-message delivery status and cost. /api is version 1; /api/v2 serves the same endpoints with the outcome in the HTTP status.\n\nSet the `token` variable to an API key from Developer tools > API keys. Switch `base_url` to https://whapier.com/api/v2 for version 2.",
        "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://whapier.com",
            "type": "string"
        },
        {
            "key": "token",
            "value": "",
            "type": "string"
        },
        {
            "key": "uuid",
            "value": "",
            "type": "string"
        }
    ],
    "item": [
        {
            "name": "Verify",
            "description": "Check a key before anything else.",
            "item": [
                {
                    "name": "Verify API key",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/verify",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "verify"
                            ]
                        },
                        "description": "Confirms the Bearer token is valid and the organization subscription is active before calling other endpoints.\nHTTP 200: token OK. 401: missing/invalid token. 403: subscription inactive."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/verify",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "verify"
                                    ]
                                },
                                "description": "Confirms the Bearer token is valid and the organization subscription is active before calling other endpoints.\nHTTP 200: token OK. 401: missing/invalid token. 403: subscription inactive."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"message\": \"API key is valid and active\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Contacts",
            "description": "The people you message. A contact is one phone number per organization.",
            "item": [
                {
                    "name": "Get contact list",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contacts?page=1&per_page=10",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contacts"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number, from 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "10",
                                    "description": "Rows per page, 1 to 100 (default 10).",
                                    "disabled": false
                                },
                                {
                                    "key": "phone",
                                    "value": "",
                                    "description": "Exact number, any format.",
                                    "disabled": true
                                },
                                {
                                    "key": "email",
                                    "value": "",
                                    "description": "Exact email, case-insensitive.",
                                    "disabled": true
                                },
                                {
                                    "key": "q",
                                    "value": "",
                                    "description": "Name, email or number contains this (2 to 128 characters).",
                                    "disabled": true
                                },
                                {
                                    "key": "group",
                                    "value": "",
                                    "description": "A contact-group uuid.",
                                    "disabled": true
                                },
                                {
                                    "key": "opted_out",
                                    "value": "",
                                    "description": "true: only contacts who opted out; false: only those who did not.",
                                    "disabled": true
                                },
                                {
                                    "key": "updated_since",
                                    "value": "",
                                    "description": "Only contacts changed at or after this date (UTC).",
                                    "disabled": true
                                },
                                {
                                    "key": "source",
                                    "value": "",
                                    "description": "Where the contact came from (api, manual, import, an entry point...).",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nNewest first. Response: data (contact objects), links and meta (current_page, last_page, per_page, total).\nA contact: id, uuid, phone, first_name, last_name, email, address, metadata, groups (uuid, name), source, opted_in_at, opted_out_at, created_at, updated_at.\nSearch filters, combined with AND: phone (any format the organization's country can read; 400 when it is not a number), email (exact, case-insensitive), q (2 to 128 characters, matched against name, email and number), group (a contact-group uuid; 400 when unknown), opted_out (true | false), updated_since (a date, UTC), source (api, manual, import, entry point...)."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contacts?page=1&per_page=10",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contacts"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Page number, from 1.",
                                            "disabled": false
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "10",
                                            "description": "Rows per page, 1 to 100 (default 10).",
                                            "disabled": false
                                        },
                                        {
                                            "key": "phone",
                                            "value": "",
                                            "description": "Exact number, any format.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "email",
                                            "value": "",
                                            "description": "Exact email, case-insensitive.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "description": "Name, email or number contains this (2 to 128 characters).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "group",
                                            "value": "",
                                            "description": "A contact-group uuid.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "opted_out",
                                            "value": "",
                                            "description": "true: only contacts who opted out; false: only those who did not.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "updated_since",
                                            "value": "",
                                            "description": "Only contacts changed at or after this date (UTC).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "source",
                                            "value": "",
                                            "description": "Where the contact came from (api, manual, import, an entry point...).",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nNewest first. Response: data (contact objects), links and meta (current_page, last_page, per_page, total).\nA contact: id, uuid, phone, first_name, last_name, email, address, metadata, groups (uuid, name), source, opted_in_at, opted_out_at, created_at, updated_at.\nSearch filters, combined with AND: phone (any format the organization's country can read; 400 when it is not a number), email (exact, case-insensitive), q (2 to 128 characters, matched against name, email and number), group (a contact-group uuid; 400 when unknown), opted_out (true | false), updated_since (a date, UTC), source (api, manual, import, entry point...)."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1041,\n            \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n            \"phone\": \"+40721000001\",\n            \"first_name\": \"Ana\",\n            \"last_name\": \"Pop\",\n            \"email\": \"ana@example.com\",\n            \"address\": {\n                \"street\": null,\n                \"city\": \"Cluj-Napoca\",\n                \"state\": null,\n                \"zip\": null,\n                \"country\": \"RO\"\n            },\n            \"metadata\": {\n                \"plan\": \"gold\"\n            },\n            \"groups\": [\n                {\n                    \"uuid\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n                    \"name\": \"Leads\"\n                }\n            ],\n            \"source\": \"api\",\n            \"opted_in_at\": \"2026-10-05T09:30:00+00:00\",\n            \"opted_out_at\": null,\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"updated_at\": \"2026-10-05T09:30:00+00:00\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://whapier.com/api/contacts?page=1\",\n        \"last\": \"https://whapier.com/api/contacts?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://whapier.com/api/contacts?page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://whapier.com/api/contacts\",\n        \"per_page\": 10,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Get one contact",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contacts/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contacts",
                                "{{uuid}}"
                            ]
                        },
                        "description": "The contact object of Get contact list plus unread_messages, last_message_at and ticket (status, assigned_to: name, email).\nticket is null while ticketing is off under Settings > Tickets, or when the conversation has no ticket yet. 404 when the uuid is unknown, deleted or belongs to another workspace."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contacts/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contacts",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "The contact object of Get contact list plus unread_messages, last_message_at and ticket (status, assigned_to: name, email).\nticket is null while ticketing is off under Settings > Tickets, or when the conversation has no ticket yet. 404 when the uuid is unknown, deleted or belongs to another workspace."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1041,\n        \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n        \"phone\": \"+40721000001\",\n        \"first_name\": \"Ana\",\n        \"last_name\": \"Pop\",\n        \"email\": \"ana@example.com\",\n        \"address\": {\n            \"street\": null,\n            \"city\": \"Cluj-Napoca\",\n            \"state\": null,\n            \"zip\": null,\n            \"country\": \"RO\"\n        },\n        \"metadata\": {\n            \"plan\": \"gold\"\n        },\n        \"groups\": [\n            {\n                \"uuid\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n                \"name\": \"Leads\"\n            }\n        ],\n        \"source\": \"api\",\n        \"opted_in_at\": \"2026-10-05T09:30:00+00:00\",\n        \"opted_out_at\": null,\n        \"created_at\": \"2026-10-05T09:30:00+00:00\",\n        \"updated_at\": \"2026-10-05T09:30:00+00:00\",\n        \"unread_messages\": 2,\n        \"last_message_at\": \"2026-10-05T09:30:00+00:00\",\n        \"ticket\": {\n            \"status\": \"open\",\n            \"assigned_to\": {\n                \"name\": \"Maria Ionescu\",\n                \"email\": \"maria@example.com\"\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Add contact",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contacts",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contacts"
                            ]
                        },
                        "description": "JSON body fields:\nphone (required) — international number; validated and stored as E.164. Must be unique per organization (400 if duplicate).\nfirst_name, last_name, email (optional) — omit, null, or \"\" for contacts without names.\nstreet, city, state, zip, country (optional) — stored in address JSON.\nmetadata (optional) — arbitrary JSON-serializable value.\ngroup (optional) — array of contact-group UUID strings.\nmarketing_opt_in (optional, boolean) — true records marketing consent on the contact (GDPR consent trail, source: api); false records an opt-out. Omit to leave consent unchanged.\nResponses: 200 success { statusCode, id, message }; 400 validation; 403 subscription inactive or contact limit reached.\nAccepts an Idempotency-Key header (see Before you start).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"first_name\": \"Ana\",\n    \"last_name\": \"Pop\",\n    \"email\": \"ana@example.com\",\n    \"group\": [\n        \"d746e4c5-db24-4fb2-be03-590421344d69\"\n    ],\n    \"marketing_opt_in\": true\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contacts",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contacts"
                                    ]
                                },
                                "description": "JSON body fields:\nphone (required) — international number; validated and stored as E.164. Must be unique per organization (400 if duplicate).\nfirst_name, last_name, email (optional) — omit, null, or \"\" for contacts without names.\nstreet, city, state, zip, country (optional) — stored in address JSON.\nmetadata (optional) — arbitrary JSON-serializable value.\ngroup (optional) — array of contact-group UUID strings.\nmarketing_opt_in (optional, boolean) — true records marketing consent on the contact (GDPR consent trail, source: api); false records an opt-out. Omit to leave consent unchanged.\nResponses: 200 success { statusCode, id, message }; 400 validation; 403 subscription inactive or contact limit reached.\nAccepts an Idempotency-Key header (see Before you start).",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"first_name\": \"Ana\",\n    \"last_name\": \"Pop\",\n    \"email\": \"ana@example.com\",\n    \"group\": [\n        \"d746e4c5-db24-4fb2-be03-590421344d69\"\n    ],\n    \"marketing_opt_in\": true\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Bulk create or update contacts",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contacts/bulk",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contacts",
                                "bulk"
                            ]
                        },
                        "description": "contacts (required, 1 to 500 objects) with the fields of Add contact per row. A row whose phone the workspace already has is updated with the fields present (as Edit contact does); a new number is created.\nEach row stands alone: one bad row fails alone and the others go through. Response: { statusCode, created, updated, failed: [ { index, phone, errors } ], limit_reached, message }.\nCreating stops at the plan's contact limit: limit_reached is true and the rows that did not fit are listed in failed. Updates never count against the limit. Accepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"contacts\": [\n        {\n            \"phone\": \"+40721000001\",\n            \"first_name\": \"Ana\",\n            \"last_name\": \"Pop\",\n            \"email\": \"ana@example.com\"\n        },\n        {\n            \"phone\": \"0721 000 002\",\n            \"first_name\": \"Ion\",\n            \"group\": [\n                \"d746e4c5-db24-4fb2-be03-590421344d69\"\n            ]\n        },\n        {\n            \"phone\": \"not-a-phone\",\n            \"first_name\": \"Nobody\"\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contacts/bulk",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contacts",
                                        "bulk"
                                    ]
                                },
                                "description": "contacts (required, 1 to 500 objects) with the fields of Add contact per row. A row whose phone the workspace already has is updated with the fields present (as Edit contact does); a new number is created.\nEach row stands alone: one bad row fails alone and the others go through. Response: { statusCode, created, updated, failed: [ { index, phone, errors } ], limit_reached, message }.\nCreating stops at the plan's contact limit: limit_reached is true and the rows that did not fit are listed in failed. Updates never count against the limit. Accepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"contacts\": [\n        {\n            \"phone\": \"+40721000001\",\n            \"first_name\": \"Ana\",\n            \"last_name\": \"Pop\",\n            \"email\": \"ana@example.com\"\n        },\n        {\n            \"phone\": \"0721 000 002\",\n            \"first_name\": \"Ion\",\n            \"group\": [\n                \"d746e4c5-db24-4fb2-be03-590421344d69\"\n            ]\n        },\n        {\n            \"phone\": \"not-a-phone\",\n            \"first_name\": \"Nobody\"\n        }\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"created\": 1,\n    \"updated\": 1,\n    \"failed\": [\n        {\n            \"index\": 2,\n            \"phone\": \"not-a-phone\",\n            \"errors\": {\n                \"phone\": [\n                    \"The phone number is not valid.\"\n                ]\n            }\n        }\n    ],\n    \"limit_reached\": false,\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Edit contact",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contacts/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contacts",
                                "{{uuid}}"
                            ]
                        },
                        "description": "Same JSON fields as Add contact. Path {uuid} is the contact id returned when created.\nphone is optional on an update; if you change it, the new number must not belong to another contact (400 duplicate).\nUpdating with the same phone as this contact is allowed.\nFields you leave out keep their value; send a field as null or \"\" to clear it. metadata keys you send are merged into the stored ones, the others are kept.\nmarketing_opt_in (optional, boolean) — true records marketing consent (source: api), false records an opt-out; omitted leaves consent unchanged.\n404 when the uuid is unknown, deleted or belongs to another workspace.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"first_name\": \"Ana\",\n    \"last_name\": \"Popescu\",\n    \"metadata\": {\n        \"plan\": \"platinum\"\n    }\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contacts/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contacts",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "Same JSON fields as Add contact. Path {uuid} is the contact id returned when created.\nphone is optional on an update; if you change it, the new number must not belong to another contact (400 duplicate).\nUpdating with the same phone as this contact is allowed.\nFields you leave out keep their value; send a field as null or \"\" to clear it. metadata keys you send are merged into the stored ones, the others are kept.\nmarketing_opt_in (optional, boolean) — true records marketing consent (source: api), false records an opt-out; omitted leaves consent unchanged.\n404 when the uuid is unknown, deleted or belongs to another workspace.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"first_name\": \"Ana\",\n    \"last_name\": \"Popescu\",\n    \"metadata\": {\n        \"plan\": \"platinum\"\n    }\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Delete contact",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contacts/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contacts",
                                "{{uuid}}"
                            ]
                        },
                        "description": "Soft-deletes the contact; it leaves every list at once. 404 when the uuid is unknown or already deleted.\nResponse: { statusCode, id, message }."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "DELETE",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contacts/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contacts",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "Soft-deletes the contact; it leaves every list at once. 404 when the uuid is unknown or already deleted.\nResponse: { statusCode, id, message }."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Contact groups",
            "description": "Named lists of contacts; a campaign can target one.",
            "item": [
                {
                    "name": "Get contact group list",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contact-groups?page=1&per_page=10",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contact-groups"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number, from 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "10",
                                    "description": "Rows per page, 1 to 100 (default 10).",
                                    "disabled": false
                                }
                            ]
                        },
                        "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nEach group: uuid, name, contacts_count (live members), created_at, updated_at."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contact-groups?page=1&per_page=10",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contact-groups"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Page number, from 1.",
                                            "disabled": false
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "10",
                                            "description": "Rows per page, 1 to 100 (default 10).",
                                            "disabled": false
                                        }
                                    ]
                                },
                                "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nEach group: uuid, name, contacts_count (live members), created_at, updated_at."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"uuid\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n            \"name\": \"Leads\",\n            \"contacts_count\": 42,\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"updated_at\": \"2026-10-05T09:30:00+00:00\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://whapier.com/api/contact-groups?page=1\",\n        \"last\": \"https://whapier.com/api/contact-groups?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://whapier.com/api/contact-groups?page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://whapier.com/api/contact-groups\",\n        \"per_page\": 10,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Add contact group",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contact-groups",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contact-groups"
                            ]
                        },
                        "description": "name (required) must be unique among the organization's groups (400 if taken).\nResponse: { statusCode, id, message }. Accepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Lead 5\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contact-groups",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contact-groups"
                                    ]
                                },
                                "description": "name (required) must be unique among the organization's groups (400 if taken).\nResponse: { statusCode, id, message }. Accepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"Lead 5\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Edit contact group",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contact-groups/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contact-groups",
                                "{{uuid}}"
                            ]
                        },
                        "description": "Same body as Add contact group. 404 for an unknown uuid.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Lead 5\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contact-groups/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contact-groups",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "Same body as Add contact group. 404 for an unknown uuid.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"Lead 5\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Delete contact group",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contact-groups/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contact-groups",
                                "{{uuid}}"
                            ]
                        },
                        "description": "Removes the group and its memberships; the contacts themselves are kept. 404 for an unknown uuid."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "DELETE",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contact-groups/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contact-groups",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "Removes the group and its memberships; the contacts themselves are kept. 404 for an unknown uuid."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Automated replies",
            "description": "Canned replies: a trigger phrase and the text, image or audio sent back.",
            "item": [
                {
                    "name": "Get automated replies list",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/canned-replies?page=1&per_page=10",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "canned-replies"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number, from 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "10",
                                    "description": "Rows per page, 1 to 100 (default 10).",
                                    "disabled": false
                                }
                            ]
                        },
                        "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nEach reply: uuid, name, trigger, match_criteria, response_type, response (the text, or null for media), file (name, url) or null, created_at, updated_at."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/canned-replies?page=1&per_page=10",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "canned-replies"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Page number, from 1.",
                                            "disabled": false
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "10",
                                            "description": "Rows per page, 1 to 100 (default 10).",
                                            "disabled": false
                                        }
                                    ]
                                },
                                "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nEach reply: uuid, name, trigger, match_criteria, response_type, response (the text, or null for media), file (name, url) or null, created_at, updated_at."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"uuid\": \"de6fe115-4c30-4c8d-9245-6ae31c1c820f\",\n            \"name\": \"About Us\",\n            \"trigger\": \"what do you do?\",\n            \"match_criteria\": \"contains\",\n            \"response_type\": \"text\",\n            \"response\": \"We sell shoes\",\n            \"file\": null,\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"updated_at\": \"2026-10-05T09:30:00+00:00\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://whapier.com/api/canned-replies?page=1\",\n        \"last\": \"https://whapier.com/api/canned-replies?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://whapier.com/api/canned-replies?page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://whapier.com/api/canned-replies\",\n        \"per_page\": 10,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Add automated reply",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/canned-replies",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "canned-replies"
                            ]
                        },
                        "description": "Body: name and trigger (max 255), match_criteria (exact match | contains), response_type (text | image | audio), response.\nFor text, response is the reply (max 4096). For image or audio send multipart/form-data with the file as response (png/jpg up to 5 MB; mp3/aac/ogg/amr/opus/m4a up to 16 MB); without a file the request is a 400.\nResponse: { statusCode, id, message }. 403 when the plan's limit of canned replies is reached. Accepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"About Us\",\n    \"trigger\": \"what do you do?\",\n    \"match_criteria\": \"contains\",\n    \"response_type\": \"text\",\n    \"response\": \"We sell shoes\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/canned-replies",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "canned-replies"
                                    ]
                                },
                                "description": "Body: name and trigger (max 255), match_criteria (exact match | contains), response_type (text | image | audio), response.\nFor text, response is the reply (max 4096). For image or audio send multipart/form-data with the file as response (png/jpg up to 5 MB; mp3/aac/ogg/amr/opus/m4a up to 16 MB); without a file the request is a 400.\nResponse: { statusCode, id, message }. 403 when the plan's limit of canned replies is reached. Accepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"About Us\",\n    \"trigger\": \"what do you do?\",\n    \"match_criteria\": \"contains\",\n    \"response_type\": \"text\",\n    \"response\": \"We sell shoes\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"de6fe115-4c30-4c8d-9245-6ae31c1c820f\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Edit automated reply",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/canned-replies/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "canned-replies",
                                "{{uuid}}"
                            ]
                        },
                        "description": "Same fields as Add automated reply. An update without a file keeps the media it already has. 404 for an unknown uuid.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"About Us\",\n    \"trigger\": \"what do you do?\",\n    \"match_criteria\": \"contains\",\n    \"response_type\": \"text\",\n    \"response\": \"We sell shoes and clothes\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/canned-replies/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "canned-replies",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "Same fields as Add automated reply. An update without a file keeps the media it already has. 404 for an unknown uuid.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"About Us\",\n    \"trigger\": \"what do you do?\",\n    \"match_criteria\": \"contains\",\n    \"response_type\": \"text\",\n    \"response\": \"We sell shoes and clothes\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"de6fe115-4c30-4c8d-9245-6ae31c1c820f\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Delete automated reply",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/canned-replies/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "canned-replies",
                                "{{uuid}}"
                            ]
                        },
                        "description": "404 for an unknown uuid. Response: { statusCode, id, message }."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "DELETE",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/canned-replies/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "canned-replies",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "404 for an unknown uuid. Response: { statusCode, id, message }."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"id\": \"de6fe115-4c30-4c8d-9245-6ae31c1c820f\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "WhatsApp lines",
            "description": "The connected WhatsApp numbers a send can go from.",
            "item": [
                {
                    "name": "List connections",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/whatsapp-connections",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "whatsapp-connections"
                            ]
                        },
                        "description": "Returns each line's uuid (use as whatsapp_connection on /api/send). No internal database ids.\nEach row: uuid, type, name, phone, display_phone_number and, for a WhatsApp Business line, verified_name and number_status. 403 when no line is connected."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/whatsapp-connections",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "whatsapp-connections"
                                    ]
                                },
                                "description": "Returns each line's uuid (use as whatsapp_connection on /api/send). No internal database ids.\nEach row: uuid, type, name, phone, display_phone_number and, for a WhatsApp Business line, verified_name and number_status. 403 when no line is connected."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": [\n        {\n            \"uuid\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n            \"type\": \"waba\",\n            \"name\": \"Main line\",\n            \"phone\": \"+40700000000\",\n            \"display_phone_number\": \"+40 700 000 000\",\n            \"verified_name\": \"Example Shoes\",\n            \"number_status\": \"CONNECTED\"\n        }\n    ]\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Messages",
            "description": "One message to one phone number. Every send shares the same guards and the same answer.",
            "item": [
                {
                    "name": "Send message",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send"
                            ]
                        },
                        "description": "Optional: whatsapp_connection (UUID from GET /api/whatsapp-connections). Omit to use the organization default line.\nphone (required) — any format; normalised to E.164 with the organization's country. A new number becomes a contact (first_name, last_name, email optional).\nmessage (required, max 4096); header and footer (optional, max 60); buttons (optional, up to 3 of { id, title }).\nFree-form messages need an open 24-hour window: 422 when the customer's last message is older than a day. 403: subscription, plan limit, trial daily allowance or an account under review.\nResponse: 200 { statusCode, data: { success, data: { chat: { uuid, wam_id, status, type, created_at, contact } } } }. A refusal by WhatsApp is 200 with data.success false and data.data.error on /api; an HTTP 422 on /api/v2.\nAccepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Hello Ana, how are you?\",\n    \"whatsapp_connection\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"header\": \"Example Shoes\",\n    \"footer\": \"Reply STOP to opt out\",\n    \"buttons\": [\n        {\n            \"id\": \"yes\",\n            \"title\": \"Fine\"\n        },\n        {\n            \"id\": \"no\",\n            \"title\": \"Not well\"\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send"
                                    ]
                                },
                                "description": "Optional: whatsapp_connection (UUID from GET /api/whatsapp-connections). Omit to use the organization default line.\nphone (required) — any format; normalised to E.164 with the organization's country. A new number becomes a contact (first_name, last_name, email optional).\nmessage (required, max 4096); header and footer (optional, max 60); buttons (optional, up to 3 of { id, title }).\nFree-form messages need an open 24-hour window: 422 when the customer's last message is older than a day. 403: subscription, plan limit, trial daily allowance or an account under review.\nResponse: 200 { statusCode, data: { success, data: { chat: { uuid, wam_id, status, type, created_at, contact } } } }. A refusal by WhatsApp is 200 with data.success false and data.data.error on /api; an HTTP 422 on /api/v2.\nAccepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Hello Ana, how are you?\",\n    \"whatsapp_connection\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"header\": \"Example Shoes\",\n    \"footer\": \"Reply STOP to opt out\",\n    \"buttons\": [\n        {\n            \"id\": \"yes\",\n            \"title\": \"Fine\"\n        },\n        {\n            \"id\": \"no\",\n            \"title\": \"Not well\"\n        }\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Send media",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/media",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "media"
                            ]
                        },
                        "description": "Optional: whatsapp_connection (UUID from GET /api/whatsapp-connections). Omit to use the organization default line.\nmedia_type (image | video | audio | document | sticker); media_url (https, a public host; checked with one HEAD request against WhatsApp's size and type caps - 400 with the reason otherwise); caption (optional, not for audio); file_name (required for document).\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"media_type\": \"image\",\n    \"media_url\": \"https://cdn.example.com/offers/october.jpg\",\n    \"caption\": \"Our October offers\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/media",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "media"
                                    ]
                                },
                                "description": "Optional: whatsapp_connection (UUID from GET /api/whatsapp-connections). Omit to use the organization default line.\nmedia_type (image | video | audio | document | sticker); media_url (https, a public host; checked with one HEAD request against WhatsApp's size and type caps - 400 with the reason otherwise); caption (optional, not for audio); file_name (required for document).\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"media_type\": \"image\",\n    \"media_url\": \"https://cdn.example.com/offers/october.jpg\",\n    \"caption\": \"Our October offers\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Send template message",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/template",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "template"
                            ]
                        },
                        "description": "Optional: \"whatsapp_connection\": \"<uuid>\" for a specific WABA line (UUID from GET /api/whatsapp-connections).\ntemplate.name and template.language (\"en\" or { \"code\": \"en\" }) are required; components follow WhatsApp's own shape (header, body, button parameters).\nWorks outside the 24-hour window. A contact who opted out (STOP) is not sent a MARKETING template: 422. Utility and authentication templates still go.\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"template\": {\n        \"name\": \"order_update\",\n        \"language\": {\n            \"code\": \"en\"\n        },\n        \"components\": [\n            {\n                \"type\": \"header\",\n                \"parameters\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"48213\"\n                    }\n                ]\n            },\n            {\n                \"type\": \"body\",\n                \"parameters\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"Ana\"\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"48213\"\n                    },\n                    {\n                        \"type\": \"date_time\",\n                        \"date_time\": {\n                            \"fallback_value\": \"October 7, 2026\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"type\": \"button\",\n                \"sub_type\": \"url\",\n                \"index\": \"0\",\n                \"parameters\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"48213\"\n                    }\n                ]\n            }\n        ]\n    }\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/template",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "template"
                                    ]
                                },
                                "description": "Optional: \"whatsapp_connection\": \"<uuid>\" for a specific WABA line (UUID from GET /api/whatsapp-connections).\ntemplate.name and template.language (\"en\" or { \"code\": \"en\" }) are required; components follow WhatsApp's own shape (header, body, button parameters).\nWorks outside the 24-hour window. A contact who opted out (STOP) is not sent a MARKETING template: 422. Utility and authentication templates still go.\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"template\": {\n        \"name\": \"order_update\",\n        \"language\": {\n            \"code\": \"en\"\n        },\n        \"components\": [\n            {\n                \"type\": \"header\",\n                \"parameters\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"48213\"\n                    }\n                ]\n            },\n            {\n                \"type\": \"body\",\n                \"parameters\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"Ana\"\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"48213\"\n                    },\n                    {\n                        \"type\": \"date_time\",\n                        \"date_time\": {\n                            \"fallback_value\": \"October 7, 2026\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"type\": \"button\",\n                \"sub_type\": \"url\",\n                \"index\": \"0\",\n                \"parameters\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"48213\"\n                    }\n                ]\n            }\n        ]\n    }\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Send location",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/location",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "location"
                            ]
                        },
                        "description": "latitude (-90 to 90) and longitude (-180 to 180) required; name and address optional.\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"latitude\": 46.77120000000000032969182939268648624420166015625,\n    \"longitude\": 23.623599999999999710098563809879124164581298828125,\n    \"name\": \"Example Shoes\",\n    \"address\": \"Str. Memorandumului 12, Cluj-Napoca\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/location",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "location"
                                    ]
                                },
                                "description": "latitude (-90 to 90) and longitude (-180 to 180) required; name and address optional.\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"latitude\": 46.77120000000000032969182939268648624420166015625,\n    \"longitude\": 23.623599999999999710098563809879124164581298828125,\n    \"name\": \"Example Shoes\",\n    \"address\": \"Str. Memorandumului 12, Cluj-Napoca\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Send contact cards",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/contacts",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "contacts"
                            ]
                        },
                        "description": "contacts (1 to 10 cards) in WhatsApp's contacts[] shape: name.formatted_name required; phones[], emails[], addresses[], org optional.\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"contacts\": [\n        {\n            \"name\": {\n                \"formatted_name\": \"Example Shoes Support\",\n                \"first_name\": \"Support\"\n            },\n            \"phones\": [\n                {\n                    \"phone\": \"+40700000000\",\n                    \"type\": \"WORK\"\n                }\n            ],\n            \"emails\": [\n                {\n                    \"email\": \"support@example.com\",\n                    \"type\": \"WORK\"\n                }\n            ]\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/contacts",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "contacts"
                                    ]
                                },
                                "description": "contacts (1 to 10 cards) in WhatsApp's contacts[] shape: name.formatted_name required; phones[], emails[], addresses[], org optional.\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"contacts\": [\n        {\n            \"name\": {\n                \"formatted_name\": \"Example Shoes Support\",\n                \"first_name\": \"Support\"\n            },\n            \"phones\": [\n                {\n                    \"phone\": \"+40700000000\",\n                    \"type\": \"WORK\"\n                }\n            ],\n            \"emails\": [\n                {\n                    \"email\": \"support@example.com\",\n                    \"type\": \"WORK\"\n                }\n            ]\n        }\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Send reaction",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/reaction",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "reaction"
                            ]
                        },
                        "description": "message_id (the wam_id of the message to react to) and emoji (required; \"\" removes the reaction).\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n    \"emoji\": \"👍\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/reaction",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "reaction"
                                    ]
                                },
                                "description": "message_id (the wam_id of the message to react to) and emoji (required; \"\" removes the reaction).\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n    \"emoji\": \"👍\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Request location",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/location-request",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "location-request"
                            ]
                        },
                        "description": "message (required, max 1024): the text shown above the \"Send location\" button.\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Where should we deliver?\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/location-request",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "location-request"
                                    ]
                                },
                                "description": "message (required, max 1024): the text shown above the \"Send location\" button.\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Where should we deliver?\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Request contact info",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/request-contact-info",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "request-contact-info"
                            ]
                        },
                        "description": "message (required, max 1024): asks a username-only WhatsApp user to share their phone number.\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Could you share your number so we can call you back?\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/request-contact-info",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "request-contact-info"
                                    ]
                                },
                                "description": "message (required, max 1024): asks a username-only WhatsApp user to share their phone number.\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Could you share your number so we can call you back?\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Send carousel",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/send/carousel",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "send",
                                "carousel"
                            ]
                        },
                        "description": "message (required, max 1024) and cards (2 to 10): header { type: image | video, link } required; body (max 160), url_button { text, url } and quick_replies (up to 3 of { id, title }) optional.\nSame guards and response as Send message.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Our new arrivals\",\n    \"cards\": [\n        {\n            \"header\": {\n                \"type\": \"image\",\n                \"link\": \"https://cdn.example.com/shoes/1.jpg\"\n            },\n            \"body\": \"Runner, 89 EUR\",\n            \"url_button\": {\n                \"text\": \"See it\",\n                \"url\": \"https://example.com/shoes/1\"\n            }\n        },\n        {\n            \"header\": {\n                \"type\": \"image\",\n                \"link\": \"https://cdn.example.com/shoes/2.jpg\"\n            },\n            \"body\": \"Trail, 119 EUR\",\n            \"quick_replies\": [\n                {\n                    \"id\": \"trail\",\n                    \"title\": \"Tell me more\"\n                }\n            ]\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/send/carousel",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "send",
                                        "carousel"
                                    ]
                                },
                                "description": "message (required, max 1024) and cards (2 to 10): header { type: image | video, link } required; body (max 160), url_button { text, url } and quick_replies (up to 3 of { id, title }) optional.\nSame guards and response as Send message.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"phone\": \"+40721000001\",\n    \"message\": \"Our new arrivals\",\n    \"cards\": [\n        {\n            \"header\": {\n                \"type\": \"image\",\n                \"link\": \"https://cdn.example.com/shoes/1.jpg\"\n            },\n            \"body\": \"Runner, 89 EUR\",\n            \"url_button\": {\n                \"text\": \"See it\",\n                \"url\": \"https://example.com/shoes/1\"\n            }\n        },\n        {\n            \"header\": {\n                \"type\": \"image\",\n                \"link\": \"https://cdn.example.com/shoes/2.jpg\"\n            },\n            \"body\": \"Trail, 119 EUR\",\n            \"quick_replies\": [\n                {\n                    \"id\": \"trail\",\n                    \"title\": \"Tell me more\"\n                }\n            ]\n        }\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"success\": true,\n        \"data\": {\n            \"chat\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"sent\",\n                \"type\": \"outbound\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\",\n                \"contact\": {\n                    \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                    \"phone\": \"+40721000001\"\n                }\n            }\n        }\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Flows",
            "description": "Start a published flow for a contact without waiting for an inbound message.",
            "item": [
                {
                    "name": "Start a flow",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/flows/{{uuid}}/start",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "flows",
                                "{{uuid}}",
                                "start"
                            ]
                        },
                        "description": "contact (required): the contact's uuid or phone (normalised with the organization's country).\n200 { statusCode, success: true, message }; 404 flow or contact unknown; 422 flow not published; 409 the contact is already in a flow session.\nWhatever the flow sends is subject to the 24-hour window unless it uses template nodes.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"contact\": \"+40721000001\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/flows/{{uuid}}/start",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "flows",
                                        "{{uuid}}",
                                        "start"
                                    ]
                                },
                                "description": "contact (required): the contact's uuid or phone (normalised with the organization's country).\n200 { statusCode, success: true, message }; 404 flow or contact unknown; 422 flow not published; 409 the contact is already in a flow session.\nWhatever the flow sends is subject to the 24-hour window unless it uses template nodes.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"contact\": \"+40721000001\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"success\": true,\n    \"message\": \"Flow started.\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Campaigns",
            "description": "A template sent to a group of contacts, now or at a scheduled time.",
            "item": [
                {
                    "name": "List campaigns",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/campaigns?page=1&per_page=10",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "campaigns"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number, from 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "10",
                                    "description": "Rows per page, 1 to 100 (default 10).",
                                    "disabled": false
                                },
                                {
                                    "key": "search",
                                    "value": "",
                                    "description": "Matches the campaign or template name.",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Optional: ?page=1&per_page=10&search=\nEach campaign: uuid, name, status, scheduled_at, created_at, started_at (when it began sending), completed_at (when it was completed, failed or stopped), template (uuid, name, language, category, status), whatsapp_connection (uuid, name, type), audience (type: all | group | segment, uuid, name), counts (contacts, sent, delivered, read, failed)."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/campaigns?page=1&per_page=10",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "campaigns"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Page number, from 1.",
                                            "disabled": false
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "10",
                                            "description": "Rows per page, 1 to 100 (default 10).",
                                            "disabled": false
                                        },
                                        {
                                            "key": "search",
                                            "value": "",
                                            "description": "Matches the campaign or template name.",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Optional: ?page=1&per_page=10&search=\nEach campaign: uuid, name, status, scheduled_at, created_at, started_at (when it began sending), completed_at (when it was completed, failed or stopped), template (uuid, name, language, category, status), whatsapp_connection (uuid, name, type), audience (type: all | group | segment, uuid, name), counts (contacts, sent, delivered, read, failed)."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"uuid\": \"3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f\",\n            \"name\": \"Billing reminder blast\",\n            \"status\": \"completed\",\n            \"scheduled_at\": \"2026-10-05T09:30:00+00:00\",\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"template\": {\n                \"uuid\": \"281a3383-985c-4084-bcb0-9ec523c952de\",\n                \"name\": \"order_update\",\n                \"language\": \"en\",\n                \"category\": \"UTILITY\",\n                \"status\": \"APPROVED\"\n            },\n            \"whatsapp_connection\": {\n                \"uuid\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n                \"name\": \"Main line\",\n                \"type\": \"waba\"\n            },\n            \"audience\": {\n                \"type\": \"group\",\n                \"uuid\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n                \"name\": \"Leads\"\n            },\n            \"counts\": {\n                \"contacts\": 120,\n                \"sent\": 118,\n                \"delivered\": 110,\n                \"read\": 64,\n                \"failed\": 2\n            }\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://whapier.com/api/campaigns?page=1\",\n        \"last\": \"https://whapier.com/api/campaigns?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://whapier.com/api/campaigns?page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://whapier.com/api/campaigns\",\n        \"per_page\": 10,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Create campaign (WABA template with variables)",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/campaigns",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "campaigns"
                            ]
                        },
                        "description": "Use when whatsapp_connection is a WhatsApp Cloud (WABA) line from GET /api/whatsapp-connections.\n\nPREREQUISITES\n- template: UUID of a row from GET /api/templates (organization-scoped), NOT the public template name string.\n- Match variable counts to your approved template: open the template metadata in the UI or Meta — BODY uses {{1}}, {{2}}, … in order.\n- You must supply one body parameter for each BODY placeholder, in the same order. A count that does not match the approved template is refused up front (422), not by WhatsApp afterwards.\n\nFIELD NOTES\n- contacts: \"all\" or a contact-group uuid; or segment: a saved segment's uuid (one of the two, not both). send_immediately: true, or scheduled_at (a date, read as UTC).\n- header: optional object; omitted means { \"format\": \"TEXT\", \"parameters\": [] }.\n- body: use body.parameters[] for variables. API format (recommended): { \"type\": \"text\", \"value\": \"literal for {{1}}\" } per slot.\nAlternative (dashboard-style): { \"selection\": \"static\", \"value\": \"...\" } or { \"selection\": \"dynamic\", \"value\": \"first name\" } (maps contact fields).\n- footer / buttons: optional; use [] or {} if unused. Templates with URL/quick-reply variables need buttons[] shaped like the web campaign form.\n- Media header (IMAGE|VIDEO|DOCUMENT): header.parameters[] with type (IMAGE|VIDEO|DOCUMENT), \"selection\": \"link\", \"value\": \"https://...\" (public URL; API cannot upload files).\n\nRESPONSE: 200 { \"statusCode\": 200, \"uuid\": \"...\", \"message\": \"...\" }. Poll GET /api/campaigns/{uuid} for the report and GET /api/campaigns/{uuid}/logs for per-recipient status, or subscribe to the campaign.finished webhook.\n403 when the plan's campaign limit is reached. Accepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Billing reminder blast\",\n    \"whatsapp_connection\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"contacts\": \"all\",\n    \"send_immediately\": true,\n    \"template\": \"281a3383-985c-4084-bcb0-9ec523c952de\",\n    \"header\": {\n        \"format\": \"TEXT\",\n        \"parameters\": []\n    },\n    \"body\": {\n        \"parameters\": [\n            {\n                \"type\": \"text\",\n                \"value\": \"Ana\"\n            },\n            {\n                \"type\": \"text\",\n                \"value\": \"48213\"\n            },\n            {\n                \"type\": \"text\",\n                \"value\": \"7 October 2026\"\n            }\n        ]\n    },\n    \"footer\": {},\n    \"buttons\": []\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/campaigns",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "campaigns"
                                    ]
                                },
                                "description": "Use when whatsapp_connection is a WhatsApp Cloud (WABA) line from GET /api/whatsapp-connections.\n\nPREREQUISITES\n- template: UUID of a row from GET /api/templates (organization-scoped), NOT the public template name string.\n- Match variable counts to your approved template: open the template metadata in the UI or Meta — BODY uses {{1}}, {{2}}, … in order.\n- You must supply one body parameter for each BODY placeholder, in the same order. A count that does not match the approved template is refused up front (422), not by WhatsApp afterwards.\n\nFIELD NOTES\n- contacts: \"all\" or a contact-group uuid; or segment: a saved segment's uuid (one of the two, not both). send_immediately: true, or scheduled_at (a date, read as UTC).\n- header: optional object; omitted means { \"format\": \"TEXT\", \"parameters\": [] }.\n- body: use body.parameters[] for variables. API format (recommended): { \"type\": \"text\", \"value\": \"literal for {{1}}\" } per slot.\nAlternative (dashboard-style): { \"selection\": \"static\", \"value\": \"...\" } or { \"selection\": \"dynamic\", \"value\": \"first name\" } (maps contact fields).\n- footer / buttons: optional; use [] or {} if unused. Templates with URL/quick-reply variables need buttons[] shaped like the web campaign form.\n- Media header (IMAGE|VIDEO|DOCUMENT): header.parameters[] with type (IMAGE|VIDEO|DOCUMENT), \"selection\": \"link\", \"value\": \"https://...\" (public URL; API cannot upload files).\n\nRESPONSE: 200 { \"statusCode\": 200, \"uuid\": \"...\", \"message\": \"...\" }. Poll GET /api/campaigns/{uuid} for the report and GET /api/campaigns/{uuid}/logs for per-recipient status, or subscribe to the campaign.finished webhook.\n403 when the plan's campaign limit is reached. Accepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"Billing reminder blast\",\n    \"whatsapp_connection\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n    \"contacts\": \"all\",\n    \"send_immediately\": true,\n    \"template\": \"281a3383-985c-4084-bcb0-9ec523c952de\",\n    \"header\": {\n        \"format\": \"TEXT\",\n        \"parameters\": []\n    },\n    \"body\": {\n        \"parameters\": [\n            {\n                \"type\": \"text\",\n                \"value\": \"Ana\"\n            },\n            {\n                \"type\": \"text\",\n                \"value\": \"48213\"\n            },\n            {\n                \"type\": \"text\",\n                \"value\": \"7 October 2026\"\n            }\n        ]\n    },\n    \"footer\": {},\n    \"buttons\": []\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"uuid\": \"3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f\",\n    \"message\": \"Campaign created successfully!\"\n}"
                        }
                    ]
                },
                {
                    "name": "Get one campaign with its report",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/campaigns/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "campaigns",
                                "{{uuid}}"
                            ]
                        },
                        "description": "The campaign object of List campaigns plus report: counts (contacts, sent, delivered, read, failed, pending), failure_reasons (code, title, count - the ten most frequent), started_at, finished_at (null until the campaign is over), paused_reason, paused_detail and paused_at (null unless the status is paused).\npaused_reason is user (paused from the dashboard or the API), admin, failing, failure_rate or quality (paused by the platform; paused_detail says why). 404 for an unknown campaign."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/campaigns/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "campaigns",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "The campaign object of List campaigns plus report: counts (contacts, sent, delivered, read, failed, pending), failure_reasons (code, title, count - the ten most frequent), started_at, finished_at (null until the campaign is over), paused_reason, paused_detail and paused_at (null unless the status is paused).\npaused_reason is user (paused from the dashboard or the API), admin, failing, failure_rate or quality (paused by the platform; paused_detail says why). 404 for an unknown campaign."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"uuid\": \"3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f\",\n        \"name\": \"Billing reminder blast\",\n        \"status\": \"completed\",\n        \"scheduled_at\": \"2026-10-05T09:30:00+00:00\",\n        \"created_at\": \"2026-10-05T09:30:00+00:00\",\n        \"template\": {\n            \"uuid\": \"281a3383-985c-4084-bcb0-9ec523c952de\",\n            \"name\": \"order_update\",\n            \"language\": \"en\",\n            \"category\": \"UTILITY\",\n            \"status\": \"APPROVED\"\n        },\n        \"whatsapp_connection\": {\n            \"uuid\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n            \"name\": \"Main line\",\n            \"type\": \"waba\"\n        },\n        \"audience\": {\n            \"type\": \"group\",\n            \"uuid\": \"d746e4c5-db24-4fb2-be03-590421344d69\",\n            \"name\": \"Leads\"\n        },\n        \"counts\": {\n            \"contacts\": 120,\n            \"sent\": 118,\n            \"delivered\": 110,\n            \"read\": 64,\n            \"failed\": 2\n        },\n        \"report\": {\n            \"counts\": {\n                \"contacts\": 120,\n                \"sent\": 118,\n                \"delivered\": 110,\n                \"read\": 64,\n                \"failed\": 2,\n                \"pending\": 0\n            },\n            \"failure_reasons\": [\n                {\n                    \"code\": 131026,\n                    \"title\": \"Message undeliverable\",\n                    \"count\": 2\n                }\n            ],\n            \"started_at\": \"2026-10-05T09:30:00+00:00\",\n            \"finished_at\": \"2026-10-05T09:41:12+00:00\",\n            \"paused_reason\": null,\n            \"paused_detail\": null,\n            \"paused_at\": null\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Pause a campaign",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/campaigns/{{uuid}}/pause",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "campaigns",
                                "{{uuid}}",
                                "pause"
                            ]
                        },
                        "description": "No body. Only a scheduled or ongoing campaign can be paused: 409 otherwise, with the status the campaign is in. The logs stay as they are and resume picks them up.\nResponse: { statusCode, status, message } - status is the campaign's new status. 404 for an unknown campaign.",
                        "body": {
                            "mode": "raw",
                            "raw": "{}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/campaigns/{{uuid}}/pause",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "campaigns",
                                        "{{uuid}}",
                                        "pause"
                                    ]
                                },
                                "description": "No body. Only a scheduled or ongoing campaign can be paused: 409 otherwise, with the status the campaign is in. The logs stay as they are and resume picks them up.\nResponse: { statusCode, status, message } - status is the campaign's new status. 404 for an unknown campaign.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"status\": \"paused\",\n    \"message\": \"Campaign paused.\"\n}"
                        }
                    ]
                },
                {
                    "name": "Resume a campaign",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/campaigns/{{uuid}}/resume",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "campaigns",
                                "{{uuid}}",
                                "resume"
                            ]
                        },
                        "description": "No body. Only a paused campaign can be resumed: 409 otherwise. A campaign paused before its hour goes back to scheduled; one paused while sending goes back to ongoing.\nResponse: { statusCode, status, message }. 404 for an unknown campaign.",
                        "body": {
                            "mode": "raw",
                            "raw": "{}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/campaigns/{{uuid}}/resume",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "campaigns",
                                        "{{uuid}}",
                                        "resume"
                                    ]
                                },
                                "description": "No body. Only a paused campaign can be resumed: 409 otherwise. A campaign paused before its hour goes back to scheduled; one paused while sending goes back to ongoing.\nResponse: { statusCode, status, message }. 404 for an unknown campaign.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"status\": \"ongoing\",\n    \"message\": \"Campaign resumed.\"\n}"
                        }
                    ]
                },
                {
                    "name": "Cancel a campaign",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/campaigns/{{uuid}}/cancel",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "campaigns",
                                "{{uuid}}",
                                "cancel"
                            ]
                        },
                        "description": "No body. A scheduled, ongoing or paused campaign can be cancelled: 409 otherwise. What was not sent stays unsent; the report keeps showing who was reached.\nResponse: { statusCode, status, message }. 404 for an unknown campaign.",
                        "body": {
                            "mode": "raw",
                            "raw": "{}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/campaigns/{{uuid}}/cancel",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "campaigns",
                                        "{{uuid}}",
                                        "cancel"
                                    ]
                                },
                                "description": "No body. A scheduled, ongoing or paused campaign can be cancelled: 409 otherwise. What was not sent stays unsent; the report keeps showing who was reached.\nResponse: { statusCode, status, message }. 404 for an unknown campaign.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"status\": \"cancelled\",\n    \"message\": \"Campaign cancelled.\"\n}"
                        }
                    ]
                },
                {
                    "name": "Campaign logs",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/campaigns/{{uuid}}/logs?page=1&per_page=10",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "campaigns",
                                "{{uuid}}",
                                "logs"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number, from 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "10",
                                    "description": "Rows per page, 1 to 100 (default 10).",
                                    "disabled": false
                                },
                                {
                                    "key": "search",
                                    "value": "",
                                    "description": "Matches the contact name or phone.",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Optional: ?page=1&per_page=10&search= (search contact name/phone).\nEach row: contact (uuid, phone, first_name, last_name), status, message (uuid, wam_id, status) or null, error (code, title, reason) or null, retry_count, created_at, updated_at. 404 for an unknown campaign."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/campaigns/{{uuid}}/logs?page=1&per_page=10",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "campaigns",
                                        "{{uuid}}",
                                        "logs"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Page number, from 1.",
                                            "disabled": false
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "10",
                                            "description": "Rows per page, 1 to 100 (default 10).",
                                            "disabled": false
                                        },
                                        {
                                            "key": "search",
                                            "value": "",
                                            "description": "Matches the contact name or phone.",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Optional: ?page=1&per_page=10&search= (search contact name/phone).\nEach row: contact (uuid, phone, first_name, last_name), status, message (uuid, wam_id, status) or null, error (code, title, reason) or null, retry_count, created_at, updated_at. 404 for an unknown campaign."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"contact\": {\n                \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                \"phone\": \"+40721000001\",\n                \"first_name\": \"Ana\",\n                \"last_name\": \"Pop\"\n            },\n            \"status\": \"failed\",\n            \"message\": {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"status\": \"failed\"\n            },\n            \"error\": {\n                \"code\": 131026,\n                \"title\": \"Message undeliverable\",\n                \"reason\": \"The recipient is not a WhatsApp user or has blocked this number.\"\n            },\n            \"retry_count\": 0,\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"updated_at\": \"2026-10-05T09:30:00+00:00\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://whapier.com/api/campaigns/3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f/logs?page=1\",\n        \"last\": \"https://whapier.com/api/campaigns/3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f/logs?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://whapier.com/api/campaigns/3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f/logs?page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://whapier.com/api/campaigns/3f1c2d0e-5b7a-4c8d-9e0f-1a2b3c4d5e6f/logs\",\n        \"per_page\": 10,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Templates",
            "description": "The message templates WhatsApp approved for the organization.",
            "item": [
                {
                    "name": "List templates",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/templates?page=1&per_page=10",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "templates"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Page number, from 1.",
                                    "disabled": false
                                },
                                {
                                    "key": "per_page",
                                    "value": "10",
                                    "description": "Rows per page, 1 to 100 (default 10).",
                                    "disabled": false
                                }
                            ]
                        },
                        "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nEach template: uuid, name, language, category, status, components (as WhatsApp approved them), variables (header, body, buttons: how many placeholders each part takes), rejection (why it was rejected, or null), quality_score, updated_at."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/templates?page=1&per_page=10",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "templates"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Page number, from 1.",
                                            "disabled": false
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "10",
                                            "description": "Rows per page, 1 to 100 (default 10).",
                                            "disabled": false
                                        }
                                    ]
                                },
                                "description": "Optional query: ?page=1&per_page=10 (per_page max 100).\nEach template: uuid, name, language, category, status, components (as WhatsApp approved them), variables (header, body, buttons: how many placeholders each part takes), rejection (why it was rejected, or null), quality_score, updated_at."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"uuid\": \"281a3383-985c-4084-bcb0-9ec523c952de\",\n            \"name\": \"order_update\",\n            \"language\": \"en\",\n            \"category\": \"UTILITY\",\n            \"status\": \"APPROVED\",\n            \"components\": [\n                {\n                    \"type\": \"HEADER\",\n                    \"format\": \"TEXT\",\n                    \"text\": \"Order {{1}}\"\n                },\n                {\n                    \"type\": \"BODY\",\n                    \"text\": \"Hi {{1}}, your order {{2}} ships on {{3}}.\"\n                },\n                {\n                    \"type\": \"FOOTER\",\n                    \"text\": \"Example Shoes\"\n                },\n                {\n                    \"type\": \"BUTTONS\",\n                    \"buttons\": [\n                        {\n                            \"type\": \"URL\",\n                            \"text\": \"Track\",\n                            \"url\": \"https://example.com/track/{{1}}\"\n                        }\n                    ]\n                }\n            ],\n            \"variables\": {\n                \"header\": 1,\n                \"body\": 3,\n                \"buttons\": 1\n            },\n            \"rejection\": null,\n            \"quality_score\": \"GREEN\",\n            \"updated_at\": \"2026-10-05T09:30:00+00:00\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://whapier.com/api/templates?page=1\",\n        \"last\": \"https://whapier.com/api/templates?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Previous\",\n                \"active\": false\n            },\n            {\n                \"url\": \"https://whapier.com/api/templates?page=1\",\n                \"label\": \"1\",\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Next &raquo;\",\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://whapier.com/api/templates\",\n        \"per_page\": 10,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Get one template with a ready-to-send example",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/templates/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "templates",
                                "{{uuid}}"
                            ],
                            "query": [
                                {
                                    "key": "whatsapp_connection",
                                    "value": "",
                                    "description": "The line uuid, when the same template exists on several lines.",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "The template object of List templates plus example_payload: a complete body for POST /api/send/template with one parameter per placeholder (the examples the template was submitted with, else a value naming the slot), a link for a media header and a suffix for each URL button with a variable.\nOptional query: whatsapp_connection (a line uuid) when the same template exists on several lines. 404 for an unknown uuid."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/templates/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "templates",
                                        "{{uuid}}"
                                    ],
                                    "query": [
                                        {
                                            "key": "whatsapp_connection",
                                            "value": "",
                                            "description": "The line uuid, when the same template exists on several lines.",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "The template object of List templates plus example_payload: a complete body for POST /api/send/template with one parameter per placeholder (the examples the template was submitted with, else a value naming the slot), a link for a media header and a suffix for each URL button with a variable.\nOptional query: whatsapp_connection (a line uuid) when the same template exists on several lines. 404 for an unknown uuid."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"uuid\": \"281a3383-985c-4084-bcb0-9ec523c952de\",\n        \"name\": \"order_update\",\n        \"language\": \"en\",\n        \"category\": \"UTILITY\",\n        \"status\": \"APPROVED\",\n        \"components\": [\n            {\n                \"type\": \"HEADER\",\n                \"format\": \"TEXT\",\n                \"text\": \"Order {{1}}\"\n            },\n            {\n                \"type\": \"BODY\",\n                \"text\": \"Hi {{1}}, your order {{2}} ships on {{3}}.\"\n            },\n            {\n                \"type\": \"FOOTER\",\n                \"text\": \"Example Shoes\"\n            },\n            {\n                \"type\": \"BUTTONS\",\n                \"buttons\": [\n                    {\n                        \"type\": \"URL\",\n                        \"text\": \"Track\",\n                        \"url\": \"https://example.com/track/{{1}}\"\n                    }\n                ]\n            }\n        ],\n        \"variables\": {\n            \"header\": 1,\n            \"body\": 3,\n            \"buttons\": 1\n        },\n        \"rejection\": null,\n        \"quality_score\": \"GREEN\",\n        \"updated_at\": \"2026-10-05T09:30:00+00:00\",\n        \"example_payload\": {\n            \"phone\": \"+40721000001\",\n            \"template\": {\n                \"name\": \"order_update\",\n                \"language\": {\n                    \"code\": \"en\"\n                },\n                \"components\": [\n                    {\n                        \"type\": \"header\",\n                        \"parameters\": [\n                            {\n                                \"type\": \"text\",\n                                \"text\": \"48213\"\n                            }\n                        ]\n                    },\n                    {\n                        \"type\": \"body\",\n                        \"parameters\": [\n                            {\n                                \"type\": \"text\",\n                                \"text\": \"Ana\"\n                            },\n                            {\n                                \"type\": \"text\",\n                                \"text\": \"48213\"\n                            },\n                            {\n                                \"type\": \"text\",\n                                \"text\": \"October 7\"\n                            }\n                        ]\n                    },\n                    {\n                        \"type\": \"button\",\n                        \"sub_type\": \"url\",\n                        \"index\": \"0\",\n                        \"parameters\": [\n                            {\n                                \"type\": \"text\",\n                                \"text\": \"48213\"\n                            }\n                        ]\n                    }\n                ]\n            }\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Create template",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/templates",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "templates"
                            ]
                        },
                        "description": "name (lowercase letters, digits and underscores), category (MARKETING | UTILITY) and language (a Meta language code such as en or pt_BR) are required; whatsapp_connection (a WhatsApp Business line uuid) is optional - the default line otherwise.\nheader (optional): { format: TEXT, text (max 60, one {{1}} allowed), examples } or { format: IMAGE | VIDEO | DOCUMENT, media_url: a public https link to a sample file }.\nbody.text (required, max 1024, placeholders {{1}}, {{2}}, ...) with body.examples, one per placeholder; footer (optional, max 60); buttons (optional, up to 10): { type: QUICK_REPLY | URL | PHONE_NUMBER | COPY_CODE, text, url, phone_number, example }.\nResponse: 200 { statusCode, uuid, status, message } - status is PENDING until Meta reviews it (the template.status.update webhook tells you). 400 with Meta's reason when Meta refuses it; AUTHENTICATION templates cannot be submitted through the API yet. A sandbox key cannot submit (403). Accepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"order_update\",\n    \"category\": \"UTILITY\",\n    \"language\": \"en\",\n    \"header\": {\n        \"format\": \"TEXT\",\n        \"text\": \"Order {{1}}\",\n        \"examples\": [\n            \"48213\"\n        ]\n    },\n    \"body\": {\n        \"text\": \"Hi {{1}}, your order {{2}} ships on {{3}}.\",\n        \"examples\": [\n            \"Ana\",\n            \"48213\",\n            \"October 7\"\n        ]\n    },\n    \"footer\": \"Example Shoes\",\n    \"buttons\": [\n        {\n            \"type\": \"URL\",\n            \"text\": \"Track\",\n            \"url\": \"https://example.com/track/{{1}}\",\n            \"example\": \"48213\"\n        },\n        {\n            \"type\": \"QUICK_REPLY\",\n            \"text\": \"Stop updates\"\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/templates",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "templates"
                                    ]
                                },
                                "description": "name (lowercase letters, digits and underscores), category (MARKETING | UTILITY) and language (a Meta language code such as en or pt_BR) are required; whatsapp_connection (a WhatsApp Business line uuid) is optional - the default line otherwise.\nheader (optional): { format: TEXT, text (max 60, one {{1}} allowed), examples } or { format: IMAGE | VIDEO | DOCUMENT, media_url: a public https link to a sample file }.\nbody.text (required, max 1024, placeholders {{1}}, {{2}}, ...) with body.examples, one per placeholder; footer (optional, max 60); buttons (optional, up to 10): { type: QUICK_REPLY | URL | PHONE_NUMBER | COPY_CODE, text, url, phone_number, example }.\nResponse: 200 { statusCode, uuid, status, message } - status is PENDING until Meta reviews it (the template.status.update webhook tells you). 400 with Meta's reason when Meta refuses it; AUTHENTICATION templates cannot be submitted through the API yet. A sandbox key cannot submit (403). Accepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"order_update\",\n    \"category\": \"UTILITY\",\n    \"language\": \"en\",\n    \"header\": {\n        \"format\": \"TEXT\",\n        \"text\": \"Order {{1}}\",\n        \"examples\": [\n            \"48213\"\n        ]\n    },\n    \"body\": {\n        \"text\": \"Hi {{1}}, your order {{2}} ships on {{3}}.\",\n        \"examples\": [\n            \"Ana\",\n            \"48213\",\n            \"October 7\"\n        ]\n    },\n    \"footer\": \"Example Shoes\",\n    \"buttons\": [\n        {\n            \"type\": \"URL\",\n            \"text\": \"Track\",\n            \"url\": \"https://example.com/track/{{1}}\",\n            \"example\": \"48213\"\n        },\n        {\n            \"type\": \"QUICK_REPLY\",\n            \"text\": \"Stop updates\"\n        }\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"uuid\": \"281a3383-985c-4084-bcb0-9ec523c952de\",\n    \"status\": \"PENDING\",\n    \"message\": \"Template submitted to Meta for review.\"\n}"
                        }
                    ]
                },
                {
                    "name": "Sync templates from Meta",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/templates/sync",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "templates",
                                "sync"
                            ]
                        },
                        "description": "No body. Pulls the templates of every WhatsApp Business line from Meta, as the dashboard's refresh does, so a template changed in Meta Business Manager shows up here.\nResponse: { statusCode, synced, message } - synced is how many templates were added or changed. A sandbox key cannot sync (403); 400 when Meta refused the request.",
                        "body": {
                            "mode": "raw",
                            "raw": "{}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/templates/sync",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "templates",
                                        "sync"
                                    ]
                                },
                                "description": "No body. Pulls the templates of every WhatsApp Business line from Meta, as the dashboard's refresh does, so a template changed in Meta Business Manager shows up here.\nResponse: { statusCode, synced, message } - synced is how many templates were added or changed. A sandbox key cannot sync (403); 400 when Meta refused the request.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"synced\": 2,\n    \"message\": \"Templates synced.\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Webhooks",
            "description": "The https endpoints that receive your events, and the catalogue of events. Needs the Webhooks module on the plan.",
            "item": [
                {
                    "name": "List webhooks",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/webhooks",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "webhooks"
                            ]
                        },
                        "description": "Each row: uuid, url, events, secret_preview (the last six characters of the signing secret), created_at, updated_at. The full secret is shown once, in the answer to Add webhook.\n403 when the Webhooks module is not on the plan."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/webhooks",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "webhooks"
                                    ]
                                },
                                "description": "Each row: uuid, url, events, secret_preview (the last six characters of the signing secret), created_at, updated_at. The full secret is shown once, in the answer to Add webhook.\n403 when the Webhooks module is not on the plan."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": [\n        {\n            \"uuid\": \"c0a8012e-7d3b-4f1a-9c2e-5b6d7e8f9a0b\",\n            \"url\": \"https://example.com/hooks/whapier\",\n            \"events\": [\n                \"message.received\",\n                \"message.status\",\n                \"campaign.finished\"\n            ],\n            \"secret_preview\": \"…k3Q9zT\",\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"updated_at\": \"2026-10-05T09:30:00+00:00\"\n        }\n    ]\n}"
                        }
                    ]
                },
                {
                    "name": "List events",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/webhooks/events",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "webhooks",
                                "events"
                            ]
                        },
                        "description": "Every event a webhook can receive: data (name, description). The Webhooks page in the dashboard reads the same catalogue.\nA delivery is { event, data }; the shape of data per event is under Before you start > Webhooks, and POST /api/webhooks/{uuid}/test delivers a sample of any of them."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/webhooks/events",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "webhooks",
                                        "events"
                                    ]
                                },
                                "description": "Every event a webhook can receive: data (name, description). The Webhooks page in the dashboard reads the same catalogue.\nA delivery is { event, data }; the shape of data per event is under Before you start > Webhooks, and POST /api/webhooks/{uuid}/test delivers a sample of any of them."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": [\n        {\n            \"name\": \"message.received\",\n            \"description\": \"A customer sent a message to one of your numbers.\"\n        },\n        {\n            \"name\": \"message.sent\",\n            \"description\": \"A message left one of your numbers (API, inbox, campaign or flow).\"\n        },\n        {\n            \"name\": \"message.status\",\n            \"description\": \"The delivery status of a message you sent changed: sent, delivered, read or failed.\"\n        },\n        {\n            \"name\": \"message.status.update\",\n            \"description\": \"The raw status notification from Meta, as received.\"\n        },\n        {\n            \"name\": \"contact.created\",\n            \"description\": \"A contact was added.\"\n        },\n        {\n            \"name\": \"contact.updated\",\n            \"description\": \"A contact was changed.\"\n        },\n        {\n            \"name\": \"contact.deleted\",\n            \"description\": \"A contact was deleted.\"\n        },\n        {\n            \"name\": \"contact.opted_out\",\n            \"description\": \"A contact asked to stop receiving marketing messages.\"\n        },\n        {\n            \"name\": \"contact.opted_in\",\n            \"description\": \"A contact gave or renewed consent to marketing messages.\"\n        },\n        {\n            \"name\": \"group.created\",\n            \"description\": \"A contact group was added.\"\n        },\n        {\n            \"name\": \"group.updated\",\n            \"description\": \"A contact group was changed.\"\n        },\n        {\n            \"name\": \"group.deleted\",\n            \"description\": \"A contact group was deleted.\"\n        },\n        {\n            \"name\": \"autoreply.created\",\n            \"description\": \"A canned reply was added.\"\n        },\n        {\n            \"name\": \"autoreply.updated\",\n            \"description\": \"A canned reply was changed.\"\n        },\n        {\n            \"name\": \"autoreply.deleted\",\n            \"description\": \"A canned reply was deleted.\"\n        },\n        {\n            \"name\": \"campaign.finished\",\n            \"description\": \"A campaign finished sending, failed or was stopped, with its final counts.\"\n        },\n        {\n            \"name\": \"ticket.created\",\n            \"description\": \"A conversation was opened as a ticket.\"\n        },\n        {\n            \"name\": \"ticket.closed\",\n            \"description\": \"A conversation ticket was resolved.\"\n        },\n        {\n            \"name\": \"template.status.update\",\n            \"description\": \"Meta approved, rejected, paused or disabled one of your templates.\"\n        },\n        {\n            \"name\": \"template.quality.update\",\n            \"description\": \"Meta changed the quality rating of one of your templates.\"\n        },\n        {\n            \"name\": \"account.update\",\n            \"description\": \"Meta changed something about your WhatsApp Business Account or one of its numbers.\"\n        }\n    ]\n}"
                        }
                    ]
                },
                {
                    "name": "Add webhook",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/webhooks",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "webhooks"
                            ]
                        },
                        "description": "url (required, https, unique per organization) and events (required, one or more names from GET /api/webhooks/events).\nResponse: { statusCode, uuid, secret, message } - the only time the full secret is returned; store it to check X-Whapier-Signature. Accepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"url\": \"https://example.com/hooks/whapier\",\n    \"events\": [\n        \"message.received\",\n        \"message.status\",\n        \"campaign.finished\"\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/webhooks",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "webhooks"
                                    ]
                                },
                                "description": "url (required, https, unique per organization) and events (required, one or more names from GET /api/webhooks/events).\nResponse: { statusCode, uuid, secret, message } - the only time the full secret is returned; store it to check X-Whapier-Signature. Accepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"url\": \"https://example.com/hooks/whapier\",\n    \"events\": [\n        \"message.received\",\n        \"message.status\",\n        \"campaign.finished\"\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"uuid\": \"c0a8012e-7d3b-4f1a-9c2e-5b6d7e8f9a0b\",\n    \"secret\": \"Vq3n8hZcY2LkR0dXp7aWbT4fJ1sMoE9uG6yKiN5vCwHk3Q9zT\",\n    \"message\": \"Webhook url added successfully!\"\n}"
                        }
                    ]
                },
                {
                    "name": "Edit webhook",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/webhooks/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "webhooks",
                                "{{uuid}}"
                            ]
                        },
                        "description": "Same body as Add webhook. The events list replaces the stored one; the secret stays as it is. 404 for an unknown uuid.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"url\": \"https://example.com/hooks/whapier\",\n    \"events\": [\n        \"message.received\",\n        \"message.status\"\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/webhooks/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "webhooks",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "Same body as Add webhook. The events list replaces the stored one; the secret stays as it is. 404 for an unknown uuid.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"url\": \"https://example.com/hooks/whapier\",\n    \"events\": [\n        \"message.received\",\n        \"message.status\"\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"uuid\": \"c0a8012e-7d3b-4f1a-9c2e-5b6d7e8f9a0b\",\n    \"message\": \"Webhook url updated successfully!\"\n}"
                        }
                    ]
                },
                {
                    "name": "Delete webhook",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/webhooks/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "webhooks",
                                "{{uuid}}"
                            ]
                        },
                        "description": "Removes the endpoint and its subscriptions; nothing is delivered to it any more. Response: { statusCode, uuid, message }. 404 for an unknown uuid."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "DELETE",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/webhooks/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "webhooks",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "Removes the endpoint and its subscriptions; nothing is delivered to it any more. Response: { statusCode, uuid, message }. 404 for an unknown uuid."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"uuid\": \"c0a8012e-7d3b-4f1a-9c2e-5b6d7e8f9a0b\",\n    \"message\": \"Webhook url removed successfully!\"\n}"
                        }
                    ]
                },
                {
                    "name": "Send a test event",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/webhooks/{{uuid}}/test",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "webhooks",
                                "{{uuid}}",
                                "test"
                            ]
                        },
                        "description": "event (required): a name from GET /api/webhooks/events. The sample payload is posted to the url as { event, data, test: true }, signed with the secret in X-Whapier-Signature.\nResponse: { statusCode, event, delivered, http_status, message } - delivered is false with the status your endpoint answered, or http_status null when it could not be reached. 404 for an unknown uuid.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"event\": \"message.status\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/webhooks/{{uuid}}/test",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "webhooks",
                                        "{{uuid}}",
                                        "test"
                                    ]
                                },
                                "description": "event (required): a name from GET /api/webhooks/events. The sample payload is posted to the url as { event, data, test: true }, signed with the secret in X-Whapier-Signature.\nResponse: { statusCode, event, delivered, http_status, message } - delivered is false with the status your endpoint answered, or http_status null when it could not be reached. 404 for an unknown uuid.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"event\": \"message.status\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"event\": \"message.status\",\n    \"delivered\": true,\n    \"http_status\": 200,\n    \"message\": \"Test event has been sent successfully!\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Message status",
            "description": "Delivery status, failure reason and cost per message.",
            "item": [
                {
                    "name": "List messages",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/messages?status=failed&per_page=25",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "messages"
                            ],
                            "query": [
                                {
                                    "key": "status",
                                    "value": "failed",
                                    "description": "sent, delivered, read, failed, accepted or played.",
                                    "disabled": false
                                },
                                {
                                    "key": "direction",
                                    "value": "",
                                    "description": "inbound or outbound.",
                                    "disabled": true
                                },
                                {
                                    "key": "since",
                                    "value": "",
                                    "description": "Only messages created at or after this date (UTC).",
                                    "disabled": true
                                },
                                {
                                    "key": "until",
                                    "value": "",
                                    "description": "Only messages created at or before this date (UTC).",
                                    "disabled": true
                                },
                                {
                                    "key": "contact",
                                    "value": "",
                                    "description": "A contact uuid: only the messages exchanged with that contact.",
                                    "disabled": true
                                },
                                {
                                    "key": "campaign",
                                    "value": "",
                                    "description": "A campaign uuid: only the messages that campaign produced.",
                                    "disabled": true
                                },
                                {
                                    "key": "wam_id",
                                    "value": "",
                                    "description": "The WhatsApp message id of one message.",
                                    "disabled": true
                                },
                                {
                                    "key": "api_key",
                                    "value": "",
                                    "description": "An API key uuid, or current for the key making the request: only the messages sent with that key.",
                                    "disabled": true
                                },
                                {
                                    "key": "page",
                                    "value": "",
                                    "description": "Page number, from 1.",
                                    "disabled": true
                                },
                                {
                                    "key": "per_page",
                                    "value": "25",
                                    "description": "Rows per page, 1 to 100 (default 25).",
                                    "disabled": false
                                }
                            ]
                        },
                        "description": "Optional query: status (sent | delivered | read | failed | accepted | played), direction (inbound | outbound), since and until (dates, UTC), contact (a contact uuid), campaign (a campaign uuid: the messages it produced), wam_id (one message by WhatsApp id), api_key (a key uuid, or current: the messages sent with the key making the request), page, per_page (default 25, max 100).\nResponse: { statusCode, data: [ message ], meta: { page, per_page, total, last_page } }. 404 when contact, campaign or api_key is unknown.\nA message: uuid, wam_id, direction, status, type, content, created_at, delivered_at, read_at, failed_at, failure (code, title, reason, retryable) or null, pricing (category, model, billable, amount, currency, country), api_key (uuid, name) or null when it was not sent through the API, contact (uuid, phone, first_name, last_name).\ncontent by type - text: body, header, footer, buttons (type, text); template: name, language, body; image, video, audio, document, sticker: caption, media (type, url, filename); interactive and button: text, payload (what the customer pressed); location: latitude, longitude, name, address; contacts: contacts (name, phones); reaction: emoji, wam_id."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/messages?status=failed&per_page=25",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "messages"
                                    ],
                                    "query": [
                                        {
                                            "key": "status",
                                            "value": "failed",
                                            "description": "sent, delivered, read, failed, accepted or played.",
                                            "disabled": false
                                        },
                                        {
                                            "key": "direction",
                                            "value": "",
                                            "description": "inbound or outbound.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "since",
                                            "value": "",
                                            "description": "Only messages created at or after this date (UTC).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "until",
                                            "value": "",
                                            "description": "Only messages created at or before this date (UTC).",
                                            "disabled": true
                                        },
                                        {
                                            "key": "contact",
                                            "value": "",
                                            "description": "A contact uuid: only the messages exchanged with that contact.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "campaign",
                                            "value": "",
                                            "description": "A campaign uuid: only the messages that campaign produced.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "wam_id",
                                            "value": "",
                                            "description": "The WhatsApp message id of one message.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "api_key",
                                            "value": "",
                                            "description": "An API key uuid, or current for the key making the request: only the messages sent with that key.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "page",
                                            "value": "",
                                            "description": "Page number, from 1.",
                                            "disabled": true
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "25",
                                            "description": "Rows per page, 1 to 100 (default 25).",
                                            "disabled": false
                                        }
                                    ]
                                },
                                "description": "Optional query: status (sent | delivered | read | failed | accepted | played), direction (inbound | outbound), since and until (dates, UTC), contact (a contact uuid), campaign (a campaign uuid: the messages it produced), wam_id (one message by WhatsApp id), api_key (a key uuid, or current: the messages sent with the key making the request), page, per_page (default 25, max 100).\nResponse: { statusCode, data: [ message ], meta: { page, per_page, total, last_page } }. 404 when contact, campaign or api_key is unknown.\nA message: uuid, wam_id, direction, status, type, content, created_at, delivered_at, read_at, failed_at, failure (code, title, reason, retryable) or null, pricing (category, model, billable, amount, currency, country), api_key (uuid, name) or null when it was not sent through the API, contact (uuid, phone, first_name, last_name).\ncontent by type - text: body, header, footer, buttons (type, text); template: name, language, body; image, video, audio, document, sticker: caption, media (type, url, filename); interactive and button: text, payload (what the customer pressed); location: latitude, longitude, name, address; contacts: contacts (name, phones); reaction: emoji, wam_id."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": [\n        {\n            \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n            \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n            \"direction\": \"outbound\",\n            \"status\": \"delivered\",\n            \"type\": \"template\",\n            \"content\": {\n                \"name\": \"order_update\",\n                \"language\": \"en\",\n                \"body\": \"Hi Ana, your order 48213 ships on October 7.\"\n            },\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"delivered_at\": \"2026-10-05T09:30:04+00:00\",\n            \"read_at\": null,\n            \"failed_at\": null,\n            \"failure\": null,\n            \"pricing\": {\n                \"category\": \"utility\",\n                \"model\": \"PMP\",\n                \"billable\": true,\n                \"amount\": 0.03529999999999999804600747665972448885440826416015625,\n                \"currency\": \"EUR\",\n                \"country\": \"RO\"\n            },\n            \"api_key\": {\n                \"uuid\": \"5b0e9a52-7c1d-4f0e-9a3b-2d6c8e1f4a70\",\n                \"name\": \"CRM sync\"\n            },\n            \"contact\": {\n                \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                \"phone\": \"+40721000001\",\n                \"first_name\": \"Ana\",\n                \"last_name\": \"Pop\"\n            }\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 25,\n        \"total\": 1,\n        \"last_page\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Conversation with a contact",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/contacts/{{uuid}}/messages?per_page=25",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "contacts",
                                "{{uuid}}",
                                "messages"
                            ],
                            "query": [
                                {
                                    "key": "per_page",
                                    "value": "25",
                                    "description": "Messages per page, 1 to 100 (default 25).",
                                    "disabled": false
                                },
                                {
                                    "key": "before",
                                    "value": "",
                                    "description": "The uuid of the oldest message you have; the answer is what came before it.",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "The same message objects as List messages, for one contact, newest first. Optional query: per_page (default 25, max 100), before (the uuid of the oldest message you already have).\nResponse: { statusCode, data: [ message ], meta: { per_page, has_more, next_before } } - pass next_before as before to get the older messages. 404 for an unknown contact or cursor."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/contacts/{{uuid}}/messages?per_page=25",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "contacts",
                                        "{{uuid}}",
                                        "messages"
                                    ],
                                    "query": [
                                        {
                                            "key": "per_page",
                                            "value": "25",
                                            "description": "Messages per page, 1 to 100 (default 25).",
                                            "disabled": false
                                        },
                                        {
                                            "key": "before",
                                            "value": "",
                                            "description": "The uuid of the oldest message you have; the answer is what came before it.",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "The same message objects as List messages, for one contact, newest first. Optional query: per_page (default 25, max 100), before (the uuid of the oldest message you already have).\nResponse: { statusCode, data: [ message ], meta: { per_page, has_more, next_before } } - pass next_before as before to get the older messages. 404 for an unknown contact or cursor."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": [\n        {\n            \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n            \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n            \"direction\": \"outbound\",\n            \"status\": \"delivered\",\n            \"type\": \"template\",\n            \"content\": {\n                \"name\": \"order_update\",\n                \"language\": \"en\",\n                \"body\": \"Hi Ana, your order 48213 ships on October 7.\"\n            },\n            \"created_at\": \"2026-10-05T09:30:00+00:00\",\n            \"delivered_at\": \"2026-10-05T09:30:04+00:00\",\n            \"read_at\": null,\n            \"failed_at\": null,\n            \"failure\": null,\n            \"pricing\": {\n                \"category\": \"utility\",\n                \"model\": \"PMP\",\n                \"billable\": true,\n                \"amount\": 0.03529999999999999804600747665972448885440826416015625,\n                \"currency\": \"EUR\",\n                \"country\": \"RO\"\n            },\n            \"api_key\": {\n                \"uuid\": \"5b0e9a52-7c1d-4f0e-9a3b-2d6c8e1f4a70\",\n                \"name\": \"CRM sync\"\n            },\n            \"contact\": {\n                \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n                \"phone\": \"+40721000001\",\n                \"first_name\": \"Ana\",\n                \"last_name\": \"Pop\"\n            }\n        }\n    ],\n    \"meta\": {\n        \"per_page\": 25,\n        \"has_more\": false,\n        \"next_before\": null\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Get one message",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/messages/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "messages",
                                "{{uuid}}"
                            ]
                        },
                        "description": "The same message object plus history: a list of { status, timestamp, recorded_at }, every status change WhatsApp reported. 404 for an unknown uuid."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/messages/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "messages",
                                        "{{uuid}}"
                                    ]
                                },
                                "description": "The same message object plus history: a list of { status, timestamp, recorded_at }, every status change WhatsApp reported. 404 for an unknown uuid."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n        \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n        \"direction\": \"outbound\",\n        \"status\": \"delivered\",\n        \"type\": \"template\",\n        \"content\": {\n            \"name\": \"order_update\",\n            \"language\": \"en\",\n            \"body\": \"Hi Ana, your order 48213 ships on October 7.\"\n        },\n        \"created_at\": \"2026-10-05T09:30:00+00:00\",\n        \"delivered_at\": \"2026-10-05T09:30:04+00:00\",\n        \"read_at\": null,\n        \"failed_at\": null,\n        \"failure\": null,\n        \"pricing\": {\n            \"category\": \"utility\",\n            \"model\": \"PMP\",\n            \"billable\": true,\n            \"amount\": 0.03529999999999999804600747665972448885440826416015625,\n            \"currency\": \"EUR\",\n            \"country\": \"RO\"\n        },\n        \"api_key\": {\n            \"uuid\": \"5b0e9a52-7c1d-4f0e-9a3b-2d6c8e1f4a70\",\n            \"name\": \"CRM sync\"\n        },\n        \"contact\": {\n            \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n            \"phone\": \"+40721000001\",\n            \"first_name\": \"Ana\",\n            \"last_name\": \"Pop\"\n        },\n        \"history\": [\n            {\n                \"status\": \"sent\",\n                \"timestamp\": \"2026-10-05T09:30:00+00:00\",\n                \"recorded_at\": \"2026-10-05T09:30:01+00:00\"\n            },\n            {\n                \"status\": \"delivered\",\n                \"timestamp\": \"2026-10-05T09:30:04+00:00\",\n                \"recorded_at\": \"2026-10-05T09:30:05+00:00\"\n            }\n        ]\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Usage",
            "description": "The plan, what is used of it, what went out and what it cost.",
            "item": [
                {
                    "name": "Plan and usage",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/usage",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "usage"
                            ]
                        },
                        "description": "Response data: plan (name, status, valid_until), limits (contacts, messages, campaigns: used, limit; limit null = unlimited), trial_daily_messages (trial accounts only), messages_sent (today, last_7_days, last_30_days), estimated_cost (last_30_days: amount, currency), rate_limit (per_minute)."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/usage",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "usage"
                                    ]
                                },
                                "description": "Response data: plan (name, status, valid_until), limits (contacts, messages, campaigns: used, limit; limit null = unlimited), trial_daily_messages (trial accounts only), messages_sent (today, last_7_days, last_30_days), estimated_cost (last_30_days: amount, currency), rate_limit (per_minute)."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"plan\": {\n            \"name\": \"Starter\",\n            \"status\": \"active\",\n            \"valid_until\": \"2026-11-05T00:00:00+00:00\"\n        },\n        \"limits\": {\n            \"contacts\": {\n                \"used\": 1041,\n                \"limit\": 5000\n            },\n            \"messages\": {\n                \"used\": 8120,\n                \"limit\": null\n            },\n            \"campaigns\": {\n                \"used\": 12,\n                \"limit\": 50\n            }\n        },\n        \"messages_sent\": {\n            \"today\": 36,\n            \"last_7_days\": 410,\n            \"last_30_days\": 1830\n        },\n        \"estimated_cost\": {\n            \"last_30_days\": {\n                \"amount\": 64.6099999999999994315658113919198513031005859375,\n                \"currency\": \"EUR\"\n            }\n        },\n        \"rate_limit\": {\n            \"per_minute\": 60\n        }\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Inbox",
            "description": "A contact's conversation as the inbox sees it: the ticket and the thread; assign, close, reopen and leave a note.",
            "item": [
                {
                    "name": "Get a conversation",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/conversations/{{uuid}}",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "conversations",
                                "{{uuid}}"
                            ],
                            "query": [
                                {
                                    "key": "before",
                                    "value": "",
                                    "description": "The uuid of the oldest message you have; the answer is what came before it.",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "Response data: contact (uuid, phone, first_name, last_name), ticketing (whether Settings > Tickets is on), ticket (status, assigned_to: name, email; opened_at, waiting_since, resolved_at) or null, messages (uuid, wam_id, direction, type, text, status, created_at - the 50 newest first), next_before.\nOptional query: before (the uuid of the oldest message you have) for the older messages; 400 when the cursor is not a message of this contact. 404 for an unknown contact."
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/conversations/{{uuid}}",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "conversations",
                                        "{{uuid}}"
                                    ],
                                    "query": [
                                        {
                                            "key": "before",
                                            "value": "",
                                            "description": "The uuid of the oldest message you have; the answer is what came before it.",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "Response data: contact (uuid, phone, first_name, last_name), ticketing (whether Settings > Tickets is on), ticket (status, assigned_to: name, email; opened_at, waiting_since, resolved_at) or null, messages (uuid, wam_id, direction, type, text, status, created_at - the 50 newest first), next_before.\nOptional query: before (the uuid of the oldest message you have) for the older messages; 400 when the cursor is not a message of this contact. 404 for an unknown contact."
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"contact\": {\n            \"uuid\": \"81a2d165-41e2-43f2-847e-d69e08cba0e0\",\n            \"phone\": \"+40721000001\",\n            \"first_name\": \"Ana\",\n            \"last_name\": \"Pop\"\n        },\n        \"ticketing\": true,\n        \"ticket\": {\n            \"status\": \"open\",\n            \"assigned_to\": {\n                \"name\": \"Maria Ionescu\",\n                \"email\": \"maria@example.com\"\n            },\n            \"opened_at\": \"2026-10-05T08:10:00+00:00\",\n            \"waiting_since\": \"2026-10-05T09:30:00+00:00\",\n            \"resolved_at\": null\n        },\n        \"messages\": [\n            {\n                \"uuid\": \"64968a32-fdd9-4c1d-8941-b8e538036616\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgARGBI5QkY2RkE3RDlCMjc2RjI2QkEA\",\n                \"direction\": \"outbound\",\n                \"type\": \"text\",\n                \"text\": \"Hello Ana, how are you?\",\n                \"status\": \"delivered\",\n                \"created_at\": \"2026-10-05T09:30:00+00:00\"\n            },\n            {\n                \"uuid\": \"a1b2c3d4-0001-4000-8000-000000000001\",\n                \"wam_id\": \"wamid.HBgMNDA3MjEwMDAwMDEVAgASGBQzQTk4N0Y1QzQ2RkYyQjY2QkRCQQA=\",\n                \"direction\": \"inbound\",\n                \"type\": \"text\",\n                \"text\": \"Hi, is my order on its way?\",\n                \"status\": \"delivered\",\n                \"created_at\": \"2026-10-05T09:29:40+00:00\"\n            }\n        ],\n        \"next_before\": null\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "Assign a conversation",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/conversations/{{uuid}}/assign",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "conversations",
                                "{{uuid}}",
                                "assign"
                            ]
                        },
                        "description": "user_email (required, nullable): the email of an active member of the organization; null unassigns the ticket. A conversation without a ticket gets one.\nResponse: { statusCode, data: ticket, message } with the ticket as Get a conversation shows it. 409 while ticketing is off; 422 when nobody active in the organization has that email; 404 for an unknown contact.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"user_email\": \"maria@example.com\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/conversations/{{uuid}}/assign",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "conversations",
                                        "{{uuid}}",
                                        "assign"
                                    ]
                                },
                                "description": "user_email (required, nullable): the email of an active member of the organization; null unassigns the ticket. A conversation without a ticket gets one.\nResponse: { statusCode, data: ticket, message } with the ticket as Get a conversation shows it. 409 while ticketing is off; 422 when nobody active in the organization has that email; 404 for an unknown contact.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"user_email\": \"maria@example.com\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"status\": \"open\",\n        \"assigned_to\": {\n            \"name\": \"Maria Ionescu\",\n            \"email\": \"maria@example.com\"\n        },\n        \"opened_at\": \"2026-10-05T08:10:00+00:00\",\n        \"waiting_since\": \"2026-10-05T09:30:00+00:00\",\n        \"resolved_at\": null\n    },\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Close a conversation",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/conversations/{{uuid}}/close",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "conversations",
                                "{{uuid}}",
                                "close"
                            ]
                        },
                        "description": "No body. Resolves the ticket (status closed, resolved_at set), as the inbox button does. Response: { statusCode, data: ticket, message }.\n409 while ticketing is off; 404 for an unknown contact.",
                        "body": {
                            "mode": "raw",
                            "raw": "{}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/conversations/{{uuid}}/close",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "conversations",
                                        "{{uuid}}",
                                        "close"
                                    ]
                                },
                                "description": "No body. Resolves the ticket (status closed, resolved_at set), as the inbox button does. Response: { statusCode, data: ticket, message }.\n409 while ticketing is off; 404 for an unknown contact.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"status\": \"closed\",\n        \"assigned_to\": {\n            \"name\": \"Maria Ionescu\",\n            \"email\": \"maria@example.com\"\n        },\n        \"opened_at\": \"2026-10-05T08:10:00+00:00\",\n        \"waiting_since\": null,\n        \"resolved_at\": \"2026-10-05T09:30:00+00:00\"\n    },\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Reopen a conversation",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/conversations/{{uuid}}/reopen",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "conversations",
                                "{{uuid}}",
                                "reopen"
                            ]
                        },
                        "description": "No body. Reopens a closed ticket (status open, resolved_at cleared); an open ticket is returned as it is. Response: { statusCode, data: ticket, message }.\n409 while ticketing is off; 404 for an unknown contact.",
                        "body": {
                            "mode": "raw",
                            "raw": "{}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/conversations/{{uuid}}/reopen",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "conversations",
                                        "{{uuid}}",
                                        "reopen"
                                    ]
                                },
                                "description": "No body. Reopens a closed ticket (status open, resolved_at cleared); an open ticket is returned as it is. Response: { statusCode, data: ticket, message }.\n409 while ticketing is off; 404 for an unknown contact.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"data\": {\n        \"status\": \"open\",\n        \"assigned_to\": {\n            \"name\": \"Maria Ionescu\",\n            \"email\": \"maria@example.com\"\n        },\n        \"opened_at\": \"2026-10-05T08:10:00+00:00\",\n        \"waiting_since\": \"2026-10-05T09:30:00+00:00\",\n        \"resolved_at\": null\n    },\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                },
                {
                    "name": "Add an internal note",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            },
                            {
                                "key": "Idempotency-Key",
                                "value": "{{$guid}}",
                                "disabled": true,
                                "description": "Enable to make the request safe to retry."
                            }
                        ],
                        "url": {
                            "raw": "{{base_url}}/api/conversations/{{uuid}}/notes",
                            "host": [
                                "{{base_url}}"
                            ],
                            "path": [
                                "api",
                                "conversations",
                                "{{uuid}}",
                                "notes"
                            ]
                        },
                        "description": "note (required, max 5000): shown to the agents in the thread, never sent to the contact. Works whether ticketing is on or off.\nResponse: { statusCode, uuid, created_at, message }. 404 for an unknown contact. Accepts an Idempotency-Key header.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"note\": \"Customer called; wants the order delivered on Friday.\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 OK",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Idempotency-Key",
                                        "value": "{{$guid}}",
                                        "disabled": true,
                                        "description": "Enable to make the request safe to retry."
                                    }
                                ],
                                "url": {
                                    "raw": "{{base_url}}/api/conversations/{{uuid}}/notes",
                                    "host": [
                                        "{{base_url}}"
                                    ],
                                    "path": [
                                        "api",
                                        "conversations",
                                        "{{uuid}}",
                                        "notes"
                                    ]
                                },
                                "description": "note (required, max 5000): shown to the agents in the thread, never sent to the contact. Works whether ticketing is on or off.\nResponse: { statusCode, uuid, created_at, message }. 404 for an unknown contact. Accepts an Idempotency-Key header.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"note\": \"Customer called; wants the order delivered on Friday.\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "OK",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"statusCode\": 200,\n    \"uuid\": \"7e9f0a1b-2c3d-4e5f-8a9b-0c1d2e3f4a5b\",\n    \"created_at\": \"2026-10-05T09:30:00+00:00\",\n    \"message\": \"Request processed successfully\"\n}"
                        }
                    ]
                }
            ]
        }
    ]
}