MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>

Authenticating requests

This API is not authenticated.

Endpoints

Create a new WhatsApp session

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/sessions" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_name\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_name": "vmqeopfuudtdsufvyvddq"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/whatsapp/sessions

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

Get the status of a session

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/status" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/status"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/sessions/{sessionId}/status

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sessionId   string   

Example: consequatur

Get the status active from session device id

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/sessions/{deviceId}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

deviceId   string   

Example: consequatur

Disconnect a session

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/disconnect" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/disconnect"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/whatsapp/sessions/{sessionId}/disconnect

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sessionId   string   

Example: consequatur

Delete a session

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/whatsapp/sessions/{sessionId}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sessionId   string   

Example: consequatur

Delete a session

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/device" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/device"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/whatsapp/sessions/{sessionId}/device

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sessionId   string   

Example: consequatur

Sync groups from WhatsApp to database

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/groups/sync" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_device_id\": \"consequatur\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/groups/sync"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_device_id": "consequatur"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/whatsapp/groups/sync

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_device_id   string   

Example: consequatur

Get saved groups for a device

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/groups/device" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_device_id\": \"consequatur\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/groups/device"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_device_id": "consequatur"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/groups/device

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_device_id   string   

Example: consequatur

Delete a group

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/whatsapp/groups/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/groups/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/whatsapp/groups/{groupId}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

groupId   string   

Example: consequatur

Get bulk message job status

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/messages/bulk/consequatur/status" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/bulk/consequatur/status"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/messages/bulk/{jobId}/status

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

jobId   string   

Example: consequatur

Cancel a bulk message job

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/whatsapp/messages/bulk/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/bulk/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/whatsapp/messages/bulk/{jobId}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

jobId   string   

Example: consequatur

List all bulk message jobs

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/messages/bulk" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/bulk"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/messages/bulk

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Schedule a media message

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule/media" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"consequatur\",
    \"to\": \"consequatur\",
    \"media_url\": \"https:\\/\\/www.mueller.com\\/laborum-eius-est-dolor-dolores-minus-voluptatem\",
    \"type\": \"audio\",
    \"caption\": \"consequatur\",
    \"scheduled_at\": \"2107-06-26\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule/media"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "consequatur",
    "to": "consequatur",
    "media_url": "https:\/\/www.mueller.com\/laborum-eius-est-dolor-dolores-minus-voluptatem",
    "type": "audio",
    "caption": "consequatur",
    "scheduled_at": "2107-06-26"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/whatsapp/messages/schedule/media

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_id   string   

Example: consequatur

to   string   

Example: consequatur

media_url   string   

Must be a valid URL. Example: https://www.mueller.com/laborum-eius-est-dolor-dolores-minus-voluptatem

type   string   

Example: audio

Must be one of:
  • image
  • audio
  • video
  • document
caption   string  optional  

Example: consequatur

scheduled_at   string   

Must be a valid date. Must be a date after now. Example: 2107-06-26

Get scheduled message status

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/messages/schedule/consequatur/status" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule/consequatur/status"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/messages/schedule/{messageId}/status

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

messageId   string   

Example: consequatur

Cancel a scheduled message

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/whatsapp/messages/schedule/{messageId}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

messageId   string   

Example: consequatur

List all scheduled messages

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/messages/schedule" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/messages/schedule

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Get message history

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/messages" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/messages"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/sessions/{sessionId}/messages

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sessionId   string   

Example: consequatur

Get contacts for a session

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/contacts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/contacts"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/sessions/{sessionId}/contacts

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sessionId   string   

Example: consequatur

Get groups for a session

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/groups" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/sessions/consequatur/groups"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/whatsapp/sessions/{sessionId}/groups

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sessionId   string   

Example: consequatur

GET api/health

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/health" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/health"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "status": "OK",
    "timestamp": "2026-05-27T13:16:52.502370Z",
    "service": "WhatsApp Baileys API"
}
 

Request      

GET api/health

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/me

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/me" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/me"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/me

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Display a listing of contact groups.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/test-contact-groups" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/test-contact-groups"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "success": true,
    "data": [
        {
            "id": "66273848-06ab-4003-a38c-3f3f624a1abe",
            "user_id": "d933ba87-379c-4a52-ab32-cb196976a713",
            "name": "tes",
            "description": "Tes",
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-25T06:57:27.000000Z",
            "updated_at": "2026-05-25T06:57:27.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "bead738b-25f5-4fd2-adb8-42ae804c48ae",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "PK A",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-18T03:55:27.000000Z",
            "updated_at": "2026-05-18T03:55:27.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "796c4673-ce77-4ff9-8d7e-23fd45508680",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "UJI COBA PRESENTASI",
            "description": null,
            "color": "#FFEB3B",
            "is_active": true,
            "created_at": "2026-05-18T00:47:12.000000Z",
            "updated_at": "2026-05-18T00:47:12.000000Z",
            "deleted_at": null,
            "contacts_count": 5
        },
        {
            "id": "f7d73ce3-77f1-4b92-b48f-83fc654738d8",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "ANITA CAROLINA",
            "description": null,
            "color": "#9E9E9E",
            "is_active": true,
            "created_at": "2026-05-13T05:44:35.000000Z",
            "updated_at": "2026-05-13T05:44:35.000000Z",
            "deleted_at": null,
            "contacts_count": 52
        },
        {
            "id": "b244e049-2a13-4cdb-abb5-3b9b29c5673c",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "MARDELLA GALIH PRATAMA",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-13T04:42:23.000000Z",
            "updated_at": "2026-05-15T12:52:08.000000Z",
            "deleted_at": null,
            "contacts_count": 200
        },
        {
            "id": "74d00063-0269-4ed9-987c-c6eefceddc0b",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "UJI COBA",
            "description": null,
            "color": "#009688",
            "is_active": true,
            "created_at": "2026-05-13T04:32:21.000000Z",
            "updated_at": "2026-05-13T04:32:21.000000Z",
            "deleted_at": null,
            "contacts_count": 30
        },
        {
            "id": "503ffaa2-c9f4-43d0-8a5c-d8706be477a6",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "CASSIS MERINTHIA ARIAPRAMUDA",
            "description": null,
            "color": "#607D8B",
            "is_active": true,
            "created_at": "2026-05-12T15:18:37.000000Z",
            "updated_at": "2026-05-15T12:52:25.000000Z",
            "deleted_at": null,
            "contacts_count": 94
        },
        {
            "id": "5ba005b0-890d-4e62-91bd-7a33483bb96b",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "SELA NUR ANDINI",
            "description": null,
            "color": "#8BC34A",
            "is_active": true,
            "created_at": "2026-05-12T15:13:45.000000Z",
            "updated_at": "2026-05-12T15:13:45.000000Z",
            "deleted_at": null,
            "contacts_count": 50
        },
        {
            "id": "581a8ab3-9f7a-4a5f-851f-7c09d8306cbe",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "RANISA DIANTI",
            "description": null,
            "color": "#00BCD4",
            "is_active": true,
            "created_at": "2026-05-12T15:06:42.000000Z",
            "updated_at": "2026-05-12T15:06:42.000000Z",
            "deleted_at": null,
            "contacts_count": 121
        },
        {
            "id": "71e0e550-9412-4509-8790-60f0d278a13a",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "AGUNG HELMI ASTRIANA",
            "description": null,
            "color": "#673AB7",
            "is_active": true,
            "created_at": "2026-05-12T14:58:51.000000Z",
            "updated_at": "2026-05-15T12:52:54.000000Z",
            "deleted_at": null,
            "contacts_count": 40
        },
        {
            "id": "75ac6472-1ad8-4467-bb36-31ba187351dc",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "RIZKY SYAHID JAMALUDIN",
            "description": null,
            "color": "#FF5722",
            "is_active": true,
            "created_at": "2026-05-12T14:53:51.000000Z",
            "updated_at": "2026-05-15T12:53:14.000000Z",
            "deleted_at": null,
            "contacts_count": 111
        },
        {
            "id": "0e2a9b1f-562c-477b-a39d-e3f11c726469",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "HERRY MUKTI IRWANDA",
            "description": null,
            "color": "#CDDC39",
            "is_active": true,
            "created_at": "2026-05-12T14:48:13.000000Z",
            "updated_at": "2026-05-15T12:53:25.000000Z",
            "deleted_at": null,
            "contacts_count": 88
        },
        {
            "id": "3732abc1-48ab-4ac0-af8a-d369c5b54a3d",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "SAYUTI MALIK",
            "description": null,
            "color": "#607D8B",
            "is_active": true,
            "created_at": "2026-05-12T14:42:03.000000Z",
            "updated_at": "2026-05-12T14:42:03.000000Z",
            "deleted_at": null,
            "contacts_count": 72
        },
        {
            "id": "668fb035-99d3-40d4-a4c8-a1573472efb9",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "AHMAD FAUZI",
            "description": null,
            "color": "#795548",
            "is_active": true,
            "created_at": "2026-05-12T14:40:42.000000Z",
            "updated_at": "2026-05-12T14:46:11.000000Z",
            "deleted_at": null,
            "contacts_count": 1
        },
        {
            "id": "04b3bd3f-37ce-42c4-91a3-9ad68c547f37",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "UUS SUNANDAR",
            "description": null,
            "color": "#FF5722",
            "is_active": true,
            "created_at": "2026-05-12T14:29:51.000000Z",
            "updated_at": "2026-05-12T14:29:51.000000Z",
            "deleted_at": null,
            "contacts_count": 26
        },
        {
            "id": "6c147f04-5288-4b8c-b165-90adedbc7869",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "DJOKO SETIAWAN",
            "description": null,
            "color": "#4CAF50",
            "is_active": true,
            "created_at": "2026-05-12T14:20:26.000000Z",
            "updated_at": "2026-05-15T12:53:44.000000Z",
            "deleted_at": null,
            "contacts_count": 150
        },
        {
            "id": "2a3dd333-830e-4df5-b8dc-d9846b7d31d6",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "DJUMADI ARYA",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-12T14:12:49.000000Z",
            "updated_at": "2026-05-12T14:12:49.000000Z",
            "deleted_at": null,
            "contacts_count": 35
        },
        {
            "id": "d3fd3d99-08b8-4551-a02e-df3accb2ebb1",
            "user_id": "aa3314cc-3656-4c00-873c-31ea5be02b34",
            "name": "data avana april 2026",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-04T08:26:52.000000Z",
            "updated_at": "2026-05-04T08:26:52.000000Z",
            "deleted_at": null,
            "contacts_count": 51
        },
        {
            "id": "fb8a578d-fcb8-4a03-b883-b6546efa033b",
            "user_id": "aa3314cc-3656-4c00-873c-31ea5be02b34",
            "name": "DATA AMMAIA APRIL 2026",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-04T08:23:10.000000Z",
            "updated_at": "2026-05-04T08:23:10.000000Z",
            "deleted_at": null,
            "contacts_count": 128
        },
        {
            "id": "81ac12de-c0d1-4661-bc21-cda76c1941fe",
            "user_id": "aa3314cc-3656-4c00-873c-31ea5be02b34",
            "name": "data komersil",
            "description": null,
            "color": "#4CAF50",
            "is_active": true,
            "created_at": "2026-05-04T08:14:07.000000Z",
            "updated_at": "2026-05-04T08:14:07.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "6807ec15-c7ba-445f-99a8-694046a2e25b",
            "user_id": "aa3314cc-3656-4c00-873c-31ea5be02b34",
            "name": "data april",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-04T08:10:28.000000Z",
            "updated_at": "2026-05-04T08:10:28.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "1385de4d-3e96-4056-ac94-8afd11aa8446",
            "user_id": "c9aceda1-a8d8-454d-a683-d224d875018a",
            "name": "MEMBERS UMMAHAT.ID",
            "description": "Semua member di web ummahat",
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-05-04T04:48:43.000000Z",
            "updated_at": "2026-05-04T04:48:43.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "1eb81932-e365-48c2-9608-18751d7fa84e",
            "user_id": "c9aceda1-a8d8-454d-a683-d224d875018a",
            "name": "BOD UMMAHAT.ID",
            "description": "Khusus Semua Kontak BOD UMMAHAT",
            "color": "#FF9800",
            "is_active": true,
            "created_at": "2026-05-04T04:44:00.000000Z",
            "updated_at": "2026-05-04T04:44:00.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "cf6935e8-5438-471f-926f-c1365e9f9807",
            "user_id": "c2c8da65-2c6f-40a3-a991-b96bfcd2f7ab",
            "name": "IPS",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-04-27T07:41:10.000000Z",
            "updated_at": "2026-04-27T07:41:10.000000Z",
            "deleted_at": null,
            "contacts_count": 1
        },
        {
            "id": "a73e43f0-2e08-48fe-8420-582fedc033a9",
            "user_id": "cfa37161-d51a-435c-b303-b0f0b29f2922",
            "name": "grup share",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-04-23T03:16:33.000000Z",
            "updated_at": "2026-04-23T03:16:33.000000Z",
            "deleted_at": null,
            "contacts_count": 394
        },
        {
            "id": "f29add4e-db10-469d-8a76-0029b5b05602",
            "user_id": "ab65cb2f-f1e5-4f87-a4a7-25fd82f46d5e",
            "name": "s",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-04-22T15:34:24.000000Z",
            "updated_at": "2026-04-22T15:34:24.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "54acc113-a9ae-4e47-9821-532ccdb2a7b3",
            "user_id": "01a47736-ddbb-4a2f-9d57-3db85e14de54",
            "name": "grup share",
            "description": "untuk share pemberitahuan harian",
            "color": "#4CAF50",
            "is_active": true,
            "created_at": "2026-04-22T02:26:32.000000Z",
            "updated_at": "2026-04-22T02:26:32.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "ba22ae8c-1961-44ff-8762-a59733982543",
            "user_id": "aa3314cc-3656-4c00-873c-31ea5be02b34",
            "name": "Lead Ammaia Januari",
            "description": "data 7-64",
            "color": "#009688",
            "is_active": true,
            "created_at": "2026-04-20T16:10:46.000000Z",
            "updated_at": "2026-04-20T16:10:46.000000Z",
            "deleted_at": null,
            "contacts_count": 47
        },
        {
            "id": "b8f4f88c-16eb-43a7-a2c2-13eb8eae6f41",
            "user_id": "aa3314cc-3656-4c00-873c-31ea5be02b34",
            "name": "Lead Avana",
            "description": "data dari iklan avana",
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-04-20T15:44:21.000000Z",
            "updated_at": "2026-04-20T15:44:21.000000Z",
            "deleted_at": null,
            "contacts_count": 82
        },
        {
            "id": "08467cd6-f020-48ce-8e84-48c01f78b3d1",
            "user_id": "c484dd06-6fc6-43eb-8fdf-0b0d99f216b4",
            "name": "Klien Bapas Bekasi",
            "description": null,
            "color": "#FFEB3B",
            "is_active": true,
            "created_at": "2026-04-20T07:15:17.000000Z",
            "updated_at": "2026-04-20T07:15:17.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "75c5da9d-7535-4d67-be13-14fe17379abc",
            "user_id": "fe223dfc-7573-43c0-8f7d-849d41956117",
            "name": "Loyal",
            "description": "Loyal User Flowkirim",
            "color": "#795548",
            "is_active": true,
            "created_at": "2026-04-09T03:49:16.000000Z",
            "updated_at": "2026-04-09T03:49:16.000000Z",
            "deleted_at": null,
            "contacts_count": 11
        },
        {
            "id": "8bc62e8f-70e3-471f-a014-ae630a8dc020",
            "user_id": "16098357-32f4-461d-a148-cfd1d212b272",
            "name": "Nayozu",
            "description": "Test",
            "color": "#4CAF50",
            "is_active": true,
            "created_at": "2026-03-29T09:08:00.000000Z",
            "updated_at": "2026-03-29T09:08:00.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "5d85f2d5-b73a-49c8-9179-e0ca1f144846",
            "user_id": "2ffe2ffb-c03c-49b6-a39f-2c1771d1a38c",
            "name": "Kazarian",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-03-25T06:00:40.000000Z",
            "updated_at": "2026-03-25T06:00:40.000000Z",
            "deleted_at": null,
            "contacts_count": 51
        },
        {
            "id": "a76a62e1-6f67-4fbf-a195-c2e0735e7e30",
            "user_id": "7a2d368b-5b05-4ccf-8863-0b9e14a965a9",
            "name": "wali santri",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-03-10T01:23:43.000000Z",
            "updated_at": "2026-03-10T01:23:43.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "c356cfbd-926f-4470-a75c-e6c07b1b4fb3",
            "user_id": "1e508653-72b8-4868-914d-8b2637e2eab4",
            "name": "Pelanggan",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-03-02T18:14:06.000000Z",
            "updated_at": "2026-03-11T00:49:10.000000Z",
            "deleted_at": null,
            "contacts_count": 1
        },
        {
            "id": "febd2f46-85be-4f2c-82b1-f18638f4d7a7",
            "user_id": "2d861fa9-91ae-4d74-bdf7-986a1717f58c",
            "name": "pengingat wa",
            "description": "mengingtakan jadwal lab",
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-02-25T23:26:49.000000Z",
            "updated_at": "2026-02-25T23:26:49.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "8da6be98-8d1d-45ab-8887-466ab6a89c4d",
            "user_id": "fa375ac7-cfd7-46c0-9c0e-5c8b507c586b",
            "name": "manankaiyo",
            "description": "waapiperai",
            "color": "#4CAF50",
            "is_active": true,
            "created_at": "2026-02-21T19:32:36.000000Z",
            "updated_at": "2026-02-21T19:32:36.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "d2974eab-9234-474b-bd46-8357081c7178",
            "user_id": "fe223dfc-7573-43c0-8f7d-849d41956117",
            "name": "TEST",
            "description": null,
            "color": "#FF5722",
            "is_active": true,
            "created_at": "2026-02-21T01:34:53.000000Z",
            "updated_at": "2026-02-21T01:34:53.000000Z",
            "deleted_at": null,
            "contacts_count": 1
        },
        {
            "id": "9d521ac6-31ca-4c42-8a85-2743c46c2f5a",
            "user_id": "fe223dfc-7573-43c0-8f7d-849d41956117",
            "name": "IT_SMG",
            "description": "IT SEMARANG",
            "color": "#FFEB3B",
            "is_active": true,
            "created_at": "2026-02-13T07:47:54.000000Z",
            "updated_at": "2026-02-13T07:47:54.000000Z",
            "deleted_at": null,
            "contacts_count": 16
        },
        {
            "id": "af232f6e-67d0-4463-8370-a342ec23fad7",
            "user_id": "fe223dfc-7573-43c0-8f7d-849d41956117",
            "name": "IT_MEDAN",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-02-09T06:11:52.000000Z",
            "updated_at": "2026-02-09T06:11:52.000000Z",
            "deleted_at": null,
            "contacts_count": 15
        },
        {
            "id": "e2e11959-9f47-4cf9-ba10-861d214f8498",
            "user_id": "fe223dfc-7573-43c0-8f7d-849d41956117",
            "name": "user_flowkirim",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-02-07T03:04:11.000000Z",
            "updated_at": "2026-02-07T03:04:11.000000Z",
            "deleted_at": null,
            "contacts_count": 40
        },
        {
            "id": "d95be015-625a-4afa-a53c-050783b9fd39",
            "user_id": "fe223dfc-7573-43c0-8f7d-849d41956117",
            "name": "targettest",
            "description": "test",
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-02-06T01:34:00.000000Z",
            "updated_at": "2026-02-06T01:34:00.000000Z",
            "deleted_at": null,
            "contacts_count": 3
        },
        {
            "id": "9bd8a558-a5a7-44e2-b88e-a8a520f1c0d0",
            "user_id": "fe223dfc-7573-43c0-8f7d-849d41956117",
            "name": "target1",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-02-06T01:19:35.000000Z",
            "updated_at": "2026-02-06T01:19:35.000000Z",
            "deleted_at": null,
            "contacts_count": 43
        },
        {
            "id": "0b8855d0-ac5c-4268-9d53-5968440879a1",
            "user_id": "678f8b0b-79b4-4211-b9b0-828125f024b3",
            "name": "SWA.BlmTrdftr.Hlmn6.030226",
            "description": null,
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-02-03T14:02:00.000000Z",
            "updated_at": "2026-02-03T14:02:00.000000Z",
            "deleted_at": null,
            "contacts_count": 0
        },
        {
            "id": "46cdd329-3896-4953-873c-0c8d71215ea8",
            "user_id": "f798c2a9-73d3-4f6a-840e-910fd52b82c1",
            "name": "XII PH 1",
            "description": "NO ORANG TUA SISWA",
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-01-31T17:05:47.000000Z",
            "updated_at": "2026-01-31T17:05:47.000000Z",
            "deleted_at": null,
            "contacts_count": 28
        },
        {
            "id": "42fa1bf7-dedf-4a69-a710-51399654ae73",
            "user_id": "2e036697-6794-4792-b7e1-90207ea19edc",
            "name": "CONTOH",
            "description": "CONTOH",
            "color": "#2196F3",
            "is_active": true,
            "created_at": "2026-01-29T04:32:05.000000Z",
            "updated_at": "2026-01-29T04:32:05.000000Z",
            "deleted_at": null,
            "contacts_count": 2
        }
    ]
}
 

Request      

GET api/test-contact-groups

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/test-node-connection

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/test-node-connection" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/test-node-connection"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "success": true,
    "data": {
        "success": true,
        "status": "OK",
        "timestamp": "2026-05-27T13:16:52.860Z",
        "uptime": 1995,
        "uptimeFormatted": "33m 14s",
        "node_version": "v20.20.0",
        "platform": "linux",
        "memory": {
            "used": "42 MB",
            "total": "51 MB",
            "rss": "123 MB"
        },
        "webhook_url": "http://localhost:8000/whatsapp/webhook",
        "bulk_jobs": 0,
        "scheduled_messages": 0,
        "message_store_size": 1,
        "circuitBreakersActive": [],
        "sessions": {
            "total": 2,
            "connected": 1,
            "connecting": 0,
            "failed": 0,
            "details": [
                {
                    "sessionId": "flowkirim-terbaik-2e036697-6794-4792-b7e1-90207ea19edc_1779886895",
                    "status": "connection_unstable",
                    "lastActive": null,
                    "lastActiveSeconds": null,
                    "reconnectionAttempts": 0,
                    "socketConnected": true,
                    "socketUser": null,
                    "circuitBreaker": null
                },
                {
                    "sessionId": "broadcast-fe223dfc-7573-43c0-8f7d-849d41956117_1779886967",
                    "status": "connected",
                    "phoneNumber": "6285194125056",
                    "lastActive": "2026-05-27T13:16:50.798Z",
                    "lastActiveSeconds": 2,
                    "reconnectionAttempts": 0,
                    "socketConnected": true,
                    "socketUser": "6285194125056",
                    "circuitBreaker": null
                }
            ]
        }
    }
}
 

Request      

GET api/test-node-connection

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/api-tokens

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/api-tokens" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_id\": \"66529e01-d113-3473-8d6f-9e11e09332ea\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/api-tokens"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user_id": "66529e01-d113-3473-8d6f-9e11e09332ea"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

[
    {
        "id": "e775815e-99cc-4130-bf40-ff53a9e049e4",
        "name": "RedAim Shop Token",
        "token": "45feba31fcd7b99b15fb59337fa72a91834a4b24a96584f81a9022a85bdb57dd",
        "created_at": "2026-05-25T22:43:21.000000Z",
        "user_id": "66529e01-d113-3473-8d6f-9e11e09332ea",
        "expired_at": "2026-06-25T22:43:21.000000Z"
    },
    {
        "id": "161a4c64-6525-42f1-9539-f181e137e085",
        "name": "BOT_STOCK",
        "token": "db59928d119a49dfb520734af5d89837cca0242687d7ed458b38aedaa5133cb3",
        "created_at": "2026-05-22T00:11:40.000000Z",
        "user_id": "66529e01-d113-3473-8d6f-9e11e09332ea",
        "expired_at": "2026-06-22T00:11:40.000000Z"
    }
]
 

Request      

GET api/api-tokens

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

user_id   string   

Must be a valid UUID. Example: 66529e01-d113-3473-8d6f-9e11e09332ea

POST api/api-tokens/generate

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/api-tokens/generate" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"user_id\": \"462ee709-6d9f-345a-95e6-76f833111fb8\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/api-tokens/generate"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "user_id": "462ee709-6d9f-345a-95e6-76f833111fb8"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/api-tokens/generate

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

user_id   string   

Must be a valid UUID. Example: 462ee709-6d9f-345a-95e6-76f833111fb8

DELETE api/api-tokens

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/api-tokens" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_id\": \"66529e01-d113-3473-8d6f-9e11e09332ea\",
    \"id\": \"consequatur\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/api-tokens"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user_id": "66529e01-d113-3473-8d6f-9e11e09332ea",
    "id": "consequatur"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

DELETE api/api-tokens

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

user_id   string   

Must be a valid UUID. Example: 66529e01-d113-3473-8d6f-9e11e09332ea

id   string   

Example: consequatur

Start scraping (returns task_id immediately for polling) POST /api/leads/scrape

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/leads/scrape" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"query\": \"vmqeopfuudtdsufvyvddq\",
    \"total\": 1,
    \"user_id\": \"87582a71-8e82-3d56-919d-d5863651492b\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/scrape"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "query": "vmqeopfuudtdsufvyvddq",
    "total": 1,
    "user_id": "87582a71-8e82-3d56-919d-d5863651492b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/leads/scrape

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

query   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

total   integer  optional  

Must be at least 1. Must not be greater than 1000. Example: 1

user_id   string  optional  

Must be a valid UUID. Example: 87582a71-8e82-3d56-919d-d5863651492b

Start scraping (async - returns task_id) POST /api/leads/scrape/async

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/leads/scrape/async" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"query\": \"vmqeopfuudtdsufvyvddq\",
    \"total\": 1
}"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/scrape/async"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "query": "vmqeopfuudtdsufvyvddq",
    "total": 1
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/leads/scrape/async

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

query   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

total   integer  optional  

Must be at least 1. Must not be greater than 1000. Example: 1

Get task status/results GET /api/leads/scrape/task/{taskId}

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/leads/scrape/task/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/scrape/task/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/leads/scrape/task/{taskId}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

taskId   string   

Example: consequatur

Get scraper tasks list GET /api/leads/tasks

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/leads/tasks" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/tasks"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/leads/tasks

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Get scraper service health GET /api/leads/scraper-health

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/leads/scraper-health" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/scraper-health"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/leads/scraper-health

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Get all leads with filtering GET /api/leads

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/leads" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/leads"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/leads

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Save a new lead POST /api/leads

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/leads" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"source\": \"vmqeopfuudtdsufvyvddq\",
    \"business_name\": \"amniihfqcoynlazghdtqt\",
    \"address\": \"consequatur\",
    \"website\": \"mqeopfuudtdsufvyvddqa\",
    \"phone\": \"mniihfqcoynlazghdtqtq\",
    \"latitude\": 11613.31890586,
    \"longitude\": 11613.31890586,
    \"status\": \"read\",
    \"user_id\": \"57357f37-0ea3-38e5-8a6c-9de9d06e75fd\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/leads"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "source": "vmqeopfuudtdsufvyvddq",
    "business_name": "amniihfqcoynlazghdtqt",
    "address": "consequatur",
    "website": "mqeopfuudtdsufvyvddqa",
    "phone": "mniihfqcoynlazghdtqtq",
    "latitude": 11613.31890586,
    "longitude": 11613.31890586,
    "status": "read",
    "user_id": "57357f37-0ea3-38e5-8a6c-9de9d06e75fd"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/leads

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

source   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

business_name   string   

Must not be greater than 255 characters. Example: amniihfqcoynlazghdtqt

address   string  optional  

Example: consequatur

website   string  optional  

Must not be greater than 255 characters. Example: mqeopfuudtdsufvyvddqa

phone   string  optional  

Must not be greater than 50 characters. Example: mniihfqcoynlazghdtqtq

latitude   number  optional  

Example: 11613.31890586

longitude   number  optional  

Example: 11613.31890586

status   string   

Example: read

Must be one of:
  • new
  • pending
  • sent
  • read
  • failed
user_id   string   

Must be a valid UUID. Example: 57357f37-0ea3-38e5-8a6c-9de9d06e75fd

Bulk import leads from Excel data POST /api/leads/bulk-import

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/leads/bulk-import" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"leads\": [
        {
            \"business_name\": \"vmqeopfuudtdsufvyvddq\",
            \"address\": \"consequatur\",
            \"phone\": \"mqeopfuudtdsufvyvddqa\",
            \"website\": \"mniihfqcoynlazghdtqtq\",
            \"latitude\": 11613.31890586,
            \"longitude\": 11613.31890586,
            \"status\": \"pending\",
            \"source\": \"opfuudtdsufvyvddqamni\",
            \"user_id\": \"d63469cd-6701-3555-a16b-fc9764100c9a\"
        }
    ]
}"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/bulk-import"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "leads": [
        {
            "business_name": "vmqeopfuudtdsufvyvddq",
            "address": "consequatur",
            "phone": "mqeopfuudtdsufvyvddqa",
            "website": "mniihfqcoynlazghdtqtq",
            "latitude": 11613.31890586,
            "longitude": 11613.31890586,
            "status": "pending",
            "source": "opfuudtdsufvyvddqamni",
            "user_id": "d63469cd-6701-3555-a16b-fc9764100c9a"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/leads/bulk-import

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

leads   object[]  optional  
business_name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

address   string  optional  

Example: consequatur

phone   string  optional  

Must not be greater than 50 characters. Example: mqeopfuudtdsufvyvddqa

website   string  optional  

Must not be greater than 255 characters. Example: mniihfqcoynlazghdtqtq

latitude   number  optional  

Example: 11613.31890586

longitude   number  optional  

Example: 11613.31890586

status   string  optional  

Example: pending

Must be one of:
  • new
  • pending
  • sent
  • read
  • failed
source   string  optional  

Must not be greater than 255 characters. Example: opfuudtdsufvyvddqamni

user_id   string  optional  

Must be a valid UUID. Example: d63469cd-6701-3555-a16b-fc9764100c9a

Get leads statistics GET /api/leads/statistics

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/leads/statistics" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/statistics"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/leads/statistics

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Get a single lead GET /api/leads/{id}

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/leads/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/leads/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the lead. Example: consequatur

Update lead status PATCH /api/leads/{id}

Example request:
curl --request PATCH \
    "http://127.0.0.1:8000/api/leads/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"sent\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "sent"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/leads/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the lead. Example: consequatur

Body Parameters

status   string   

Example: sent

Must be one of:
  • new
  • pending
  • sent
  • read
  • failed

Delete a lead DELETE /api/leads/{id}

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/leads/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/leads/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the lead. Example: consequatur

Bulk update lead statuses POST /api/leads/bulk-status

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/leads/bulk-status" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"ids\": [
        \"consequatur\"
    ],
    \"status\": \"sent\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/bulk-status"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "ids": [
        "consequatur"
    ],
    "status": "sent"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/leads/bulk-status

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

ids   string[]  optional  
status   string   

Example: sent

Must be one of:
  • new
  • pending
  • sent
  • read
  • failed

Sync lead status from whatsapp_messages table POST /api/leads/sync-status

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/leads/sync-status" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"ids\": [
        \"consequatur\"
    ]
}"
const url = new URL(
    "http://127.0.0.1:8000/api/leads/sync-status"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "ids": [
        "consequatur"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/leads/sync-status

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

ids   string[]  optional  

Get all templates GET /api/templates

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/templates" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/templates"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/templates

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Create a new template POST /api/templates

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/templates" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"content\": \"consequatur\",
    \"message_type\": \"video\",
    \"media_url\": \"http:\\/\\/kunze.biz\\/iste-laborum-eius-est-dolor.html\",
    \"caption\": \"consequatur\",
    \"is_active\": true
}"
const url = new URL(
    "http://127.0.0.1:8000/api/templates"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "content": "consequatur",
    "message_type": "video",
    "media_url": "http:\/\/kunze.biz\/iste-laborum-eius-est-dolor.html",
    "caption": "consequatur",
    "is_active": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/templates

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

content   string   

Example: consequatur

message_type   string   

Example: video

Must be one of:
  • text
  • image
  • document
  • video
media_url   string  optional  

Example: http://kunze.biz/iste-laborum-eius-est-dolor.html

caption   string  optional  

Example: consequatur

is_active   boolean  optional  

Example: true

variables   object  optional  
user_id   string  optional  

The id of an existing record in the users table.

Get a single template GET /api/templates/{id}

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/templates/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/templates/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/templates/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the template. Example: consequatur

Update a template PUT/PATCH /api/templates/{id}

Example request:
curl --request PUT \
    "http://127.0.0.1:8000/api/templates/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"content\": \"consequatur\",
    \"message_type\": \"image\",
    \"media_url\": \"http:\\/\\/kunze.biz\\/iste-laborum-eius-est-dolor.html\",
    \"caption\": \"consequatur\",
    \"is_active\": false
}"
const url = new URL(
    "http://127.0.0.1:8000/api/templates/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "content": "consequatur",
    "message_type": "image",
    "media_url": "http:\/\/kunze.biz\/iste-laborum-eius-est-dolor.html",
    "caption": "consequatur",
    "is_active": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/templates/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the template. Example: consequatur

Body Parameters

name   string  optional  

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

content   string  optional  

Example: consequatur

message_type   string  optional  

Example: image

Must be one of:
  • text
  • image
  • document
  • video
media_url   string  optional  

Example: http://kunze.biz/iste-laborum-eius-est-dolor.html

caption   string  optional  

Example: consequatur

is_active   boolean  optional  

Example: false

variables   object  optional  
user_id   string  optional  

The id of an existing record in the users table.

Update a template PUT/PATCH /api/templates/{id}

Example request:
curl --request PATCH \
    "http://127.0.0.1:8000/api/templates/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"content\": \"consequatur\",
    \"message_type\": \"text\",
    \"media_url\": \"http:\\/\\/kunze.biz\\/iste-laborum-eius-est-dolor.html\",
    \"caption\": \"consequatur\",
    \"is_active\": true
}"
const url = new URL(
    "http://127.0.0.1:8000/api/templates/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "content": "consequatur",
    "message_type": "text",
    "media_url": "http:\/\/kunze.biz\/iste-laborum-eius-est-dolor.html",
    "caption": "consequatur",
    "is_active": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/templates/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the template. Example: consequatur

Body Parameters

name   string  optional  

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

content   string  optional  

Example: consequatur

message_type   string  optional  

Example: text

Must be one of:
  • text
  • image
  • document
  • video
media_url   string  optional  

Example: http://kunze.biz/iste-laborum-eius-est-dolor.html

caption   string  optional  

Example: consequatur

is_active   boolean  optional  

Example: true

variables   object  optional  
user_id   string  optional  

The id of an existing record in the users table.

Delete a template DELETE /api/templates/{id}

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/templates/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/templates/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/templates/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the template. Example: consequatur

Duplicate a template POST /api/templates/{id}/duplicate

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/templates/consequatur/duplicate" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/templates/consequatur/duplicate"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/templates/{id}/duplicate

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the template. Example: consequatur

Display a listing of contacts.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contacts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contacts

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Store a newly created contact.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/contacts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"phone\": \"amniihfqcoynlazghdtqt\",
    \"email\": \"andreanne00@example.org\",
    \"company\": \"wbpilpmufinllwloauydl\",
    \"position\": \"smsjuryvojcybzvrbyick\",
    \"address\": \"consequatur\",
    \"city\": \"mqeopfuudtdsufvyvddqa\",
    \"country\": \"mniihfqcoynlazghdtqtq\",
    \"notes\": \"consequatur\",
    \"is_active\": false
}"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "phone": "amniihfqcoynlazghdtqt",
    "email": "andreanne00@example.org",
    "company": "wbpilpmufinllwloauydl",
    "position": "smsjuryvojcybzvrbyick",
    "address": "consequatur",
    "city": "mqeopfuudtdsufvyvddqa",
    "country": "mniihfqcoynlazghdtqtq",
    "notes": "consequatur",
    "is_active": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/contacts

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

user_id   string  optional  

The id of an existing record in the users table.

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

phone   string   

Must not be greater than 255 characters. Example: amniihfqcoynlazghdtqt

email   string  optional  

Must be a valid email address. Must not be greater than 255 characters. Example: andreanne00@example.org

company   string  optional  

Must not be greater than 255 characters. Example: wbpilpmufinllwloauydl

position   string  optional  

Must not be greater than 255 characters. Example: smsjuryvojcybzvrbyick

address   string  optional  

Example: consequatur

city   string  optional  

Must not be greater than 255 characters. Example: mqeopfuudtdsufvyvddqa

country   string  optional  

Must not be greater than 255 characters. Example: mniihfqcoynlazghdtqtq

custom_fields   object  optional  
notes   string  optional  

Example: consequatur

is_active   boolean  optional  

Example: false

groups   string[]  optional  

The id of an existing record in the contact_groups table.

Get contacts statistics.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contacts/statistics" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/statistics"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contacts/statistics

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Bulk delete contacts.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/contacts/bulk-delete" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/bulk-delete"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/contacts/bulk-delete

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

contact_ids   string[]  optional  

The id of an existing record in the contacts table.

Import contacts from Excel file.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/contacts/import" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "skip_duplicates="\
    --form "set_active="\
    --form "file=@/tmp/phpsZCmAj" 
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/import"
);

const headers = {
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('skip_duplicates', '');
body.append('set_active', '');
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Request      

POST api/contacts/import

Headers

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

Body Parameters

file   file   

Must be a file. Must not be greater than 10240 kilobytes. Example: /tmp/phpsZCmAj

group_id   string  optional  

Max 10MB. The id of an existing record in the contact_groups table.

skip_duplicates   boolean  optional  

Example: false

set_active   boolean  optional  

Example: false

Export contacts to Excel file.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contacts/export" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/export"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contacts/export

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Download import template.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contacts/template" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/template"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contacts/template

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Display the specified contact.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contacts/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact. Example: 494790e4-9809-4825-96ca-6dad9b5f6c21

Update the specified contact.

Example request:
curl --request PUT \
    "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"phone\": \"amniihfqcoynlazghdtqt\",
    \"email\": \"andreanne00@example.org\",
    \"company\": \"wbpilpmufinllwloauydl\",
    \"position\": \"smsjuryvojcybzvrbyick\",
    \"address\": \"consequatur\",
    \"city\": \"mqeopfuudtdsufvyvddqa\",
    \"country\": \"mniihfqcoynlazghdtqtq\",
    \"notes\": \"consequatur\",
    \"is_active\": false
}"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "phone": "amniihfqcoynlazghdtqt",
    "email": "andreanne00@example.org",
    "company": "wbpilpmufinllwloauydl",
    "position": "smsjuryvojcybzvrbyick",
    "address": "consequatur",
    "city": "mqeopfuudtdsufvyvddqa",
    "country": "mniihfqcoynlazghdtqtq",
    "notes": "consequatur",
    "is_active": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/contacts/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact. Example: 494790e4-9809-4825-96ca-6dad9b5f6c21

Body Parameters

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

phone   string   

Must not be greater than 255 characters. Example: amniihfqcoynlazghdtqt

email   string  optional  

Must be a valid email address. Must not be greater than 255 characters. Example: andreanne00@example.org

company   string  optional  

Must not be greater than 255 characters. Example: wbpilpmufinllwloauydl

position   string  optional  

Must not be greater than 255 characters. Example: smsjuryvojcybzvrbyick

address   string  optional  

Example: consequatur

city   string  optional  

Must not be greater than 255 characters. Example: mqeopfuudtdsufvyvddqa

country   string  optional  

Must not be greater than 255 characters. Example: mniihfqcoynlazghdtqtq

custom_fields   object  optional  
notes   string  optional  

Example: consequatur

is_active   boolean  optional  

Example: false

groups   string[]  optional  

The id of an existing record in the contact_groups table.

Update the specified contact.

Example request:
curl --request PATCH \
    "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"phone\": \"amniihfqcoynlazghdtqt\",
    \"email\": \"andreanne00@example.org\",
    \"company\": \"wbpilpmufinllwloauydl\",
    \"position\": \"smsjuryvojcybzvrbyick\",
    \"address\": \"consequatur\",
    \"city\": \"mqeopfuudtdsufvyvddqa\",
    \"country\": \"mniihfqcoynlazghdtqtq\",
    \"notes\": \"consequatur\",
    \"is_active\": true
}"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "phone": "amniihfqcoynlazghdtqt",
    "email": "andreanne00@example.org",
    "company": "wbpilpmufinllwloauydl",
    "position": "smsjuryvojcybzvrbyick",
    "address": "consequatur",
    "city": "mqeopfuudtdsufvyvddqa",
    "country": "mniihfqcoynlazghdtqtq",
    "notes": "consequatur",
    "is_active": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/contacts/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact. Example: 494790e4-9809-4825-96ca-6dad9b5f6c21

Body Parameters

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

phone   string   

Must not be greater than 255 characters. Example: amniihfqcoynlazghdtqt

email   string  optional  

Must be a valid email address. Must not be greater than 255 characters. Example: andreanne00@example.org

company   string  optional  

Must not be greater than 255 characters. Example: wbpilpmufinllwloauydl

position   string  optional  

Must not be greater than 255 characters. Example: smsjuryvojcybzvrbyick

address   string  optional  

Example: consequatur

city   string  optional  

Must not be greater than 255 characters. Example: mqeopfuudtdsufvyvddqa

country   string  optional  

Must not be greater than 255 characters. Example: mniihfqcoynlazghdtqtq

custom_fields   object  optional  
notes   string  optional  

Example: consequatur

is_active   boolean  optional  

Example: true

groups   string[]  optional  

The id of an existing record in the contact_groups table.

Remove the specified contact.

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contacts/494790e4-9809-4825-96ca-6dad9b5f6c21"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/contacts/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact. Example: 494790e4-9809-4825-96ca-6dad9b5f6c21

Display a listing of contact groups.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contact-groups" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contact-groups

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Store a newly created contact group.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/contact-groups" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"description\": \"Dolores dolorum amet iste laborum eius est dolor.\",
    \"color\": \"dtdsufvyvddqamniihfqc\",
    \"is_active\": false
}"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "description": "Dolores dolorum amet iste laborum eius est dolor.",
    "color": "dtdsufvyvddqamniihfqc",
    "is_active": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/contact-groups

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

user_id   string  optional  

The id of an existing record in the users table.

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

description   string  optional  

Example: Dolores dolorum amet iste laborum eius est dolor.

color   string  optional  

Must not be greater than 255 characters. Example: dtdsufvyvddqamniihfqc

is_active   boolean  optional  

Example: false

Display the specified contact group.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contact-groups/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Update the specified contact group.

Example request:
curl --request PUT \
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"description\": \"Dolores dolorum amet iste laborum eius est dolor.\",
    \"color\": \"dtdsufvyvddqamniihfqc\",
    \"is_active\": false
}"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "description": "Dolores dolorum amet iste laborum eius est dolor.",
    "color": "dtdsufvyvddqamniihfqc",
    "is_active": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/contact-groups/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Body Parameters

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

description   string  optional  

Example: Dolores dolorum amet iste laborum eius est dolor.

color   string  optional  

Must not be greater than 255 characters. Example: dtdsufvyvddqamniihfqc

is_active   boolean  optional  

Example: false

Update the specified contact group.

Example request:
curl --request PATCH \
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vmqeopfuudtdsufvyvddq\",
    \"description\": \"Dolores dolorum amet iste laborum eius est dolor.\",
    \"color\": \"dtdsufvyvddqamniihfqc\",
    \"is_active\": false
}"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "vmqeopfuudtdsufvyvddq",
    "description": "Dolores dolorum amet iste laborum eius est dolor.",
    "color": "dtdsufvyvddqamniihfqc",
    "is_active": false
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/contact-groups/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Body Parameters

name   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

description   string  optional  

Example: Dolores dolorum amet iste laborum eius est dolor.

color   string  optional  

Must not be greater than 255 characters. Example: dtdsufvyvddqamniihfqc

is_active   boolean  optional  

Example: false

Remove the specified contact group.

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/contact-groups/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Add contacts to a group.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/contacts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/contacts"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/contact-groups/{id}/contacts

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Body Parameters

contact_ids   string[]  optional  

The id of an existing record in the contacts table.

Remove contacts from a group.

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/contacts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/contacts"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/contact-groups/{id}/contacts

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Body Parameters

contact_ids   string[]  optional  

The id of an existing record in the contacts table.

Get phone numbers from a group for sending messages.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/phone-numbers" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/phone-numbers"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contact-groups/{id}/phone-numbers

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Get all contacts from group (for personalized messaging)

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/contacts" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/contacts"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/contact-groups/{id}/contacts

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Get contacts from group with personalized message previews

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/personalized-preview" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"template\": \"consequatur\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/contact-groups/2a3dd333-830e-4df5-b8dc-d9846b7d31d6/personalized-preview"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "template": "consequatur"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/contact-groups/{id}/personalized-preview

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the contact group. Example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6

Body Parameters

template   string   

Example: consequatur

Display a listing of active announcements (public).

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/announcements" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/announcements

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Display all announcements (admin only).

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/announcements/admin" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/admin"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/announcements/admin

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Store a newly created announcement (admin only).

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/announcements/admin" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"vmqeopfuudtdsufvyvddq\",
    \"message\": \"consequatur\",
    \"type\": \"maintenance\",
    \"is_active\": false,
    \"starts_at\": \"2026-05-27T13:16:53\",
    \"expires_at\": \"2107-06-26\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/admin"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "title": "vmqeopfuudtdsufvyvddq",
    "message": "consequatur",
    "type": "maintenance",
    "is_active": false,
    "starts_at": "2026-05-27T13:16:53",
    "expires_at": "2107-06-26"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/announcements/admin

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

title   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

message   string   

Example: consequatur

type   string   

Example: maintenance

Must be one of:
  • info
  • warning
  • maintenance
  • promo
  • urgent
is_active   boolean  optional  

Example: false

starts_at   string  optional  

Must be a valid date. Example: 2026-05-27T13:16:53

expires_at   string  optional  

Must be a valid date. Must be a date after starts_at. Example: 2107-06-26

Display the specified announcement.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/announcements/admin/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/admin/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/announcements/admin/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the admin. Example: consequatur

Update the specified announcement (admin only).

Example request:
curl --request PUT \
    "http://127.0.0.1:8000/api/announcements/admin/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"vmqeopfuudtdsufvyvddq\",
    \"message\": \"consequatur\",
    \"type\": \"promo\",
    \"is_active\": true,
    \"starts_at\": \"2026-05-27T13:16:53\",
    \"expires_at\": \"2107-06-26\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/admin/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "title": "vmqeopfuudtdsufvyvddq",
    "message": "consequatur",
    "type": "promo",
    "is_active": true,
    "starts_at": "2026-05-27T13:16:53",
    "expires_at": "2107-06-26"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/announcements/admin/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the admin. Example: consequatur

Body Parameters

title   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

message   string   

Example: consequatur

type   string   

Example: promo

Must be one of:
  • info
  • warning
  • maintenance
  • promo
  • urgent
is_active   boolean  optional  

Example: true

starts_at   string  optional  

Must be a valid date. Example: 2026-05-27T13:16:53

expires_at   string  optional  

Must be a valid date. Must be a date after starts_at. Example: 2107-06-26

Update the specified announcement (admin only).

Example request:
curl --request PATCH \
    "http://127.0.0.1:8000/api/announcements/admin/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"vmqeopfuudtdsufvyvddq\",
    \"message\": \"consequatur\",
    \"type\": \"maintenance\",
    \"is_active\": false,
    \"starts_at\": \"2026-05-27T13:16:53\",
    \"expires_at\": \"2107-06-26\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/admin/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "title": "vmqeopfuudtdsufvyvddq",
    "message": "consequatur",
    "type": "maintenance",
    "is_active": false,
    "starts_at": "2026-05-27T13:16:53",
    "expires_at": "2107-06-26"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/announcements/admin/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the admin. Example: consequatur

Body Parameters

title   string   

Must not be greater than 255 characters. Example: vmqeopfuudtdsufvyvddq

message   string   

Example: consequatur

type   string   

Example: maintenance

Must be one of:
  • info
  • warning
  • maintenance
  • promo
  • urgent
is_active   boolean  optional  

Example: false

starts_at   string  optional  

Must be a valid date. Example: 2026-05-27T13:16:53

expires_at   string  optional  

Must be a valid date. Must be a date after starts_at. Example: 2107-06-26

Toggle announcement active status (admin only).

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/announcements/admin/consequatur/toggle" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/admin/consequatur/toggle"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/announcements/admin/{id}/toggle

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the admin. Example: consequatur

Remove the specified announcement (admin only).

Example request:
curl --request DELETE \
    "http://127.0.0.1:8000/api/announcements/admin/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/admin/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/announcements/admin/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the admin. Example: consequatur

Display the specified announcement.

Example request:
curl --request GET \
    --get "http://127.0.0.1:8000/api/announcements/consequatur" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "http://127.0.0.1:8000/api/announcements/consequatur"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthorized - No Bearer Token"
}
 

Request      

GET api/announcements/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the announcement. Example: consequatur

Messages

Send a text message

Send a WhatsApp text message via a single device OR via a Send Pool (rotator). Exactly one of session_id or pool_id must be provided.

When pool_id is set, the server picks a healthy member device from the pool using round-robin and routes the message through it. Pool routing is a Supporter-only feature; non-Supporters receive HTTP 402.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/messages/text" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"my-device-fe223dfc-7573-43c0-8f7d-849d41956117_1769250847\",
    \"pool_id\": \"7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b\",
    \"to\": \"6281234567890\",
    \"message\": \"Hello from Flowkirim!\",
    \"quoted_message_id\": \"3EB0XXXXXXXX\",
    \"mentions\": [
        \"6281234567890@s.whatsapp.net\"
    ]
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/text"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "my-device-fe223dfc-7573-43c0-8f7d-849d41956117_1769250847",
    "pool_id": "7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b",
    "to": "6281234567890",
    "message": "Hello from Flowkirim!",
    "quoted_message_id": "3EB0XXXXXXXX",
    "mentions": [
        "6281234567890@s.whatsapp.net"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "data": {
        "id": 123,
        "message_id": "3EB0XXXXXX",
        "status": "sent",
        "quoted": null,
        "mentions": [],
        "routed_via": {
            "pool_id": "7c39e0a4-...",
            "device_id": "device-a-fe223dfc-..."
        }
    },
    "message": "Message sent successfully"
}
 

Example response (402, pool routing requires Supporter):


{
    "success": false,
    "message": "Send pools are a Supporter feature.",
    "upgrade_url": "https://trakteer.id/flowkirim"
}
 

Example response (503, all pool members offline):


{
    "success": false,
    "message": "No member device is currently connected. All pool members are offline or circuit-broken."
}
 

Request      

POST api/whatsapp/messages/text

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_id   string  optional  

Single-device send. Required unless pool_id is provided. Example: my-device-fe223dfc-7573-43c0-8f7d-849d41956117_1769250847

pool_id   string  optional  

Send Pool UUID for rotator routing. Required unless session_id is provided. Supporter-only. Example: 7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b

to   string   

Recipient phone number with country code, no +. Example: 6281234567890

message   string   

The text body. Example: Hello from Flowkirim!

quoted_message_id   string  optional  

Optional ID of a previous message to quote/reply to. Example: 3EB0XXXXXXXX

mentions   string[]  optional  

Optional list of JIDs to @-mention.

Send a media message

Send a media (image / audio / video / document) message via a single device OR via a Send Pool. Exactly one of session_id or pool_id is required.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/messages/media" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"consequatur\",
    \"pool_id\": \"consequatur\",
    \"to\": \"consequatur\",
    \"media_url\": \"http:\\/\\/kunze.biz\\/iste-laborum-eius-est-dolor.html\",
    \"type\": \"consequatur\",
    \"caption\": \"consequatur\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/media"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "consequatur",
    "pool_id": "consequatur",
    "to": "consequatur",
    "media_url": "http:\/\/kunze.biz\/iste-laborum-eius-est-dolor.html",
    "type": "consequatur",
    "caption": "consequatur"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/whatsapp/messages/media

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_id   string  optional  

Single-device send. Required unless pool_id is provided. Example: consequatur

pool_id   string  optional  

Send Pool UUID for rotator routing. Required unless session_id is provided. Supporter-only. Example: consequatur

to   string   

Recipient phone number. Example: consequatur

media_url   string   

URL of the media file to download and send. Example: http://kunze.biz/iste-laborum-eius-est-dolor.html

type   string   

One of: image, audio, video, document. Example: consequatur

caption   string  optional  

Optional caption shown beneath the media. Example: consequatur

Send a text message to a group

Send a text message to a WhatsApp group via a single device OR a Send Pool (rotator). Exactly one of session_id or pool_id is required.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/messages/group/text" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"consequatur\",
    \"pool_id\": \"consequatur\",
    \"group_id\": \"6281234567890-1234567890@g.us\",
    \"message\": \"consequatur\",
    \"quoted_message_id\": \"consequatur\",
    \"mentions\": [
        \"consequatur\"
    ]
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/group/text"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "consequatur",
    "pool_id": "consequatur",
    "group_id": "6281234567890-1234567890@g.us",
    "message": "consequatur",
    "quoted_message_id": "consequatur",
    "mentions": [
        "consequatur"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/whatsapp/messages/group/text

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_id   string  optional  

Single-device send. Required unless pool_id is provided. Example: consequatur

pool_id   string  optional  

Send Pool UUID for rotator routing. Required unless session_id is provided. Supporter-only. Example: consequatur

group_id   string   

Group JID. Example: 6281234567890-1234567890@g.us

message   string   

The text body. Example: consequatur

quoted_message_id   string  optional  

Optional ID of a previous message to quote/reply to. Example: consequatur

mentions   string[]  optional  

Optional list of JIDs to @-mention.

Send a media message to a group

Send a media message to a WhatsApp group via a single device OR a Send Pool.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/messages/group/media" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"consequatur\",
    \"pool_id\": \"consequatur\",
    \"group_id\": \"consequatur\",
    \"media_url\": \"http:\\/\\/kunze.biz\\/iste-laborum-eius-est-dolor.html\",
    \"type\": \"consequatur\",
    \"caption\": \"consequatur\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/group/media"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "consequatur",
    "pool_id": "consequatur",
    "group_id": "consequatur",
    "media_url": "http:\/\/kunze.biz\/iste-laborum-eius-est-dolor.html",
    "type": "consequatur",
    "caption": "consequatur"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/whatsapp/messages/group/media

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_id   string  optional  

Single-device send. Required unless pool_id is provided. Example: consequatur

pool_id   string  optional  

Send Pool UUID. Required unless session_id is provided. Supporter-only. Example: consequatur

group_id   string   

Group JID. Example: consequatur

media_url   string   

URL of the media file. Example: http://kunze.biz/iste-laborum-eius-est-dolor.html

type   string   

One of: image, audio, video, document. Example: consequatur

caption   string  optional  

Optional caption. Example: consequatur

Send bulk text messages

Queue a bulk broadcast of the same text to many recipients. Exactly one of session_id or pool_id must be provided.

When pool_id is used (Supporter-only), the server picks a healthy pool member device PER RECIPIENT using round-robin -- so a 500- contact broadcast spreads evenly across however many devices are in the pool. This is the natural use case for rotators.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/messages/bulk/text" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"my-device-fe223dfc-..._1769250847\",
    \"pool_id\": \"7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b\",
    \"contacts\": [
        \"6281234567890\",
        \"6285678901234\"
    ],
    \"message\": \"Halo dari Flowkirim!\",
    \"delay\": 1500,
    \"mentions\": [
        \"6281234567890@s.whatsapp.net\"
    ]
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/bulk/text"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "my-device-fe223dfc-..._1769250847",
    "pool_id": "7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b",
    "contacts": [
        "6281234567890",
        "6285678901234"
    ],
    "message": "Halo dari Flowkirim!",
    "delay": 1500,
    "mentions": [
        "6281234567890@s.whatsapp.net"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "data": {
        "job_id": "bulk_pool-7c39...",
        "total": 500,
        "mentions": []
    },
    "message": "Bulk message job created"
}
 

Example response (402, pool routing requires Supporter):


{
    "success": false,
    "message": "Send pools are a Supporter feature.",
    "upgrade_url": "https://trakteer.id/flowkirim"
}
 

Request      

POST api/whatsapp/messages/bulk/text

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_id   string  optional  

Single-device send. Required unless pool_id is provided. Example: my-device-fe223dfc-..._1769250847

pool_id   string  optional  

Send Pool UUID. Required unless session_id is provided. Supporter-only. Example: 7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b

contacts   string[]   

Array of recipient phone numbers (country code, no +). Max 1000.

message   string   

Text body sent to every recipient. Example: Halo dari Flowkirim!

delay   integer  optional  

Optional milliseconds between sends (default 1000, min 100, max 60000). Example: 1500

mentions   string[]  optional  

Optional list of mention JIDs.

Schedule a text message

Schedule a text message for a future time, sent via a single device OR via a Send Pool (rotator). Pool routing for scheduled messages re-picks a healthy member device AT FIRE TIME and re-validates the owner's Supporter status -- if they lapsed before the scheduled time, the scheduled message fails.

Example request:
curl --request POST \
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule/text" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"consequatur\",
    \"pool_id\": \"consequatur\",
    \"to\": \"consequatur\",
    \"message\": \"consequatur\",
    \"scheduled_at\": \"2026-06-15T14:30:00Z\"
}"
const url = new URL(
    "http://127.0.0.1:8000/api/whatsapp/messages/schedule/text"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "consequatur",
    "pool_id": "consequatur",
    "to": "consequatur",
    "message": "consequatur",
    "scheduled_at": "2026-06-15T14:30:00Z"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/whatsapp/messages/schedule/text

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

session_id   string  optional  

Single-device scheduled send. Required unless pool_id is provided. Example: consequatur

pool_id   string  optional  

Send Pool UUID for rotator routing. Required unless session_id is provided. Supporter-only at schedule time AND at fire time. Example: consequatur

to   string   

Recipient phone number. Example: consequatur

message   string   

The text body. Example: consequatur

scheduled_at   string   

ISO 8601 timestamp in the future. Example: 2026-06-15T14:30:00Z