API referansı
Hesap
API anahtarının sahibi olan hesabın bilgileri, hesap geneli ayarlar, KVKK işlemleri ve webhook teslimat sağlığı.
#Account nesnesi
userobjectHesap sahibi:id,email,name,role.api_keyobjectİsteği yapan anahtar:id,name,key_prefix,mode(live/test),scopes,expires_at.account_settingsobjectHesap ayarları:revoke_edit_clean,default_automation_enabled,default_opt_out_autoreply_enabled.creditsobjectMesaj kredisi:balanceve etkinpackageslistesi.
Account nesnesi
{
"ok": true,
"user": {
"id": 35,
"email": "[email protected]",
"name": "Ahmet Yılmaz",
"role": "customer"
},
"api_key": {
"id": 12,
"name": "Üretim sunucusu",
"key_prefix": "vmk_live_k3m9q2",
"mode": "live",
"scopes": [
"*"
],
"expires_at": null
},
"account_settings": {
"revoke_edit_clean": false,
"default_automation_enabled": null,
"default_opt_out_autoreply_enabled": null
},
"credits": {
"balance": 9876,
"packages": [
{
"id": 42,
"package_name": "Profesyonel",
"credits_purchased": 10000,
"credits_used": 124,
"credits_remaining": 9876,
"expires_at": "2027-05-27 14:33:21"
}
]
}
}#Hesap bilgisini getir
GET
/meAPI anahtarının sahibini, anahtarın kendisini, hesap ayarlarını ve kredi bakiyesini döndürür. Entegrasyonunuzu doğrulamak için ilk çağrı olarak kullanın.
Herhangi bir geçerli anahtarla çağrılabilir; ek kapsam gerekmez.
curl -X GET "https://api.verimerkezi.app/wa/me" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/me", {
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/me",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/me");
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
null#Hesap ayarlarını güncelle
PATCH
/account/settingsHesabınızdaki tüm numaralara toplu uygulanan ayarları ve bundan sonra bağlanacak numaraların varsayılanlarını değiştirir. En az bir alan gönderin; değerler JSON boolean olmalıdır. Kapsam:
profile:writeYanıttaki
settings değerleri, ayar tüm numaralarda açıksa true olur.İstek gövdesi
revoke_edit_cleanbooleanisteğe bağlıAçıkken silme/düzenleme olaylarında yalnızmessage.revoked/message.editedyayınlanır;message.receivedgönderilmez, 24 saatlik pencere uzamaz, otomasyon ve abonelikten çıkış yanıtı tetiklenmez. Tüm numaralara uygulanır.Varsayılan:Falseautomation_enabledbooleanisteğe bağlıVeri Merkezi otomasyon motorunu tüm mevcut numaralarda açar/kapatır.opt_out_autoreply_enabledbooleanisteğe bağlıHer zamantrue: 11.10.2026'dan beri RET onay mesajı zorunludur, kapatılamaz;falsegönderilirse yok sayılır ve yanıttatruedöner. Çıkış talebi her durumda kaydedilir.default_automation_enabledbooleanisteğe bağlıBundan sonra bağlanacak numaraların otomasyon varsayılanı.default_opt_out_autoreply_enabledbooleanisteğe bağlıBundan sonra bağlanacak numaraların çıkış yanıtı varsayılanı. Her zamantrueuygulanır (RET onay mesajı zorunlu);falseyok sayılır.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda profile:write kapsamı yok. |
| 422 | invalid_request | Değiştirilecek alan yok ya da değer boolean değil. |
curl -X PATCH "https://api.verimerkezi.app/wa/account/settings" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"revoke_edit_clean": true,
"default_automation_enabled": false
}'const res = await fetch("https://api.verimerkezi.app/wa/account/settings", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"revoke_edit_clean": true,
"default_automation_enabled": false
}),
});
const data = await res.json();import os, requests
res = requests.patch(
"https://api.verimerkezi.app/wa/account/settings",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"revoke_edit_clean": True,
"default_automation_enabled": False
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/account/settings");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"revoke_edit_clean" => true,
"default_automation_enabled" => false
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 200
{
"ok": true,
"numbers_updated": 2,
"numbers_total": 2,
"settings": {
"revoke_edit_clean": true,
"automation_enabled": true,
"opt_out_autoreply_enabled": true,
"default_automation_enabled": false,
"default_opt_out_autoreply_enabled": null
}
}#Veri saklama sürelerini ayarla
PATCH
/account/retentionKVKK kapsamında hesap düzeyindeki saklama sürelerini gün olarak kaydeder. En az bir alan gönderin. Kapsam:
profile:writev2.19.2 dokümanına göre saklama süresi şu an yalnız arama kayıtlarına uygulanır; mesaj ve medya için otomatik silme henüz etkin değildir. Medya dosyaları varsayılan olarak süresiz saklanır.
İstek gövdesi
messages_daysintegeristeğe bağlıMesaj kayıtları için gün (1–3650).media_daysintegeristeğe bağlıMedya dosyaları için gün (1–3650).webhook_deliveries_daysintegeristeğe bağlıGiden webhook teslim kayıtları için gün (1–365).
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda profile:write kapsamı yok. |
| 422 | invalid_request | Alan yok, tam sayı değil ya da aralık dışında. |
curl -X PATCH "https://api.verimerkezi.app/wa/account/retention" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages_days": 365,
"media_days": 180,
"webhook_deliveries_days": 30
}'const res = await fetch("https://api.verimerkezi.app/wa/account/retention", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"messages_days": 365,
"media_days": 180,
"webhook_deliveries_days": 30
}),
});
const data = await res.json();import os, requests
res = requests.patch(
"https://api.verimerkezi.app/wa/account/retention",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"messages_days": 365,
"media_days": 180,
"webhook_deliveries_days": 30
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/account/retention");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"messages_days" => 365,
"media_days" => 180,
"webhook_deliveries_days" => 30
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 200
{
"ok": true,
"retention": {
"messages_days": 365,
"media_days": 180,
"webhook_deliveries_days": 30
},
"note": "Saklama süreleri kaydedildi. Süre dolan veriler periyodik temizlik işiyle silinir; süre verilmeyen tür varsayılan olarak saklanır."
}#Kişiye ait verileri sil (KVKK)
POST
/privacy/erasureBir son kullanıcının silinme/unutulma talebini işler. Kişiye ait mesaj gövdeleri anonimleştirilir; medya, konuşma bilgileri, giden webhook teslim gövdeleri ve idempotency yanıtları silinir. Abonelikten çıkış (onay) kaydı korunur. İşlem idempotenttir. 2.29.0: isteğe bağlı
reference yanıtta ve privacy.erasure_completed olayında aynen döner; Idempotency-Key ile yapılan yeniden deneme aynı erasure_id ve yanıtı döndürür, silme ikinci kez çalışmaz. Kapsam: profile:writeTamamlanınca
privacy.erasure_completed olayı yayınlanır (* aboneliğine dahil değildir).erased nesnesi tablo bazında silinen kayıt sayılarını içerir; anahtarlar örnektir.Kişinin uygulama rehberi kayıtları (
GET /app-contacts) da silinir; sayısı erased.app_contacts.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ı (aynıerasure_id)Idempotent-Replay: truebaşlığıyla döndürür; silme yeniden çalışmaz. 24 saat saklanır. (2.29.0)
İstek gövdesi
wa_idstringisteğe bağlıKişinin telefon numarası (8–15 hane).wa_idya dauser_idzorunludur.user_idstringisteğe bağlıKişinin BSUID değeri (telefonu görünmeyen kullanıcılar için).phone_number_idstringisteğe bağlıİsteğe bağlı; verilirse hesabınıza ait olmalıdır.referencestringisteğe bağlıİsteğe bağlı, 1–64 karakter: kendi talep kimliğiniz. Yanıtta veprivacy.erasure_completedolayında aynen döner (2.29.0).
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda profile:write kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 422 | invalid_request | wa_id ve user_id ikisi de yok ya da biçim hatalı. |
| 500 | erasure_failed | Silme tamamlanamadı; tekrar deneyin. |
curl -X POST "https://api.verimerkezi.app/wa/privacy/erasure" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"wa_id": "905550000000",
"phone_number_id": "1234567890",
"reference": "crm-silme-4711"
}'const res = await fetch("https://api.verimerkezi.app/wa/privacy/erasure", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"wa_id": "905550000000",
"phone_number_id": "1234567890",
"reference": "crm-silme-4711"
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/privacy/erasure",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"wa_id": "905550000000",
"phone_number_id": "1234567890",
"reference": "crm-silme-4711"
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/privacy/erasure");
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([
"wa_id" => "905550000000",
"phone_number_id" => "1234567890",
"reference" => "crm-silme-4711"
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 202
{
"ok": true,
"status": "completed",
"erasure_id": "ers_0123456789abcdef01234567",
"phone_number_id": "1234567890",
"wa_id": "905550000000",
"user_id": null,
"reference": "crm-silme-4711",
"completed_at": "2026-10-10T09:00:00Z",
"erased": {
"messages": 42,
"media": 3
}
}#Webhook teslimat sağlığını getir
GET
/healthHesabınızın webhook teslimat durumunu döndürür: kuyruk derinliği, son bir saatteki teslim sayısı, ortalama ve p95 gecikme, son 24 saatteki ölü teslimler. İzleme panolarında kullanın.
Kuyruk 1000'i ya da p95 gecikme 120 saniyeyi aşarsa
status değeri degraded olur.curl -X GET "https://api.verimerkezi.app/wa/health" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/health", {
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/health",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/health");
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,
"status": "ok",
"time": "2026-10-10T09:00:00Z",
"webhook_delivery": {
"active_subscriptions": 1,
"queue_depth": 0,
"delivered_last_hour": 240,
"latency_seconds_last_hour": {
"avg": 1.2,
"p95": 3
},
"dead_last_24h": 0,
"last_delivered_at": "2026-10-10T11:59:58+03:00"
},
"meta_webhook": {
"last_received_at": "2026-10-10T11:59:59+03:00",
"failed_last_hour": 0
}
}