NAV

api.kirimwa.id

Developer Preview

Pengenalan

API KirimWA.id adalah sebuah layanan unofficial WhatsApp API Gateway. Dengan API KirimWA.id anda dapat melakukan otomasi pengiriman pesan WhatsApp lewat HTTP request. API KirimWA.id dapat digunakan untuk mengirim link konfirmasi, OTP, alert, dan berbagai notifikasi yang sesuai dengan keingingan.

Langkah-langkah yang harus dilakukan untuk mulai menggunakan API KirimWA.id adalah:

  1. Daftar untuk mendapatkan API Token
  2. Tambahkan device pada API KirimWA.id
  3. Hubungkan atau pairing device WhatsApp dengan API KirimWA.id
  4. Mulai mengirimkan pesan WhatsApp dengan API KirimWA.id

Langkah opsional berikutnya:

  1. Menambahkan webhook agar ketika pengiriman pesan selesai maka aplikasi anda otomatis akan mendapatkan pemberitahuan.

Pada setiap endpoint API di sebelah kanan terdapat keterangan dan contoh cara penggunaannya di API KirimWA.id.

Layanan ini memerlukan akun WhatsApp yang aktif, dimana anda perlu melakukan scan QR code terlebih dahulu untuk melakukan pairing device antara WhatsApp anda dengan API KirimWA.id. Prosesnya mirip dengan WhatsApp Web karena dibalik layar API KirimWA.id memanfaatkan WhatsApp Web untuk berkomunkasi dengan perangkat WhatsApp anda.

Status

CATATAN PENTING

Saat ini layanan API KirimWA.id masih dalam tahap developer preview sehingga tidak direkomendasikan untuk penggunaan pada production. Dalam tahap ini mungkin akan banyak perubahan karena bug fixes dan fitur-fitur baru akan dihadirkan secara cepat. Selalu pantau halaman ini berkala untuk update terbaru.

Layanan disediakan secara GRATIS saat ini namun dapat berubah sewaktu-waktu dimasa yang akan datang. Perubahan tentunya akan diberitahukan kepada para pengembang yang telah menggunakan layanan ini.

Versi mayor dari API KirimWA.id saat ini adalah v1 sehingga setiap API request akan memiliki prefix /v1.

https://api.kirimwa.id/v1

Otentikasi

API KirimWA.id menggunakan API Token untuk melakukan otentikasi setiap request yang masuk. Untuk mendapatkan API Token silahkan mendaftar pada halaman developer.kirimwa.id. Untuk otentikasi API KirimWA.id mengharapkan API Token dikirim lewat Authorization header atau lewat query string parameter auth_token.

curl -H 'Authorization: Bearer API_TOKEN' https://api.kirimwa.id/v1

Atau

curl https://api.kirimwa.id/v1/?auth_token=API_TOKEN

Contoh Integrasi

# Lihat pada tab Node.js atau PHP untuk melihat
# contoh fungsi apiKirimWaRequest() yang
# digunakan pada dokumentasi ini.
const https = require('https');

/**
 * Make request to API KirimWA.id
 *
 * @param Object params
 * @return Promise
 */
function apiKirimWaRequest(params)
{
  return new Promise((resolve, reject) => {
    let responseBody = '';
    const options = {
      method: params.method || 'GET',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${params.token}`
      }
    }
    const payloadBuffer = Buffer.from(params.payload);

    if (params.method === 'POST') {
      options.headers['Content-Length'] = payloadBuffer.length;
    }

    const req = https.request(params.url, options, function(res) {
      res.on('data', function concatBody(chunk) {
        responseBody += chunk;
      });

      res.on('end', () => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve({ body: responseBody, response: res });
          return;
        }

        // Non 2XX response
        reject({ body: responseBody, response: res });
      });
    });

    if (params.method === 'POST') {
      req.write(payloadBuffer);
    }

    req.end();
  }); // Promise
}
<?php

/**
 * Make a request to API KirimWA.id
 *
 * @param Array $params
 * @return Array
 * @throws Exception
 */
function apiKirimWaRequest(array $params) {
  $httpStreamOptions = [
    'method' => $params['method'] ?? 'GET',
    'header' => [
      'Content-Type: application/json',
      'Authorization: Bearer ' . ($params['token'] ?? '')
    ],
    'timeout' => 15,
    'ignore_errors' => true
  ];

  if ($httpStreamOptions['method'] === 'POST') {
    $httpStreamOptions['header'][] = sprintf('Content-Length: %d', strlen($params['payload'] ?? ''));
    $httpStreamOptions['content'] = $params['payload'];
  }

  // Join the headers using CRLF
  $httpStreamOptions['header'] = implode("\r\n", $httpStreamOptions['header']) . "\r\n";

  $stream = stream_context_create(['http' => $httpStreamOptions]);
  $response = file_get_contents($params['url'], false, $stream);

  // Headers response are created magically and injected into
  // variable named $http_response_header
  $httpStatus = $http_response_header[0];

  preg_match('#HTTP/[\d\.]+\s(\d{3})#i', $httpStatus, $matches);

  if (! isset($matches[1])) {
    throw new Exception('Can not fetch HTTP response header.');
  }

  $statusCode = (int)$matches[1];
  if ($statusCode >= 200 && $statusCode < 300) {
    return ['body' => $response, 'statusCode' => $statusCode, 'headers' => $http_response_header];
  }

  throw new Exception($response, $statusCode);
}

Silahkan lihat pada tab sebelah kanan untuk melihat contoh sederhana sebuah fungsi untuk melakukan integrasi dengan API KirimWA.id dengan bahasa pemrograman tertentu.

Saat ini contoh yang kami sediakan adalah untuk cURL, runtime Node.js (Javascript) dan PHP. Anda dapat menggunakan pustaka lain, tidak harus mengikuti contoh yang diberikan sebagai contoh pada PHP anda dapat menggunakan libCURL atau Guzzle.

Untuk bahasa pemrograman lain anda dapat memanfaatkan pustaka HTTP client dari masing-masing bahasa pemrograman untuk melakukan integrasi dengan API KirimWA.id.

Devices

Sebelum dapat mengirim pesan menggunakan API KirimWA.id maka anda perlu menambahkan device terlebih dahulu. Anda dapat memiliki lebih dari satu device pada API KirimWA.id. Sebuah device harusnya terasosiasi dengan sebuah nomor WhatsApp.

POST /devices

curl -X POST 'https://api.kirimwa.id/v1/devices' \
  -H 'Authorization: Bearer API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '
{
    "device_id": "iphone-x-pro"
}'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/devices');
  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'POST',
    payload: JSON.stringify({
        device_id: 'iphone-x-pro'
    })
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/devices',
    'method' => 'POST',
    'payload' => json_encode([
      'device_id' => 'iphone-x-pro'
    ])
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 201 Created
Content-Type: application/json
{
  "id": "iphone-x-pro",
  "status": "disconnected",
  "created_at": "2021-07-09T15:11:53.657Z",
  "meta": {
    "location": "https://api.kirimwa.id/v1/devices/iphone-x-pro"
  }
}

Endpoint ini untuk menambahkan device baru yang bisa digunakan untuk pairing ke API KirimWA.id.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token
Content-Type: application/json Wajib Tipe dari request harus application/json

Body

Body dalam bentuk JSON.

Parameter Wajib Keterangan
device_id Wajib ID dari device yang ingin ditambahkan. Misal iphone-x-pro.

GET /devices

curl 'https://api.kirimwa.id/v1/devices' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/devices');
  // url.searchParams.set('start_key', 'Enter start_key here');
  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/devices'
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "data": [
    {
      "id": "iphone-x-pro",
      "status": "disconnected",
      "created_at": "2021-07-09T15:11:53.657Z",
      "connected_at": "2021-07-18T13:26:57.698Z",
      "disconnected_at": "2021-07-18T13:27:33.089Z",
      "disconnected_reason": "Send message timeout."
    },
    {
      "id": "zenfone-red-1",
      "status": "disconnected",
      "created_at": "2021-07-09T08:40:58.070Z",
      "connected_at": "2021-07-19T13:26:57.698Z",
      "disconnected_at": "2021-07-19T13:27:33.089Z",
      "disconnected_reason": "Send message timeout."
    }
  ],
  "meta": {
    "last_key": "zenfone-red-1"
  }
}

Untuk merequest halaman berikutnya dapat digunakan nilai dari parameter last_key sebagai input untuk parameter start_key.

curl 'https://api.kirimwa.id/v1/devices?start_key=zenfone-red-1'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/devices');
  url.searchParams.set('start_key', 'zenfone-red-1');
  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $query = http_build_query(['start_key' => 'zenfone-red-1']);
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/devices?%s', $query)
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Endpoint ini untuk melihat semua devices yang sudah dibuat oleh akun anda. Maksimum data yang dikembalikan per page adalah 10 item. Item terkahir yang dikembalikan per halaman ada pada properti last_key. Properti ini kemudian dapat digunakan untuk merequest halaman berikutnya dengan menggunakan query string parameter start_key. Jika nilai dari last_key adalah null maka data sudah habis dan ini adalah halaman terakhir.

Query String Parameter

Parameter Wajib Keterangan
start_key Opsional Nilai dari last_key yang digunakan untuk merequest halaman berikutnya.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

GET /devices/DEVICE_ID

curl 'https://api.kirimwa.id/v1/devices/iphone-x-pro' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const deviceId = process.env.DEVICE_ID;
  const url = new URL('https://api.kirimwa.id/v1/devices/' + deviceId);

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprint('https://api.kirimwa.id/v1/devices/%s', getenv('DEVICE_ID'))
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "id": "iphone-x-pro",
  "status": "disconnected",
  "created_at": "2021-07-09T15:11:53.657Z",
  "connected_at": "2021-07-18T13:26:57.698Z",
  "disconnected_at": "2021-07-18T13:27:33.089Z",
  "disconnected_reason": "Send message timeout."
}

Endpoint ini digunakan untuk mendapatkan informasi pada sebuah device berdasarkan DEVICE_ID.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

DELETE /devices/DEVICE_ID

curl -X DELETE 'https://api.kirimwa.id/v1/devices/iphone-x-pro'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const deviceId = process.env.DEVICE_ID;
  const url = new URL('https://api.kirimwa.id/v1/devices/' + deviceId);

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'DELETE'
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/devices/%s', getenv('DEVICE_ID')),
    'method' => 'DELETE'
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 204 No Content

Endpoint ini digunakan untuk menghapus sebuah device berdasarkan DEVICE_ID. Setelah device dihapus maka request berikutnya seperti mengirim pesan yang menggunakan DEVICE_ID akan gagal.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

QR Code

GET /qr

curl -s \
  'https://api.kirimwa.id/v1/qr?device_id=DEVICE_ID'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
    const deviceId = process.env.DEVICE_ID;
    const url = new URL('https://api.kirimwa.id/v1/qr');
    url.searchParams.set('device_id', deviceId);

    const reqParams = {
      token: process.env.API_TOKEN,
      url: url
    };

    try {
      const { body, response } = await apiKirimWaRequest(reqParams);
      console.log(body);
    } catch (error) {
      console.error('Something went wrong', {
        body: error.body,
        statusCode: error.response.statusCode
      });
    }
  })();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $query = http_build_query(['device_id' => getenv('DEVICE_ID')]);
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/qr?%s', $query)
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "qr_code": "[email protected]+gPC4PN1iSNlGLizlfGsrHSD/M6ym6/aYiYw==,xXlcsqVquva7/1c2g8wAZkWdnk2el5tHWh7MWUW2UTc=,v+P3exsbB1W62wX3Vn4dcC==",
  "image_url": "https://api.kirimwa.id/v1/qr/show?qrcode=1%40U2tS5Q1elzj6Y7IAKDurwvja47SQz8bvW24fb43r3n%2BgPC4PN1iSNlGLizlfGsrHSD%2FM6ym6%2FaYiYw%3D%3D%2CxXlcsqVquva7%2F1c2g8wAZkWdnk2el5tHWh7MWUW2UTc%3D%2Cv%2BP3exsbB1W62wX3Vn4dcC%3D%3D&device_id=YOUR_DEVICE_ID"
}

Endpoint ini digunakan untuk mendapatkan QR code yang digunakan untuk melakukan pairing device ke API KirimWA.id. Terdapat dua atribut yang dikembalikan yaitu qr_code dan image_url.

Untuk menampilkan gambar QR Code kunjungi link URL yang ada terdapat pada image_url kemudian scan QR code tersebut dengan WhatsApp.

Query String Parameter

Parameter Wajib Keterangan
device_id Wajib WhatsApp device yang akan dikoneksikan atau dipairing dengan API KirimWA.id.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

Groups

GET /groups

curl 'https://api.kirimwa.id/v1/groups?device_id=DEVICE_ID' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const deviceId = process.env.DEVICE_ID;
  const url = new URL('https://api.kirimwa.id/v1/groups');
  url.searchParams.set('device_id', deviceId);

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $query = http_build_query(['device_id' => getenv('DEVICE_ID')]);
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/groups?%s', $query)
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "message": "Contacts has been synced.",
  "data": [
    {
      "id": "6281234567890-1628639680",
      "name": "Grup Keluarga Besar"
    },
    {
      "id": "6281234567890-1628639662",
      "name": "Developer Tim"
    }
  ]
}

Jika query dilakukan saat koneksi perangkat terputus maka API KirimWA.id akan coba melakukan koneksi ulang ke perangkat. Sehingga hasil yang didapatkan mungkin kosong.

{
  "message": "Contacts is being sync.",
  "data": []
}

Tunggu beberapa detik karena kontak akan disinkronisasi ulang. Setelah itu lakukan hit ulang ke endpoint.

Endpoint ini digunakan untuk mendapatkan daftar group yang ada.

Query String Parameter

Parameter Wajib Keterangan
device_id Wajib Target device yang digunakan.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

Messages

Saat ini API KirimWA.id mendukung pengiriman pesan teks dan gambar. Pengiriman pesan pada API KirimWA.id bersifat asynchronous. Artinya pesan yang dikirim akan masuk ke queue (antrian) server API KirimWA.id. Proses ini sangat cepat biasanya hanya perlu kurang dari 1 detik untuk queue diproses.

API KirimWA mendukung pengiriman pesan ke nomor WhatsApp individu atau sebuah grup WhatsApp.

Kirim Pesan ke Grup

Jika mengirim ke individu maka yang digunakan adalah nomor WhatsApp tujuan. Sedangkan untuk grup digunakan ID dari grup. Untuk mendapatkan daftar ID dari grup WhatsApp gunakan endpoint GET /groups.

Jika mengirim pesan ke grup maka atribut is_group_message harus diset ke nilai true.

POST /messages

curl -X POST 'https://api.kirimwa.id/v1/messages' \
  -H 'Authorization: Bearer API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '
{
  "phone_number": "6281234567890",
  "message": "Halo ini adalah pesan dari api.kirimwa.id",
  "device_id": "iphone-x-pro",
  "message_type": "text"
}
'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/messages');
  const message = {
    message: 'Halo ini adalah pesan dari api.kirimwa.id',
    phone_number: '6281234567890',
    message_type: 'text',
    device_id: 'iphone-x-pro'
  }

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'POST',
    payload: JSON.stringify(message)
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/messages',
    'method' => 'POST',
    'payload' => json_encode([
      'message' => 'Halo ini adalah pesan dari api.kirimwa.id.',
      'phone_number' => '6281234567890',
      'message_type' => 'text',
      'device_id' => 'iphone-x-pro'
    ])
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 201 Created
Content-Type: application/json
{
  "id": "kwid-426564a5db7940288dc9fddb845",
  "status": "pending",
  "message": "Message is pending and waiting to be processed.",
  "meta": {
    "location": "https://api.kirimwa.id/v1/messages/kwid-426564a5db7940288dc9fddb845"
  }
}

Nilai dari message_id dapat anda gunakan untuk mengetahui status pengiriman dari sebuah pesan dengan melakukan request pada endpoint GET /messages/MESSAGE_ID.

Berikut adalah contoh request untuk mengirimkan pesan dalam bentuk gambar.

curl -X POST 'https://api.kirimwa.id/v1/messages' \
  -H 'Authorization: Bearer API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '
{
  "phone_number": "6281234567890",
  "message": "https://rioastamal.net/portfolio/img/rioastamal.jpg",
  "device_id": "iphone-x-pro",
  "message_type": "image",
  "caption": "Foto Profil"
}
'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/messages');
  const message = {
    message: 'https://rioastamal.net/portfolio/img/rioastamal.jpg',
    phone_number: '6281234567890',
    message_type: 'image',
    device_id: 'iphone-x-pro',
    caption: 'Foto Profil'
  }

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'POST',
    payload: JSON.stringify(message)
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/messages',
    'method' => 'POST',
    'payload' => json_encode([
      'message' => 'https://rioastamal.net/portfolio/img/rioastamal.jpg',
      'phone_number' => '6281234567890',
      'message_type' => 'image',
      'device_id' => 'iphone-x-pro',
      'caption' => 'Foto Profil'
    ])
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Berikut adalah contoh mengirim pesan ke grup dengan ID 6281234567890-1628639680 dengan tipe pesan text.

curl -X POST 'https://api.kirimwa.id/v1/messages' \
  -H 'Authorization: Bearer API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '
{
  "phone_number": "6281234567890-1628639680",
  "message": "Halo semua ini dari api.kirimwa.id",
  "device_id": "iphone-x-pro",
  "message_type": "text",
  "is_group_message": true
}
'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/messages');
  const message = {
    message: 'Halo semua ini dari api.kirimwa.id',
    phone_number: '6281234567890-1628639680',
    message_type: 'text',
    device_id: 'iphone-x-pro',
    is_group_message: true
  }

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'POST',
    payload: JSON.stringify(message)
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/messages',
    'method' => 'POST',
    'payload' => json_encode([
      'message' => 'Halo semua ini dari api.kirimwa.id',
      'phone_number' => '6281234567890-1628639680',
      'message_type' => 'text',
      'device_id' => 'iphone-x-pro'
      'is_group_message' => true
    ])
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Endpoint ini digunakan untuk mengirimkan pesan baik teks atau gambar.

Beberapa batasan untuk pengiriman pesan diantaranya:

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token
Content-Type: application/json Wajib Tipe dari request harus application/json

Body

Body dalam bentuk JSON.

Parameter Wajib Keterangan
phone_number Wajib Nomor WhatsApp tujuan dalam format internasional TANPA tanda +. Misal 6281234567890. Jika mengirim ke Grup maka ini adalah ID dari Grup yang bisa dilihat di GET /groups.
message Wajib Pesan yang akan dikirimkan. Jika message_type berupa image maka ini adalah HTTP URL dari image tersebut.
device_id Wajib Device yang akan digunakan untuk mengirim.
message_type Opsional Tipe dari pesan yaitu text atau image. Default adalah text.
caption Opsional Jika tipe pesan adalah image anda dapat menambahkan caption yaitu teks yang akan ditampilkan dibawah gambar.
is_group_message Opsional Pesan untuk grup atau individu. Jika untuk grup nilainya true, sedangkan false untuk individu. Default adalah false yaitu untuk individu.

GET /messages

curl 'https://api.kirimwa.id/v1/messages' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/messages');
  // Do some filter
  // --------------
  url.searchParams.set('status', 'success'); // value: success | fail
  // url.searchParams.set('start_key', 'some_value');
  // url.searchParams.set('date', '2021-07-01');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
    $query = http_build_query([
      'status' => 'success',
      'start_key' => '',
      'date' => ''
    ]);
    $reqParams = [
      'token' => getenv('API_TOKEN'),
      'url' => sprintf('https://api.kirimwa.id/v1/messages?%s', $query)
    ];

    $response = apiKirimWaRequest($reqParams);
    echo $response['body'];
  } catch (Exception $e) {
    print_r($e);
  }

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "data": [
    {
      "id": "kwid-426564a5db7940288dc9fddb845",
      "message": "Message has been sent.",
      "status": "success",
      "created_at": "2021-07-10T00:18:30.614Z",
      "payload": {
        "message": "Halo ini adalah pesan dari api.kirimwa.id",
        "phone_number": "6281234567890",
        "device_id": "iphone-x-pro",
        "message_type": "text",
        "caption": null,
        "is_group_message": false
      }
    },
    {
      "id": "kwid-426564a5db7940288dc9fddb812",
      "message": "Message has been sent.",
      "status": "success",
      "created_at": "2021-07-10T00:16:10.373Z",
      "payload": {
        "message": "Halo ini adalah pesan dari api.kirimwa.id",
        "phone_number": "6281234567890",
        "device_id": "asus-zenfone-1",
        "message_type": "text",
        "catption": null,
        "is_group_message": false
      }
    }
  ],
  "meta": {
    "last_key": "kwid-426564a5db7940288dc9fddb812"
  }
}

Untuk merequest pesan pada halaman berikutnya dapat digunakan nilai dari parameter last_key sebagai input untuk parameter start_key.

curl 'https://api.kirimwa.id/v1/messages?start_key=kwid-426564a5db7940288dc9fddb812' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/messages');
  // Do some filter
  // --------------
  url.searchParams.set('status', 'success'); // value: success | fail
  url.searchParams.set('start_key', 'kwid-426564a5db7940288dc9fddb812');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $query = http_build_query([
    'status' => 'success',
    'start_key' => 'kwid-426564a5db7940288dc9fddb812'
  ]);
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/messages?%s', $query)
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Endpoint ini digunakan untuk mendapatkan semua pesan yang dikirim dengan menggunakan endpoint POST /messages. Maksimum data yang dikembalikan per request adalah 10 item. Untuk merequest item berikutnya gunakan nilai dari atribut last_key dan gunakan sebagai input untuk parameter start_key. Jika nilai dari last_key adalah null maka data sudah habis dan ini adalah halaman terakhir.

Query String Parameter

Parameter Wajib Keterangan
start_key Opsional Nilai dari last_key yang digunakan untuk merequest halaman berikutnya.
status Opsional Status pemrosesan pesan yaitu pending, success, atau fail. Default adalah success.
date Opsional Tanggal pesan dikirim dalam format YYYY-MM-DD, contoh 2021-07-10.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

GET /messages/MESSAGE_ID

curl 'https://api.kirimwa.id/v1/messages/kwid-426564a5db7940288dc9fddb812' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const messageId = process.env.MESSAGE_ID;
  const url = new URL('https://api.kirimwa.id/v1/messages/' + messageId);

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/messages/%s', getenv('MESSAGE_ID'))
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "id": "kwid-426564a5db7940288dc9fddb812",
  "message": "Message has been sent.",
  "status": "success",
  "created_at": "2021-07-10T00:16:10.373Z",
  "payload": {
    "message": "Halo ini adalah pesan dari api.kirimwa.id",
    "phone_number": "6281234567890",
    "device_id": "asus-zenfone-1",
    "message_type": "text",
    "caption": null,
    "is_group_message": false
  }
}

Endpoint ini digunakan untuk mendapatkan informasi sebuah message berdasarkan MESSAGE_ID.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

Incoming Messages

Ketika ada pesan baru masuk di WhatsApp maka API KirimWA.id otomatis akan mengirimkan payload ke webhook yang telah anda ditentukan seperti dijelaskan pada Webhook Incoming Message. Setiap pesan yang masuk akan disimpan dan dapat dilihat menggunakan API GET /incoming-messages berikut.

GET /incoming-messages

curl -X POST 'https://api.kirimwa.id/v1/incoming-messages?device_id=DEVICE_ID' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const deviceId = process.env.DEVICE_ID;
  const url = new URL('https://api.kirimwa.id/v1/incoming-messages');
  // Do some filter
  // --------------
  url.searchParams.set('device_id', deviceId);

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $query = http_build_query([
    'device_id' => getenv('DEVICE_ID')
  ]);
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/incoming-messages?%s', $query)
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "data": [
    {
      "id": "3EB07079D3331BA4746C",
      "device_id": "iphone-x-pro",
      "message_type": "text",
      "timestamp": 1631369848,
      "text": "Hello incoming message from api.kirimwa.id",
      "group_id": "6281234567890-1628639662",
      "is_group_message": true,
      "sender": "6281234567891",
      "caption": null,
      "from_me": false,
      "created_at": "2021-09-11T14:17:29.291Z",
      "location": {
        "name": null,
        "address": null,
        "latitude": 0,
        "longitude": 0
      },
      "contact": {
        "name": null,
        "vcard": null
      },
      "meta": {
        "seconds": 0,
        "size": 42,
        "mime_type": "plain/text",
        "dimension": {
          "width": 0,
          "height": 0
        },
        "file_name": null
      }
    },
    {
      "id": "3EB07079D3331BA471ER",
      "device_id": "iphone-x-pro",
      "message_type": "text",
      "timestamp": 1631369848,
      "text": "Hello from api.kirimwa.id",
      "group_id": null,
      "is_group_message": false,
      "sender": "6281234567890",
      "caption": null,
      "from_me": false,
      "created_at": "2021-09-11T14:17:29.291Z",
      "location": {
        "name": null,
        "address": null,
        "latitude": 0,
        "longitude": 0
      },
      "contact": {
        "name": null,
        "vcard": null
      },
      "meta": {
        "seconds": 0,
        "size": 25,
        "mime_type": "plain/text",
        "dimension": {
          "width": 0,
          "height": 0
        },
        "file_name": null
      }
    }
  ],
  "meta": {
    "last_key": null
  }
}

Endpoint untuk melihat pesan yang masuk ke WhatsApp sesuai dengan device ID.

Query String Parameter

Parameter Wajib Keterangan
device_id Wajib Device ID untuk pesan yang masuk.
start_key Opsional Nilai dari last_key yang digunakan untuk merequest halaman berikutnya.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

Webhooks

Webhooks digunakan agar aplikasi anda dapat memperoleh informasi status dari API KirimWA.id. Saat ini API KirimWA.id akan mengirimkan webhook pada kondisi berikut:

Anda hanya perlu menyediakan satu Webhook URL. API KirimWA.id membedakan setiap aksi pada webhook dengan argumen tertentu yang dibahas pada bagian berikutnya.

Webhook Message Response

Webhook ini akan dipanggil ketika sebuah pesan selesai diproses baik itu success atau fail. Ketika endpoint POST /messages dipanggil maka webhook ini akan dijalankan oleh API KirimWA.id setelah proses selesai. Atribut yang mengindikasikan tipe webhook ini adalah atribut webhook_type dengan nilai send_message_response.

API KirimWA.id akan melakukan POST request ke URL webhook yang telah didaftarkan. Data yang dikirimkan oleh API KirimWA.id ketika memanggil webhook URL ini adalah sebagai berikut.

{ id: 'kwid-426564a5db7940288dc9fddb812', webhook_type: 'send_message_response', status: 'success', message: 'Message has been sent.', payload: { message: 'Halo ini adalah pesan dari api.kirimwa.id', phone_number: '6281234567890', device_id: 'asus-zenfone-1', message_type: 'text', caption: null }, created_at: '2021-07-10T00:16:10.373Z', server_time: '2021-07-19T13:35:00.078Z' }

Penjelasan dari atribut Webhook Message Response.

Atribut Deskripsi
id ID dari message yang dihasilkan dari POST /messages
webhook_type Tipe dari webhook yaitu send_message_response.
status Status dari pemrosesan pesan. Antara success atau fail.
message Pesan dari pemrosesan.
payload Adalah payload data yang dikirimkan ketika memanggil endpoint POST /messages.
created_at Tanggal pemrosesan pesan.
server_time Tanggal dari server ketika webhook dikirimkan.

Webhook Incoming Message

Webhook ini akan dipanggil ketika sebuah pesan baru masuk ke WhatsApp. Saat ini webhook pesan masuk hanya mendukung pesan berbentuk teks. Atribut yang mengindikasikan tipe webhook ini adalah atribut webhook_type dengan nilai incoming_message.

API KirimWA.id akan melakukan POST request ke URL webhook yang telah didaftarkan. Data yang dikirimkan oleh API KirimWA.id berupa JSON String. Ini adalah struktur JSON yang dikirimkan pada webhook pesan masuk.

{ "id": "kwid-2605630cf636463da5ce2f4110a", "webhook_type": "incoming_message", "payload": { "id": "kwid-2605630cf636463da5ce2f4110a", "device_id": "iphone-x-pro", "sender": "6281234567890", "from_me": false, "message_type": "text", "text": "Halo ini adalah pesan dari api.kirimwa.id", "caption": null, "is_group_message": false, "group_id": null, "timestamp": 1631306956, "contact": { "name": null, "vcard": null }, "location": { "latitude": 0, "longitude": 0, "name": null, "address": null }, "meta": { "file_name": null, "seconds": 0, "size": 41, "mime_type": "plain/text", "dimension": { "height": 0, "width": 0 } } }, "created_at": "2021-09-10T20:49:16.000Z", "server_time": "2021-09-10T20:49:17.462Z" }

Penjelasan dari atribut Webhook Pesan Masuk.

Atribut Deskripsi
id ID dari message yang diterima.
webhook_type Tipe dari webhook yaitu incoming_message.
payload Adalah payload data dari pesan masuk yang diterima oleh API KirimWA.id.
payload.id ID dari pesan yang diterima.
payload.sender Nomor WhatsApp pengirim.
payload.message_type Tipe dari pesan. Contoh: text, image, document, video, contact, location.
payload.from_me Apakah pesan dari nomor itu sendiri, biasanya digunakan untuk pesan pada grup. Nilainya true atau false.
payload.text Isi dari pesan yang bertipe text.
payload.caption Deskripsi dari pesan bertipe image atau video.
payload.is_group_message Apakah pesan dari group, nilainya true atau false.
payload.group_id ID dari group jika ini merupakan pesan dari grup.
payload.timestamp Unix timestamp waktu pesan dikirim.
payload.contact Pesan yang berisi data contact.
payload.location Pesan yang berisi koordinat lokasi.
payload.meta Informasi tambahan pada pesan yang masuk.
created_at Tanggal pesan diterima.
server_time Tanggal dari server ketika webhook dikirimkan.

POST /webhooks

curl -X POST 'https://api.kirimwa.id/v1/webhooks' \
  -H 'Authorization: Bearer API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '
{
  "webhook_url": "https://YOUR_DOMAIN/my/webhook"
}'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/webhooks');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'POST',
    payload: JSON.stringify({
      webhook_url: 'https://YOUR_DOMAIN/my/webhook'
    })
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/webhooks',
    'method' => 'POST',
    'payload' => json_encode([
      'webhook_url' => 'https://YOUR_DOMAIN/my/webhook'
    ])
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "id": "[email protected]",
  "status": "active",
  "data": "https://YOUR_DOMAIN/my/webhook",
  "created_at": "2021-06-20T17:17:06.333Z",
  "meta": {
    "location": "https://api.kirimwa.id/v1/webhooks"
  }
}

Endpoint ini digunakan untuk menambahkan webhook yang akan dipanggil oleh API KirimWA.id. Salah satu contohnya adalah Webhook Message Response diatas, API KirimWA.id akan memanggil URL yang dimasukkan pada endpoint ini.

Untuk melakukan update webhook URL maka anda dapat memanggil endpoint ini dengan parameter yang sama. Setiap pemanggilan akan menimpa nilai yang lama.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token
Content-Type: application/json Wajib Tipe dari request harus application/json

Body

Body dalam bentuk JSON.

Parameter Wajib Keterangan
webhook_url Wajib Alamat webhook URL yang akan dipanggil untuk menerima even dari API KirimWA.id

GET /webhooks

curl 'https://api.kirimwa.id/v1/webhooks' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/webhooks');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/webhooks'
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "data": [
    {
      "id": "[email protected]_ADDR",
      "data": "http://localhost:3001",
      "status": "active",
      "created_at": "2021-07-20T17:17:06.333Z"
    }
  ]
}

Endpoint ini digunakan untuk mendapatkan data webhook URL yang telah ditambahkan. Saat ini API KirimWA.id hanya mendukung penggunaan satu webhook URL.

DELETE /webhooks/WEBHOOK_ID

curl -X DELETE 'https://api.kirimwa.id/v1/webhooks/[email protected]_ADDR' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const webhookId = process.env.WEBHOOK_ID;
  const url = new URL('https://api.kirimwa.id/v1/webhooks/' + webhookId);

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'DELETE'
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/webhooks/%s', urlencode(getenv('WEBHOOK_ID'))),
    'method' => 'DELETE'
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 204 No Concent

Ednpoint ini digunakan untuk menghapus webhook yang telah didaftarkan. Setelah dihapus maka API KirimWA.id tidak akan mengirimkan notifikasi status pengeriman pesan ketika tidak ada webhook yang terdaftar.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

GET /webhook-responses

curl 'https://api.kirimwa.id/v1/webhook-responses' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/webhook-responses');
  // Do some filter
  // --------------
  url.searchParams.set('webhook_type', 'send_message_response');
  // url.searchParams.set('start_key', 'some_value');
  // url.searchParams.set('status', 'fail'); // value: success | fail
  // url.searchParams.set('device_id', 'DEVICE_ID');
  // url.searchParams.set('message_id', 'MESSAGE_ID');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $query = http_build_query([
    'status' => 'success',
    'webhook_type' => 'send_message_response',
    'start_key' => '',
    'device_id' => '',
    'message_id' => ''
  ]);
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/webhook-responses?%s', $query)
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "data": [
    {
      "id": "aca382a6-b636-481a-ad91-6e560e8dde53",
      "webhook_type": "send_message_response",
      "status": "success",
      "created_at": "2021-07-20T16:33:40.387Z",
      "url": "https://YOUR_DOMAIN/my/webhook",
      "http_response": "201 Created",
      "request_headers": {
        "host": "YOUR_DOMAIN",
        "content-length": 387,
        "content-type": "application/json",
        "user-agent": "API KirimWA/1.0"
      },
      "request_payload": {
        "id": "kwid-426564a5db7940288dc9fddb812",
        "server_time": "2021-07-19T13:35:00.078Z",
        "webhook_type": "send_message_response",
        "status": "success",
        "created_at": "2021-07-20T16:33:35.373Z",
        "message": "Message has been sent.",
        "payload": {
          "phone_number": "6281234567890",
          "message_type": "text",
          "message": "Halo ini adalah pesan dari api.kirimwa.id",
          "device_id": "asus-zenfone-1"
        },
      }
    },
    {
      "id": "fe9833c3-0ee0-4fad-bc93-7ea954d0ee64",
      "webhook_type": "send_message_response",
      "status": "success",
      "created_at": "2021-07-19T22:22:27.525Z",
      "url": "https://YOUR_DOMAIN/my/webhook",
      "http_response": "201 Created",
      "request_headers": {
        "host": "localhost:3001",
        "content-length": 356,
        "content-type": "application/json",
        "user-agent": "API KirimWA/1.0"
      },
      "request_payload": {
        "id": "kwid-426564a5db7940288dc9fddb845",
        "server_time": "2021-07-19T22:22:23.221Z",
        "webhook_type": "send_message_response",
        "status": "success",
        "message": "Message has been sent.",
        "created_at": "2021-07-10T00:18:30.614Z",
        "payload": {
          "message": "Halo ini adalah pesan dari api.kirimwa.id",
          "phone_number": "6281234567890",
          "device_id": "iphone-x-pro",
          "message_type": "text"
        }
      }
    }
  ],
  "meta": {
    "last_key": null
  }
}

Untuk melihat response yang dikirimkan pada webhook URL pesan masuk gunakan perintah parameter webhook_type dengan nilai incoming_message.

curl 'https://api.kirimwa.id/v1/webhook-responses?webhook_type=incoming_message' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/webhook-responses');
  // Do some filter
  // --------------
  url.searchParams.set('webhook_type', 'incoming_message');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $query = http_build_query([
    'status' => 'success',
    'webhook_type' => 'incoming_message',
    'start_key' => '',
    'device_id' => '',
    'message_id' => ''
  ]);
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/webhook-responses?%s', $query)
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

{
  "data": [
    {
      "id": "537e8c78-3365-4562-b823-ae8c83785467",
      "webhook_type": "incoming_message",
      "status": "success",
      "created_at": "2021-09-11T01:43:54.449Z",
      "url": "https://YOUR_DOMAIN/my/webhook",
      "http_response": "200 OK",
      "request_headers": {
        "host": "localhost:3002",
        "content-length": 605,
        "content-type": "application/json",
        "user-agent": "API KirimWA/1.0-RC5"
      },
      "request_payload": {
        "id": "kwid-398861d75c3e4641b2f0a0e5efa",
        "webhook_type": "incoming_message",
        "created_at": "2021-09-11T01:43:49.000Z",
        "server_time": "2021-09-11T01:43:53.371Z",
        "payload": {
          "id": "kwid-398861d75c3e4641b2f0a0e5efa",
          "sender": "6281234567890",
          "text": "Halo ini adalah pesan dari api.kirimwa.id",
          "type": "text",
          "from_me": false,
          "caption": null,
          "is_group_message": false,
          "group_id": null,
          "meta": {
            "seconds": 0,
            "size": 41,
            "mime_type": "plain/text",
            "dimension": {
              "width": 0,
              "height": 0
            },
            "file_name": null
          },
          "contact": {
            "name": null,
            "vcard": null
          },
          "location": {
            "name": null,
            "address": null,
            "latitude": 0,
            "longitude": 0
          },
          "timestamp": 1631324629
        }
      }
    }
  ],
  "meta": {
    "last_key": null
  }
}

Endpoint ini digunakan untuk mendapatkan respon yang diterima oleh API KirimWA.id ketika memanggil Webhook URL. Ini adalah respon yang dikembalikan oleh server anda ketika sebuah webhook dipanggil. Attribut yang dapat menjadi perhatian adalah status dan http_response. Jika nilai dari status adalah success berarti Webhook berhasil dipanggil dan server anda mengembalikan http_response 2XX. Jika pemanggilan gagal maka status bernilai fail dan http_response selain HTTP code 2XX.

Query String Parameter

Parameter Wajib Keterangan
start_key Opsional Nilai dari last_key yang digunakan untuk merequest halaman berikutnya.
webhook_type Opsional Tipe dari webhook response. Default adalah send_message_response.
status Opsional Status pemanggilan webhook yaitusuccess atau fail. Default adalah success.
device_id Opsional ID dari device yang digunakan. Wajib diisi ketika parameter message_id digunakan.
message_id Opsional ID pesan yang didapat ketika memanggil endpoint POST /messages.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

GET /webhook-response/WEBHOOK_RESPONSE_ID

curl 'https://api.kirimwa.id/v1/webhook-responses/fe9833c3-0ee0-4fad-bc93-7ea954d0ee64' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const responseId = 'fe9833c3-0ee0-4fad-bc93-7ea954d0ee64';
  const url = new URL('https://api.kirimwa.id/v1/webhook-responses/' + responseId);

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => sprintf('https://api.kirimwa.id/v1/webhook-responses/%s', getenv('WEBHOOK_RESPONSE_ID'))
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "id": "fe9833c3-0ee0-4fad-bc93-7ea954d0ee64",
  "webhook_type": "send_message_response",
  "status": "success",
  "created_at": "2021-07-19T22:22:27.525Z",
  "url": "https://YOUR_DOMAIN/my/webhook",
  "http_response": "201 Created",
  "request_headers": {
    "host": "localhost:3001",
    "content-length": 356,
    "content-type": "application/json",
    "user-agent": "API KirimWA/1.0"
  },
  "request_payload": {
    "id": "kwid-426564a5db7940288dc9fddb845",
    "server_time": "2021-07-19T22:22:23.221Z",
    "webhook_type": "send_message_response",
    "status": "success",
    "message": "Message has been sent.",
    "created_at": "2021-07-10T00:18:30.614Z",
    "payload": {
      "message": "Halo ini adalah pesan dari api.kirimwa.id",
      "phone_number": "6281234567890",
      "device_id": "iphone-x-pro",
      "message_type": "text"
    }
  }
}

Endpoint ini digunakan untuk mendapatkan sebuah respon webhook yang dikirimkan API KirimWA.id ke server anda.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

Quotas

Saat ini setiap akun memiliki quota maksimal harian adalah 100 pesan pengiriman per hari. Quota akan direset setiap hari pada jam 00:00:00 waktu UTC atau jam 07:00:00 WIB.

Jika anda ingin quota tersebut ditambah silahkan kontak kami di TURN ON YOUR JAVASCRIPT.

GET /quotas

curl 'https://api.kirimwa.id/v1/quotas' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/quotas');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/quotas'
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "quota": {
    "message_per_day": 100,
    "today_usage": 20,
    "current_date": "2021-07-10T13:17:29.924Z",
    "next_reset": "2021-07-11T00:00:00.000Z",
    "countdown_reset": 38551
  }
}

Endpoint ini digunakan untuk mengetahui jumlah quota pengiriman untuk akun anda dan penggunaannya pada hari tersebut.

Header Parameter

Header Wajib Keterangan
Authorization: Bearer API_TOKEN Wajib API Token

Reconnect

Terkadang koneksi perangkat terputus sehingga pengiriman atau proses penerimaan pesan masuk di API KirimWA.id terganggu. Proses reconnect dapat membantu memulihkan koneksi tanpa harus melakukan scan ulang QR.

POST /reconnect

curl 'https://api.kirimwa.id/v1/reconnect' \
  -H 'Authorization: Bearer API_TOKEN' \
  -d '{ "device_id": "iphone-x-pro" }'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1/reconnect');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url,
    method: 'POST',
    payload: JSON.stringify({
      device_id: 'iphone-x-pro'
    })
  };

  try {
    const { body, response } = await apiKirimWaRequest(reqParams);
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();

// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1/reconnect',
    'method' => 'POST',
    'payload' => json_encode([
      'device_id' => 'iphone-x-pro'
    ])
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

{
  "message": "Reconnecting device, please check device status using URL at meta.location.",
  "meta": {
    "location": "https://api.kirimwa.id/v1/devices/iphone-x-pro"
  }
}

Endpoint ini digunakan untuk melakukan reconnect tanpa perlu scan ulang QR Code. Proses reconnect berjalan asynchronus. Status dari koneksi perangkat dapat dilihat pada endpoint GET /v1/devices/DEVICE_ID.

Version

Versi dari API KirimWA.id akan diupdate dari waktu ke waktu. Namun update yang dilakukan akan tetap memprioritaskan kompatibilitas dengan versi sebelumnya. Sehingga aplikasi yang dibuat oleh developer tetap dapat berjalan dengan lancar.

GET /

Endpoint ini digunakan untuk mengetahui versi dari API KirimWA.id yang sedang digunakan.

curl 'https://api.kirimwa.id/v1' \
  -H 'Authorization: Bearer API_TOKEN'
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
(async function() {
  const url = new URL('https://api.kirimwa.id/v1');

  const reqParams = {
    token: process.env.API_TOKEN,
    url: url
  };

  try {
    const { body, response } = await apiKirimWaRequest({});
    console.log(body);
  } catch (error) {
    console.error('Something went wrong', {
      body: error.body,
      statusCode: error.response.statusCode
    });
  }
})();
// Lihat apiKirimWaRequest() pada Contoh Integrasi diatas
try {
  $reqParams = [
    'token' => getenv('API_TOKEN'),
    'url' => 'https://api.kirimwa.id/v1'
  ];

  $response = apiKirimWaRequest($reqParams);
  echo $response['body'];
} catch (Exception $e) {
  print_r($e);
}

Perintah diatas akan mengembalikan respon berikut.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "message": "API KirimWA.id - Unofficial WhatsApp API Gateway",
  "version": "1.0-RC2",
  "stability": "Developer-Preview"
}

Error

Pada API KirimWA.id setiap request yang berhasil akan mengembalikan response HTTP code 2XX. Sedangkan jika terjadi error maka HTTP code yang dikembalikan adalah 4XX atau 5XX.

Error Code Keterangan
400 Bad Request -- Request yang dilakukan tidak sesuai.
401 Unauthorized -- API Token salah.
403 Forbidden -- Tidak ada akses untuk URL yang diminta.
404 Not Found -- Tidak ada halaman yang dimaksud.
429 Too Many Requests -- Jumlah request yang dilakukan melebihi batas yang ditentukan.
500 Internal Server Error -- Terjadi kesalahan pada server API KirimWA.id.