MENU navbar-image

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."
}
 

Request      

GET api/v1/campaigns

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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());

Request      

POST api/v1/campaigns

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

channel_id   number     

The id of an existing record in the channels table. Example: 4326.41688

whatsapp_template_id   string  optional    

The id of an existing record in the whatsapp_templates table. Example: architecto

name   string     

Must not be greater than 255 characters. Example: n

started_at   string  optional    

Must be a valid date. Example: 2026-11-09T21:39:11

finished_at   string  optional    

Must be a valid date. Example: 2026-11-09T21:39:11

file   file     

Must be a file. Example: /tmp/phpd5egvn9k2gjc9Y8IYlX

campaign_status_id   number  optional    

Example: 4326.41688

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."
}
 

Request      

GET api/v1/campaigns/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The campaign ID. Example: architecto

Body Parameters

id   string     

Example: architecto

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   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"
    }
}
 

Request      

PUT api/v1/campaigns/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The campaign ID. Example: architecto

Body Parameters

id   string     

Example: architecto

channel_id   number     

The id of an existing record in the channels table. Example: 4326.41688

whatsapp_template_id   string  optional    

The id of an existing record in the whatsapp_templates table. Example: architecto

name   string     

Must not be greater than 255 characters. Example: n

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   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());

Request      

DELETE api/v1/campaigns/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The campaign ID. Example: architecto

Body Parameters

id   string     

Example: architecto

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."
}
 

Request      

GET api/v1/campaigns/{id}/phones

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The campaign ID. Example: architecto

Body Parameters

id   string     

Example: architecto

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"
    }
}
 

Request      

POST api/v1/campaigns/{id}/send

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The campaign ID. Example: architecto

Body Parameters

id   string     

Example: architecto

campaign_status_id   number  optional    

Example: 4326.41688

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   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."
}
 

Request      

GET api/v1/channels

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
}
 

Request      

GET api/v1/firebase/devices

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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
    }
}
 

Request      

POST api/v1/firebase/devices

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

fcm_token   string     

Example: architecto

os   string     

Example: architecto

Must be one of:
  • android
  • ios
  • web

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
    }
}
 

Request      

PATCH api/v1/firebase/devices/{fcm_token}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

fcm_token   string     

The FCM token that identifies the device. Example: architecto

Body Parameters

fcm_token   string     

Example: architecto

active   boolean     

Example: true

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."
}
 

Request      

GET api/v1/drivers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
    }
}
 

Request      

POST api/v1/drivers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Must not be greater than 255 characters. Example: b

config_key   string     

Must not be greater than 255 characters. Example: n

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."
}
 

Request      

GET api/v1/drivers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The driver ID. Example: 16

Body Parameters

id   number     

Example: 4326.41688

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"
    }
}
 

Request      

PUT api/v1/drivers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The driver ID. Example: 16

Body Parameters

id   number     

Example: 4326.41688

name   string     

Must not be greater than 255 characters. Example: m

config_key   string     

Must not be greater than 255 characters. Example: i

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());

Request      

DELETE api/v1/drivers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The driver ID. Example: 16

Body Parameters

id   number     

Example: 4326.41688

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."
}
 

Request      

GET api/v1/emails

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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());

Request      

POST api/v1/messages/whatsapp/send

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

template_name   string     

Example: architecto

phone_number   string     

Example: architecto

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());

Request      

POST api/v1/messages/whatsapp/send-document-by-url

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

country_code   string     

Example: architecto

phone_number   string     

Must be 10 digits. Example: 8225697751

url   string     

Must be a valid URL. Example: http://crooks.biz/et-fugiat-sunt-nihil-accusantium

filename   string     

Example: architecto

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
    }
}
 

Request      

POST api/v1/messages/email/send

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

template_name   string     

Example: architecto

subject   string     

Example: architecto

to   string     

Example: architecto

cc   string  optional    

Example: architecto

params   object  optional    

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());

Request      

POST api/v1/messages/push-notifications/send

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

push_notification_id   string     

The id of an existing record in the push_notifications table. Example: architecto

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."
}
 

Request      

GET api/v1/providers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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
    }
}
 

Request      

POST api/v1/providers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Must not be greater than 50 characters. Example: b

active   boolean     

Example: false

channel_ids   integer[]     

The id of an existing record in the channels table.

provider_config   object     
name   string     

Must not be greater than 50 characters. Example: b

driver_id   integer     

The id of an existing record in the drivers table. Example: 16

active   boolean     

Example: false

default   boolean     

Example: true

config   object  optional    

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."
}
 

Request      

GET api/v1/providers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The provider UUID. Example: architecto

Body Parameters

id   string     

Example: architecto

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
    }
}
 

Request      

PUT api/v1/providers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The provider UUID. Example: architecto

Body Parameters

id   string     

Example: architecto

name   string     

Must not be greater than 50 characters. Example: n

active   boolean     

Example: true

channel_ids   integer[]     

The id of an existing record in the channels table.

provider_config   object     
name   string     

Must not be greater than 50 characters. Example: b

driver_id   integer     

The id of an existing record in the drivers table. Example: 16

active   boolean     

Example: false

default   boolean     

Example: true

config   object  optional    

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());

Request      

DELETE api/v1/providers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The provider UUID. Example: architecto

Body Parameters

id   string     

Example: architecto

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."
}
 

Request      

GET api/v1/push-notifications

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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());

Request      

POST api/v1/push-notifications

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

title   string     

Example: architecto

body   string     

Example: architecto

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."
}
 

Request      

GET api/v1/push-notifications/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The push notification ID. Example: architecto

Body Parameters

id   string     

Example: architecto

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"
}
 

Request      

PUT api/v1/push-notifications/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The push notification ID. Example: architecto

Body Parameters

id   string     

Example: architecto

title   string     

Example: architecto

body   string     

Example: architecto

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());

Request      

DELETE api/v1/push-notifications/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The push notification ID. Example: architecto

Body Parameters

id   string     

Example: architecto

WhatsApp

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."
}
 

Request      

GET api/v1/whatsapp/info

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
    }
}
 

Request      

POST api/v1/whatsapp/send-text

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

phone_number   string     

Example: architecto

text   string     

Must be at least 1 character. Must not be greater than 1024 characters. Example: n

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."
}
 

Request      

GET api/v1/whatsapp/incoming/contacts

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
}
 

Request      

GET api/v1/whatsapp/incoming/contacts/{contact}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

contact   string     

The WhatsApp contact ID. Example: architecto

Body Parameters

contact   string     

Example: architecto

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."
}
 

Request      

GET api/v1/whatsapp/incoming/contacts/{contact}/messages

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

contact   string     

The WhatsApp contact ID. Example: architecto

Body Parameters

contact   string     

Example: architecto

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."
}
 

Request      

GET api/v1/whatsapp/incoming/messages/{message}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

message   string     

The WhatsApp message ID. Example: architecto

Body Parameters

message   string     

Example: architecto

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."
}
 

Request      

GET api/v1/whatsapp/replicate-urls

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
    }
}
 

Request      

POST api/v1/whatsapp/replicate-urls

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

url   string     

Must be a valid URL. Must not be greater than 2048 characters. Example: http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html

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"
    }
}
 

Request      

PUT api/v1/whatsapp/replicate-urls/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the replicate url. Example: architecto

Body Parameters

id   string     

Example: architecto

url   string     

Must be a valid URL. Must not be greater than 2048 characters. Example: http://bailey.com/

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"
    }
}
 

Request      

DELETE api/v1/whatsapp/replicate-urls/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the replicate url. Example: architecto

Body Parameters

id   string     

Example: architecto

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"
    }
}
 

Request      

PATCH api/v1/whatsapp/replicate-urls/{id}/toggle

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the replicate url. Example: architecto

Body Parameters

id   string     

Example: architecto

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."
}
 

Request      

GET api/v1/whatsapp/templates

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
}
 

Request      

GET api/v1/whatsapp/templates/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The WhatsApp template ID. Example: architecto

Body Parameters

id   string     

Example: architecto

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());

Request      

POST api/v1/whatsapp/templates/sync

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

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
}
 

Request      

GET api/v1/whatsapp/webhook

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

hub   object  optional    
mode   string  optional    

Example: architecto

verify_token   string  optional    

Example: architecto

challenge   string  optional    

Example: architecto

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());

Request      

POST api/v1/whatsapp/webhook

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

object   string     

Example: architecto

entry   object