API referansı
Mesajlar
Şablon, metin, medya, konum, kişi kartı, tepki ve form mesajı gönderin; gelen mesajları okundu işaretleyin ve kaçan olayları mesaj kayıtlarından geri alın.
#Message nesnesi
idintegerVeri Merkezi'deki mesaj kaydının kimliği.wamidstringWhatsApp mesaj kimliği. Test anahtarıyla gönderilenlerdetest.ile başlar.directionstringYön.echo, işletmenin telefondaki WhatsApp Business uygulamasından yazdığı mesajdır.Değerler:inbound,outbound,echotypestringMesaj türü (ör.text,template,image,video,audio,document,sticker,reaction,interactive,button,location,contacts).statusstringMesaj durumu (ör.received,sent,delivered,read,failed).fromstring · boş olabilirGönderen telefon numarası.tostring · boş olabilirAlıcı telefon numarası.user_idstring · boş olabilirKarşı tarafın BSUID değeri (telefonu görünmeyen kullanıcılar).usernamestring · boş olabilirGönderenin WhatsApp kullanıcı adı.textstring · boş olabilirMesaj metni; medyada açıklama.mediaobject · boş olabilirMedya bilgisi; gelen medyadamedia_idile indirilir.template_namestring · boş olabilirŞablon mesajlarında şablon adı.campaign_idinteger · boş olabilirKampanyadan gönderildiyse kampanya kimliği.is_testbooleanTest anahtarıyla oluşturulan kayıt mı.errorobject · boş olabilirBaşarısız mesajdacode,title,message.created_atstringOluşturulma zamanı (ISO 8601).sent_atstring · boş olabilirGönderim zamanı.delivered_atstring · boş olabilirTeslim zamanı.read_atstring · boş olabilirOkunma zamanı.failed_atstring · boş olabilirBaşarısızlık zamanı.contextobject · boş olabilirAlıntılı mesajda{ message_id, from, forwarded, frequently_forwarded }.reactionobject · boş olabilirTepki mesajında{ message_id, emoji }.locationobject · boş olabilirKonum mesajında{ latitude, longitude, name, address, url }.contactsarray · boş olabilirKişi kartı paylaşıldıysa Meta'nın kişi dizisi.original_message_idstring · boş olabilirSilme/düzenlemede hedef mesajınwamiddeğeri.buttonobject · boş olabilirButon yanıtında{ payload, text }.
Message nesnesi
{
"id": 248117,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"direction": "inbound",
"type": "text",
"status": "received",
"from": "905550000000",
"to": null,
"user_id": null,
"username": null,
"text": "Merhaba, siparişim ne durumda?",
"media": null,
"template_name": null,
"campaign_id": null,
"is_test": false,
"error": null,
"created_at": "2026-10-10T10:00:00+03:00",
"sent_at": null,
"delivered_at": null,
"read_at": null,
"failed_at": null,
"context": null,
"reaction": null,
"location": null,
"contacts": null,
"original_message_id": null,
"button": null
}#Şablon mesajı gönder
POST
/messagesMeta onaylı bir şablonla mesaj gönderir. Müşteri size son 24 saat içinde yazmadıysa yalnız şablon mesajı gönderebilirsiniz. Kapsam:
messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.Dinamik URL butonunda
parameters[0].text, şablon adresinin sonundaki {{1}} yerine geçer. Meta kuralı gereği tek değişken olur ve adresin sonunda yer alır.OTP için
template.otp alanına kodu vermeniz yeterlidir; ya da gövde parametresi ile sub_type: "url", index: 0 buton parametresine aynı kodu açıkça verin.Form (FLOW) butonu:
{ "type": "button", "sub_type": "flow", "index": 0, "parameters": [{ "type": "action", "flow_token": "...", "flow_action_data": {} }] }. Meta'nın kendi biçimi de kabul edilir.2.25.0: Şablon Veri Merkezi'nde kayıtlıysa ve medya başlıklıysa (
IMAGE / VIDEO / DOCUMENT), header bileşeni göndermediğinizde kayıtlı medya kalıcı bağlantısıyla (GET /templates yanıtındaki header_media.url) otomatik eklenir; her gönderimde dosya seçtirmenize gerek yoktur. header gönderirseniz hiçbir şey eklenmez, sizinki aynen gider.2.25.0: Dinamik URL butonu gönderimi:
components: [{ "type": "button", "sub_type": "url", "index": "0", "parameters": [{ "type": "text", "text": "<adres sonu>" }] }]. Sabit adresli URL butonuna button bileşeni gönderilmez (Meta 132000 / 131008 ailesiyle reddeder). Ayrıca AUTHENTICATION hariç, şablon Veri Merkezi'nde kayıtlıysa bileşenler tanımla karşılaştırılır; uyumsuzlukta Meta'ya gitmeden 422 invalid_template_parameters döner (field: template.components[0].parameters, template.components[0].index ya da template.components). Şablon Veri Merkezi'nde kayıtlı değilse istek aynen iletilir.Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.contextobjectisteğe bağlıAlıntılı yanıt. Alıcıda yanıtladığınız mesaj alıntı balonuyla görünür. Tepki mesajıyla birlikte kullanılamaz.Alt alanları göster
message_idstringzorunluYanıtlanan mesajınwamiddeğeri (webhook'takidata.wamid).
biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringisteğe bağlıtemplate(önerilir; şablon mesajında isteğe bağlıdır).Değerler:templatetemplateobjectzorunluOnaylı şablon. Şablon, gönderen numaranın bağlı olduğu WABA'daAPPROVEDolmalıdır.Alt alanları göster
namestringzorunluŞablon adı (küçük harf, rakam, alt çizgi).languagestring | objectzorunluŞablonun onaylandığı dil kodu."tr"ya da Meta biçimi{ "code": "tr" }kabul edilir.Varsayılan:trcomponentsarrayisteğe bağlıMeta bileşen nesneleri. Gövde değişkenleri içinbody; dinamik URL butonu için{ "type": "button", "sub_type": "url", "index": "0", "parameters": [{ "type": "text", "text": "<adres sonu>" }] }(indexdüğme sırası, sayı ya da metin); form butonu içinsub_type: "flow". Medya başlıklı şablondaheaderbileşenini göndermeyebilirsiniz: kayıtlı başlık medyası kalıcı bağlantıyla otomatik eklenir;headergönderirseniz aynen kullanılır. Sabit adresli URL butonunabuttonbileşeni GÖNDERİLMEZ.otpstringisteğe bağlıAUTHENTICATIONşablonları için kolaylık alanı. Yalnız kodu verin; gövde ve kod butonu Meta kuralına uygun otomatik kurulur.componentsgönderilirse yok sayılır.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | template_not_in_waba | Şablon gönderen numaranın WABA'sında yok ya da onaylı değil (Meta 132001; retryable: false). |
| 422 | invalid_template_flow_button | Şablondaki form butonu parametresi hatalı. |
| 422 | invalid_template_parameters | Düğme bileşeni kayıtlı şablon tanımına uymuyor: sabit adresli URL butonuna parametre verilmiş (template.components[i].parameters), index'teki düğme URL değil ya da index eksik (template.components[i].index), değişkenli URL butonu için parametre yok (template.components). Meta'ya gönderilmez. |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "template",
"template": {
"name": "siparis_onayi",
"language": {
"code": "tr"
},
"components": [
{
"type": "body",
"parameters": [
{
"type": "text",
"text": "Ahmet"
},
{
"type": "text",
"text": "VM-2026-1234"
}
]
}
]
}
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "template",
"template": {
"name": "siparis_onayi",
"language": {
"code": "tr"
},
"components": [
{
"type": "body",
"parameters": [
{
"type": "text",
"text": "Ahmet"
},
{
"type": "text",
"text": "VM-2026-1234"
}
]
}
]
}
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "template",
"template": {
"name": "siparis_onayi",
"language": {
"code": "tr"
},
"components": [
{
"type": "body",
"parameters": [
{
"type": "text",
"text": "Ahmet"
},
{
"type": "text",
"text": "VM-2026-1234"
}
]
}
]
}
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "template",
"template" => [
"name" => "siparis_onayi",
"language" => [
"code" => "tr"
],
"components" => [
[
"type" => "body",
"parameters" => [
[
"type" => "text",
"text" => "Ahmet"
],
[
"type" => "text",
"text" => "VM-2026-1234"
]
]
]
]
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "template",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875
}#Metin mesajı gönder
POST
/messagesSerbest metin mesajı gönderir. Yalnız müşteri size son 24 saat içinde yazdıysa teslim edilir; aksi hâlde Meta reddeder. Kapsam:
messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.Pencere kapalıyken gönderim
422 meta_send_failed ve meta_code: 131047 döner. Bu durumda şablon kullanın.text.preview_url: true gönderilirse metindeki bağlantının önizlemesi gösterilir; gönderilmezse önizleme kapalıdır.Alıntılı yanıtta Meta, alıntılanan mesaj 30 günden eskiyse alıntı balonunu göstermeyebilir.
Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.contextobjectisteğe bağlıAlıntılı yanıt. Alıcıda yanıtladığınız mesaj alıntı balonuyla görünür. Tepki mesajıyla birlikte kullanılamaz.Alt alanları göster
message_idstringzorunluYanıtlanan mesajınwamiddeğeri (webhook'takidata.wamid).
biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringisteğe bağlıtext(önerilir; metin mesajında isteğe bağlıdır).Değerler:texttextobject | stringzorunluMesaj metni:{ "body": "..." }nesnesi ya da düz metin. Nesnedebodymetin değilse422 invalid_request(field: text). Yalnız 24 saatlik müşteri hizmet penceresi açıkken teslim edilir.Alt alanları göster
bodystringzorunluMesaj metni.preview_urlbooleanisteğe bağlıtruegönderilirse metindeki bağlantının önizlemesi gösterilir. Varsayılan: kapalı.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | invalid_context | context.message_id geçerli bir wamid değil. |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "text",
"text": {
"body": "Merhaba Ahmet Bey, siparişiniz kargoya verildi."
},
"context": {
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA=="
}
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "text",
"text": {
"body": "Merhaba Ahmet Bey, siparişiniz kargoya verildi."
},
"context": {
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA=="
}
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "text",
"text": {
"body": "Merhaba Ahmet Bey, siparişiniz kargoya verildi."
},
"context": {
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA=="
}
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "text",
"text" => [
"body" => "Merhaba Ahmet Bey, siparişiniz kargoya verildi."
],
"context" => [
"message_id" => "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA=="
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "text",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875
}#Medya mesajı gönder
POST
/messagesGörsel, video, ses, belge ya da çıkartma gönderir. Medyayı herkese açık bir
https adresiyle (link) ya da POST /media ile aldığınız kimlikle (id) verin. Serbest mesaj olduğu için 24 saatlik pencere kuralı geçerlidir. Kapsam: messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.Meta sınırları: görsel 5 MB (JPEG, PNG), video 16 MB (MP4, 3GPP), ses 16 MB, belge 100 MB, çıkartma (WebP) 500 KB.
Sesli not için OGG/Opus dosyayı
POST /media ile yükleyip "audio": { "id": "...", "voice": true } gönderin.Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.contextobjectisteğe bağlıAlıntılı yanıt. Alıcıda yanıtladığınız mesaj alıntı balonuyla görünür. Tepki mesajıyla birlikte kullanılamaz.Alt alanları göster
message_idstringzorunluYanıtlanan mesajınwamiddeğeri (webhook'takidata.wamid).
biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringzorunluMedya türü.Değerler:image,video,audio,document,stickerimage | video | audio | document | stickerobjectzorunlutypeile aynı adlı medya nesnesi.Alt alanları göster
linkstringisteğe bağlıHerkese açıkhttps://adresi.linkya daidzorunludur; ikisi birden verilirselinkkullanılır.idstringisteğe bağlıPOST /mediaile aldığınız Meta medya kimliği (30 gün geçerli).captionstringisteğe bağlıGörünen açıklama. Yalnızimage,video,document.filenamestringisteğe bağlıAlıcıda görünen dosya adı. Yalnızdocument.voicebooleanisteğe bağlıYalnızaudio.trueise sesli not olarak gider (OGG/Opus). Verilmezse.ogg/.opusbağlantı ya daaudio/oggmedya otomatik sesli not olur.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | invalid_media | link/id yok, bağlantı https:// ile başlamıyor ya da audio.voice boolean değil. |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "document",
"document": {
"link": "https://cdn.example.com/fatura-2026-10.pdf",
"filename": "fatura-2026-10.pdf",
"caption": "Ekim ayı faturanız ektedir."
}
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "document",
"document": {
"link": "https://cdn.example.com/fatura-2026-10.pdf",
"filename": "fatura-2026-10.pdf",
"caption": "Ekim ayı faturanız ektedir."
}
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "document",
"document": {
"link": "https://cdn.example.com/fatura-2026-10.pdf",
"filename": "fatura-2026-10.pdf",
"caption": "Ekim ayı faturanız ektedir."
}
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "document",
"document" => [
"link" => "https://cdn.example.com/fatura-2026-10.pdf",
"filename" => "fatura-2026-10.pdf",
"caption" => "Ekim ayı faturanız ektedir."
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "document",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875
}#Konum mesajı gönder
POST
/messagesHaritada açılan bir konum gönderir. Serbest mesajdır: yalnız 24 saatlik müşteri hizmet penceresi açıkken teslim edilir. Kapsam:
messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.GET /messages kaydının text alanında ve panel gelen kutusunda okunur bir özet görünür (ör. 📍 Konum: Merkez Ofis …).Müşteriden gelen konum
message.received olayında data.location alanıyla gelir.Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.contextobjectisteğe bağlıAlıntılı yanıt. Alıcıda yanıtladığınız mesaj alıntı balonuyla görünür. Tepki mesajıyla birlikte kullanılamaz.Alt alanları göster
message_idstringzorunluYanıtlanan mesajınwamiddeğeri (webhook'takidata.wamid).
biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringzorunlulocation.Değerler:locationlocationobjectzorunluGönderilecek konum.Alt alanları göster
latitudenumber | stringzorunluEnlem, −90 ile 90 arası. Sayı ya da sayısal metin.longitudenumber | stringzorunluBoylam, −180 ile 180 arası. Sayı ya da sayısal metin.namestringisteğe bağlıYer adı, en fazla 1000 karakter.addressstringisteğe bağlıAçık adres, en fazla 1000 karakter.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | invalid_location | Enlem/boylam eksik ya da aralık dışı, ad/adres çok uzun (error.field hatalı alanı gösterir). |
| 422 | invalid_context | context.message_id geçerli bir wamid değil. |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "location",
"location": {
"latitude": 41.0082,
"longitude": 28.9784,
"name": "Merkez Ofis",
"address": "Örnek Mah. Örnek Cad. No:1, İstanbul"
}
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "location",
"location": {
"latitude": 41.0082,
"longitude": 28.9784,
"name": "Merkez Ofis",
"address": "Örnek Mah. Örnek Cad. No:1, İstanbul"
}
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "location",
"location": {
"latitude": 41.0082,
"longitude": 28.9784,
"name": "Merkez Ofis",
"address": "Örnek Mah. Örnek Cad. No:1, İstanbul"
}
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "location",
"location" => [
"latitude" => 41.0082,
"longitude" => 28.9784,
"name" => "Merkez Ofis",
"address" => "Örnek Mah. Örnek Cad. No:1, İstanbul"
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "location",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875
}#Kişi kartı gönder
POST
/messagesBir ya da birden çok kişi kartı (vCard) gönderir. Serbest mesajdır: yalnız 24 saatlik müşteri hizmet penceresi açıkken teslim edilir. Kapsam:
messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.Meta'nın üst sınırı 257 karttır; okunabilirlik için tek mesajda en fazla 20 kart kabul edilir.
Müşteriden gelen kişi kartları
message.received olayında data.contacts alanıyla gelir.Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.contextobjectisteğe bağlıAlıntılı yanıt. Alıcıda yanıtladığınız mesaj alıntı balonuyla görünür. Tepki mesajıyla birlikte kullanılamaz.Alt alanları göster
message_idstringzorunluYanıtlanan mesajınwamiddeğeri (webhook'takidata.wamid).
biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringzorunlucontacts.Değerler:contactscontactsarrayzorunlu1–20 kişi kartı (Meta biçimi). Bilinmeyen alanlar Meta'ya iletilmez.Alt alanları göster
nameobjectzorunluformatted_namezorunlu;first_name,last_name,middle_name,prefix,suffixisteğe bağlı.phonesarrayisteğe bağlı[{ phone, type, wa_id }].wa_idverilirse alıcıda Mesaj gönder ve Kişiyi kaydet düğmeleri, verilmezse WhatsApp'a davet et görünür.emailsarrayisteğe bağlı[{ email, type }].urlsarrayisteğe bağlı[{ url, type }].orgobjectisteğe bağlı{ company, department, title }.addressesarrayisteğe bağlı[{ street, city, state, zip, country, country_code, type }].birthdaystringisteğe bağlıYYYY-MM-DD.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | invalid_contacts | Kart sayısı 1–20 dışında ya da zorunlu alan eksik (ör. field: contacts[0].name.formatted_name). |
| 422 | invalid_context | context.message_id geçerli bir wamid değil. |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "contacts",
"contacts": [
{
"name": {
"formatted_name": "Destek Hattı",
"first_name": "Destek",
"last_name": "Hattı"
},
"phones": [
{
"phone": "+905550000000",
"type": "WORK",
"wa_id": "905550000000"
}
],
"emails": [
{
"email": "[email protected]",
"type": "WORK"
}
],
"org": {
"company": "Örnek A.Ş.",
"title": "Müşteri Hizmetleri"
},
"urls": [
{
"url": "https://example.com",
"type": "WORK"
}
]
}
]
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "contacts",
"contacts": [
{
"name": {
"formatted_name": "Destek Hattı",
"first_name": "Destek",
"last_name": "Hattı"
},
"phones": [
{
"phone": "+905550000000",
"type": "WORK",
"wa_id": "905550000000"
}
],
"emails": [
{
"email": "[email protected]",
"type": "WORK"
}
],
"org": {
"company": "Örnek A.Ş.",
"title": "Müşteri Hizmetleri"
},
"urls": [
{
"url": "https://example.com",
"type": "WORK"
}
]
}
]
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "contacts",
"contacts": [
{
"name": {
"formatted_name": "Destek Hattı",
"first_name": "Destek",
"last_name": "Hattı"
},
"phones": [
{
"phone": "+905550000000",
"type": "WORK",
"wa_id": "905550000000"
}
],
"emails": [
{
"email": "[email protected]",
"type": "WORK"
}
],
"org": {
"company": "Örnek A.Ş.",
"title": "Müşteri Hizmetleri"
},
"urls": [
{
"url": "https://example.com",
"type": "WORK"
}
]
}
]
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "contacts",
"contacts" => [
[
"name" => [
"formatted_name" => "Destek Hattı",
"first_name" => "Destek",
"last_name" => "Hattı"
],
"phones" => [
[
"phone" => "+905550000000",
"type" => "WORK",
"wa_id" => "905550000000"
]
],
"emails" => [
[
"email" => "[email protected]",
"type" => "WORK"
]
],
"org" => [
"company" => "Örnek A.Ş.",
"title" => "Müşteri Hizmetleri"
],
"urls" => [
[
"url" => "https://example.com",
"type" => "WORK"
]
]
]
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "contacts",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875
}#Etkileşimli mesaj gönder
POST
/messagesYanıt düğmeleri, liste, bağlantı düğmesi ya da konum isteği gönderir. Gövde Meta Cloud API ile aynıdır; Meta sınırları gönderimden önce doğrulanır. Serbest mesajdır: yalnız 24 saatlik pencere açıkken teslim edilir. Kapsam:
messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.Kolaylık: düğme
{ "id", "title" }, body ve footer düz metin olarak da verilebilir; Meta'ya her zaman resmî biçimde gider.Müşterinin seçimi
message.received (type: interactive) olayında data.interactive.reply_id, reply_title, reply_description ve geriye uyumlu data.button alanlarıyla gelir. Bağlantı düğmesine dokunmak olay üretmez.Konum isteğine verilen yanıt
message.received type: location olarak gelir; context.message_id isteğinizin wamid değeridir.Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.contextobjectisteğe bağlıAlıntılı yanıt. Alıcıda yanıtladığınız mesaj alıntı balonuyla görünür. Tepki mesajıyla birlikte kullanılamaz.Alt alanları göster
message_idstringzorunluYanıtlanan mesajınwamiddeğeri (webhook'takidata.wamid).
biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringzorunluinteractive.Değerler:interactiveinteractiveobjectzorunluMetainteractivenesnesi.Alt alanları göster
typestringzorunlubutton(1–3 yanıt düğmesi),list(en çok 10 satır),cta_url(bağlantı düğmesi),location_request_message(konum isteği).Değerler:button,list,cta_url,location_request_messageheaderobjectisteğe bağlıtext(≤ 60) ya da düğmeli/bağlantılı mesajdaimage,video,document(linkya daPOST /mediakimliği). Listede yalnız metin; konum isteğinde kullanılamaz.bodyobjectzorunlu{ "text": "..." }— düğme, bağlantı ve konum isteğinde ≤ 1024, listede ≤ 4096 karakter.footerobjectisteğe bağlı{ "text": "..." }, ≤ 60 karakter. Konum isteğinde kullanılamaz.actionobjectzorunluDüğme:buttons[](reply.id≤ 256,reply.title≤ 20, benzersiz). Liste:button(≤ 20) +sections[](1–10 bölüm, toplam 1–10 satır; satırid≤ 200,title≤ 24,description≤ 72). Bağlantı:name: cta_url,parameters.display_text(≤ 20),parameters.url(http/https, ≤ 2000). Konum isteği:name: send_location(verilmezse eklenir).
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | invalid_interactive | interactive nesnesi hatalı ya da Meta sınırını aşıyor (error.field hatalı alanı gösterir, ör. interactive.action.buttons[1].reply.title). |
| 422 | invalid_context | context.message_id geçerli bir wamid değil. |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "interactive",
"interactive": {
"type": "button",
"header": {
"type": "text",
"text": "Randevu"
},
"body": {
"text": "Yarın 14:00 randevunuzu onaylıyor musunuz?"
},
"footer": {
"text": "Örnek Klinik"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {
"id": "onay",
"title": "Onaylıyorum"
}
},
{
"type": "reply",
"reply": {
"id": "degistir",
"title": "Saati değiştir"
}
}
]
}
}
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "interactive",
"interactive": {
"type": "button",
"header": {
"type": "text",
"text": "Randevu"
},
"body": {
"text": "Yarın 14:00 randevunuzu onaylıyor musunuz?"
},
"footer": {
"text": "Örnek Klinik"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {
"id": "onay",
"title": "Onaylıyorum"
}
},
{
"type": "reply",
"reply": {
"id": "degistir",
"title": "Saati değiştir"
}
}
]
}
}
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "interactive",
"interactive": {
"type": "button",
"header": {
"type": "text",
"text": "Randevu"
},
"body": {
"text": "Yarın 14:00 randevunuzu onaylıyor musunuz?"
},
"footer": {
"text": "Örnek Klinik"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {
"id": "onay",
"title": "Onaylıyorum"
}
},
{
"type": "reply",
"reply": {
"id": "degistir",
"title": "Saati değiştir"
}
}
]
}
}
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "interactive",
"interactive" => [
"type" => "button",
"header" => [
"type" => "text",
"text" => "Randevu"
],
"body" => [
"text" => "Yarın 14:00 randevunuzu onaylıyor musunuz?"
],
"footer" => [
"text" => "Örnek Klinik"
],
"action" => [
"buttons" => [
[
"type" => "reply",
"reply" => [
"id" => "onay",
"title" => "Onaylıyorum"
]
],
[
"type" => "reply",
"reply" => [
"id" => "degistir",
"title" => "Saati değiştir"
]
]
]
]
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "interactive",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875
}#Tepki gönder
POST
/messagesBir mesaja emoji tepkisi verir ya da mevcut tepkiyi kaldırır. Kapsam:
messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.Tepki mesajı
context ile birlikte gönderilemez (422 invalid_request).Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringzorunlureactionolmalıdır.Değerler:reactionreactionobjectzorunluTepki.Alt alanları göster
message_idstringzorunluTepki verilen mesajınwamiddeğeri.emojistringzorunluTek emoji. Boş metin ("") önceki tepkiyi kaldırır.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | invalid_reaction | reaction.message_id geçerli bir wamid değil ya da emoji tek emoji değil. |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "reaction",
"reaction": {
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"emoji": "👍"
}
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "reaction",
"reaction": {
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"emoji": "👍"
}
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "reaction",
"reaction": {
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"emoji": "👍"
}
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "reaction",
"reaction" => [
"message_id" => "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"emoji" => "👍"
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "reaction",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875
}#Form mesajı gönder
POST
/messagesMüşteriye WhatsApp içinde açılan bir form (WhatsApp Flow) gönderir. Form yanıtı
flow.completed olayıyla gelir. Serbest mesaj kuralları geçerlidir: 24 saat penceresi ve 1 kredi. Kapsam: messages:sendCanlı anahtarda her başarılı gönderim 1 kredi düşer. Kredi gönderimden önce ayrılır; gönderim başarısız olursa iade edilir.
Test anahtarıyla (
vmk_test_) mesaj Meta'ya gönderilmez: simulated: true, credits_used: 0 ve test. ile başlayan sahte bir wamid döner.Gönderim hatalarında hata nesnesi ayrıca
retryable (bool), meta_code ve meta_subcode alanlarını taşır.Pencere kapalıyken form butonlu bir şablon kullanın (bkz. Şablon mesajı gönder).
Başlıklar
Idempotency-Keyisteğe bağlıÖnerilir. 8–128 karakter. Aynı anahtar + aynı gövde ilk yanıtı döndürür (mesaj ikinci kez gitmez); aynı anahtar + farklı gövde422 idempotency_key_conflictdöner. 24 saat saklanır.
İstek gövdesi
phone_number_idstringzorunluGönderimi yapacak numaranızın Meta kimliği. Numara size ait ve aktif olmalıdır.tostringzorunluAlıcının telefon numarası, uluslararası biçimde ve+olmadan (ör.905550000000). Rakam dışı karakterler atılır; en az 10 hane gerekir. Telefonu olmayan alıcıdatoyerinerecipientgönderin.recipientstringisteğe bağlıTelefonu görünmeyen kullanıcının WhatsApp kullanıcı kimliği (BSUID, webhook'takiuser_id). Yalnıztoboşken kullanılır. Eş anlamlıları:recipient_id,bsuid.contextobjectisteğe bağlıAlıntılı yanıt. Alıcıda yanıtladığınız mesaj alıntı balonuyla görünür. Tepki mesajıyla birlikte kullanılamaz.Alt alanları göster
message_idstringzorunluYanıtlanan mesajınwamiddeğeri (webhook'takidata.wamid).
biz_opaque_callback_datastringisteğe bağlıEn fazla 512 karakterlik kendi eşleştirme değeriniz.message.status.*olaylarındadata.biz_opaque_callback_dataolarak aynen döner. Göndermezseniz veIdempotency-Keyverdiyseniz sunucu bu alanı anahtarın değeriyle kendisi doldurur.typestringzorunluflowolmalıdır.Değerler:flowflowobjectzorunluWhatsApp Flow (form) mesajı.Alt alanları göster
flow_idstringisteğe bağlıForm kimliği.flow_idya daflow_namealanlarından yalnız biri verilir.flow_namestringisteğe bağlıForm adı (flow_idyerine).flow_tokenstringisteğe bağlıKendi eşleştirme anahtarınız (en fazla 191 bayt). Verilmezsevmf_önekli bir değer üretilir ve yanıtta döner;flow.completedolayında aynen gelir.ctastringzorunluButon metni; en fazla 20 karakter, emoji yok.bodystringzorunluGövde metni; en fazla 1024 karakter.headerstringisteğe bağlıBaşlık; en fazla 60 karakter.footerstringisteğe bağlıAlt bilgi; en fazla 60 karakter.modestringisteğe bağlıdraft, yayınlanmamış formu denemek içindir.Değerler:published,draftVarsayılan:publishedactionstringisteğe bağlıdata_exchangeyalnız Endpoint'li formlar içindir.Değerler:navigate,data_exchangeVarsayılan:navigatescreenstringisteğe bağlıAçılış ekranı;navigateeyleminde zorunludur.dataobjectisteğe bağlıAçılış ekranına verilecek başlangıç verisi (navigate).
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 402 | insufficient_credits | Mesaj krediniz yetersiz. Yanıtta error.balance döner. |
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 409 | meta_outcome_unknown | İstek Meta'ya iletildi ama sonucu doğrulanamadı. Aynı anahtarla tekrar göndermeyin; durum olayını bekleyin (retryable: false). |
| 409 | idempotency_in_progress | Aynı Idempotency-Key ile bir istek hâlâ işleniyor. |
| 422 | invalid_request | Zorunlu alan eksik ya da biçim hatalı (error.field alanı belirtir). |
| 422 | invalid_phone | Alıcı numarası geçersiz (en az 10 hane). |
| 422 | idempotency_key_conflict | Aynı anahtar farklı bir gövdeyle kullanılmış. |
| 422 | meta_send_failed | Meta gönderimi reddetti. meta_code ve meta_subcode alanlarına bakın (retryable: true). |
| 500 | send_failed | Sistem hatası; kredi iade edildi. Tekrar deneyebilirsiniz. |
| 422 | invalid_flow | flow nesnesi hatalı (error.field alanı belirtir). |
curl -X POST "https://api.verimerkezi.app/wa/messages" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "flow",
"flow": {
"flow_id": "1234567890123456",
"flow_token": "crm-basvuru-42",
"cta": "Formu Aç",
"body": "Başvurunuzu 1 dakikada tamamlayın.",
"screen": "WELCOME",
"data": {
"ad": "Ahmet"
}
}
}'const res = await fetch("https://api.verimerkezi.app/wa/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "flow",
"flow": {
"flow_id": "1234567890123456",
"flow_token": "crm-basvuru-42",
"cta": "Formu Aç",
"body": "Başvurunuzu 1 dakikada tamamlayın.",
"screen": "WELCOME",
"data": {
"ad": "Ahmet"
}
}
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"to": "905550000000",
"type": "flow",
"flow": {
"flow_id": "1234567890123456",
"flow_token": "crm-basvuru-42",
"cta": "Formu Aç",
"body": "Başvurunuzu 1 dakikada tamamlayın.",
"screen": "WELCOME",
"data": {
"ad": "Ahmet"
}
}
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"to" => "905550000000",
"type" => "flow",
"flow" => [
"flow_id" => "1234567890123456",
"flow_token" => "crm-basvuru-42",
"cta" => "Formu Aç",
"body" => "Başvurunuzu 1 dakikada tamamlayın.",
"screen" => "WELCOME",
"data" => [
"ad" => "Ahmet"
]
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 48213,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
"to": "905550000000",
"type": "flow",
"status": "sent",
"mode": "live",
"simulated": false,
"credits_used": 1,
"balance": 9875,
"flow": {
"flow_token": "crm-basvuru-42",
"flow_id": "1234567890123456",
"flow_name": null,
"mode": "published"
}
}#Okundu işaretle ve yazıyor göster
POST
/messages/readGelen bir mesajı okundu olarak işaretler (mavi tik).
typing: true ile alıcıda yaklaşık 25 saniye "yazıyor…" göstergesi çıkar. Kredi düşmez. Kapsam: messages:sendBu uç gönderim sayacını değil, kendi hız sayacını kullanır.
İstek gövdesi
phone_number_idstringzorunluMesajın geldiği numaranızın Meta kimliği.message_idstringzorunluOkundu işaretlenecek gelen mesajınwamiddeğeri.typingbooleanisteğe bağlı"Yazıyor…" göstergesi.Varsayılan:False
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 422 | invalid_request | phone_number_id ya da message_id eksik. |
| 422 | meta_error | Meta isteği reddetti (meta_code). |
curl -X POST "https://api.verimerkezi.app/wa/messages/read" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"typing": true
}'const res = await fetch("https://api.verimerkezi.app/wa/messages/read", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"typing": true
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/messages/read",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"typing": True
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages/read");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"message_id" => "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"typing" => true
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 200
{
"ok": true,
"marked_read": true,
"typing": true
}#Mesaj kayıtlarını listele
GET
/messagesBir numaranın gelen ve giden mesaj kayıtlarını zamana göre artan sırada döndürür. Webhook teslimi kaçtığında olayları geri almak (uzlaştırma) için kullanın. Kredi düşmez. Kapsam:
messages:read ya da inbox:readmessages:read ya da inbox:read kapsamlarından biri yeterlidir.Gelen ve coexistence kayıtlarında
context, reaction, location, contacts, original_message_id, button alanları da döner.Sorgu parametreleri
phone_number_idstringzorunluNumaranızın Meta kimliği.sincestringisteğe bağlıISO 8601 başlangıç zamanı. En fazla 90 gün geriye gider; verilmezse son 24 saat.cursorintegeristeğe bağlıÖnceki yanıttakinext_cursor. Bu kimlikten büyük kayıtlar döner.Varsayılan:0limitintegeristeğe bağlıSayfa boyutu (1–100).Varsayılan:50
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda messages:read ya da inbox:read kapsamı yok. |
| 404 | number_not_found | Numara size ait değil. |
| 422 | invalid_request | phone_number_id eksik ya da rakam değil. |
| 422 | invalid_since | since ISO 8601 değil. |
curl -X GET "https://api.verimerkezi.app/wa/messages?phone_number_id=1234567890&since=2026-10-09T00%3A00%3A00Z&limit=100" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/messages?phone_number_id=1234567890&since=2026-10-09T00%3A00%3A00Z&limit=100", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
},
});
const data = await res.json();import os, requests
res = requests.get(
"https://api.verimerkezi.app/wa/messages?phone_number_id=1234567890&since=2026-10-09T00%3A00%3A00Z&limit=100",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/messages?phone_number_id=1234567890&since=2026-10-09T00%3A00%3A00Z&limit=100");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
],
]);
$data = json_decode(curl_exec($ch), true);Yanıt 200
{
"ok": true,
"phone_number_id": "1234567890",
"data": [
{
"id": 248117,
"wamid": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAEhggQTNFQkQ2RjQ3MEIyQzk0RTE4AA==",
"direction": "inbound",
"type": "text",
"status": "received",
"from": "905550000000",
"to": null,
"user_id": null,
"username": null,
"text": "Merhaba, siparişim ne durumda?",
"media": null,
"template_name": null,
"campaign_id": null,
"is_test": false,
"error": null,
"created_at": "2026-10-10T10:00:00+03:00",
"sent_at": null,
"delivered_at": null,
"read_at": null,
"failed_at": null,
"context": null,
"reaction": null,
"location": null,
"contacts": null,
"original_message_id": null,
"button": null
}
],
"has_more": true,
"next_cursor": 248117
}#Test gelen mesajı oluştur
POST
/test/inboundYalnız test anahtarıyla çalışır. Sahte bir gelen mesajı gerçek gelen mesaj hattından geçirir ve imzalı
message.received, message.revoked ya da message.edited olayını (app_contact_sync ile contact.synced olayını) aktif webhook aboneliklerinize gönderir. Meta'ya istek gitmez. injected nesnesinin içeriği örnektir.Ek kapsam gerekmez; yalnız test anahtarı şarttır.
İstek gövdesi
phone_number_idstringzorunluNumaranızın Meta kimliği.typestringisteğe bağlıSahte olay türü.app_contact_syncörnek bircontact.syncedolayı gönderir (add,update,remove; rehbere kayıt yazılmaz).Değerler:text,revoke,edit,app_contact_syncVarsayılan:textfromstringisteğe bağlıGönderen telefon (8–15 hane).Varsayılan:905550000000textstringisteğe bağlıMesaj metni (en fazla 4096).textveeditiçin zorunlu.original_message_idstringisteğe bağlırevokeveeditiçin hedef mesajınwamiddeğeri.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | test_only | Bu uç yalnız vmk_test_ anahtarıyla kullanılır. |
| 404 | number_not_found | Numara size ait değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 422 | invalid_request | Parametre hatalı. |
| 500 | test_inbound_failed | Sahte mesaj işlenemedi. |
curl -X POST "https://api.verimerkezi.app/wa/test/inbound" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number_id": "1234567890",
"type": "text",
"from": "905550000000",
"text": "Merhaba, bu bir test mesajıdır."
}'const res = await fetch("https://api.verimerkezi.app/wa/test/inbound", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone_number_id": "1234567890",
"type": "text",
"from": "905550000000",
"text": "Merhaba, bu bir test mesajıdır."
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/test/inbound",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone_number_id": "1234567890",
"type": "text",
"from": "905550000000",
"text": "Merhaba, bu bir test mesajıdır."
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/test/inbound");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"phone_number_id" => "1234567890",
"type" => "text",
"from" => "905550000000",
"text" => "Merhaba, bu bir test mesajıdır."
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 202
{
"ok": true,
"mode": "test",
"simulated": true,
"phone_number_id": "1234567890",
"injected": {
"wamid": "test.in.8f2c1a9b"
},
"note": "İmzalı olay(lar) hesabın aktif webhook aboneliklerine gönderildi. Meta'ya istek gitmedi."
}