İçeriğe geç
Veri MerkeziVeri MerkeziAPI

API referansı

WhatsApp sesli aramalarını yönetin: gelen aramayı kabul edin ya da reddedin, izin veren müşteriyi arayın, arama ayarlarını ve geçmişini görün. Ses WebRTC ile sizin ucunuz ve Meta arasında akar; Veri Merkezi yalnız sinyal verisini (SDP) iletir.

#Call nesnesi

  • call_idstring
    Arama kimliği.
  • phone_number_idstring
    Numaranızın Meta kimliği.
  • directionstring
    Yön.Değerler: user_initiated, business_initiated
  • fromstring · boş olabilir
    Arayan.
  • tostring · boş olabilir
    Aranan.
  • statusstring
    Durum.Değerler: initiated, ringing, pre_accepted, accepted, terminating, rejected, missed, failed, completed
  • started_atstring · boş olabilir
    Başlangıç.
  • ended_atstring · boş olabilir
    Bitiş.
  • duration_secinteger · boş olabilir
    Süre (saniye).
  • billable_pulsesinteger · boş olabilir
    ⌈süre / 6⌉; yalnız işletme başlatmalı aramada, bilgi amaçlı (Meta doğrudan faturalar).
  • last_actionstring · boş olabilir
    Son eylem.
  • errorsarray · boş olabilir
    Hatalar.
  • is_testboolean
    Test anahtarıyla oluşturuldu mu.
  • created_atstring
    Kayıt zamanı.
Call nesnesi
{
  "call_id": "wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1",
  "phone_number_id": "1234567890",
  "direction": "user_initiated",
  "from": "905550000000",
  "to": "905550000001",
  "status": "completed",
  "started_at": "2026-10-09T14:00:05+03:00",
  "ended_at": "2026-10-09T14:01:19+03:00",
  "duration_sec": 74,
  "billable_pulses": null,
  "last_action": "accept",
  "errors": null,
  "is_test": false,
  "created_at": "2026-10-09T14:00:00+03:00"
}

#Arama ayarlarını getir

GET/numbers/{phone_number_id}/calling
Numaranın arama ayarlarını ve arama uygunluğunu (eligibility) döndürür. Kapsam: calls:read
Uygunluk kontrolleri: cloud_api_only, messaging_limit, calls_webhook, payment_method (yalnız müşteriyi arama), country (yalnız müşteriyi arama). ok: null bilginin bilinmediğini gösterir; son kararı Meta verir.

Yol parametreleri

  • phone_number_idstringzorunlu
    Numaranızın Meta kimliği (yalnız rakam, 5–32 hane).

Sorgu parametreleri

  • rawbooleanisteğe bağlı
    1 Meta'nın ham calling nesnesini ekler (raw).

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:read kapsamı yok.
404number_not_foundNumara size ait değil.
409number_detachedNumara hesabınızdan ayrılmış; panelden yeniden bağlayın.
422invalid_phone_number_idphone_number_id rakam değil.
curl -X GET "https://api.verimerkezi.app/wa/numbers/1234567890/calling" \
  -H "Authorization: Bearer $VM_API_KEY"
Yanıt 200
{
  "ok": true,
  "phone_number_id": "1234567890",
  "enabled": true,
  "callback_permission": true,
  "call_icon_visibility": "DEFAULT",
  "call_hours": {
    "status": "ENABLED",
    "timezone_id": "Europe/Istanbul",
    "weekly_operating_hours": [
      {
        "day_of_week": "MONDAY",
        "open_time": "0900",
        "close_time": "1800"
      }
    ]
  },
  "messaging_limit_tier": "TIER_2K",
  "messaging_limit_ok": true,
  "eligibility": {
    "eligible_inbound": true,
    "eligible_outbound": true,
    "checks": [
      {
        "key": "cloud_api_only",
        "ok": true,
        "applies_to": [
          "inbound",
          "outbound"
        ],
        "title_tr": "Numara yalnız API'ye bağlı olmalı",
        "detail_tr": "Numara Cloud API'ye bağlı.",
        "how_to_fix_tr": null
      },
      {
        "key": "messaging_limit",
        "ok": true,
        "applies_to": [
          "inbound",
          "outbound"
        ],
        "title_tr": "Günlük mesaj limiti en az 2.000 olmalı",
        "detail_tr": "Limit yeterli.",
        "how_to_fix_tr": null
      },
      {
        "key": "payment_method",
        "ok": null,
        "applies_to": [
          "outbound"
        ],
        "title_tr": "Ödeme yöntemi",
        "detail_tr": "Bilgi Meta'dan okunamadı.",
        "how_to_fix_tr": "Meta Business Suite'te ödeme yöntemini kontrol edin."
      }
    ]
  }
}

#Arama ayarlarını güncelle

PATCH/numbers/{phone_number_id}/calling
Aramayı açar/kapatır, arama saatlerini ve geri arama iznini ayarlar. Yalnız gönderdiğiniz alanlar değişir. Kapsam: calls:write
enabled: true isteğinde numara coexistence ise ya da Meta'dan okunan limit 2.000'in altındaysa istek Meta'ya gönderilmeden reddedilir; hata gövdesinde error.eligibility ve error.checked_locally: true döner.
Test anahtarıyla Meta'ya istek gitmez.

Yol parametreleri

  • phone_number_idstringzorunlu
    Numaranızın Meta kimliği (yalnız rakam, 5–32 hane).

İstek gövdesi

  • enabledbooleanisteğe bağlı
    Aramayı açar/kapatır.
  • callback_permissionbooleanisteğe bağlı
    Müşteri aradığında geri arama izni önerilir.
  • call_icon_visibilitystringisteğe bağlı
    Sohbetteki arama simgesi.Değerler: DEFAULT, DISABLE_ALL
  • call_hoursobjectisteğe bağlı
    Arama saatleri.
    Alt alanları göster
    • statusstringisteğe bağlı
      Durum.Değerler: ENABLED, DISABLED
    • timezone_idstringisteğe bağlı
      Saat dilimi (ör. Europe/Istanbul).
    • weekly_operating_hoursarrayisteğe bağlı
      { day_of_week, open_time, close_time } listesi (saat HHMM).
    • holiday_schedulearrayisteğe bağlı
      Tatil takvimi.

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:write kapsamı yok.
404number_not_foundNumara size ait değil.
409number_detachedNumara hesabınızdan ayrılmış; panelden yeniden bağlayın.
422invalid_requestParametre hatalı.
422calling_not_supported_for_numberCoexistence ya da Cloud API dışı numara.
422calling_messaging_limit_too_lowGünlük mesaj limiti 2.000'in altında.
422calling_prerequisites_unmetTeknik önkoşullar karşılanmıyor (Meta 138018).
422calling_outbound_unavailableİşletme başlatmalı arama bu numara/ülkede yok (Meta 138013).
422calling_disabled_qualityMeta kalite nedeniyle aramayı geçici kapattı (Meta 138014).
curl -X PATCH "https://api.verimerkezi.app/wa/numbers/1234567890/calling" \
  -H "Authorization: Bearer $VM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true,
    "callback_permission": true,
    "call_icon_visibility": "DEFAULT",
    "call_hours": {
      "status": "ENABLED",
      "timezone_id": "Europe/Istanbul",
      "weekly_operating_hours": [
        {
          "day_of_week": "MONDAY",
          "open_time": "0900",
          "close_time": "1800"
        }
      ]
    }
  }'
Yanıt 200
{
  "ok": true,
  "phone_number_id": "1234567890",
  "enabled": true,
  "callback_permission": true,
  "call_icon_visibility": "DEFAULT",
  "call_hours": {
    "status": "ENABLED",
    "timezone_id": "Europe/Istanbul",
    "weekly_operating_hours": [
      {
        "day_of_week": "MONDAY",
        "open_time": "0900",
        "close_time": "1800"
      }
    ]
  },
  "messaging_limit_tier": "TIER_2K",
  "messaging_limit_ok": true,
  "eligibility": {
    "eligible_inbound": true,
    "eligible_outbound": true,
    "checks": [
      {
        "key": "cloud_api_only",
        "ok": true,
        "applies_to": [
          "inbound",
          "outbound"
        ],
        "title_tr": "Numara yalnız API'ye bağlı olmalı",
        "detail_tr": "Numara Cloud API'ye bağlı.",
        "how_to_fix_tr": null
      },
      {
        "key": "messaging_limit",
        "ok": true,
        "applies_to": [
          "inbound",
          "outbound"
        ],
        "title_tr": "Günlük mesaj limiti en az 2.000 olmalı",
        "detail_tr": "Limit yeterli.",
        "how_to_fix_tr": null
      },
      {
        "key": "payment_method",
        "ok": null,
        "applies_to": [
          "outbound"
        ],
        "title_tr": "Ödeme yöntemi",
        "detail_tr": "Bilgi Meta'dan okunamadı.",
        "how_to_fix_tr": "Meta Business Suite'te ödeme yöntemini kontrol edin."
      }
    ]
  },
  "updated": true
}

#Arama geçmişini listele

GET/calls
Arama kayıtlarını yeniden eskiye döndürür. Kapsam: calls:read

Sorgu parametreleri

  • phone_number_idstringisteğe bağlı
    Numara süzgeci.
  • fromstringisteğe bağlı
    Başlangıç (ISO 8601).
  • tostringisteğe bağlı
    Bitiş (ISO 8601).
  • peerstringisteğe bağlı
    Karşı taraf numarası.
  • limitintegeristeğe bağlı
    Sayfa boyutu (1–100).Varsayılan: 50
  • cursorstringisteğe bağlı
    Önceki yanıttaki next_cursor.

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:read kapsamı yok.
404number_not_foundNumara size ait değil.
curl -X GET "https://api.verimerkezi.app/wa/calls?phone_number_id=1234567890" \
  -H "Authorization: Bearer $VM_API_KEY"
Yanıt 200
{
  "ok": true,
  "calls": [
    {
      "call_id": "wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1",
      "phone_number_id": "1234567890",
      "direction": "user_initiated",
      "from": "905550000000",
      "to": "905550000001",
      "status": "completed",
      "started_at": "2026-10-09T14:00:05+03:00",
      "ended_at": "2026-10-09T14:01:19+03:00",
      "duration_sec": 74,
      "billable_pulses": null,
      "last_action": "accept",
      "errors": null,
      "is_test": false,
      "created_at": "2026-10-09T14:00:00+03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

#Müşteriyi ara

POST/calls
İşletme başlatmalı arama yapar. Müşterinin arama izni olmalıdır. Sonuç call.status ve Meta yanıtıyla gelen call.connect (SDP answer) olaylarıyla izlenir. Kapsam: calls:write
Arama eylemleri kredi düşmez; işletme başlatmalı aramayı Meta 6 saniyelik dilimlerle doğrudan faturalar.
Başlattığınız aramada yalnız terminate eylemi kullanılabilir.
Test anahtarıyla Meta'ya gitmeden simüle edilir (simulated: true).

Başlıklar

  • Idempotency-Keyisteğe bağlı
    8–128 karakterlik benzersiz anahtar (UUID önerilir). Aynı anahtar ve aynı gövdeyle yapılan tekrar, ilk yanıtı Idempotent-Replay: true başlığıyla döndürür. 24 saat saklanır.

İstek gövdesi

  • phone_number_idstringzorunlu
    Numaranızın Meta kimliği.
  • tostringzorunlu
    Aranacak müşteri.
  • sdp_offerstringzorunlu
    WebRTC SDP teklifi (RFC 8866).
  • biz_opaquestringisteğe bağlı
    En fazla 512 karakterlik eşleştirme değeri.

Hatalar

DurumKodNe zaman
403call_permission_requiredMüşterinin arama izni yok.
403insufficient_scopeAnahtarda calls:write kapsamı yok.
404number_not_foundNumara size ait değil.
409number_detachedNumara hesabınızdan ayrılmış; panelden yeniden bağlayın.
409calling_not_enabledNumarada arama kapalı.
409meta_outcome_unknownSonuç belirsiz; tekrar göndermeyin, call.* olayını bekleyin.
409idempotency_in_progressAynı anahtarla bir istek hâlâ işleniyor. Retry-After kadar bekleyin.
422idempotency_key_conflictAynı anahtar farklı bir gövdeyle kullanılmış.
422invalid_sdpSDP boş ya da geçersiz.
422invalid_phoneTelefon geçersiz.
422calling_not_available_in_countryAlıcının ülkesinde işletme araması yok.
429call_rate_limitedArama sınırı aşıldı.
curl -X POST "https://api.verimerkezi.app/wa/calls" \
  -H "Authorization: Bearer $VM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number_id": "1234567890",
    "to": "905550000000",
    "sdp_offer": "v=0\r\no=- 4611731400430051336 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n...",
    "biz_opaque": "crm-ticket-42"
  }'
Yanıt 201
{
  "ok": true,
  "call_id": "wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE2",
  "status": "initiated",
  "direction": "business_initiated",
  "to": "905550000000"
}

#Gelen aramayı ön-kabul et

POST/calls/{call_id}/pre_accept
Bağlantıyı önceden kurmak için gelen aramayı SDP yanıtıyla ön-kabul eder; ardından accept çağırın. Kapsam: calls:write
Her eylem (call_id, eylem) bazında idempotenttir; tekrar gönderilirse ilk sonuç Idempotent-Replay: true ile döner.

Yol parametreleri

  • call_idstringzorunlu
    Arama kimliği (URL-kodlu). İçinde / varsa yol yerine _ yazıp gövdede call_id gönderin.

İstek gövdesi

  • sdp_answerstringzorunlu
    WebRTC SDP yanıtı.
  • call_idstringisteğe bağlı
    Yalnız yol _ ise.

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:write kapsamı yok.
404call_not_foundArama yok, size ait değil ya da test/canlı anahtar uyuşmuyor.
409call_endedArama sona ermiş.
409call_action_conflictAynı eylem farklı parametreyle uygulanmış.
409action_in_progressEylem hâlâ işleniyor.
409invalid_action_for_directionBaşlattığınız aramada yalnız terminate.
422invalid_sdpSDP geçersiz.
curl -X POST "https://api.verimerkezi.app/wa/calls/wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1/pre_accept" \
  -H "Authorization: Bearer $VM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sdp_answer": "v=0\r\no=- 4611731400430051336 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n..."
  }'
Yanıt 200
{
  "ok": true,
  "call_id": "wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1",
  "action": "pre_accept",
  "success": true
}

#Gelen aramayı kabul et

POST/calls/{call_id}/accept
Gelen aramayı SDP yanıtıyla kabul eder. Kapsam: calls:write

Yol parametreleri

  • call_idstringzorunlu
    Arama kimliği (URL-kodlu). İçinde / varsa yol yerine _ yazıp gövdede call_id gönderin.

İstek gövdesi

  • sdp_answerstringzorunlu
    WebRTC SDP yanıtı.
  • call_idstringisteğe bağlı
    Yalnız yol _ ise.

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:write kapsamı yok.
404call_not_foundArama bulunamadı.
409call_endedArama sona ermiş.
409call_action_conflictAynı eylem farklı parametreyle uygulanmış.
curl -X POST "https://api.verimerkezi.app/wa/calls/wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1/accept" \
  -H "Authorization: Bearer $VM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sdp_answer": "v=0\r\no=- 4611731400430051336 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n..."
  }'
Yanıt 200
{
  "ok": true,
  "call_id": "wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1",
  "action": "accept",
  "success": true
}

#Gelen aramayı reddet

POST/calls/{call_id}/reject
Gelen aramayı reddeder. Kapsam: calls:write

Yol parametreleri

  • call_idstringzorunlu
    Arama kimliği (URL-kodlu). İçinde / varsa yol yerine _ yazıp gövdede call_id gönderin.

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:write kapsamı yok.
404call_not_foundArama bulunamadı.
409call_endedArama sona ermiş.
curl -X POST "https://api.verimerkezi.app/wa/calls/wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1/reject" \
  -H "Authorization: Bearer $VM_API_KEY"
Yanıt 200
{
  "ok": true,
  "call_id": "wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1",
  "action": "reject",
  "success": true
}

#Aramayı sonlandır

POST/calls/{call_id}/terminate
Süren aramayı kapatır. İşletme başlatmalı aramalarda kullanılabilen tek eylemdir. Kapsam: calls:write

Yol parametreleri

  • call_idstringzorunlu
    Arama kimliği (URL-kodlu). İçinde / varsa yol yerine _ yazıp gövdede call_id gönderin.

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:write kapsamı yok.
404call_not_foundArama bulunamadı.
409call_endedArama sona ermiş.
curl -X POST "https://api.verimerkezi.app/wa/calls/wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1/terminate" \
  -H "Authorization: Bearer $VM_API_KEY"
Yanıt 200
{
  "ok": true,
  "call_id": "wacid.HBgLOTA1NTUxMjM0NTY3FQIAEhggQkE1",
  "action": "terminate",
  "success": true
}

#Arama izni iste

POST/calls/permission-request
Müşteriye arama izni isteyen etkileşimli bir mesaj gönderir. Yanıt call.permission_reply olayıyla gelir. Normal mesaj gibi 1 kredi düşer; başarısızsa iade edilir. Kapsam: calls:write
İzin durumları: no_permission, temporary (7 gün), permanent. Art arda 4 cevapsız işletme araması kalıcı izni geri alır.

Başlıklar

  • Idempotency-Keyisteğe bağlı
    8–128 karakterlik benzersiz anahtar (UUID önerilir). Aynı anahtar ve aynı gövdeyle yapılan tekrar, ilk yanıtı Idempotent-Replay: true başlığıyla döndürür. 24 saat saklanır.

İstek gövdesi

  • phone_number_idstringzorunlu
    Numaranızın Meta kimliği.
  • tostringzorunlu
    Müşteri telefonu.
  • bodystringisteğe bağlı
    Mesaj metni (en fazla 1024).

Hatalar

DurumKodNe zaman
402insufficient_creditsKredi yetersiz.
403insufficient_scopeAnahtarda calls:write kapsamı yok.
404number_not_foundNumara size ait değil.
409number_detachedNumara hesabınızdan ayrılmış; panelden yeniden bağlayın.
409idempotency_in_progressAynı anahtarla bir istek hâlâ işleniyor. Retry-After kadar bekleyin.
422idempotency_key_conflictAynı anahtar farklı bir gövdeyle kullanılmış.
422outside_service_window24 saatlik pencere kapalı.
422invalid_phoneTelefon geçersiz.
429permission_request_limitedAynı kişiye 24 saatte 1, 7 günde 2 istek sınırı.
curl -X POST "https://api.verimerkezi.app/wa/calls/permission-request" \
  -H "Authorization: Bearer $VM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number_id": "1234567890",
    "to": "905550000000",
    "body": "Siparişiniz hakkında sizi arayabilir miyiz?"
  }'
Yanıt 201
{
  "ok": true,
  "message_id": "wamid.HBgMOTA1NTUxMjM0NTY3FQIAERgSMUI4QzY3RDFFNzBBNDlGRTlBAA==",
  "to": "905550000000",
  "credits_consumed": 1,
  "balance": 4999
}

#Arama izni durumunu getir

GET/calls/permission
Bir müşterinin arama izni durumunu döndürür. Kapsam: calls:read
actions dizisi Meta'nın döndürdüğü eylem bilgilerini aynen iletir.

Sorgu parametreleri

  • phone_number_idstringzorunlu
    Numaranızın Meta kimliği.
  • tostringzorunlu
    Müşteri telefonu.

Hatalar

DurumKodNe zaman
403insufficient_scopeAnahtarda calls:read kapsamı yok.
404number_not_foundNumara size ait değil.
422invalid_phone_number_idphone_number_id rakam değil.
curl -X GET "https://api.verimerkezi.app/wa/calls/permission?phone_number_id=1234567890&to=905550000000" \
  -H "Authorization: Bearer $VM_API_KEY"
Yanıt 200
{
  "ok": true,
  "status": "temporary",
  "expires_at": "2026-10-15T10:00:00+03:00",
  "can_request": false,
  "can_call": true,
  "actions": []
}