openapi: 3.0.3 info: title: 'WhatsApp Baileys API API Documentation' description: '' version: 1.0.0 servers: - url: 'http://127.0.0.1:8000' tags: - name: Endpoints description: '' - name: Messages description: '' paths: /api/whatsapp/sessions: post: summary: 'Create a new WhatsApp session' operationId: createANewWhatsAppSession description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: session_name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false required: - session_name security: [] '/api/whatsapp/sessions/{sessionId}/status': get: summary: 'Get the status of a session' operationId: getTheStatusOfASession description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: sessionId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/sessions/{deviceId}': get: summary: 'Get the status active from session device id' operationId: getTheStatusActiveFromSessionDeviceId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: deviceId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/sessions/{sessionId}/disconnect': delete: summary: 'Disconnect a session' operationId: disconnectASession description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: sessionId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/sessions/{sessionId}': delete: summary: 'Delete a session' operationId: deleteASession description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: sessionId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/sessions/{sessionId}/device': delete: summary: 'Delete a session' operationId: deleteASession description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: sessionId description: '' example: consequatur required: true schema: type: string /api/whatsapp/groups/sync: post: summary: 'Sync groups from WhatsApp to database' operationId: syncGroupsFromWhatsAppToDatabase description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: session_device_id: type: string description: '' example: consequatur nullable: false required: - session_device_id security: [] /api/whatsapp/groups/device: get: summary: 'Get saved groups for a device' operationId: getSavedGroupsForADevice description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: session_device_id: type: string description: '' example: consequatur nullable: false required: - session_device_id security: [] '/api/whatsapp/groups/{groupId}': delete: summary: 'Delete a group' operationId: deleteAGroup description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: groupId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/messages/bulk/{jobId}/status': get: summary: 'Get bulk message job status' operationId: getBulkMessageJobStatus description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: jobId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/messages/bulk/{jobId}': delete: summary: 'Cancel a bulk message job' operationId: cancelABulkMessageJob description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: jobId description: '' example: consequatur required: true schema: type: string /api/whatsapp/messages/bulk: get: summary: 'List all bulk message jobs' operationId: listAllBulkMessageJobs description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] /api/whatsapp/messages/schedule/media: post: summary: 'Schedule a media message' operationId: scheduleAMediaMessage description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: '' example: consequatur nullable: false to: type: string description: '' example: consequatur nullable: false media_url: type: string description: 'Must be a valid URL.' example: 'https://www.mueller.com/laborum-eius-est-dolor-dolores-minus-voluptatem' nullable: false type: type: string description: '' example: audio nullable: false enum: - image - audio - video - document caption: type: string description: '' example: consequatur nullable: true scheduled_at: type: string description: 'Must be a valid date. Must be a date after now.' example: '2107-06-26' nullable: false required: - session_id - to - media_url - type - scheduled_at security: [] '/api/whatsapp/messages/schedule/{messageId}/status': get: summary: 'Get scheduled message status' operationId: getScheduledMessageStatus description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: messageId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/messages/schedule/{messageId}': delete: summary: 'Cancel a scheduled message' operationId: cancelAScheduledMessage description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: messageId description: '' example: consequatur required: true schema: type: string /api/whatsapp/messages/schedule: get: summary: 'List all scheduled messages' operationId: listAllScheduledMessages description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] '/api/whatsapp/sessions/{sessionId}/messages': get: summary: 'Get message history' operationId: getMessageHistory description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: sessionId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/sessions/{sessionId}/contacts': get: summary: 'Get contacts for a session' operationId: getContactsForASession description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: sessionId description: '' example: consequatur required: true schema: type: string '/api/whatsapp/sessions/{sessionId}/groups': get: summary: 'Get groups for a session' operationId: getGroupsForASession description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: sessionId description: '' example: consequatur required: true schema: type: string /api/health: get: summary: '' operationId: getApiHealth description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: OK timestamp: '2026-05-27T13:16:52.502370Z' service: 'WhatsApp Baileys API' properties: status: type: string example: OK timestamp: type: string example: '2026-05-27T13:16:52.502370Z' service: type: string example: 'WhatsApp Baileys API' tags: - Endpoints security: [] /api/me: get: summary: '' operationId: getApiMe description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] /api/test-contact-groups: get: summary: 'Display a listing of contact groups.' operationId: displayAListingOfContactGroups description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: 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 properties: success: type: boolean example: true data: type: array example: - 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 items: type: object properties: id: type: string example: 66273848-06ab-4003-a38c-3f3f624a1abe user_id: type: string example: d933ba87-379c-4a52-ab32-cb196976a713 name: type: string example: tes description: type: string example: Tes color: type: string example: '#2196F3' is_active: type: boolean example: true created_at: type: string example: '2026-05-25T06:57:27.000000Z' updated_at: type: string example: '2026-05-25T06:57:27.000000Z' deleted_at: type: string example: null contacts_count: type: integer example: 0 tags: - Endpoints security: [] /api/test-node-connection: get: summary: '' operationId: getApiTestNodeConnection description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: 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 properties: success: type: boolean example: true data: type: object properties: success: type: boolean example: true status: type: string example: OK timestamp: type: string example: '2026-05-27T13:16:52.860Z' uptime: type: integer example: 1995 uptimeFormatted: type: string example: '33m 14s' node_version: type: string example: v20.20.0 platform: type: string example: linux memory: type: object properties: used: type: string example: '42 MB' total: type: string example: '51 MB' rss: type: string example: '123 MB' webhook_url: type: string example: 'http://localhost:8000/whatsapp/webhook' bulk_jobs: type: integer example: 0 scheduled_messages: type: integer example: 0 message_store_size: type: integer example: 1 circuitBreakersActive: type: array example: [] sessions: type: object properties: total: type: integer example: 2 connected: type: integer example: 1 connecting: type: integer example: 0 failed: type: integer example: 0 details: type: array example: - 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 items: type: object properties: sessionId: type: string example: flowkirim-terbaik-2e036697-6794-4792-b7e1-90207ea19edc_1779886895 status: type: string example: connection_unstable lastActive: type: string example: null lastActiveSeconds: type: string example: null reconnectionAttempts: type: integer example: 0 socketConnected: type: boolean example: true socketUser: type: string example: null circuitBreaker: type: string example: null tags: - Endpoints security: [] /api/api-tokens: get: summary: '' operationId: getApiApiTokens description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: array items: type: object example: - 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' tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: 'Must be a valid UUID.' example: 66529e01-d113-3473-8d6f-9e11e09332ea nullable: false required: - user_id security: [] delete: summary: '' operationId: deleteApiApiTokens description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: 'Must be a valid UUID.' example: 66529e01-d113-3473-8d6f-9e11e09332ea nullable: false id: type: string description: '' example: consequatur nullable: false required: - user_id - id security: [] /api/api-tokens/generate: post: summary: '' operationId: postApiApiTokensGenerate description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false user_id: type: string description: 'Must be a valid UUID.' example: 462ee709-6d9f-345a-95e6-76f833111fb8 nullable: false required: - name - user_id security: [] /api/leads/scrape: post: summary: "Start scraping (returns task_id immediately for polling)\nPOST /api/leads/scrape" operationId: startScrapingreturnsTaskIdImmediatelyForPollingPOSTapileadsscrape description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: query: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false total: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 1 nullable: true user_id: type: string description: 'Must be a valid UUID.' example: 87582a71-8e82-3d56-919d-d5863651492b nullable: true required: - query security: [] /api/leads/scrape/async: post: summary: "Start scraping (async - returns task_id)\nPOST /api/leads/scrape/async" operationId: startScrapingasyncReturnsTaskIdPOSTapileadsscrapeasync description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: query: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false total: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 1 nullable: true required: - query security: [] '/api/leads/scrape/task/{taskId}': get: summary: "Get task status/results\nGET /api/leads/scrape/task/{taskId}" operationId: getTaskStatusresultsGETapileadsscrapetasktaskId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: taskId description: '' example: consequatur required: true schema: type: string /api/leads/tasks: get: summary: "Get scraper tasks list\nGET /api/leads/tasks" operationId: getScraperTasksListGETapileadstasks description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] /api/leads/scraper-health: get: summary: "Get scraper service health\nGET /api/leads/scraper-health" operationId: getScraperServiceHealthGETapileadsscraperHealth description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] /api/leads: get: summary: "Get all leads with filtering\nGET /api/leads" operationId: getAllLeadsWithFilteringGETapileads description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] post: summary: "Save a new lead\nPOST /api/leads" operationId: saveANewLeadPOSTapileads description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: source: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false business_name: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false address: type: string description: '' example: consequatur nullable: true website: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: true phone: type: string description: 'Must not be greater than 50 characters.' example: mniihfqcoynlazghdtqtq nullable: true latitude: type: number description: '' example: 11613.31890586 nullable: true longitude: type: number description: '' example: 11613.31890586 nullable: true status: type: string description: '' example: read nullable: false enum: - new - pending - sent - read - failed user_id: type: string description: 'Must be a valid UUID.' example: 57357f37-0ea3-38e5-8a6c-9de9d06e75fd nullable: false required: - source - business_name - status - user_id security: [] /api/leads/bulk-import: post: summary: "Bulk import leads from Excel data\nPOST /api/leads/bulk-import" operationId: bulkImportLeadsFromExcelDataPOSTapileadsbulkImport description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: leads: type: array description: '' example: null items: type: object properties: business_name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false address: type: string description: '' example: consequatur nullable: true phone: type: string description: 'Must not be greater than 50 characters.' example: mqeopfuudtdsufvyvddqa nullable: true website: type: string description: 'Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: true latitude: type: number description: '' example: 11613.31890586 nullable: true longitude: type: number description: '' example: 11613.31890586 nullable: true status: type: string description: '' example: pending nullable: true enum: - new - pending - sent - read - failed source: type: string description: 'Must not be greater than 255 characters.' example: opfuudtdsufvyvddqamni nullable: true user_id: type: string description: 'Must be a valid UUID.' example: d63469cd-6701-3555-a16b-fc9764100c9a nullable: true required: - business_name security: [] /api/leads/statistics: get: summary: "Get leads statistics\nGET /api/leads/statistics" operationId: getLeadsStatisticsGETapileadsstatistics description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] '/api/leads/{id}': get: summary: "Get a single lead\nGET /api/leads/{id}" operationId: getASingleLeadGETapileadsid description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] patch: summary: "Update lead status\nPATCH /api/leads/{id}" operationId: updateLeadStatusPATCHapileadsid description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: status: type: string description: '' example: sent nullable: false enum: - new - pending - sent - read - failed required: - status security: [] delete: summary: "Delete a lead\nDELETE /api/leads/{id}" operationId: deleteALeadDELETEapileadsid description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the lead.' example: consequatur required: true schema: type: string /api/leads/bulk-status: post: summary: "Bulk update lead statuses\nPOST /api/leads/bulk-status" operationId: bulkUpdateLeadStatusesPOSTapileadsbulkStatus description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: ids: type: array description: '' example: - consequatur items: type: string status: type: string description: '' example: sent nullable: false enum: - new - pending - sent - read - failed required: - status security: [] /api/leads/sync-status: post: summary: "Sync lead status from whatsapp_messages table\nPOST /api/leads/sync-status" operationId: syncLeadStatusFromWhatsappMessagesTablePOSTapileadssyncStatus description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: ids: type: array description: '' example: - consequatur items: type: string security: [] /api/templates: get: summary: "Get all templates\nGET /api/templates" operationId: getAllTemplatesGETapitemplates description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] post: summary: "Create a new template\nPOST /api/templates" operationId: createANewTemplatePOSTapitemplates description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false content: type: string description: '' example: consequatur nullable: false message_type: type: string description: '' example: video nullable: false enum: - text - image - document - video media_url: type: string description: '' example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html' nullable: true caption: type: string description: '' example: consequatur nullable: true is_active: type: boolean description: '' example: true nullable: false variables: type: object description: '' example: null nullable: true properties: { } user_id: type: string description: 'The id of an existing record in the users table.' example: null nullable: true required: - name - content - message_type security: [] '/api/templates/{id}': get: summary: "Get a single template\nGET /api/templates/{id}" operationId: getASingleTemplateGETapitemplatesid description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] put: summary: "Update a template\nPUT/PATCH /api/templates/{id}" operationId: updateATemplatePUTPATCHapitemplatesid description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false content: type: string description: '' example: consequatur nullable: false message_type: type: string description: '' example: image nullable: false enum: - text - image - document - video media_url: type: string description: '' example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html' nullable: true caption: type: string description: '' example: consequatur nullable: true is_active: type: boolean description: '' example: false nullable: false variables: type: object description: '' example: null nullable: true properties: { } user_id: type: string description: 'The id of an existing record in the users table.' example: null nullable: true security: [] patch: summary: "Update a template\nPUT/PATCH /api/templates/{id}" operationId: updateATemplatePUTPATCHapitemplatesid description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false content: type: string description: '' example: consequatur nullable: false message_type: type: string description: '' example: text nullable: false enum: - text - image - document - video media_url: type: string description: '' example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html' nullable: true caption: type: string description: '' example: consequatur nullable: true is_active: type: boolean description: '' example: true nullable: false variables: type: object description: '' example: null nullable: true properties: { } user_id: type: string description: 'The id of an existing record in the users table.' example: null nullable: true security: [] delete: summary: "Delete a template\nDELETE /api/templates/{id}" operationId: deleteATemplateDELETEapitemplatesid description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the template.' example: consequatur required: true schema: type: string '/api/templates/{id}/duplicate': post: summary: "Duplicate a template\nPOST /api/templates/{id}/duplicate" operationId: duplicateATemplatePOSTapitemplatesidduplicate description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the template.' example: consequatur required: true schema: type: string /api/contacts: get: summary: 'Display a listing of contacts.' operationId: displayAListingOfContacts description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] post: summary: 'Store a newly created contact.' operationId: storeANewlyCreatedContact description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: 'The id of an existing record in the users table.' example: null nullable: true name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false phone: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: andreanne00@example.org nullable: true company: type: string description: 'Must not be greater than 255 characters.' example: wbpilpmufinllwloauydl nullable: true position: type: string description: 'Must not be greater than 255 characters.' example: smsjuryvojcybzvrbyick nullable: true address: type: string description: '' example: consequatur nullable: true city: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: true country: type: string description: 'Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: true custom_fields: type: object description: '' example: null nullable: true properties: { } notes: type: string description: '' example: consequatur nullable: true is_active: type: boolean description: '' example: false nullable: false groups: type: array description: 'The id of an existing record in the contact_groups table.' example: null items: type: string required: - name - phone security: [] /api/contacts/statistics: get: summary: 'Get contacts statistics.' operationId: getContactsStatistics description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] /api/contacts/bulk-delete: post: summary: 'Bulk delete contacts.' operationId: bulkDeleteContacts description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: contact_ids: type: array description: 'The id of an existing record in the contacts table.' example: null items: type: string security: [] /api/contacts/import: post: summary: 'Import contacts from Excel file.' operationId: importContactsFromExcelFile description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'Must be a file. Must not be greater than 10240 kilobytes.' nullable: false group_id: type: string description: 'Max 10MB. The id of an existing record in the contact_groups table.' example: null nullable: true skip_duplicates: type: boolean description: '' example: false nullable: true set_active: type: boolean description: '' example: false nullable: true required: - file security: [] /api/contacts/export: get: summary: 'Export contacts to Excel file.' operationId: exportContactsToExcelFile description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] /api/contacts/template: get: summary: 'Download import template.' operationId: downloadImportTemplate description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] '/api/contacts/{id}': get: summary: 'Display the specified contact.' operationId: displayTheSpecifiedContact description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] put: summary: 'Update the specified contact.' operationId: updateTheSpecifiedContact description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false phone: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: andreanne00@example.org nullable: true company: type: string description: 'Must not be greater than 255 characters.' example: wbpilpmufinllwloauydl nullable: true position: type: string description: 'Must not be greater than 255 characters.' example: smsjuryvojcybzvrbyick nullable: true address: type: string description: '' example: consequatur nullable: true city: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: true country: type: string description: 'Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: true custom_fields: type: object description: '' example: null nullable: true properties: { } notes: type: string description: '' example: consequatur nullable: true is_active: type: boolean description: '' example: false nullable: false groups: type: array description: 'The id of an existing record in the contact_groups table.' example: null items: type: string required: - name - phone security: [] patch: summary: 'Update the specified contact.' operationId: updateTheSpecifiedContact description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false phone: type: string description: 'Must not be greater than 255 characters.' example: amniihfqcoynlazghdtqt nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: andreanne00@example.org nullable: true company: type: string description: 'Must not be greater than 255 characters.' example: wbpilpmufinllwloauydl nullable: true position: type: string description: 'Must not be greater than 255 characters.' example: smsjuryvojcybzvrbyick nullable: true address: type: string description: '' example: consequatur nullable: true city: type: string description: 'Must not be greater than 255 characters.' example: mqeopfuudtdsufvyvddqa nullable: true country: type: string description: 'Must not be greater than 255 characters.' example: mniihfqcoynlazghdtqtq nullable: true custom_fields: type: object description: '' example: null nullable: true properties: { } notes: type: string description: '' example: consequatur nullable: true is_active: type: boolean description: '' example: true nullable: false groups: type: array description: 'The id of an existing record in the contact_groups table.' example: null items: type: string required: - name - phone security: [] delete: summary: 'Remove the specified contact.' operationId: removeTheSpecifiedContact description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the contact.' example: 494790e4-9809-4825-96ca-6dad9b5f6c21 required: true schema: type: string /api/contact-groups: get: summary: 'Display a listing of contact groups.' operationId: displayAListingOfContactGroups description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] post: summary: 'Store a newly created contact group.' operationId: storeANewlyCreatedContactGroup description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: 'The id of an existing record in the users table.' example: null nullable: true name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true color: type: string description: 'Must not be greater than 255 characters.' example: dtdsufvyvddqamniihfqc nullable: true is_active: type: boolean description: '' example: false nullable: false required: - name security: [] '/api/contact-groups/{id}': get: summary: 'Display the specified contact group.' operationId: displayTheSpecifiedContactGroup description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] put: summary: 'Update the specified contact group.' operationId: updateTheSpecifiedContactGroup description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true color: type: string description: 'Must not be greater than 255 characters.' example: dtdsufvyvddqamniihfqc nullable: true is_active: type: boolean description: '' example: false nullable: false required: - name security: [] patch: summary: 'Update the specified contact group.' operationId: updateTheSpecifiedContactGroup description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false description: type: string description: '' example: 'Dolores dolorum amet iste laborum eius est dolor.' nullable: true color: type: string description: 'Must not be greater than 255 characters.' example: dtdsufvyvddqamniihfqc nullable: true is_active: type: boolean description: '' example: false nullable: false required: - name security: [] delete: summary: 'Remove the specified contact group.' operationId: removeTheSpecifiedContactGroup description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the contact group.' example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6 required: true schema: type: string '/api/contact-groups/{id}/contacts': post: summary: 'Add contacts to a group.' operationId: addContactsToAGroup description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: contact_ids: type: array description: 'The id of an existing record in the contacts table.' example: null items: type: string security: [] delete: summary: 'Remove contacts from a group.' operationId: removeContactsFromAGroup description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: contact_ids: type: array description: 'The id of an existing record in the contacts table.' example: null items: type: string security: [] get: summary: 'Get all contacts from group (for personalized messaging)' operationId: getAllContactsFromGroupforPersonalizedMessaging description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the contact group.' example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6 required: true schema: type: string '/api/contact-groups/{id}/phone-numbers': get: summary: 'Get phone numbers from a group for sending messages.' operationId: getPhoneNumbersFromAGroupForSendingMessages description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the contact group.' example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6 required: true schema: type: string '/api/contact-groups/{id}/personalized-preview': post: summary: 'Get contacts from group with personalized message previews' operationId: getContactsFromGroupWithPersonalizedMessagePreviews description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: template: type: string description: '' example: consequatur nullable: false required: - template security: [] parameters: - in: path name: id description: 'The ID of the contact group.' example: 2a3dd333-830e-4df5-b8dc-d9846b7d31d6 required: true schema: type: string /api/announcements: get: summary: 'Display a listing of active announcements (public).' operationId: displayAListingOfActiveAnnouncementspublic description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] /api/announcements/admin: get: summary: 'Display all announcements (admin only).' operationId: displayAllAnnouncementsadminOnly description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] post: summary: 'Store a newly created announcement (admin only).' operationId: storeANewlyCreatedAnnouncementadminOnly description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false message: type: string description: '' example: consequatur nullable: false type: type: string description: '' example: maintenance nullable: false enum: - info - warning - maintenance - promo - urgent is_active: type: boolean description: '' example: false nullable: false starts_at: type: string description: 'Must be a valid date.' example: '2026-05-27T13:16:53' nullable: true expires_at: type: string description: 'Must be a valid date. Must be a date after starts_at.' example: '2107-06-26' nullable: true required: - title - message - type security: [] '/api/announcements/admin/{id}': get: summary: 'Display the specified announcement.' operationId: displayTheSpecifiedAnnouncement description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] put: summary: 'Update the specified announcement (admin only).' operationId: updateTheSpecifiedAnnouncementadminOnly description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false message: type: string description: '' example: consequatur nullable: false type: type: string description: '' example: promo nullable: false enum: - info - warning - maintenance - promo - urgent is_active: type: boolean description: '' example: true nullable: false starts_at: type: string description: 'Must be a valid date.' example: '2026-05-27T13:16:53' nullable: true expires_at: type: string description: 'Must be a valid date. Must be a date after starts_at.' example: '2107-06-26' nullable: true required: - title - message - type security: [] patch: summary: 'Update the specified announcement (admin only).' operationId: updateTheSpecifiedAnnouncementadminOnly description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false message: type: string description: '' example: consequatur nullable: false type: type: string description: '' example: maintenance nullable: false enum: - info - warning - maintenance - promo - urgent is_active: type: boolean description: '' example: false nullable: false starts_at: type: string description: 'Must be a valid date.' example: '2026-05-27T13:16:53' nullable: true expires_at: type: string description: 'Must be a valid date. Must be a date after starts_at.' example: '2107-06-26' nullable: true required: - title - message - type security: [] delete: summary: 'Remove the specified announcement (admin only).' operationId: removeTheSpecifiedAnnouncementadminOnly description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the admin.' example: consequatur required: true schema: type: string '/api/announcements/admin/{id}/toggle': post: summary: 'Toggle announcement active status (admin only).' operationId: toggleAnnouncementActiveStatusadminOnly description: '' parameters: [] responses: { } tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the admin.' example: consequatur required: true schema: type: string '/api/announcements/{id}': get: summary: 'Display the specified announcement.' operationId: displayTheSpecifiedAnnouncement description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Unauthorized - No Bearer Token' properties: message: type: string example: 'Unauthorized - No Bearer Token' tags: - Endpoints security: [] parameters: - in: path name: id description: 'The ID of the announcement.' example: consequatur required: true schema: type: string /api/whatsapp/messages/text: post: summary: 'Send a text message' operationId: sendATextMessage description: "Send a WhatsApp text message via a single device OR via a Send Pool\n(rotator). Exactly one of `session_id` or `pool_id` must be provided.\n\nWhen `pool_id` is set, the server picks a healthy member device from\nthe pool using round-robin and routes the message through it. Pool\nrouting is a Supporter-only feature; non-Supporters receive HTTP 402." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: 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' properties: success: type: boolean example: true data: type: object properties: id: type: integer example: 123 message_id: type: string example: 3EB0XXXXXX status: type: string example: sent quoted: type: string example: null mentions: type: array example: [] routed_via: type: object properties: pool_id: type: string example: 7c39e0a4-... device_id: type: string example: device-a-fe223dfc-... message: type: string example: 'Message sent successfully' 402: description: 'pool routing requires Supporter' content: application/json: schema: type: object example: success: false message: 'Send pools are a Supporter feature.' upgrade_url: 'https://trakteer.id/flowkirim' properties: success: type: boolean example: false message: type: string example: 'Send pools are a Supporter feature.' upgrade_url: type: string example: 'https://trakteer.id/flowkirim' 503: description: 'all pool members offline' content: application/json: schema: type: object example: success: false message: 'No member device is currently connected. All pool members are offline or circuit-broken.' properties: success: type: boolean example: false message: type: string example: 'No member device is currently connected. All pool members are offline or circuit-broken.' tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: 'Single-device send. Required unless `pool_id` is provided.' example: my-device-fe223dfc-7573-43c0-8f7d-849d41956117_1769250847 nullable: true pool_id: type: string description: 'Send Pool UUID for rotator routing. Required unless `session_id` is provided. Supporter-only.' example: 7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b nullable: true to: type: string description: 'Recipient phone number with country code, no `+`.' example: '6281234567890' nullable: false message: type: string description: 'The text body.' example: 'Hello from Flowkirim!' nullable: false quoted_message_id: type: string description: 'Optional ID of a previous message to quote/reply to.' example: 3EB0XXXXXXXX nullable: true mentions: type: array description: 'Optional list of JIDs to @-mention.' example: - 6281234567890@s.whatsapp.net items: type: string required: - to - message security: [] /api/whatsapp/messages/media: post: summary: 'Send a media message' operationId: sendAMediaMessage description: "Send a media (image / audio / video / document) message via a single\ndevice OR via a Send Pool. Exactly one of `session_id` or `pool_id`\nis required." parameters: [] responses: { } tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: 'Single-device send. Required unless `pool_id` is provided.' example: consequatur nullable: true pool_id: type: string description: 'Send Pool UUID for rotator routing. Required unless `session_id` is provided. Supporter-only.' example: consequatur nullable: true to: type: string description: 'Recipient phone number.' example: consequatur nullable: false media_url: type: string description: 'URL of the media file to download and send.' example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html' nullable: false type: type: string description: 'One of: image, audio, video, document.' example: consequatur nullable: false caption: type: string description: 'Optional caption shown beneath the media.' example: consequatur nullable: true required: - to - media_url - type security: [] /api/whatsapp/messages/group/text: post: summary: 'Send a text message to a group' operationId: sendATextMessageToAGroup description: "Send a text message to a WhatsApp group via a single device OR a Send Pool (rotator).\nExactly one of `session_id` or `pool_id` is required." parameters: [] responses: { } tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: 'Single-device send. Required unless `pool_id` is provided.' example: consequatur nullable: true pool_id: type: string description: 'Send Pool UUID for rotator routing. Required unless `session_id` is provided. Supporter-only.' example: consequatur nullable: true group_id: type: string description: 'Group JID.' example: 6281234567890-1234567890@g.us nullable: false message: type: string description: 'The text body.' example: consequatur nullable: false quoted_message_id: type: string description: 'Optional ID of a previous message to quote/reply to.' example: consequatur nullable: true mentions: type: array description: 'Optional list of JIDs to @-mention.' example: - consequatur items: type: string required: - group_id - message security: [] /api/whatsapp/messages/group/media: post: summary: 'Send a media message to a group' operationId: sendAMediaMessageToAGroup description: 'Send a media message to a WhatsApp group via a single device OR a Send Pool.' parameters: [] responses: { } tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: 'Single-device send. Required unless `pool_id` is provided.' example: consequatur nullable: true pool_id: type: string description: 'Send Pool UUID. Required unless `session_id` is provided. Supporter-only.' example: consequatur nullable: true group_id: type: string description: 'Group JID.' example: consequatur nullable: false media_url: type: string description: 'URL of the media file.' example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html' nullable: false type: type: string description: 'One of: image, audio, video, document.' example: consequatur nullable: false caption: type: string description: 'Optional caption.' example: consequatur nullable: true required: - group_id - media_url - type security: [] /api/whatsapp/messages/bulk/text: post: summary: 'Send bulk text messages' operationId: sendBulkTextMessages description: "Queue a bulk broadcast of the same text to many recipients. Exactly\none of `session_id` or `pool_id` must be provided.\n\nWhen `pool_id` is used (Supporter-only), the server picks a healthy\npool member device PER RECIPIENT using round-robin -- so a 500-\ncontact broadcast spreads evenly across however many devices are\nin the pool. This is the natural use case for rotators." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true data: job_id: bulk_pool-7c39... total: 500 mentions: [] message: 'Bulk message job created' properties: success: type: boolean example: true data: type: object properties: job_id: type: string example: bulk_pool-7c39... total: type: integer example: 500 mentions: type: array example: [] message: type: string example: 'Bulk message job created' 402: description: 'pool routing requires Supporter' content: application/json: schema: type: object example: success: false message: 'Send pools are a Supporter feature.' upgrade_url: 'https://trakteer.id/flowkirim' properties: success: type: boolean example: false message: type: string example: 'Send pools are a Supporter feature.' upgrade_url: type: string example: 'https://trakteer.id/flowkirim' tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: 'Single-device send. Required unless `pool_id` is provided.' example: my-device-fe223dfc-..._1769250847 nullable: true pool_id: type: string description: 'Send Pool UUID. Required unless `session_id` is provided. Supporter-only.' example: 7c39e0a4-4b8b-4f3a-9c8a-1f2d3e4f5a6b nullable: true contacts: type: array description: 'Array of recipient phone numbers (country code, no `+`). Max 1000.' example: - '6281234567890' - '6285678901234' items: type: string message: type: string description: 'Text body sent to every recipient.' example: 'Halo dari Flowkirim!' nullable: false delay: type: integer description: 'Optional milliseconds between sends (default 1000, min 100, max 60000).' example: 1500 nullable: true mentions: type: array description: 'Optional list of mention JIDs.' example: - 6281234567890@s.whatsapp.net items: type: string required: - contacts - message security: [] /api/whatsapp/messages/schedule/text: post: summary: 'Schedule a text message' operationId: scheduleATextMessage description: "Schedule a text message for a future time, sent via a single device\nOR via a Send Pool (rotator). Pool routing for scheduled messages\nre-picks a healthy member device AT FIRE TIME and re-validates the\nowner's Supporter status -- if they lapsed before the scheduled\ntime, the scheduled message fails." parameters: [] responses: { } tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: session_id: type: string description: 'Single-device scheduled send. Required unless `pool_id` is provided.' example: consequatur nullable: true pool_id: type: string description: 'Send Pool UUID for rotator routing. Required unless `session_id` is provided. Supporter-only at schedule time AND at fire time.' example: consequatur nullable: true to: type: string description: 'Recipient phone number.' example: consequatur nullable: false message: type: string description: 'The text body.' example: consequatur nullable: false scheduled_at: type: string description: 'ISO 8601 timestamp in the future.' example: '2026-06-15T14:30:00Z' nullable: false required: - to - message - scheduled_at security: []