Introduction
A multi-channel API to send messages via email and WhatsApp using different providers. Flexible, scalable, and easy to integrate.
This documentation aims to provide all the information you need to work with our API.
<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can retrieve your token by visiting your dashboard and clicking Generate API token.
Campaigns
List all campaigns.
requires authentication
Returns a paginated list of campaigns with their channel, WhatsApp template and status. Supports search by name.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/campaigns" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/campaigns';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/campaigns"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-3877-70e2-97e0-628d6a3dff69
name
string
Example: neque blanditiis odio
channel_id
integer
Example: 64
channel_name
string
Example: Doloribus.
status_name
string
Example: Completed
whatsapp_template_id
string
Example: 01a1c240-3876-72e9-b0e6-dc6ee40856a0
template_name
string
Example: voluptate accusamus ut
started_at
string
finished_at
string
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":11,"micro":0,"timestamp":1794260351,"formatted":"2026-11-09 21:39:11","timezone":{"timezone_type":3,"timezone":"UTC"}}
Create a campaign.
requires authentication
Creates a new campaign from a CSV/TXT file containing the recipient phone numbers. The campaign is created with pending status.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/campaigns" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: multipart/form-data" \
--header "Accept: application/json" \
--form "channel_id=4326.41688"\
--form "whatsapp_template_id=architecto"\
--form "name=n"\
--form "started_at=2026-11-09T21:39:11"\
--form "finished_at=2026-11-09T21:39:11"\
--form "campaign_status_id=4326.41688"\
--form "file=@/tmp/phpd5egvn9k2gjc9Y8IYlX" $client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/campaigns';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'multipart/form-data',
'Accept' => 'application/json',
],
'multipart' => [
[
'name' => 'channel_id',
'contents' => '4326.41688'
],
[
'name' => 'whatsapp_template_id',
'contents' => 'architecto'
],
[
'name' => 'name',
'contents' => 'n'
],
[
'name' => 'started_at',
'contents' => '2026-11-09T21:39:11'
],
[
'name' => 'finished_at',
'contents' => '2026-11-09T21:39:11'
],
[
'name' => 'campaign_status_id',
'contents' => '4326.41688'
],
[
'name' => 'file',
'contents' => fopen('/tmp/phpd5egvn9k2gjc9Y8IYlX', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/campaigns"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('channel_id', '4326.41688');
body.append('whatsapp_template_id', 'architecto');
body.append('name', 'n');
body.append('started_at', '2026-11-09T21:39:11');
body.append('finished_at', '2026-11-09T21:39:11');
body.append('campaign_status_id', '4326.41688');
body.append('file', document.querySelector('input[name="file"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a campaign.
requires authentication
Returns the details of the campaign identified by its ID, including its channel, status, WhatsApp template and recipients.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-38e8-7323-8d0e-3129882a7aaf
name
string
Example: iure odit et
channel_id
integer
Example: 66
channel_name
string
Example: Nostrum.
status_name
string
Example: Failed
whatsapp_template_id
string
Example: 01a1c240-38e5-72d5-8516-6cb88fff9405
template_name
string
Example: ex voluptatem laboriosam
whatsapp_template
array
Example: {"id":"01a1c240-38e5-72d5-8516-6cb88fff9405","name":"ex voluptatem laboriosam","language":"en_US","category":"AUTHENTICATION","status":"APPROVED","components":[]}
{"id":"01a1c240-38e5-72d5-8516-6cb88fff9405","name":"ex voluptatem laboriosam","language":"en_US","category":"AUTHENTICATION","status":"APPROVED","components":[]}id
string
Example: 01a1c240-38e5-72d5-8516-6cb88fff9405
name
string
Example: ex voluptatem laboriosam
language
string
Example: en_US
category
string
Example: AUTHENTICATION
status
string
Example: APPROVED
components
object
Example: []
started_at
object
Example: {"year":2026,"month":10,"day":25,"dayOfWeek":0,"dayOfYear":298,"hour":18,"minute":34,"second":5,"micro":0,"timestamp":1792953245,"formatted":"2026-10-25 18:34:05","timezone":{"timezone_type":3,"timezone":"UTC"}}
finished_at
string
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":11,"micro":0,"timestamp":1794260351,"formatted":"2026-11-09 21:39:11","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":11,"micro":0,"timestamp":1794260351,"formatted":"2026-11-09 21:39:11","timezone":{"timezone_type":3,"timezone":"UTC"}}
Update a campaign.
requires authentication
Updates the name, channel, WhatsApp template and scheduling dates of the campaign identified by its ID.
Example request:
curl --request PUT \
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\",
\"channel_id\": 4326.41688,
\"whatsapp_template_id\": \"architecto\",
\"name\": \"n\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
'channel_id' => 4326.41688,
'whatsapp_template_id' => 'architecto',
'name' => 'n',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto",
"channel_id": 4326.41688,
"whatsapp_template_id": "architecto",
"name": "n"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-391a-7094-87b9-8bf941f49107
name
string
Example: et et modi
channel_id
integer
Example: 68
channel_name
string
Example: Omnis.
status_name
string
Example: Sending
whatsapp_template_id
string
Example: 01a1c240-3919-73fb-93e3-fcb95597ea63
template_name
string
Example: praesentium quis adipisci
whatsapp_template
array
Example: {"id":"01a1c240-3919-73fb-93e3-fcb95597ea63","name":"praesentium quis adipisci","language":"en_US","category":"UTILITY","status":"PENDING","components":[]}
{"id":"01a1c240-3919-73fb-93e3-fcb95597ea63","name":"praesentium quis adipisci","language":"en_US","category":"UTILITY","status":"PENDING","components":[]}id
string
Example: 01a1c240-3919-73fb-93e3-fcb95597ea63
name
string
Example: praesentium quis adipisci
language
string
Example: en_US
category
string
Example: UTILITY
status
string
Example: PENDING
components
object
Example: []
started_at
string
finished_at
string
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":11,"micro":0,"timestamp":1794260351,"formatted":"2026-11-09 21:39:11","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":11,"micro":0,"timestamp":1794260351,"formatted":"2026-11-09 21:39:11","timezone":{"timezone_type":3,"timezone":"UTC"}}
Delete a campaign.
requires authentication
Removes the campaign identified by its ID.
Example request:
curl --request DELETE \
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List the phones of a campaign.
requires authentication
Returns a paginated list of phone numbers associated with the campaign identified by its ID. Supports search by phone.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto/phones" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto/phones';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto/phones"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": [
{
"id": 13,
"phone": "+12038673351",
"whatsapp_status": "true"
},
{
"id": 14,
"phone": "+13375699723",
"whatsapp_status": "true"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 15
phone
string
Example: +14176630574
whatsapp_status
object
Example: true
Send a campaign.
requires authentication
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.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto/send" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\",
\"campaign_status_id\": 4326.41688
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto/send';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
'campaign_status_id' => 4326.41688,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/campaigns/architecto/send"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto",
"campaign_status_id": 4326.41688
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-39ab-7076-93c7-eb8e230b2215
name
string
Example: modi ipsum nostrum
channel_id
integer
Example: 70
channel_name
string
Example: Aut.
status_name
string
Example: Completed
whatsapp_template_id
string
Example: 01a1c240-39a7-7325-8fd9-0c93d6c72ef2
template_name
string
Example: fugit deleniti distinctio
whatsapp_template
array
Example: {"id":"01a1c240-39a7-7325-8fd9-0c93d6c72ef2","name":"fugit deleniti distinctio","language":"pt_BR","category":"UTILITY","status":"APPROVED","components":[]}
{"id":"01a1c240-39a7-7325-8fd9-0c93d6c72ef2","name":"fugit deleniti distinctio","language":"pt_BR","category":"UTILITY","status":"APPROVED","components":[]}id
string
Example: 01a1c240-39a7-7325-8fd9-0c93d6c72ef2
name
string
Example: fugit deleniti distinctio
language
string
Example: pt_BR
category
string
Example: UTILITY
status
string
Example: APPROVED
components
object
Example: []
started_at
string
finished_at
object
Example: {"year":2026,"month":10,"day":27,"dayOfWeek":2,"dayOfYear":300,"hour":5,"minute":12,"second":35,"micro":0,"timestamp":1793077955,"formatted":"2026-10-27 05:12:35","timezone":{"timezone_type":3,"timezone":"UTC"}}
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":11,"micro":0,"timestamp":1794260351,"formatted":"2026-11-09 21:39:11","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":11,"micro":0,"timestamp":1794260351,"formatted":"2026-11-09 21:39:11","timezone":{"timezone_type":3,"timezone":"UTC"}}
Channels
List all channels.
requires authentication
Returns a paginated list of messaging channels. Supports search by name.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/channels" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/channels';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/channels"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"data": [
{
"id": 71,
"name": "Aut."
},
{
"id": 72,
"name": "Et et."
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 73
name
string
Example: Enim non.
Devices
List the registered devices.
requires authentication
Returns a paginated list of active devices with their FCM token, operating system and owner.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/firebase/devices" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/firebase/devices';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/firebase/devices"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 46
fcm_token
string
Example: iure-ad-ea-reprehenderit-molestiae-ut-non-reprehenderit-accusamus-officiis
os
string
Example: web
active
boolean
Example: true
user_id
string
Example: cfa3b680-7e2b-3dbf-9821-4fc058e28b10
Register a device.
requires authentication
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.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/firebase/devices" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"fcm_token\": \"architecto\",
\"os\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/firebase/devices';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'fcm_token' => 'architecto',
'os' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/firebase/devices"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"fcm_token": "architecto",
"os": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (201):
{
"data": {
"fcm_token": "quos-velit-et-fugiat-sunt-nihil-accusantium-harum-mollitia-modi-deserunt-aut-ab",
"active": true
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
fcm_token
string
Example: nostrum-aut-adipisci-quidem-nostrum-qui-commodi-incidunt
active
boolean
Example: true
Update a device.
requires authentication
Enables or disables the device identified by its FCM token. If the token is not registered, no changes are made.
Example request:
curl --request PATCH \
"https://metzi-messages.axolotesource.io/api/v1/firebase/devices/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"fcm_token\": \"architecto\",
\"active\": true
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/firebase/devices/architecto';
$response = $client->patch(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'fcm_token' => 'architecto',
'active' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/firebase/devices/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"fcm_token": "architecto",
"active": true
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": {
"fcm_token": "perspiciatis-quo-omnis-nostrum-aut-adipisci-quidem-nostrum-qui-commodi-incidunt-iure-odit-et",
"active": true
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
fcm_token
string
Example: omnis-autem-et-consequatur-aut-dolores-enim
active
boolean
Example: true
Drivers
List all drivers.
requires authentication
Returns a paginated list of messaging drivers. Supports search by name.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/drivers" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/drivers';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/drivers"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 1
name
string
Example: smtp
config_key
string
Example: mail.mailers.smtp
created_at
object
Example: {"year":2026,"month":9,"day":10,"dayOfWeek":4,"dayOfYear":253,"hour":19,"minute":37,"second":57,"micro":0,"timestamp":1789069077,"formatted":"2026-09-10 19:37:57","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":7,"micro":0,"timestamp":1794260347,"formatted":"2026-11-09 21:39:07","timezone":{"timezone_type":3,"timezone":"UTC"}}
Create a driver.
requires authentication
Creates a new messaging driver with its name and configuration key.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/drivers" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"b\",
\"config_key\": \"n\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/drivers';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'b',
'config_key' => 'n',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/drivers"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "b",
"config_key": "n"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (201):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 1
name
string
Example: smtp
config_key
string
Example: mail.mailers.smtp
created_at
object
Example: {"year":2026,"month":9,"day":10,"dayOfWeek":4,"dayOfYear":253,"hour":19,"minute":37,"second":57,"micro":0,"timestamp":1789069077,"formatted":"2026-09-10 19:37:57","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":7,"micro":0,"timestamp":1794260347,"formatted":"2026-11-09 21:39:07","timezone":{"timezone_type":3,"timezone":"UTC"}}
Get a driver.
requires authentication
Returns the driver identified by its ID.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/drivers/16" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": 4326.41688
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/drivers/16';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 4326.41688,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/drivers/16"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": 4326.41688
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 1
name
string
Example: smtp
config_key
string
Example: mail.mailers.smtp
created_at
object
Example: {"year":2026,"month":9,"day":10,"dayOfWeek":4,"dayOfYear":253,"hour":19,"minute":37,"second":57,"micro":0,"timestamp":1789069077,"formatted":"2026-09-10 19:37:57","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":7,"micro":0,"timestamp":1794260347,"formatted":"2026-11-09 21:39:07","timezone":{"timezone_type":3,"timezone":"UTC"}}
Update a driver.
requires authentication
Updates the name and configuration key of the driver identified by its ID.
Example request:
curl --request PUT \
"https://metzi-messages.axolotesource.io/api/v1/drivers/16" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": 4326.41688,
\"name\": \"m\",
\"config_key\": \"i\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/drivers/16';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 4326.41688,
'name' => 'm',
'config_key' => 'i',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/drivers/16"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": 4326.41688,
"name": "m",
"config_key": "i"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 1
name
string
Example: smtp
config_key
string
Example: mail.mailers.smtp
created_at
object
Example: {"year":2026,"month":9,"day":10,"dayOfWeek":4,"dayOfYear":253,"hour":19,"minute":37,"second":57,"micro":0,"timestamp":1789069077,"formatted":"2026-09-10 19:37:57","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":7,"micro":0,"timestamp":1794260347,"formatted":"2026-11-09 21:39:07","timezone":{"timezone_type":3,"timezone":"UTC"}}
Delete a driver.
requires authentication
Removes the driver identified by its ID. Drivers associated with provider configurations cannot be deleted.
Example request:
curl --request DELETE \
"https://metzi-messages.axolotesource.io/api/v1/drivers/16" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": 4326.41688
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/drivers/16';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 4326.41688,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/drivers/16"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": 4326.41688
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Emails
List all email templates.
requires authentication
Returns a paginated list of email templates with their variables. Supports search by name.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/emails" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/emails';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/emails"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-373e-72da-9e35-941de881d562
name
string
Example: libero
description
string
Example: Veniam corporis dolorem mollitia.
view_path
string
Example: emails.templates.libero
subject
string
Example: Nemo odit quia officia est dignissimos.
variables
object
Example: []
raw_data
string
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
Messages
Send a WhatsApp template message.
requires authentication
Sends a WhatsApp template message to a phone number using the default Meta provider, with optional parameters and buttons.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/messages/whatsapp/send" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"template_name\": \"architecto\",
\"phone_number\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/messages/whatsapp/send';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'template_name' => 'architecto',
'phone_number' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/messages/whatsapp/send"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"template_name": "architecto",
"phone_number": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Send a WhatsApp document by URL.
requires authentication
Sends a document to a WhatsApp number using a publicly accessible URL and the given filename.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/messages/whatsapp/send-document-by-url" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"country_code\": \"architecto\",
\"phone_number\": \"8225697751\",
\"url\": \"http:\\/\\/crooks.biz\\/et-fugiat-sunt-nihil-accusantium\",
\"filename\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/messages/whatsapp/send-document-by-url';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'country_code' => 'architecto',
'phone_number' => '8225697751',
'url' => 'http://crooks.biz/et-fugiat-sunt-nihil-accusantium',
'filename' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/messages/whatsapp/send-document-by-url"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"country_code": "architecto",
"phone_number": "8225697751",
"url": "http:\/\/crooks.biz\/et-fugiat-sunt-nihil-accusantium",
"filename": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Send an email message.
requires authentication
Sends an email using the given template and the default email provider. A message record is created along with its history and details.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/messages/email/send" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"template_name\": \"architecto\",
\"subject\": \"architecto\",
\"to\": \"architecto\",
\"cc\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/messages/email/send';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'template_name' => 'architecto',
'subject' => 'architecto',
'to' => 'architecto',
'cc' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/messages/email/send"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"template_name": "architecto",
"subject": "architecto",
"to": "architecto",
"cc": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 25
channel_provider_id
string
Example: 01a1c240-362e-713e-82db-a7a66ddb40d9
created_user_id
string
Example: 949
message_status_id
integer
Example: 14
attempts
integer
Example: 80
created_at
string
Example: 2026-11-09T21:39:10.000000Z
updated_at
string
Example: 2026-11-09T21:39:10.000000Z
deleted_at
string
Send a push notification.
requires authentication
Sends a pending push notification to specific users, a user list, or all users.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/messages/push-notifications/send" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"push_notification_id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/messages/push-notifications/send';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'push_notification_id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/messages/push-notifications/send"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"push_notification_id": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Providers
List all providers.
requires authentication
Returns a paginated list of messaging providers with their channels and configuration. Supports search by name.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/providers" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/providers';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/providers"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-3b33-7161-b216-bc6e68dcd06e
name
string
Example: Incidunt.
active
boolean
Example: false
channels
object
Example: []
driver_name
string
default
boolean
Example: false
provider_config
string
Create a provider.
requires authentication
Creates a provider with its channels and a single provider configuration.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/providers" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"b\",
\"active\": false,
\"channel_ids\": [
16
],
\"provider_config\": {
\"name\": \"b\",
\"driver_id\": 16,
\"active\": false,
\"default\": true
}
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/providers';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'b',
'active' => false,
'channel_ids' => [
16,
],
'provider_config' => [
'name' => 'b',
'driver_id' => 16,
'active' => false,
'default' => true,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/providers"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "b",
"active": false,
"channel_ids": [
16
],
"provider_config": {
"name": "b",
"driver_id": 16,
"active": false,
"default": true
}
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (201):
{
"data": {
"id": "01a1c240-3b4e-7032-8f21-60fc13309704",
"name": "Eius et.",
"active": true,
"channels": [],
"driver_name": null,
"default": false,
"provider_config": null
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-3b5b-7045-9da8-f25e9c105a6b
name
string
Example: Velit et.
active
boolean
Example: false
channels
object
Example: []
driver_name
string
default
boolean
Example: false
provider_config
string
Get a provider.
requires authentication
Returns the provider identified by its ID, including its channels and configuration.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/providers/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/providers/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/providers/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": {
"id": "01a1c240-3ba6-71e3-acda-13acc3b6c322",
"name": "Eius et.",
"active": true,
"channels": [],
"driver_name": null,
"default": false,
"provider_config": null
}
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-3bb5-7055-8dee-760e8eda67c3
name
string
Example: Velit et.
active
boolean
Example: false
channels
object
Example: []
driver_name
string
default
boolean
Example: false
provider_config
string
Update a provider.
requires authentication
Updates the name, active state, channels and configuration of the provider identified by its ID.
Example request:
curl --request PUT \
"https://metzi-messages.axolotesource.io/api/v1/providers/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\",
\"name\": \"n\",
\"active\": true,
\"channel_ids\": [
16
],
\"provider_config\": {
\"name\": \"b\",
\"driver_id\": 16,
\"active\": false,
\"default\": true
}
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/providers/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
'name' => 'n',
'active' => true,
'channel_ids' => [
16,
],
'provider_config' => [
'name' => 'b',
'driver_id' => 16,
'active' => false,
'default' => true,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/providers/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto",
"name": "n",
"active": true,
"channel_ids": [
16
],
"provider_config": {
"name": "b",
"driver_id": 16,
"active": false,
"default": true
}
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": {
"id": "01a1c240-3bcc-71ee-8bc9-c0c63b1942c1",
"name": "Eius et.",
"active": true,
"channels": [],
"driver_name": null,
"default": false,
"provider_config": null
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-3bd8-7188-a960-c81b0ea3ad4c
name
string
Example: Velit et.
active
boolean
Example: false
channels
object
Example: []
driver_name
string
default
boolean
Example: false
provider_config
string
Delete a provider.
requires authentication
Removes the provider identified by its ID. Providers with associated messages cannot be deleted.
Example request:
curl --request DELETE \
"https://metzi-messages.axolotesource.io/api/v1/providers/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/providers/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/providers/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Push Notifications
List all push notifications.
requires authentication
Returns a paginated list of push notifications with their status. Supports search by title or body.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/push-notifications" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/push-notifications';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/push-notifications"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-3796-7190-ad1a-0b5c5439b450
title
string
Example: Ratione nemo voluptate accusamus ut et recusandae modi rerum.
body
string
Example: Assumenda et tenetur ab reiciendis quia. Deserunt ducimus corrupti et dolores quia maiores. Odit doloribus repellat officiis corporis nesciunt ut ratione iure.
status_name
string
Example: Pending
total_devices
integer
Example: 0
success_count
integer
Example: 0
failure_count
integer
Example: 0
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
Create a push notification.
requires authentication
Creates a new push notification with a title, body and optional data payload.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/push-notifications" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"architecto\",
\"body\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/push-notifications';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'title' => 'architecto',
'body' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/push-notifications"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"title": "architecto",
"body": "architecto"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a push notification.
requires authentication
Returns the push notification identified by its ID.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update a push notification.
requires authentication
Updates the title, body and optional data payload of the push notification identified by its ID.
Example request:
curl --request PUT \
"https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\",
\"title\": \"architecto\",
\"body\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
'title' => 'architecto',
'body' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto",
"title": "architecto",
"body": "architecto"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete a push notification.
requires authentication
Removes the push notification identified by its ID.
Example request:
curl --request DELETE \
"https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/push-notifications/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get the WhatsApp account information.
requires authentication
Returns the ID, verified name and quality information of the configured WhatsApp phone number.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/info" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/info';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/info"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Send a WhatsApp text message.
requires authentication
Sends a plain text message to a WhatsApp number using the default Meta provider.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/send-text" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"phone_number\": \"architecto\",
\"text\": \"n\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/send-text';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'phone_number' => 'architecto',
'text' => 'n',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/send-text"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone_number": "architecto",
"text": "n"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"data": {
"id": 27,
"phone_number": "+14636223498",
"text": "Et fugiat sunt nihil accusantium.",
"direction": "inbound",
"status": null,
"created_at": "2026-11-09T21:39:09.000000Z"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 28
phone_number
string
Example: +15596932083
text
string
Example: Ipsum nostrum omnis autem et consequatur aut dolores enim.
direction
object
Example: inbound
status
string
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
WhatsApp Incoming
List all incoming WhatsApp contacts.
requires authentication
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.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 51
phone
string
Example: +19077351679
name
string
Example: Gerhard Beier
last_message_text
string
Example: Doloribus delectus fugit qui repudiandae laboriosam.
last_message_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
unread_count
integer
Example: 0
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
Get an incoming WhatsApp contact.
requires authentication
Returns the contact identified by its ID.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'contact' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"contact": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 53
phone
string
Example: +17348945744
name
string
Example: Miss Marianna Predovic
last_message_text
string
Example: Et consequatur aut dolores enim.
last_message_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
unread_count
integer
Example: 0
messages_count
integer
Example: 0
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
List the messages of an incoming WhatsApp contact.
requires authentication
Returns a paginated list of messages exchanged with the contact identified by its ID. Supports search by message text or WhatsApp message ID.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts/architecto/messages" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts/architecto/messages';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'contact' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/contacts/architecto/messages"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"contact": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 31
contact_id
integer
Example: 56
wa_message_id
string
Example: wamid.0733da06-3f67-3b0d-b923-684c336397e5
direction
object
Example: inbound
status
string
type
string
Example: text
text
string
Example: Excepturi doloribus delectus fugit qui repudiandae laboriosam.
media
string
wa_timestamp
integer
Example: 1794080125
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
Get an incoming WhatsApp message.
requires authentication
Returns the message identified by its ID, including its type, content and timestamp.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/messages/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"message\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/messages/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'message' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/incoming/messages/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"message": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 33
contact_id
integer
Example: 58
wa_message_id
string
Example: wamid.d98239dc-1582-3bf2-b93a-df3a18e121d1
direction
object
Example: inbound
status
string
type
string
Example: text
text
string
Example: Consequatur aut dolores enim non facere tempora.
media
string
raw
array
Example: []
wa_timestamp
integer
Example: 1748669594
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
WhatsApp Replicate URLs
List all WhatsApp replicate URLs.
requires authentication
Returns a paginated list of replicate URLs, with optional search by URL.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 47
url
string
Example: http://mclaughlin.info/dolores-enim-non-facere-tempora
is_active
boolean
Example: true
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
Create a new WhatsApp replicate URL.
requires authentication
Stores a new replicate URL with an optional active status (active by default).
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"url\": \"http:\\/\\/www.bailey.biz\\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'url' => 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"url": "http:\/\/www.bailey.biz\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (201):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 49
url
string
Example: https://cronin.com/incidunt-iure-odit-et-et-modi-ipsum.html
is_active
boolean
Example: true
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
Update an existing WhatsApp replicate URL.
requires authentication
Updates the URL and, optionally, the active status of the replicate URL identified by its ID.
Example request:
curl --request PUT \
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\",
\"url\": \"http:\\/\\/bailey.com\\/\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
'url' => 'http://bailey.com/',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto",
"url": "http:\/\/bailey.com\/"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 51
url
string
Example: http://www.considine.com/provident-perspiciatis-quo-omnis-nostrum-aut-adipisci-quidem
is_active
boolean
Example: true
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
Delete a WhatsApp replicate URL.
requires authentication
Removes the replicate URL identified by its ID.
Example request:
curl --request DELETE \
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 53
url
string
Example: http://www.leffler.info/quis-adipisci-molestias-fugit-deleniti-distinctio-eum
is_active
boolean
Example: true
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
Toggle the active status of a WhatsApp replicate URL.
requires authentication
Switches the active status of the replicate URL identified by its ID.
Example request:
curl --request PATCH \
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto/toggle" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto/toggle';
$response = $client->patch(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/replicate-urls/architecto/toggle"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
integer
Example: 55
url
string
Example: https://www.balistreri.org/dignissimos-neque-blanditiis-odio
is_active
boolean
Example: true
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":10,"micro":0,"timestamp":1794260350,"formatted":"2026-11-09 21:39:10","timezone":{"timezone_type":3,"timezone":"UTC"}}
WhatsApp Templates
List all WhatsApp templates.
requires authentication
Returns a paginated list of WhatsApp templates with their components and variables.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"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"
}
]
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-32d7-705f-a93b-8cbac03f8111
name
string
Example: aut dolores enim
language
string
Example: es_MX
category
string
Example: UTILITY
status
string
Example: PENDING
components
object
Example: []
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
Get a WhatsApp template.
requires authentication
Returns the template identified by its ID, including its components and variables.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"id\": \"architecto\"
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates/architecto';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'id' => 'architecto',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "architecto"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"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"
}
}
Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
id
string
Example: 01a1c240-332f-737f-af39-b5fe2e387b09
whatsapp_template_id
string
Example: 6965485290776343
name
string
Example: harum mollitia modi
language
string
Example: en_US
category
string
Example: MARKETING
status
string
Example: APPROVED
raw_data
array
Example: []
components
object
Example: []
created_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
updated_at
object
Example: {"year":2026,"month":11,"day":9,"dayOfWeek":1,"dayOfYear":313,"hour":21,"minute":39,"second":9,"micro":0,"timestamp":1794260349,"formatted":"2026-11-09 21:39:09","timezone":{"timezone_type":3,"timezone":"UTC"}}
Sync WhatsApp templates.
requires authentication
Fetches the templates from the WhatsApp provider and creates or updates them locally.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates/sync" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates/sync';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/templates/sync"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp Webhook
Handle the WhatsApp webhook verification.
Validates the verification request sent by Meta and returns the challenge token. This endpoint is called by WhatsApp, not by API clients.
Example request:
curl --request GET \
--get "https://metzi-messages.axolotesource.io/api/v1/whatsapp/webhook" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"hub\": {
\"mode\": \"architecto\",
\"verify_token\": \"architecto\",
\"challenge\": \"architecto\"
}
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/webhook';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'hub' => [
'mode' => 'architecto',
'verify_token' => 'architecto',
'challenge' => 'architecto',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/webhook"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"hub": {
"mode": "architecto",
"verify_token": "architecto",
"challenge": "architecto"
}
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (422):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"status": "error",
"message": "La configuración laravel-whatsapp-api.verify_token no existe o es inválida",
"data": null
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Process incoming WhatsApp webhook events.
Processes the incoming messages and status updates sent by WhatsApp. This endpoint is called by WhatsApp, not by API clients.
Example request:
curl --request POST \
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/webhook" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"object\": \"architecto\",
\"entry\": []
}"
$client = new \GuzzleHttp\Client();
$url = 'https://metzi-messages.axolotesource.io/api/v1/whatsapp/webhook';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'object' => 'architecto',
'entry' => [],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://metzi-messages.axolotesource.io/api/v1/whatsapp/webhook"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"object": "architecto",
"entry": []
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.