Cliqtel
  • 製品
    インフラ
    バーチャル番号70カ国以上のローカル・モバイル・フリーダイヤル SIP トランクあらゆる PBX に対応するキャリアグレード SIP 旅行データ(eSIM)200以上の国でモバイルデータ、ローミング料なし
    コミュニケーション
    メッセージング双方向 SMS と WhatsApp テンプレート クラウド電話システムビジュアルコールフロー、IVR、キュー、CRM ポップ コンタクトセンター高度なルーティングと AI — アーリーアクセス
    パートナー & AI
    Cliqtel ConnectMSP 向けホワイトラベルプラットフォーム AI アクセス (MCP)エージェントとコパイロット向けの AI 操作可能なテレコム
  • ソリューション
    チーム別
    リモートチーム分散チームにひとつのビジネス番号 サポートチームサポート向けのキュー、IVR、共有インボックス 営業チームクリックトゥコール、CRM ポップ、ローカル発信者番号
    探す
    対応エリア70カ国以上の番号と料金 連携PBX、CRM、各種ツールを接続
  • 料金
    料金とプラン
    料金番号ごと・利用量ごとの透明な料金 対応エリアと料金国別の通話料金と番号料金 バンドルプリペイドの番号 + 分数バンドル
  • ドキュメント
    はじめる
    はじめにアカウントと最初の番号を設定 API リファレンス番号・通話・メッセージング向け REST API コールフローIVR とルーティングをビジュアルに構築 ヘルプセンターFAQ、ガイド、トラブルシューティング
    ガイド
    PBX & SIP セットアップ3CX、FreePBX、Asterisk、Teams を接続 メッセージングガイドSMS と WhatsApp の連携ガイド 規制対応国別の番号登録ルール
  • 会社情報
    会社
    Cliqtel について私たちは何者で、何を作っているのか お問い合わせ営業またはサポートチームにご相談ください パートナーCliqtel のパートナー・リセラーになる
    リソース
    ブログ製品ニュースとテレコムガイド ステータスプラットフォームとネットワークのリアルタイム状況 連携PBX、CRM、各種ツールのマーケットプレイス
English EN Nederlands NL Deutsch DE Français FR Español ES Português PT العربية AR 中文 ZH 日本語 JA हिन्दी HI
ログイン 番号を注文
Cliqtel
製品 バーチャル番号70カ国以上のローカル・モバイル・フリーダイヤル SIP トランクあらゆる PBX に対応するキャリアグレード SIP 旅行データ(eSIM)200以上の国でモバイルデータ、ローミング料なし メッセージング双方向 SMS と WhatsApp テンプレート クラウド電話システムビジュアルコールフロー、IVR、キュー、CRM ポップ コンタクトセンター高度なルーティングと AI — アーリーアクセス Cliqtel ConnectMSP 向けホワイトラベルプラットフォーム AI アクセス (MCP)エージェントとコパイロット向けの AI 操作可能なテレコム
ソリューション リモートチーム分散チームにひとつのビジネス番号 サポートチームサポート向けのキュー、IVR、共有インボックス 営業チームクリックトゥコール、CRM ポップ、ローカル発信者番号 対応エリア70カ国以上の番号と料金 連携PBX、CRM、各種ツールを接続
料金 料金番号ごと・利用量ごとの透明な料金 対応エリアと料金国別の通話料金と番号料金 バンドルプリペイドの番号 + 分数バンドル
ドキュメント はじめにアカウントと最初の番号を設定 API リファレンス番号・通話・メッセージング向け REST API コールフローIVR とルーティングをビジュアルに構築 ヘルプセンターFAQ、ガイド、トラブルシューティング PBX & SIP セットアップ3CX、FreePBX、Asterisk、Teams を接続 メッセージングガイドSMS と WhatsApp の連携ガイド 規制対応国別の番号登録ルール
会社情報 Cliqtel について私たちは何者で、何を作っているのか お問い合わせ営業またはサポートチームにご相談ください パートナーCliqtel のパートナー・リセラーになる ブログ製品ニュースとテレコムガイド ステータスプラットフォームとネットワークのリアルタイム状況 連携PBX、CRM、各種ツールのマーケットプレイス

言語
EN NL DE FR ES PT AR ZH JA HI
ログイン 無料ではじめる
← Help Center
On this page
Overview Prerequisites Authentication & Scopes 1 — Create an API Key 2 — Find Your Account ID 3 — Send Your First Message 4 — Track Status Next Steps Rate Limits & Errors FAQ

WhatsApp API Quickstart

Messaging · 7 min read Messaging WhatsApp API Developers
What this guide covers: Everything you need to send your first WhatsApp message through the Cliqtel API in minutes — creating a scoped API key, finding your account ID, sending both free-form text and approved templates, and tracking delivery status. Node.js, Python, and cURL examples throughout.

Overview

The Cliqtel WhatsApp API lets you send and receive WhatsApp Business messages programmatically — text, templates, media, location, and interactive messages — all over a single REST endpoint. Every request is authenticated with a scoped API key and returns JSON.

All WhatsApp endpoints live under one base URL:

BASE URL
https://cliqtel.com/api/v1/whatsapp

By the end of this guide you'll have sent a live message and confirmed its delivery. The four steps are: create an API key, find your account ID, send a message, and track its status.

Prerequisites

  • A WhatsApp Business Account connected to Cliqtel — see the WhatsApp setup guide to connect your WABA and register a number.
  • A Cliqtel account with access to the Dashboard (to create API keys).
  • A tool for making HTTP requests — the examples below use Node.js (fetch), Python (requests), and cURL.
No WhatsApp account yet? You need at least one connected and approved WhatsApp Business Account before you can send. Follow the WhatsApp setup guide first, then come back here.

Authentication & Scopes

Every request must include your API key as a Bearer token in the Authorization header:

AUTHORIZATION HEADER
Authorization: Bearer YOUR_API_KEY

API keys carry scopes that determine what they can do. For WhatsApp there are two:

ScopeGrants
whatsapp:readList messages, accounts, and templates
whatsapp:writeSend messages and manage templates

To follow this quickstart you'll need both scopes on your key. All request and response bodies are JSON.

Step 1 — Create an API Key

1Generate a scoped key in the portal

In the Cliqtel portal, go to Dashboard → API Keys and create a new key. When prompted for scopes, grant both:

  • whatsapp:read
  • whatsapp:write
Copy your key immediately. The full key value is shown only once at creation time. Store it in a secret manager or environment variable — never commit it to source control or expose it in client-side code.

Step 2 — Find Your Account ID

2List your connected WhatsApp accounts

Each send needs an account_id — the numeric id of the WhatsApp Business Account you're sending from. List your connected accounts with a GET request:

cURL — LIST ACCOUNTS
curl https://cliqtel.com/api/v1/whatsapp/accounts \
  -H "Authorization: Bearer YOUR_API_KEY"
NODE.JS
const res = await fetch('https://cliqtel.com/api/v1/whatsapp/accounts', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
});

const accounts = await res.json();
console.log(accounts); // find the numeric "id" you want to send from
PYTHON
import requests

res = requests.get(
    'https://cliqtel.com/api/v1/whatsapp/accounts',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

print(res.json())  # find the numeric "id" you want to send from

Note the numeric id from the account you want to use — that's the account_id you'll pass on every send.

Step 3 — Send Your First Message

3POST to the messages endpoint

Messages are sent with POST /api/v1/whatsapp/messages. The type field decides what you're sending. There are two ways to start:

  • Text (type: "text") — free-form messages, only allowed inside an open 24-hour customer service window.
  • Template (type: "template") — a pre-approved template, used to start a conversation when no window is open.
The 24-hour window rule: WhatsApp only lets you send free-form text within 24 hours of the customer's last message to you. To start a conversation — or to reply after the window has closed — you must send an approved template instead. If you try to send text outside a window, the send is rejected.

Send a text message

Use this inside an open 24-hour window (for example, replying to a customer who just messaged you).

cURL — SEND TEXT
curl -X POST https://cliqtel.com/api/v1/whatsapp/messages \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": 1,
    "to": "+31611398058",
    "type": "text",
    "text": { "body": "Thanks for reaching out! How can we help?" }
  }'
NODE.JS
const res = await fetch('https://cliqtel.com/api/v1/whatsapp/messages', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    account_id: 1,                 // from Step 2
    to: '+31611398058',
    type: 'text',
    text: { body: 'Thanks for reaching out! How can we help?' },
  }),
});

const data = await res.json();
console.log(data.id, data.status); // message ID, "accepted"
PYTHON
import requests

res = requests.post(
    'https://cliqtel.com/api/v1/whatsapp/messages',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'account_id': 1,           # from Step 2
        'to': '+31611398058',
        'type': 'text',
        'text': {'body': 'Thanks for reaching out! How can we help?'},
    },
)

print(res.json()['id'], res.json()['status'])

A successful send returns a JSON body with the new message's ID and its initial status:

RESPONSE
{
  "id": 90210,
  "status": "accepted"
}

Send a template message

Use a template to start a new conversation (no open window) or to re-engage a customer. The template must already be approved in your WhatsApp account, and you supply its name, language.code, and any components the template defines.

cURL — SEND TEMPLATE
curl -X POST https://cliqtel.com/api/v1/whatsapp/messages \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": 1,
    "to": "+31611398058",
    "type": "template",
    "template": {
      "name": "order_update",
      "language": { "code": "en" },
      "components": [{
        "type": "body",
        "parameters": [{ "type": "text", "text": "ORD-4821" }]
      }]
    }
  }'
NODE.JS
const res = await fetch('https://cliqtel.com/api/v1/whatsapp/messages', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    account_id: 1,
    to: '+31611398058',
    type: 'template',
    template: {
      name: 'order_update',
      language: { code: 'en' },
      components: [{
        type: 'body',
        parameters: [{ type: 'text', text: 'ORD-4821' }],
      }],
    },
  }),
});

const data = await res.json();
console.log(data.id, data.status); // message ID, "accepted"
PYTHON
import requests

res = requests.post(
    'https://cliqtel.com/api/v1/whatsapp/messages',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'account_id': 1,
        'to': '+31611398058',
        'type': 'template',
        'template': {
            'name': 'order_update',
            'language': {'code': 'en'},
            'components': [{
                'type': 'body',
                'parameters': [{'type': 'text', 'text': 'ORD-4821'}],
            }],
        },
    },
)

print(res.json()['id'], res.json()['status'])
Beyond text and templates: The same endpoint also sends media (images, documents, audio, video), location, and interactive messages (buttons and lists). See Rich WhatsApp Messages for those payloads.

Step 4 — Track Status

4Check delivery lifecycle

Every WhatsApp message moves through a lifecycle:

MESSAGE LIFECYCLE
accepted -> sent -> delivered -> read
                              \-> failed

You can poll for status, or receive it via webhooks.

List and filter messages

Fetch recent messages with GET /api/v1/whatsapp/messages (supports filtering):

cURL — LIST MESSAGES
curl "https://cliqtel.com/api/v1/whatsapp/messages?account_id=1" \
  -H "Authorization: Bearer YOUR_API_KEY"

Fetch a single message

Retrieve one message (and its current status) by ID with GET /api/v1/whatsapp/messages/{id}:

NODE.JS — GET ONE MESSAGE
const res = await fetch('https://cliqtel.com/api/v1/whatsapp/messages/90210', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
});

const msg = await res.json();
console.log(msg.status); // "sent", "delivered", "read", or "failed"
PYTHON
import requests

res = requests.get(
    'https://cliqtel.com/api/v1/whatsapp/messages/90210',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

print(res.json()['status'])  # "sent", "delivered", "read", or "failed"

Delivery webhooks

Instead of polling, pass a status_callback_url on a send to receive delivery updates as they happen. Cliqtel will POST status changes (sent, delivered, read, failed) to your endpoint.

NODE.JS — SEND WITH STATUS CALLBACK
await fetch('https://cliqtel.com/api/v1/whatsapp/messages', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    account_id: 1,
    to: '+31611398058',
    type: 'text',
    text: { body: 'Your order has shipped.' },
    status_callback_url: 'https://your-app.com/webhooks/whatsapp',
  }),
});
You're live. With a scoped key, your account ID, and a send that returns { "status": "accepted" }, you're now sending WhatsApp messages through Cliqtel. Everything from here is refinement.

Next Steps

  • Rich WhatsApp Messages — media, location, and interactive button/list messages.
  • WhatsApp Campaigns — send approved templates to many recipients at once.
  • WhatsApp Setup Guide — connecting your WABA, registering numbers, and managing templates.
  • Full API Reference — every endpoint, parameter, and response shape.

Rate Limits & Errors

The WhatsApp API is rate limited to 60 requests per minute per API key. If you exceed it, requests are rejected until the window resets — batch or throttle high-volume sends accordingly.

StatusMeaning
401Missing or invalid API key
403Key lacks the required scope (whatsapp:write for sends)
422Invalid payload — e.g. free-form text outside the 24-hour window, or a missing template parameter
429Rate limit exceeded (60 requests/minute)
Failed vs. rejected: A 4xx means the API never accepted your request. A message that was accepted but later shows status failed means WhatsApp couldn't deliver it — check the message record for the failure reason.

FAQ

What's the difference between whatsapp:read and whatsapp:write?

whatsapp:read lets a key list messages, accounts, and templates — useful for read-only dashboards. whatsapp:write is required to send messages and manage templates. To follow this quickstart, grant both.

Why do I need a template to send my first message?

WhatsApp only permits free-form text inside a 24-hour customer service window — which opens when the customer messages you first. To start a conversation, you must use an approved template. Once the customer replies, the window opens and you can send free-form text for the next 24 hours.

Where do I get the account_id?

Call GET /api/v1/whatsapp/accounts (Step 2). Each connected WhatsApp Business Account has a numeric id — use that value as account_id on every send.

How do I know when a message is delivered?

Either poll GET /api/v1/whatsapp/messages/{id} and read the status field, or pass a status_callback_url on the send to have Cliqtel push status changes to your webhook as they happen.

Can I send images, buttons, or locations?

Yes — the same POST /api/v1/whatsapp/messages endpoint supports media, location, and interactive types. See Rich WhatsApp Messages for the payloads, and the full API reference for every field.

Ready to build?

Explore rich message types and bulk campaigns, or dive into the complete API reference.

API Reference →
© 2026 Cliqtel · cliqtel.com
会社情報 ブログ パートナー 対応エリア APIドキュメント ステータス プライバシー 利用規約 Cookie ヘルプ 検索
cliqtel.comはオランダ・ザイストに登記されたCliqtel B.V.が運営しています · KVK 42033793 · VAT NL869402468B01 · SBI 62.09

Cliqtelの動作に必要な必須Cookieを使用しています。お客様の同意のもと、サービス改善のために分析Cookieも使用します。Cookieポリシー