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: []