API referansı
Kişiler
Kişi rehberinize kişi ekleyin, toplu içe aktarın, listeleyin ve abonelikten çıkanları izleyin.
#Contact nesnesi
idintegerKişi kimliği.phonestringUluslararası biçimde telefon,+önekiyle.namestring · boş olabilirAd soyad.emailstring · boş olabilirE-posta.companystring · boş olabilirFirma.tagsarrayEtiketler.sourcestringKaynak (API ile eklenenlerdeapi).opted_outbooleanKişi mesaj almayı reddetti mi.opted_out_atstring · boş olabilirReddetme zamanı (ISO 8601).created_atstringOluşturulma zamanı.
Contact nesnesi
{
"id": 26481,
"phone": "+905550000000",
"name": "Ayşe Yılmaz",
"email": "[email protected]",
"company": "Firma A.Ş.",
"tags": [
"vip",
"istanbul"
],
"source": "api",
"opted_out": false,
"opted_out_at": null,
"created_at": "2026-10-01 14:22:10"
}#Kişileri listele
GET
/contactsKişi rehberinizi yeniden eskiye, imleçle sayfalı döndürür. Kapsam:
contacts:readSorgu parametreleri
limitintegeristeğe bağlıSayfa boyutu (1–200).Varsayılan:50cursorstringisteğe bağlıÖnceki yanıttaki opaknext_cursor.qstringisteğe bağlıAd ya da telefon içinde arama.opted_outbooleanisteğe bağlıAbonelik durumuna göre süzer.Değerler:true,false
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda contacts:read kapsamı yok. |
curl -X GET "https://api.verimerkezi.app/wa/contacts?limit=50&q=ayse" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/contacts?limit=50&q=ayse", {
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/contacts?limit=50&q=ayse",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/contacts?limit=50&q=ayse");
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,
"contacts": [
{
"id": 26481,
"phone": "+905550000000",
"name": "Ayşe Yılmaz",
"email": "[email protected]",
"company": "Firma A.Ş.",
"tags": [
"vip",
"istanbul"
],
"source": "api",
"opted_out": false,
"opted_out_at": null,
"created_at": "2026-10-01 14:22:10"
}
],
"next_cursor": "eyJpZCI6MjY0ODEsImsiOiJpZCIsImQiOiJkZXNjIn0",
"has_more": true
}#Abonelikten çıkanları listele
GET
/contacts/opted-outMesaj almayı reddeden kişileri döndürür.
contact.opt_out_changed olayıyla birlikte artımlı eşitleme için since kullanın. Kapsam: contacts:readreason değeri örnektir; kaydedilen gerekçeyi döndürür.Sorgu parametreleri
limitintegeristeğe bağlıSayfa boyutu (1–200).Varsayılan:50cursorstringisteğe bağlıOpak imleç.sincestringisteğe bağlıISO 8601; yalnız bu zamandan sonra reddedenler.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda contacts:read kapsamı yok. |
| 422 | invalid_request | since ISO 8601 değil (field: since). |
curl -X GET "https://api.verimerkezi.app/wa/contacts/opted-out?since=2026-10-01T00%3A00%3A00%2B03%3A00" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/contacts/opted-out?since=2026-10-01T00%3A00%3A00%2B03%3A00", {
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/contacts/opted-out?since=2026-10-01T00%3A00%3A00%2B03%3A00",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/contacts/opted-out?since=2026-10-01T00%3A00%3A00%2B03%3A00");
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,
"contacts": [
{
"id": 26470,
"phone": "+905550000001",
"name": "Mehmet Kaya",
"opted_out": true,
"opted_out_at": "2026-10-05T16:40:00+03:00",
"reason": "whatsapp_ret"
}
],
"next_cursor": null,
"has_more": false
}#Kişi ekle
POST
/contactsRehbere tek kişi ekler. Telefon, ülke koduyla birleştirilerek uluslararası biçime çevrilir. Kapsam:
contacts:writeİstek gövdesi
phonestringzorunluTelefon (en az 10 hane). Ülke koduyla başlamıyorsacountry_codeeklenir.namestringzorunluAd soyad (en az 2 karakter).country_codestringisteğe bağlıÜlke kodu.Varsayılan:90emailstringisteğe bağlıE-posta.companystringisteğe bağlıFirma.tagsarrayisteğe bağlıEtiketler.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda contacts:write kapsamı yok. |
| 409 | contact_exists | Bu telefon zaten kayıtlı (error.id mevcut kişiyi verir). |
| 422 | invalid_phone | Geçerli telefon zorunlu. |
| 422 | invalid_name | name en az 2 karakter olmalı. |
curl -X POST "https://api.verimerkezi.app/wa/contacts" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone": "5550000000",
"country_code": "90",
"name": "Ayşe Yılmaz",
"email": "[email protected]",
"company": "Firma A.Ş.",
"tags": [
"vip",
"istanbul"
]
}'const res = await fetch("https://api.verimerkezi.app/wa/contacts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phone": "5550000000",
"country_code": "90",
"name": "Ayşe Yılmaz",
"email": "[email protected]",
"company": "Firma A.Ş.",
"tags": [
"vip",
"istanbul"
]
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/contacts",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"phone": "5550000000",
"country_code": "90",
"name": "Ayşe Yılmaz",
"email": "[email protected]",
"company": "Firma A.Ş.",
"tags": [
"vip",
"istanbul"
]
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/contacts");
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" => "5550000000",
"country_code" => "90",
"name" => "Ayşe Yılmaz",
"email" => "[email protected]",
"company" => "Firma A.Ş.",
"tags" => [
"vip",
"istanbul"
]
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"id": 26481,
"phone": "+905550000000",
"name": "Ayşe Yılmaz"
}#Kişileri toplu ekle
POST
/contacts/bulkTek istekte en fazla 1000 kişi ekler. Geçersiz satırlar
errors dizisinde döner; diğerleri eklenir. Kapsam: contacts:writeSatır hataları
{ "index": 47, "code": "invalid" | "duplicate", "phone": "..." } biçimindedir.skip_duplicates gönderilmezse yinelenenler hata olarak raporlanır.İstek gövdesi
contactsarrayzorunluKişi listesi (en fazla 1000).Alt alanları göster
phonestringzorunluTelefon.namestringzorunluAd soyad (en az 2 karakter).emailstringisteğe bağlıE-posta.companystringisteğe bağlıFirma.tagsarrayisteğe bağlıEtiketler.
skip_duplicatesbooleanisteğe bağlıtrueise kayıtlı telefonlar sessizce atlanır; aksi hâldeerrorsiçindeduplicatedöner.country_codestringisteğe bağlıÜlke kodu.Varsayılan:90
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda contacts:write kapsamı yok. |
| 422 | invalid_request | contacts dizisi zorunlu. |
| 422 | too_many | Tek istekte en fazla 1000 kişi. |
curl -X POST "https://api.verimerkezi.app/wa/contacts/bulk" \
-H "Authorization: Bearer $VM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contacts": [
{
"phone": "5550000003",
"name": "Ali Demir"
},
{
"phone": "5550000002",
"name": "Zeynep Şahin",
"tags": [
"yeni"
]
}
],
"skip_duplicates": true,
"country_code": "90"
}'const res = await fetch("https://api.verimerkezi.app/wa/contacts/bulk", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"contacts": [
{
"phone": "5550000003",
"name": "Ali Demir"
},
{
"phone": "5550000002",
"name": "Zeynep Şahin",
"tags": [
"yeni"
]
}
],
"skip_duplicates": true,
"country_code": "90"
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/contacts/bulk",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
json={
"contacts": [
{
"phone": "5550000003",
"name": "Ali Demir"
},
{
"phone": "5550000002",
"name": "Zeynep Şahin",
"tags": [
"yeni"
]
}
],
"skip_duplicates": True,
"country_code": "90"
},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/contacts/bulk");
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([
"contacts" => [
[
"phone" => "5550000003",
"name" => "Ali Demir"
],
[
"phone" => "5550000002",
"name" => "Zeynep Şahin",
"tags" => [
"yeni"
]
]
],
"skip_duplicates" => true,
"country_code" => "90"
]),
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"inserted": 2,
"skipped": 0,
"errors": []
}