---
title: "Discover the Kanal API"
description: "Overview of the Kanal API: the Commerce API to push your store data, the Messaging API to send WhatsApp messages, the list of endpoints and the rate limits."
url: https://help.getkanal.com/en/articles/13-discover-the-kanal-api
collection: "API"
updated: 2026-10-21
language: en
alternates: [fr-fr]
---

# Discover the Kanal API

Overview of the Kanal API: the Commerce API to push your store data, the Messaging API to send WhatsApp messages, the list of endpoints and the rate limits.

The Kanal API lets any e-commerce back office feed your WhatsApp automations, **without a Shopify connection**. If your store is custom-built, headless, or on a platform that Kanal does not integrate natively, this is the way to go.

The complete and always up-to-date technical reference is on [developers.getkanal.com](https://developers.getkanal.com).

## Two separate APIs

Kanal exposes two sets of endpoints, with different uses and prerequisites.

### The Commerce API

It is used to **push your store data** to Kanal: orders, abandoned checkouts, customers and shipments. Orders and shipments then trigger your automations. Abandoned checkouts are saved, but checkout reminders are not available yet for a custom store. It does not require an active subscription.

For a non-Shopify store, start by creating a custom store: it gives you your `store_id` and an ingestion key. See [Connect a non-Shopify store (custom store)](https://help.getkanal.com/en/articles/126-connect-a-non-shopify-store-custom-store.md).

### The Messaging API

It is used to **send messages** and manage your WhatsApp contacts: free-form messages, templates, triggering automations, renaming a contact and reading your account information. It **requires an active subscription**. Without one, every call returns a 403 error.

## Base URL and authentication

```text
https://api.getkanal.com
```

Every path starts with `/api/v1/`, for example `https://api.getkanal.com/api/v1/templates`.

Every request carries the `Authorization: Bearer <your API key>` header, plus `Content-Type: application/json` for requests with a JSON body. Also add `Accept: application/json` to receive JSON responses, including for errors. See [API authentication and keys](https://help.getkanal.com/en/articles/14-api-authentication-and-keys.md).

Commerce endpoints are attached to a store through a numeric `store_id`:

```text
/api/v1/stores/{store_id}/orders
/api/v1/stores/{store_id}/checkouts
/api/v1/stores/{store_id}/customers
/api/v1/stores/{store_id}/shipments
```

Messaging endpoints do not take a `store_id`: the API key, attached to a WhatsApp number, determines the number used for sending.

## All endpoints

### Commerce

Paths relative to `/api/v1/stores/{store_id}`.

<table style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p><strong>Method</strong></p></th><th colspan="1" rowspan="1"><p><strong>Path</strong></p></th><th colspan="1" rowspan="1"><p><strong>Purpose</strong></p></th></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/orders</code></p></td><td colspan="1" rowspan="1"><p>Create or update an order</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>PATCH</code></p></td><td colspan="1" rowspan="1"><p><code>/orders/{external_id}</code></p></td><td colspan="1" rowspan="1"><p>Update an order's status</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/checkouts</code></p></td><td colspan="1" rowspan="1"><p>Create or update a checkout</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>PATCH</code></p></td><td colspan="1" rowspan="1"><p><code>/checkouts/{external_id}</code></p></td><td colspan="1" rowspan="1"><p>Update a checkout's status</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/customers</code></p></td><td colspan="1" rowspan="1"><p>Create or update a customer</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>DELETE</code></p></td><td colspan="1" rowspan="1"><p><code>/customers/{external_id}</code></p></td><td colspan="1" rowspan="1"><p>Delete a customer (GDPR)</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/shipments</code></p></td><td colspan="1" rowspan="1"><p>Create or update a shipment</p></td></tr></tbody></table>

Details: [Commerce API: send your store data to Kanal](https://help.getkanal.com/en/articles/110-commerce-api-send-your-store-data-to-kanal.md).

### Messaging

<table style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p><strong>Method</strong></p></th><th colspan="1" rowspan="1"><p><strong>Path</strong></p></th><th colspan="1" rowspan="1"><p><strong>Purpose</strong></p></th></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/api/v1/messages/send</code></p></td><td colspan="1" rowspan="1"><p>Send a free-form message</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/api/v1/templates</code></p></td><td colspan="1" rowspan="1"><p>Send a template</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>GET</code></p></td><td colspan="1" rowspan="1"><p><code>/api/v1/get_templates</code></p></td><td colspan="1" rowspan="1"><p>List your approved templates</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/api/v1/automations/{webhook_id}</code></p></td><td colspan="1" rowspan="1"><p>Trigger an automation</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>PATCH</code></p></td><td colspan="1" rowspan="1"><p><code>/api/v1/contacts/{phone}</code></p></td><td colspan="1" rowspan="1"><p>Rename a contact (<code>name</code>, <code>first_name</code>, <code>last_name</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/api/v1/me</code></p></td><td colspan="1" rowspan="1"><p>Account information</p></td></tr></tbody></table>

Details: [Messaging API: send messages and trigger automations](https://help.getkanal.com/en/articles/81-messaging-api-send-messages-and-trigger-automations.md) and [Send a WhatsApp template via the API](https://help.getkanal.com/en/articles/15-send-a-whatsapp-template-via-the-api.md).

To receive incoming messages on your server, see [Receive WhatsApp messages via Kanal webhooks](https://help.getkanal.com/en/articles/96-receive-whatsapp-messages-via-kanal-webhooks.md).

## Rate limits

-   `POST /api/v1/templates`: **60 requests per minute per API key**. It is the only endpoint subject to this limit.
    
-   Commerce API: **500 requests per minute per store**, shared across all the store's endpoints.
    
-   Other Messaging endpoints: only the global API limit applies, which is 3,000 requests per minute per IP address.
    

If you exceed a limit, the API returns a `429` error, without a `Retry-After` header: the response body contains `retry_after: 60` (in seconds). Wait this long before replaying the request, ideally with exponential backoff.

## A first request

Creating an order, which will trigger your post-purchase automations:

```bash
curl -X POST https://api.getkanal.com/api/v1/stores/123/orders \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "ORDER-1001",
    "placed_at": "2026-05-18T10:00:00Z",
    "total_price": 49.90,
    "currency": "EUR",
    "customer": { "phone": "+33612345678", "first_name": "Marie" }
  }'
```

## What the Commerce API does not do

The Commerce API is **write-only**. There is no read or pagination endpoint for orders, checkouts, customers or shipments: you push data, you do not read it back. Your system remains the source of truth. To correct a record, send it again with the same `external_id`.

An order sent without a customer phone number is saved, but it does not trigger any automation.

Abandoned checkouts sent for a custom store do not trigger reminders yet: no trigger is offered in automations for now.
