openapi: 3.0.3 info: title: 'Metzi Message API Documentation' description: 'A multi-channel API to send messages via email and WhatsApp using different providers. Flexible, scalable, and easy to integrate.' version: 1.0.0 servers: - url: 'https://metzi-messages.axolotesource.io' tags: - name: Campaigns description: '' - name: Channels description: '' - name: Devices description: '' - name: Drivers description: '' - name: Emails description: '' - name: Messages description: '' - name: Providers description: '' - name: 'Push Notifications' description: '' - name: WhatsApp description: '' - name: 'WhatsApp Incoming' description: '' - name: 'WhatsApp Replicate URLs' description: '' - name: 'WhatsApp Templates' description: '' - name: 'WhatsApp Webhook' description: '' components: securitySchemes: default: type: http scheme: bearer description: 'You can retrieve your token by visiting your dashboard and clicking Generate API token.' security: - default: [] paths: /api/v1/campaigns: get: summary: 'List all campaigns.' operationId: listAllCampaigns description: 'Returns a paginated list of campaigns with their channel, WhatsApp template and status. Supports search by name.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 01a1c240-3857-7193-9352-16c9c2462118 name: 'aut adipisci quidem' channel_id: 62 channel_name: 'Iure odit.' status_name: Pending whatsapp_template_id: 01a1c240-3854-707d-b788-a429dbc6fa3c template_name: 'enim non facere' started_at: '2026-11-08T11:57:32.000000Z' finished_at: '2026-10-26T03:50:40.000000Z' created_at: '2026-11-09T21:39:11.000000Z' - id: 01a1c240-385f-7399-8211-84426013286b name: 'laboriosam praesentium quis' channel_id: 63 channel_name: Eum. status_name: Sending whatsapp_template_id: 01a1c240-385d-71d4-81b7-761ddb6719a4 template_name: 'nemo odit quia' started_at: '2026-10-15T22:36:16.000000Z' finished_at: '2026-11-07T21:00:15.000000Z' created_at: '2026-11-09T21:39:11.000000Z' properties: data: type: array example: - id: 01a1c240-3857-7193-9352-16c9c2462118 name: 'aut adipisci quidem' channel_id: 62 channel_name: 'Iure odit.' status_name: Pending whatsapp_template_id: 01a1c240-3854-707d-b788-a429dbc6fa3c template_name: 'enim non facere' started_at: '2026-11-08T11:57:32.000000Z' finished_at: '2026-10-26T03:50:40.000000Z' created_at: '2026-11-09T21:39:11.000000Z' - id: 01a1c240-385f-7399-8211-84426013286b name: 'laboriosam praesentium quis' channel_id: 63 channel_name: Eum. status_name: Sending whatsapp_template_id: 01a1c240-385d-71d4-81b7-761ddb6719a4 template_name: 'nemo odit quia' started_at: '2026-10-15T22:36:16.000000Z' finished_at: '2026-11-07T21:00:15.000000Z' created_at: '2026-11-09T21:39:11.000000Z' items: type: object properties: id: type: string example: 01a1c240-3857-7193-9352-16c9c2462118 name: type: string example: 'aut adipisci quidem' channel_id: type: integer example: 62 channel_name: type: string example: 'Iure odit.' status_name: type: string example: Pending whatsapp_template_id: type: string example: 01a1c240-3854-707d-b788-a429dbc6fa3c template_name: type: string example: 'enim non facere' started_at: type: string example: '2026-11-08T11:57:32.000000Z' finished_at: type: string example: '2026-10-26T03:50:40.000000Z' created_at: type: string example: '2026-11-09T21:39:11.000000Z' required: - id - name - channel_id - channel_name - status_name - whatsapp_template_id - template_name - started_at - finished_at - created_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Campaigns post: summary: 'Create a campaign.' operationId: createACampaign description: 'Creates a new campaign from a CSV/TXT file containing the recipient phone numbers. The campaign is created with pending status.' parameters: [] responses: { } tags: - Campaigns requestBody: required: true content: multipart/form-data: schema: type: object properties: channel_id: type: number description: 'The id of an existing record in the channels table.' example: 4326.41688 whatsapp_template_id: type: string description: 'The id of an existing record in the whatsapp_templates table.' example: architecto nullable: true name: type: string description: 'Must not be greater than 255 characters.' example: 'n' started_at: type: string description: 'Must be a valid date.' example: '2026-11-09T21:39:11' nullable: true finished_at: type: string description: 'Must be a valid date.' example: '2026-11-09T21:39:11' nullable: true file: type: string format: binary description: 'Must be a file.' campaign_status_id: type: number description: '' example: 4326.41688 nullable: true required: - channel_id - name - file '/api/v1/campaigns/{id}': get: summary: 'Get a campaign.' operationId: getACampaign description: 'Returns the details of the campaign identified by its ID, including its channel, status, WhatsApp template and recipients.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 01a1c240-38d0-7294-9ee8-6a3404533f41 name: 'eius et animi' channel_id: 65 channel_name: Sunt. status_name: Cancelled whatsapp_template_id: 01a1c240-38cf-734a-916b-015120eb161d template_name: 'adipisci quidem nostrum' whatsapp_template: id: 01a1c240-38cf-734a-916b-015120eb161d name: 'adipisci quidem nostrum' language: es_MX category: MARKETING status: APPROVED components: [] started_at: '2026-10-19T03:18:21.000000Z' finished_at: '2026-10-15T09:31:38.000000Z' created_at: '2026-11-09T21:39:11.000000Z' updated_at: '2026-11-09T21:39:11.000000Z' properties: data: type: object properties: id: type: string example: 01a1c240-38d0-7294-9ee8-6a3404533f41 name: type: string example: 'eius et animi' channel_id: type: integer example: 65 channel_name: type: string example: Sunt. status_name: type: string example: Cancelled whatsapp_template_id: type: string example: 01a1c240-38cf-734a-916b-015120eb161d template_name: type: string example: 'adipisci quidem nostrum' whatsapp_template: type: object properties: id: type: string example: 01a1c240-38cf-734a-916b-015120eb161d name: type: string example: 'adipisci quidem nostrum' language: type: string example: es_MX category: type: string example: MARKETING status: type: string example: APPROVED components: type: array example: [] required: - id - name started_at: type: string example: '2026-10-19T03:18:21.000000Z' finished_at: type: string example: '2026-10-15T09:31:38.000000Z' created_at: type: string example: '2026-11-09T21:39:11.000000Z' updated_at: type: string example: '2026-11-09T21:39:11.000000Z' required: - id - name - channel_id - channel_name - status_name - whatsapp_template_id - template_name - whatsapp_template - started_at - finished_at - created_at - updated_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Campaigns requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id put: summary: 'Update a campaign.' operationId: updateACampaign description: 'Updates the name, channel, WhatsApp template and scheduling dates of the campaign identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 01a1c240-3903-70b1-84bc-3996d3d314f8 name: 'et animi quos' channel_id: 67 channel_name: Sunt. status_name: Pending whatsapp_template_id: 01a1c240-3901-7395-a260-62ce3ab08aa9 template_name: 'nostrum qui commodi' whatsapp_template: id: 01a1c240-3901-7395-a260-62ce3ab08aa9 name: 'nostrum qui commodi' language: en_US category: MARKETING status: PENDING components: [] started_at: null finished_at: '2026-10-15T09:31:38.000000Z' created_at: '2026-11-09T21:39:11.000000Z' updated_at: '2026-11-09T21:39:11.000000Z' properties: data: type: object properties: id: type: string example: 01a1c240-3903-70b1-84bc-3996d3d314f8 name: type: string example: 'et animi quos' channel_id: type: integer example: 67 channel_name: type: string example: Sunt. status_name: type: string example: Pending whatsapp_template_id: type: string example: 01a1c240-3901-7395-a260-62ce3ab08aa9 template_name: type: string example: 'nostrum qui commodi' whatsapp_template: type: object properties: id: type: string example: 01a1c240-3901-7395-a260-62ce3ab08aa9 name: type: string example: 'nostrum qui commodi' language: type: string example: en_US category: type: string example: MARKETING status: type: string example: PENDING components: type: array example: [] required: - id - name started_at: type: string example: null nullable: true finished_at: type: string example: '2026-10-15T09:31:38.000000Z' created_at: type: string example: '2026-11-09T21:39:11.000000Z' updated_at: type: string example: '2026-11-09T21:39:11.000000Z' required: - id - name - channel_id - channel_name - status_name - whatsapp_template_id - template_name - whatsapp_template - started_at - finished_at - created_at - updated_at tags: - Campaigns requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto channel_id: type: number description: 'The id of an existing record in the channels table.' example: 4326.41688 whatsapp_template_id: type: string description: 'The id of an existing record in the whatsapp_templates table.' example: architecto nullable: true name: type: string description: 'Must not be greater than 255 characters.' example: 'n' required: - id - channel_id - name delete: summary: 'Delete a campaign.' operationId: deleteACampaign description: 'Removes the campaign identified by its ID.' parameters: [] responses: { } tags: - Campaigns requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id parameters: - in: path name: id description: 'The campaign ID.' example: architecto required: true schema: type: string '/api/v1/campaigns/{id}/phones': get: summary: 'List the phones of a campaign.' operationId: listThePhonesOfACampaign description: 'Returns a paginated list of phone numbers associated with the campaign identified by its ID. Supports search by phone.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 13 phone: '+12038673351' whatsapp_status: 'true' - id: 14 phone: '+13375699723' whatsapp_status: 'true' properties: data: type: array example: - id: 13 phone: '+12038673351' whatsapp_status: 'true' - id: 14 phone: '+13375699723' whatsapp_status: 'true' items: type: object properties: id: type: integer example: 13 phone: type: string example: '+12038673351' whatsapp_status: type: string example: 'true' required: - id - phone - whatsapp_status 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Campaigns requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id parameters: - in: path name: id description: 'The campaign ID.' example: architecto required: true schema: type: string '/api/v1/campaigns/{id}/send': post: summary: 'Send a campaign.' operationId: sendACampaign description: 'Starts sending the campaign identified by its ID. Only pending campaigns can be sent: the status changes to sending and the messages are queued for delivery.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 01a1c240-3993-7246-88be-4eb3c13995c2 name: 'quos velit et' channel_id: 69 channel_name: Harum. status_name: Pending whatsapp_template_id: 01a1c240-398f-70b6-b842-f34253ed19e0 template_name: 'commodi incidunt iure' whatsapp_template: id: 01a1c240-398f-70b6-b842-f34253ed19e0 name: 'commodi incidunt iure' language: pt_BR category: AUTHENTICATION status: PENDING components: [] started_at: '2026-10-23T16:40:34.000000Z' finished_at: '2026-10-31T13:10:43.000000Z' created_at: '2026-11-09T21:39:11.000000Z' updated_at: '2026-11-09T21:39:11.000000Z' properties: data: type: object properties: id: type: string example: 01a1c240-3993-7246-88be-4eb3c13995c2 name: type: string example: 'quos velit et' channel_id: type: integer example: 69 channel_name: type: string example: Harum. status_name: type: string example: Pending whatsapp_template_id: type: string example: 01a1c240-398f-70b6-b842-f34253ed19e0 template_name: type: string example: 'commodi incidunt iure' whatsapp_template: type: object properties: id: type: string example: 01a1c240-398f-70b6-b842-f34253ed19e0 name: type: string example: 'commodi incidunt iure' language: type: string example: pt_BR category: type: string example: AUTHENTICATION status: type: string example: PENDING components: type: array example: [] required: - id - name started_at: type: string example: '2026-10-23T16:40:34.000000Z' finished_at: type: string example: '2026-10-31T13:10:43.000000Z' created_at: type: string example: '2026-11-09T21:39:11.000000Z' updated_at: type: string example: '2026-11-09T21:39:11.000000Z' required: - id - name - channel_id - channel_name - status_name - whatsapp_template_id - template_name - whatsapp_template - started_at - finished_at - created_at - updated_at tags: - Campaigns requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto campaign_status_id: type: number description: '' example: 4326.41688 nullable: true required: - id parameters: - in: path name: id description: 'The campaign ID.' example: architecto required: true schema: type: string /api/v1/channels: get: summary: 'List all channels.' operationId: listAllChannels description: 'Returns a paginated list of messaging channels. Supports search by name.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 71 name: Aut. - id: 72 name: 'Et et.' properties: data: type: array example: - id: 71 name: Aut. - id: 72 name: 'Et et.' items: type: object properties: id: type: integer example: 71 name: type: string example: Aut. required: - id - name 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Channels /api/v1/firebase/devices: get: summary: 'List the registered devices.' operationId: listTheRegisteredDevices description: 'Returns a paginated list of active devices with their FCM token, operating system and owner.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 44 fcm_token: optio-laboriosam-cumque-incidunt-ipsa-non-laborum-rerum-officiis-reiciendis-necessitatibus-officiis-nihil os: web active: true user_id: e12c547f-177d-3325-99be-76a71ba70b94 - id: 45 fcm_token: dolore-consequatur-dolorum-est-voluptas-expedita-eos-molestiae-aliquid os: android active: true user_id: ccb45e30-4579-3bc3-a503-50d70daf2067 properties: data: type: array example: - id: 44 fcm_token: optio-laboriosam-cumque-incidunt-ipsa-non-laborum-rerum-officiis-reiciendis-necessitatibus-officiis-nihil os: web active: true user_id: e12c547f-177d-3325-99be-76a71ba70b94 - id: 45 fcm_token: dolore-consequatur-dolorum-est-voluptas-expedita-eos-molestiae-aliquid os: android active: true user_id: ccb45e30-4579-3bc3-a503-50d70daf2067 items: type: object properties: id: type: integer example: 44 fcm_token: type: string example: optio-laboriosam-cumque-incidunt-ipsa-non-laborum-rerum-officiis-reiciendis-necessitatibus-officiis-nihil os: type: string example: web active: type: boolean example: true user_id: type: string example: e12c547f-177d-3325-99be-76a71ba70b94 required: - id - fcm_token - os - active - user_id 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Devices post: summary: 'Register a device.' operationId: registerADevice description: 'Validates the FCM token against Firebase and stores it with its operating system for the authenticated user. If the token already exists, the existing device is updated.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: fcm_token: quos-velit-et-fugiat-sunt-nihil-accusantium-harum-mollitia-modi-deserunt-aut-ab active: true properties: data: type: object properties: fcm_token: type: string example: quos-velit-et-fugiat-sunt-nihil-accusantium-harum-mollitia-modi-deserunt-aut-ab active: type: boolean example: true required: - fcm_token - active tags: - Devices requestBody: required: true content: application/json: schema: type: object properties: fcm_token: type: string description: '' example: architecto os: type: string description: '' example: architecto enum: - android - ios - web required: - fcm_token - os '/api/v1/firebase/devices/{fcm_token}': patch: summary: 'Update a device.' operationId: updateADevice description: 'Enables or disables the device identified by its FCM token. If the token is not registered, no changes are made.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: fcm_token: perspiciatis-quo-omnis-nostrum-aut-adipisci-quidem-nostrum-qui-commodi-incidunt-iure-odit-et active: true properties: data: type: object properties: fcm_token: type: string example: perspiciatis-quo-omnis-nostrum-aut-adipisci-quidem-nostrum-qui-commodi-incidunt-iure-odit-et active: type: boolean example: true required: - fcm_token - active tags: - Devices requestBody: required: true content: application/json: schema: type: object properties: fcm_token: type: string description: '' example: architecto active: type: boolean description: '' example: true required: - fcm_token - active parameters: - in: path name: fcm_token description: 'The FCM token that identifies the device.' example: architecto required: true schema: type: string /api/v1/drivers: get: summary: 'List all drivers.' operationId: listAllDrivers description: 'Returns a paginated list of messaging drivers. Supports search by name.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1 name: smtp config_key: mail.mailers.smtp created_at: '2026-09-10T19:37:57.000000Z' updated_at: '2026-11-09T21:39:07.000000Z' - id: 1 name: smtp config_key: mail.mailers.smtp created_at: '2026-09-10T19:37:57.000000Z' updated_at: '2026-11-09T21:39:07.000000Z' properties: data: type: array example: - id: 1 name: smtp config_key: mail.mailers.smtp created_at: '2026-09-10T19:37:57.000000Z' updated_at: '2026-11-09T21:39:07.000000Z' - id: 1 name: smtp config_key: mail.mailers.smtp created_at: '2026-09-10T19:37:57.000000Z' updated_at: '2026-11-09T21:39:07.000000Z' items: type: object properties: id: type: integer example: 1 name: type: string example: smtp config_key: type: string example: mail.mailers.smtp created_at: type: string example: '2026-09-10T19:37:57.000000Z' updated_at: type: string example: '2026-11-09T21:39:07.000000Z' required: - id - name - config_key - created_at - updated_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Drivers post: summary: 'Create a driver.' operationId: createADriver description: 'Creates a new messaging driver with its name and configuration key.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 1 name: smtp config_key: mail.mailers.smtp created_at: '2026-09-10T19:37:57.000000Z' updated_at: '2026-11-09T21:39:07.000000Z' properties: data: type: object properties: id: type: integer example: 1 name: type: string example: smtp config_key: type: string example: mail.mailers.smtp created_at: type: string example: '2026-09-10T19:37:57.000000Z' updated_at: type: string example: '2026-11-09T21:39:07.000000Z' required: - id - name - config_key - created_at - updated_at tags: - Drivers requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b config_key: type: string description: 'Must not be greater than 255 characters.' example: 'n' required: - name - config_key '/api/v1/drivers/{id}': get: summary: 'Get a driver.' operationId: getADriver description: 'Returns the driver identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 name: smtp config_key: mail.mailers.smtp created_at: '2026-09-10T19:37:57.000000Z' updated_at: '2026-11-09T21:39:07.000000Z' properties: data: type: object properties: id: type: integer example: 1 name: type: string example: smtp config_key: type: string example: mail.mailers.smtp created_at: type: string example: '2026-09-10T19:37:57.000000Z' updated_at: type: string example: '2026-11-09T21:39:07.000000Z' required: - id - name - config_key - created_at - updated_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Drivers requestBody: required: true content: application/json: schema: type: object properties: id: type: number description: '' example: 4326.41688 required: - id put: summary: 'Update a driver.' operationId: updateADriver description: 'Updates the name and configuration key of the driver identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1 name: smtp config_key: mail.mailers.smtp created_at: '2026-09-10T19:37:57.000000Z' updated_at: '2026-11-09T21:39:07.000000Z' properties: data: type: object properties: id: type: integer example: 1 name: type: string example: smtp config_key: type: string example: mail.mailers.smtp created_at: type: string example: '2026-09-10T19:37:57.000000Z' updated_at: type: string example: '2026-11-09T21:39:07.000000Z' required: - id - name - config_key - created_at - updated_at tags: - Drivers requestBody: required: true content: application/json: schema: type: object properties: id: type: number description: '' example: 4326.41688 name: type: string description: 'Must not be greater than 255 characters.' example: m config_key: type: string description: 'Must not be greater than 255 characters.' example: i required: - id - name - config_key delete: summary: 'Delete a driver.' operationId: deleteADriver description: 'Removes the driver identified by its ID. Drivers associated with provider configurations cannot be deleted.' parameters: [] responses: { } tags: - Drivers requestBody: required: true content: application/json: schema: type: object properties: id: type: number description: '' example: 4326.41688 required: - id parameters: - in: path name: id description: 'The driver ID.' example: 16 required: true schema: type: integer /api/v1/emails: get: summary: 'List all email templates.' operationId: listAllEmailTemplates description: 'Returns a paginated list of email templates with their variables. Supports search by name.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 01a1c240-372a-73e4-be02-3b10d961b409 name: aut description: 'Quidem nostrum qui commodi incidunt iure odit.' view_path: emails.templates.aut subject: 'Et modi ipsum nostrum omnis autem et consequatur.' variables: [] raw_data: null created_at: '2026-11-09T21:39:10.000000Z' - id: 01a1c240-3731-7309-bada-2999cb74c1a5 name: dolores description: 'Non facere tempora ex voluptatem laboriosam praesentium.' view_path: emails.templates.dolores subject: 'Adipisci molestias fugit deleniti distinctio eum doloremque id.' variables: [] raw_data: null created_at: '2026-11-09T21:39:10.000000Z' properties: data: type: array example: - id: 01a1c240-372a-73e4-be02-3b10d961b409 name: aut description: 'Quidem nostrum qui commodi incidunt iure odit.' view_path: emails.templates.aut subject: 'Et modi ipsum nostrum omnis autem et consequatur.' variables: [] raw_data: null created_at: '2026-11-09T21:39:10.000000Z' - id: 01a1c240-3731-7309-bada-2999cb74c1a5 name: dolores description: 'Non facere tempora ex voluptatem laboriosam praesentium.' view_path: emails.templates.dolores subject: 'Adipisci molestias fugit deleniti distinctio eum doloremque id.' variables: [] raw_data: null created_at: '2026-11-09T21:39:10.000000Z' items: type: object properties: id: type: string example: 01a1c240-372a-73e4-be02-3b10d961b409 name: type: string example: aut description: type: string example: 'Quidem nostrum qui commodi incidunt iure odit.' view_path: type: string example: emails.templates.aut subject: type: string example: 'Et modi ipsum nostrum omnis autem et consequatur.' variables: type: array example: [] raw_data: type: string example: null nullable: true created_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - name - description - view_path - subject - variables - raw_data - created_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Emails /api/v1/messages/whatsapp/send: post: summary: 'Send a WhatsApp template message.' operationId: sendAWhatsAppTemplateMessage description: 'Sends a WhatsApp template message to a phone number using the default Meta provider, with optional parameters and buttons.' parameters: [] responses: { } tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: template_name: type: string description: '' example: architecto phone_number: type: string description: '' example: architecto required: - template_name - phone_number /api/v1/messages/whatsapp/send-document-by-url: post: summary: 'Send a WhatsApp document by URL.' operationId: sendAWhatsAppDocumentByURL description: 'Sends a document to a WhatsApp number using a publicly accessible URL and the given filename.' parameters: [] responses: { } tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: country_code: type: string description: '' example: architecto phone_number: type: string description: 'Must be 10 digits.' example: '8225697751' url: type: string description: 'Must be a valid URL.' example: 'http://crooks.biz/et-fugiat-sunt-nihil-accusantium' filename: type: string description: '' example: architecto required: - country_code - phone_number - url - filename /api/v1/messages/email/send: post: summary: 'Send an email message.' operationId: sendAnEmailMessage description: 'Sends an email using the given template and the default email provider. A message record is created along with its history and details.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 24 channel_provider_id: 01a1c240-360a-72b0-bceb-658f71fc8ff5 created_user_id: '6806' message_status_id: 13 attempts: 53 created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' deleted_at: null properties: data: type: object properties: id: type: integer example: 24 channel_provider_id: type: string example: 01a1c240-360a-72b0-bceb-658f71fc8ff5 created_user_id: type: string example: '6806' message_status_id: type: integer example: 13 attempts: type: integer example: 53 created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' deleted_at: type: string example: null nullable: true required: - id - channel_provider_id - created_user_id - message_status_id - attempts - created_at - updated_at - deleted_at tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: template_name: type: string description: '' example: architecto subject: type: string description: '' example: architecto to: type: string description: '' example: architecto cc: type: string description: '' example: architecto nullable: true params: type: object description: '' example: null properties: { } nullable: true required: - template_name - subject - to /api/v1/messages/push-notifications/send: post: summary: 'Send a push notification.' operationId: sendAPushNotification description: 'Sends a pending push notification to specific users, a user list, or all users.' parameters: [] responses: { } tags: - Messages requestBody: required: true content: application/json: schema: type: object properties: push_notification_id: type: string description: 'The id of an existing record in the push_notifications table.' example: architecto required: - push_notification_id /api/v1/providers: get: summary: 'List all providers.' operationId: listAllProviders description: 'Returns a paginated list of messaging providers with their channels and configuration. Supports search by name.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 01a1c240-3b13-7289-80ec-612c18699585 name: Aut. active: true channels: [] driver_name: null default: false provider_config: null - id: 01a1c240-3b1b-716c-b50c-5ee841fee79c name: Nostrum. active: true channels: [] driver_name: null default: false provider_config: null properties: data: type: array example: - id: 01a1c240-3b13-7289-80ec-612c18699585 name: Aut. active: true channels: [] driver_name: null default: false provider_config: null - id: 01a1c240-3b1b-716c-b50c-5ee841fee79c name: Nostrum. active: true channels: [] driver_name: null default: false provider_config: null items: type: object properties: id: type: string example: 01a1c240-3b13-7289-80ec-612c18699585 name: type: string example: Aut. active: type: boolean example: true channels: type: array example: [] driver_name: type: string example: null nullable: true default: type: boolean example: false provider_config: type: string example: null nullable: true required: - id - name - active - channels - driver_name - default - provider_config 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Providers post: summary: 'Create a provider.' operationId: createAProvider description: 'Creates a provider with its channels and a single provider configuration.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 01a1c240-3b4e-7032-8f21-60fc13309704 name: 'Eius et.' active: true channels: [] driver_name: null default: false provider_config: null properties: data: type: object properties: id: type: string example: 01a1c240-3b4e-7032-8f21-60fc13309704 name: type: string example: 'Eius et.' active: type: boolean example: true channels: type: array example: [] driver_name: type: string example: null nullable: true default: type: boolean example: false provider_config: type: string example: null nullable: true required: - id - name - active - channels - driver_name - default - provider_config tags: - Providers requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 50 characters.' example: b active: type: boolean description: '' example: false channel_ids: type: array description: 'The id of an existing record in the channels table.' example: - 16 items: type: integer provider_config: type: object description: '' example: [] properties: name: type: string description: 'Must not be greater than 50 characters.' example: b driver_id: type: integer description: 'The id of an existing record in the drivers table.' example: 16 active: type: boolean description: '' example: false default: type: boolean description: '' example: true config: type: object description: '' example: null properties: { } required: - name - driver_id - active - default required: - name - active - channel_ids - provider_config '/api/v1/providers/{id}': get: summary: 'Get a provider.' operationId: getAProvider description: 'Returns the provider identified by its ID, including its channels and configuration.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 01a1c240-3ba6-71e3-acda-13acc3b6c322 name: 'Eius et.' active: true channels: [] driver_name: null default: false provider_config: null properties: data: type: object properties: id: type: string example: 01a1c240-3ba6-71e3-acda-13acc3b6c322 name: type: string example: 'Eius et.' active: type: boolean example: true channels: type: array example: [] driver_name: type: string example: null nullable: true default: type: boolean example: false provider_config: type: string example: null nullable: true required: - id - name - active - channels - driver_name - default - provider_config 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Providers requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id put: summary: 'Update a provider.' operationId: updateAProvider description: 'Updates the name, active state, channels and configuration of the provider identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 01a1c240-3bcc-71ee-8bc9-c0c63b1942c1 name: 'Eius et.' active: true channels: [] driver_name: null default: false provider_config: null properties: data: type: object properties: id: type: string example: 01a1c240-3bcc-71ee-8bc9-c0c63b1942c1 name: type: string example: 'Eius et.' active: type: boolean example: true channels: type: array example: [] driver_name: type: string example: null nullable: true default: type: boolean example: false provider_config: type: string example: null nullable: true required: - id - name - active - channels - driver_name - default - provider_config tags: - Providers requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto name: type: string description: 'Must not be greater than 50 characters.' example: 'n' active: type: boolean description: '' example: true channel_ids: type: array description: 'The id of an existing record in the channels table.' example: - 16 items: type: integer provider_config: type: object description: '' example: [] properties: name: type: string description: 'Must not be greater than 50 characters.' example: b driver_id: type: integer description: 'The id of an existing record in the drivers table.' example: 16 active: type: boolean description: '' example: false default: type: boolean description: '' example: true config: type: object description: '' example: null properties: { } required: - name - driver_id - active - default required: - id - name - active - channel_ids - provider_config delete: summary: 'Delete a provider.' operationId: deleteAProvider description: 'Removes the provider identified by its ID. Providers with associated messages cannot be deleted.' parameters: [] responses: { } tags: - Providers requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id parameters: - in: path name: id description: 'The provider UUID.' example: architecto required: true schema: type: string /api/v1/push-notifications: get: summary: 'List all push notifications.' operationId: listAllPushNotifications description: 'Returns a paginated list of push notifications with their status. Supports search by title or body.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 01a1c240-377b-7004-b0b8-a5ea2c9ab912 title: 'Adipisci quidem nostrum qui commodi incidunt iure.' body: 'Et modi ipsum nostrum omnis autem et consequatur. Dolores enim non facere tempora. Voluptatem laboriosam praesentium quis adipisci.' status_name: Pending total_devices: 0 success_count: 0 failure_count: 0 created_at: '2026-11-09T21:39:10.000000Z' - id: 01a1c240-3780-72f2-a615-6c518dbfc024 title: 'Distinctio eum doloremque id aut libero aliquam veniam corporis.' body: 'Deleniti nemo odit quia officia. Dignissimos neque blanditiis odio. Excepturi doloribus delectus fugit qui repudiandae laboriosam.' status_name: Pending total_devices: 0 success_count: 0 failure_count: 0 created_at: '2026-11-09T21:39:10.000000Z' properties: data: type: array example: - id: 01a1c240-377b-7004-b0b8-a5ea2c9ab912 title: 'Adipisci quidem nostrum qui commodi incidunt iure.' body: 'Et modi ipsum nostrum omnis autem et consequatur. Dolores enim non facere tempora. Voluptatem laboriosam praesentium quis adipisci.' status_name: Pending total_devices: 0 success_count: 0 failure_count: 0 created_at: '2026-11-09T21:39:10.000000Z' - id: 01a1c240-3780-72f2-a615-6c518dbfc024 title: 'Distinctio eum doloremque id aut libero aliquam veniam corporis.' body: 'Deleniti nemo odit quia officia. Dignissimos neque blanditiis odio. Excepturi doloribus delectus fugit qui repudiandae laboriosam.' status_name: Pending total_devices: 0 success_count: 0 failure_count: 0 created_at: '2026-11-09T21:39:10.000000Z' items: type: object properties: id: type: string example: 01a1c240-377b-7004-b0b8-a5ea2c9ab912 title: type: string example: 'Adipisci quidem nostrum qui commodi incidunt iure.' body: type: string example: 'Et modi ipsum nostrum omnis autem et consequatur. Dolores enim non facere tempora. Voluptatem laboriosam praesentium quis adipisci.' status_name: type: string example: Pending total_devices: type: integer example: 0 success_count: type: integer example: 0 failure_count: type: integer example: 0 created_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - title - body - status_name - total_devices - success_count - failure_count - created_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Push Notifications' post: summary: 'Create a push notification.' operationId: createAPushNotification description: 'Creates a new push notification with a title, body and optional data payload.' parameters: [] responses: { } tags: - 'Push Notifications' requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: '' example: architecto body: type: string description: '' example: architecto required: - title - body '/api/v1/push-notifications/{id}': get: summary: 'Get a push notification.' operationId: getAPushNotification description: 'Returns the push notification identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: id: 01a1c240-37d9-71ee-b271-e0f023ecc697 title: 'Et animi quos velit et fugiat.' body: 'Accusantium harum mollitia modi deserunt aut ab. Perspiciatis quo omnis nostrum aut adipisci quidem nostrum qui. Incidunt iure odit et et modi ipsum.' data: null user_ids: - d98239dc-1582-3bf2-b93a-df3a18e121d1 status_name: Pending push_notification_status_id: 1 total_devices: 0 success_count: 0 failure_count: 0 created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: id: type: string example: 01a1c240-37d9-71ee-b271-e0f023ecc697 title: type: string example: 'Et animi quos velit et fugiat.' body: type: string example: 'Accusantium harum mollitia modi deserunt aut ab. Perspiciatis quo omnis nostrum aut adipisci quidem nostrum qui. Incidunt iure odit et et modi ipsum.' data: type: string example: null nullable: true user_ids: type: array example: - d98239dc-1582-3bf2-b93a-df3a18e121d1 items: type: string status_name: type: string example: Pending push_notification_status_id: type: integer example: 1 total_devices: type: integer example: 0 success_count: type: integer example: 0 failure_count: type: integer example: 0 created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Push Notifications' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id put: summary: 'Update a push notification.' operationId: updateAPushNotification description: 'Updates the title, body and optional data payload of the push notification identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: id: 01a1c240-37fb-731a-9315-3dfb9185fabc title: 'Et animi quos velit et fugiat.' body: 'Accusantium harum mollitia modi deserunt aut ab. Perspiciatis quo omnis nostrum aut adipisci quidem nostrum qui. Incidunt iure odit et et modi ipsum.' data: null user_ids: - d98239dc-1582-3bf2-b93a-df3a18e121d1 status_name: Pending push_notification_status_id: 1 total_devices: 0 success_count: 0 failure_count: 0 created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: id: type: string example: 01a1c240-37fb-731a-9315-3dfb9185fabc title: type: string example: 'Et animi quos velit et fugiat.' body: type: string example: 'Accusantium harum mollitia modi deserunt aut ab. Perspiciatis quo omnis nostrum aut adipisci quidem nostrum qui. Incidunt iure odit et et modi ipsum.' data: type: string example: null nullable: true user_ids: type: array example: - d98239dc-1582-3bf2-b93a-df3a18e121d1 items: type: string status_name: type: string example: Pending push_notification_status_id: type: integer example: 1 total_devices: type: integer example: 0 success_count: type: integer example: 0 failure_count: type: integer example: 0 created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' tags: - 'Push Notifications' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto title: type: string description: '' example: architecto body: type: string description: '' example: architecto required: - id - title - body delete: summary: 'Delete a push notification.' operationId: deleteAPushNotification description: 'Removes the push notification identified by its ID.' parameters: [] responses: { } tags: - 'Push Notifications' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id parameters: - in: path name: id description: 'The push notification ID.' example: architecto required: true schema: type: string /api/v1/whatsapp/info: get: summary: 'Get the WhatsApp account information.' operationId: getTheWhatsAppAccountInformation description: 'Returns the ID, verified name and quality information of the configured WhatsApp phone number.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - WhatsApp /api/v1/whatsapp/send-text: post: summary: 'Send a WhatsApp text message.' operationId: sendAWhatsAppTextMessage description: 'Sends a plain text message to a WhatsApp number using the default Meta provider.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 27 phone_number: '+14636223498' text: 'Et fugiat sunt nihil accusantium.' direction: inbound status: null created_at: '2026-11-09T21:39:09.000000Z' properties: data: type: object properties: id: type: integer example: 27 phone_number: type: string example: '+14636223498' text: type: string example: 'Et fugiat sunt nihil accusantium.' direction: type: string example: inbound status: type: string example: null nullable: true created_at: type: string example: '2026-11-09T21:39:09.000000Z' required: - id - phone_number - text - direction - status - created_at tags: - WhatsApp requestBody: required: true content: application/json: schema: type: object properties: phone_number: type: string description: '' example: architecto text: type: string description: 'Must be at least 1 character. Must not be greater than 1024 characters.' example: 'n' required: - phone_number - text /api/v1/whatsapp/incoming/contacts: get: summary: 'List all incoming WhatsApp contacts.' operationId: listAllIncomingWhatsAppContacts description: 'Returns a paginated list of contacts that have interacted via WhatsApp, including their last message and unread count. Supports search by phone or profile name.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 49 phone: '+16198290034' name: 'Ferne Fritsch' last_message_text: 'Omnis autem et consequatur.' last_message_at: '2026-11-09T21:39:09.000000Z' unread_count: 0 created_at: '2026-11-09T21:39:09.000000Z' - id: 50 phone: '+15405072316' name: 'Sebastian Haag I' last_message_text: 'Distinctio eum doloremque id aut libero aliquam veniam corporis.' last_message_at: '2026-11-09T21:39:09.000000Z' unread_count: 0 created_at: '2026-11-09T21:39:09.000000Z' properties: data: type: array example: - id: 49 phone: '+16198290034' name: 'Ferne Fritsch' last_message_text: 'Omnis autem et consequatur.' last_message_at: '2026-11-09T21:39:09.000000Z' unread_count: 0 created_at: '2026-11-09T21:39:09.000000Z' - id: 50 phone: '+15405072316' name: 'Sebastian Haag I' last_message_text: 'Distinctio eum doloremque id aut libero aliquam veniam corporis.' last_message_at: '2026-11-09T21:39:09.000000Z' unread_count: 0 created_at: '2026-11-09T21:39:09.000000Z' items: type: object properties: id: type: integer example: 49 phone: type: string example: '+16198290034' name: type: string example: 'Ferne Fritsch' last_message_text: type: string example: 'Omnis autem et consequatur.' last_message_at: type: string example: '2026-11-09T21:39:09.000000Z' unread_count: type: integer example: 0 created_at: type: string example: '2026-11-09T21:39:09.000000Z' required: - id - phone - name - last_message_text - last_message_at - unread_count - created_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'WhatsApp Incoming' '/api/v1/whatsapp/incoming/contacts/{contact}': get: summary: 'Get an incoming WhatsApp contact.' operationId: getAnIncomingWhatsAppContact description: 'Returns the contact identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 52 phone: '+18433596343' name: 'Misael Runte' last_message_text: 'Aut ab provident perspiciatis quo omnis nostrum aut.' last_message_at: '2026-11-09T21:39:09.000000Z' unread_count: 0 messages_count: 0 created_at: '2026-11-09T21:39:09.000000Z' updated_at: '2026-11-09T21:39:09.000000Z' properties: data: type: object properties: id: type: integer example: 52 phone: type: string example: '+18433596343' name: type: string example: 'Misael Runte' last_message_text: type: string example: 'Aut ab provident perspiciatis quo omnis nostrum aut.' last_message_at: type: string example: '2026-11-09T21:39:09.000000Z' unread_count: type: integer example: 0 messages_count: type: integer example: 0 created_at: type: string example: '2026-11-09T21:39:09.000000Z' updated_at: type: string example: '2026-11-09T21:39:09.000000Z' required: - id - phone - name - last_message_text - last_message_at - unread_count - messages_count - created_at - updated_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'WhatsApp Incoming' requestBody: required: true content: application/json: schema: type: object properties: contact: type: string description: '' example: architecto required: - contact parameters: - in: path name: contact description: 'The WhatsApp contact ID.' example: architecto required: true schema: type: string '/api/v1/whatsapp/incoming/contacts/{contact}/messages': get: summary: 'List the messages of an incoming WhatsApp contact.' operationId: listTheMessagesOfAnIncomingWhatsAppContact description: 'Returns a paginated list of messages exchanged with the contact identified by its ID. Supports search by message text or WhatsApp message ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 29 contact_id: 54 wa_message_id: wamid.a4855dc5-0acb-33c3-b921-f4291f719ca0 direction: inbound status: null type: text text: 'Velit et fugiat sunt nihil accusantium.' media: null wa_timestamp: 1712589330 created_at: '2026-11-09T21:39:09.000000Z' - id: 30 contact_id: 55 wa_message_id: wamid.5c77ccef-fec6-3e83-b8b6-08a373c85aef direction: inbound status: null type: text text: 'Tempora ex voluptatem laboriosam praesentium quis.' media: null wa_timestamp: 1719197123 created_at: '2026-11-09T21:39:10.000000Z' properties: data: type: array example: - id: 29 contact_id: 54 wa_message_id: wamid.a4855dc5-0acb-33c3-b921-f4291f719ca0 direction: inbound status: null type: text text: 'Velit et fugiat sunt nihil accusantium.' media: null wa_timestamp: 1712589330 created_at: '2026-11-09T21:39:09.000000Z' - id: 30 contact_id: 55 wa_message_id: wamid.5c77ccef-fec6-3e83-b8b6-08a373c85aef direction: inbound status: null type: text text: 'Tempora ex voluptatem laboriosam praesentium quis.' media: null wa_timestamp: 1719197123 created_at: '2026-11-09T21:39:10.000000Z' items: type: object properties: id: type: integer example: 29 contact_id: type: integer example: 54 wa_message_id: type: string example: wamid.a4855dc5-0acb-33c3-b921-f4291f719ca0 direction: type: string example: inbound status: type: string example: null nullable: true type: type: string example: text text: type: string example: 'Velit et fugiat sunt nihil accusantium.' media: type: string example: null nullable: true wa_timestamp: type: integer example: 1712589330 created_at: type: string example: '2026-11-09T21:39:09.000000Z' required: - id - contact_id - wa_message_id - direction - status - type - text - media - wa_timestamp - created_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'WhatsApp Incoming' requestBody: required: true content: application/json: schema: type: object properties: contact: type: string description: '' example: architecto required: - contact parameters: - in: path name: contact description: 'The WhatsApp contact ID.' example: architecto required: true schema: type: string '/api/v1/whatsapp/incoming/messages/{message}': get: summary: 'Get an incoming WhatsApp message.' operationId: getAnIncomingWhatsAppMessage description: 'Returns the message identified by its ID, including its type, content and timestamp.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 32 contact_id: 57 wa_message_id: wamid.c90237e9-ced5-3af6-88ea-84aeaa148878 direction: inbound status: null type: text text: 'Fugiat sunt nihil accusantium harum mollitia.' media: null raw: [] wa_timestamp: 1729000538 created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: data: type: object properties: id: type: integer example: 32 contact_id: type: integer example: 57 wa_message_id: type: string example: wamid.c90237e9-ced5-3af6-88ea-84aeaa148878 direction: type: string example: inbound status: type: string example: null nullable: true type: type: string example: text text: type: string example: 'Fugiat sunt nihil accusantium harum mollitia.' media: type: string example: null nullable: true raw: type: array example: [] wa_timestamp: type: integer example: 1729000538 created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - contact_id - wa_message_id - direction - status - type - text - media - raw - wa_timestamp - created_at - updated_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'WhatsApp Incoming' requestBody: required: true content: application/json: schema: type: object properties: message: type: string description: '' example: architecto required: - message parameters: - in: path name: message description: 'The WhatsApp message ID.' example: architecto required: true schema: type: string /api/v1/whatsapp/replicate-urls: get: summary: 'List all WhatsApp replicate URLs.' operationId: listAllWhatsAppReplicateURLs description: 'Returns a paginated list of replicate URLs, with optional search by URL.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 45 url: 'http://www.price.org/' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' - id: 46 url: 'http://www.dare.org/iure-odit-et-et-modi-ipsum-nostrum-omnis' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: data: type: array example: - id: 45 url: 'http://www.price.org/' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' - id: 46 url: 'http://www.dare.org/iure-odit-et-et-modi-ipsum-nostrum-omnis' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' items: type: object properties: id: type: integer example: 45 url: type: string example: 'http://www.price.org/' is_active: type: boolean example: true created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - url - is_active - created_at - updated_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'WhatsApp Replicate URLs' post: summary: 'Create a new WhatsApp replicate URL.' operationId: createANewWhatsAppReplicateURL description: 'Stores a new replicate URL with an optional active status (active by default).' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 48 url: 'https://www.runte.com/ab-provident-perspiciatis-quo-omnis-nostrum-aut-adipisci' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: data: type: object properties: id: type: integer example: 48 url: type: string example: 'https://www.runte.com/ab-provident-perspiciatis-quo-omnis-nostrum-aut-adipisci' is_active: type: boolean example: true created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - url - is_active - created_at - updated_at tags: - 'WhatsApp Replicate URLs' requestBody: required: true content: application/json: schema: type: object properties: url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' required: - url '/api/v1/whatsapp/replicate-urls/{id}': put: summary: 'Update an existing WhatsApp replicate URL.' operationId: updateAnExistingWhatsAppReplicateURL description: 'Updates the URL and, optionally, the active status of the replicate URL identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 50 url: 'http://rempel.com/sunt-nihil-accusantium-harum-mollitia' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: data: type: object properties: id: type: integer example: 50 url: type: string example: 'http://rempel.com/sunt-nihil-accusantium-harum-mollitia' is_active: type: boolean example: true created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - url - is_active - created_at - updated_at tags: - 'WhatsApp Replicate URLs' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto url: type: string description: 'Must be a valid URL. Must not be greater than 2048 characters.' example: 'http://bailey.com/' required: - id - url delete: summary: 'Delete a WhatsApp replicate URL.' operationId: deleteAWhatsAppReplicateURL description: 'Removes the replicate URL identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 52 url: 'http://bailey.com/' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: data: type: object properties: id: type: integer example: 52 url: type: string example: 'http://bailey.com/' is_active: type: boolean example: true created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - url - is_active - created_at - updated_at tags: - 'WhatsApp Replicate URLs' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id parameters: - in: path name: id description: 'The ID of the replicate url.' example: architecto required: true schema: type: string '/api/v1/whatsapp/replicate-urls/{id}/toggle': patch: summary: 'Toggle the active status of a WhatsApp replicate URL.' operationId: toggleTheActiveStatusOfAWhatsAppReplicateURL description: 'Switches the active status of the replicate URL identified by its ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 54 url: 'https://nitzsche.net/aliquam-veniam-corporis-dolorem-mollitia-deleniti-nemo.html' is_active: true created_at: '2026-11-09T21:39:10.000000Z' updated_at: '2026-11-09T21:39:10.000000Z' properties: data: type: object properties: id: type: integer example: 54 url: type: string example: 'https://nitzsche.net/aliquam-veniam-corporis-dolorem-mollitia-deleniti-nemo.html' is_active: type: boolean example: true created_at: type: string example: '2026-11-09T21:39:10.000000Z' updated_at: type: string example: '2026-11-09T21:39:10.000000Z' required: - id - url - is_active - created_at - updated_at tags: - 'WhatsApp Replicate URLs' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id parameters: - in: path name: id description: 'The ID of the replicate url.' example: architecto required: true schema: type: string /api/v1/whatsapp/templates: get: summary: 'List all WhatsApp templates.' operationId: listAllWhatsAppTemplates description: 'Returns a paginated list of WhatsApp templates with their components and variables.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 01a1c240-32b9-7131-874f-0896a8afea63 name: 'quidem nostrum qui' language: en_US category: MARKETING status: APPROVED components: [] created_at: '2026-11-09T21:39:09.000000Z' - id: 01a1c240-32c1-724f-9e9a-0fc677470258 name: 'et modi ipsum' language: en_US category: MARKETING status: APPROVED components: [] created_at: '2026-11-09T21:39:09.000000Z' properties: data: type: array example: - id: 01a1c240-32b9-7131-874f-0896a8afea63 name: 'quidem nostrum qui' language: en_US category: MARKETING status: APPROVED components: [] created_at: '2026-11-09T21:39:09.000000Z' - id: 01a1c240-32c1-724f-9e9a-0fc677470258 name: 'et modi ipsum' language: en_US category: MARKETING status: APPROVED components: [] created_at: '2026-11-09T21:39:09.000000Z' items: type: object properties: id: type: string example: 01a1c240-32b9-7131-874f-0896a8afea63 name: type: string example: 'quidem nostrum qui' language: type: string example: en_US category: type: string example: MARKETING status: type: string example: APPROVED components: type: array example: [] created_at: type: string example: '2026-11-09T21:39:09.000000Z' required: - id - name - language - category - status - components - created_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'WhatsApp Templates' '/api/v1/whatsapp/templates/{id}': get: summary: 'Get a WhatsApp template.' operationId: getAWhatsAppTemplate description: 'Returns the template identified by its ID, including its components and variables.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 01a1c240-3321-72b7-86ce-6ceac61f1dd4 whatsapp_template_id: '1374491711936806' name: 'animi quos velit' language: en_US category: MARKETING status: REJECTED raw_data: [] components: [] created_at: '2026-11-09T21:39:09.000000Z' updated_at: '2026-11-09T21:39:09.000000Z' properties: data: type: object properties: id: type: string example: 01a1c240-3321-72b7-86ce-6ceac61f1dd4 whatsapp_template_id: type: string example: '1374491711936806' name: type: string example: 'animi quos velit' language: type: string example: en_US category: type: string example: MARKETING status: type: string example: REJECTED raw_data: type: array example: [] components: type: array example: [] created_at: type: string example: '2026-11-09T21:39:09.000000Z' updated_at: type: string example: '2026-11-09T21:39:09.000000Z' required: - id - whatsapp_template_id - name - language - category - status - raw_data - components - created_at - updated_at 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'WhatsApp Templates' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: '' example: architecto required: - id parameters: - in: path name: id description: 'The WhatsApp template ID.' example: architecto required: true schema: type: string /api/v1/whatsapp/templates/sync: post: summary: 'Sync WhatsApp templates.' operationId: syncWhatsAppTemplates description: 'Fetches the templates from the WhatsApp provider and creates or updates them locally.' parameters: [] responses: { } tags: - 'WhatsApp Templates' /api/v1/whatsapp/webhook: get: summary: 'Handle the WhatsApp webhook verification.' operationId: handleTheWhatsAppWebhookVerification description: 'Validates the verification request sent by Meta and returns the challenge token. This endpoint is called by WhatsApp, not by API clients.' parameters: [] responses: 422: description: '' content: application/json: schema: type: object example: status: error message: 'La configuración laravel-whatsapp-api.verify_token no existe o es inválida' data: null properties: status: type: string example: error message: type: string example: 'La configuración laravel-whatsapp-api.verify_token no existe o es inválida' data: type: string example: null nullable: true tags: - 'WhatsApp Webhook' requestBody: required: false content: application/json: schema: type: object properties: hub: type: object description: '' example: [] properties: mode: type: string description: '' example: architecto nullable: true verify_token: type: string description: '' example: architecto nullable: true challenge: type: string description: '' example: architecto nullable: true security: [] post: summary: 'Process incoming WhatsApp webhook events.' operationId: processIncomingWhatsAppWebhookEvents description: 'Processes the incoming messages and status updates sent by WhatsApp. This endpoint is called by WhatsApp, not by API clients.' parameters: [] responses: { } tags: - 'WhatsApp Webhook' requestBody: required: true content: application/json: schema: type: object properties: object: type: string description: '' example: architecto entry: type: object description: '' example: [] properties: { } required: - object - entry security: []