Introduction
Türkçe REST API referansı — kanal entegrasyonları, voice/sip, randevu sistemi, fonksiyon gateway.
DoWaba REST API ile kendi sistemini DoWaba'nın çok kanallı altyapısına entegre edebilirsin: WhatsApp, Instagram DM, Telegram, e-posta, web widget, SMS ve AI Voice (telefon).
Buradan başla
- Token üret: Panel → Ayarlar → API Anahtarı (Bearer token). Sunucu-sunucu entegrasyonlar için
dse_prefix'li External API Key kullanılır (POST /api/sites/{site}/regenerate-external-key). - İlk isteğini at:
curl https://dowaba.com/api/auth/user \
-H "Authorization: Bearer TOKEN" \
-H "Accept: application/json"
- Yanıtları işle: Tüm yanıtlar JSON'dır. Kimliksiz istek
401({"message": "Unauthenticated."}), doğrulama hatası422({"message": "...", "errors": {...}}), yetki dışı kaynak403döner.
Hız limitleri: Kötüye kullanıma açık uçlarda istek limitleri uygulanır (örn. token üretimi 10 istek/dk, webhook testi 10 istek/dk). Limit aşımında 429 Too Many Requests ve Retry-After header'ı döner — istemcin bu header'a saygı göstermeli.
Erişim modeli: Tüm kaynaklar hesap kapsamına (tenant) bağlıdır — yalnızca sahibi olduğun veya yetkilendirildiğin (bayi/ekip erişimi) site, kanal ve konuşmalara erişebilirsin.
Makine-okur formatlar: Postman collection · OpenAPI 3 spec
Sağdaki kod örnekleri otomatik üretilir: curl, JavaScript (axios), PHP (Guzzle). Üst sekmeden değiştirebilirsin. Her endpoint için "Try It Out" butonuyla canlı bir istek atıp gerçek response'u görebilirsin (Bearer token girmeyi unutma).
🚀 Hızlı başlangıç + örnek projeler için: /api-docs-ornekler — Laravel Bridge, saf-PHP snippet, widget embed, webhook receiver, AI prompt template'leri ve composer/npm paket listesi.
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer {TOKEN}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
Token, Panel → Ayarlar → API Anahtarı menüsünden üretilir. Sunucu-sunucu (server-to-server) entegrasyonlarda dse_ prefix'li External API Key kullanılır; bu durumda X-API-Key header'ı gönderilir (widget anahtarı dsk_ DEĞİL).
Yönetici / Genel Bakış
Bayinin müşterilerini listele. Kart grid için zenginleştirilmiş.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/reseller/customers?search=ali&is_active=1" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/reseller/customers"
);
const params = {
"search": "ali",
"is_active": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/reseller/customers';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
'query' => [
'search' => 'ali',
'is_active' => '1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 12,
"name": "Test Müşteri",
"email": "u***@example.com",
"phone": "+90 555 *** ** **",
"is_active": true,
"sites_count": 2,
"active_licenses_count": 2,
"created_at": "2026-05-01T10:00:00.000000Z"
}
],
"count": 1
}
Example response (403, Reseller sözleşmesi imzalanmamış):
{
"success": false,
"error": "Bayi sözleşmesini imzalamadan müşterilerinizi göremezsiniz."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Admin Manuel Abonelik
Havale/EFT ile ödeme yapan kullanıcılara abonelik aktivasyonu yapar:
- paytr_payments tablosuna manual_transfer kaydı
- SubscriptionService::activateSubscription
- (opsiyonel) bekleyen bayi lisansını kapat + siteleri repoint — absorbableLicenses (API default KAPALI/geriye uyumlu; panel checkbox'ı varsayılan İŞARETLİ gönderir)
- Paraşüt — contact + sales invoice + e-archive
- Müşteriye + admin'e (CC) onay maili
Idempotent değil — tekrar çağrılırsa yeni subscription + yeni invoice oluşur. Çağrı eden admin kullanıcı kredilerini panelden manuel ekler/değiştirir.
Manuel aktivasyona uygun planları dön (frontend dropdown'u için).
Son-müşteri planları: Starter / Pro / Premium / Ultimate.
Example request:
curl --request GET \
--get "https://dowaba.com/api/subscription-plans"const url = new URL(
"https://dowaba.com/api/subscription-plans"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/subscription-plans';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcı Yönetimi
Kayıt ekranı "bayi ara" listesi (public, throttle'lı). Yalnız referans programına katılan (enabled) VE listelenmeyi kabul eden (public_listed) bayiler döner; alanlar minimal (görünen ad + kod). REFERRAL_PROGRAM.md § 6.1.
Referans bayilerini ara/listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/public/referral-resellers?q=acr"const url = new URL(
"https://dowaba.com/api/public/referral-resellers"
);
const params = {
"q": "acr",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/public/referral-resellers';
$response = $client->get(
$url,
[
'query' => [
'q' => 'acr',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"data": [
{
"display_name": "ACR Yazılım",
"city": "Burdur",
"code": "DWB-7K2M9A"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni kullanıcı kaydı (e-posta + telefon + parola). Spam koruma + e-posta doğrulama maili.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/register" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Test Kullanıcı\",
\"phone\": \"+905551234567\",
\"email\": \"user@example.com\",
\"password\": \"GucluParola123\",
\"consents\": {
\"terms\": true,
\"privacy\": true,
\"yurtdisi\": true,
\"cagri_kayit\": true,
\"marketing\": true,
\"analytics\": false,
\"cookie_marketing\": false
},
\"timezone\": \"America\\/Nome\",
\"referral_code\": \"DWB-7K2M9A\",
\"password_confirmation\": \"GucluParola123\"
}"
const url = new URL(
"https://dowaba.com/api/auth/register"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Test Kullanıcı",
"phone": "+905551234567",
"email": "user@example.com",
"password": "GucluParola123",
"consents": {
"terms": true,
"privacy": true,
"yurtdisi": true,
"cagri_kayit": true,
"marketing": true,
"analytics": false,
"cookie_marketing": false
},
"timezone": "America\/Nome",
"referral_code": "DWB-7K2M9A",
"password_confirmation": "GucluParola123"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/register';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Test Kullanıcı',
'phone' => '+905551234567',
'email' => 'user@example.com',
'password' => 'GucluParola123',
'consents' => [
'terms' => true,
'privacy' => true,
'yurtdisi' => true,
'cagri_kayit' => true,
'marketing' => true,
'analytics' => false,
'cookie_marketing' => false,
],
'timezone' => 'America/Nome',
'referral_code' => 'DWB-7K2M9A',
'password_confirmation' => 'GucluParola123',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"user": {
"id": 42,
"name": "Test Kullanıcı",
"email": "u***@example.com",
"role": "user",
"credits": 1000,
"email_verified_at": null
},
"token": "[REDACTED]",
"message": "Hesabınız oluşturuldu. E-postanızı doğrulamak için maili kontrol edin."
}
Example response (422, KVKK onayları eksik):
{
"success": false,
"error": "Zorunlu onaylar eksik: hizmet sözleşmesi, gizlilik, yurt dışı aktarım ve çağrı kayıt onaylarını işaretlemeniz gerekir.",
"missing_consents": [
"yurtdisi",
"cagri_kayit"
]
}
Example response (422, Spam guard reddetti):
{
"success": false,
"error": "Geçersiz e-posta domain'i."
}
Example response (422, Doğrulama hatası):
{
"message": "The given data was invalid.",
"errors": {
"email": [
"The email has already been taken."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
E-posta + parola ile giriş. Aktif 2FA metodu varsa full token VERİLMEZ; yerine kısa-ömürlü interim_token + requires_2fa döner. Challenge başarılı olduğunda /api/auth/2fa/challenge endpoint'i Sanctum token üretir.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/login" \
--header "Content-Type: application/json" \
--data "{
\"email\": \"user@example.com\",
\"password\": \"GucluParola123\"
}"
const url = new URL(
"https://dowaba.com/api/auth/login"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "user@example.com",
"password": "GucluParola123"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/login';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'email' => 'user@example.com',
'password' => 'GucluParola123',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Başarılı (2FA kapalı)):
{
"success": true,
"user": {
"id": 42,
"name": "Test Kullanıcı",
"email": "u***@example.com",
"phone": "+90 555 *** ** **",
"role": "user",
"is_active": true,
"credits": 1000,
"allowed_modules": null,
"assigned_site_id": null,
"is_agent_only": false,
"reseller_id": null,
"locale": "tr"
},
"token": "[REDACTED]",
"modules": [
"appointment",
"saas"
]
}
Example response (200, 2FA gerekli):
{
"success": true,
"requires_2fa": true,
"interim_token": "[REDACTED]",
"available_methods": [
"totp",
"email"
]
}
Example response (401):
{
"success": false,
"error": "E-posta veya parola hatalı."
}
Example response (403):
{
"success": false,
"error": "Hesabınız pasif duruma alınmış. Yönetici ile iletişime geçin."
}
Example response (422):
{
"message": "The given data was invalid.",
"errors": {
"email": [
"The email field is required."
]
}
}
Example response (429):
{
"success": false,
"error": "Çok fazla hatalı deneme. Lütfen 42 saniye sonra tekrar deneyin.",
"retry_after": 42
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Doğrulama mailini tekrar gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/resend-verification" \
--header "Content-Type: application/json" \
--data "{
\"email\": \"qkunze@example.com\"
}"
const url = new URL(
"https://dowaba.com/api/auth/resend-verification"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "qkunze@example.com"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/resend-verification';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'email' => 'qkunze@example.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şifre sıfırlama linki gönder. E-posta varsa MailAccount cascade ile (parent → reseller → site → system fallback) mail çıkışına gider.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/forgot-password" \
--header "Content-Type: application/json" \
--data "{
\"email\": \"user@example.com\"
}"
const url = new URL(
"https://dowaba.com/api/auth/forgot-password"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "user@example.com"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/forgot-password';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'email' => 'user@example.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Şifre sıfırlama bağlantısı e-posta adresinize gönderildi."
}
Example response (422):
{
"message": "The given data was invalid.",
"errors": {
"email": [
"The email field is required."
]
}
}
Example response (429):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Token ile şifre sıfırlama (forgot-password sonrası). Başarılı sıfırlamada kullanıcıyı ayrıca OTOMATİK GİRİŞ ettirir (2026-08-09): `auto_login=true` ise `token` (Sanctum PAT) + `user` + `modules` döner ve frontend login ekranına geri göndermeden panele geçebilir. Kapılar `login()` ile BİREBİR aynı sırayla uygulanır — sıfırlama, girişin kapılarını atlatan bir arka kapı DEĞİLDİR (doğrulanmamış e-posta / pasif hesap / white-label portal kilidi / TOTP hepsi aynen çalışır). Kapılardan biri kapalıysa `auto_login=false` döner ama şifre yine de değişmiş olur (`success=true` korunur) → mevcut istemciler bozulmaz, alanlar additive'dir.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/reset-password" \
--header "Content-Type: application/json" \
--data "{
\"token\": null,
\"email\": \"user@example.com\",
\"password\": \"YeniParola123\",
\"password_confirmation\": \"YeniParola123\"
}"
const url = new URL(
"https://dowaba.com/api/auth/reset-password"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"token": null,
"email": "user@example.com",
"password": "YeniParola123",
"password_confirmation": "YeniParola123"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/reset-password';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'token' => null,
'email' => 'user@example.com',
'password' => 'YeniParola123',
'password_confirmation' => 'YeniParola123',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Sıfırlandı + otomatik giriş):
{
"success": true,
"message": "Şifreniz başarıyla güncellendi! Şimdi giriş yapabilirsiniz.",
"auto_login": true,
"user": {
"id": 42,
"name": "Test Kullanıcı",
"email": "u***@example.com",
"role": "user"
},
"token": "[REDACTED]",
"modules": [
"appointment",
"saas"
]
}
Example response (200, Sıfırlandı ama TOTP gerekiyor):
{
"success": true,
"message": "Şifreniz başarıyla güncellendi! Şimdi giriş yapabilirsiniz.",
"auto_login": false,
"requires_2fa": true,
"method": "totp",
"interim_token": "[REDACTED]",
"has_totp": true,
"has_email_fallback": true,
"masked_email": "u***r@example.com",
"has_recovery_codes": true
}
Example response (200, Sıfırlandı ama e-posta doğrulanmamış):
{
"success": true,
"message": "Şifreniz başarıyla güncellendi! Şimdi giriş yapabilirsiniz.",
"auto_login": false,
"requires_verification": true,
"email": "u***@example.com"
}
Example response (200, Sıfırlandı ama hesap pasif):
{
"success": true,
"message": "Şifreniz başarıyla güncellendi! Şimdi giriş yapabilirsiniz.",
"auto_login": false,
"account_disabled": true,
"contact": {
"source": "support",
"name": "Dowaba Destek",
"email": "d*****@example.com",
"phone": null,
"message": "..."
}
}
Example response (400):
{
"success": false,
"message": "Şifre sıfırlama bağlantısı geçersiz veya süresi dolmuş. Lütfen tekrar deneyin."
}
Example response (429, throttle:auth-reset-password (8/15dk, IP)):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Google ile giriş/kayıt (id_token doğrulaması). Kullanıcı yoksa otomatik oluşturulur (email_verified_at=now, credits=1000, provider='google').
Example request:
curl --request POST \
"https://dowaba.com/api/auth/google" \
--header "Content-Type: application/json" \
--data "{
\"id_token\": \"eyJhbGciOiJSUzI1NiIsImtpZCI6IjE3M...\",
\"consents\": {
\"terms\": false,
\"privacy\": true,
\"yurtdisi\": true,
\"cagri_kayit\": false,
\"marketing\": true,
\"analytics\": false,
\"cookie_marketing\": true
}
}"
const url = new URL(
"https://dowaba.com/api/auth/google"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjE3M...",
"consents": {
"terms": false,
"privacy": true,
"yurtdisi": true,
"cagri_kayit": false,
"marketing": true,
"analytics": false,
"cookie_marketing": true
}
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/google';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'id_token' => 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjE3M...',
'consents' => [
'terms' => false,
'privacy' => true,
'yurtdisi' => true,
'cagri_kayit' => false,
'marketing' => true,
'analytics' => false,
'cookie_marketing' => true,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"user": {
"id": 42,
"name": "Test Kullanıcı",
"email": "u***@example.com",
"avatar_url": "https://lh3.googleusercontent.com/a/example",
"role": "user",
"provider": "google",
"email_verified_at": "2026-05-19T14:23:11.000000Z"
},
"token": "[REDACTED]",
"modules": [
"appointment",
"saas"
]
}
Example response (401, Google doğrulama fail):
{
"success": false,
"error": "Google doğrulama başarısız."
}
Example response (401, Audience mismatch):
{
"success": false,
"error": "Google token bu uygulamaya ait değil."
}
Example response (403, E-posta doğrulanmamış):
{
"success": false,
"error": "Google e-posta adresi doğrulanmamış."
}
Example response (422):
{
"success": false,
"error": "Google hesabından e-posta alınamadı."
}
Example response (500, Backend Google config yok):
{
"success": false,
"error": "Google girişi yapılandırılmamış."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Apple ile giriş/kayıt (id_token doğrulaması).
Example request:
curl --request POST \
"https://dowaba.com/api/auth/apple" \
--header "Content-Type: application/json" \
--data "{
\"id_token\": null,
\"name\": \"mqeopfuudtdsufvyvddqa\",
\"consents\": {
\"terms\": false,
\"privacy\": true,
\"yurtdisi\": true,
\"cagri_kayit\": true,
\"marketing\": false,
\"analytics\": false,
\"cookie_marketing\": false
}
}"
const url = new URL(
"https://dowaba.com/api/auth/apple"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id_token": null,
"name": "mqeopfuudtdsufvyvddqa",
"consents": {
"terms": false,
"privacy": true,
"yurtdisi": true,
"cagri_kayit": true,
"marketing": false,
"analytics": false,
"cookie_marketing": false
}
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/apple';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'id_token' => null,
'name' => 'mqeopfuudtdsufvyvddqa',
'consents' => [
'terms' => false,
'privacy' => true,
'yurtdisi' => true,
'cagri_kayit' => true,
'marketing' => false,
'analytics' => false,
'cookie_marketing' => false,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Passkey ile parolasız giriş için seçenekler. `email` opsiyonel — boş ise discoverable credential listesi (cihazda kayıtlı tüm dowaba.com passkey'leri) gösterilir.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/passkey/login/options" \
--header "Content-Type: application/json" \
--data "{
\"email\": \"qkunze@example.com\"
}"
const url = new URL(
"https://dowaba.com/api/auth/passkey/login/options"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "qkunze@example.com"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/passkey/login/options';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'email' => 'qkunze@example.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
`navigator.credentials.get()`'ten dönen assertion'u doğrula → Sanctum token döndür.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/passkey/login/verify" \
--header "Content-Type: application/json" \
--data "{
\"credential\": {
\"id\": \"vmqeopfuudtdsufvyvddq\",
\"rawId\": null,
\"type\": \"public-key\",
\"response\": []
},
\"challenge_ref\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/auth/passkey/login/verify"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"credential": {
"id": "vmqeopfuudtdsufvyvddq",
"rawId": null,
"type": "public-key",
"response": []
},
"challenge_ref": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/passkey/login/verify';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'credential' => [
'id' => 'vmqeopfuudtdsufvyvddq',
'rawId' => null,
'type' => 'public-key',
'response' => [],
],
'challenge_ref' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mevcut access token'ı iptal eder ve session'ı temizler.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/auth/logout" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/auth/logout"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/logout';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Çıkış yapıldı."
}
Example response (401):
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hesap silme için e-posta doğrulama kodu gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/account/delete-request"const url = new URL(
"https://dowaba.com/api/auth/account/delete-request"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/account/delete-request';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Onayı doğrula (e-posta kodu veya "SİL" yazımı) ve hesabı kaldır — KVKK/VUK-güvenli hibrit (2026-07-10): finansal/site izi olmayan hesap kalıcı silinir; izi olan hesap anonimleştirilir (login imkansız, PII silinir, mesajlar anonimleşir; fatura/rıza kayıtları yasal saklama süresince korunur). Her iki durumda kanal bağlantıları (WhatsApp/Instagram/Telegram/… + Evolution instance/webhook/token) tamamen temizlenir.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/account/confirm-delete" \
--header "Content-Type: application/json" \
--data "{
\"code\": \"vmqeop\",
\"confirmation\": \"fuudtdsufvyvddqamniih\"
}"
const url = new URL(
"https://dowaba.com/api/auth/account/confirm-delete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"code": "vmqeop",
"confirmation": "fuudtdsufvyvddqamniih"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/account/confirm-delete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'code' => 'vmqeop',
'confirmation' => 'fuudtdsufvyvddqamniih',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mevcut kullanıcının kayıtlı passkey'leri.
Example request:
curl --request GET \
--get "https://dowaba.com/api/profile/passkeys"const url = new URL(
"https://dowaba.com/api/profile/passkeys"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/profile/passkeys';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni passkey kaydı için seçenekleri (challenge + RP + user) üret. Frontend bu cevabı `navigator.credentials.create({ publicKey: ... })`'a verir.
Example request:
curl --request POST \
"https://dowaba.com/api/profile/passkeys/register/options"const url = new URL(
"https://dowaba.com/api/profile/passkeys/register/options"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/profile/passkeys/register/options';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
`navigator.credentials.create()`'den dönen credential'ı doğrula ve kaydet.
Example request:
curl --request POST \
"https://dowaba.com/api/profile/passkeys/register/verify" \
--header "Content-Type: application/json" \
--data "{
\"credential\": {
\"id\": \"vmqeopfuudtdsufvyvddq\",
\"rawId\": null,
\"type\": \"public-key\",
\"response\": []
},
\"device_name\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/profile/passkeys/register/verify"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"credential": {
"id": "vmqeopfuudtdsufvyvddq",
"rawId": null,
"type": "public-key",
"response": []
},
"device_name": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/profile/passkeys/register/verify';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'credential' => [
'id' => 'vmqeopfuudtdsufvyvddq',
'rawId' => null,
'type' => 'public-key',
'response' => [],
],
'device_name' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir passkey'i sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/profile/passkeys/1562"const url = new URL(
"https://dowaba.com/api/profile/passkeys/1562"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/profile/passkeys/1562';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ayarlar & Profil
Medya dosyası yükleme + listeleme + silme.
Endpoint: POST /api/media/upload — dosya yükle (multipart/form-data) GET /api/media — kullanıcının dosyaları (snippet picker'da seçim için) DELETE /api/media/{id} — dosya sil (cascade: snippet.media_file_id null'a düşer)
Storage: 'public' disk → storage/app/public/media/
WhatsApp / Meta limitler (request validation):
- image: 5 MB (JPEG/PNG/WEBP)
- video: 16 MB (MP4 / 3GPP) — daha büyükse 'document' olarak gönderilir
- audio: 16 MB (MP3/OGG/AAC/M4A)
- document: 100 MB (PDF/DOCX/PPTX/ZIP)
GET api/media
Example request:
curl --request GET \
--get "https://dowaba.com/api/media"const url = new URL(
"https://dowaba.com/api/media"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/media';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/media/upload
Example request:
curl --request POST \
"https://dowaba.com/api/media/upload" \
--header "Content-Type: multipart/form-data" \
--form "file=@/tmp/phpmZoyI5" const url = new URL(
"https://dowaba.com/api/media/upload"
);
const headers = {
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('file', document.querySelector('input[name="file"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/media/upload';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'file',
'contents' => fopen('/tmp/phpmZoyI5', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE api/media/{id}
Example request:
curl --request DELETE \
"https://dowaba.com/api/media/1562"const url = new URL(
"https://dowaba.com/api/media/1562"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/media/1562';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Atıl (kullanılmayan) kanal bağlantılarını listele. Yalnızca ATIL profiller döner (aktif kullanımda olanlar listeye girmez). Her kayıt neden(ler)i (`reasons`) ile gelir: `no_site` (canlı hiçbir siteye bağlı değil), `sites_inactive` (bağlı siteler var ama hepsi askıda), `deactivated` (bağlantı pasif). `token_dead` yalnızca ek uyarı rozetidir. `can_manage=false` ise bağlantı sizin cascade'inizde görünür ama temizleme yetkiniz yoktur.
Example request:
curl --request GET \
--get "https://dowaba.com/api/idle-connections"const url = new URL(
"https://dowaba.com/api/idle-connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/idle-connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"connections": [
{
"channel": "whatsapp",
"id": 5,
"label": "+90 555 111 22 33",
"connection_type": "evolution_api",
"reasons": [
"no_site",
"deactivated"
],
"token_dead": false,
"is_active": false,
"linked_sites": [],
"owner_user_id": 12,
"can_manage": true,
"created_at": "2026-01-05T10:00:00.000000Z"
}
],
"data": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Seçili atıl bağlantıları KALICI temizle (her yerden: dış taraf + pivot + satır). Her öğe bağımsız işlenir; biri hata verse diğerleri sürer. Yalnızca yönetim yetkiniz olan (sahip/bayi cascade/superadmin) VE hâlâ atıl olan bağlantılar temizlenir. Aktif kullanımdaki bir bağlantı gönderilirse o öğe için `ok=false` döner, temizlenmez.
Example request:
curl --request POST \
"https://dowaba.com/api/idle-connections/cleanup" \
--header "Content-Type: application/json" \
--data "{
\"items\": [
{
\"channel\": \"whatsapp\",
\"id\": 5
}
]
}"
const url = new URL(
"https://dowaba.com/api/idle-connections/cleanup"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"items": [
{
"channel": "whatsapp",
"id": 5
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/idle-connections/cleanup';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['stdClass'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('stdClass')),
],
null,
[
'stdClass' => [
'channel' => [
'whatsapp',
],
'id' => [
5,
],
],
],
[
'items' => [
$o[0],
],
],
[]
),
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"results": [
{
"channel": "whatsapp",
"id": 5,
"ok": true
}
],
"cleaned_count": 1
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mevcut kullanıcı profili + site sayısı + krediler.
Example request:
curl --request GET \
--get "https://dowaba.com/api/user"const url = new URL(
"https://dowaba.com/api/user"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/user';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcı profil bilgilerini güncelle (ad, e-posta, parola).
Example request:
curl --request PUT \
"https://dowaba.com/api/user" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"email\": \"kunde.eloisa@example.com\",
\"password\": \"[2UZ5ij-e\\/dl4\"
}"
const url = new URL(
"https://dowaba.com/api/user"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"email": "kunde.eloisa@example.com",
"password": "[2UZ5ij-e\/dl4"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/user';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'email' => 'kunde.eloisa@example.com',
'password' => '[2UZ5ij-e/dl4',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kişiye özel sol menü ETİKETLERİNİ kaydet. Menünün İŞLEVİNİ/İZNİNİ değiştirmez — yalnız panelde görünen metni. Sektöre özel isimlendirme için: "Müşteri Talepleri" → "Öğrenci Talepleri". Sparse sözleşme: yalnız kullanıcının DEĞİŞTİRDİĞİ anahtarlar saklanır. Boş string ("") veya null gönderilen anahtar SİLİNİR → panel varsayılan çeviriye döner. Kullanıcı etiketi hiçbir zaman i18n'e girmez (kullanıcı verisidir), dil değişince aynen kalır. Doğrulama fail-closed: anahtar formatı `^[a-zA-Z][a-zA-Z0-9_]{0,40}$` dışında ise 422; değer strip_tags + kontrol karakteri temizliği + trim + 40 karaktere kırpılır; en fazla 100 anahtar. Miras (2026-07-30): alt kullanıcı bir anahtarı hiç yazmadıysa üst hesabın (parent / agent olduğu sitenin sahibi) etiketini görür — yanıttaki `menu_labels_inherited` + `menu_labels_effective` alanları bunu taşır. Bayi (reseller) zincire GİRMEZ. Detay: User::effectiveMenuLabels().
requires authentication
Kullanıcının UI dil tercihini günceller. Sanctum auth zorunlu. NULL kabul edilir = "tercih sıfırlama" — SetLocale middleware bundan sonra Accept-Language header'ı üzerinden karar verir (tarayıcı diline geri döner). AI yanıt dili (sites.languages) bu endpoint ile DEĞİŞMEZ — ayrı konsept.
Example request:
curl --request PUT \
"https://dowaba.com/api/user/locale" \
--header "Content-Type: application/json" \
--data "{
\"locale\": \"so_ET\"
}"
const url = new URL(
"https://dowaba.com/api/user/locale"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"locale": "so_ET"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/user/locale';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'locale' => 'so_ET',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mevcut kullanıcı bilgileri + site sayısı + krediler + kullanım özeti.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/auth/user" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/auth/user"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/user';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"user": {
"id": 42,
"name": "Test Kullanıcı",
"email": "u***@example.com",
"phone": "+90 555 *** ** **",
"role": "user",
"is_active": true,
"credits": 1000,
"allowed_modules": null,
"assigned_site_id": null,
"is_agent_only": false,
"reseller_id": null,
"parent_user_id": null,
"locale": "tr",
"app_name": null,
"app_logo_url": null,
"app_primary_color": null,
"sites": [
{
"id": 1,
"name": "Demo Site",
"domain": "example.com",
"is_active": true
}
]
},
"stats": {
"sites_count": 1,
"credits": 1000,
"monthly_usage": 0
},
"usage": {
"messages_sent": 0,
"ai_calls": 0,
"voice_minutes": 0
},
"modules": [
"appointment",
"saas"
]
}
Example response (401):
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcı profilini güncelle (ad, e-posta, parola).
requires authentication
Example request:
curl --request PUT \
"https://dowaba.com/api/auth/profile" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Test Kullanıcı\",
\"email\": \"user@example.com\",
\"phone\": \"+905551234567\"
}"
const url = new URL(
"https://dowaba.com/api/auth/profile"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Test Kullanıcı",
"email": "user@example.com",
"phone": "+905551234567"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/profile';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Test Kullanıcı',
'email' => 'user@example.com',
'phone' => '+905551234567',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"user": {
"id": 42,
"name": "Test Kullanıcı",
"email": "u***@example.com",
"phone": "+90 555 *** ** **"
},
"message": "Profil güncellendi."
}
Example response (422, Mevcut parola hatalı):
{
"success": false,
"error": "Mevcut parolanız hatalı."
}
Example response (422, Doğrulama hatası):
{
"message": "The given data was invalid.",
"errors": {
"new_password": "[REDACTED]"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
2FA
Kullanıcının kurulu 2FA metodları + recovery code sayısı.
Example request:
curl --request GET \
--get "https://dowaba.com/api/profile/2fa/methods"const url = new URL(
"https://dowaba.com/api/profile/2fa/methods"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/profile/2fa/methods';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
2FA - Login
Login challenge öncesi SMS/Email yöntemi seçildiğinde kod tetikler. TOTP için gereksiz (kod uygulamadan üretilir).
Example request:
curl --request POST \
"https://dowaba.com/api/auth/2fa/send-code" \
--header "Content-Type: application/json" \
--data "{
\"interim_token\": null,
\"method\": \"email\"
}"
const url = new URL(
"https://dowaba.com/api/auth/2fa/send-code"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"interim_token": null,
"method": "email"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/2fa/send-code';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'interim_token' => null,
'method' => 'email',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
interim_token + method + code → full sanctum token. Yanlış kod 5 deneme/saat per token (RateLimiter).
Example request:
curl --request POST \
"https://dowaba.com/api/auth/2fa/challenge" \
--header "Content-Type: application/json" \
--data "{
\"interim_token\": null,
\"method\": \"email\",
\"code\": \"mqeopfu\"
}"
const url = new URL(
"https://dowaba.com/api/auth/2fa/challenge"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"interim_token": null,
"method": "email",
"code": "mqeopfu"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/2fa/challenge';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'interim_token' => null,
'method' => 'email',
'code' => 'mqeopfu',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Recovery code ile bypass. Tek kullanımlık.
Example request:
curl --request POST \
"https://dowaba.com/api/auth/2fa/recovery" \
--header "Content-Type: application/json" \
--data "{
\"interim_token\": null,
\"recovery_code\": \"mqeopfuu\"
}"
const url = new URL(
"https://dowaba.com/api/auth/2fa/recovery"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"interim_token": null,
"recovery_code": "mqeopfuu"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/auth/2fa/recovery';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'interim_token' => null,
'recovery_code' => 'mqeopfuu',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
i18n
Frontend için meta endpoint — desteklenen locale listesi + native etiketler. Dropdown UI bunu çağırır; dil ekleme/çıkarma değişikliği bundle rebuild gerektirmez, sadece config/i18n.php güncellenir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/i18n/meta"const url = new URL(
"https://dowaba.com/api/i18n/meta"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/i18n/meta';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
cache-control: max-age=300, public
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 87
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"supported": [
"tr",
"en",
"ru",
"de",
"ar",
"fr",
"it"
],
"fallback": "tr",
"labels": {
"tr": "Türkçe",
"en": "English",
"ru": "Русский",
"de": "Deutsch",
"ar": "العربية",
"fr": "Français",
"it": "Italiano"
},
"default": "en"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Belirtilen locale'in tüm UI çeviri sözlüğünü nested JSON olarak döner. Public — auth gerekmez (widget cold-start, login öncesi admin gibi unauthenticated senaryolarda da bu endpoint çağrılır). Response shape: { "locale": "tr", "version": "ab12cd34ef56", "translations": { "common": {...}, "admin": {...}, "widget": {...}, ... } } Hata davranışı: - locale supported listede değil → 404 - dosya yok ama supported → 500 (server config eksikliği)
Example request:
curl --request GET \
--get "https://dowaba.com/api/i18n/fu-ud.json"const url = new URL(
"https://dowaba.com/api/i18n/fu-ud.json"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/i18n/fu-ud.json';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 86
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"success": false,
"error": "Locale not supported",
"supported": [
"tr",
"en",
"ru",
"de",
"ar",
"fr",
"it"
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteler
Kullanıcının sitelerini listele. Bayi token'ı ile çağırılırsa bayinin müşterilerinin tüm siteleri de döner (reseller_id cascade).
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"sites": [
{
"id": 1,
"name": "Demo Site",
"domain": "example.com",
"user_id": 42,
"api_key": "[REDACTED]",
"is_active": true,
"system_prompt": "[REDACTED]",
"widget_color": "#4f46e5",
"subscription_id": 7,
"created_at": "2026-05-01T10:00:00.000000Z",
"updated_at": "2026-05-19T14:23:11.000000Z"
}
]
}
Example response (401):
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni site oluştur (hibrit slot/pay_per_site akışı — SUBSCRIPTION_ARCHITECTURE.md): Business slot varsa ücretsiz; slot dolu + bayi ise 402 onay → pay_per_site (3.999₺/yıl); slot yok + bayi değil → 403 requires_upgrade.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Demo Site\",
\"domain\": \"example.com\",
\"widget_color\": \"#4f46e5\",
\"widget_position\": \"bottom-right\",
\"welcome_message\": \"Merhaba, size nasıl yardımcı olabilirim?\",
\"bot_name\": \"Asistan\",
\"ai_enabled\": false,
\"similarity_threshold\": 1,
\"confirm_paid_site\": false,
\"languages\": [
\"tr\"
],
\"default_widget_locale\": \"tr\"
}"
const url = new URL(
"https://dowaba.com/api/sites"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Demo Site",
"domain": "example.com",
"widget_color": "#4f46e5",
"widget_position": "bottom-right",
"welcome_message": "Merhaba, size nasıl yardımcı olabilirim?",
"bot_name": "Asistan",
"ai_enabled": false,
"similarity_threshold": 1,
"confirm_paid_site": false,
"languages": [
"tr"
],
"default_widget_locale": "tr"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Demo Site',
'domain' => 'example.com',
'widget_color' => '#4f46e5',
'widget_position' => 'bottom-right',
'welcome_message' => 'Merhaba, size nasıl yardımcı olabilirim?',
'bot_name' => 'Asistan',
'ai_enabled' => false,
'similarity_threshold' => 1,
'confirm_paid_site' => false,
'languages' => [
'tr',
],
'default_widget_locale' => 'tr',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"site": {
"id": 7,
"name": "Demo Site",
"domain": "example.com",
"api_key": "[REDACTED]",
"user_id": 42,
"subscription_id": 5,
"is_active": true,
"created_at": "2026-05-19T14:23:11.000000Z"
},
"billing": {
"mode": "subscription_slot",
"remaining_slots": 4
}
}
Example response (402, Slot dolu + bayi onayı bekleniyor):
{
"success": false,
"error": "Site slot'unuz dolu. Onaylarsanız bu site için ayrı yıllık lisans (3.999₺) açılır.",
"requires_confirmation": true,
"billing_mode": "pay_per_site",
"annual_price_try": 3999
}
Example response (403, Slot yok + bayi değil — paket yükseltme):
{
"success": false,
"error": "Site limitiniz dolu. Business pakete geçin veya site sayısını arttırın.",
"requires_upgrade": true
}
Example response (403, Slot yok + bayi ama güncel bayilik sözleşmesi onaysız):
{
"success": false,
"error": "Site limitinize ulaştınız. Yeni site açabilmek için güncel bayilik sözleşmesini onaylamanız gerekiyor.",
"requires_reseller_agreement": true
}
Example response (422):
{
"message": "The given data was invalid.",
"errors": {
"domain": [
"The domain has already been taken."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site detaylarını getir.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"data": {
"id": 1,
"name": "Demo Site",
"domain": "example.com",
"user_id": 42,
"api_key": "[REDACTED]",
"is_active": true,
"system_prompt": "[REDACTED]",
"widget_color": "#4f46e5",
"widget_position": "bottom-right",
"gemini_api_key": "[REDACTED]",
"subscription_id": 7,
"settings": {
"max_messages_per_session": 50
},
"faqs_count": 12,
"created_at": "2026-05-01T10:00:00.000000Z",
"updated_at": "2026-05-19T14:23:11.000000Z"
}
}
Example response (403):
{
"message": "This action is unauthorized."
}
Example response (404):
{
"message": "No query results for model [App\\Models\\Site]."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site bilgilerini güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"widget_color\": \"#4CD4ab\",
\"widget_position\": \"bottom-right\",
\"welcome_message\": \"dtdsufvyvddqamniihfqc\",
\"bot_name\": \"oynlazghdtqtqxbajwbpi\",
\"bot_avatar\": \"lpmufinllwloauydlsmsj\",
\"is_active\": false,
\"ai_enabled\": false,
\"appointment_enabled\": false,
\"whatsapp_voice_enabled\": true,
\"daily_outbound_limit\": 20,
\"daily_outbound_message_limit\": 17,
\"outbound_call_hours_start\": \"01:53\",
\"outbound_call_hours_end\": \"01:53\",
\"similarity_threshold\": 1,
\"monthly_ai_limit\": 21,
\"monthly_voice_calls_limit\": 15,
\"settings\": {
\"system_prompt\": \"jcybzvrbyickznkygloig\",
\"response_delay_enabled\": true,
\"response_delay_min\": 13,
\"response_delay_max\": 11,
\"max_call_duration_sec\": 23,
\"kvkk_compliance_mode\": true,
\"kvkk_consent_mode\": true,
\"voice_transfer_enabled\": false,
\"voice_translate_enabled\": true,
\"voice_bot_active\": true,
\"bot_master_active\": false,
\"bot_auto_improve\": true,
\"bot_schedule\": {
\"enabled\": true,
\"timezone\": \"Pacific\\/Chatham\",
\"days\": [
{
\"enabled\": false,
\"start\": \"01:53\",
\"end\": \"01:53\"
}
]
},
\"bot_off_hours\": {
\"message\": \"phlvazjrcnfbaqywuxhgj\",
\"collect_requests\": false,
\"mention_next_open\": true
},
\"faq_buttons_enabled\": false,
\"faq_studio_wizard_done\": false,
\"widget_theme\": {
\"primary\": \"#4CD4ab\",
\"secondary\": \"#4CD4ab\",
\"header_text\": \"#4CD4ab\",
\"chat_bg\": \"#4CD4ab\",
\"bot_bubble_bg\": \"#4CD4ab\",
\"bot_bubble_text\": \"#4CD4ab\",
\"user_bubble_bg\": \"#4CD4ab\",
\"user_bubble_text\": \"#4CD4ab\",
\"launcher_bg\": \"#4CD4ab\",
\"launcher_icon_color\": \"#4CD4ab\"
}
},
\"whatsapp_profile_id\": 17,
\"instagram_profile_id\": 17,
\"external_api_base_url\": \"https:\\/\\/example.com\\/api\",
\"external_api_key\": \"sufvyvddqamniihfqcoyn\",
\"gemini_api_key\": \"lazghdtqtqxbajwbpilpm\",
\"use_reseller_gemini_key\": true,
\"openai_api_key\": \"ufinllwloauydlsmsjury\",
\"use_reseller_openai_key\": false
}"
const url = new URL(
"https://dowaba.com/api/sites/1"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"widget_color": "#4CD4ab",
"widget_position": "bottom-right",
"welcome_message": "dtdsufvyvddqamniihfqc",
"bot_name": "oynlazghdtqtqxbajwbpi",
"bot_avatar": "lpmufinllwloauydlsmsj",
"is_active": false,
"ai_enabled": false,
"appointment_enabled": false,
"whatsapp_voice_enabled": true,
"daily_outbound_limit": 20,
"daily_outbound_message_limit": 17,
"outbound_call_hours_start": "01:53",
"outbound_call_hours_end": "01:53",
"similarity_threshold": 1,
"monthly_ai_limit": 21,
"monthly_voice_calls_limit": 15,
"settings": {
"system_prompt": "jcybzvrbyickznkygloig",
"response_delay_enabled": true,
"response_delay_min": 13,
"response_delay_max": 11,
"max_call_duration_sec": 23,
"kvkk_compliance_mode": true,
"kvkk_consent_mode": true,
"voice_transfer_enabled": false,
"voice_translate_enabled": true,
"voice_bot_active": true,
"bot_master_active": false,
"bot_auto_improve": true,
"bot_schedule": {
"enabled": true,
"timezone": "Pacific\/Chatham",
"days": [
{
"enabled": false,
"start": "01:53",
"end": "01:53"
}
]
},
"bot_off_hours": {
"message": "phlvazjrcnfbaqywuxhgj",
"collect_requests": false,
"mention_next_open": true
},
"faq_buttons_enabled": false,
"faq_studio_wizard_done": false,
"widget_theme": {
"primary": "#4CD4ab",
"secondary": "#4CD4ab",
"header_text": "#4CD4ab",
"chat_bg": "#4CD4ab",
"bot_bubble_bg": "#4CD4ab",
"bot_bubble_text": "#4CD4ab",
"user_bubble_bg": "#4CD4ab",
"user_bubble_text": "#4CD4ab",
"launcher_bg": "#4CD4ab",
"launcher_icon_color": "#4CD4ab"
}
},
"whatsapp_profile_id": 17,
"instagram_profile_id": 17,
"external_api_base_url": "https:\/\/example.com\/api",
"external_api_key": "sufvyvddqamniihfqcoyn",
"gemini_api_key": "lazghdtqtqxbajwbpilpm",
"use_reseller_gemini_key": true,
"openai_api_key": "ufinllwloauydlsmsjury",
"use_reseller_openai_key": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'widget_color' => '#4CD4ab',
'widget_position' => 'bottom-right',
'welcome_message' => 'dtdsufvyvddqamniihfqc',
'bot_name' => 'oynlazghdtqtqxbajwbpi',
'bot_avatar' => 'lpmufinllwloauydlsmsj',
'is_active' => false,
'ai_enabled' => false,
'appointment_enabled' => false,
'whatsapp_voice_enabled' => true,
'daily_outbound_limit' => 20,
'daily_outbound_message_limit' => 17,
'outbound_call_hours_start' => '01:53',
'outbound_call_hours_end' => '01:53',
'similarity_threshold' => 1,
'monthly_ai_limit' => 21,
'monthly_voice_calls_limit' => 15,
'settings' => [
'system_prompt' => 'jcybzvrbyickznkygloig',
'response_delay_enabled' => true,
'response_delay_min' => 13,
'response_delay_max' => 11,
'max_call_duration_sec' => 23,
'kvkk_compliance_mode' => true,
'kvkk_consent_mode' => true,
'voice_transfer_enabled' => false,
'voice_translate_enabled' => true,
'voice_bot_active' => true,
'bot_master_active' => false,
'bot_auto_improve' => true,
'bot_schedule' => [
'enabled' => true,
'timezone' => 'Pacific/Chatham',
'days' => [
[
'enabled' => false,
'start' => '01:53',
'end' => '01:53',
],
],
],
'bot_off_hours' => [
'message' => 'phlvazjrcnfbaqywuxhgj',
'collect_requests' => false,
'mention_next_open' => true,
],
'faq_buttons_enabled' => false,
'faq_studio_wizard_done' => false,
'widget_theme' => [
'primary' => '#4CD4ab',
'secondary' => '#4CD4ab',
'header_text' => '#4CD4ab',
'chat_bg' => '#4CD4ab',
'bot_bubble_bg' => '#4CD4ab',
'bot_bubble_text' => '#4CD4ab',
'user_bubble_bg' => '#4CD4ab',
'user_bubble_text' => '#4CD4ab',
'launcher_bg' => '#4CD4ab',
'launcher_icon_color' => '#4CD4ab',
],
],
'whatsapp_profile_id' => 17,
'instagram_profile_id' => 17,
'external_api_base_url' => 'https://example.com/api',
'external_api_key' => 'sufvyvddqamniihfqcoyn',
'gemini_api_key' => 'lazghdtqtqxbajwbpilpm',
'use_reseller_gemini_key' => true,
'openai_api_key' => 'ufinllwloauydlsmsjury',
'use_reseller_openai_key' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteyi sil (KVKK Md.7 — anonymize cascade + soft delete + 30 gün geri alma). Akış (SiteAnonymizationService::anonymize): - Tüm conversation içerikleri "[Silindi]" yapılır (WA/widget/IG/TG/Msgr/voice) - PII alanları (phone, email, IP, sender_id) SHA-256 hash'lenir - FAQ + document hard delete (fikri mülkiyet, restore audit'ten geri yüklenmez) - Subscription status='cancelled' (fatura izi korunur) - Site row: name='[Silinmiş Site #ID]', settings/api_key NULL, deleted_at=now() - AuditLog: 'site.deleted_anonymized' + snapshot 30 gün penceresinde POST /api/sites/{id}/restore ile geri yüklenebilir. Cron `site:purge-anonymized --days=30` hard delete yapar. Authz (SitePolicy::delete): - Superadmin ✓ - Bağımsız owner ✓ - Bayi cascade (müşterisinin sitesi) ✓ — 2026-05-24 eklendi - Bayi müşterisi ✗ (reseller_id != null) - Sub-user/agent ✗ (parent_user_id != null)
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1"const url = new URL(
"https://dowaba.com/api/sites/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
API anahtarını yeniden üret (eski geçersiz olur). Widget script + 3rd-party entegrasyonlar yeni key ile güncellenir.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/regenerate-key" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/regenerate-key"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/regenerate-key';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"site": {
"id": 1,
"api_key": "[REDACTED]"
},
"message": "API anahtarı yenilendi. Widget ve 3. taraf entegrasyonları yeni key ile güncellenmelidir."
}
Example response (403):
{
"message": "This action is unauthorized."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
External (server-to-server) API anahtarını yeniden üret — `dse_` prefix'li. ───────────────────────────────────────────────────────────────────────── NEDEN EKLENDİ (DM6, 2026-08-08) ───────────────────────────────────────────────────────────────────────── `Site::regenerateExternalApiKey()` bugüne dek HİÇBİR yerden çağrılmıyordu: external anahtarı set etmenin tek yolu `update()`'teki serbest metin alanıydı. Dış Randevu API'si müşteri PII'si döndürdüğü için anahtarın entropisi artık bir güvenlik parametresidir: genel güncelleme yeni `dse_` biçimini ve üretilmiş bir `dse_` anahtarın sonradan her mutasyonunu reddeder; bu uç güvenli rastgele gelen-yön anahtarının TEK üreticisidir. Henüz gelen-yön anahtarı olmayan sitelerde `dse_` olmayan değerler müşterinin kendi GİDEN entegrasyon sırrı olarak geriye uyumlu biçimde kabul edilmeye devam eder. ⚠️ TEK KOLON, ÜÇ TÜKETİCİ: `sites.external_api_key` 1. GELEN — Instagram external uçları (`/api/external/instagram/*`) 2. GELEN — dış Randevu API'si (`/api/external/appointments/*`, DM6) 3. ⚠️ GİDEN — "Canlı veri aktarımı" (custom integration): kolonun İLK anlamı budur (2026_02_07). `UnifiedAIService::callExternalApi()` bu değeri MÜŞTERİNİN KENDİ sunucusuna `?api_key=…` olarak gönderir. Yenilemek ESKİ ANAHTARI ANINDA GEÇERSİZ KILAR: Instagram entegrasyonu yeni anahtarla güncellenmeli, ve site'ta bir `external_api_base_url` tanımlıysa o GİDEN entegrasyonun kimlik doğrulaması da BOZULUR (2026-08-08 hasım denetimi bulgusu — ilk sürüm yalnız Instagram'ı uyarıyordu). Yanıttaki `custom_integration_affected` bayrağı panelin bunu açıkça uyarabilmesi içindir. Simetrik koruma: Dowaba'nın ürettiği `dse_` anahtar bir daha GİDEN çağrıda kullanılmaz (`UnifiedAIService::callExternalApi()` onu tutar) — aksi hâlde randevu PII'sini açan anahtar üçüncü tarafın erişim loglarına düşerdi. ⚠️ Widget anahtarına (`api_key`, `dsk_`) DOKUNMAZ — ayrı kolon, ayrı uç (`regenerate-key`). 2026-05-18 audit ayrımı korunur.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/regenerate-external-key" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/regenerate-external-key"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/regenerate-external-key';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"external_api_key": "[REDACTED]",
"custom_integration_affected": false,
"message": "External API anahtarı yenilendi. Eski anahtar geçersiz oldu; server-to-server entegrasyonlarınızı (Instagram + Randevu) güncelleyin."
}
Example response (403):
{
"message": "This action is unauthorized."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Silinmiş (anonymize edilmiş) siteyi 30 gün penceresinde geri yükle. Mesaj içerikleri GERİ YÜKLENMEZ — anonymize tek-yönlüdür (KVKK kanıt). Sadece site ayarları (name, widget config, vs.) audit snapshot'tan geri döner. Authz: aynı SitePolicy::restore — silebilen geri de yükleyebilir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/restore"const url = new URL(
"https://dowaba.com/api/sites/1/restore"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/restore';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site için tanımlı domain'leri listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/domains"const url = new URL(
"https://dowaba.com/api/sites/1/domains"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/domains';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteye yeni izinli alan adı (domain) ekle. Widget yalnızca buraya eklenmiş domain'lerde çalışır (api_key + domain whitelist). Panelden ekleyen, `authorize('update')` ile zaten sitenin sahibi/yöneticisi olduğu için domain DOĞRUDAN güvenilir kabul edilir (`is_verified=true`) — DNS/meta dansı yok. Gizli `api_key` widget'ın asıl korumasıdır; domain whitelist ikincil anti-abuse'tür ve sahip olmadığın bir domain'i eklemek işine yaramaz (kendi key'ini o domain'e gömemezsin).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/domains" \
--header "Content-Type: application/json" \
--data "{
\"domain\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/domains"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"domain": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/domains';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'domain' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Domain kaydını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/domains/1"const url = new URL(
"https://dowaba.com/api/domains/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/domains/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Domain sahipliğini doğrula (DNS TXT veya meta tag kontrolü).
Example request:
curl --request POST \
"https://dowaba.com/api/domains/1/verify"const url = new URL(
"https://dowaba.com/api/domains/1/verify"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/domains/1/verify';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI ile widget teması üret. Kullanıcının doğal dildeki tema tarifinden ("koyu mor, lüks hissiyat") widget'ın tüm renk paletini + başlatıcı ikonunu üretir (kontrast/erişilebilirlik gözetilir). Sonuç KAYDEDİLMEZ — öneri döner; panel "Kaydet" deyince site update (settings.widget_theme) ile kalıcılaşır. Yetki: site sahibi, bayisi veya superadmin (sites update policy).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/widget-theme/ai" \
--header "Content-Type: application/json" \
--data "{
\"prompt\": \"Koyu lacivert zemin, altın vurgulu lüks bir hava\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/widget-theme/ai"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"prompt": "Koyu lacivert zemin, altın vurgulu lüks bir hava"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/widget-theme/ai';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'prompt' => 'Koyu lacivert zemin, altın vurgulu lüks bir hava',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"summary": "Koyu lacivert üzerine altın vurgulu, lüks bir tema kurdum.",
"theme": {
"primary": "#1e2a4a",
"secondary": "#0f1830",
"header_text": "#f5e6c8",
"chat_bg": "#f7f7f5",
"bot_bubble_bg": "#ffffff",
"bot_bubble_text": "#1e293b",
"user_bubble_bg": "#1e2a4a",
"user_bubble_text": "#f5e6c8",
"launcher_bg": "#1e2a4a",
"launcher_icon_color": "#f5e6c8",
"launcher_icon": "sparkles"
}
}
Example response (422):
{
"success": false,
"error": "no_key"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Otomatik sistem mesajını AI ile güzelle (kaydetmez, öneri döner). "Otomatik Mesajlar" modalındaki alan metnini (boşsa site dilindeki varsayılanı) aynı dilde daha akıcı/profesyonel tek metne dönüştürür. Kullanıcı beğenirse Kaydet ile settings.auto_messages'a yazılır.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/auto-messages/beautify" \
--header "Content-Type: application/json" \
--data "{
\"field\": \"ai_error\",
\"text\": \"Şu an cevap veremiyoruz\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/auto-messages/beautify"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"field": "ai_error",
"text": "Şu an cevap veremiyoruz"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/auto-messages/beautify';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'field' => 'ai_error',
'text' => 'Şu an cevap veremiyoruz',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"text": "Şu anda size yanıt veremiyoruz; mesajınız bize ulaştı ve ekibimiz en kısa sürede dönüş yapacak."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteler — Bilgi Tabanı
Sitenin SSS'lerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/faqs"const url = new URL(
"https://dowaba.com/api/sites/1/faqs"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni SSS oluştur (embedding üretilir).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faqs" \
--header "Content-Type: application/json" \
--data "{
\"question\": \"vmqeopfuudtdsufvyvddq\",
\"answer\": \"amniihfqcoynlazghdtqt\",
\"category\": \"qxbajwbpilpmufinllwlo\",
\"priority\": 1,
\"is_active\": true,
\"media_file_id\": 17,
\"media_file_ids\": [
12,
15
],
\"direct_answer\": true,
\"direct_answer_threshold\": 1
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faqs"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"question": "vmqeopfuudtdsufvyvddq",
"answer": "amniihfqcoynlazghdtqt",
"category": "qxbajwbpilpmufinllwlo",
"priority": 1,
"is_active": true,
"media_file_id": 17,
"media_file_ids": [
12,
15
],
"direct_answer": true,
"direct_answer_threshold": 1
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'question' => 'vmqeopfuudtdsufvyvddq',
'answer' => 'amniihfqcoynlazghdtqt',
'category' => 'qxbajwbpilpmufinllwlo',
'priority' => 1,
'is_active' => true,
'media_file_id' => 17,
'media_file_ids' => [
12,
15,
],
'direct_answer' => true,
'direct_answer_threshold' => 1,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek SSS detayı.
Example request:
curl --request GET \
--get "https://dowaba.com/api/faqs/1"const url = new URL(
"https://dowaba.com/api/faqs/1"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS'yi güncelle (içerik değişirse embedding regen).
Example request:
curl --request PUT \
"https://dowaba.com/api/faqs/1" \
--header "Content-Type: application/json" \
--data "{
\"question\": \"vmqeopfuudtdsufvyvddq\",
\"answer\": \"amniihfqcoynlazghdtqt\",
\"category\": \"qxbajwbpilpmufinllwlo\",
\"priority\": 1,
\"is_active\": false,
\"media_file_id\": 17,
\"media_file_ids\": [
15,
12
],
\"direct_answer\": false,
\"direct_answer_threshold\": 1
}"
const url = new URL(
"https://dowaba.com/api/faqs/1"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"question": "vmqeopfuudtdsufvyvddq",
"answer": "amniihfqcoynlazghdtqt",
"category": "qxbajwbpilpmufinllwlo",
"priority": 1,
"is_active": false,
"media_file_id": 17,
"media_file_ids": [
15,
12
],
"direct_answer": false,
"direct_answer_threshold": 1
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'question' => 'vmqeopfuudtdsufvyvddq',
'answer' => 'amniihfqcoynlazghdtqt',
'category' => 'qxbajwbpilpmufinllwlo',
'priority' => 1,
'is_active' => false,
'media_file_id' => 17,
'media_file_ids' => [
15,
12,
],
'direct_answer' => false,
'direct_answer_threshold' => 1,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS'yi sil. Yetki: 'update' (içerik yönetimi) — 'delete' DEĞİL. SSS silme, SSS ekleme/düzenleme (store/update) ile aynı kategoridedir: site İÇERİĞİ yönetimi. SitePolicy::delete site LIFECYCLE'ıdır (KVKK anonimleştirme + soft-delete) ve bayi müşterisini (reseller_id != null) bilinçli engeller → o gate'e bağlamak müşterinin kendi sitesindeki SSS'yi silmesini yanlışlıkla 403'lüyordu (ekleyebiliyor ama silemiyordu). Müşteri kendi sitesinin owner'ı olduğu için SitePolicy::update owner kısayolundan geçer.
Example request:
curl --request DELETE \
"https://dowaba.com/api/faqs/1"const url = new URL(
"https://dowaba.com/api/faqs/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek SSS için embedding'i yeniden üret.
Example request:
curl --request POST \
"https://dowaba.com/api/faqs/1/regenerate-embedding"const url = new URL(
"https://dowaba.com/api/faqs/1/regenerate-embedding"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/regenerate-embedding';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin tüm SSS embedding'lerini yeniden üret.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faqs/regenerate-all-embeddings"const url = new URL(
"https://dowaba.com/api/sites/1/faqs/regenerate-all-embeddings"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs/regenerate-all-embeddings';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin tüm SSS'lerini toplu sil. Yetki: 'update' (içerik yönetimi) — destroy() ile aynı gerekçe. Toplu silme, toplu ekleme (batchStore) / toplu güncelleme (batchUpdate) ile simetrik içerik işlemidir; bayi müşterisi kendi sitesinde yapabilmeli.
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1/faqs/delete-all"const url = new URL(
"https://dowaba.com/api/sites/1/faqs/delete-all"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs/delete-all';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yapıştırılan metinden AI ile otomatik SSS çıkar.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faqs/extract-from-text" \
--header "Content-Type: application/json" \
--data "{
\"content\": \"vmqeopfuudtdsufvyvddq\",
\"auto_save\": true,
\"product_name\": \"amniihfqcoynlazghdtqt\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faqs/extract-from-text"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"content": "vmqeopfuudtdsufvyvddq",
"auto_save": true,
"product_name": "amniihfqcoynlazghdtqt"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs/extract-from-text';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'content' => 'vmqeopfuudtdsufvyvddq',
'auto_save' => true,
'product_name' => 'amniihfqcoynlazghdtqt',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yüklenen tek bir resimden AI ile SSS soru-cevap üret + MediaFile kaydet. Akış: 1. Multipart file upload (alan adı: image) 2. MediaFile create (user_id scope, 'public' disk, dedupe checksum'a göre) 3. FAQExtractionService::extractFromImage → {question, answer, category} 4. auto_save=true ise FAQ create + embedding üret
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faqs/extract-from-image" \
--header "Content-Type: multipart/form-data" \
--form "caption=Mağazamızın çalışma saatleri tablosu"\
--form "auto_save="\
--form "image=@/tmp/phpehsfvH" const url = new URL(
"https://dowaba.com/api/sites/1/faqs/extract-from-image"
);
const headers = {
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('caption', 'Mağazamızın çalışma saatleri tablosu');
body.append('auto_save', '');
body.append('image', document.querySelector('input[name="image"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs/extract-from-image';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'caption',
'contents' => 'Mağazamızın çalışma saatleri tablosu'
],
[
'name' => 'auto_save',
'contents' => ''
],
[
'name' => 'image',
'contents' => fopen('/tmp/phpehsfvH', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Birden fazla SSS'yi tek seferde toplu oluştur.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faqs/batch" \
--header "Content-Type: application/json" \
--data "{
\"faqs\": [
{
\"question\": \"vmqeopfuudtdsufvyvddq\",
\"answer\": \"amniihfqcoynlazghdtqt\",
\"category\": \"qxbajwbpilpmufinllwlo\",
\"is_active\": true,
\"media_file_id\": 17,
\"media_file_ids\": [
12,
15
]
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faqs/batch"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"faqs": [
{
"question": "vmqeopfuudtdsufvyvddq",
"answer": "amniihfqcoynlazghdtqt",
"category": "qxbajwbpilpmufinllwlo",
"is_active": true,
"media_file_id": 17,
"media_file_ids": [
12,
15
]
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs/batch';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'faqs' => [
[
'question' => 'vmqeopfuudtdsufvyvddq',
'answer' => 'amniihfqcoynlazghdtqt',
'category' => 'qxbajwbpilpmufinllwlo',
'is_active' => true,
'media_file_id' => 17,
'media_file_ids' => [
12,
15,
],
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek bir SSS'yi doğal dil talimatına göre AI ile yeniden yaz (KAYDETMEZ). "SSS Toplu Değiştir" akışının atomudur: frontend, kullanıcının yazdığı tek talimatı (örn. "5551234567 numaralı telefonu kaldır") her SSS için sırayla bu endpoint'e gönderir → küçük payload, timeout yok. Dönen öneri panelde eski/yeni olarak gösterilir; kullanıcı "Kaydet" deyince batchUpdate yazar. Model: gemini-flash-latest SABİT (FaqBulkRewriteService).
Example request:
curl --request POST \
"https://dowaba.com/api/faqs/1/ai-rewrite" \
--header "Content-Type: application/json" \
--data "{
\"instruction\": \"5551234567 numaralı telefonu kaldır, SSS\'leri buna göre düzenle\"
}"
const url = new URL(
"https://dowaba.com/api/faqs/1/ai-rewrite"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"instruction": "5551234567 numaralı telefonu kaldır, SSS'leri buna göre düzenle"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/ai-rewrite';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'instruction' => '5551234567 numaralı telefonu kaldır, SSS\'leri buna göre düzenle',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Birden fazla mevcut SSS'yi tek seferde toplu GÜNCELLE. "SSS Toplu Değiştir" akışının kayıt adımı: kullanıcının onayladığı/düzenlediği yeni soru-cevap-kategorileri tek istekte yazar. Site-scope: yalnız bu siteye ait FAQ id'leri güncellenir (IDOR koruması — başkasının FAQ'sı sessizce atlanır). Embedding garantisi: soru değişende FAQObserver otomatik yeniler; soru aynı kalmış ama embedding'i eksik olan FAQ'lara burada üretilir (varsa boşuna yazılmaz) → kaydettikten sonra ayrıca "Embedding Yenile" gerekmez.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faqs/batch-update" \
--header "Content-Type: application/json" \
--data "{
\"updates\": [
{
\"id\": 17,
\"question\": \"consequatur\",
\"answer\": \"consequatur\",
\"category\": \"consequatur\"
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faqs/batch-update"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"updates": [
{
"id": 17,
"question": "consequatur",
"answer": "consequatur",
"category": "consequatur"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faqs/batch-update';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'updates' => [
[
'id' => 17,
'question' => 'consequatur',
'answer' => 'consequatur',
'category' => 'consequatur',
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS cevabını AI ile SOHBET ederek güzelleştir/güncelle (KAYDETMEZ). Sistem promtu oluşturucunun (prompt-chat) SSS-cevabı muadili: frontend her turda geçmiş mesajları + soruyu + cevabın mevcut taslağını gönderir → {reply, updated_answer}. Site-scoped (FAQ id gerekmez) → hem "Yeni SSS" hem "SSS Düzenle" modalında çalışır. Kayıt, kullanıcı sohbet modalında "Bunu Kullan" + formda "Güncelle" deyince normal update ile yazılır. Model: gemini-flash-latest SABİT (FaqBulkRewriteService).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faq-answer-chat" \
--header "Content-Type: application/json" \
--data "{
\"messages\": [
{
\"role\": \"user\",
\"content\": \"Cevabı daha samimi yap\"
}
],
\"question\": \"Kargo kaç günde gelir?\",
\"draft\": \"Kargo 2-3 iş gününde teslim edilir.\",
\"locale\": \"tr\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faq-answer-chat"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"messages": [
{
"role": "user",
"content": "Cevabı daha samimi yap"
}
],
"question": "Kargo kaç günde gelir?",
"draft": "Kargo 2-3 iş gününde teslim edilir.",
"locale": "tr"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-answer-chat';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'messages' => [
[
'role' => 'user',
'content' => 'Cevabı daha samimi yap',
],
],
'question' => 'Kargo kaç günde gelir?',
'draft' => 'Kargo 2-3 iş gününde teslim edilir.',
'locale' => 'tr',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Direkt-cevap adaylarını listele (pano).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/faq-direct/candidates?status=pending&per_page=50" \
--header "Content-Type: application/json" \
--data "{
\"status\": \"dismissed\",
\"per_page\": 21
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faq-direct/candidates"
);
const params = {
"status": "pending",
"per_page": "50",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "dismissed",
"per_page": 21
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-direct/candidates';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'status' => 'pending',
'per_page' => '50',
],
'json' => [
'status' => 'dismissed',
'per_page' => 21,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Adayları onayla: SSS `direct_answer=true` yapılır + (düzenlenebilir) soru metni `source='traffic'` varyant olarak kaydedilir. Varyant embedding'i senkron üretilir — istek başına 30 aday tavanı bu yüzden.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faq-direct/candidates/approve" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
1,
2
],
\"edits\": {
\"1\": \"fiyat nedir\"
}
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faq-direct/candidates/approve"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
1,
2
],
"edits": {
"1": "fiyat nedir"
}
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-direct/candidates/approve';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
1,
2,
],
'edits' => [
1 => 'fiyat nedir',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Adayları yoksay — listeden düşer, dedupe sayesinde aynı soru tekrar panoya gelmez. Onaylanmış aday bu uçla değiştirilemez.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faq-direct/candidates/dismiss" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
3,
4
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faq-direct/candidates/dismiss"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
3,
4
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-direct/candidates/dismiss';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
3,
4,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Direkt-cevap tasarruf metriği: pencere içinde AI'sız verbatim cevaplanan soru sayısı (ai_loop_traces, termination_reason='faq_direct') + tahmini kredi tasarrufu (aynı penceredeki sohbet-kanalı debit ortalaması × sayı; kredi hareketi yoksa null — kendi-key'li sitede kredi kavramı yok). NOT: sayım telemetriye dayanır — AI_LOOP_TRACE_ENABLED=false yapılırsa verbatim çalışmaya devam eder ama metrik 0 gösterir (bilinçli).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/faq-direct/stats?days=30" \
--header "Content-Type: application/json" \
--data "{
\"days\": 21
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faq-direct/stats"
);
const params = {
"days": "30",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"days": 21
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-direct/stats';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'days' => '30',
],
'json' => [
'days' => 21,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hesap-geneli direkt-cevap özeti (Dashboard kartı): erişilebilir tüm sitelerdeki bekleyen aday toplamı + son 30 günde AI'sız cevaplanan soru sayısı + en çok adayı bekleyen site (kart tıklaması oraya gider). Kapsam: authz cascade `accessibleSiteIds` (ham pivot sorgusu YOK).
Example request:
curl --request GET \
--get "https://dowaba.com/api/faq-direct/overview"const url = new URL(
"https://dowaba.com/api/faq-direct/overview"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faq-direct/overview';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS'nin soru varyantlarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/faqs/1/variants"const url = new URL(
"https://dowaba.com/api/faqs/1/variants"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/variants';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Varyant(lar) kaydet (elle ya da onaylanmış AI önerileri).
Example request:
curl --request POST \
"https://dowaba.com/api/faqs/1/variants" \
--header "Content-Type: application/json" \
--data "{
\"questions\": [
\"kaç para\",
\"ne kadar tutar\"
],
\"source\": \"manual\"
}"
const url = new URL(
"https://dowaba.com/api/faqs/1/variants"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"questions": [
"kaç para",
"ne kadar tutar"
],
"source": "manual"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/variants';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'questions' => [
'kaç para',
'ne kadar tutar',
],
'source' => 'manual',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI ile varyant önerisi üret (KAYDETMEZ — kullanıcı onaylayınca store çağrılır). Mevcut varyant ve kanonikle çakışan öneriler elenmiş döner.
Example request:
curl --request POST \
"https://dowaba.com/api/faqs/1/variants/generate"const url = new URL(
"https://dowaba.com/api/faqs/1/variants/generate"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/variants/generate';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Varyant düzenle / aktif-pasif yap (soru değişirse embedding yeniden üretilir).
Example request:
curl --request PATCH \
"https://dowaba.com/api/faq-variants/1" \
--header "Content-Type: application/json" \
--data "{
\"question\": \"kaç para\",
\"is_active\": true
}"
const url = new URL(
"https://dowaba.com/api/faq-variants/1"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"question": "kaç para",
"is_active": true
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faq-variants/1';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'question' => 'kaç para',
'is_active' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Varyant sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/faq-variants/1"const url = new URL(
"https://dowaba.com/api/faq-variants/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faq-variants/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS'nin cevap varyantlarını listele. Kanonik cevap listede DÖNMEZ (o `faqs.answer` alanıdır) — burada yalnız alternatif metinler vardır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/faqs/1/answer-variants"const url = new URL(
"https://dowaba.com/api/faqs/1/answer-variants"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/answer-variants';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cevap varyant(lar)ı kaydet. Kanonik cevapla ve mevcut varyantlarla normalize-dedupe edilir; tavanı aşanlar `skipped` listesinde gerekçesiyle döner (istek 422 OLMAZ).
Example request:
curl --request POST \
"https://dowaba.com/api/faqs/1/answer-variants" \
--header "Content-Type: application/json" \
--data "{
\"answers\": [
\"Rica ederim!\",
\"Ne demek, her zaman.\"
],
\"source\": \"manual\"
}"
const url = new URL(
"https://dowaba.com/api/faqs/1/answer-variants"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"answers": [
"Rica ederim!",
"Ne demek, her zaman."
],
"source": "manual"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/answer-variants';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'answers' => [
'Rica ederim!',
'Ne demek, her zaman.',
],
'source' => 'manual',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"variants": [
{
"id": 12,
"faq_id": 3,
"answer": "Rica ederim!",
"source": "manual",
"is_active": true
}
],
"skipped": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI ile CEVAP varyantı önerisi üret (KAYDETMEZ). AI, SSS'nin kanonik cevabının alternatif ifadelerini önerir; olgular (fiyat/tarih/saat/URL/telefon) birebir korunur. Kullanıcı önerileri düzenleyip onaylayınca `POST faqs/{faq}/answer-variants` ucuna `source=ai` ile gönderilir. Kanonik cevapla ve mevcut varyantlarla çakışan öneriler elenmiş döner.
Example request:
curl --request POST \
"https://dowaba.com/api/faqs/1/answer-variants/generate"const url = new URL(
"https://dowaba.com/api/faqs/1/answer-variants/generate"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faqs/1/answer-variants/generate';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"suggestions": [
"Ne demek, her zaman!",
"Rica ederim, iyi günler dilerim."
]
}
Example response (422, AI anahtarı yok):
{
"success": false,
"error": "no_key",
"message": "AI anahtarı bulunamadı. Ayarlar → Genel & Yapay Zeka sayfasından anahtar ekleyin veya AI paketi alın."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cevap varyantını düzenle / aktif-pasif yap. Pasifleştirme varyantı havuzdan çıkarır (satır silinmez) ve faqs.answer_variant_count sayacını günceller.
Example request:
curl --request PATCH \
"https://dowaba.com/api/faq-answer-variants/1" \
--header "Content-Type: application/json" \
--data "{
\"answer\": \"Rica ederim!\",
\"is_active\": true
}"
const url = new URL(
"https://dowaba.com/api/faq-answer-variants/1"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"answer": "Rica ederim!",
"is_active": true
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faq-answer-variants/1';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'answer' => 'Rica ederim!',
'is_active' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cevap varyantını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/faq-answer-variants/1"const url = new URL(
"https://dowaba.com/api/faq-answer-variants/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/faq-answer-variants/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS paylaşımlarını listeler: sitenin giden/gelen paylaşımları + kullanıcıya gelen bekleyen teklifler (hedef site kabulde seçildiği için teklifler kullanıcı-bazlıdır).
requires authentication
Bu sitenin SSS'lerini başka bir kullanıcıya paylaşmayı teklif eder (alıcı kabul ederken kendi hedef sitesini seçer).
requires authentication
Bu sitenin SSS'lerini aktörün yönettiği BAŞKA bir siteye handshake'siz bağlar (aynı sahip / bayi cascade). Hedef site de aktörün yönetiminde olmalı.
requires authentication
Bu siteye paylaşılan (canlı) yabancı SSS'leri kaynak site bazında SALT-OKUNUR listeler — düzenleme/silme kaynak sitededir.
requires authentication
Paylaşım teklifini kabul eder — kullanıcı hedef sitesini seçer, kaynak SSS'ler o sitenin bot tarama havuzuna eklenir.
requires authentication
Paylaşım teklifini reddeder.
requires authentication
Aktif paylaşımı kaynak taraf geri çeker — anında etkili.
requires authentication
Aktif paylaşımı hedef taraf bırakır ("artık kullanmıyorum") — anında etkili.
requires authentication
Paylaşımı geçici olarak aç/kapat. Kaynak site tarafı source, hedef site tarafı target anahtarını yönetir; ikisi de açıksa paylaşım canlıdır.
requires authentication
Açtığınız bekleyen teklifi iptal eder.
requires authentication
Bundle (e-ticaret / 3. taraf entegrasyon) manifest URL'inden function paketini içe aktar.
Manifest formatı: https://example.com/.well-known/dowaba-bundle.json (schema_version=1.0).
Manifest → SiteConnection + FunctionDefinition[] yaratır; mevcut bundle adı zaten varsa
409 Conflict döner (?replace=true ile üzerine yazılır).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/bundles/import" \
--header "Content-Type: application/json" \
--data "{
\"manifest\": [],
\"manifest_url\": \"https:\\/\\/example.com\\/.well-known\\/dowaba-bundle.json\",
\"api_key\": \"bundle_secret_token\",
\"replace\": false
}"
const url = new URL(
"https://dowaba.com/api/sites/1/bundles/import"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"manifest": [],
"manifest_url": "https:\/\/example.com\/.well-known\/dowaba-bundle.json",
"api_key": "bundle_secret_token",
"replace": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bundles/import';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'manifest' => [],
'manifest_url' => 'https://example.com/.well-known/dowaba-bundle.json',
'api_key' => 'bundle_secret_token',
'replace' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Başarılı):
{
"ok": true,
"connection": {
"id": 42,
"name": "Shopify",
"type": "http_api"
},
"functions": {
"created": [
{
"id": 101,
"slug": "shopify_get_orders"
}
],
"updated": []
},
"note": "Eklenen fonksiyonlar pasif durumda. Aşağıdaki listeden tek tek aktive et."
}
Example response (409, Zaten import edilmiş):
{
"error": "already_imported",
"message": "...",
"existing_connection_id": 7
}
Example response (422, Manifest hatası):
{
"error": "schema_invalid",
"message": "..."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteler — SSS Stüdyosu
Oyun Odası deneme sohbeti Site botunu simülasyon kanalında çalıştırır ve cevabı "neden böyle cevapladı" telemetrisiyle döner. `mode=both` iki koşum yapar: önce ⚡direkt-cevap kapısı (yalnız embedding, Gemini yok), sonra 🤖AI yolu. Yan etki YOKTUR: yan-etkili fonksiyonlar dry-run stub'lanır, mesaj kutusuna hiçbir şey düşmez, SSS istatistikleri ve direkt-cevap aday panosu kirlenmez. Gerçek motor maliyeti krediden düşer (`trace.credits` = tahmini tutar).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/playground/chat" \
--header "Content-Type: application/json" \
--data "{
\"message\": \"Kargo ücreti ne kadar?\",
\"session_id\": \"9f1c2b7a-1d1e-4c2a-9d13-0b0c1c1a2b3c\",
\"mode\": \"both\",
\"channel_style\": \"whatsapp\",
\"drafts\": [
{
\"question\": \"Kargo kaç günde gelir?\",
\"answer\": \"Siparişler 1-3 iş gününde kargoya verilir.\"
}
],
\"draft_relations\": [
{
\"source_ref\": 12,
\"target_ref\": -1,
\"button_label\": \"Kargo süresi\"
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/playground/chat"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"message": "Kargo ücreti ne kadar?",
"session_id": "9f1c2b7a-1d1e-4c2a-9d13-0b0c1c1a2b3c",
"mode": "both",
"channel_style": "whatsapp",
"drafts": [
{
"question": "Kargo kaç günde gelir?",
"answer": "Siparişler 1-3 iş gününde kargoya verilir."
}
],
"draft_relations": [
{
"source_ref": 12,
"target_ref": -1,
"button_label": "Kargo süresi"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/chat';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'message' => 'Kargo ücreti ne kadar?',
'session_id' => '9f1c2b7a-1d1e-4c2a-9d13-0b0c1c1a2b3c',
'mode' => 'both',
'channel_style' => 'whatsapp',
'drafts' => [
[
'question' => 'Kargo kaç günde gelir?',
'answer' => 'Siparişler 1-3 iş gününde kargoya verilir.',
],
],
'draft_relations' => [
[
'source_ref' => 12,
'target_ref' => -1,
'button_label' => 'Kargo süresi',
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"session_id": "9f1c2b7a-1d1e-4c2a-9d13-0b0c1c1a2b3c",
"mode": "both",
"answer": "Kargo ücreti 49₺.",
"media_urls": [],
"buttons": [
{
"target_faq_id": 31,
"label": "Teslimat süresi",
"delivery_mode": "direct",
"draft": false
}
],
"silent": false,
"reason": "faq_direct",
"reason_tr": null,
"ai_error": null,
"ai_error_detail": null,
"trace": {
"turns": 0,
"gemini_calls": 0,
"tool_calls": [],
"tokens": {
"prompt": 0,
"output": 0,
"thinking": 0,
"cached": 0,
"total": 0
},
"credits": 0,
"model": null,
"termination_reason": "faq_direct",
"faq_prefetch_ids": [
12,
31
],
"external_get": false
},
"direct": {
"verbatim": true,
"faq_id": 12,
"score": 0.94,
"margin": 0.11,
"threshold": 0.9,
"reasons": []
},
"ai": {
"answer": "Kargo ücretimiz 49₺'dir.",
"silent": false,
"trace": {
"turns": 1
}
}
}
Example response (403):
{
"message": "This action is unauthorized."
}
Example response (429):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Persona kartları + kota Oyun Odası'nın bot-bota sekmesini açan meta ucu: seçilebilir persona kartları (config/playground.php tek otorite), aylık ORTAK soru kotası (bot sınavıyla paylaşılır) ve istemci doğrulaması için tavan değerleri.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/playground/personas"const url = new URL(
"https://dowaba.com/api/sites/1/playground/personas"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/personas';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"personas": [
{
"key": "aceleci",
"label": "Aceleci müşteri",
"description": "Kısa yazar, hemen net cevap ister."
}
],
"quota": {
"limit": 200,
"used": 20,
"remaining": 180,
"exam_questions": 18,
"dialog_turns": 2
},
"limits": {
"max_turns": 8,
"max_run_all": 10,
"max_scenarios": 50
}
}
Example response (403):
{
"message": "This action is unauthorized."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gerçek trafikten örnek sorular Sitenin KENDİ son müşteri sorularını döner — Oyun Odası'nda "gerçek bir soruyla dene" ve senaryo açılış mesajı için. Kaynak: AI telemetrisi (`ai_loop_traces` alıntıları, simülasyon satırları hariç); yetersizse kanal mesaj geçmişi. Emoji/tepki/dolgu mesajlar elenir. KVKK: yalnız kendi tenant verisi (panelde zaten görünür); içeriği silinmiş (retention purge) kayıtlar zaten NULL'dur ve listeye girmez.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/playground/sample-questions?limit=20&days=30" \
--header "Content-Type: application/json" \
--data "{
\"days\": 21
}"
const url = new URL(
"https://dowaba.com/api/sites/1/playground/sample-questions"
);
const params = {
"limit": "20",
"days": "30",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"days": 21
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/sample-questions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'limit' => '20',
'days' => '30',
],
'json' => [
'days' => 21,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"questions": [
{
"question": "kargo kaç günde gelir",
"expected_hint": null
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bot-bota diyalog başlat Persona botu (müşteri) ile site botunu karşılıklı konuşturur. Çağrı KUYRUĞA ALIR ve hemen döner; ilerleme `GET .../dialogs/{dialog}` ile izlenir. Her müşteri turu aylık sınav kotasından 1 soru harcar. Bot ana şalteri kapalı sitede diyalog BAŞLATILAMAZ (`bot_disabled`) — kapalı botun davranışını otomatik koşumda ölçmek yanıltıcı olur (manuel deneme sohbeti bu kapıya tabi değildir).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/playground/dialogs" \
--header "Content-Type: application/json" \
--data "{
\"persona_key\": \"fiyat\",
\"goal\": \"Toplam kurulum maliyetini öğrenmek\",
\"opening_message\": \"merhaba fiyat bilgisi alabilir miyim\",
\"max_turns\": 6,
\"success_criteria\": \"Bot net bir fiyat aralığı verdi\",
\"apply_drafts\": false,
\"drafts\": [
{
\"question\": \"Kurulum ücreti var mı?\",
\"answer\": \"Kurulum ücretsizdir.\",
\"image_urls\": [
\"auydlsmsjuryvojcybzvr\"
]
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/playground/dialogs"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"persona_key": "fiyat",
"goal": "Toplam kurulum maliyetini öğrenmek",
"opening_message": "merhaba fiyat bilgisi alabilir miyim",
"max_turns": 6,
"success_criteria": "Bot net bir fiyat aralığı verdi",
"apply_drafts": false,
"drafts": [
{
"question": "Kurulum ücreti var mı?",
"answer": "Kurulum ücretsizdir.",
"image_urls": [
"auydlsmsjuryvojcybzvr"
]
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/dialogs';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'persona_key' => 'fiyat',
'goal' => 'Toplam kurulum maliyetini öğrenmek',
'opening_message' => 'merhaba fiyat bilgisi alabilir miyim',
'max_turns' => 6,
'success_criteria' => 'Bot net bir fiyat aralığı verdi',
'apply_drafts' => false,
'drafts' => [
[
'question' => 'Kurulum ücreti var mı?',
'answer' => 'Kurulum ücretsizdir.',
'image_urls' => [
'auydlsmsjuryvojcybzvr',
],
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"dialog": {
"id": 12,
"status": "pending",
"max_turns": 8,
"turns": [],
"credits": 0
}
}
Example response (422):
{
"success": false,
"error": "quota_exceeded"
}
Example response (429):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Diyalog durumu (polling ucu) `status` pending|running iken panel bu ucu yoklar. Bitince `verdict` dolar: hakem hükmü + gerekçe + botun cevaplayamadığı sorular ("tek tıkla SSS taslağı" bu listeden beslenir) + koşumda devrede olan SSS id'leri.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/playground/dialogs/1"const url = new URL(
"https://dowaba.com/api/sites/1/playground/dialogs/1"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/dialogs/1';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"dialog": {
"id": 12,
"status": "completed",
"turns_used": 4,
"max_turns": 8,
"credits": 0.0042,
"error": null,
"error_tr": null,
"turns": [
{
"role": "customer",
"text": "merhaba fiyat?",
"trace_summary": null
},
{
"role": "bot",
"text": "Fiyatımız 499₺.",
"trace_summary": {
"turns": 1,
"tools": [],
"faq_ids": [
31
]
}
}
],
"verdict": {
"passed": true,
"judge_reasoning": "Bot net fiyat verdi.",
"used_faq_ids": [
31
],
"unanswered": []
}
}
}
Example response (404):
{
"message": "Not Found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Diyaloğu durdur Koşan zincir bir sonraki turun başında biter; o ana kadarki turlar korunur. Durdurulan koşumda hakem hükmü ÜRETİLMEZ.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/playground/dialogs/1/stop"const url = new URL(
"https://dowaba.com/api/sites/1/playground/dialogs/1/stop"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/dialogs/1/stop';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"dialog": {
"id": 12,
"status": "stopped"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Senaryo listesi
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/playground/scenarios"const url = new URL(
"https://dowaba.com/api/sites/1/playground/scenarios"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/scenarios';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"scenarios": [
{
"id": 3,
"name": "Fiyat pazarlığı",
"persona_key": "[REDACTED]",
"goal": "Net fiyat almak",
"max_turns": 6,
"last_run_passed": true,
"last_dialog_id": 12
}
],
"count": 1,
"max": 50
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Senaryo kaydet Kaydetmek koşum BAŞLATMAZ — çalıştırmak için `.../scenarios/{id}/run`. Site başına senaryo tavanı doluysa 422 `too_many_scenarios` döner (kütüphane kısa bir regresyon listesidir, arşiv değildir).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/playground/scenarios" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Fiyat pazarlığı\",
\"persona_key\": \"fiyat\",
\"goal\": \"Net fiyat almak\",
\"opening_message\": \"merhaba fiyat nedir\",
\"success_criteria\": \"Bot fiyat aralığı verdi\",
\"max_turns\": 6
}"
const url = new URL(
"https://dowaba.com/api/sites/1/playground/scenarios"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Fiyat pazarlığı",
"persona_key": "fiyat",
"goal": "Net fiyat almak",
"opening_message": "merhaba fiyat nedir",
"success_criteria": "Bot fiyat aralığı verdi",
"max_turns": 6
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/scenarios';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Fiyat pazarlığı',
'persona_key' => 'fiyat',
'goal' => 'Net fiyat almak',
'opening_message' => 'merhaba fiyat nedir',
'success_criteria' => 'Bot fiyat aralığı verdi',
'max_turns' => 6,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"scenario": {
"id": 3,
"name": "Fiyat pazarlığı"
}
}
Example response (422):
{
"success": false,
"error": "too_many_scenarios"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tümünü çalıştır En çok `max_run_all` (varsayılan 10) senaryoyu SIRAYLA kuyruğa alır. Kota biterse kalanlar başlatılmaz ve `skipped` listesinde gerekçesiyle döner — çağrı yine 200'dür (kısmi başarı normaldir).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/playground/scenarios/run-all" \
--header "Content-Type: application/json" \
--data "{
\"scenario_ids\": [
3,
4
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/playground/scenarios/run-all"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"scenario_ids": [
3,
4
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/scenarios/run-all';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'scenario_ids' => [
3,
4,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"started": [
{
"scenario_id": 3,
"dialog_id": 12
}
],
"skipped": [
{
"scenario_id": 4,
"error": "quota_exceeded"
}
]
}
Example response (429):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Senaryo güncelle Yalnız gönderilen alanlar değişir. Son koşum rozeti (`last_run_*`) istemciden GÜNCELLENEMEZ — onu yalnız koşum motoru yazar.
Example request:
curl --request PATCH \
"https://dowaba.com/api/sites/1/playground/scenarios/17"const url = new URL(
"https://dowaba.com/api/sites/1/playground/scenarios/17"
);
fetch(url, {
method: "PATCH",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/scenarios/17';
$response = $client->patch($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"scenario": {
"id": 3,
"name": "Fiyat pazarlığı v2"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Senaryo sil Koşum kayıtları (dialogs) SİLİNMEZ; yalnız senaryo bağı kopar.
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1/playground/scenarios/17"const url = new URL(
"https://dowaba.com/api/sites/1/playground/scenarios/17"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/scenarios/17';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Senaryoyu çalıştır Senaryodan bir bot-bota diyalog başlatır (kuyruğa alır) ve senaryonun son koşum rozetini o diyaloğa bağlar. Aylık soru kotasına tabidir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/playground/scenarios/17/run"const url = new URL(
"https://dowaba.com/api/sites/1/playground/scenarios/17/run"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/playground/scenarios/17/run';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"dialog_id": 12
}
Example response (422):
{
"success": false,
"error": "quota_exceeded"
}
Example response (429):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS Uzayı düğüm (node) ve ilişkilerini (edge) getirir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/faq-universe/graph"const url = new URL(
"https://dowaba.com/api/sites/1/faq-universe/graph"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-universe/graph';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS kümeleme analizini KUYRUĞA ALIR (asenkron). Büyük sitede (200+ SSS) tek Gemini turu dakikalar sürüyor ve senkron HTTP'de altyapı timeout'una takılıyordu. Uç artık analizi çalıştırmaz, yalnız `AnalyzeFaqGraphJob`'ı kuyruğa atar; panel `analyze-status` ucundan durumu yoklar. Aynı sitede ikinci koşum reddedilir (409).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faq-universe/analyze"const url = new URL(
"https://dowaba.com/api/sites/1/faq-universe/analyze"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-universe/analyze';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"status": "running"
}
Example response (409):
{
"success": false,
"status": "running",
"error": "already_running",
"message": "Bu site için kümeleme zaten sürüyor."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kümeleme işinin durumunu döndürür (panel 3 saniyede bir yoklar). `status`: idle (hiç koşmadı / kayıt düştü) · running · done · failed. `analysis` YALNIZ done durumunda dolar; failed durumunda `error_tr` kullanıcıya gösterilebilir Türkçe mesajı taşır. `consumed` (done'da) — öneriler YAYINLANDI mı? Panel sayfa açılışında `done && !consumed` kaydı tuvale geri yükler; `consumed` olanı görmezden gelir (yayınlanmış öneri ikinci kez taslak olarak eklenmez).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/faq-universe/analyze-status"const url = new URL(
"https://dowaba.com/api/sites/1/faq-universe/analyze-status"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-universe/analyze-status';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"status": "done",
"consumed": false,
"analysis": {
"faq_updates": [],
"new_faqs": [],
"edges": []
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kümeleme önerilerini "tüketildi" işaretler (panel YAYIN başarılı olunca çağırır). Öneri paketi 24 saat cache'te durur ve panel her açılışta tüketilmemiş olanı tuvale geri yükler. Yayınlanan öneriler artık kayıtlı SSS'lerdir → ikinci kez taslak olarak eklenmemeleri için kayıt burada damgalanır. İdempotent ve YUMUŞAK: kayıt yoksa, süresi dolmuşsa ya da zaten tüketilmişse de 200 döner (panel bunu best-effort çağırır; başarısızlığı yayını geçersiz kılmaz).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faq-universe/analyze-ack"const url = new URL(
"https://dowaba.com/api/sites/1/faq-universe/analyze-ack"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-universe/analyze-ack';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"status": "done",
"consumed": true
}
Example response (200):
{
"success": true,
"status": "idle",
"consumed": false
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS düğümlerini, ilişkilerini ve yeni SSS'leri atomik olarak yayınlar.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/faq-universe/publish" \
--header "Content-Type: application/json" \
--data "{
\"nodes\": [
{
\"id\": \"consequatur\",
\"button_label\": \"mqeopfuudtdsufvyv\",
\"delivery_mode\": \"ai_context\"
}
],
\"edges\": [
{
\"source_id\": \"consequatur\",
\"target_id\": \"consequatur\",
\"button_label\": \"mqeopfuudtdsufvyv\",
\"delivery_mode\": \"direct\"
}
],
\"new_faqs\": [
{
\"question\": \"consequatur\",
\"answer\": \"consequatur\",
\"button_label\": \"mqeopfuudtdsufvyv\",
\"delivery_mode\": \"ai_context\"
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/faq-universe/publish"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"nodes": [
{
"id": "consequatur",
"button_label": "mqeopfuudtdsufvyv",
"delivery_mode": "ai_context"
}
],
"edges": [
{
"source_id": "consequatur",
"target_id": "consequatur",
"button_label": "mqeopfuudtdsufvyv",
"delivery_mode": "direct"
}
],
"new_faqs": [
{
"question": "consequatur",
"answer": "consequatur",
"button_label": "mqeopfuudtdsufvyv",
"delivery_mode": "ai_context"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/faq-universe/publish';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'nodes' => [
[
'id' => 'consequatur',
'button_label' => 'mqeopfuudtdsufvyv',
'delivery_mode' => 'ai_context',
],
],
'edges' => [
[
'source_id' => 'consequatur',
'target_id' => 'consequatur',
'button_label' => 'mqeopfuudtdsufvyv',
'delivery_mode' => 'direct',
],
],
'new_faqs' => [
[
'question' => 'consequatur',
'answer' => 'consequatur',
'button_label' => 'mqeopfuudtdsufvyv',
'delivery_mode' => 'ai_context',
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteler — AI Analiz
SSS analizi: müşteri mesajlarını tarar, eklenebilecek yeni SSS'leri, güncellenecek mevcut SSS'leri, çelişkileri ve botun hatalı cevaplarını çıkarır.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/analysis/faqs"const url = new URL(
"https://dowaba.com/api/sites/1/analysis/faqs"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/analysis/faqs';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Onaylanan SSS önerilerini uygula. new_faqs create, faq_updates update edilir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/analysis/faqs/apply" \
--header "Content-Type: application/json" \
--data "{
\"new_faqs\": [
{
\"question\": \"vmqeopfuudtdsufvyvddq\",
\"answer\": \"amniihfqcoynlazghdtqt\",
\"category\": \"qxbajwbpilpmufinllwlo\"
}
],
\"faq_updates\": [
{
\"faq_id\": 17,
\"question\": \"mqeopfuudtdsufvyvddqa\",
\"answer\": \"mniihfqcoynlazghdtqtq\",
\"category\": \"xbajwbpilpmufinllwloa\"
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/analysis/faqs/apply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"new_faqs": [
{
"question": "vmqeopfuudtdsufvyvddq",
"answer": "amniihfqcoynlazghdtqt",
"category": "qxbajwbpilpmufinllwlo"
}
],
"faq_updates": [
{
"faq_id": 17,
"question": "mqeopfuudtdsufvyvddqa",
"answer": "mniihfqcoynlazghdtqtq",
"category": "xbajwbpilpmufinllwloa"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/analysis/faqs/apply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'new_faqs' => [
[
'question' => 'vmqeopfuudtdsufvyvddq',
'answer' => 'amniihfqcoynlazghdtqt',
'category' => 'qxbajwbpilpmufinllwlo',
],
],
'faq_updates' => [
[
'faq_id' => 17,
'question' => 'mqeopfuudtdsufvyvddqa',
'answer' => 'mniihfqcoynlazghdtqtq',
'category' => 'xbajwbpilpmufinllwloa',
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bot performans analizi (salt-okunur). Metrikler + AI yorumu + öneriler.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/analysis/bot-performance"const url = new URL(
"https://dowaba.com/api/sites/1/analysis/bot-performance"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/analysis/bot-performance';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Müşteri duygu / memnuniyet analizi (salt-okunur).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/analysis/sentiment"const url = new URL(
"https://dowaba.com/api/sites/1/analysis/sentiment"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/analysis/sentiment';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Trend / sık konuşulan konular analizi (salt-okunur).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/analysis/trends"const url = new URL(
"https://dowaba.com/api/sites/1/analysis/trends"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/analysis/trends';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir sitenin kaydedilmiş raporlarını listele (metadata; result HARİÇ).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/analysis-reports?type=faqs"const url = new URL(
"https://dowaba.com/api/sites/1/analysis-reports"
);
const params = {
"type": "faqs",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/analysis-reports';
$response = $client->get(
$url,
[
'query' => [
'type' => 'faqs',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir analiz sonucunu kaydet.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/analysis-reports" \
--header "Content-Type: application/json" \
--data "{
\"type\": \"faqs\",
\"result\": [],
\"params\": [],
\"title\": \"Mayıs ayı SSS analizi\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/analysis-reports"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"type": "faqs",
"result": [],
"params": [],
"title": "Mayıs ayı SSS analizi"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/analysis-reports';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'type' => 'faqs',
'result' => [],
'params' => [],
'title' => 'Mayıs ayı SSS analizi',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek raporu tam (result dahil) getir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/analysis-reports/1"const url = new URL(
"https://dowaba.com/api/analysis-reports/1"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/analysis-reports/1';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Raporu sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/analysis-reports/1"const url = new URL(
"https://dowaba.com/api/analysis-reports/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/analysis-reports/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bot Sağlığı & Sınav
Karne (bot davranış sağlığı) uçları — ai_loop_traces telemetrisinden site bazlı davranış özeti, cevapsız sorular ve SSS önerisi onay akışı (loop-engineering.md).
Karne özeti
Site'ın AI davranış karnesi: cevaplama/hata/aktarım oranları, ortalama tur, kanal ve gün kırılımı, en sık cevapsız kalan sorular.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/bot-health/summary?days=7" \
--header "Content-Type: application/json" \
--data "{
\"days\": 21
}"
const url = new URL(
"https://dowaba.com/api/sites/1/bot-health/summary"
);
const params = {
"days": "7",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"days": 21
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-health/summary';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'days' => '7',
],
'json' => [
'days' => 21,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"summary": {
"days": 7,
"totals": {
"messages": 120,
"answered": 100
},
"rates": {
"answer_rate": 83.3
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cevapsız sorular
SSS araması boş dönen (bilgi boşluğu) veya hata ile biten gerçek müşteri soruları — tekrar sayısıyla gruplu.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/bot-health/missed-questions?days=30" \
--header "Content-Type: application/json" \
--data "{
\"days\": 21
}"
const url = new URL(
"https://dowaba.com/api/sites/1/bot-health/missed-questions"
);
const params = {
"days": "30",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"days": 21
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-health/missed-questions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'days' => '30',
],
'json' => [
'days' => 21,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"questions": [
{
"question": "kargo kaç günde gelir",
"count": 7,
"faq_miss": true,
"channels": [
"whatsapp"
]
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS önerileri listesi
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/bot-health/suggestions"const url = new URL(
"https://dowaba.com/api/sites/1/bot-health/suggestions"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-health/suggestions';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"suggestions": [
{
"id": 1,
"question": "...",
"suggested_answer": "...",
"status": "draft"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cevapsız sorudan AI taslak SSS önerisi üret
Taslak insan onayı bekler (Kademe 2). Model site bilgisi yoksa cevap UYDURMAZ — needs_info bayrağıyla doldurma şablonu döner.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/bot-health/suggest-faq" \
--header "Content-Type: application/json" \
--data "{
\"question\": \"kargo kaç günde gelir\",
\"occurrences\": 7
}"
const url = new URL(
"https://dowaba.com/api/sites/1/bot-health/suggest-faq"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"question": "kargo kaç günde gelir",
"occurrences": 7
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-health/suggest-faq';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'question' => 'kargo kaç günde gelir',
'occurrences' => 7,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"suggestion": {
"id": 1,
"status": "draft"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Öneriyi onayla → SSS oluştur
FAQ Eloquent ile yaratılır (embedding otomatiği). Kullanıcı metni düzenleyerek onaylayabilir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/bot-health/suggestions/1/approve" \
--header "Content-Type: application/json" \
--data "{
\"question\": \"Kargo kaç günde teslim edilir?\",
\"answer\": \"Siparişler 1-3 iş gününde kargoya verilir.\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/bot-health/suggestions/1/approve"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"question": "Kargo kaç günde teslim edilir?",
"answer": "Siparişler 1-3 iş gününde kargoya verilir."
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-health/suggestions/1/approve';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'question' => 'Kargo kaç günde teslim edilir?',
'answer' => 'Siparişler 1-3 iş gününde kargoya verilir.',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"faq_id": 42
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Öneriyi reddet
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/bot-health/suggestions/1/dismiss"const url = new URL(
"https://dowaba.com/api/sites/1/bot-health/suggestions/1/dismiss"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-health/suggestions/1/dismiss';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sınav listesi
Satırlar tam model olarak döner; meta (JSON) kaynak damgasını taşır —
source=sector sınavlarında meta.sector (panel son seçimi ön-seçer).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/bot-exams"const url = new URL(
"https://dowaba.com/api/sites/1/bot-exams"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-exams';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"exams": [
{
"id": 1,
"name": "SSS sınavı",
"source": "sector",
"status": "completed",
"passed_count": 18,
"meta": {
"sector": "ecommerce"
}
}
],
"quota": {
"limit": 200,
"used": 20,
"remaining": 180
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aylık sınav kotası
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/bot-exams/quota"const url = new URL(
"https://dowaba.com/api/sites/1/bot-exams/quota"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-exams/quota';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"quota": {
"limit": 200,
"used": 20,
"remaining": 180
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sınav oluştur ve başlat
source=manual: questions dizisi zorunlu. source=faq: SSS'lerden otomatik üretilir. source=traces: son gerçek müşteri sorularından üretilir. source=ai: gerçek müşteri KONUŞMALARI analiz edilip benzer ama YENİ sorular AI ile üretilir (~100 mesaj taranır). source=profile: trafik GEREKMEZ — site talimatı + SSS + araç envanterinden AI soru üretir (ipuçlu). source=sector: sektör arketiplerinden (config/bot_exam_sectors.php) işletmeye uyarlanmış sorular üretir; sector alanı zorunludur, sınava meta.sector damgası düşer. source=adversarial: botu ZORLAYAN sorular üretir (tuzak/itiraz/ guvenlik/konu_disi/uslup) — her soru kategorisiyle kaydedilir, judge o kategoriye özgü ek kuralla hüküm verir. source=mixed: HAZIRLIK sınavı — profile + sector + faq + adversarial dilimleri config'teki sabit oranlarla birleşir (count YOK SAYILIR, sector OPSİYONEL: verilmezse o dilim profile'a eklenir), sınava meta.readiness + meta.composition damgası düşer. Bot master kapalıyken sınav başlatılamaz (bot_disabled). Sınav kuyruğa alınır, ilerleme GET /bot-exams/{exam} ile izlenir. Aylık soru kotasına tabidir (mixed ~40 soru harcar).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/bot-exams" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Temmuz SSS kontrolü\",
\"source\": \"faq\",
\"count\": 10,
\"sector\": \"ecommerce\",
\"questions\": [
{
\"question\": \"Kargo kaç günde gelir?\",
\"expected_hint\": \"consequatur\"
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/bot-exams"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Temmuz SSS kontrolü",
"source": "faq",
"count": 10,
"sector": "ecommerce",
"questions": [
{
"question": "Kargo kaç günde gelir?",
"expected_hint": "consequatur"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-exams';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Temmuz SSS kontrolü',
'source' => 'faq',
'count' => 10,
'sector' => 'ecommerce',
'questions' => [
[
'question' => 'Kargo kaç günde gelir?',
'expected_hint' => 'consequatur',
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"exam": {
"id": 3,
"status": "pending",
"total_questions": 10
}
}
Example response (422):
{
"success": false,
"error": "quota_exceeded"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sınav durumu + sonuçlar (polling ucu)
Soru satırları tam model olarak döner: category (bilgi|itiraz|tuzak|guvenlik|
konu_disi|uslup — yalnız adversarial/mixed sınavlarda dolu) ve gen_source
(profile|sector|faq|adversarial — yalnız mixed sınavlarda dolu) dahil.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/bot-exams/1"const url = new URL(
"https://dowaba.com/api/sites/1/bot-exams/1"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-exams/1';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"exam": {
"id": 3,
"status": "running",
"passed_count": 4
},
"questions": [
{
"position": 1,
"question": "...",
"category": "tuzak",
"gen_source": "adversarial",
"status": "passed",
"judge_score": 90
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sınavı iptal et
Koşan zincir bir sonraki soruda durur; koşulmuş sorular korunur.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/bot-exams/1/cancel"const url = new URL(
"https://dowaba.com/api/sites/1/bot-exams/1/cancel"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/bot-exams/1/cancel';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İşletme Sayfası
İşletme Rehberi sayfası yönetimi (panel) — dowaba.com/isletme/{slug}. Site başına TEK sayfa; içerik blok bazlı (katalog config/business_page.php), moderasyon akışı Özel Entegrasyonlar'ın birebir aynısı: draft → submit → pending → superadmin approve/reject → sahibi yayınlar.
Yetki İKİ katman (Monetizasyon v2 — isletme-rehberi.md § 1.1): (1) SitePolicy view/update (authz cascade), (2) kısıtlı hesap guard'ı — agent / alt kullanıcı / bayi müşterisi kapsam DIŞI (sayfa dowaba.com markasında yayınlanır).
⚠️ ÖDEME KAPISI YOK: v1'in "yazma uçlarında aktif ücretli abonelik" şartı (403
subscription_required) KALKTI — hazırlamak, onaya göndermek, yayınlamak ve imzalı
önizlemede görmek her owner'a açıktır (funnel'ın kendisi budur). Ücrete bağlı olan
HERKESE AÇIK YAYINdır ve o eksenin tek otoritesi bambaşkadır:
BusinessPageService::unlockEntitlement() → business_pages.unlocked_at
(aktif YILLIK abonelik ∨ tek seferlik satın alma ∨ superadmin). show cevabındaki
entitlement bloğu panelin teklif kartını besler; kilit kapalıyken sayfa onaylı ve
"yayında" olsa bile public 404'tür (BusinessPage::scopePubliclyVisible).
Panelin "onaylandı, kilit bekliyor" durumu için AYRI bir alan YOKTUR — frontend
status + is_published + entitlement.unlocked üçlüsünden türetir.
Tek otorite doküman: isletme-rehberi.md.
Sayfa + form şeması + yardımcı veriler
requires authentication
Tek çağrıda panelin ihtiyacı olan her şey: sayfa kaydı (yoksa taslak olarak
oluşturulur), blok şemaları (kullanıcı locale'inde etiketli), yönetim kapısı
durumu, YAYIN KİLİDİ durumu (entitlement), sektör/il listeleri, kanal
profillerinden deterministik ön-dolum önerisi ve sitenin SSS'leri (sayfada
gösterilecekleri seçmek için).
entitlement = {unlocked, source, yearly_eligible, price}: panelin teklif kartı
(yıllık pakete geç ↔ tek seferlik satın al) BUNDAN çizilir; fiyat config'ten gelir,
UI'da hardcode YASAK. Aynı çağrıda applyEntitlementStamp ile yıllık hak kolona
yansıtılır (idempotent) — panel her açıldığında damga tazedir, gece cron'u
beklenmez; satın alınmış/admin kilidine dokunulmaz.
SSS listesi SAYFALIDIR: faqs yalnız İLK 50 satırı taşır (binlerce SSS'i olan
sitede cevap şişmesin), toplam sayı faqs_total'da döner ve gerisi
GET .../business-page/faqs?q=&page= ucundan çekilir. selected_faqs ise
sayfada gösterilmek üzere SEÇİLMİŞ SSS'lerin tam satırlarıdır: seçim ilk 50'de
olmasa (ya da pasifleşmiş olsa) bile panel çipini çizebilsin diye ayrı gelir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/business-page" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/business-page"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"page": {
"id": 1,
"slug": "guzellik-merkezi",
"status": "draft",
"public_url": "https://dowaba.com/isletme/guzellik-merkezi"
},
"can_manage": true,
"entitlement": {
"unlocked": false,
"source": null,
"yearly_eligible": false,
"price": 9999
},
"schemas": [],
"sectors": [],
"cities": [],
"prefill": {
"contact": [],
"hours": []
},
"faqs": [],
"faqs_total": 0,
"selected_faqs": []
}
Example response (403):
{
"success": false,
"error": "restricted_account"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sayfayı güncelle
requires authentication
Blok içerikleri + sektör/il/ilçe + SEO alanları. settings KISMİ gönderilebilir:
yalnız gönderilen blok/alanlar değişir, geri kalanı korunur. Tüm içerik
BusinessPageService::sanitizeSettings fail-closed süzgecinden geçer.
ONAYLI sayfada moderasyona tabi bir alan (settings / seo_title / seo_description / sector / city / district) değişirse sayfa yeniden onaya düşer ve yayından kalkar. Slug ASLA değişmez (public URL + arama motoru kararlılığı).
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/business-page" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"sector\": \"beauty\",
\"city\": \"istanbul\",
\"district\": \"Kadıköy\",
\"seo_title\": \"consequatur\",
\"seo_description\": \"consequatur\",
\"settings\": {
\"hero\": {
\"title\": \"Güzellik Merkezi\"
}
}
}"
const url = new URL(
"https://dowaba.com/api/sites/1/business-page"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sector": "beauty",
"city": "istanbul",
"district": "Kadıköy",
"seo_title": "consequatur",
"seo_description": "consequatur",
"settings": {
"hero": {
"title": "Güzellik Merkezi"
}
}
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'sector' => 'beauty',
'city' => 'istanbul',
'district' => 'Kadıköy',
'seo_title' => 'consequatur',
'seo_description' => 'consequatur',
'settings' => [
'hero' => [
'title' => 'Güzellik Merkezi',
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"page": {
"id": 1,
"status": "pending"
},
"requires_reapproval": true
}
Example response (403):
{
"success": false,
"error": "restricted_account"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sayfada gösterilecek SSS'leri ara / sayfala
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/business-page/faqs?q=iade&page=2" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"q\": \"vmqeopfuudtdsufvyvddq\",
\"page\": 1
}"
const url = new URL(
"https://dowaba.com/api/sites/1/business-page/faqs"
);
const params = {
"q": "iade",
"page": "2",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"q": "vmqeopfuudtdsufvyvddq",
"page": 1
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/faqs';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'query' => [
'q' => 'iade',
'page' => '2',
],
'json' => [
'q' => 'vmqeopfuudtdsufvyvddq',
'page' => 1,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"faqs": [
{
"id": 12,
"question": "İade nasıl yapılır?",
"is_active": true,
"hit_count": 42
}
],
"total": 137,
"page": 2,
"has_more": true
}
Example response (403):
{
"success": false,
"error": "restricted_account"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI ile doldur
requires authentication
Sitenin KENDİ verisinden (sistem promptu + onaylı SSS'ler) tanıtım metinlerini üretir: hero, hızlı cevaplar, hizmet listesi + SEO. İletişim/konum/saat/SSS blokları AI'dan GELMEZ (deterministik ön-dolum + elle giriş). Üretilen içerik kullanıcı girdisiyle AYNI sanitize süzgecinden geçirilerek kaydedilir.
Kaynak yoksa (ne sistem promptu ne SSS) LLM'e hiç gidilmez — modelin işletmeyi uydurması engellenir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/business-page/ai-fill" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/business-page/ai-fill"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/ai-fill';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"page": {
"id": 1
},
"schemas": []
}
Example response (422):
{
"success": false,
"error": "no_content",
"message": "Önce sitenizin sistem promptunu yazın veya SSS ekleyin..."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI sohbet sihirbazı
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/business-page/chat" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"messages\": [
{
\"role\": \"user\",
\"content\": \"Hafta içi 9-18 açığız, pazar kapalıyız.\"
}
],
\"locale\": \"tr\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/business-page/chat"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"messages": [
{
"role": "user",
"content": "Hafta içi 9-18 açığız, pazar kapalıyız."
}
],
"locale": "tr"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/chat';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'messages' => [
[
'role' => 'user',
'content' => 'Hafta içi 9-18 açığız, pazar kapalıyız.',
],
],
'locale' => 'tr',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"reply": "Saatleri işledim. Adresinizi de yazar mısınız?",
"draft_settings": {
"hours": {
"days": {
"1": {
"enabled": true,
"start": "09:00",
"end": "18:00"
}
}
}
},
"draft_meta": {
"city": "istanbul"
},
"missing_fields": [
"adres"
],
"done": false
}
Example response (403):
{
"success": false,
"error": "restricted_account"
}
Example response (422):
{
"success": false,
"error": "no_key",
"message": "AI kredisi veya Gemini anahtarı bulunamadı..."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sayfa görseli yükle
requires authentication
İstek başına TEK dosya; galerinin çoklu yüklemesi panelde bu ucun paralel çağrılmasıyla yapılır (her çağrı kendi URL'ini döndürür, sıra panelde tutulur).
Boru hattı (GD, tek geçiş):
- Kabul: JPEG / PNG / WEBP / GIF, kaynak dosya en fazla 15 MB.
- JPEG'de EXIF
Orientationuygulanır (telefonla çekilen yan yatmış fotoğraf düzelir) — EXIF'in kendisi çıktıya TAŞINMAZ (yeniden kodlama konum/cihaz meta verisini siler, KVKK açısından da istenen davranış). - En uzun kenar 3000px'i aşıyorsa oranı korunarak küçültülür (web standardı: retina galeri için fazlasıyla yeterli, dev fotoğraflar sayfayı şişirmez).
- ÇIKTI HER ZAMAN WebP'tir (kalite 82) — alfa kanalı korunur (şeffaf PNG
şeffaf kalır). Dosya adı
business/{siteId}-{40 karakter rastgele}.webp.
⚠️ ANİMASYON KORUNMAZ: animasyonlu GIF'ten yalnız İLK KARE alınır (GD çok kareli kodlama yapamaz); animasyonlu WEBP'i GD derlemelerinin çoğu hiç açamaz → o dosya "işlenemedi" (422) ile reddedilir. Galeri vitrin fotoğrafı içindir, video değil.
⚠️ ÇÖZÜNÜRLÜK TAVANI 40 MP: kaynak tavanı 15 MB olduğu için "küçük dosya / devasa çözünürlük" ile GD'yi OOM'a sokmak mümkündü; boyut GD'den ÖNCE okunup kesilir.
Dönen URL, galeri alanının fail-closed kuralından (sanitizeImageUrl: yalnız
/storage/business/ hattı) geçebilen TEK biçimdir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/business-page/upload" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: multipart/form-data" \
--form "image=@/tmp/phpYXNbu1" const url = new URL(
"https://dowaba.com/api/sites/1/business-page/upload"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('image', document.querySelector('input[name="image"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/upload';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'image',
'contents' => fopen('/tmp/phpYXNbu1', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"url": "https://dowaba.com/storage/business/12-a1b2c3.webp"
}
Example response (422):
{
"success": false,
"message": "Görsel çok büyük (maks. 15 MB)."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Onaya gönder
requires authentication
draft/rejected → pending. 3. taraf içerik dowaba.com domain'inde yayınlandığı için ilk yayın insan gözünden geçer (tos m.15 yasaklı sektör listesi).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/business-page/submit" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/business-page/submit"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/submit';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"page": {
"status": "pending"
}
}
Example response (422):
{
"success": false,
"error": "invalid_status"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yayınla / yayından kaldır
requires authentication
Yalnız ONAYLI sayfada çalışır. İlk yayında OG kartı (GD) üretilir — üretim hatası yayını ASLA kırmaz.
⚠️ "Yayınla" tek başına sayfayı PUBLIC yapmaz (Monetizasyon v2): yayın kilidi
kapalıysa (unlocked_at NULL) /isletme/{slug} 404 kalır ve sayfa hiçbir keşif
katmanına girmez. Bu yüzden yayın anında applyEntitlementStamp ile yıllık hak
kolona yansıtılır — yıllık abone için yayın TEK TIKTA canlıya çıkar, kilitli
kullanıcı ise "onaylandı, kilit bekliyor" durumunda kalır (panel bunu
entitlement.unlocked ile gösterir).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/business-page/publish" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"is_published\": true
}"
const url = new URL(
"https://dowaba.com/api/sites/1/business-page/publish"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"is_published": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/publish';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'is_published' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"page": {
"is_published": true
}
}
Example response (422):
{
"success": false,
"error": "not_approved"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Önizleme linki üret (imzalı, 30 dakika)
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/business-page/preview-link" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/business-page/preview-link"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/preview-link';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"url": "https://dowaba.com/isletme-onizleme/12?expires=1754150400&signature=abc",
"expires_at": "2026-08-02T21:30:00+00:00"
}
Example response (403):
{
"success": false,
"error": "restricted_account"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kilit satın alma (PayTR)
requires authentication
Pending satın alma satırı (business_page_purchases) + PayTR one-shot iFrame
token'ı üretir. Panel dönen token'la https://www.paytr.com/odeme/guvenli/{token}
adresini açar (mevcut abonelik / AI kredi / X paket akışlarının aynısı; kolaylık
olsun diye tam URL payment_url alanında da döner).
Kapılar (sırayla): SitePolicy update → kısıtlı hesap guard'ı (agent / alt kullanıcı / bayi müşterisi kapsam dışı) → ödeyen SİTE SAHİBİ olmalı → sayfa ZATEN açıksa satın alma reddedilir (zaten sahip olunan hak için para alınmaz).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/business-page/checkout" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/business-page/checkout"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/business-page/checkout';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"purchase_id": 12,
"merchant_oid": "BPU12T260802153000",
"iframe_token": "[REDACTED]",
"payment_url": "https://www.paytr.com/odeme/guvenli/abc123",
"amount_tl": 9999,
"currency": "TRY"
}
Example response (403):
{
"success": false,
"error": "restricted_account",
"message": "İşletme Rehberi sayfası bu hesap türünde kullanılamaz."
}
Example response (403):
{
"success": false,
"error": "not_owner",
"message": "Yayın kilidini yalnız işletme sahibi satın alabilir."
}
Example response (422):
{
"success": false,
"error": "already_unlocked",
"message": "Bu sayfanın herkese açık yayını zaten açık."
}
Example response (502):
{
"success": false,
"error": "checkout_failed",
"message": "Ödeme başlatılamadı. Lütfen tekrar deneyin."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ekip & Alt Kullanıcılar
Site'in tüm üyelerini listele (owner + agent + permissions).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/team"const url = new URL(
"https://dowaba.com/api/sites/1/team"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/team';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni üye ekle. Doğrudan aktif eder + bilgilendirme SMS'i gönderir. Body: - phone (zorunlu) - name (opsiyonel) - email (opsiyonel — yoksa otomatik üretilir) - modules (opsiyonel string[]) — verilmezse tümü açık (null)
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/team/invite" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"vmqeopfuudtdsufvyvddq\",
\"name\": \"amniihfqcoynlazghdtqt\",
\"email\": \"andreanne00@example.org\",
\"modules\": [
\"wbpilpmufinllwloauydl\"
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/team/invite"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "vmqeopfuudtdsufvyvddq",
"name": "amniihfqcoynlazghdtqt",
"email": "andreanne00@example.org",
"modules": [
"wbpilpmufinllwloauydl"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/team/invite';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => 'vmqeopfuudtdsufvyvddq',
'name' => 'amniihfqcoynlazghdtqt',
'email' => 'andreanne00@example.org',
'modules' => [
'wbpilpmufinllwloauydl',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir agent'ın görebileceği modülleri güncelle. Body: { modules: string[] | null } - null → tüm modüller (default) - [] → hiçbiri (agent boş bir panel görür)
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/team/1562/permissions" \
--header "Content-Type: application/json" \
--data "{
\"modules\": [
\"vmqeopfuudtdsufvyvddq\"
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/team/1562/permissions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"modules": [
"vmqeopfuudtdsufvyvddq"
]
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/team/1562/permissions';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'modules' => [
'vmqeopfuudtdsufvyvddq',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Agent'ın temel bilgilerini güncelle (ad, telefon, e-posta). Body: - name (opsiyonel) - phone (opsiyonel — boş gönderirse silinmez, mevcut korunur) - email (opsiyonel — geçerli e-posta veya null)
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/team/1562/profile" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"phone\": \"amniihfqcoynlazghdtqt\",
\"email\": \"andreanne00@example.org\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/team/1562/profile"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"phone": "amniihfqcoynlazghdtqt",
"email": "andreanne00@example.org"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/team/1562/profile';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'phone' => 'amniihfqcoynlazghdtqt',
'email' => 'andreanne00@example.org',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Agent'ın şifresini sıfırla. Yeni şifre üret + SMS gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/team/1562/reset-password"const url = new URL(
"https://dowaba.com/api/sites/1/team/1562/reset-password"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/team/1562/reset-password';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir agent'ı siteden çıkar.
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1/team/1562"const url = new URL(
"https://dowaba.com/api/sites/1/team/1562"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/team/1562';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site Sahipliği Devri
Bir site için yeni sahibe devir teklifi açar (yalnız mevcut sahip).
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/transfer/offer" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"to_email\": \"yeni@firma.com\",
\"message\": \"Siteyi sana devrediyorum.\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/transfer/offer"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"to_email": "yeni@firma.com",
"message": "Siteyi sana devrediyorum."
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/transfer/offer';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'to_email' => 'yeni@firma.com',
'message' => 'Siteyi sana devrediyorum.',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcıya gelen + kullanıcının açtığı devir tekliflerini listeler.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/site-transfers?box=incoming" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/site-transfers"
);
const params = {
"box": "incoming",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/site-transfers';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
'query' => [
'box' => 'incoming',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Teklifi kabul et — devir gerçekleşir, tüm haklar geçer.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/site-transfers/1/accept" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"note\": \"Teşekkürler.\"
}"
const url = new URL(
"https://dowaba.com/api/site-transfers/1/accept"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"note": "Teşekkürler."
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/site-transfers/1/accept';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'note' => 'Teşekkürler.',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Teklifi reddet.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/site-transfers/1/reject" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"note\": \"Şu an alamıyorum.\"
}"
const url = new URL(
"https://dowaba.com/api/site-transfers/1/reject"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"note": "Şu an alamıyorum."
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/site-transfers/1/reject';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'note' => 'Şu an alamıyorum.',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Açtığın teklifi iptal et (kabul edilmeden önce).
requires authentication
Example request:
curl --request DELETE \
"https://dowaba.com/api/site-transfers/1" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/site-transfers/1"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/site-transfers/1';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mesaj Kutusu
Gönderilemeyen mesajı tekrar dene. Failed (teslim edilemedi) durumundaki giden mesajı aynı kanaldan yerinde yeniden gönderir. Text ve resim mesajları desteklenir; resim-dışı medya (video/ses) ve panel composer medyası 422 döner. Mesajlaşma penceresi (WhatsApp/Instagram/Messenger 24 saat) kapalıysa 422 döner.
Example request:
curl --request POST \
"https://dowaba.com/api/inbox/messages/whatsapp/12345/retry"const url = new URL(
"https://dowaba.com/api/inbox/messages/whatsapp/12345/retry"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/inbox/messages/whatsapp/12345/retry';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"delivery_status": "sent",
"message_id": "wamid.xxx"
}
Example response (422):
{
"error": "Mesajlaşma penceresi (24 saat) kapalı"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Inbox — Unified
Tek-nokta mesaj silme (panel soft-delete) — 8 kanal için tek endpoint.
POST /api/inbox/messages/delete body: { channel, id }
Davranış (retention.md uyumlu — "sil" = panelden gizle):
- Satır SİLİNMEZ: deleted_at + deleted_by_user_id damgalanır (ChannelMessageSoftDelete::softDeleteBy). Panel yüzeyleri notDeleted() scope'u / whereNull('deleted_at') ile gizler.
- İçerik, yasal saklama süresi (sites.message_retention_days, default 90g) boyunca DB'de kalır → resmî/kamu talebi halinde sunulabilir; süre dolunca kvkk:purge-messages içeriği yine NULL'lar (soft-delete purge saatini DEĞİŞTİRMEZ).
- AuditLog: kim/ne zaman/hangi mesaj (içerik kopyalanmaz).
Authz: InboxReadController ile birebir aynı kapsam — kullanıcının messaging*ProfileIds / messagingSiteIds / messagingMailAccountIds kümesi. Kapsam dışı veya olmayan id → uniform 404 (IDOR: varlık sızdırılmaz). Voice bilinçli KAPSAM DIŞI (çağrı transkripti; VOICE_PRIVACY.md kendi rejimi).
Mesajı sil (panel soft-delete)
Mesaj panel yüzeylerinden gizlenir; kayıt yasal saklama süresi boyunca denetim amaçlı tutulur (KVKK m.7 imha saati değişmez).
Example request:
curl --request POST \
"https://dowaba.com/api/inbox/messages/delete" \
--header "Content-Type: application/json" \
--data "{
\"channel\": \"whatsapp\",
\"id\": 12345
}"
const url = new URL(
"https://dowaba.com/api/inbox/messages/delete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"channel": "whatsapp",
"id": 12345
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/inbox/messages/delete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'channel' => 'whatsapp',
'id' => 12345,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"channel": "whatsapp",
"id": 12345
}
Example response (404):
{
"success": false,
"message": "Mesaj bulunamadı."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
KONUŞMAYI sil (panel soft-delete, 2026-07-24) — 8 kanal tek endpoint.
POST /api/inbox/conversations/delete body: { channel, identifier, profile_id?, site_id? }
Davranış (retention.md Kural #7 — kural metni "mesaj/konuşma silince" der):
- Konuşmanın TÜM mesajları soft-damgalanır (MessageSoftDeleteService:: deleteByQuery — legacy WA/TG/Msgr/TikTok/Mail deleteConversation uçlarıyla AYNI motor). Satır+içerik saklama süresince kalır.
- Durum satırı (WhatsApp/Telegram/Messenger/Instagram/TikTok *Conversation): içerik taşımaz → HARD silinir, müşteri tekrar yazarsa yeniden oluşur (dirilme — legacy parite).
- X İSTİSNASI: x_messages.x_conversation_id FK'sı cascadeOnDelete → XConversation satırı SİLİNMEZ (hard silmek mesajları da hard silerdi, Kural #7 ihlali). Mesajlar damgalanınca unified liste zaten göstermez.
- Mail: conversation tablosu yok; yalnız DB soft (IMAP'e DOKUNULMAZ — IMAP dahil silme Mail görünümündeki mevcut uçtadır).
- Widget İSTİSNASI: oturum FK-cascade HARD (Kural #7 istisna metni). Idempotent: mesajların hepsi zaten silinmişse yine 200 (deleted=0). Kapsam dışı → uniform 404 (IDOR).
Example request:
curl --request POST \
"https://dowaba.com/api/inbox/conversations/delete" \
--header "Content-Type: application/json" \
--data "{
\"channel\": \"whatsapp\",
\"identifier\": \"+905551234567\",
\"profile_id\": 12,
\"site_id\": 5
}"
const url = new URL(
"https://dowaba.com/api/inbox/conversations/delete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"channel": "whatsapp",
"identifier": "+905551234567",
"profile_id": 12,
"site_id": 5
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/inbox/conversations/delete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'channel' => 'whatsapp',
'identifier' => '+905551234567',
'profile_id' => 12,
'site_id' => 5,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"channel": "whatsapp",
"deleted": 42
}
Example response (404):
{
"success": false,
"message": "Konuşma bulunamadı."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Inbox Media
Inbox mesajlarına eklenmiş medya dosyalarını serve eder. İki giriş:
- GET /api/inbox/media/{channel}/{messageId}?download=1 — auth:sanctum (Bearer; mobil uygulama bu yolu kullanır) + Site::isAccessibleBy scope.
- GET /api/inbox/media-signed/{channel}/{messageId}?expires=..&signature=.. —
RELATIVE signed URL ('signed:relative' middleware). Panel
/
channel: whatsapp | instagram | telegram | messenger messageId: kanal tablosundaki message PK ?download=1 → Content-Disposition: attachment (browser indir butonu için) yoksa inline (image/video/audio preview için)
Storage: storage/app/inbound-media/{channel}/{siteId}/{yyyy-mm}/{uuid}.{ext} public/storage symlink ALTINDA DEĞİL — direct serve gerekiyor.
Signed URL ile medya stream — <img> tag'leri için (header'sız erişim).
İmza doğrulaması route'taki 'signed:relative' middleware'inde; geçersiz/expired imza 403 ile buraya hiç ulaşmaz. İmzalı URL yalnızca o mesaja erişimi olan kullanıcıya üretildiği için ek user scope kontrolü gerekmez (capability URL).
Example request:
curl --request GET \
--get "https://dowaba.com/api/inbox/media-signed/whatsapp/7114?download=1&expires=1760000000&signature=abc123"const url = new URL(
"https://dowaba.com/api/inbox/media-signed/whatsapp/7114"
);
const params = {
"download": "1",
"expires": "1760000000",
"signature": "abc123",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/inbox/media-signed/whatsapp/7114';
$response = $client->get(
$url,
[
'query' => [
'download' => '1',
'expires' => '1760000000',
'signature' => 'abc123',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (403):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Forbidden</title>
<style>
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}code{font-family:monospace,monospace;font-size:1em}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}code{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-xl{max-width:36rem}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wider{letter-spacing:.05em}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-300 { --text-opacity: 1; color: #e2e8f0; color: rgba(226,232,240,var(--text-opacity)) }}
</style>
<style>
body {
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
</style>
</head>
<body class="antialiased">
<div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center sm:pt-0" role="main">
<div class="max-w-xl mx-auto sm:px-6 lg:px-8">
<div class="flex items-center pt-8 sm:justify-start sm:pt-0">
<h1 class="px-4 text-lg dark:text-gray-300 text-gray-700 border-r border-gray-400 tracking-wider">
403 </h1>
<div class="ml-4 text-lg dark:text-gray-300 text-gray-700 uppercase tracking-wider">
Invalid signature. </div>
</div>
</div>
</div>
</body>
</html>
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Voice — SIP & Çağrılar
Desteklenen SIP sağlayıcılarının (whitelist) listesini döner. Frontend trunk formundaki "Sağlayıcı" dropdown'unu doldurur. Custom seçeneği `allow_custom=true` ise manuel host girilebilir. `match_hosts` ve diğer Asterisk-internal alanlar UI'a leak edilmez — sadece görünür alanlar döner.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sip-providers"const url = new URL(
"https://dowaba.com/api/sip-providers"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sip-providers';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"providers": [
{
"name": "NetGSM",
"slug": "netgsm",
"host": "sip.netgsm.com.tr",
"port": 5060,
"description": "...",
"docs_url": "..."
}
],
"allow_custom": true,
"default_server": "sip.netgsm.com.tr",
"default_port": 5060
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site voice gizlilik politikasını ve yasal hazırlık durumunu getirir. Trunk'tan bağımsızdır: SIP hattı olmayan (örn. yalnız WhatsApp Cloud Calling hedefleyen) sitelerde de aynı payload döner.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/voice-privacy"const url = new URL(
"https://dowaba.com/api/sites/1/voice-privacy"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/voice-privacy';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"privacy": {
"voice_privacy_mode": "recorded",
"voice_legal_basis": "explicit_consent",
"voice_controller_name": "Acme Destek AŞ",
"voice_privacy_contact": "kvkk@acme.test",
"voice_notice_profile": "short",
"voice_retention_days": 90,
"voice_notice_required": true,
"voice_privacy_can_manage": true,
"voice_legal_ready": false,
"voice_legal_missing": [
"voice_controller_name"
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site voice gizlilik politikasını ve veri sorumlusu beyanını kaydeder (trunk gerekmez). Yalnız site sahibi veya superadmin çağırabilir (VOICE_PRIVACY.md § 8). Politika değişiminde veya kimlik ilk kez materialize edilirken `voice_controller_attested=true` ZORUNLUDUR; beyan olmadan v3 damgası üretilmez. Kayıt sonrası `VoiceLegalReadinessService::refreshSite` çalışır ve panel `voice_legal_*` alanlarıyla güncel durumu döner.
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/voice-privacy" \
--header "Content-Type: application/json" \
--data "{
\"voice_privacy_mode\": \"transcript_only\",
\"voice_legal_basis\": \"explicit_consent\",
\"voice_notice_profile\": \"short\",
\"voice_retention_days\": 90,
\"voice_controller_name\": \"Acme Destek Hizmetleri AŞ\",
\"voice_privacy_contact\": \"kvkk@acme.test\",
\"voice_controller_attested\": true
}"
const url = new URL(
"https://dowaba.com/api/sites/1/voice-privacy"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"voice_privacy_mode": "transcript_only",
"voice_legal_basis": "explicit_consent",
"voice_notice_profile": "short",
"voice_retention_days": 90,
"voice_controller_name": "Acme Destek Hizmetleri AŞ",
"voice_privacy_contact": "kvkk@acme.test",
"voice_controller_attested": true
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/voice-privacy';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'voice_privacy_mode' => 'transcript_only',
'voice_legal_basis' => 'explicit_consent',
'voice_notice_profile' => 'short',
'voice_retention_days' => 90,
'voice_controller_name' => 'Acme Destek Hizmetleri AŞ',
'voice_privacy_contact' => 'kvkk@acme.test',
'voice_controller_attested' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (403):
{
"message": "Voice gizlilik ayarlarını yalnız site sahibi veya superadmin değiştirebilir."
}
Example response (409):
{
"success": false,
"error": "voice_state_changed",
"message": "Site sahipliği veya voice yapılandırması değişti. Sayfayı yenileyip tekrar deneyin."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/sites/{site_id}/netgsm-number-orders
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/netgsm-number-orders?service_type=SMS-API" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"service_type\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/netgsm-number-orders"
);
const params = {
"service_type": "SMS-API",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"service_type": "consequatur"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/netgsm-number-orders';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'query' => [
'service_type' => 'SMS-API',
],
'json' => [
'service_type' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"enabled": true,
"sms_enabled": false,
"data": [
{
"id": 41,
"status": "completed",
"number": "8503021234",
"service_type": "VOIP-API",
"status_note": null,
"created_at": "2026-07-29T09:12:44.000000Z",
"last_event_at": "2026-07-29T09:26:03.000000Z"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/sites/{site_id}/netgsm-number-orders
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/netgsm-number-orders" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"service_type\": \"SMS-API\",
\"taxpayer_type\": 2,
\"name\": \"Ayşe\",
\"surname\": \"Yılmaz\",
\"email\": \"user@example.com\",
\"phone_number\": \"5XXXXXXXXX\",
\"birth_date\": \"01.01.1990\",
\"tc_identity_number\": \"[REDACTED]\",
\"consent\": true
}"
const url = new URL(
"https://dowaba.com/api/sites/1/netgsm-number-orders"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"service_type": "SMS-API",
"taxpayer_type": 2,
"name": "Ayşe",
"surname": "Yılmaz",
"email": "user@example.com",
"phone_number": "5XXXXXXXXX",
"birth_date": "01.01.1990",
"tc_identity_number": "[REDACTED]",
"consent": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/netgsm-number-orders';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'service_type' => 'SMS-API',
'taxpayer_type' => 2,
'name' => 'Ayşe',
'surname' => 'Yılmaz',
'email' => 'user@example.com',
'phone_number' => '5XXXXXXXXX',
'birth_date' => '01.01.1990',
'tc_identity_number' => '[REDACTED]',
'consent' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"data": {
"id": 41,
"status": "initiated",
"service_type": "VOIP-API",
"widget_url": "https://member.netgsm.com.tr/redirect/[REDACTED]",
"expires_in": 180
}
}
Example response (409):
{
"success": false,
"error": "site_has_trunk"
}
Example response (409):
{
"success": false,
"error": "order_in_progress"
}
Example response (409):
{
"success": false,
"error": "sms_order_in_progress"
}
Example response (422):
{
"success": false,
"error": "consent_required",
"channel": "sms",
"missing_consents": []
}
Example response (502):
{
"success": false,
"error": "netgsm_error",
"description": "Zorunlu alan eksik veya format hatası"
}
Example response (503):
{
"success": false,
"error": "disabled"
}
Example response (503):
{
"success": false,
"error": "sms_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/sites/{site_id}/netgsm-number-orders/{order_id}
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/netgsm-number-orders/2" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/netgsm-number-orders/2"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/netgsm-number-orders/2';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"id": 41,
"status": "completed",
"number": "8503021234",
"service_type": "VOIP-API",
"status_note": null,
"created_at": "2026-07-29T09:12:44.000000Z",
"last_event_at": "2026-07-29T09:26:03.000000Z",
"trunk_ready": true,
"provisioned": true
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/sites/{site_id}/netgsm-number-orders/{order_id}/refresh-token
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/netgsm-number-orders/2/refresh-token" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"taxpayer_type\": 2,
\"name\": \"Ayşe\",
\"surname\": \"Yılmaz\",
\"email\": \"user@example.com\",
\"phone_number\": \"5XXXXXXXXX\",
\"birth_date\": \"01.01.1990\",
\"tc_identity_number\": \"[REDACTED]\",
\"consent\": true
}"
const url = new URL(
"https://dowaba.com/api/sites/1/netgsm-number-orders/2/refresh-token"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"taxpayer_type": 2,
"name": "Ayşe",
"surname": "Yılmaz",
"email": "user@example.com",
"phone_number": "5XXXXXXXXX",
"birth_date": "01.01.1990",
"tc_identity_number": "[REDACTED]",
"consent": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/netgsm-number-orders/2/refresh-token';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'taxpayer_type' => 2,
'name' => 'Ayşe',
'surname' => 'Yılmaz',
'email' => 'user@example.com',
'phone_number' => '5XXXXXXXXX',
'birth_date' => '01.01.1990',
'tc_identity_number' => '[REDACTED]',
'consent' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"widget_url": "https://member.netgsm.com.tr/redirect/[REDACTED]",
"expires_in": 180
}
}
Example response (409):
{
"success": false,
"error": "order_not_refreshable"
}
Example response (503):
{
"success": false,
"error": "disabled"
}
Example response (503):
{
"success": false,
"error": "sms_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin SIP trunk'ına yönlendirilmiş DID route'larını listele. Site'in trunk'ı yoksa 200 + `trunk: null` + boş liste döner (panel "önce trunk ekleyin" durumunu ayırt edebilsin).
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/phone-routes" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/phone-routes"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/phone-routes';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"trunk": {
"id": 9,
"site_id": 5,
"phone_number": "2129094162",
"is_active": true
},
"routes": [
{
"id": 3,
"sip_trunk_id": 9,
"phone_number": "2160000001",
"site_id": 70,
"site": {
"id": 70,
"name": "PiSchool",
"user_id": 42
},
"is_active": true,
"label": "PiSchool ana hat",
"created_at": "2026-07-28T09:00:00.000000Z",
"updated_at": "2026-07-28T09:00:00.000000Z"
}
],
"data": [
{
"id": 3,
"sip_trunk_id": 9,
"phone_number": "2160000001",
"site_id": 70,
"site": {
"id": 70,
"name": "PiSchool",
"user_id": 42
},
"is_active": true,
"label": "PiSchool ana hat",
"created_at": "2026-07-28T09:00:00.000000Z",
"updated_at": "2026-07-28T09:00:00.000000Z"
}
]
}
Example response (200, Trunk yok):
{
"success": true,
"trunk": null,
"routes": [],
"data": []
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin trunk'ına yeni yönlendirilmiş numara (DID) ekle.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/phone-routes" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"phone_number\": \"2160000001\",
\"site_id\": 70,
\"label\": \"PiSchool ana hat\",
\"is_active\": true
}"
const url = new URL(
"https://dowaba.com/api/sites/1/phone-routes"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone_number": "2160000001",
"site_id": 70,
"label": "PiSchool ana hat",
"is_active": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/phone-routes';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'phone_number' => '2160000001',
'site_id' => 70,
'label' => 'PiSchool ana hat',
'is_active' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (422):
{
"success": false,
"errors": {
"phone_number": [
"Bu numara bir SIP trunk'ında kayıtlı."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yönlendirilmiş numarayı güncelle (hedef site / etiket / aktiflik). `phone_number` ve `sip_trunk_id` DEĞİŞMEZ — numara değişecekse sil + yeni ekle.
requires authentication
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/phone-routes/1" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 71,
\"label\": \"Ankara hattı\",
\"is_active\": false
}"
const url = new URL(
"https://dowaba.com/api/sites/1/phone-routes/1"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 71,
"label": "Ankara hattı",
"is_active": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/phone-routes/1';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 71,
'label' => 'Ankara hattı',
'is_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yönlendirilmiş numarayı sil (Asterisk match_request_uri regex'i observer ile yeniden kurulur).
requires authentication
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1/phone-routes/1" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/phone-routes/1"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/phone-routes/1';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DID formundaki "hedef site" dropdown'unu doldurur. Superadmin → tüm aktif siteler; diğerleri → `User::accessibleSiteIds()` cascade kesişimi (kendi siteleri + bayiyse müşteri siteleri).
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/phone-route-targets" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/phone-route-targets"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/phone-route-targets';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 70,
"name": "PiSchool",
"owner_name": "Ahmet",
"owner_email": "ahmet@example.com",
"is_own": false,
"is_customer": true
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kapasite paketlerim Kullanıcının sahip olduğu aktif kapasite paketleri + atandıkları siteler.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/me/voice-capacity" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/me/voice-capacity"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/me/voice-capacity';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"subscriptions": [
{
"id": 41,
"plan": {
"slug": "kapasite-100",
"name": "Kapasite-100",
"concurrent_calls_limit": 100,
"daily_calls_limit": 1000,
"monthly_voice_calls_limit": 15000
},
"period": "monthly",
"expires_at": "2026-07-12T00:00:00.000000Z",
"assigned_site": {
"id": 12,
"name": "Örnek Site"
}
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site kapasite durumu Atanmış kapasite paketi + güncel kullanım (anlık eşzamanlı + bugünkü çağrı). Paket yoksa platform default limitleri döner.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/voice-capacity" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/voice-capacity"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/voice-capacity';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"package": {
"subscription_id": 41,
"plan_slug": "kapasite-100",
"plan_name": "Kapasite-100",
"concurrent_calls_limit": 100,
"daily_calls_limit": 1000,
"monthly_voice_calls_limit": 15000,
"expires_at": "2026-07-12T00:00:00.000000Z"
},
"usage": {
"current_concurrent": 3,
"today_calls": 117
},
"defaults": {
"concurrent_calls_limit": 20
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kapasite paketini siteye ata Paket site SAHİBİNE ait ve aktif olmalı; aynı anda tek siteye atanabilir (başka sitedeyse 422 — önce oradan kaldırın).
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/voice-capacity" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"subscription_id\": 41
}"
const url = new URL(
"https://dowaba.com/api/sites/1/voice-capacity"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"subscription_id": 41
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/voice-capacity';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'subscription_id' => 41,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Example response (422, Paket başka sitede):
{
"success": false,
"error": "Bu paket başka bir siteye atanmış. Önce oradan kaldırın."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kapasite paketi atamasını kaldır Site default limitlere (20 eşzamanlı, günlük limitsiz) döner; paket başka bir siteye atanabilir hâle gelir.
requires authentication
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1/voice-capacity" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/voice-capacity"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/voice-capacity';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktarım rehberini listele (Santral) Santral / canlı çağrı aktarımı hedef listesi + opt-in durumu. AI, telefon görüşmesinde arayanı SADECE bu rehberdeki kişilere canlı aktarabilir. `enabled=false` ise özellik kapalıdır (telefonu_aktar AI'ya deklare edilmez); açmak için `PUT /api/sites/{site}` body `{"settings":{"voice_transfer_enabled":true}}`. Not: aktarım, sitenin SIP sağlayıcısı üzerinden DIŞA ARAMA yapar — sağlayıcıda dış arama paketi/bakiyesi yoksa aktarımlar "meşgul" hatasıyla düşer.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/transfer-targets" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/transfer-targets"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/transfer-targets';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Başarılı):
{
"success": true,
"enabled": true,
"translate_enabled": false,
"targets": [
{
"id": 3,
"site_id": 5,
"name": "Ahmet Yılmaz",
"department": "Teknik Ekip",
"phone": "+90 555 *** ** **",
"user_id": null,
"is_active": true,
"sort": 0,
"created_at": "2026-06-12T10:00:00.000000Z",
"updated_at": "2026-06-12T10:00:00.000000Z"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktarım hedefi ekle (Santral) Site başına en fazla 20 hedef. Telefon otomatik normalize edilir (boşluk/tire temizlenir, baştaki 0 atılır, 90 öneki eklenir → 905xxxxxxxxx). `user_id` verilirse sitenin sahibi veya site ekibinden biri olmalıdır.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/transfer-targets" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Ahmet Yılmaz\",
\"department\": \"Teknik Ekip\",
\"language\": \"tr\",
\"phone\": \"5551112233\",
\"user_id\": 12,
\"is_active\": true,
\"sort\": 0
}"
const url = new URL(
"https://dowaba.com/api/sites/1/transfer-targets"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Ahmet Yılmaz",
"department": "Teknik Ekip",
"language": "tr",
"phone": "5551112233",
"user_id": 12,
"is_active": true,
"sort": 0
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/transfer-targets';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Ahmet Yılmaz',
'department' => 'Teknik Ekip',
'language' => 'tr',
'phone' => '5551112233',
'user_id' => 12,
'is_active' => true,
'sort' => 0,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201, Oluşturuldu):
{
"success": true,
"target": {
"id": 7,
"site_id": 5,
"name": "Ahmet Yılmaz",
"department": "Teknik Ekip",
"phone": "+90 555 *** ** **",
"user_id": null,
"is_active": true,
"sort": 0
}
}
Example response (422, Geçersiz telefon veya 20 hedef sınırı):
{
"success": false,
"error": "Telefon numarası geçersiz: 123"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktarım hedefi güncelle (Santral) Kısmi güncelleme desteklenir — yalnızca gönderilen alanlar değişir.
requires authentication
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/transfer-targets/1" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Ahmet Y.\",
\"department\": \"Satış\",
\"language\": \"en\",
\"phone\": \"5551112244\",
\"user_id\": 12,
\"is_active\": false,
\"sort\": 1
}"
const url = new URL(
"https://dowaba.com/api/sites/1/transfer-targets/1"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Ahmet Y.",
"department": "Satış",
"language": "en",
"phone": "5551112244",
"user_id": 12,
"is_active": false,
"sort": 1
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/transfer-targets/1';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Ahmet Y.',
'department' => 'Satış',
'language' => 'en',
'phone' => '5551112244',
'user_id' => 12,
'is_active' => false,
'sort' => 1,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Güncellendi):
{
"success": true,
"target": {
"id": 3,
"is_active": false
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktarım hedefi sil (Santral) Geçmiş çağrı kayıtlarındaki aktarım bilgisi (transferred_to_name/phone) korunur.
requires authentication
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1/transfer-targets/1" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/transfer-targets/1"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/transfer-targets/1';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Silindi):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kamailio register DURUM bildirimi (LB master → backend, cron 60sn). 2026-07-10: HA mimarisinde REGISTER'ı Asterisk değil Kamailio yapar; panel "kayıt durumu" göstergesi bu push ile beslenir (cache `voice:uacreg_status` + kalıcı iz `sip_trunks.last_register_status/last_registered_at`). SADECE master (FIP tutan LB) push'lar; backup'ın flags'i yanıltıcıdır. Detay: sip-trunk.md § 6.2.
Example request:
curl --request POST \
"https://dowaba.com/api/voice/uacreg-status" \
--header "Content-Type: application/json" \
--data "{
\"node\": \"load-balancer\",
\"is_master\": true,
\"entries\": [
{
\"l_uuid\": \"site-174\",
\"flags\": 20,
\"diff_expires\": 1555
}
]
}"
const url = new URL(
"https://dowaba.com/api/voice/uacreg-status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"node": "load-balancer",
"is_master": true,
"entries": [
{
"l_uuid": "site-174",
"flags": 20,
"diff_expires": 1555
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice/uacreg-status';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'node' => 'load-balancer',
'is_master' => true,
'entries' => [
[
'l_uuid' => 'site-174',
'flags' => 20,
'diff_expires' => 1555,
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Voice — Konuşma Geçmişi
Sitenin sesli konuşma geçmişini listele (sadece temizlenmiş transkriptler).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/voice-conversations"const url = new URL(
"https://dowaba.com/api/sites/1/voice-conversations"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/voice-conversations';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek bir sesli konuşmanın ham mesajları + temizlenmiş transkripti.
Example request:
curl --request GET \
--get "https://dowaba.com/api/voice-conversations/64"const url = new URL(
"https://dowaba.com/api/voice-conversations/64"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-conversations/64';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşma kaydı için HMAC imzalı geçici URL üretir (TTL 10 dk).
Example request:
curl --request GET \
--get "https://dowaba.com/api/voice-conversations/64/recording-url"const url = new URL(
"https://dowaba.com/api/voice-conversations/64/recording-url"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-conversations/64/recording-url';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel transkript temizleme tetikle — UI "Yeniden Temizle" butonu (senkron).
Example request:
curl --request POST \
"https://dowaba.com/api/voice-conversations/64/clean"const url = new URL(
"https://dowaba.com/api/voice-conversations/64/clean"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-conversations/64/clean';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Birden fazla voice conversation'ı toplu sil. Yalnızca kullanıcının erişebildiği site'lere ait kayıtlar silinir; erişim dışı ID'ler sessizce atlanır.
Example request:
curl --request POST \
"https://dowaba.com/api/voice-conversations/bulk-destroy" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
12,
13,
14
]
}"
const url = new URL(
"https://dowaba.com/api/voice-conversations/bulk-destroy"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
12,
13,
14
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-conversations/bulk-destroy';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
12,
13,
14,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cevapsız çağrı takip kayıtları. Site için üretilen "cevapsız çağrı → WhatsApp" takip satırlarını listeler (en yeni üstte). Her satır bir çağrıya karşılık gelir; `status` gönderimin sonucunu, `skip_reason` gönderilmediyse hangi kapının kestiğini söyler.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/missed-call-followups?status=sent&per_page=20" \
--header "Content-Type: application/json" \
--data "{
\"per_page\": 21
}"
const url = new URL(
"https://dowaba.com/api/sites/1/missed-call-followups"
);
const params = {
"status": "sent",
"per_page": "20",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"per_page": 21
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/missed-call-followups';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'status' => 'sent',
'per_page' => '20',
],
'json' => [
'per_page' => 21,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 12,
"site_id": 5,
"phone": "+90 555 *** ** **",
"reason": "abandoned",
"status": "sent",
"skip_reason": null,
"channel": "whatsapp",
"template_name": "cevapsiz_cagri",
"provider_message_id": "wamid.HBg...",
"error": null,
"detected_at": "2027-03-30T09:14:00.000000Z",
"sent_at": "2027-03-30T09:17:02.000000Z"
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 20,
"total": 1
}
}
Example response (403):
{
"message": "Bu sitenin görüşme kayıtlarına erişiminiz yok."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Outbound Calls
Outbound (giden) çağrı niyetlerini (intent) yöneten endpoint'ler.
Üç iş tipinin (manual / appointment_reminder / ai_followup) merkezi
yönetim noktası. Worker (voice:run-outbound-intents artisan komutu, her
dakika çalışır) bu tablodaki status=approved kayıtları çekip Asterisk
ARI üzerinden gerçek çağrıyı başlatır.
Outbound (giden) çağrı tetikle Tek seferlik / hemen aranacak çağrılar için. Tetiklendiği anda Asterisk ARI üzerinden NetGSM trunk'a `originate` komutu gönderilir; karşı taraf cevap verince AI (sitenin sistem promptu + opsiyonel `prompt_override`) konuşmaya başlar. Zamanlanmış / tekrarlayan çağrılar için `POST /api/sites/{site}/outbound-intents` endpoint'ini kullan (worker tarafından batch çalıştırılır). Rate limit: dakikada 5 (per user). Site bazında günlük limit `sites.daily_outbound_limit` (default 50).
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/voice/call" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"to_number\": \"5551112233\",
\"prompt_override\": \"Sen randevu hatırlatma temsilcisisin.\",
\"initial_message\": \"Merhaba, dowaba\'dan arıyorum.\"
}"
const url = new URL(
"https://dowaba.com/api/voice/call"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"to_number": "5551112233",
"prompt_override": "Sen randevu hatırlatma temsilcisisin.",
"initial_message": "Merhaba, dowaba'dan arıyorum."
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice/call';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'to_number' => '5551112233',
'prompt_override' => 'Sen randevu hatırlatma temsilcisisin.',
'initial_message' => 'Merhaba, dowaba\'dan arıyorum.',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Çağrı başarıyla tetiklendi):
{
"success": true,
"message": "Çağrı başlatıldı, karşı taraf çalıyor.",
"data": {
"conversation_id": 78,
"channel_id": "1777189978.2",
"audiosocket_uuid": "e52b6f00-693c-48b2-9b3e-6c843b9744ef",
"today_count": 12,
"limit": 50
}
}
Example response (422, Trunk yok veya numara geçersiz):
{
"success": false,
"error": "Bu siteye bağlı aktif SIP trunk yok. Önce telefon entegrasyonunu yapın."
}
Example response (429, Günlük limit doldu):
{
"success": false,
"error": "Günlük outbound çağrı limitiniz (50) doldu. Yarın tekrar deneyebilirsiniz.",
"today_count": 50,
"limit": 50
}
Example response (503, Asterisk ulaşılamaz):
{
"success": false,
"error": "Asterisk çağrı başlatılamadı: Connection refused",
"conversation_id": 79
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Outbound çağrı niyetlerini listele
requires authentication
Site'a ait planlanmış / onay bekleyen / tamamlanmış outbound çağrıları döner.
Kind ve status filtrelenebilir; AI follow-up önerileri pending_approval
statüsünde gelir, kullanıcı onaylarsa worker çağrıyı başlatır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/outbound-intents?kind=ai_followup&status=pending_approval&per_page=25&page=1" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/outbound-intents"
);
const params = {
"kind": "ai_followup",
"status": "pending_approval",
"per_page": "25",
"page": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/outbound-intents';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
'query' => [
'kind' => 'ai_followup',
'status' => 'pending_approval',
'per_page' => '25',
'page' => '1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Başarılı liste):
{
"success": true,
"data": {
"current_page": 1,
"per_page": 25,
"total": 47,
"data": [
{
"id": 314,
"site_id": 5,
"kind": "ai_followup",
"status": "pending_approval",
"target_phone": "905551112233",
"target_name": "Ali Veli",
"scheduled_at": null,
"initial_message": "Merhaba Ali Bey, konuştuğumuz randevu için arıyorum...",
"ai_reasoning": "Müşteri 3000 TL üstü ürün fiyatı sordu, AI net fiyat veremedi.",
"source_voice_conversation_id": 8821,
"created_at": "2026-04-26T14:35:02Z"
}
]
},
"pending_count": 3
}
Example response (403, Site sahipliği yok):
{
"message": "forbidden"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel outbound çağrı niyeti oluştur
requires authentication
Kullanıcı panelden veya 3rd party API'den "şu numarayı şu zamanda ara"
dediğinde kullanılır. status=approved olarak yaratılır — worker
(voice:run-outbound-intents cron'u) bir sonraki tetiklemede çağrıyı
başlatır. scheduled_at boş bırakılırsa hemen aranır (max 1dk gecikme).
Site daily_outbound_limit aşımında 429 döner (manuel kontrol için önce GET /sites/{site}/outbound-intents?status=in_progress sayısını çek).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/outbound-intents" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"target_phone\": \"5551112233\",
\"target_name\": \"Ali Veli\",
\"initial_message\": \"Merhaba Ali Bey, salı randevunuzu hatırlatmak için aradım.\",
\"prompt_override\": \"Sen randevu hatırlatma temsilcisisin.\",
\"scheduled_at\": \"2026-04-27T14:00:00Z\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/outbound-intents"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"target_phone": "5551112233",
"target_name": "Ali Veli",
"initial_message": "Merhaba Ali Bey, salı randevunuzu hatırlatmak için aradım.",
"prompt_override": "Sen randevu hatırlatma temsilcisisin.",
"scheduled_at": "2026-04-27T14:00:00Z"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/outbound-intents';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'target_phone' => '5551112233',
'target_name' => 'Ali Veli',
'initial_message' => 'Merhaba Ali Bey, salı randevunuzu hatırlatmak için aradım.',
'prompt_override' => 'Sen randevu hatırlatma temsilcisisin.',
'scheduled_at' => '2026-04-27T14:00:00Z',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201, Başarılı):
{
"success": true,
"message": "Çağrı planlandı. Worker bir sonraki tetiklemede başlatacak.",
"data": {
"id": 412,
"site_id": 5,
"kind": "manual",
"status": "approved",
"target_phone": "5551112233",
"scheduled_at": "2026-04-27T14:00:00Z",
"approved_at": "2026-04-26T10:35:00Z"
}
}
Example response (422, Validation hatası):
{
"message": "The target phone field is required."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST /api/outbound-intents/{intent}/approve AI follow-up önerisini onaylar (status=pending_approval → approved).
Opsiyonel olarak initial_message / scheduled_at güncellenebilir (kullanıcı düzenler).
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-intents/1/approve" \
--header "Content-Type: application/json" \
--data "{
\"initial_message\": \"vmqeopfuudtdsufvyvddq\",
\"prompt_override\": \"amniihfqcoynlazghdtqt\",
\"scheduled_at\": \"2026-08-11T01:53:43\",
\"target_phone\": \"qxbajwbpilpmufinl\",
\"target_name\": \"lwloauydlsmsjuryvojcy\"
}"
const url = new URL(
"https://dowaba.com/api/outbound-intents/1/approve"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"initial_message": "vmqeopfuudtdsufvyvddq",
"prompt_override": "amniihfqcoynlazghdtqt",
"scheduled_at": "2026-08-11T01:53:43",
"target_phone": "qxbajwbpilpmufinl",
"target_name": "lwloauydlsmsjuryvojcy"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-intents/1/approve';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'initial_message' => 'vmqeopfuudtdsufvyvddq',
'prompt_override' => 'amniihfqcoynlazghdtqt',
'scheduled_at' => '2026-08-11T01:53:43',
'target_phone' => 'qxbajwbpilpmufinl',
'target_name' => 'lwloauydlsmsjuryvojcy',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST /api/outbound-intents/{intent}/decline AI follow-up önerisini reddet (kullanıcı bu çağrıya gerek yok der).
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-intents/1/decline"const url = new URL(
"https://dowaba.com/api/outbound-intents/1/decline"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-intents/1/decline';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST /api/outbound-intents/{intent}/cancel Henüz çağrılmamış approved/queued intent'i iptal et.
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-intents/1/cancel"const url = new URL(
"https://dowaba.com/api/outbound-intents/1/cancel"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-intents/1/cancel';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Birden fazla AI follow-up önerisini toplu onayla.
requires authentication
Yalnızca status=pending_approval olanlar approved olur; diğerleri sessizce
atlanır. Worker (voice:run-outbound-intents cron'u) bir sonraki tetiklemede
çağrıları başlatır.
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-intents/bulk-approve" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
12,
13,
14
]
}"
const url = new URL(
"https://dowaba.com/api/outbound-intents/bulk-approve"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
12,
13,
14
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-intents/bulk-approve';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
12,
13,
14,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"approved": 12,
"skipped": 2,
"requested": 14
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Birden fazla AI follow-up önerisini toplu reddet.
requires authentication
Yalnızca pending_approval veya approved (henüz çağrılmamış) intent'ler
reddedilebilir. Worker zaten başlattıysa (queued/in_progress) skip edilir.
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-intents/bulk-decline" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
12,
13,
14
]
}"
const url = new URL(
"https://dowaba.com/api/outbound-intents/bulk-decline"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
12,
13,
14
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-intents/bulk-decline';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
12,
13,
14,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"declined": 10,
"skipped": 4,
"requested": 14
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Voice — Çağrı Kampanyası
Kampanya listesi (status + site filter).
Example request:
curl --request GET \
--get "https://dowaba.com/api/voice-campaigns?site_id=12&status=running"const url = new URL(
"https://dowaba.com/api/voice-campaigns"
);
const params = {
"site_id": "12",
"status": "running",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns';
$response = $client->get(
$url,
[
'query' => [
'site_id' => '12',
'status' => 'running',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"data": [
{
"id": 1,
"name": "Haziran kampanyası",
"status": "running",
"total_recipients": 120
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni çağrı kampanyası (status=draft) + alıcı SNAPSHOT + ARAMA onay delili. İlk kullanımda "Sesli Arama Kampanyası Taahhütnamesi" onayı gerekir — eksikse 422 `consent_required` döner; onay `POST /consent/channel/voice_campaign/accept` ile verilir (kopyası e-postayla gönderilir). Başlatmak için /start çağrılır.
Example request:
curl --request POST \
"https://dowaba.com/api/voice-campaigns" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 12,
\"contact_group_id\": 5,
\"name\": \"Haziran kampanyası\",
\"initial_message\": \"Merhaba, size kampanyamızı anlatmak için aradım.\",
\"prompt_override\": \"consequatur\",
\"scheduled_at\": \"2026-06-14T07:00:00Z\",
\"max_concurrent_calls\": 10,
\"consent_source\": \"HS_WEB\",
\"consent_date\": \"2026-06-01 10:00:00\",
\"consent_confirmed\": true
}"
const url = new URL(
"https://dowaba.com/api/voice-campaigns"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 12,
"contact_group_id": 5,
"name": "Haziran kampanyası",
"initial_message": "Merhaba, size kampanyamızı anlatmak için aradım.",
"prompt_override": "consequatur",
"scheduled_at": "2026-06-14T07:00:00Z",
"max_concurrent_calls": 10,
"consent_source": "HS_WEB",
"consent_date": "2026-06-01 10:00:00",
"consent_confirmed": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 12,
'contact_group_id' => 5,
'name' => 'Haziran kampanyası',
'initial_message' => 'Merhaba, size kampanyamızı anlatmak için aradım.',
'prompt_override' => 'consequatur',
'scheduled_at' => '2026-06-14T07:00:00Z',
'max_concurrent_calls' => 10,
'consent_source' => 'HS_WEB',
'consent_date' => '2026-06-01 10:00:00',
'consent_confirmed' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"data": {
"id": 1,
"status": "draft",
"total_recipients": 118
},
"skipped_no_phone": 2
}
Example response (422):
{
"success": false,
"error": "consent_required",
"channel": "voice_campaign",
"missing_consents": [
"arama_kampanya"
]
}
Example response (422):
{
"success": false,
"error": "no_trunk",
"message": "Bu sitede aktif SIP trunk yok."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanya detayı (güncel sayaçlarla).
Example request:
curl --request GET \
--get "https://dowaba.com/api/voice-campaigns/1"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanya güncelle — yalnız status=draft.
Example request:
curl --request PUT \
"https://dowaba.com/api/voice-campaigns/1" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"initial_message\": \"amniihfqcoynlazghdtqt\",
\"prompt_override\": \"qxbajwbpilpmufinllwlo\",
\"scheduled_at\": \"2026-08-11T01:53:43\",
\"max_concurrent_calls\": 3
}"
const url = new URL(
"https://dowaba.com/api/voice-campaigns/1"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"initial_message": "amniihfqcoynlazghdtqt",
"prompt_override": "qxbajwbpilpmufinllwlo",
"scheduled_at": "2026-08-11T01:53:43",
"max_concurrent_calls": 3
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'initial_message' => 'amniihfqcoynlazghdtqt',
'prompt_override' => 'qxbajwbpilpmufinllwlo',
'scheduled_at' => '2026-08-11T01:53:43',
'max_concurrent_calls' => 3,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanya sil — koşan kampanya silinemez (önce iptal).
Example request:
curl --request DELETE \
"https://dowaba.com/api/voice-campaigns/1"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanyayı başlat (draft→running). scheduled_at doluysa o andan itibaren aranır.
Example request:
curl --request POST \
"https://dowaba.com/api/voice-campaigns/1/start"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1/start"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1/start';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanyayı duraklat (running→paused). Süren çağrılar kesilmez, yenisi başlamaz.
Example request:
curl --request POST \
"https://dowaba.com/api/voice-campaigns/1/pause"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1/pause"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1/pause';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Duraklatılmış kampanyayı devam ettir (paused→running).
Example request:
curl --request POST \
"https://dowaba.com/api/voice-campaigns/1/resume"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1/resume"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1/resume';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanyayı iptal et — bekleyen alıcılar 'skipped' (cancelled) olur, geri alınamaz.
Example request:
curl --request POST \
"https://dowaba.com/api/voice-campaigns/1/cancel"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1/cancel"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1/cancel';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ulaşılamayanları tekrar ara — no_answer + failed alıcıları pending'e döndürür ve kampanyayı yeniden başlatır. 'skipped' (opt-out/İYS RET) ASLA yeniden aranmaz.
Example request:
curl --request POST \
"https://dowaba.com/api/voice-campaigns/1/retry-failed"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1/retry-failed"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1/retry-failed';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"data": {
"id": 1,
"status": "running"
},
"requeued": 17
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Alıcı logları (sayfalı, status filtreli). voice_conversation_id transkripte link verir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/voice-campaigns/1/recipients?status=failed&page=1"const url = new URL(
"https://dowaba.com/api/voice-campaigns/1/recipients"
);
const params = {
"status": "failed",
"page": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/voice-campaigns/1/recipients';
$response = $client->get(
$url,
[
'query' => [
'status' => 'failed',
'page' => '1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Outbound Messages (Re-engagement)
Faz 6.B — Outbound mesaj niyetlerini (4 kanal: WA/Telegram/Messenger/Instagram) yöneten endpoint'ler. OutboundIntentController (voice) klonu — voice çağrı yerine kanal mesajı.
Kullanıcının erişebileceği TÜM site'lerdeki intent'leri tek listede döndür.
Merkezi panel için (örn. global re-engagement inbox).
Example request:
curl --request GET \
--get "https://dowaba.com/api/outbound-messages/all?channel=whatsapp&kind=message_24h_reengagement&status=pending_approval&per_page=17"const url = new URL(
"https://dowaba.com/api/outbound-messages/all"
);
const params = {
"channel": "whatsapp",
"kind": "message_24h_reengagement",
"status": "pending_approval",
"per_page": "17",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/all';
$response = $client->get(
$url,
[
'query' => [
'channel' => 'whatsapp',
'kind' => 'message_24h_reengagement',
'status' => 'pending_approval',
'per_page' => '17',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Toplu AI mesaj önerisi onayla.
requires authentication
Sadece status=pending_approval olanlar approved olur; diğerleri sessizce
atlanır. Re-engagement worker (her dakika) bir sonraki tetiklemede mesajları
iletir (24h pencere içinde uygun şablon/free-form ile).
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-messages/bulk-approve" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
12,
13,
14
]
}"
const url = new URL(
"https://dowaba.com/api/outbound-messages/bulk-approve"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
12,
13,
14
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/bulk-approve';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
12,
13,
14,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Toplu AI mesaj önerisi reddet.
requires authentication
Yalnızca pending_approval veya approved (henüz gönderilmemiş) intent'ler
reddedilebilir. Worker zaten başlattıysa (queued/in_progress/sent) skip.
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-messages/bulk-decline" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
12,
13,
14
]
}"
const url = new URL(
"https://dowaba.com/api/outbound-messages/bulk-decline"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
12,
13,
14
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/bulk-decline';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
12,
13,
14,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Outbound mesaj niyetlerini listele.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/outbound-messages?channel=whatsapp&kind=message_24h_reengagement&status=pending_approval&per_page=25" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/outbound-messages"
);
const params = {
"channel": "whatsapp",
"kind": "message_24h_reengagement",
"status": "pending_approval",
"per_page": "25",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/outbound-messages';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
'query' => [
'channel' => 'whatsapp',
'kind' => 'message_24h_reengagement',
'status' => 'pending_approval',
'per_page' => '25',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel outbound mesaj niyeti oluştur (status=approved direkt → worker gönderir).
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/outbound-messages" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"channel\": \"whatsapp\",
\"target_identifier\": \"+90 555 *** ** **\",
\"target_name\": \"Ali Veli\",
\"initial_message\": \"Merhaba, konuştuğumuz konudan devam edebilir miyiz?\",
\"scheduled_at\": \"2026-08-02T10:00:00Z\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/outbound-messages"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"channel": "whatsapp",
"target_identifier": "+90 555 *** ** **",
"target_name": "Ali Veli",
"initial_message": "Merhaba, konuştuğumuz konudan devam edebilir miyiz?",
"scheduled_at": "2026-08-02T10:00:00Z"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/outbound-messages';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'channel' => 'whatsapp',
'target_identifier' => '+90 555 *** ** **',
'target_name' => 'Ali Veli',
'initial_message' => 'Merhaba, konuştuğumuz konudan devam edebilir miyiz?',
'scheduled_at' => '2026-08-02T10:00:00Z',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Re-engagement ("Mesaj Önerileri") site ayarlarını getir.
requires authentication
OKUMA yetkisi = SitePolicy::view (isAccessibleBy cascade). Ayarlar mesaj İÇERİĞİ değil operasyonel config → messaging privacy-lock DEĞİL site-görünürlük cascade'i geçerli; yazan herkesin (SitePolicy::update: owner/superadmin/bayi) okuyabilmesi garanti (update ⊂ view). Aksi halde bayi PUT yapabilip GET'te 403 alır (form kırılır).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/outbound-messages/settings" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/sites/1/outbound-messages/settings"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/outbound-messages/settings';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"settings": {
"window_minutes": 240,
"auto_approve": false,
"voice_handoff_enabled": false,
"voice_handoff_days": 10,
"voice_handoff_channel": "sip"
},
"readiness": {
"sip_trunk_active": false,
"whatsapp_calling_active": false,
"gemini_key_present": "[REDACTED]"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Re-engagement site ayarlarını güncelle. Body kısmi olabilir (yalnız gönderilen alanlar yazılır). YAZMA yetkisi = SitePolicy::update (owner + superadmin + bayi cascade; site-team agent politikayı değiştiremez — SiteController::update ile birebir).
requires authentication
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/outbound-messages/settings" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"window_minutes\": 240,
\"auto_approve\": false,
\"voice_handoff_enabled\": false,
\"voice_handoff_days\": 10,
\"voice_handoff_channel\": \"sip\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/outbound-messages/settings"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"window_minutes": 240,
"auto_approve": false,
"voice_handoff_enabled": false,
"voice_handoff_days": 10,
"voice_handoff_channel": "sip"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/outbound-messages/settings';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'window_minutes' => 240,
'auto_approve' => false,
'voice_handoff_enabled' => false,
'voice_handoff_days' => 10,
'voice_handoff_channel' => 'sip',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"settings": {
"window_minutes": 240,
"auto_approve": true,
"voice_handoff_enabled": false,
"voice_handoff_days": 10,
"voice_handoff_channel": "sip"
},
"readiness": {
"sip_trunk_active": false,
"whatsapp_calling_active": false,
"gemini_key_present": "[REDACTED]"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir konuşmadan (kanal + identifier) AI ile re-engagement mesaj önerisi üret + ONAY BEKLEYEN (pending_approval) manuel intent yarat. storeManual'dan bilinçli FARK: o direkt APPROVED yaratır (mesajı kullanıcı yazdı); bu AI ürettiği için kullanıcı ÖNCE gözden geçirsin diye pending_approval doğar.
requires authentication
IDOR: identifier client'tan gelir → konuşmanın bu site'ın kanal profillerine ait mesajları olduğu site-scope'lu sorgu (conversationMessages) ile DOĞRULANIR; başka tenant'ın identifier'ı boş döner → 404. Bu endpoint'in ANA IDOR yüzeyi budur.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/outbound-messages/generate" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"channel\": \"whatsapp\",
\"identifier\": \"+90 555 *** ** **\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/outbound-messages/generate"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"channel": "whatsapp",
"identifier": "+90 555 *** ** **"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/outbound-messages/generate';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'channel' => 'whatsapp',
'identifier' => '+90 555 *** ** **',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"intent": {
"id": 51,
"status": "pending_approval"
},
"created": false
}
Example response (201):
{
"intent": {
"id": 51,
"channel": "whatsapp",
"kind": "manual",
"status": "pending_approval",
"target_identifier": "+90 555 *** ** **",
"initial_message": "Merhaba, ilettiğiniz konuda size nasıl yardımcı olabilirim?"
},
"created": true
}
Example response (404):
{
"message": "conversation_not_found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI önerisini onayla (status=pending_approval → approved).
2026-06-11: declined/cancelled/failed durumları da tekrar onaylanabilir ("Tekrar Onayla"). Worker 24h penceresini gönderim anında zaten kontrol eder (pencere kapalıysa anlamlı failure_reason ile failed'e çeker) — burada ekstra pencere kontrolü gerekmez. completed/queued/in_progress onaylanamaz (çift gönderim riski).
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-messages/1/approve" \
--header "Content-Type: application/json" \
--data "{
\"initial_message\": \"vmqeopfuudtdsufvyvddq\",
\"scheduled_at\": \"2026-08-11T01:53:44\",
\"target_identifier\": \"amniihfqcoynlazghdtqt\",
\"target_name\": \"qxbajwbpilpmufinllwlo\"
}"
const url = new URL(
"https://dowaba.com/api/outbound-messages/1/approve"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"initial_message": "vmqeopfuudtdsufvyvddq",
"scheduled_at": "2026-08-11T01:53:44",
"target_identifier": "amniihfqcoynlazghdtqt",
"target_name": "qxbajwbpilpmufinllwlo"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/1/approve';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'initial_message' => 'vmqeopfuudtdsufvyvddq',
'scheduled_at' => '2026-08-11T01:53:44',
'target_identifier' => 'amniihfqcoynlazghdtqt',
'target_name' => 'qxbajwbpilpmufinllwlo',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI önerisini reddet.
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-messages/1/decline"const url = new URL(
"https://dowaba.com/api/outbound-messages/1/decline"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/1/decline';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Henüz gönderilmemiş approved/queued intent'i iptal et.
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-messages/1/cancel"const url = new URL(
"https://dowaba.com/api/outbound-messages/1/cancel"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/1/cancel';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI ile öneri mesajını YENİDEN YAZ (preview — KAYDETMEZ). Panel operatörünün serbest-metin talimatını mevcut öneriye uygular, sonucu döndürür ama intent'e YAZMAZ (kullanıcı beğenirse PATCH /outbound-messages/{intent} ile kaydeder).
requires authentication
Yalnız pending_approval intent'lerde çalışır — onaylanmış/gönderilmiş bir öneriyi yeniden yazmak anlamsız. Gemini çağrısı yapar (throttle:30,1 route'ta).
Example request:
curl --request POST \
"https://dowaba.com/api/outbound-messages/1/ai-rewrite" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"instruction\": \"Daha kısa ve resmi yaz, indirim önerme\"
}"
const url = new URL(
"https://dowaba.com/api/outbound-messages/1/ai-rewrite"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"instruction": "Daha kısa ve resmi yaz, indirim önerme"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/1/ai-rewrite';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'instruction' => 'Daha kısa ve resmi yaz, indirim önerme',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"current": "Merhaba, konuştuğumuz konudan devam edebilir miyiz?",
"suggested": "Merhaba, ilettiğiniz konuda size nasıl yardımcı olabilirim?",
"language": "tr"
}
Example response (422):
{
"success": false,
"error": "Bu intent 'approved' durumunda — yalnız onay bekleyen öneriler AI ile düzenlenebilir."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Onay bekleyen öneri mesajını ELLE düzenle (kaydeder). ai-rewrite'ın preview çıktısını veya kullanıcının kendi yazdığını initial_message'a yazar — yalnız pending_approval intent'lerde (onaylanmış/gönderilmiş mesaj değiştirilemez).
requires authentication
metadata.ai_edited_at damgası güncellenir; diğer metadata alanları korunur.
Example request:
curl --request PATCH \
"https://dowaba.com/api/outbound-messages/1" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"initial_message\": \"Merhaba, ilettiğiniz konuda size nasıl yardımcı olabilirim?\"
}"
const url = new URL(
"https://dowaba.com/api/outbound-messages/1"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"initial_message": "Merhaba, ilettiğiniz konuda size nasıl yardımcı olabilirim?"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/1';
$response = $client->patch(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'initial_message' => 'Merhaba, ilettiğiniz konuda size nasıl yardımcı olabilirim?',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"intent": {
"id": 42,
"channel": "whatsapp",
"kind": "message_24h_reengagement",
"status": "pending_approval",
"target_identifier": "+90 555 *** ** **",
"initial_message": "Merhaba, size nasıl yardımcı olabilirim?"
}
}
Example response (422):
{
"success": false,
"error": "Bu intent 'approved' durumunda — yalnız onay bekleyen öneriler düzenlenebilir."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşma geçmişi — peek modal için (re-engagement önerisinin dayandığı mesajlar).
requires authentication
Tüm kanallar (WA/Telegram/Messenger/Instagram/Mail) için TEK yol: intent.site_id + intent.target_identifier ile MessageContextAnalyzerService'in kanal-başı sorgularından son N mesaj. Instagram bug fix (2026-05-29): eski frontend kanal-spesifik ad-hoc çağrı yapıyordu, IG'de profile_id olmadığı için boş dönüyordu — artık intent üzerinden, authz cascade ile.
Example request:
curl --request GET \
--get "https://dowaba.com/api/outbound-messages/1/conversation" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/outbound-messages/1/conversation"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/outbound-messages/1/conversation';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"messages": [
{
"direction": "in",
"text": "Merhaba",
"created_at": "2026-05-29T14:07:47+00:00"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu Sistemi — Randevular
Randevuları filtreli listele (tarih aralığı, durum, hizmet, personel, müşteri arama).
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointments?external_ref=SIP-1001"const url = new URL(
"https://dowaba.com/api/appointments"
);
const params = {
"external_ref": "SIP-1001",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments';
$response = $client->get(
$url,
[
'query' => [
'external_ref' => 'SIP-1001',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni randevu oluştur (admin tarafı). SMS + e-posta bildirimleri tetiklenir. `staff_id` gönderilen personel o tarihte İZİNLİYSE randevu yazılmaz ve `staff_id` alanı altında 422 döner (DM3, 2026-08-08). İzin `POST /api/appointment-staff/{staff}/time-off` ile tanımlanır; hiç izin tanımlanmamış bir kurulumda bu red HİÇ oluşmaz.
Example request:
curl --request POST \
"https://dowaba.com/api/appointments" \
--header "Content-Type: application/json" \
--data "{
\"customer_name\": \"vmqeopfuudtdsufvyvddq\",
\"customer_phone\": \"amniihfqcoynlazgh\",
\"customer_email\": \"roob.mona@example.org\",
\"date\": \"2107-09-09\",
\"start_time\": \"01:53\",
\"end_time\": \"2107-09-09\",
\"notes\": \"mqeopfuudtdsufvyvddqa\",
\"source\": \"chatbot\",
\"external_ref\": \"SIP-1001\"
}"
const url = new URL(
"https://dowaba.com/api/appointments"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"customer_name": "vmqeopfuudtdsufvyvddq",
"customer_phone": "amniihfqcoynlazgh",
"customer_email": "roob.mona@example.org",
"date": "2107-09-09",
"start_time": "01:53",
"end_time": "2107-09-09",
"notes": "mqeopfuudtdsufvyvddqa",
"source": "chatbot",
"external_ref": "SIP-1001"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'customer_name' => 'vmqeopfuudtdsufvyvddq',
'customer_phone' => 'amniihfqcoynlazgh',
'customer_email' => 'roob.mona@example.org',
'date' => '2107-09-09',
'start_time' => '01:53',
'end_time' => '2107-09-09',
'notes' => 'mqeopfuudtdsufvyvddqa',
'source' => 'chatbot',
'external_ref' => 'SIP-1001',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu istatistikleri (toplam, durum dağılımı, vb.).
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointments/stats"const url = new URL(
"https://dowaba.com/api/appointments/stats"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments/stats';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Belirli bir tarih için müsait randevu slot'larını getir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointments/available-slots" \
--header "Content-Type: application/json" \
--data "{
\"date\": \"2026-08-11T01:53:38\"
}"
const url = new URL(
"https://dowaba.com/api/appointments/available-slots"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"date": "2026-08-11T01:53:38"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments/available-slots';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'date' => '2026-08-11T01:53:38',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek randevu detayı (hizmet + personel ile).
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointments/42"const url = new URL(
"https://dowaba.com/api/appointments/42"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments/42';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevuyu güncelle (saat/tarih değişirse mail bildirimi gider). `date` ya da `staff_id` gönderildiğinde HEDEF (personel, tarih) çifti kontrol edilir: personel o tarihte İZİNLİYSE randevu taşınmaz ve `staff_id` altında 422 döner (DM3, 2026-08-08). Kapı yalnız TAŞIMAYA bakar — izinli güne düşmüş mevcut bir randevunun notu/telefonu/durumu her zaman düzenlenebilir. `service_id` ya da `staff_id` gönderildiğinde HEDEF (hizmet, personel) çifti de kontrol edilir: hizmetin eşleme listesi VARSA ve personel o listede değilse randevu taşınmaz, `staff_id` altında 422 döner (DM4, 2026-08-08). Eşleme tanımlanmamış bir kurulumda bu red HİÇ oluşmaz.
Example request:
curl --request PUT \
"https://dowaba.com/api/appointments/7" \
--header "Content-Type: application/json" \
--data "{
\"customer_name\": \"vmqeopfuudtdsufvyvddq\",
\"customer_phone\": \"amniihfqcoynlazgh\",
\"customer_email\": \"roob.mona@example.org\",
\"date\": \"2026-08-11T01:53:38\",
\"start_time\": \"01:53\",
\"end_time\": \"01:53\",
\"status\": \"no_show\",
\"notes\": \"xbajwbpilpmufinllwloa\",
\"cancel_reason\": \"uydlsmsjuryvojcybzvrb\"
}"
const url = new URL(
"https://dowaba.com/api/appointments/7"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"customer_name": "vmqeopfuudtdsufvyvddq",
"customer_phone": "amniihfqcoynlazgh",
"customer_email": "roob.mona@example.org",
"date": "2026-08-11T01:53:38",
"start_time": "01:53",
"end_time": "01:53",
"status": "no_show",
"notes": "xbajwbpilpmufinllwloa",
"cancel_reason": "uydlsmsjuryvojcybzvrb"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments/7';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'customer_name' => 'vmqeopfuudtdsufvyvddq',
'customer_phone' => 'amniihfqcoynlazgh',
'customer_email' => 'roob.mona@example.org',
'date' => '2026-08-11T01:53:38',
'start_time' => '01:53',
'end_time' => '01:53',
'status' => 'no_show',
'notes' => 'xbajwbpilpmufinllwloa',
'cancel_reason' => 'uydlsmsjuryvojcybzvrb',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevuyu sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/appointments/12"const url = new URL(
"https://dowaba.com/api/appointments/12"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments/12';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu durumunu güncelle (pending/confirmed/cancelled/completed/no_show). SMS + e-posta tetikler.
Example request:
curl --request PATCH \
"https://dowaba.com/api/appointments/42/status" \
--header "Content-Type: application/json" \
--data "{
\"status\": \"completed\",
\"cancel_reason\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/appointments/42/status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "completed",
"cancel_reason": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointments/42/status';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'status' => 'completed',
'cancel_reason' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu Sistemi — Hizmetler
Hizmet listesi (sıralı). Her satır DM4 (2026-08-08) ile birlikte `staff_ids` alanını da taşır: hizmeti verebilen personelin id listesi. **BOŞ DİZİ "kimse vermiyor" DEĞİL, "TÜM personel verebilir" demektir** — eşleme tanımlanmamış hizmetin bugünkü davranışı budur.
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointment-services"const url = new URL(
"https://dowaba.com/api/appointment-services"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-services';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni hizmet oluştur (süre + opsiyonel fiyat).
Example request:
curl --request POST \
"https://dowaba.com/api/appointment-services" \
--header "Content-Type: application/json" \
--data "{
\"description\": \"Saç kesimi ve fön, yıkama dahil\",
\"staff_ids\": [
5,
8
]
}"
const url = new URL(
"https://dowaba.com/api/appointment-services"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"description": "Saç kesimi ve fön, yıkama dahil",
"staff_ids": [
5,
8
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-services';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'description' => 'Saç kesimi ve fön, yıkama dahil',
'staff_ids' => [
5,
8,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tüm hizmetlerin fiyatını yüzde veya sabit tutar ile artır/azalt.
Example request:
curl --request POST \
"https://dowaba.com/api/appointment-services/bulk-price" \
--header "Content-Type: application/json" \
--data "{
\"type\": \"fixed\",
\"direction\": \"decrease\",
\"value\": 73
}"
const url = new URL(
"https://dowaba.com/api/appointment-services/bulk-price"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"type": "fixed",
"direction": "decrease",
"value": 73
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-services/bulk-price';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'type' => 'fixed',
'direction' => 'decrease',
'value' => 73,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hizmeti güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/appointment-services/7" \
--header "Content-Type: application/json" \
--data "{
\"description\": \"Saç kesimi ve fön, yıkama dahil\",
\"staff_ids\": [
5,
8
]
}"
const url = new URL(
"https://dowaba.com/api/appointment-services/7"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"description": "Saç kesimi ve fön, yıkama dahil",
"staff_ids": [
5,
8
]
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-services/7';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'description' => 'Saç kesimi ve fön, yıkama dahil',
'staff_ids' => [
5,
8,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hizmeti sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/appointment-services/7"const url = new URL(
"https://dowaba.com/api/appointment-services/7"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-services/7';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu Sistemi — Personel
Personel listesi. `site_id` verilirse o siteye atanmış + tüm sitelerde geçerli (site_id NULL) personel döner.
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointment-staff?site_id=7"const url = new URL(
"https://dowaba.com/api/appointment-staff"
);
const params = {
"site_id": "7",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-staff';
$response = $client->get(
$url,
[
'query' => [
'site_id' => '7',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni personel ekle (ad, ünvan, çalışma saatleri).
Example request:
curl --request POST \
"https://dowaba.com/api/appointment-staff" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"title\": \"amniihfqcoynlazghdtqt\",
\"phone\": \"qxbajwbpilpmufinl\",
\"email\": \"imogene.mante@example.com\",
\"is_active\": true,
\"sort_order\": 72,
\"site_id\": 7,
\"external_ref\": \"stf-42\"
}"
const url = new URL(
"https://dowaba.com/api/appointment-staff"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"title": "amniihfqcoynlazghdtqt",
"phone": "qxbajwbpilpmufinl",
"email": "imogene.mante@example.com",
"is_active": true,
"sort_order": 72,
"site_id": 7,
"external_ref": "stf-42"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-staff';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'title' => 'amniihfqcoynlazghdtqt',
'phone' => 'qxbajwbpilpmufinl',
'email' => 'imogene.mante@example.com',
'is_active' => true,
'sort_order' => 72,
'site_id' => 7,
'external_ref' => 'stf-42',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Personel bilgilerini güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/appointment-staff/5" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"title\": \"amniihfqcoynlazghdtqt\",
\"phone\": \"qxbajwbpilpmufinl\",
\"email\": \"imogene.mante@example.com\",
\"is_active\": false,
\"sort_order\": 72,
\"site_id\": 7,
\"external_ref\": \"stf-42\"
}"
const url = new URL(
"https://dowaba.com/api/appointment-staff/5"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"title": "amniihfqcoynlazghdtqt",
"phone": "qxbajwbpilpmufinl",
"email": "imogene.mante@example.com",
"is_active": false,
"sort_order": 72,
"site_id": 7,
"external_ref": "stf-42"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-staff/5';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'title' => 'amniihfqcoynlazghdtqt',
'phone' => 'qxbajwbpilpmufinl',
'email' => 'imogene.mante@example.com',
'is_active' => false,
'sort_order' => 72,
'site_id' => 7,
'external_ref' => 'stf-42',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Personel kaydını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/appointment-staff/5"const url = new URL(
"https://dowaba.com/api/appointment-staff/5"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-staff/5';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Personelin izin/tatil aralıkları (eskiden yeniye).
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointment-staff/5/time-off"const url = new URL(
"https://dowaba.com/api/appointment-staff/5/time-off"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-staff/5/time-off';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Personele izin/tatil aralığı ekle. Aralık her İKİ UÇTA DA kapalıdır; tek günlük izin için `starts_on` = `ends_on` gönderin. İzinli tarihte o personelin slotları BOŞ döner ve randevu yazımı 422 ile reddedilir.
Example request:
curl --request POST \
"https://dowaba.com/api/appointment-staff/5/time-off" \
--header "Content-Type: application/json" \
--data "{
\"starts_on\": \"2026-08-12\",
\"ends_on\": \"2026-08-16\",
\"reason\": \"Yıllık izin\"
}"
const url = new URL(
"https://dowaba.com/api/appointment-staff/5/time-off"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"starts_on": "2026-08-12",
"ends_on": "2026-08-16",
"reason": "Yıllık izin"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-staff/5/time-off';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'starts_on' => '2026-08-12',
'ends_on' => '2026-08-16',
'reason' => 'Yıllık izin',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İzin kaydını sil (personel o tarihlerde yeniden randevuya açılır).
Example request:
curl --request DELETE \
"https://dowaba.com/api/appointment-staff/5/time-off/12"const url = new URL(
"https://dowaba.com/api/appointment-staff/5/time-off/12"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-staff/5/time-off/12';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu Sistemi — Ayarlar
Randevu ayarlarını getir (çalışma saatleri, slot süresi, tatiller, vb.).
Example request:
curl --request GET \
--get "https://dowaba.com/api/appointment-settings"const url = new URL(
"https://dowaba.com/api/appointment-settings"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-settings';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu ayarlarını güncelle (saat dilimleri, otomatik onay, sesli hatırlatma vb.).
Example request:
curl --request PUT \
"https://dowaba.com/api/appointment-settings" \
--header "Content-Type: application/json" \
--data "{
\"slot_duration\": 21,
\"break_between\": 13,
\"advance_booking_days\": 16,
\"auto_confirm\": true,
\"send_sms_notification\": true,
\"send_whatsapp_notification\": true,
\"send_email_notification\": false,
\"notify_admin_phone\": \"eopfuudtdsufvyvdd\",
\"notify_admin_email\": \"jaylan50@example.com\",
\"send_sms_to_staff_on_confirm\": false,
\"confirmation_message\": \"ihfqcoynlazghdtqtqxba\",
\"cancellation_message\": \"jwbpilpmufinllwloauyd\",
\"reminder_message\": \"lsmsjuryvojcybzvrbyic\",
\"send_call_reminder\": false,
\"call_reminder_hours_before\": 11,
\"call_reminder_message_template\": \"znkygloigmkwxphlvazjr\",
\"send_wa_reminder\": false,
\"wa_reminder_minutes_before\": 3,
\"wa_reminder_profile_id\": 17,
\"wa_reminder_customer_enabled\": false,
\"wa_reminder_customer_template\": \"mqeopfuudtdsufvyvddqa\",
\"wa_reminder_customer_language\": \"mniihfqco\",
\"wa_reminder_staff_enabled\": false,
\"wa_reminder_staff_template\": \"ynlazghdtqtqxbajwbpil\",
\"wa_reminder_staff_language\": \"pmufinllw\"
}"
const url = new URL(
"https://dowaba.com/api/appointment-settings"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"slot_duration": 21,
"break_between": 13,
"advance_booking_days": 16,
"auto_confirm": true,
"send_sms_notification": true,
"send_whatsapp_notification": true,
"send_email_notification": false,
"notify_admin_phone": "eopfuudtdsufvyvdd",
"notify_admin_email": "jaylan50@example.com",
"send_sms_to_staff_on_confirm": false,
"confirmation_message": "ihfqcoynlazghdtqtqxba",
"cancellation_message": "jwbpilpmufinllwloauyd",
"reminder_message": "lsmsjuryvojcybzvrbyic",
"send_call_reminder": false,
"call_reminder_hours_before": 11,
"call_reminder_message_template": "znkygloigmkwxphlvazjr",
"send_wa_reminder": false,
"wa_reminder_minutes_before": 3,
"wa_reminder_profile_id": 17,
"wa_reminder_customer_enabled": false,
"wa_reminder_customer_template": "mqeopfuudtdsufvyvddqa",
"wa_reminder_customer_language": "mniihfqco",
"wa_reminder_staff_enabled": false,
"wa_reminder_staff_template": "ynlazghdtqtqxbajwbpil",
"wa_reminder_staff_language": "pmufinllw"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/appointment-settings';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'slot_duration' => 21,
'break_between' => 13,
'advance_booking_days' => 16,
'auto_confirm' => true,
'send_sms_notification' => true,
'send_whatsapp_notification' => true,
'send_email_notification' => false,
'notify_admin_phone' => 'eopfuudtdsufvyvdd',
'notify_admin_email' => 'jaylan50@example.com',
'send_sms_to_staff_on_confirm' => false,
'confirmation_message' => 'ihfqcoynlazghdtqtqxba',
'cancellation_message' => 'jwbpilpmufinllwloauyd',
'reminder_message' => 'lsmsjuryvojcybzvrbyic',
'send_call_reminder' => false,
'call_reminder_hours_before' => 11,
'call_reminder_message_template' => 'znkygloigmkwxphlvazjr',
'send_wa_reminder' => false,
'wa_reminder_minutes_before' => 3,
'wa_reminder_profile_id' => 17,
'wa_reminder_customer_enabled' => false,
'wa_reminder_customer_template' => 'mqeopfuudtdsufvyvddqa',
'wa_reminder_customer_language' => 'mniihfqco',
'wa_reminder_staff_enabled' => false,
'wa_reminder_staff_template' => 'ynlazghdtqtqxbajwbpil',
'wa_reminder_staff_language' => 'pmufinllw',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu Sistemi — Dış API
Sitenin randevu hizmetleri (fiyat dahil). Kapsam: site sahibinin, bu siteye atanmış (`site_id` = site) VEYA tüm sitelerde geçerli (`site_id` NULL) hizmetleri. `staff_ids` = hizmeti verebilen personelin id listesi (DM4). **BOŞ DİZİ "kimse vermiyor" DEĞİL, "TÜM personel verebilir" demektir** — eşleme tanımlanmamış hizmetin davranışı budur.
Example request:
curl --request GET \
--get "https://dowaba.com/api/external/appointments/services?include_inactive=1" \
--header "X-Api-Key: dse_xxxxxxxx" \
--header "Content-Type: application/json" \
--data "{
\"include_inactive\": false
}"
const url = new URL(
"https://dowaba.com/api/external/appointments/services"
);
const params = {
"include_inactive": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-Api-Key": "dse_xxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"include_inactive": false
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/external/appointments/services';
$response = $client->get(
$url,
[
'headers' => [
'X-Api-Key' => 'dse_xxxxxxxx',
'Content-Type' => 'application/json',
],
'query' => [
'include_inactive' => '1',
],
'json' => [
'include_inactive' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 7,
"external_ref": "svc-12",
"name": "Muayene",
"description": null,
"duration_minutes": 45,
"price": "450.00",
"currency": "TRY",
"is_active": true,
"staff_ids": [
5
]
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin randevu personeli. ⚠️ Panel personel listesinin alan kümesi DEĞİLDİR: `phone`, `email`, `working_hours` ve iç alanlar BİLİNÇLİ olarak dışarıdadır (personel PII'si dış entegratörün işi değildir; çalışma saatleri zaten `available-slots` üzerinden dolaylı olarak sunulur). `service_id` verilirse ve o hizmetin eşleme listesi VARSA liste yalnız hizmeti verebilen personele daralır (DM4).
Example request:
curl --request GET \
--get "https://dowaba.com/api/external/appointments/staff?service_id=7&include_inactive=1" \
--header "X-Api-Key: dse_xxxxxxxx" \
--header "Content-Type: application/json" \
--data "{
\"include_inactive\": true
}"
const url = new URL(
"https://dowaba.com/api/external/appointments/staff"
);
const params = {
"service_id": "7",
"include_inactive": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-Api-Key": "dse_xxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"include_inactive": true
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/external/appointments/staff';
$response = $client->get(
$url,
[
'headers' => [
'X-Api-Key' => 'dse_xxxxxxxx',
'Content-Type' => 'application/json',
],
'query' => [
'service_id' => '7',
'include_inactive' => '1',
],
'json' => [
'include_inactive' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 5,
"external_ref": "stf-42",
"name": "Dr. Mehmet",
"title": "Diş Hekimi",
"is_active": true
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir gün için müsait randevu slotları. Slot ızgarası `service_id` verilirse hizmetin süresine, `staff_id` verilirse personelin kendi çalışma saatlerine göre kurulur. Personel o tarihte izinliyse (DM3) veya hizmeti vermiyorsa (DM4) liste BOŞ döner — `POST` de aynı kombinasyonu 422 ile reddeder (motor ile yazma kapısı ASLA ayrışmaz).
Example request:
curl --request GET \
--get "https://dowaba.com/api/external/appointments/available-slots?date=2026-08-12&service_id=7&staff_id=5" \
--header "X-Api-Key: dse_xxxxxxxx" \
--header "Content-Type: application/json" \
--data "{
\"date\": \"2026-08-11\"
}"
const url = new URL(
"https://dowaba.com/api/external/appointments/available-slots"
);
const params = {
"date": "2026-08-12",
"service_id": "7",
"staff_id": "5",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-Api-Key": "dse_xxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"date": "2026-08-11"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/external/appointments/available-slots';
$response = $client->get(
$url,
[
'headers' => [
'X-Api-Key' => 'dse_xxxxxxxx',
'Content-Type' => 'application/json',
],
'query' => [
'date' => '2026-08-12',
'service_id' => '7',
'staff_id' => '5',
],
'json' => [
'date' => '2026-08-11',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"start": "10:00",
"end": "10:45"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin randevularını listele (sayfalı, en yeni tarih başta). ⚠️ Yalnız BU SİTEYE bağlı randevular döner. Panelden site seçilmeden açılmış (`site_id` NULL) randevular bu yüzeyde görünmez.
Example request:
curl --request GET \
--get "https://dowaba.com/api/external/appointments?status=confirmed&date_from=2026-08-01&date_to=2026-08-31&service_id=7&staff_id=5&external_ref=SIP-1001&per_page=50&page=2" \
--header "X-Api-Key: dse_xxxxxxxx" \
--header "Content-Type: application/json" \
--data "{
\"date_from\": \"2026-08-11\",
\"date_to\": \"2026-08-11\",
\"external_ref\": \"vmqeopfuudtdsufvyvddq\",
\"page\": 2
}"
const url = new URL(
"https://dowaba.com/api/external/appointments"
);
const params = {
"status": "confirmed",
"date_from": "2026-08-01",
"date_to": "2026-08-31",
"service_id": "7",
"staff_id": "5",
"external_ref": "SIP-1001",
"per_page": "50",
"page": "2",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"X-Api-Key": "dse_xxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"date_from": "2026-08-11",
"date_to": "2026-08-11",
"external_ref": "vmqeopfuudtdsufvyvddq",
"page": 2
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/external/appointments';
$response = $client->get(
$url,
[
'headers' => [
'X-Api-Key' => 'dse_xxxxxxxx',
'Content-Type' => 'application/json',
],
'query' => [
'status' => 'confirmed',
'date_from' => '2026-08-01',
'date_to' => '2026-08-31',
'service_id' => '7',
'staff_id' => '5',
'external_ref' => 'SIP-1001',
'per_page' => '50',
'page' => '2',
],
'json' => [
'date_from' => '2026-08-11',
'date_to' => '2026-08-11',
'external_ref' => 'vmqeopfuudtdsufvyvddq',
'page' => 2,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [],
"meta": {
"current_page": 1,
"per_page": 20,
"total": 0,
"last_page": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevu oluştur. Randevu HER ZAMAN anahtarın sitesine ve site sahibine yazılır; `user_id`, `site_id` ve `source` çağırandan ALINMAZ. **Idempotency (DM1):** `external_ref` gönderirsen aynı değer ikinci kez randevu YARATMAZ, `external_ref` alanı altında 422 döner — ağ zaman aşımında isteği tekrarlayan entegrasyon çift randevu + çift bildirim üretmez. Tekillik hesap kapsamındadır. Mevcut kaydı bulmak için `GET /api/external/appointments?external_ref=…`. Reddedilme sebepleri (422): personel o tarihte izinli (DM3) · personel bu hizmeti vermiyor (DM4) · `external_ref` tekrarı · alan doğrulaması. ⚠️ Çakışma DENETLENMEZ: dolu bir saate yazmak engellenmez (bugünkü çekirdek sözleşme). Önce `available-slots` sor.
Example request:
curl --request POST \
"https://dowaba.com/api/external/appointments" \
--header "X-Api-Key: dse_xxxxxxxx" \
--header "Content-Type: application/json" \
--data "{
\"service_id\": 7,
\"staff_id\": 5,
\"customer_name\": \"Ayşe Yılmaz\",
\"customer_phone\": \"905551234567\",
\"customer_email\": \"ayse@example.com\",
\"date\": \"2026-08-12\",
\"start_time\": \"10:00\",
\"end_time\": \"10:45\",
\"notes\": \"İlk muayene\",
\"external_ref\": \"SIP-1001\"
}"
const url = new URL(
"https://dowaba.com/api/external/appointments"
);
const headers = {
"X-Api-Key": "dse_xxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"service_id": 7,
"staff_id": 5,
"customer_name": "Ayşe Yılmaz",
"customer_phone": "905551234567",
"customer_email": "ayse@example.com",
"date": "2026-08-12",
"start_time": "10:00",
"end_time": "10:45",
"notes": "İlk muayene",
"external_ref": "SIP-1001"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/external/appointments';
$response = $client->post(
$url,
[
'headers' => [
'X-Api-Key' => 'dse_xxxxxxxx',
'Content-Type' => 'application/json',
],
'json' => [
'service_id' => 7,
'staff_id' => 5,
'customer_name' => 'Ayşe Yılmaz',
'customer_phone' => '905551234567',
'customer_email' => 'ayse@example.com',
'date' => '2026-08-12',
'start_time' => '10:00',
'end_time' => '10:45',
'notes' => 'İlk muayene',
'external_ref' => 'SIP-1001',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"success": true,
"message": "Randevu oluşturuldu",
"data": {
"id": 42,
"status": "pending"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Randevunun durumunu değiştir. Panel `PATCH /api/appointments/{id}/status` ile AYNI yan etkiler: `cancelled` → müşteri + personel iptal SMS'i ve iptal e-postası; `confirmed` → müşteri + personel onay SMS'i ve onay e-postası. Diğer durumlarda yalnız satır güncellenir. Aynı durumla tekrarlanan istek idempotenttir: SMS/e-posta yeniden gönderilmez. Tek istisna, zaten iptal edilmiş randevuda açıkça gönderilen `cancel_reason` değeridir; sebep bildirimsiz güncellenebilir. Alan hiç gönderilmezse mevcut sebep korunur. ⚠️ Yalnız anahtarın sitesine ait randevu değiştirilebilir; başka site (ya da site'siz panel randevusu) 404 alır.
Example request:
curl --request PATCH \
"https://dowaba.com/api/external/appointments/42/status" \
--header "X-Api-Key: dse_xxxxxxxx" \
--header "Content-Type: application/json" \
--data "{
\"status\": \"cancelled\",
\"cancel_reason\": \"Müşteri talebi\"
}"
const url = new URL(
"https://dowaba.com/api/external/appointments/42/status"
);
const headers = {
"X-Api-Key": "dse_xxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "cancelled",
"cancel_reason": "Müşteri talebi"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/external/appointments/42/status';
$response = $client->patch(
$url,
[
'headers' => [
'X-Api-Key' => 'dse_xxxxxxxx',
'Content-Type' => 'application/json',
],
'json' => [
'status' => 'cancelled',
'cancel_reason' => 'Müşteri talebi',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Durum güncellendi",
"data": {
"id": 42,
"status": "cancelled"
}
}
Example response (404):
{
"success": false,
"error": "Randevu bulunamadı"
}
Example response (409):
{
"success": false,
"error": "status_update_in_progress",
"retry_after": 1
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp Entegrasyonu
Kullanıcının tüm WhatsApp profillerini listele (link sayısıyla).
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni WhatsApp profili oluştur (Meta Cloud API veya Evolution API).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"phone_number_id\": \"102290129340398\",
\"business_account_id\": \"102290129340399\",
\"app_id\": \"1234567890\",
\"graph_version\": \"v24.0\",
\"waba_id\": \"102290129340399\",
\"instagram_account_id\": \"17841400000000000\",
\"notification_phone\": \"mqeopfuudtdsufvyv\",
\"netgsm_username\": \"ddqamniihfqcoynlazghd\",
\"netgsm_password\": \"tqtqxbajwbpilpmufinll\",
\"netgsm_header\": \"wloauydls\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"phone_number_id": "102290129340398",
"business_account_id": "102290129340399",
"app_id": "1234567890",
"graph_version": "v24.0",
"waba_id": "102290129340399",
"instagram_account_id": "17841400000000000",
"notification_phone": "mqeopfuudtdsufvyv",
"netgsm_username": "ddqamniihfqcoynlazghd",
"netgsm_password": "tqtqxbajwbpilpmufinll",
"netgsm_header": "wloauydls"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'phone_number_id' => '102290129340398',
'business_account_id' => '102290129340399',
'app_id' => '1234567890',
'graph_version' => 'v24.0',
'waba_id' => '102290129340399',
'instagram_account_id' => '17841400000000000',
'notification_phone' => 'mqeopfuudtdsufvyv',
'netgsm_username' => 'ddqamniihfqcoynlazghd',
'netgsm_password' => 'tqtqxbajwbpilpmufinll',
'netgsm_header' => 'wloauydls',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek WhatsApp profilini detayıyla getirir. Profilin sahibi, sahibinin bayisi (yönetim cascade'i) ve superadmin erişebilir; yanıt, entegrasyon ayarlarını düzenleyebilmeniz için profilin bağlantı bilgilerini içerir. Cascade dışındaki profillere erişim 403 döner.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp profil bilgilerini güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/whatsapp-profiles/6" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"phone_number_id\": \"102290129340398\",
\"business_account_id\": \"102290129340399\",
\"app_id\": \"1234567890\",
\"short_token\": \"mqeopfuudtdsufvyvddqamniihfqcoynlazghdtqtqxbajwbpilpmufinllwloauydlsmsjuryvojcybzvrbyickznkygloigmkwxphlvazjrcnfbaqywuxhgjjmzuxjubqouzswiwx\",
\"graph_version\": \"v24.0\",
\"waba_id\": \"102290129340399\",
\"instagram_account_id\": \"17841400000000000\",
\"notification_phone\": \"mqeopfuudtdsufvyv\",
\"netgsm_username\": \"ddqamniihfqcoynlazghd\",
\"netgsm_password\": \"tqtqxbajwbpilpmufinll\",
\"netgsm_header\": \"wloauydls\",
\"is_active\": true
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"phone_number_id": "102290129340398",
"business_account_id": "102290129340399",
"app_id": "1234567890",
"short_token": "mqeopfuudtdsufvyvddqamniihfqcoynlazghdtqtqxbajwbpilpmufinllwloauydlsmsjuryvojcybzvrbyickznkygloigmkwxphlvazjrcnfbaqywuxhgjjmzuxjubqouzswiwx",
"graph_version": "v24.0",
"waba_id": "102290129340399",
"instagram_account_id": "17841400000000000",
"notification_phone": "mqeopfuudtdsufvyv",
"netgsm_username": "ddqamniihfqcoynlazghd",
"netgsm_password": "tqtqxbajwbpilpmufinll",
"netgsm_header": "wloauydls",
"is_active": true
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'phone_number_id' => '102290129340398',
'business_account_id' => '102290129340399',
'app_id' => '1234567890',
'short_token' => 'mqeopfuudtdsufvyvddqamniihfqcoynlazghdtqtqxbajwbpilpmufinllwloauydlsmsjuryvojcybzvrbyickznkygloigmkwxphlvazjrcnfbaqywuxhgjjmzuxjubqouzswiwx',
'graph_version' => 'v24.0',
'waba_id' => '102290129340399',
'instagram_account_id' => '17841400000000000',
'notification_phone' => 'mqeopfuudtdsufvyv',
'netgsm_username' => 'ddqamniihfqcoynlazghd',
'netgsm_password' => 'tqtqxbajwbpilpmufinll',
'netgsm_header' => 'wloauydls',
'is_active' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp profilini KALICI sil — her yerden temizler: 1. Evolution API: önce logout (oturumu kes), sonra deleteInstance. Logout sırasındaki "instance not connected" hatası normal — yine de delete dene. 2. site_whatsapp_profile pivot satırlarını sil (FK cascade'i bekleme). 3. WhatsappProfile DB satırını sil. Response: evolution_cleaned + warnings array — frontend kullanıcıya net feedback verir. Kullanıcı "her yerden temiz silinsin" istediğinde bu endpoint çağrılır; arta kalan kalıntı kalmaz, aynı telefon yeniden bağlanırsa temiz başlar.
Example request:
curl --request DELETE \
"https://dowaba.com/api/whatsapp-profiles/6"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp profil bağlantısını test et (Meta API veya Evolution status).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/test"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kanal-bazlı AI bot aç/kapat ("Botu Durdur" / "Botu Başlat" — entegrasyon sayfası). Profil seviyesinde AI otomatik yanıtı durdurur/başlatır; gelen mesajlar inbox'a düşmeye devam eder ve kampanya gönderimleri etkilenmez. Yalnızca sahibi olduğunuz veya yetkilendirildiğiniz (bayi/ekip erişimi) profiller değiştirilebilir. Yanıt anahtarı `bot_active`'tir (tüm kanal API'lerinde ortak).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/toggle-bot"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/toggle-bot"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/toggle-bot';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp sesli arama (Calling) bayrağını aç/kapat (Dowaba dahili flag). Voice Privacy v3 bridge parity hazır değilken açma isteği fail-closed 409 döner; kapatma, eski etkin satırları güvenli hale getirmek için açıktır. Açma dalında bağlı sitenin çağrı gizlilik ayarları EKSİKSE sistem bunları meşru menfaat esasıyla otomatik oluşturur (2026-08-04); kurulan siteler yanıtta `data.auto_provisioned_sites` ile döner ve site sahibine bildirim gider. Sahibin yasal belge onayı eksikse otomatik kurulum YAPILMAZ ve `voice_privacy_incomplete` 409'u döner (VOICE_PRIVACY.md § 6.2).
Example request:
curl --request PATCH \
"https://dowaba.com/api/whatsapp-profiles/6/calling" \
--header "Content-Type: application/json" \
--data "{
\"enabled\": false
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/calling"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"enabled": false
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/calling';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'enabled' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (409):
{
"success": false,
"error": "whatsapp_calling_privacy_v3_unavailable",
"message": "WhatsApp sesli aramalar, zorunlu gizlilik ve açık rıza akışı tamamlanana kadar kullanılamaz."
}
Example response (409):
{
"success": false,
"error": "voice_privacy_incomplete",
"message": "Sesli aramayı açmadan önce bu hattın bağlı olduğu sitelerde voice gizlilik ayarlarını (veri sorumlusu unvanı, KVKK iletişimi ve beyan) tamamlamanız gerekir.",
"data": {
"blocking_sites": [
{
"id": 7,
"name": "Örnek Site"
}
],
"auto_provisioned_sites": []
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profile bazlı KVKK aydınlatma metni toggle. Hiyerarşi: site.settings.kvkk_compliance_mode=false override eder (site OFF → tüm kanallar/hesaplar OFF). Site açıkken bu kolon o WhatsApp hesabı için aydınlatma metnini kapatır (kişisel kullanım vs.). Default true (KVKK Md.10 uyumu yeni profillerde açık).
Example request:
curl --request PATCH \
"https://dowaba.com/api/whatsapp-profiles/6/kvkk" \
--header "Content-Type: application/json" \
--data "{
\"enabled\": false
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/kvkk"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"enabled": false
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/kvkk';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'enabled' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Platform WABA modu bilgisini döner (selfhosted/platform/evolution).
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/platform/mode"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/platform/mode"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/platform/mode';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Platform WABA'sındaki telefon numaralarını listele (platform modu). Route 2026 başından beri vardı ama metot HİÇ yazılmamıştı (platform modunda SettingsView çağırınca 500 — 2026-07-02 audit bulgusu). Numaralar Meta Graph'tan çekilir; her satıra `is_taken` (bir kullanıcıda aktif platform profili var) + `is_mine` (o kullanıcı benim) eklenir — frontend seçim kartı `phone.is_taken && !phone.is_mine` ile başkasının numarasını kilitler. Token kullanıcıya asla dönmez (connectPlatformPhone sözleşmesi).
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/platform/phones"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/platform/phones"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/platform/phones';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Platform telefon numarasını kullanıcıya bağla (token kullanıcıya gösterilmez).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/platform/connect" \
--header "Content-Type: application/json" \
--data "{
\"phone_number_id\": \"102290129340398\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/platform/connect"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone_number_id": "102290129340398"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/platform/connect';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone_number_id' => '102290129340398',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Platform WABA bağlantısını kes.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/platform/disconnect"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/platform/disconnect"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/platform/disconnect';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Evolution API ile yeni instance oluştur ve QR kodu döndür.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/evolution/create" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/evolution/create"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/evolution/create';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Evolution API profili için bağlantı QR kodunu al.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6/evolution/qrcode"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/evolution/qrcode"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/evolution/qrcode';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Evolution API profili bağlantı durumunu kontrol et.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6/evolution/status"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/evolution/status"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/evolution/status';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Evolution API instance'ını logout yap.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/evolution/disconnect"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/evolution/disconnect"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/evolution/disconnect';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Evolution API instance'ını yeniden başlat ve yeni QR al.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/evolution/reconnect"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/evolution/reconnect"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/evolution/reconnect';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteyi WhatsApp profiline bağla (pivot tablo). Authz cascade (2026-05-25 fix): hem profil hem site için `whatsappProfileIds()` / `accessibleSiteIds()` UNION pattern kullanır → bayi müşteri sitesine kendi/müşteri profile'ını bağlayabilir. Agent (chat handler) integration ekleyemez.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 12
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 12
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 12,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-WhatsApp profil bağlantısını kes (pivot tablo). Authz cascade (2026-05-25 fix): bayi müşteri sitesinden profili detach edebilir (whatsappProfileIds cascade üzerinden).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 12
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 12
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 12,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp profiline bağlı siteleri listele. Authz: liste cascade'i (whatsappProfileIds — pivot ∪ user_id). Frontend store her listelenen profil için bunu çağırıp "bağlı / bağlanabilir" ayrımını yapar; eski strict user_id check'i bayi/müşteri için hep boş dönmesine ve bağlı profillerin "Bağlanabilir hesaplar"da görünmesine yol açıyordu. Dönen site listesi kullanıcının accessibleSiteIds'ine kelepçelenir — ortak profil başka tenant'ın sitelerini sızdırmaz.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6/linked-sites"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tüm konuşmaları listele (kullanıcının sitelerine ait).
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp/conversations"const url = new URL(
"https://dowaba.com/api/whatsapp/conversations"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/conversations';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Belirli bir numara için mesajları getir. Opt-in sayfalama: `limit`/`before_id` verilmezse TÜM mesajlar (eski davranış, bare array) döner. Verilirse en yeni `limit` mesaj + `{messages, has_more, oldest_id}` (yukarı kaydırma cursor'ı).
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp/messages/+905551234567?limit=50&before_id=12345"const url = new URL(
"https://dowaba.com/api/whatsapp/messages/+905551234567"
);
const params = {
"limit": "50",
"before_id": "12345",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/messages/+905551234567';
$response = $client->get(
$url,
[
'query' => [
'limit' => '50',
'before_id' => '12345',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Sayfalı (limit/before_id verildi)):
{
"messages": [
{
"id": 12300,
"direction": "in",
"message": "Merhaba",
"metadata": null,
"message_id": "wamid.xxx",
"delivery_status": null,
"delivery_error": null,
"media_url": null,
"media_type": null,
"media_mime": null,
"created_at": "14:32",
"date": "05.06.2026"
}
],
"has_more": true,
"oldest_id": 12300
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp mesajı gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/send" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"+905551234567\",
\"site_id\": 17,
\"message\": \"mqeopfuudtdsufvyvddqa\",
\"media_url\": \"https:\\/\\/www.lakin.com\\/veniam-sed-fuga-aspernatur-natus-earum\",
\"media_file_id\": 17,
\"media_type\": \"image\",
\"media_mime\": \"mqeopfuudtdsufvyvddqa\",
\"media_filename\": \"mniihfqcoynlazghdtqtq\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/send"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "+905551234567",
"site_id": 17,
"message": "mqeopfuudtdsufvyvddqa",
"media_url": "https:\/\/www.lakin.com\/veniam-sed-fuga-aspernatur-natus-earum",
"media_file_id": 17,
"media_type": "image",
"media_mime": "mqeopfuudtdsufvyvddqa",
"media_filename": "mniihfqcoynlazghdtqtq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/send';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => '+905551234567',
'site_id' => 17,
'message' => 'mqeopfuudtdsufvyvddqa',
'media_url' => 'https://www.lakin.com/veniam-sed-fuga-aspernatur-natus-earum',
'media_file_id' => 17,
'media_type' => 'image',
'media_mime' => 'mqeopfuudtdsufvyvddqa',
'media_filename' => 'mniihfqcoynlazghdtqtq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek alıcıya onaylı ŞABLON gönder (wamid döner). Yaratılış Tarihi: 2026-08-03 Güncelleme Tarihi: 2026-08-07 `whatsapp/send` ile `contacts/groups/{id}/send-template` arasındaki boşluğu kapatır: ŞABLON (24 saatlik pencere gerekmez) + TEK ALICI + **wamid**. Alıcı bazında teslim defteri tutan dış sistemler (apartman yönetimi) için tek doğru uç; tek kişilik grup açıp `GET whatsapp/messages/{phone}` ile wamid'i geri okuma (yarış koşullu + "okundu" işaretleme yan etkili) deseni gerekmez. Karar sırası, rıza kapısı, değişken çözümleme ve mesaj kaydı TEK OTORİTEDE: App\Services\Channels\WhatsappSingleTemplateService. Bu metot HTTP kabuğudur. ⚠️ VARSAYILAN olarak idempotent DEĞİLDİR — aynı istek iki kez atılırsa iki mesaj gider. Tekilleştirme istiyorsanız `Idempotency-Key` başlığını gönderin; başlıksız çağrıda davranış hiç değişmez. ⚠️ Toplu gönderim bu uçla YAPILMAZ: 20-30 kişiyi aşan her gönderim `POST /api/scheduled-jobs` (alıcı bazında idempotent, kaldığı yerden devam). **`Idempotency-Key` başlığı (OPSİYONEL, örn. `aidat-2026-08-daire-12`)** — en fazla 120 karakter, 24 saat geçerli, hesap kapsamında tekil. Aynı anahtar + AYNI gövde → Meta'ya GİDİLMEZ, ilk yanıt `idempotent_replay: true` ile aynen döner. Aynı anahtar + FARKLI gövde → 409 `idempotency_key_reused`. İlk istek hâlâ işleniyorsa → 409 `idempotency_in_progress`. Gönderim hiç yapılmadan reddedildiyse (rıza/kota/şablon kapısı) anahtar serbest kalır. Başlık gönderilmeyen çağrının yanıt gövdesi `idempotent_replay` alanını İÇERMEZ. `idempotency_key` bir GÖVDE alanı DEĞİLDİR. (⚠️ Scribe `@header` etiketi açıklama DEĞİL ÖRNEK DEĞER alır — bu yüzden başlık burada düz metinle belgelenir; `@header` konsaydı örnek istek her okuyucuya sabit bir anahtarla kopyalanırdı.)
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/send-template" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"+905551112233\",
\"template_name\": \"toplanti_cagrisi\",
\"template_language\": \"tr\",
\"profile_id\": 48,
\"site_id\": 192,
\"contact_id\": 4021,
\"variable_mappings\": {
\"1\": {
\"static\": \"Ayşe Yılmaz\"
}
},
\"variables\": {
\"ad\": \"Ayşe Yılmaz\"
},
\"components\": [
\"consequatur\"
]
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/send-template"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "+905551112233",
"template_name": "toplanti_cagrisi",
"template_language": "tr",
"profile_id": 48,
"site_id": 192,
"contact_id": 4021,
"variable_mappings": {
"1": {
"static": "Ayşe Yılmaz"
}
},
"variables": {
"ad": "Ayşe Yılmaz"
},
"components": [
"consequatur"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/send-template';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => '+905551112233',
'template_name' => 'toplanti_cagrisi',
'template_language' => 'tr',
'profile_id' => 48,
'site_id' => 192,
'contact_id' => 4021,
'variable_mappings' => [
1 => [
'static' => 'Ayşe Yılmaz',
],
],
'variables' => [
'ad' => 'Ayşe Yılmaz',
],
'components' => [
'consequatur',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"status": "sent",
"message_id": "wamid.HBg...",
"message_db_id": 90211,
"site_id": 192
}
Example response (409):
{
"success": false,
"status": "skipped",
"reason": "idempotency_key_reused",
"message_id": null,
"idempotent_replay": false
}
Example response (422):
{
"success": false,
"status": "skipped",
"reason": "opt_out",
"message_id": null
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşmanın bot/engel durumu (READ-ONLY). Unified inbox conversation header'ı bunu kullanır: getMessages düz mesaj array'i döndürür (bot_active taşımaz) → header `botActive` default `true`'da kalıp "bot kapalı ama ikon yeşil + toggle ters çalışıyor" hatasına yol açıyordu (2026-05-30). resolveAccessibleSiteId ile toggleBot ile TAM AYNI (phone, site_id) satırını hedefler → görünen durum = toggle edilecek durum. toggleBot upsert eder; burada `first()` — salt görüntüleme satır YARATMAZ.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp/conversation-state" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"+905551234567\",
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/conversation-state"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "+905551234567",
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/conversation-state';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => '+905551234567',
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşma için AI bot otomatik yanıtını aç/kapat.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/toggle-bot" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"+905551234567\",
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/toggle-bot"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "+905551234567",
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/toggle-bot';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => '+905551234567',
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Numarayı engelle / engeli kaldır.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/toggle-block" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"+905551234567\",
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/toggle-block"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "+905551234567",
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/toggle-block';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => '+905551234567',
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcının tüm WhatsApp profillerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp/profiles"const url = new URL(
"https://dowaba.com/api/whatsapp/profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek WhatsApp mesajını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/whatsapp/messages/42"const url = new URL(
"https://dowaba.com/api/whatsapp/messages/42"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/messages/42';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşmanın tüm mesajlarını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/whatsapp/conversations/+905551234567"const url = new URL(
"https://dowaba.com/api/whatsapp/conversations/+905551234567"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/conversations/+905551234567';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp — Şablonlar
Şablon header için görsel/video yükle. 2026-07-24: VIDEO header desteğiyle video da kabul edilir; 16MB üstü / uyumsuz codec'li / .mov videolar SUNUCUDA otomatik sıkıştırılır (HeaderVideoTranscodeService → MP4 H.264+AAC ≤16MB, Meta limiti). Ham video kabul tavanı 300MB, süre tavanı ~6 dk. Görsel 5MB'ta kalır. SVG bilinçli olarak kabul edilmez (public storage'dan servis ediliyor — stored-XSS riski).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/upload-header-image" \
--header "Content-Type: multipart/form-data" \
--form "image=@/tmp/phpLf1iL0" const url = new URL(
"https://dowaba.com/api/whatsapp/upload-header-image"
);
const headers = {
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('image', document.querySelector('input[name="image"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/upload-header-image';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'image',
'contents' => fopen('/tmp/phpLf1iL0', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"path": "whatsapp-headers/a1b2c3.mp4",
"url": "https://dowaba.com/storage/whatsapp-headers/a1b2c3.mp4",
"media_type": "video",
"transcoded": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Meta WhatsApp Business şablonlarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp/templates"const url = new URL(
"https://dowaba.com/api/whatsapp/templates"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/templates';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şablonların ONAY DURUMUNU dil bazında döndür (Meta canlı durumu + olay geçmişi). Meta anlık durumu verir ama GEREKÇEYİ vermez: bir şablonun neden reddedildiği, kategorisinin neyden neye çekildiği yalnızca webhook'la gelir ve `whatsapp_template_events` defterinde durur. Bu uç ikisini birleştirir; entegrasyonun "şablon setimin tamamı UTILITY olarak onaylandı mı" sorusunu tek çağrıda cevaplaması içindir. `names[]` verilip Meta'da KARŞILIĞI OLMAYAN ad da yanıtta döner — `status: null` ile. Eksik şablonu listeden düşürmek, çağıranın "hepsi onaylı" sanmasına yol açardı.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp/templates/status?profile_id=12&names[]=aidat_hatirlatma"const url = new URL(
"https://dowaba.com/api/whatsapp/templates/status"
);
const params = {
"profile_id": "12",
"names[0]": "aidat_hatirlatma",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/templates/status';
$response = $client->get(
$url,
[
'query' => [
'profile_id' => '12',
'names[0]' => 'aidat_hatirlatma',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni Meta WhatsApp şablonu oluştur (header + body + butonlar).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/templates" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"guwi\",
\"category\": \"UTILITY\",
\"language\": \"tr\",
\"components\": []
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/templates"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "guwi",
"category": "UTILITY",
"language": "tr",
"components": []
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/templates';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'guwi',
'category' => 'UTILITY',
'language' => 'tr',
'components' => [],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mevcut şablonu düzenle (Meta API).
Example request:
curl --request PUT \
"https://dowaba.com/api/whatsapp/templates/17900000000000000" \
--header "Content-Type: application/json" \
--data "{
\"components\": []
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/templates/17900000000000000"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"components": []
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/templates/17900000000000000';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'components' => [],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şablona otomatik "Durdur" (vazgeçme) hızlı-yanıt butonu ekle. Kampanya akışındaki seçmeli yardımcı (2026-06-12): kullanıcı isterse şablonuna tek tıkla QUICK_REPLY "Durdur" butonu eklenir. Meta şablonu yeniden onaya alır (status PENDING, genelde dakikalar) — onaylanana dek şablon kampanya listesinde görünmez (frontend APPROVED filtreler). Alıcı butona basınca metin webhook'tan iner ve opt-out suppression'a yazılır (campaign_consents.optout_keywords). Şablonda zaten vazgeçme (buton/metin) varsa hiçbir şey değiştirilmez.
Şablon setini tek çağrıda oluştur (toplu). Şablonlar Meta'ya SIRAYLA gönderilir; kısmi başarı HTTP 200 gövdesinde şablon başına raporlanır (`results[]`), istek tümden hata dönmez. Özellik bayrağı kapalıyken 404.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/templates/bulk?profile_id=12" \
--header "Content-Type: application/json" \
--data "{
\"templates\": [
{
\"name\": \"siparis_onay\",
\"category\": \"UTILITY\",
\"language\": \"tr\",
\"components\": [
[]
],
\"parameter_format\": \"POSITIONAL\"
}
],
\"on_conflict\": \"skip\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/templates/bulk"
);
const params = {
"profile_id": "12",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"templates": [
{
"name": "siparis_onay",
"category": "UTILITY",
"language": "tr",
"components": [
[]
],
"parameter_format": "POSITIONAL"
}
],
"on_conflict": "skip"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/templates/bulk';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'profile_id' => '12',
],
'json' => [
'templates' => [
[
'name' => 'siparis_onay',
'category' => 'UTILITY',
'language' => 'tr',
'components' => [
[],
],
'parameter_format' => 'POSITIONAL',
],
],
'on_conflict' => 'skip',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"profile_id": 12,
"summary": {
"total": 1,
"created": 1,
"skipped": 0,
"failed": 0,
"not_attempted": 0
},
"results": [
{
"name": "siparis_onay",
"language": "tr",
"ok": true,
"meta_template_id": "1790",
"status": "PENDING"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şablonu düzeltip yeniden onaya sok. REJECTED/PAUSED şablon düzenlenerek yeniden incelemeye girer (`mode: edited`). APPROVED şablonun kategorisi Meta'da DEĞİŞTİRİLEMEZ → hedef kategori farklıysa sürümlenmiş yeni adla (`ad_v2`, `ad_v3` …) yeni şablon oluşturulur (`mode: recreated`, `new_name`). İnceleme sürüyorsa 409. Özellik bayrağı kapalıyken 404.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/templates/resubmit?profile_id=12" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"kampanya_duyuru\",
\"language\": \"tr\",
\"category\": \"UTILITY\",
\"components\": [
[]
]
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/templates/resubmit"
);
const params = {
"profile_id": "12",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "kampanya_duyuru",
"language": "tr",
"category": "UTILITY",
"components": [
[]
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/templates/resubmit';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'profile_id' => '12',
],
'json' => [
'name' => 'kampanya_duyuru',
'language' => 'tr',
'category' => 'UTILITY',
'components' => [
[],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"mode": "recreated",
"name": "kampanya_duyuru",
"new_name": "kampanya_duyuru_v2",
"language": "tr",
"category": "UTILITY",
"meta_template_id": "1791",
"status": "PENDING"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şablonu sil (Meta API).
Example request:
curl --request DELETE \
"https://dowaba.com/api/whatsapp/templates/order_shipped"const url = new URL(
"https://dowaba.com/api/whatsapp/templates/order_shipped"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/templates/order_shipped';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp — Toplu / Kampanya
Kişi gruplarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/contacts/groups"const url = new URL(
"https://dowaba.com/api/contacts/groups"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni kişi grubu oluştur.
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/groups" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"description\": \"Kampanya duyuruları için müşteri listesi\"
}"
const url = new URL(
"https://dowaba.com/api/contacts/groups"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"description": "Kampanya duyuruları için müşteri listesi"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'description' => 'Kampanya duyuruları için müşteri listesi',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Grup adı/açıklamasını güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/contacts/groups/42" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"description\": \"Kampanya duyuruları için müşteri listesi\"
}"
const url = new URL(
"https://dowaba.com/api/contacts/groups/42"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"description": "Kampanya duyuruları için müşteri listesi"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/42';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'description' => 'Kampanya duyuruları için müşteri listesi',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Grubu sil. Kişiler SİLİNMEZ (contacts.contact_group_id FK'si ON DELETE SET NULL — 2026_07_15 migration'ı; eski "cascade siler" yorumu bayattı): damgasız kişiler grupsuz kalır, AI Tarama kampanyasınca bu gruba TAŞINMIŞ kişiler (metadata.lead_scan_group damgası) önceki gruplarına iade edilir.
Example request:
curl --request DELETE \
"https://dowaba.com/api/contacts/groups/42"const url = new URL(
"https://dowaba.com/api/contacts/groups/42"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/42';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gruptaki kişileri listele (arama desteği).
Example request:
curl --request GET \
--get "https://dowaba.com/api/contacts/groups/7/contacts"const url = new URL(
"https://dowaba.com/api/contacts/groups/7/contacts"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/7/contacts';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gruba kişi ekle (telefon normalize edilir).
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/groups/42/contacts" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"vmqeopfuudtdsufvy\",
\"name\": \"vddqamniihfqcoynlazgh\",
\"email\": \"roob.mona@example.org\",
\"phone_type\": \"unknown\"
}"
const url = new URL(
"https://dowaba.com/api/contacts/groups/42/contacts"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "vmqeopfuudtdsufvy",
"name": "vddqamniihfqcoynlazgh",
"email": "roob.mona@example.org",
"phone_type": "unknown"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/42/contacts';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => 'vmqeopfuudtdsufvy',
'name' => 'vddqamniihfqcoynlazgh',
'email' => 'roob.mona@example.org',
'phone_type' => 'unknown',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gruptaki TÜM kişileri sil (grup kalır, geri alınamaz). Büyük listelerde (10K+) id listesiyle `contacts/delete` pratik değil — bu endpoint grubu tek seferde boşaltır. Kampanya logları (`scheduled_job_logs.contact_id`) cascade silinir.
Example request:
curl --request DELETE \
"https://dowaba.com/api/contacts/groups/42/contacts"const url = new URL(
"https://dowaba.com/api/contacts/groups/42/contacts"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/42/contacts';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"deleted": 12696
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kişi bilgilerini güncelle (telefon, ad).
Example request:
curl --request PUT \
"https://dowaba.com/api/contacts/12" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"vmqeopfuudtdsufvy\",
\"name\": \"vddqamniihfqcoynlazgh\",
\"email\": \"roob.mona@example.org\",
\"phone_type\": \"home\"
}"
const url = new URL(
"https://dowaba.com/api/contacts/12"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "vmqeopfuudtdsufvy",
"name": "vddqamniihfqcoynlazgh",
"email": "roob.mona@example.org",
"phone_type": "home"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/12';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => 'vmqeopfuudtdsufvy',
'name' => 'vddqamniihfqcoynlazgh',
'email' => 'roob.mona@example.org',
'phone_type' => 'home',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Birden fazla kişiyi toplu sil (id listesi).
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/delete" \
--header "Content-Type: application/json" \
--data "{
\"ids\": [
17
]
}"
const url = new URL(
"https://dowaba.com/api/contacts/delete"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"ids": [
17
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/delete';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'ids' => [
17,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
CSV/XLSX dosyasından kişi import et (Google/Outlook/Excel formatları). Telefon tipi ayrımı: - CSV header'da "Cep / Ev / İş" kolonları varsa her satırdan birden fazla Contact üretir (her telefon için phone_type=mobile/home/work). - Tek phone kolonu varsa TR prefix heuristic (5xx=mobile, 2/3/4xx=home). Response: added + updated + skipped + email_conflict + by_type breakdown. email_conflict = aynı telefon + FARKLI dolu e-posta (kardeş/veli ortak telefonu) satırları — mevcut kişi EZİLMEZ, satır atlanır ve burada sayılır.
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/groups/42/import" \
--header "Content-Type: multipart/form-data" \
--form "file=@/tmp/phpsVwreL" const url = new URL(
"https://dowaba.com/api/contacts/groups/42/import"
);
const headers = {
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('file', document.querySelector('input[name="file"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/42/import';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'file',
'contents' => fopen('/tmp/phpsVwreL', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (422):
{
"success": false,
"message": "Dosyada içe aktarılabilir satır bulunamadı. Başlık satırında telefon kolonu (Telefon / Cep / Mobile / WhatsApp No / Phone) olduğundan ve altında veri satırları bulunduğundan emin olun."
}
Example response (422):
{
"success": false,
"message": "Excel (xlsx/xls) okuma bileşeni sunucuda kurulu değil. Dosyayı CSV olarak kaydedip tekrar yükleyin."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Dış URL'den (CSV/JSON) kişi listesi çekip YENİ bir gruba aktar — mail kampanyası için. SSRF-safe (ContactImportService internal IP'leri reddeder). Mail-öncelikli: email varsa email-bazlı dedup, yoksa telefon-bazlı. MX doğrulama burada YAPILMAZ (büyük listede senkron timeout) → email_status=unverified; kampanya gönderiminde/bounce takibinde değerlendirilir. AUTO-REFRESH: `auto_refresh=true` ise grubun kaynağı (URL + auth_style + API key ŞİFRELİ) saklanır → kampanya başında ContactImportService::refreshFromSource ile oto-yenilenir. auto_refresh false/yoksa hiçbir kaynak saklanmaz (tek-seferlik import, key DB'ye yazılmaz).
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/groups/import-url" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"url\": \"http:\\/\\/www.kunde.com\\/\",
\"api_key\": \"iihfqcoynlazghdtqtqxb\",
\"auth_style\": \"x-api-key\",
\"query_key_name\": \"ajwbpilpmufinllwloauy\",
\"auto_refresh\": false
}"
const url = new URL(
"https://dowaba.com/api/contacts/groups/import-url"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"url": "http:\/\/www.kunde.com\/",
"api_key": "iihfqcoynlazghdtqtqxb",
"auth_style": "x-api-key",
"query_key_name": "ajwbpilpmufinllwloauy",
"auto_refresh": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/import-url';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'url' => 'http://www.kunde.com/',
'api_key' => 'iihfqcoynlazghdtqtqxb',
'auth_style' => 'x-api-key',
'query_key_name' => 'ajwbpilpmufinllwloauy',
'auto_refresh' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bilgisayardan CSV/JSON dosyası yükleyerek YENİ kişi grubu oluştur (mail/WA kampanyası için). importFromUrl ile AYNI parser'ı (ContactImportService) kullanır → esnek kolon eşleme (email / ad / telefon) + email-VEYA-telefon kabulü. importContacts'tan farkı: email-only kişileri de alır (telefon ZORUNLU değil — mail kampanyası email-odaklı) ve JSON destekler. SSRF yok (yerel dosya); tek-seferlik (kaynak saklanmaz, auto_refresh=false).
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/groups/import-file" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: multipart/form-data" \
--form "name=Müşteri listesi"\
--form "file=@/tmp/phpsYttfB" const url = new URL(
"https://dowaba.com/api/contacts/groups/import-file"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('name', 'Müşteri listesi');
body.append('file', document.querySelector('input[name="file"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/import-file';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'name',
'contents' => 'Müşteri listesi'
],
[
'name' => 'file',
'contents' => fopen('/tmp/phpsYttfB', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"group": {
"id": 12,
"name": "Müşteri listesi",
"contacts_count": 340,
"auto_refresh": false
},
"stats": {
"fetched": 350,
"added": 340,
"updated": 0,
"skipped": 10,
"phone_conflict": 2
}
}
Example response (422):
{
"success": false,
"message": "Dosyada geçerli kişi (email/telefon) bulunamadı. Kolonlar email / ad / telefon olmalı."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gruba toplu WhatsApp şablonu gönder (rate limit + media upload).
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/groups/42/send-template" \
--header "Content-Type: application/json" \
--data "{
\"profile_id\": 17,
\"template_name\": \"kampanya_duyuru\",
\"template_language\": \"tr\",
\"header_image_path\": \"whatsapp-headers\\/a1b2c3d4e5f6.jpg\",
\"header_image_url\": \"https:\\/\\/example.com\\/banner.jpg\",
\"header_media_type\": \"video\"
}"
const url = new URL(
"https://dowaba.com/api/contacts/groups/42/send-template"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"profile_id": 17,
"template_name": "kampanya_duyuru",
"template_language": "tr",
"header_image_path": "whatsapp-headers\/a1b2c3d4e5f6.jpg",
"header_image_url": "https:\/\/example.com\/banner.jpg",
"header_media_type": "video"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/groups/42/send-template';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'profile_id' => 17,
'template_name' => 'kampanya_duyuru',
'template_language' => 'tr',
'header_image_path' => 'whatsapp-headers/a1b2c3d4e5f6.jpg',
'header_image_url' => 'https://example.com/banner.jpg',
'header_media_type' => 'video',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Akıllı segment grubunu canlı kullanıcı sorgusundan tazele (bul-veya-oluştur + UPSERT + PRUNE). Bu gruplar platformdaki TÜM owner+bayi kullanıcı e-postalarını içerir → SADECE superadmin erişebilir. Grup superadmin'in kendi user_id'si altında tutulur.
Example request:
curl --request POST \
"https://dowaba.com/api/contacts/segments/owner_reseller/sync"const url = new URL(
"https://dowaba.com/api/contacts/segments/owner_reseller/sync"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/contacts/segments/owner_reseller/sync';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Zamanlanmış toplu gönderim job'larını listele (ilerleme yüzdesi ile).
Example request:
curl --request GET \
--get "https://dowaba.com/api/scheduled-jobs"const url = new URL(
"https://dowaba.com/api/scheduled-jobs"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/scheduled-jobs';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni zamanlanmış toplu gönderim oluştur (once/hourly/daily).
Example request:
curl --request POST \
"https://dowaba.com/api/scheduled-jobs" \
--header "Content-Type: application/json" \
--data "{
\"contact_group_id\": 17,
\"whatsapp_profile_id\": 17,
\"template_name\": \"kampanya_duyuru\",
\"template_language\": \"tr\",
\"schedule_type\": \"once\",
\"schedule_hour\": 12,
\"scheduled_at\": \"2026-06-12 14:00\",
\"batch_size\": 16,
\"delay_ms\": 5,
\"header_image_path\": \"whatsapp-headers\\/kampanya-gorsel.jpg\",
\"header_image_url\": \"https:\\/\\/example.com\\/banner.jpg\",
\"header_media_type\": \"video\",
\"consent_confirmed\": true
}"
const url = new URL(
"https://dowaba.com/api/scheduled-jobs"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"contact_group_id": 17,
"whatsapp_profile_id": 17,
"template_name": "kampanya_duyuru",
"template_language": "tr",
"schedule_type": "once",
"schedule_hour": 12,
"scheduled_at": "2026-06-12 14:00",
"batch_size": 16,
"delay_ms": 5,
"header_image_path": "whatsapp-headers\/kampanya-gorsel.jpg",
"header_image_url": "https:\/\/example.com\/banner.jpg",
"header_media_type": "video",
"consent_confirmed": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/scheduled-jobs';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'contact_group_id' => 17,
'whatsapp_profile_id' => 17,
'template_name' => 'kampanya_duyuru',
'template_language' => 'tr',
'schedule_type' => 'once',
'schedule_hour' => 12,
'scheduled_at' => '2026-06-12 14:00',
'batch_size' => 16,
'delay_ms' => 5,
'header_image_path' => 'whatsapp-headers/kampanya-gorsel.jpg',
'header_image_url' => 'https://example.com/banner.jpg',
'header_media_type' => 'video',
'consent_confirmed' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Zamanlanmış job'u güncelle: schedule/batch_size + şablon/değişken/header görseli. 2026-07-19: Düzenlemede şablon değişimi + değişken (variable_mappings) + header görseli güncellemesi eklendi (kullanıcı talebi — Reşat vakası: "İçindeki o FIRSAT150 vs onları da değiştirtmesi lazım"). Worker her koşuda template_name/variable_mappings'i DB'den okur → kalan gönderimler yeni içerikle gider, gönderilmişler etkilenmez.
Example request:
curl --request PUT \
"https://dowaba.com/api/scheduled-jobs/42" \
--header "Content-Type: application/json" \
--data "{
\"schedule_type\": \"hourly\",
\"schedule_hour\": 19,
\"scheduled_at\": \"2026-08-11T01:53:42\",
\"batch_size\": 13,
\"delay_ms\": 16,
\"template_name\": \"kampanya_duyuru\",
\"template_language\": \"tr\",
\"header_image_path\": \"whatsapp-headers\\/gorsel.jpg\",
\"header_image_url\": \"https:\\/\\/www.mueller.com\\/laborum-eius-est-dolor-dolores-minus-voluptatem\",
\"header_media_type\": \"image\"
}"
const url = new URL(
"https://dowaba.com/api/scheduled-jobs/42"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"schedule_type": "hourly",
"schedule_hour": 19,
"scheduled_at": "2026-08-11T01:53:42",
"batch_size": 13,
"delay_ms": 16,
"template_name": "kampanya_duyuru",
"template_language": "tr",
"header_image_path": "whatsapp-headers\/gorsel.jpg",
"header_image_url": "https:\/\/www.mueller.com\/laborum-eius-est-dolor-dolores-minus-voluptatem",
"header_media_type": "image"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/scheduled-jobs/42';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'schedule_type' => 'hourly',
'schedule_hour' => 19,
'scheduled_at' => '2026-08-11T01:53:42',
'batch_size' => 13,
'delay_ms' => 16,
'template_name' => 'kampanya_duyuru',
'template_language' => 'tr',
'header_image_path' => 'whatsapp-headers/gorsel.jpg',
'header_image_url' => 'https://www.mueller.com/laborum-eius-est-dolor-dolores-minus-voluptatem',
'header_media_type' => 'image',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Zamanlanmış job'u aktif/pasif yap.
Example request:
curl --request POST \
"https://dowaba.com/api/scheduled-jobs/7/toggle"const url = new URL(
"https://dowaba.com/api/scheduled-jobs/7/toggle"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/scheduled-jobs/7/toggle';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Zamanlanmış job'u sil (log'lar cascade silinir).
Example request:
curl --request DELETE \
"https://dowaba.com/api/scheduled-jobs/12"const url = new URL(
"https://dowaba.com/api/scheduled-jobs/12"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/scheduled-jobs/12';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Grup için WhatsApp gönderim istatistiği (modal'da "X hedef, Y atlanacak" özeti). - total: gruptaki toplam kişi - whatsapp_yes: önceki kampanyalarda Meta Cloud API "queued" döndü → kesin WA - whatsapp_no: Meta "Receiver not WA user" döndü (error.code 131026/1008) → atlanacak - unknown: hiç gönderim yapılmadı, ilk kampanyada öğrenilecek - target: gönderilecek = total - whatsapp_no
Example request:
curl --request GET \
--get "https://dowaba.com/api/scheduled-jobs/whatsapp-stats/42"const url = new URL(
"https://dowaba.com/api/scheduled-jobs/whatsapp-stats/42"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/scheduled-jobs/whatsapp-stats/42';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şablon değişken beyanlarını listele (kullanıcının kendi profilleri).
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp/template-schemas?whatsapp_profile_id=48"const url = new URL(
"https://dowaba.com/api/whatsapp/template-schemas"
);
const params = {
"whatsapp_profile_id": "48",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/template-schemas';
$response = $client->get(
$url,
[
'query' => [
'whatsapp_profile_id' => '48',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şablon değişken beyanını oluştur/güncelle (upsert).
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp/template-schemas" \
--header "Content-Type: application/json" \
--data "{
\"whatsapp_profile_id\": 48,
\"template_name\": \"aidat_hatirlatma\",
\"language\": \"tr\",
\"variable_schema\": [
\"ad\",
\"daire_no\",
\"borc\"
]
}"
const url = new URL(
"https://dowaba.com/api/whatsapp/template-schemas"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"whatsapp_profile_id": 48,
"template_name": "aidat_hatirlatma",
"language": "tr",
"variable_schema": [
"ad",
"daire_no",
"borc"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/template-schemas';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'whatsapp_profile_id' => 48,
'template_name' => 'aidat_hatirlatma',
'language' => 'tr',
'variable_schema' => [
'ad',
'daire_no',
'borc',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Şablon değişken beyanını sil (kampanyalar tekrar pozisyonel mapping'e döner).
Example request:
curl --request DELETE \
"https://dowaba.com/api/whatsapp/template-schemas/7"const url = new URL(
"https://dowaba.com/api/whatsapp/template-schemas/7"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp/template-schemas/7';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp — Meta Business Agent
MBA durumu — numara uygun mu, ajan açık mı? Meta'nın Business Agent platformuna tek çağrıda bakar: numara uygunsa ajan ayarı da (açık/kapalı + hedef kitle) okunur. `state` alanı ekranı sürer: `eligible` (uygun), `not_eligible` (numara kapsam dışı), `tos_required` (Meta Business AI Hizmet Şartları WhatsApp Manager'dan kabul edilmeli), `unsupported` (bağlantı Meta Cloud API değil — örn. QR/Evolution), `error` (Meta tarafı geçici hata; `detail` açıklar).
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6/mba/status"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/mba/status"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/mba/status';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "eligible",
"is_eligible": true,
"agent": {
"enabled": true,
"audience": "EVERYONE"
},
"checked_at": "2026-07-31T09:15:00+00:00",
"detail": null
}
Example response (200, Hizmet şartları kabul edilmemiş):
{
"state": "tos_required",
"is_eligible": null,
"agent": null,
"checked_at": "2026-07-31T09:15:00+00:00",
"detail": "The Meta Business AI Terms of Service must be accepted."
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SSS'leri Meta Business Agent'a yansıt (tek yönlü). Profile bağlı sitenin AKTİF SSS'lerini MBA'nın bilgi kaynağına gönderir: yeni olanlar eklenir, değişenler güncellenir, dowaba'da silinen/pasife alınanlar MBA'dan kaldırılır. Müşterinin WhatsApp Manager'dan ELLE girdiği kayıtlara dokunulmaz (`skipped` içinde sayılır). Tek istekte en fazla 200 SSS senkronlanır; fazlası da `skipped` olur.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/mba/faq-sync"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/mba/faq-sync"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/mba/faq-sync';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"created": 3,
"updated": 1,
"deleted": 0,
"skipped": 2,
"total_dowaba": 4,
"state": "ok",
"detail": null
}
Example response (200, Hizmet şartları kabul edilmemiş):
{
"created": 0,
"updated": 0,
"deleted": 0,
"skipped": 0,
"total_dowaba": 4,
"state": "tos_required",
"detail": "The Meta Business AI Terms of Service must be accepted."
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Test mesajı gönder (faturasız). Meta'nın `agent_test` ucuna örnek bir müşteri mesajı yollar ve ajanın ne cevaplayacağını gösterir. Gerçek bir WhatsApp mesajı GÖNDERİLMEZ ve ücretlendirilmez; yanıttaki `estimated_token_usage` ile canlıda oluşacak yaklaşık maliyet (`est_cost_usd`, 1M token = 2,00 USD) tahmin edilir. `handoff_reason` doluysa ajan bu mesajı insana devretmek isterdi.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/mba/simulate" \
--header "Content-Type: application/json" \
--data "{
\"message\": \"Kargom ne zaman gelir?\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/mba/simulate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"message": "Kargom ne zaman gelir?"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/mba/simulate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'message' => 'Kargom ne zaman gelir?',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"reply": "Kargonuz genellikle 2-3 iş günü içinde teslim edilir.",
"estimated_token_usage": "[REDACTED]",
"est_cost_usd": 0.043,
"handoff_reason": null,
"detail": null
}
Example response (200, Hizmet şartları kabul edilmemiş):
{
"state": "tos_required",
"reply": null,
"estimated_token_usage": null,
"est_cost_usd": null,
"handoff_reason": null,
"detail": "The Meta Business AI Terms of Service must be accepted."
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ajanı aç/kapa veya hedef kitlesini değiştir. Meta'nın ajanını bu numarada açar/kapatır ve kimlere cevap vereceğini belirler: `EVERYONE` (tüm müşteriler) veya `ALLOWLISTED_ONLY` (yalnız izin listesindeki numaralar — pilot denemesi için). En az bir alan gönderilmeli. Güncelleme ÖNCE mevcut ayarı okur, sadece istenen alanı değiştirip tamamını geri yazar; müşterinin devretme (handoff) / takip (followup) ayarları korunur. ⚠️ Ajanı kapatmak tüm sohbetlerde Meta AI'ını susturur; yeniden açmak yalnız YENİ sohbetleri kapsar. Ajan açılırken Meta hesabında geçerli bir ödeme yöntemi yoksa istek reddedilir — Meta'nın açıklaması `detail` alanında döner.
Example request:
curl --request PUT \
"https://dowaba.com/api/whatsapp-profiles/6/mba/settings" \
--header "Content-Type: application/json" \
--data "{
\"enabled\": true,
\"audience\": \"ALLOWLISTED_ONLY\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/mba/settings"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"enabled": true,
"audience": "ALLOWLISTED_ONLY"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/mba/settings';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'enabled' => true,
'audience' => 'ALLOWLISTED_ONLY',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"agent": {
"enabled": true,
"audience": "ALLOWLISTED_ONLY"
},
"detail": null
}
Example response (200, Hizmet şartları kabul edilmemiş):
{
"state": "tos_required",
"agent": null,
"detail": "The Meta Business AI Terms of Service must be accepted."
}
Example response (200, Ödeme yöntemi eksik):
{
"state": "error",
"agent": null,
"detail": "A valid payment method is required to enable the agent."
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İzin listesini getir. Hedef kitle `ALLOWLISTED_ONLY` iken Meta ajanının cevap vereceği müşteri numaraları. Pilot akışı: önce kendi numaranı ekle → hedef kitleyi `ALLOWLISTED_ONLY` yap → ajanı aç → güvenle dene → sonra `EVERYONE`.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"numbers": [
"+905321234567"
],
"detail": null
}
Example response (200, Hizmet şartları kabul edilmemiş):
{
"state": "tos_required",
"numbers": null,
"detail": "The Meta Business AI Terms of Service must be accepted."
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İzin listesine numara ekle. Numara E.164 biçiminde beklenir (ülke koduyla, örn. `+905321234567`); boşluk/tire gibi ayraçlar temizlenir. Zaten kayıtlıysa Meta'ya ikinci kez yazılmaz. Yanıt her zaman güncel listeyi döner.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist" \
--header "Content-Type: application/json" \
--data "{
\"number\": \"+905321234567\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"number": "+905321234567"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'number' => '+905321234567',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"numbers": [
"+905321234567"
],
"detail": null
}
Example response (200, Zaten kayıtlı):
{
"state": "ok",
"numbers": [
"+905321234567"
],
"detail": "Bu numara izin listesinde zaten kayıtlı."
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İzin listesinden numara çıkar. Numara listede yoksa hata verilmez — `state` yine `ok` döner, `detail` durumu açıklar (işlem tekrar edilebilir olsun diye).
Example request:
curl --request DELETE \
"https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist" \
--header "Content-Type: application/json" \
--data "{
\"number\": \"+905321234567\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"number": "+905321234567"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/mba/allowlist';
$response = $client->delete(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'number' => '+905321234567',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"numbers": [],
"detail": null
}
Example response (200, Listede yok):
{
"state": "ok",
"numbers": [
"+905551112233"
],
"detail": "Numara izin listesinde bulunamadı."
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp — İşletme Profili
İşletme profilini getir. Numaranın WhatsApp'ta görünen kartvizitini Meta'dan okur: tanıtım yazısı (`about`), açıklama, adres, e-posta, web siteleri, kategori (`vertical`) ve profil fotoğrafı URL'i. `state`: `ok` · `unsupported` (bağlantı Meta Cloud API değil ya da kimlik bilgisi eksik) · `rate_limited` · `error`.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6/business-profile"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/business-profile"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/business-profile';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"profile": {
"about": "7/24 destek",
"address": "Burdur",
"description": "Yapay zekâ destekli müşteri iletişimi",
"email": "i***@example.com",
"vertical": "PROF_SERVICES",
"websites": [
"https://ornek.com"
],
"profile_picture_url": "https://scontent.xx.fbcdn.net/..."
},
"detail": null,
"error_code": null
}
Example response (200, QR (Evolution) bağlantısı):
{
"state": "unsupported",
"profile": null,
"detail": "İşletme profili yönetimi yalnız Meta Cloud API bağlantılarında (meta_business / meta_coexistence) kullanılabilir. QR ile bağlı numaralarda WhatsApp Business uygulamasından düzenleyin.",
"error_code": null
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İşletme profilini güncelle. Yalnız GÖNDERİLEN alanlar değişir (Meta kısmi güncellemeyi kabul eder); bir alanı temizlemek için boş string gönderin. Meta sınırları: `about` 1-139, `description` ≤512, `address` ≤256, `email` ≤128, `websites` en fazla 2 adet × ≤256 karakter ve `http://`/`https://` ile başlamak zorunda. Yanıtta güncel profil de döner (form tazelensin diye). ⚠️ Platform WhatsApp hesabına bağlı numaralarda (paylaşımlı WABA) yazma kapalıdır → 409.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/business-profile" \
--header "Content-Type: application/json" \
--data "{
\"about\": \"7\\/24 yapay zekâ destekli müşteri hizmetleri\",
\"description\": \"Küçük işletmeler için WhatsApp otomasyonu\",
\"address\": \"Burdur Merkez\",
\"email\": \"info@ornek.com\",
\"websites\": [
\"https:\\/\\/ornek.com\"
],
\"vertical\": \"PROF_SERVICES\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/business-profile"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"about": "7\/24 yapay zekâ destekli müşteri hizmetleri",
"description": "Küçük işletmeler için WhatsApp otomasyonu",
"address": "Burdur Merkez",
"email": "info@ornek.com",
"websites": [
"https:\/\/ornek.com"
],
"vertical": "PROF_SERVICES"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/business-profile';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'about' => '7/24 yapay zekâ destekli müşteri hizmetleri',
'description' => 'Küçük işletmeler için WhatsApp otomasyonu',
'address' => 'Burdur Merkez',
'email' => 'info@ornek.com',
'websites' => [
'https://ornek.com',
],
'vertical' => 'PROF_SERVICES',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"profile": {
"about": "7/24 destek",
"address": "Burdur",
"description": null,
"email": null,
"vertical": "PROF_SERVICES",
"websites": [
"https://ornek.com"
],
"profile_picture_url": null
},
"detail": null,
"error_code": null
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Example response (409, Platform WhatsApp hesabına bağlı numara):
{
"state": "unsupported",
"detail": "Bu numara DoWaba platform WhatsApp hesabına bağlı — profil ve numara ayarları platform yöneticisi tarafından yönetilir."
}
Example response (422, Değişiklik yok):
{
"state": "error",
"profile": null,
"detail": "Değiştirilecek bir alan gönderilmedi.",
"error_code": null
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profil fotoğrafını değiştir. Görsel önce Meta'nın parçalı yükleme (Resumable Upload) servisine gönderilir, dönen dosya anahtarı işletme profiline yazılır. Alan adı `image` (panel kalıbı) veya `photo` olabilir; JPG/PNG, en fazla 5 MB. Kare ve en az 640×640 px görsel önerilir — Meta yayınlanmış bir boyut kısıtı vermiyor, tavan bizim savunmacı sınırımızdır. ⚠️ Profilde Facebook App ID tanımlı değilse yükleme oturumu açılamaz → `state: unsupported`.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/business-profile/photo"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/business-profile/photo"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/business-profile/photo';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"profile": {
"about": "7/24 destek",
"address": null,
"description": null,
"email": null,
"vertical": null,
"websites": [],
"profile_picture_url": "https://scontent.xx.fbcdn.net/..."
},
"detail": null,
"error_code": null
}
Example response (200, Profilde App ID yok):
{
"state": "unsupported",
"profile": null,
"detail": "Profilde Facebook App ID tanımlı değil — profil fotoğrafı yüklemek için WhatsApp bağlantı ayarlarına App ID girilmeli.",
"error_code": null
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Example response (409, Platform WhatsApp hesabına bağlı numara):
{
"state": "unsupported",
"detail": "Bu numara DoWaba platform WhatsApp hesabına bağlı — profil ve numara ayarları platform yöneticisi tarafından yönetilir."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Görünen ad durumunu getir. `verified_name` numaranın WhatsApp'ta görünen adıdır — TEK BAŞINA onaylı olduğunu göstermez, onay durumu `name_status` alanındadır (`APPROVED`, `PENDING_REVIEW`, `DECLINED`, `EXPIRED`, `AVAILABLE_WITHOUT_REVIEW`, `NONE`). Bekleyen bir ad talebi varsa `new_display_name` + `new_name_status` doludur. Yanıt ayrıca numaranın kalite notunu (`quality_rating`) ve doğrulama durumunu taşır. Okuma sırasında `verified_name`/`display_phone_number` DoWaba kaydına da yansıtılır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/whatsapp-profiles/6/display-name"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/display-name"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/display-name';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"name": {
"verified_name": "ACR Business",
"name_status": "APPROVED",
"new_display_name": "Yönetim",
"new_name_status": "APPROVED",
"display_phone_number": "+90 532 000 00 00",
"quality_rating": "GREEN",
"code_verification_status": "VERIFIED"
},
"detail": null,
"error_code": null
}
Example response (200, Bekleyen talep yok):
{
"state": "ok",
"name": {
"verified_name": "ACR Business",
"name_status": "APPROVED",
"new_display_name": null,
"new_name_status": null,
"display_phone_number": "+90 532 000 00 00",
"quality_rating": "GREEN",
"code_verification_status": "VERIFIED"
},
"detail": null,
"error_code": null
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni görünen ad talebi aç. Ad ANINDA değişmez: talep Meta incelemesine girer (`state: pending_review`), sonuç panelden "Durumu Kontrol Et" ile görülür. Onay geldiğinde adın yürürlüğe girmesi için `register` ucu çağrılmalıdır. Meta kotası: 30 günlük pencerede en fazla 10 ad değişikliği. Jenerik ("Fashion"), "Official/Verified" izlenimi veren, Meta ailesine atıf yapan, promosyon içeren veya URL/e-posta biçimindeki adlar reddedilir. Numara Official Business Account ise ad API'den değiştirilemez — Meta'nın açıklaması `detail` alanında döner.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/display-name" \
--header "Content-Type: application/json" \
--data "{
\"new_display_name\": \"Yönetim\"
}"
const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/display-name"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"new_display_name": "Yönetim"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/display-name';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'new_display_name' => 'Yönetim',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "pending_review",
"detail": null,
"error_code": null
}
Example response (200, Meta reddetti):
{
"state": "error",
"detail": "(#100) Invalid parameter",
"error_code": 100
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Example response (409, Platform WhatsApp hesabına bağlı numara):
{
"state": "unsupported",
"detail": "Bu numara DoWaba platform WhatsApp hesabına bağlı — profil ve numara ayarları platform yöneticisi tarafından yönetilir."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Onaylanan görünen adı uygula (numara kaydı). Meta'da onaylanmış (`new_name_status: APPROVED`) adın yürürlüğe girmesi için numara Cloud API'ye yeniden kaydedilir. Onay GELMEDEN çağırmak hiçbir etki yapmaz; onaydan sonra 14 gün içinde çağrılmazsa ad yeniden incelemeye girer. Kayıt için numaranın 6 haneli iki adımlı doğrulama PIN'i gerekir — gönderilmezse Embedded Signup varsayılanı denenir. ⚠️ Meta limiti: 72 saatlik pencerede numara başına 10 kayıt/kayıt-silme (aşımda `state: rate_limited`). PIN hiçbir yere kaydedilmez, log'lanmaz ve yanıtta dönmez. Başarıda güncel ad durumu döner ve DoWaba kaydı senkronlanır.
Example request:
curl --request POST \
"https://dowaba.com/api/whatsapp-profiles/6/register"const url = new URL(
"https://dowaba.com/api/whatsapp-profiles/6/register"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/whatsapp-profiles/6/register';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"state": "ok",
"name": {
"verified_name": "Yönetim",
"name_status": "APPROVED",
"new_display_name": null,
"new_name_status": null,
"display_phone_number": "+90 532 000 00 00",
"quality_rating": "GREEN",
"code_verification_status": "VERIFIED"
},
"detail": null,
"error_code": null
}
Example response (200, PIN yanlış):
{
"state": "error",
"name": null,
"detail": "İki adımlı doğrulama PIN'i yanlış. Numaranın WhatsApp Manager'daki 6 haneli PIN'ini girin; hatırlamıyorsanız iki adımlı doğrulamayı kapatıp yeni PIN kurmanız gerekir.",
"error_code": 133005
}
Example response (200, Kayıt limiti):
{
"state": "rate_limited",
"name": null,
"detail": "Numara kayıt limiti aşıldı — Meta 72 saatlik pencerede numara başına en fazla 10 kayıt/kayıt-silme işlemine izin veriyor. Pencere dolana kadar beklemeniz gerekiyor.",
"error_code": 133016
}
Example response (403):
{
"success": false,
"message": "Yetkisiz"
}
Example response (409, Platform WhatsApp hesabına bağlı numara):
{
"state": "unsupported",
"detail": "Bu numara DoWaba platform WhatsApp hesabına bağlı — profil ve numara ayarları platform yöneticisi tarafından yönetilir."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
WhatsApp — Panel
Siteye bağlı WhatsApp profillerini şablon-uyumluluk bilgisiyle listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/5/whatsapp-profiles"const url = new URL(
"https://dowaba.com/api/sites/5/whatsapp-profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/5/whatsapp-profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"data": [
{
"id": 12,
"name": "Klinik WA",
"connection_type": "meta_business",
"supports_templates": true
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram Entegrasyonu
Kullanıcının Instagram profillerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram-profiles"const url = new URL(
"https://dowaba.com/api/instagram-profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni Instagram profili oluştur (manuel token girerek).
Example request:
curl --request POST \
"https://dowaba.com/api/instagram-profiles" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"instagram_account_id\": \"amniihfqcoynlazghdtqt\",
\"instagram_page_token\": \"qxbajwbpilpmufinllwlo\"
}"
const url = new URL(
"https://dowaba.com/api/instagram-profiles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"instagram_account_id": "amniihfqcoynlazghdtqt",
"instagram_page_token": "qxbajwbpilpmufinllwlo"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'instagram_account_id' => 'amniihfqcoynlazghdtqt',
'instagram_page_token' => 'qxbajwbpilpmufinllwlo',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek Instagram profilini token ile getir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram-profiles/4"const url = new URL(
"https://dowaba.com/api/instagram-profiles/4"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles/4';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram profil bilgilerini güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/instagram-profiles/4" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"instagram_account_id\": \"amniihfqcoynlazghdtqt\",
\"instagram_page_token\": \"qxbajwbpilpmufinllwlo\",
\"webhook_verify_token\": \"auydlsmsjuryvojcybzvr\"
}"
const url = new URL(
"https://dowaba.com/api/instagram-profiles/4"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"instagram_account_id": "amniihfqcoynlazghdtqt",
"instagram_page_token": "qxbajwbpilpmufinllwlo",
"webhook_verify_token": "auydlsmsjuryvojcybzvr"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles/4';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'instagram_account_id' => 'amniihfqcoynlazghdtqt',
'instagram_page_token' => 'qxbajwbpilpmufinllwlo',
'webhook_verify_token' => 'auydlsmsjuryvojcybzvr',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram profilini sil (bağlı site referansları temizlenir).
Example request:
curl --request DELETE \
"https://dowaba.com/api/instagram-profiles/4"const url = new URL(
"https://dowaba.com/api/instagram-profiles/4"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles/4';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram profil token'ını test et (graph.instagram.com veya graph.facebook.com).
Example request:
curl --request POST \
"https://dowaba.com/api/instagram-profiles/4/test"const url = new URL(
"https://dowaba.com/api/instagram-profiles/4/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles/4/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteyi Instagram profiline bağla (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/instagram-profiles/4/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/instagram-profiles/4/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles/4/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-Instagram profil bağlantısını kes (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/instagram-profiles/4/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/instagram-profiles/4/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles/4/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram profiline bağlı siteleri listele. Authz: liste cascade'i (instagramProfileIds — pivot ∪ user_id). Frontend store her listelenen profil için bunu çağırıp "bağlı / bağlanabilir" ayrımını yapar; eski strict user_id check'i bayi/müşteri için 404 dönüyordu. Dönen site listesi kullanıcının accessibleSiteIds'ine kelepçelenir — ortak profil başka tenant'ın sitelerini sızdırmaz.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram-profiles/4/linked-sites"const url = new URL(
"https://dowaba.com/api/instagram-profiles/4/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram-profiles/4/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram OAuth config (Facebook Login for Business: app_id + config_id).
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/oauth/config"const url = new URL(
"https://dowaba.com/api/instagram/oauth/config"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/oauth/config';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram Login (kendi OAuth) authorize URL'i (Facebook'tan bağımsız).
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/oauth/ig-config"const url = new URL(
"https://dowaba.com/api/instagram/oauth/ig-config"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/oauth/ig-config';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki OAuth verilerini alıp hesap bilgilerini döner. OAuth popup akışı tamamlandıktan sonra frontend bu endpoint ile bağlanan hesabın meta bilgilerini (kullanıcı adı, profil fotoğrafı, takipçi sayısı) okur. Erişim token'ı yanıtta YER ALMAZ — token sunucu tarafında saklanır ve yalnızca kaydetme adımında kullanılır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/oauth/pending?key=a1b2c3d4e5f6"const url = new URL(
"https://dowaba.com/api/instagram/oauth/pending"
);
const params = {
"key": "a1b2c3d4e5f6",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/oauth/pending';
$response = $client->get(
$url,
[
'query' => [
'key' => 'a1b2c3d4e5f6',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram hesabını InstagramProfile olarak kaydet + webhook subscribe. OAuth akışının son adımı. Erişim token'ı istemciden değil, `cache_key` ile sunucu tarafındaki geçici OAuth oturumundan okunur.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/oauth/save" \
--header "Content-Type: application/json" \
--data "{
\"instagram_account_id\": \"17841400000000000\",
\"instagram_username\": \"acme_store\",
\"app_scoped_id\": \"1234567890\",
\"cache_key\": \"a1b2c3d4e5f6\"
}"
const url = new URL(
"https://dowaba.com/api/instagram/oauth/save"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"instagram_account_id": "17841400000000000",
"instagram_username": "acme_store",
"app_scoped_id": "1234567890",
"cache_key": "a1b2c3d4e5f6"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/oauth/save';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'instagram_account_id' => '17841400000000000',
'instagram_username' => 'acme_store',
'app_scoped_id' => '1234567890',
'cache_key' => 'a1b2c3d4e5f6',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
FB.login() short-lived token'ı long-lived'a çevir + IG Business hesaplarını bul.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/oauth/exchange" \
--header "Content-Type: application/json" \
--data "{
\"access_token\": null
}"
const url = new URL(
"https://dowaba.com/api/instagram/oauth/exchange"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"access_token": null
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/oauth/exchange';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'access_token' => null,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlı Instagram hesabının bilgilerini getir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/account"const url = new URL(
"https://dowaba.com/api/instagram/account"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/account';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram DM listesi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/messages"const url = new URL(
"https://dowaba.com/api/instagram/messages"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/messages';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram DM gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/messages/send" \
--header "Content-Type: application/json" \
--data "{
\"recipient_id\": \"1234567890\",
\"message\": \"mqeopfuudtdsufvyvddqa\",
\"media_file_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/instagram/messages/send"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"recipient_id": "1234567890",
"message": "mqeopfuudtdsufvyvddqa",
"media_file_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/messages/send';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'recipient_id' => '1234567890',
'message' => 'mqeopfuudtdsufvyvddqa',
'media_file_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir sender ile olan tüm gelen mesajları okundu olarak işaretle. Kullanıcı admin panelde sohbeti açtığında çağrılır.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/conversations/1234567890/mark-read"const url = new URL(
"https://dowaba.com/api/instagram/conversations/1234567890/mark-read"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/conversations/1234567890/mark-read';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcının erişebildiği TÜM IG profilleri için unread sayıları. Profile bar'ında "diğer hesaplarda 20 unread var" chip listesi için. Sadece unread > 0 olan profilleri döner; sıralama unread DESC.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/unread-by-profile"const url = new URL(
"https://dowaba.com/api/instagram/unread-by-profile"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/unread-by-profile';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hesabın Instagram gönderilerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/posts"const url = new URL(
"https://dowaba.com/api/instagram/posts"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/posts';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram'a içerik yayınla (tekli görsel, carousel veya Reel).
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/publish" \
--header "Content-Type: application/json" \
--data "{
\"image_urls\": [
\"http:\\/\\/kunze.biz\\/iste-laborum-eius-est-dolor.html\"
],
\"caption\": \"dtdsufvyvddqamniihfqc\",
\"media_type\": \"REELS\"
}"
const url = new URL(
"https://dowaba.com/api/instagram/publish"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"image_urls": [
"http:\/\/kunze.biz\/iste-laborum-eius-est-dolor.html"
],
"caption": "dtdsufvyvddqamniihfqc",
"media_type": "REELS"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/publish';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'image_urls' => [
'http://kunze.biz/iste-laborum-eius-est-dolor.html',
],
'caption' => 'dtdsufvyvddqamniihfqc',
'media_type' => 'REELS',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram için görsel yükle (opsiyonel kırpma).
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/upload-media" \
--header "Content-Type: multipart/form-data" \
--form "aspect_ratio=4:5"\
--form "images[]=@/tmp/phpeQvy6K" const url = new URL(
"https://dowaba.com/api/instagram/upload-media"
);
const headers = {
"Content-Type": "multipart/form-data",
"Accept": "application/json",
};
const body = new FormData();
body.append('aspect_ratio', '4:5');
body.append('images[]', document.querySelector('input[name="images[]"]').files[0]);
fetch(url, {
method: "POST",
headers,
body,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/upload-media';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'multipart/form-data',
],
'multipart' => [
[
'name' => 'aspect_ratio',
'contents' => '4:5'
],
[
'name' => 'images[]',
'contents' => fopen('/tmp/phpeQvy6K', 'r')
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Instagram gönderisini sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/instagram/posts/17900000000000000"const url = new URL(
"https://dowaba.com/api/instagram/posts/17900000000000000"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/posts/17900000000000000';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gönderi insights (Meta API).
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/posts/17900000000000000/insights"const url = new URL(
"https://dowaba.com/api/instagram/posts/17900000000000000/insights"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/posts/17900000000000000/insights';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yorum listesi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/comments"const url = new URL(
"https://dowaba.com/api/instagram/comments"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/comments';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yoruma yanıt yaz.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/comments/17900000000000001/reply" \
--header "Content-Type: application/json" \
--data "{
\"reply\": \"vmqeopfuudtdsufvyvddq\",
\"type\": \"public\"
}"
const url = new URL(
"https://dowaba.com/api/instagram/comments/17900000000000001/reply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"reply": "vmqeopfuudtdsufvyvddq",
"type": "public"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/comments/17900000000000001/reply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'reply' => 'vmqeopfuudtdsufvyvddq',
'type' => 'public',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Post bazlı oto-yanıt kurallarını getir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/rules"const url = new URL(
"https://dowaba.com/api/instagram/rules"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/rules';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Post bazlı oto-yanıt kuralı kaydet/güncelle.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/rules" \
--header "Content-Type: application/json" \
--data "{
\"id\": \"rule_42\",
\"post_id\": \"17841400000000000\",
\"post_caption\": \"Yeni koleksiyonumuz yayında!\",
\"post_media_url\": \"https:\\/\\/example.com\\/post.jpg\",
\"keywords\": [
\"fiyat\",
\"kargo\"
],
\"comment_message\": \"mqeopfuudtdsufvyvddqa\",
\"dm_message\": \"mniihfqcoynlazghdtqtq\",
\"dm_closed_reply\": \"xbajwbpilpmufinllwloa\",
\"use_ai\": true,
\"custom_prompt\": \"Yorumcuya samimi bir teşekkür yaz, detayları DM\'den ilettiğimizi söyle.\",
\"enabled\": false
}"
const url = new URL(
"https://dowaba.com/api/instagram/rules"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"id": "rule_42",
"post_id": "17841400000000000",
"post_caption": "Yeni koleksiyonumuz yayında!",
"post_media_url": "https:\/\/example.com\/post.jpg",
"keywords": [
"fiyat",
"kargo"
],
"comment_message": "mqeopfuudtdsufvyvddqa",
"dm_message": "mniihfqcoynlazghdtqtq",
"dm_closed_reply": "xbajwbpilpmufinllwloa",
"use_ai": true,
"custom_prompt": "Yorumcuya samimi bir teşekkür yaz, detayları DM'den ilettiğimizi söyle.",
"enabled": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/rules';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'id' => 'rule_42',
'post_id' => '17841400000000000',
'post_caption' => 'Yeni koleksiyonumuz yayında!',
'post_media_url' => 'https://example.com/post.jpg',
'keywords' => [
'fiyat',
'kargo',
],
'comment_message' => 'mqeopfuudtdsufvyvddqa',
'dm_message' => 'mniihfqcoynlazghdtqtq',
'dm_closed_reply' => 'xbajwbpilpmufinllwloa',
'use_ai' => true,
'custom_prompt' => 'Yorumcuya samimi bir teşekkür yaz, detayları DM\'den ilettiğimizi söyle.',
'enabled' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Post bazlı oto-yanıt kuralını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/instagram/rules/rule_1700000000000"const url = new URL(
"https://dowaba.com/api/instagram/rules/rule_1700000000000"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/rules/rule_1700000000000';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profil bazlı AI bot toggle.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/toggle-profile-bot"const url = new URL(
"https://dowaba.com/api/instagram/toggle-profile-bot"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/toggle-profile-bot';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşma bazlı bot toggle (sender_id ile).
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/toggle-conversation-bot" \
--header "Content-Type: application/json" \
--data "{
\"sender_id\": \"1234567890\",
\"sender_username\": \"mqeopfuudtdsufvyvddqa\"
}"
const url = new URL(
"https://dowaba.com/api/instagram/toggle-conversation-bot"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sender_id": "1234567890",
"sender_username": "mqeopfuudtdsufvyvddqa"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/toggle-conversation-bot';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'sender_id' => '1234567890',
'sender_username' => 'mqeopfuudtdsufvyvddqa',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşmadaki kullanıcıyı engelle/engeli kaldır.
Example request:
curl --request POST \
"https://dowaba.com/api/instagram/toggle-conversation-block" \
--header "Content-Type: application/json" \
--data "{
\"sender_id\": \"1234567890\"
}"
const url = new URL(
"https://dowaba.com/api/instagram/toggle-conversation-block"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sender_id": "1234567890"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/toggle-conversation-block';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'sender_id' => '1234567890',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşma bazlı bot durumunu sorgula.
Example request:
curl --request GET \
--get "https://dowaba.com/api/instagram/conversation-bot-status"const url = new URL(
"https://dowaba.com/api/instagram/conversation-bot-status"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/instagram/conversation-bot-status';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
E-posta Entegrasyonu
Mail hesaplarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/mail/accounts"const url = new URL(
"https://dowaba.com/api/mail/accounts"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni mail hesabı oluştur (IMAP + SMTP).
Example request:
curl --request POST \
"https://dowaba.com/api/mail/accounts" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"imap_host\": \"mail.example.com\",
\"imap_port\": 17,
\"imap_encryption\": \"none\",
\"imap_username\": \"user@example.com\",
\"imap_password\": null,
\"smtp_host\": \"mail.example.com\",
\"smtp_port\": 17,
\"smtp_encryption\": \"none\",
\"smtp_username\": \"user@example.com\",
\"smtp_password\": null,
\"from_name\": \"mqeopfuudtdsufvyvddqa\",
\"from_email\": \"eloisa.harber@example.com\"
}"
const url = new URL(
"https://dowaba.com/api/mail/accounts"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"imap_host": "mail.example.com",
"imap_port": 17,
"imap_encryption": "none",
"imap_username": "user@example.com",
"imap_password": null,
"smtp_host": "mail.example.com",
"smtp_port": 17,
"smtp_encryption": "none",
"smtp_username": "user@example.com",
"smtp_password": null,
"from_name": "mqeopfuudtdsufvyvddqa",
"from_email": "eloisa.harber@example.com"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'imap_host' => 'mail.example.com',
'imap_port' => 17,
'imap_encryption' => 'none',
'imap_username' => 'user@example.com',
'imap_password' => null,
'smtp_host' => 'mail.example.com',
'smtp_port' => 17,
'smtp_encryption' => 'none',
'smtp_username' => 'user@example.com',
'smtp_password' => null,
'from_name' => 'mqeopfuudtdsufvyvddqa',
'from_email' => 'eloisa.harber@example.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail hesabını güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/mail/accounts/42" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"imap_host\": \"mail.example.com\",
\"imap_port\": 17,
\"imap_encryption\": \"tls\",
\"imap_username\": \"user@example.com\",
\"smtp_host\": \"mail.example.com\",
\"smtp_port\": 17,
\"smtp_encryption\": \"tls\",
\"smtp_username\": \"user@example.com\",
\"from_name\": \"mqeopfuudtdsufvyvddqa\",
\"from_email\": \"eloisa.harber@example.com\",
\"bot_active\": false
}"
const url = new URL(
"https://dowaba.com/api/mail/accounts/42"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"imap_host": "mail.example.com",
"imap_port": 17,
"imap_encryption": "tls",
"imap_username": "user@example.com",
"smtp_host": "mail.example.com",
"smtp_port": 17,
"smtp_encryption": "tls",
"smtp_username": "user@example.com",
"from_name": "mqeopfuudtdsufvyvddqa",
"from_email": "eloisa.harber@example.com",
"bot_active": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/42';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'imap_host' => 'mail.example.com',
'imap_port' => 17,
'imap_encryption' => 'tls',
'imap_username' => 'user@example.com',
'smtp_host' => 'mail.example.com',
'smtp_port' => 17,
'smtp_encryption' => 'tls',
'smtp_username' => 'user@example.com',
'from_name' => 'mqeopfuudtdsufvyvddqa',
'from_email' => 'eloisa.harber@example.com',
'bot_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail hesabını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/mail/accounts/7"const url = new URL(
"https://dowaba.com/api/mail/accounts/7"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/7';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail hesabı bağlantı testi (IMAP + SMTP).
Example request:
curl --request POST \
"https://dowaba.com/api/mail/accounts/42/test"const url = new URL(
"https://dowaba.com/api/mail/accounts/42/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/42/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteyi mail hesabına bağla (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/mail/accounts/12/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/mail/accounts/12/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/12/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-mail hesap bağlantısını kes.
Example request:
curl --request POST \
"https://dowaba.com/api/mail/accounts/12/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/mail/accounts/12/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/12/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail hesabına bağlı siteleri listele. Authz: liste cascade'i (mailAccountIds — pivot ∪ user_id ∪ legacy). Frontend her listelenen hesap için bunu çağırıp "bağlı / bağlanabilir" ayrımını yapar. Dönen site listesi kullanıcının accessibleSiteIds'ine kelepçelenir — ortak hesap başka tenant'ın site id+adını sızdırmaz (superadmin bypass).
Example request:
curl --request GET \
--get "https://dowaba.com/api/mail/accounts/42/linked-sites"const url = new URL(
"https://dowaba.com/api/mail/accounts/42/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/42/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gelen kutusunu çek (IMAP fetch).
Example request:
curl --request POST \
"https://dowaba.com/api/mail/accounts/12/fetch" \
--header "Content-Type: application/json" \
--data "{
\"force\": false
}"
const url = new URL(
"https://dowaba.com/api/mail/accounts/12/fetch"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"force": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/12/fetch';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'force' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir mail hesabının mesajlarını listele (inbox görünümü).
Example request:
curl --request GET \
--get "https://dowaba.com/api/mail/accounts/42/messages?email=musteri%40ornek.com"const url = new URL(
"https://dowaba.com/api/mail/accounts/42/messages"
);
const params = {
"email": "musteri@ornek.com",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/42/messages';
$response = $client->get(
$url,
[
'query' => [
'email' => 'musteri@ornek.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir mail thread'ini getir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/mail/messages/7/thread"const url = new URL(
"https://dowaba.com/api/mail/messages/7/thread"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/messages/7/thread';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail yanıt gönder (SMTP).
Example request:
curl --request POST \
"https://dowaba.com/api/mail/reply" \
--header "Content-Type: application/json" \
--data "{
\"account_id\": 17,
\"to\": \"carolyne.luettgen@example.org\",
\"subject\": \"fuudtdsufvyvddqamniih\",
\"body\": \"Merhaba, talebiniz alındı. En kısa sürede dönüş yapacağız.\",
\"in_reply_to\": \"20260519142311.AB12CD@mail.example.com\"
}"
const url = new URL(
"https://dowaba.com/api/mail/reply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"account_id": 17,
"to": "carolyne.luettgen@example.org",
"subject": "fuudtdsufvyvddqamniih",
"body": "Merhaba, talebiniz alındı. En kısa sürede dönüş yapacağız.",
"in_reply_to": "20260519142311.AB12CD@mail.example.com"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/reply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'account_id' => 17,
'to' => 'carolyne.luettgen@example.org',
'subject' => 'fuudtdsufvyvddqamniih',
'body' => 'Merhaba, talebiniz alındı. En kısa sürede dönüş yapacağız.',
'in_reply_to' => '20260519142311.AB12CD@mail.example.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail hesabı için AI bot otomatik yanıtını aç/kapat.
Example request:
curl --request POST \
"https://dowaba.com/api/mail/toggle-bot"const url = new URL(
"https://dowaba.com/api/mail/toggle-bot"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/toggle-bot';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
E-posta adresini bot icin engelle/engeli kaldir. Iki liste: - blocked_emails → manuel (kullanici "Engelle" tikladi) - auto_blocked_emails → otomatik (X-Spam-Score esigi asti) Toggle mantigi: - Adres iki listeden BIRINDE ise → her ikisinden de cikar (unblock). - Hicbirinde yoksa → manual blocked_emails listesine ekle. Boylece otomatik engellenen bir adres "Engeli Kaldir" yapildiginda auto listesinden de cikar, bir sonraki yuksek-skor mail'inde tekrar eklenebilir veya kullanici manuel ekleyebilir.
Example request:
curl --request POST \
"https://dowaba.com/api/mail/toggle-block"const url = new URL(
"https://dowaba.com/api/mail/toggle-block"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/toggle-block';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
E-posta pattern'ini whitelist'e ekle / cikar (toggle). Whitelist substring pattern listesidir; MailService::fetchEmails bu pattern'lerden herhangi birini icermesi durumunda gondericiyi spam filtresinden ve X-Spam-Score esiginden bypass eder. Ornek pattern'ler: - "mail.byteintl.com" → TikTok no-reply tum mailler - "no-reply@mail.byteintl.com" → spesifik TikTok adresi - "byteintl" → ByteDance subdomain'leri Toggle mantigi: - Pattern listede varsa → cikar (unwhitelist). - Yoksa → ekle. NOTE: blocked_emails > whitelist_emails — manuel engel her zaman onceliklidir, whitelist'le bypass edilemez (kullanici net olarak engel istemis).
Example request:
curl --request POST \
"https://dowaba.com/api/mail/toggle-whitelist" \
--header "Content-Type: application/json" \
--data "{
\"account_id\": 17,
\"pattern\": \"mqeopfuudtdsufvyvddqa\"
}"
const url = new URL(
"https://dowaba.com/api/mail/toggle-whitelist"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"account_id": 17,
"pattern": "mqeopfuudtdsufvyvddqa"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/toggle-whitelist';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'account_id' => 17,
'pattern' => 'mqeopfuudtdsufvyvddqa',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Spam filtre ayarlarını güncelle (hesabın fetch_settings JSON'ına MERGE edilir — fetch_days/max_per_fetch gibi diğer ayarlar korunur). Varsayılanlar: `block_noreply` ve `block_spam_subjects` kapalı (no-reply / doğrulama mailleri gelir), `spam_score_filter` (sunucu taraflı spam skoru) açık.
Example request:
curl --request POST \
"https://dowaba.com/api/mail/accounts/42/spam-settings" \
--header "Content-Type: application/json" \
--data "{
\"spam_filter\": true,
\"block_dmarc_reports\": true,
\"block_noreply\": false,
\"block_spam_subjects\": false,
\"spam_score_filter\": true,
\"spam_score_threshold\": \"8\"
}"
const url = new URL(
"https://dowaba.com/api/mail/accounts/42/spam-settings"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"spam_filter": true,
"block_dmarc_reports": true,
"block_noreply": false,
"block_spam_subjects": false,
"spam_score_filter": true,
"spam_score_threshold": "8"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/accounts/42/spam-settings';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'spam_filter' => true,
'block_dmarc_reports' => true,
'block_noreply' => false,
'block_spam_subjects' => false,
'spam_score_filter' => true,
'spam_score_threshold' => '8',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşmayı okundu olarak işaretle.
Example request:
curl --request POST \
"https://dowaba.com/api/mail/mark-read" \
--header "Content-Type: application/json" \
--data "{
\"account_id\": 17,
\"email\": \"qkunze@example.com\"
}"
const url = new URL(
"https://dowaba.com/api/mail/mark-read"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"account_id": 17,
"email": "qkunze@example.com"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/mark-read';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'account_id' => 17,
'email' => 'qkunze@example.com',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail konuşmasını sil.
Example request:
curl --request POST \
"https://dowaba.com/api/mail/delete-conversation" \
--header "Content-Type: application/json" \
--data "{
\"account_id\": 17,
\"email\": \"qkunze@example.com\",
\"delete_from_server\": false
}"
const url = new URL(
"https://dowaba.com/api/mail/delete-conversation"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"account_id": 17,
"email": "qkunze@example.com",
"delete_from_server": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/delete-conversation';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'account_id' => 17,
'email' => 'qkunze@example.com',
'delete_from_server' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail ekini indir (Bearer auth — mobil/panel programatik indirme).
Example request:
curl --request GET \
--get "https://dowaba.com/api/mail/messages/7114/attachments/0"const url = new URL(
"https://dowaba.com/api/mail/messages/7114/attachments/0"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/messages/7114/attachments/0';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Example response (404):
{
"message": "ek bulunamadı"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Eski bir mailin eklerini IMAP sunucusundan sonradan getir (backfill). Ekler artık fetch sırasında kaydedilir; bu uç yalnız özellikten ÖNCE çekilmiş (attachments alanı hiç taranmamış) mailler içindir. Mail sunucuda hâlâ duruyorsa ekleri indirilir ve kalıcı kaydedilir; durmuyorsa "ek yok" olarak damgalanır. KVKK: içeriği saklama süresi dolup temizlenmiş mesajlarda çalışmaz.
Example request:
curl --request POST \
"https://dowaba.com/api/mail/messages/7114/attachments/sync"const url = new URL(
"https://dowaba.com/api/mail/messages/7114/attachments/sync"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail/messages/7114/attachments/sync';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail — Template
Kullanıcının erişebildiği site'lerdeki tüm mail template'leri. Query: ?site_id=N (opsiyonel filter)
Example request:
curl --request GET \
--get "https://dowaba.com/api/mail-templates"const url = new URL(
"https://dowaba.com/api/mail-templates"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-templates';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel template ekle (subject + body_html).
Example request:
curl --request POST \
"https://dowaba.com/api/mail-templates" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"name\": \"mqeopfuudtdsufvyvddqa\",
\"subject_template\": \"mniihfqcoynlazghdtqtq\",
\"body_html\": \"xbajwbpilpmufinllwloa\",
\"body_text\": \"uydlsmsjuryvojcybzvrb\",
\"ai_prompt\": \"yickznkygloigmkwxphlv\"
}"
const url = new URL(
"https://dowaba.com/api/mail-templates"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"name": "mqeopfuudtdsufvyvddqa",
"subject_template": "mniihfqcoynlazghdtqtq",
"body_html": "xbajwbpilpmufinllwloa",
"body_text": "uydlsmsjuryvojcybzvrb",
"ai_prompt": "yickznkygloigmkwxphlv"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-templates';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'name' => 'mqeopfuudtdsufvyvddqa',
'subject_template' => 'mniihfqcoynlazghdtqtq',
'body_html' => 'xbajwbpilpmufinllwloa',
'body_text' => 'uydlsmsjuryvojcybzvrb',
'ai_prompt' => 'yickznkygloigmkwxphlv',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI ile mail template üret. Site context + system_prompt + dil yönergesi Gemini'ye gönderilir, structured output (subject + body_html + body_text + suggested_variables) döner. Form'a doldurulur, kullanıcı edit + kaydet.
Example request:
curl --request POST \
"https://dowaba.com/api/mail-templates/generate" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"prompt\": \"mqeopfuudtdsufvyvddqa\",
\"tone\": \"samimi\"
}"
const url = new URL(
"https://dowaba.com/api/mail-templates/generate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"prompt": "mqeopfuudtdsufvyvddqa",
"tone": "samimi"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-templates/generate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'prompt' => 'mqeopfuudtdsufvyvddqa',
'tone' => 'samimi',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI ile mail şablonu SOHBET asistanı (çok-turlu). Kullanıcı sohbet ettikçe AI şablonun KONUSU + HTML gövdesi + düz metin gövdesini birlikte günceller. Stateless: frontend her turda geçmiş mesajları + mevcut taslağı gönderir → {reply, subject, body_html, body_text, done}. generate() ile aynı standart (anahtar/kredi/sanitize) ama tek-seferlik üretim yerine iteratif düzenleme. SystemPromptBuilder'ın prompt-chat akışının mail-şablonu muadili.
Example request:
curl --request POST \
"https://dowaba.com/api/mail-templates/chat" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"subject\": \"mqeopfuudtdsufvyvddqa\",
\"body_html\": \"mniihfqcoynlazghdtqtq\",
\"body_text\": \"xbajwbpilpmufinllwloa\",
\"tone\": \"detayli\",
\"locale\": \"sl_SI\",
\"messages\": [
{
\"role\": \"user\",
\"content\": \"mqeopfuudtdsufvyvddqa\"
}
]
}"
const url = new URL(
"https://dowaba.com/api/mail-templates/chat"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"subject": "mqeopfuudtdsufvyvddqa",
"body_html": "mniihfqcoynlazghdtqtq",
"body_text": "xbajwbpilpmufinllwloa",
"tone": "detayli",
"locale": "sl_SI",
"messages": [
{
"role": "user",
"content": "mqeopfuudtdsufvyvddqa"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-templates/chat';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'subject' => 'mqeopfuudtdsufvyvddqa',
'body_html' => 'mniihfqcoynlazghdtqtq',
'body_text' => 'xbajwbpilpmufinllwloa',
'tone' => 'detayli',
'locale' => 'sl_SI',
'messages' => [
[
'role' => 'user',
'content' => 'mqeopfuudtdsufvyvddqa',
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Template'i kendi mail adresine (veya verilen test adresine) test gönderimi. Body: { mail_account_id: int, to_email?: string }
Example request:
curl --request POST \
"https://dowaba.com/api/mail-templates/42/send-test" \
--header "Content-Type: application/json" \
--data "{
\"mail_account_id\": 17,
\"to_email\": \"carolyne.luettgen@example.org\"
}"
const url = new URL(
"https://dowaba.com/api/mail-templates/42/send-test"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"mail_account_id": 17,
"to_email": "carolyne.luettgen@example.org"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-templates/42/send-test';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'mail_account_id' => 17,
'to_email' => 'carolyne.luettgen@example.org',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mail — Kampanya
Kampanya listesi (status + site filter).
Example request:
curl --request GET \
--get "https://dowaba.com/api/mail-campaigns"const url = new URL(
"https://dowaba.com/api/mail-campaigns"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-campaigns';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni kampanya (status=draft). Başlatmak için /start çağrılır.
Example request:
curl --request POST \
"https://dowaba.com/api/mail-campaigns" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"mail_account_id\": 17,
\"mail_template_id\": 17,
\"contact_group_id\": 17,
\"name\": \"mqeopfuudtdsufvyvddqa\",
\"recipient_filter\": {
\"phone_types\": [
\"other\"
],
\"require_email\": true
},
\"schedule_type\": \"once\",
\"schedule_hour\": 0,
\"batch_size\": 2,
\"daily_send_limit_override\": 29,
\"hourly_send_limit_override\": 30,
\"consent_confirmed\": true
}"
const url = new URL(
"https://dowaba.com/api/mail-campaigns"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"mail_account_id": 17,
"mail_template_id": 17,
"contact_group_id": 17,
"name": "mqeopfuudtdsufvyvddqa",
"recipient_filter": {
"phone_types": [
"other"
],
"require_email": true
},
"schedule_type": "once",
"schedule_hour": 0,
"batch_size": 2,
"daily_send_limit_override": 29,
"hourly_send_limit_override": 30,
"consent_confirmed": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-campaigns';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'mail_account_id' => 17,
'mail_template_id' => 17,
'contact_group_id' => 17,
'name' => 'mqeopfuudtdsufvyvddqa',
'recipient_filter' => [
'phone_types' => [
'other',
],
'require_email' => true,
],
'schedule_type' => 'once',
'schedule_hour' => 0,
'batch_size' => 2,
'daily_send_limit_override' => 29,
'hourly_send_limit_override' => 30,
'consent_confirmed' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Başarısız (status=failed) gönderimleri yeniden dene (manuel retry). Per-recipient auto-retry KALDIRILDI (native Horizon retry'a geçildi — HORIZON.md § 11); manuel retry artık failed log'ları SİLER → o contact'lar log'suz kalır → MailCampaignProcessor pending query'si bir sonraki tick'te yeniden toplar + gönderir. Kampanya completed/paused/failed ise running'e alınır (cron işlesin). skipped (invalid_email / hard_bounce) DOKUNULMAZ. NOT: Senkron fail kotadan düşmediği için (refound.md § 1) bu bir "iade" değildir; iade SADECE bounce için ayrı cron'da yapılır (campaigns:refund-bounced-mail).
Example request:
curl --request POST \
"https://dowaba.com/api/mail-campaigns/42/retry-failed"const url = new URL(
"https://dowaba.com/api/mail-campaigns/42/retry-failed"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/mail-campaigns/42/retry-failed';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram / Messenger
Kullanıcının Telegram profillerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/telegram/profiles"const url = new URL(
"https://dowaba.com/api/telegram/profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni Telegram botu bağla (BotFather token + webhook ayarla).
Example request:
curl --request POST \
"https://dowaba.com/api/telegram/profiles" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"bot_token\": null
}"
const url = new URL(
"https://dowaba.com/api/telegram/profiles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"bot_token": null
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'bot_token' => null,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram profil bilgilerini güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/telegram/profiles/5" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"is_active\": false,
\"bot_active\": false
}"
const url = new URL(
"https://dowaba.com/api/telegram/profiles/5"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"is_active": false,
"bot_active": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles/5';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'is_active' => false,
'bot_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram profilini sil (webhook da kaldırılır).
Example request:
curl --request DELETE \
"https://dowaba.com/api/telegram/profiles/5"const url = new URL(
"https://dowaba.com/api/telegram/profiles/5"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles/5';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram bot aktif/pasif yap.
Example request:
curl --request POST \
"https://dowaba.com/api/telegram/profiles/5/toggle-bot"const url = new URL(
"https://dowaba.com/api/telegram/profiles/5/toggle-bot"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles/5/toggle-bot';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram bot bağlantı testi (getMe).
Example request:
curl --request GET \
--get "https://dowaba.com/api/telegram/profiles/5/test"const url = new URL(
"https://dowaba.com/api/telegram/profiles/5/test"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles/5/test';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteyi Telegram profiline bağla (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/telegram/profiles/5/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/telegram/profiles/5/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles/5/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-Telegram profil bağlantısını kes (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/telegram/profiles/5/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/telegram/profiles/5/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles/5/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram profiline bağlı siteleri listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/telegram/profiles/5/linked-sites"const url = new URL(
"https://dowaba.com/api/telegram/profiles/5/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/profiles/5/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcının Messenger profillerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/messenger/profiles"const url = new URL(
"https://dowaba.com/api/messenger/profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni Facebook Messenger sayfası bağla (manuel token ile).
Example request:
curl --request POST \
"https://dowaba.com/api/messenger/profiles" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"page_id\": \"1234567890\",
\"page_access_token\": null,
\"app_id\": \"1234567890\"
}"
const url = new URL(
"https://dowaba.com/api/messenger/profiles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"page_id": "1234567890",
"page_access_token": null,
"app_id": "1234567890"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'page_id' => '1234567890',
'page_access_token' => null,
'app_id' => '1234567890',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger profil bilgilerini güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/messenger/profiles/34" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"is_active\": true,
\"bot_active\": false
}"
const url = new URL(
"https://dowaba.com/api/messenger/profiles/34"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"is_active": true,
"bot_active": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles/34';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'is_active' => true,
'bot_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger profilini sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/messenger/profiles/34"const url = new URL(
"https://dowaba.com/api/messenger/profiles/34"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles/34';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger bot aktif/pasif yap.
Example request:
curl --request POST \
"https://dowaba.com/api/messenger/profiles/34/toggle-bot"const url = new URL(
"https://dowaba.com/api/messenger/profiles/34/toggle-bot"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles/34/toggle-bot';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteyi Messenger profiline bağla (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/messenger/profiles/34/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/messenger/profiles/34/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles/34/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-Messenger profil bağlantısını kes (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/messenger/profiles/34/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/messenger/profiles/34/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles/34/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger profiline bağlı siteleri listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/messenger/profiles/34/linked-sites"const url = new URL(
"https://dowaba.com/api/messenger/profiles/34/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/profiles/34/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram konuşma listesini getir (panel görünümü).
Example request:
curl --request GET \
--get "https://dowaba.com/api/telegram/conversations"const url = new URL(
"https://dowaba.com/api/telegram/conversations"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/conversations';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir Telegram chat'inin mesajlarını getir + okundu işaretle. Opt-in sayfalama: `limit`/`before_id` verilmezse TÜM mesajlar (eski davranış, bare array) döner. Verilirse en yeni `limit` mesaj + `{messages, has_more, oldest_id}` (yukarı kaydırma cursor'ı).
Example request:
curl --request GET \
--get "https://dowaba.com/api/telegram/messages/1234567890?limit=50&before_id=12345"const url = new URL(
"https://dowaba.com/api/telegram/messages/1234567890"
);
const params = {
"limit": "50",
"before_id": "12345",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/messages/1234567890';
$response = $client->get(
$url,
[
'query' => [
'limit' => '50',
'before_id' => '12345',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Sayfalı (limit/before_id verildi)):
{
"messages": [
{
"id": 12300,
"direction": "in",
"message": "Merhaba",
"metadata": null,
"delivery_status": null,
"delivery_error": null,
"media_url": null,
"media_type": null,
"media_mime": null,
"created_at": "14:32",
"date": "05.06.2026"
}
],
"has_more": true,
"oldest_id": 12300
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram chat'e mesaj gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/telegram/send" \
--header "Content-Type: application/json" \
--data "{
\"chat_id\": \"1234567890\",
\"message\": \"mqeopfuudtdsufvyvddqa\",
\"profile_id\": 17,
\"media_file_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/telegram/send"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"chat_id": "1234567890",
"message": "mqeopfuudtdsufvyvddqa",
"profile_id": 17,
"media_file_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/send';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'chat_id' => '1234567890',
'message' => 'mqeopfuudtdsufvyvddqa',
'profile_id' => 17,
'media_file_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşma bot/engel durumu (READ-ONLY) — unified inbox header için. getMessages düz mesaj array'i döndürdüğünden header `botActive` default'ta kalıyordu (2026-05-30 fix). toggleBot ile AYNI profil çözümü; firstOrCreate yerine first() (görüntüleme satır yaratmaz).
Example request:
curl --request GET \
--get "https://dowaba.com/api/telegram/conversation-state" \
--header "Content-Type: application/json" \
--data "{
\"chat_id\": \"1234567890\",
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/telegram/conversation-state"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"chat_id": "1234567890",
"profile_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/conversation-state';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'chat_id' => '1234567890',
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram konuşma için bot otomatik yanıtını aç/kapat.
Example request:
curl --request POST \
"https://dowaba.com/api/telegram/toggle-bot" \
--header "Content-Type: application/json" \
--data "{
\"chat_id\": \"1234567890\",
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/telegram/toggle-bot"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"chat_id": "1234567890",
"profile_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/toggle-bot';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'chat_id' => '1234567890',
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Telegram konuşmadaki kullanıcıyı engelle / engeli kaldır.
Example request:
curl --request POST \
"https://dowaba.com/api/telegram/toggle-block" \
--header "Content-Type: application/json" \
--data "{
\"chat_id\": \"1234567890\",
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/telegram/toggle-block"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"chat_id": "1234567890",
"profile_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/telegram/toggle-block';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'chat_id' => '1234567890',
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger konuşma listesini getir (panel).
Example request:
curl --request GET \
--get "https://dowaba.com/api/messenger/conversations"const url = new URL(
"https://dowaba.com/api/messenger/conversations"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/conversations';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir Messenger sender_id'nin mesajlarını getir + okundu işaretle. Opt-in sayfalama: `limit`/`before_id` verilmezse TÜM mesajlar (eski davranış, bare array) döner. Verilirse en yeni `limit` mesaj + `{messages, has_more, oldest_id}` (yukarı kaydırma cursor'ı).
Example request:
curl --request GET \
--get "https://dowaba.com/api/messenger/messages/1234567890?limit=50&before_id=12345"const url = new URL(
"https://dowaba.com/api/messenger/messages/1234567890"
);
const params = {
"limit": "50",
"before_id": "12345",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/messages/1234567890';
$response = $client->get(
$url,
[
'query' => [
'limit' => '50',
'before_id' => '12345',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Sayfalı (limit/before_id verildi)):
{
"messages": [
{
"id": 12300,
"direction": "in",
"message": "Merhaba",
"metadata": null,
"delivery_status": null,
"delivery_error": null,
"media_url": null,
"media_type": null,
"media_mime": null,
"created_at": "14:32",
"date": "05.06.2026"
}
],
"has_more": true,
"oldest_id": 12300
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger sender'a mesaj gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/messenger/send" \
--header "Content-Type: application/json" \
--data "{
\"sender_id\": \"1234567890\",
\"message\": \"mqeopfuudtdsufvyvddqa\",
\"profile_id\": 17,
\"media_file_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/messenger/send"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sender_id": "1234567890",
"message": "mqeopfuudtdsufvyvddqa",
"profile_id": 17,
"media_file_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/send';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'sender_id' => '1234567890',
'message' => 'mqeopfuudtdsufvyvddqa',
'profile_id' => 17,
'media_file_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Konuşmanın bot/engel durumunu okur (salt-okunur) — inbox başlığı için. Kayıt yoksa oluşturmaz; varsayılan durum döner.
Example request:
curl --request GET \
--get "https://dowaba.com/api/messenger/conversation-state" \
--header "Content-Type: application/json" \
--data "{
\"sender_id\": \"1234567890\",
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/messenger/conversation-state"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sender_id": "1234567890",
"profile_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/conversation-state';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'sender_id' => '1234567890',
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger konuşma için bot otomatik yanıtını aç/kapat.
Example request:
curl --request POST \
"https://dowaba.com/api/messenger/toggle-bot" \
--header "Content-Type: application/json" \
--data "{
\"sender_id\": \"1234567890\",
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/messenger/toggle-bot"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sender_id": "1234567890",
"profile_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/toggle-bot';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'sender_id' => '1234567890',
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Messenger sender'ı engelle / engeli kaldır.
Example request:
curl --request POST \
"https://dowaba.com/api/messenger/toggle-block" \
--header "Content-Type: application/json" \
--data "{
\"sender_id\": \"1234567890\",
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/messenger/toggle-block"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"sender_id": "1234567890",
"profile_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/messenger/toggle-block';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'sender_id' => '1234567890',
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SMS Entegrasyonu
Kullanıcının SMS hesaplarını listele (NetGSM, Twilio, vb.).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sms-accounts"const url = new URL(
"https://dowaba.com/api/sms-accounts"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni SMS hesabı oluştur.
Example request:
curl --request POST \
"https://dowaba.com/api/sms-accounts" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"provider\": \"mutlucell\",
\"credentials\": [],
\"is_active\": false
}"
const url = new URL(
"https://dowaba.com/api/sms-accounts"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"provider": "mutlucell",
"credentials": [],
"is_active": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'provider' => 'mutlucell',
'credentials' => [],
'is_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SMS hesabı detayını getir (credentials görünür).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sms-accounts/1"const url = new URL(
"https://dowaba.com/api/sms-accounts/1"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts/1';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SMS hesabını güncelle. ⚠️ `credentials` KISMİ güncellenir: gönderilmeyen anahtarlar mevcut değerinden KORUNUR, boş string gelen anahtar EZER (başlık temizlenebilsin). Gerekçe: panel modalı formu `credentials: {}` ile açıp değerleri async yükler; kullanıcı erken kaydederse (ya da GET hata verirse) `credentials: {}` PUT'lanır ve şifre KALICI olarak silinirdi. Widget'la gelen credential "bir daha iletilmez" → bu kayıp geri döndürülemez. Otorite backend'dedir (panel tek istemci değil). İSTİSNA: `provider` değişiyorsa merge YAPILMAZ (tam değişim) — eski sağlayıcının artık anlamsız anahtarları yeni credential setine sızmasın. ⚠️ `header` NULL → '' normalizasyonu: global `ConvertEmptyStringsToNull` middleware'i panelden gelen `credentials.header: ""`'i null'a çevirir; null saklanırsa `SmsService::withCredentials`'ın `?? $this->defaultHeader` fallback'i devreye girer ve hesap SUPERADMIN'İN GLOBAL gönderici başlığını miras alır (cross-tenant marka sızıntısı). Açıkça gönderilen null bu yüzden `''`'e çevrilir. (`SmsService`'e DOKUNULMADI — elle açılmış eski hesapların fallback davranışı aynı.) ⚠️ KVKK kapısı: `is_active` false→true geçişi = hesabı GÖNDERİME AÇMAK. Widget'ın yarattığı (ve elle eklenip pasifleştirilmiş) hesaplar bu uçtan aktive edilebildiği için `store()`'daki onay kapısının aynısı BURADA da uygulanır — yoksa onaysız ticari elektronik ileti yolu açılırdı. Pasifleştirme / ad değişikliği kapıya takılmaz.
Example request:
curl --request PUT \
"https://dowaba.com/api/sms-accounts/1" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"provider\": \"netgsm\",
\"is_active\": false
}"
const url = new URL(
"https://dowaba.com/api/sms-accounts/1"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"provider": "netgsm",
"is_active": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts/1';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'provider' => 'netgsm',
'is_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SMS hesabını sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/sms-accounts/1"const url = new URL(
"https://dowaba.com/api/sms-accounts/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SMS hesabını gerçek bir numaraya test SMS göndererek dene.
Example request:
curl --request POST \
"https://dowaba.com/api/sms-accounts/1/test" \
--header "Content-Type: application/json" \
--data "{
\"phone\": \"+905551234567\"
}"
const url = new URL(
"https://dowaba.com/api/sms-accounts/1/test"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"phone": "+905551234567"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts/1/test';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'phone' => '+905551234567',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Siteyi SMS hesabına bağla (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/sms-accounts/1/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/sms-accounts/1/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts/1/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-SMS hesap bağlantısını kes (pivot).
Example request:
curl --request POST \
"https://dowaba.com/api/sms-accounts/1/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/sms-accounts/1/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts/1/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SMS hesabına bağlı siteleri listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sms-accounts/1/linked-sites"const url = new URL(
"https://dowaba.com/api/sms-accounts/1/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-accounts/1/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SMS — Kampanya
Kampanya listesi (status + site filter).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sms-campaigns?site_id=12&status=running"const url = new URL(
"https://dowaba.com/api/sms-campaigns"
);
const params = {
"site_id": "12",
"status": "running",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns';
$response = $client->get(
$url,
[
'query' => [
'site_id' => '12',
'status' => 'running',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"data": [
{
"id": 1,
"name": "Haziran kampanyası",
"status": "running",
"total_recipients": 120
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni SMS kampanyası (status=draft) + alıcı SNAPSHOT. Başlatmak için /start çağrılır. Mesajda `{ad}` kişi adıyla değişir.
Example request:
curl --request POST \
"https://dowaba.com/api/sms-campaigns" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 12,
\"contact_group_id\": 5,
\"sms_account_id\": 3,
\"name\": \"Haziran kampanyası\",
\"message_body\": \"Merhaba {ad}, kampanyamızdan haberdar olun!\",
\"sender_header\": \"DOWABA\",
\"scheduled_at\": \"2026-06-18T07:00:00Z\",
\"batch_size\": 100,
\"delay_ms\": 100,
\"consent_confirmed\": true
}"
const url = new URL(
"https://dowaba.com/api/sms-campaigns"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 12,
"contact_group_id": 5,
"sms_account_id": 3,
"name": "Haziran kampanyası",
"message_body": "Merhaba {ad}, kampanyamızdan haberdar olun!",
"sender_header": "DOWABA",
"scheduled_at": "2026-06-18T07:00:00Z",
"batch_size": 100,
"delay_ms": 100,
"consent_confirmed": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 12,
'contact_group_id' => 5,
'sms_account_id' => 3,
'name' => 'Haziran kampanyası',
'message_body' => 'Merhaba {ad}, kampanyamızdan haberdar olun!',
'sender_header' => 'DOWABA',
'scheduled_at' => '2026-06-18T07:00:00Z',
'batch_size' => 100,
'delay_ms' => 100,
'consent_confirmed' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (201):
{
"data": {
"id": 1,
"status": "draft",
"total_recipients": 118
},
"skipped_no_phone": 2
}
Example response (422):
{
"success": false,
"error": "no_sms_account",
"message": "Aktif bir NetGSM SMS hesabı seçmelisiniz."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanya detayı (güncel sayaçlarla).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sms-campaigns/1"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanya güncelle — yalnız status=draft.
Example request:
curl --request PUT \
"https://dowaba.com/api/sms-campaigns/1" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"message_body\": \"amniihfqcoynlazghdtqt\",
\"sender_header\": \"qxbajwbpilpmufinl\",
\"scheduled_at\": \"2026-08-11T01:53:43\",
\"batch_size\": 11,
\"delay_ms\": 22
}"
const url = new URL(
"https://dowaba.com/api/sms-campaigns/1"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"message_body": "amniihfqcoynlazghdtqt",
"sender_header": "qxbajwbpilpmufinl",
"scheduled_at": "2026-08-11T01:53:43",
"batch_size": 11,
"delay_ms": 22
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'message_body' => 'amniihfqcoynlazghdtqt',
'sender_header' => 'qxbajwbpilpmufinl',
'scheduled_at' => '2026-08-11T01:53:43',
'batch_size' => 11,
'delay_ms' => 22,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanya sil — koşan/duraklatılmış kampanya silinemez (önce iptal).
Example request:
curl --request DELETE \
"https://dowaba.com/api/sms-campaigns/1"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanyayı başlat (draft/paused→running). scheduled_at doluysa o andan itibaren gönderilir.
Example request:
curl --request POST \
"https://dowaba.com/api/sms-campaigns/1/start"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1/start"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1/start';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanyayı duraklat (running→paused). Gönderilenler etkilenmez, yenisi başlamaz.
Example request:
curl --request POST \
"https://dowaba.com/api/sms-campaigns/1/pause"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1/pause"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1/pause';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Duraklatılmış kampanyayı devam ettir (paused→running).
Example request:
curl --request POST \
"https://dowaba.com/api/sms-campaigns/1/resume"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1/resume"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1/resume';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanyayı iptal et — bekleyen alıcılar 'skipped' (cancelled) olur, geri alınamaz.
Example request:
curl --request POST \
"https://dowaba.com/api/sms-campaigns/1/cancel"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1/cancel"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1/cancel';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Gönderilemeyenleri tekrar dene — 'failed' alıcıları pending'e döndürür ve kampanyayı yeniden başlatır. 'skipped' (opt-out/İYS RET) ASLA yeniden gönderilmez. ⚠️ Tekrar gönderim yeni mesaj hakkı tüketir (charge gönderimde düşer).
Example request:
curl --request POST \
"https://dowaba.com/api/sms-campaigns/1/retry-failed"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1/retry-failed"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1/retry-failed';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"data": {
"id": 1,
"status": "running"
},
"requeued": 17
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Alıcı logları (sayfalı, status filtreli).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sms-campaigns/1/recipients?status=failed&page=1"const url = new URL(
"https://dowaba.com/api/sms-campaigns/1/recipients"
);
const params = {
"status": "failed",
"page": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sms-campaigns/1/recipients';
$response = $client->get(
$url,
[
'query' => [
'status' => 'failed',
'page' => '1',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Trendyol Q&A
Trendyol satıcı profillerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/trendyol/profiles"const url = new URL(
"https://dowaba.com/api/trendyol/profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/trendyol/profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni Trendyol profili oluştur (supplier_id + API key).
Example request:
curl --request POST \
"https://dowaba.com/api/trendyol/profiles" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"seller_id\": \"123456\",
\"api_key\": null,
\"api_secret\": null
}"
const url = new URL(
"https://dowaba.com/api/trendyol/profiles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"seller_id": "123456",
"api_key": null,
"api_secret": null
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/trendyol/profiles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'seller_id' => '123456',
'api_key' => null,
'api_secret' => null,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Trendyol profil bilgilerini güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/trendyol/profiles/17" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"seller_id\": \"123456\",
\"is_active\": false
}"
const url = new URL(
"https://dowaba.com/api/trendyol/profiles/17"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"seller_id": "123456",
"is_active": false
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/trendyol/profiles/17';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'seller_id' => '123456',
'is_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Trendyol profilini sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/trendyol/profiles/17"const url = new URL(
"https://dowaba.com/api/trendyol/profiles/17"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/trendyol/profiles/17';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Trendyol'dan soruları çek ve senkronize et.
Example request:
curl --request POST \
"https://dowaba.com/api/trendyol/profiles/17/sync"const url = new URL(
"https://dowaba.com/api/trendyol/profiles/17/sync"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/trendyol/profiles/17/sync';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tüm Trendyol sorularını listele (cevaplanmamış öncelikli).
Example request:
curl --request GET \
--get "https://dowaba.com/api/trendyol/questions"const url = new URL(
"https://dowaba.com/api/trendyol/questions"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/trendyol/questions';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Trendyol sorusuna cevap gönder.
Example request:
curl --request POST \
"https://dowaba.com/api/trendyol/questions/17/answer" \
--header "Content-Type: application/json" \
--data "{
\"text\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/trendyol/questions/17/answer"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"text": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/trendyol/questions/17/answer';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'text' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
TikTok Entegrasyonu
Kullanıcının TikTok profillerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok-profiles"const url = new URL(
"https://dowaba.com/api/tiktok-profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok-profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel olarak TikTok profili oluştur (test/sandbox amaçlı).
Example request:
curl --request POST \
"https://dowaba.com/api/tiktok-profiles" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"open_id\": \"amniihfqcoynlazghdtqt\",
\"username\": \"qxbajwbpilpmufinllwlo\",
\"access_token\": \"auydlsmsjuryvojcybzvr\"
}"
const url = new URL(
"https://dowaba.com/api/tiktok-profiles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"open_id": "amniihfqcoynlazghdtqt",
"username": "qxbajwbpilpmufinllwlo",
"access_token": "auydlsmsjuryvojcybzvr"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok-profiles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'open_id' => 'amniihfqcoynlazghdtqt',
'username' => 'qxbajwbpilpmufinllwlo',
'access_token' => 'auydlsmsjuryvojcybzvr',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Access token ile /v2/user/info çağırarak bağlantıyı test et.
Example request:
curl --request POST \
"https://dowaba.com/api/tiktok-profiles/24/test"const url = new URL(
"https://dowaba.com/api/tiktok-profiles/24/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok-profiles/24/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
TikTok OAuth authorize URL ve client_key.
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok/oauth/config"const url = new URL(
"https://dowaba.com/api/tiktok/oauth/config"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/oauth/config';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki OAuth verisini frontend'e döner (kullanıcı onayı öncesi).
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok/oauth/pending"const url = new URL(
"https://dowaba.com/api/tiktok/oauth/pending"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/oauth/pending';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki OAuth bilgilerini DB'ye yaz (yeni profil veya güncelleme).
Example request:
curl --request POST \
"https://dowaba.com/api/tiktok/oauth/save" \
--header "Content-Type: application/json" \
--data "{
\"cache_key\": \"a1b2c3d4e5f6\"
}"
const url = new URL(
"https://dowaba.com/api/tiktok/oauth/save"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"cache_key": "a1b2c3d4e5f6"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/oauth/save';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'cache_key' => 'a1b2c3d4e5f6',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel sync — TikTok Display API'den video + yorum listesini DB'ye cek. Frontend'deki "Yenile" butonu bunu cagirir. Idempotent: ayni comment_id / video_id tekrar yazilmaz.
Example request:
curl --request POST \
"https://dowaba.com/api/tiktok/profiles/3/sync"const url = new URL(
"https://dowaba.com/api/tiktok/profiles/3/sync"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/profiles/3/sync';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yorum feed (akış) — her video altinda nested yorum tree. Mevcut /tiktok/conversations kullanici-bazli thread listesi donerken (video_id + commenter_open_id), bu endpoint **video-bazli** gosterim icin. Her video kartinin altinda parent_comment_id ile root-reply tree halinde yorumlar gelir. Frontend TiktokView "Akis" sekmesi bunu kullanir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok/feed?profile_id=17&limit=17"const url = new URL(
"https://dowaba.com/api/tiktok/feed"
);
const params = {
"profile_id": "17",
"limit": "17",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/feed';
$response = $client->get(
$url,
[
'query' => [
'profile_id' => '17',
'limit' => '17',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
TikTok DM & Yorumlar
Upload sonrası publish_id ile status sorgu (frontend polling için).
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok/videos/upload-status/v_pub_a1b2c3"const url = new URL(
"https://dowaba.com/api/tiktok/videos/upload-status/v_pub_a1b2c3"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/videos/upload-status/v_pub_a1b2c3';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir TikTok DM konuşmasının mesajlarını getir + okundu işaretle. Opt-in sayfalama: `limit`/`before_id` verilmezse TÜM mesajlar (eski davranış, bare array) döner. Verilirse en yeni `limit` mesaj + `{messages, has_more, oldest_id}` (yukarı kaydırma cursor'ı). Tercih edilen çağrı: `GET tiktok/dm/messages?open_id=..` — open_id standart base64 ("/" içerebilir), path'e gömülünce route ıskalanır (routes/api.php notu, tiktok.md § 14.7).
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok/dm/messages?open_id=u-7f3a2b91c4&limit=50&before_id=12345"const url = new URL(
"https://dowaba.com/api/tiktok/dm/messages"
);
const params = {
"open_id": "u-7f3a2b91c4",
"limit": "50",
"before_id": "12345",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/dm/messages';
$response = $client->get(
$url,
[
'query' => [
'open_id' => 'u-7f3a2b91c4',
'limit' => '50',
'before_id' => '12345',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Sayfalı (limit/before_id verildi)):
{
"messages": [
{
"id": 12300,
"message_id": "xxx",
"direction": "in",
"message": "Merhaba",
"metadata": null,
"created_at": "14:32",
"date": "05.06.2026"
}
],
"has_more": true,
"oldest_id": 12300
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir TikTok DM konuşmasının mesajlarını getir + okundu işaretle. Opt-in sayfalama: `limit`/`before_id` verilmezse TÜM mesajlar (eski davranış, bare array) döner. Verilirse en yeni `limit` mesaj + `{messages, has_more, oldest_id}` (yukarı kaydırma cursor'ı). Tercih edilen çağrı: `GET tiktok/dm/messages?open_id=..` — open_id standart base64 ("/" içerebilir), path'e gömülünce route ıskalanır (routes/api.php notu, tiktok.md § 14.7).
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok/dm/conversations/u-7f3a2b91c4/messages?open_id=u-7f3a2b91c4&limit=50&before_id=12345"const url = new URL(
"https://dowaba.com/api/tiktok/dm/conversations/u-7f3a2b91c4/messages"
);
const params = {
"open_id": "u-7f3a2b91c4",
"limit": "50",
"before_id": "12345",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/dm/conversations/u-7f3a2b91c4/messages';
$response = $client->get(
$url,
[
'query' => [
'open_id' => 'u-7f3a2b91c4',
'limit' => '50',
'before_id' => '12345',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Sayfalı (limit/before_id verildi)):
{
"messages": [
{
"id": 12300,
"message_id": "xxx",
"direction": "in",
"message": "Merhaba",
"metadata": null,
"created_at": "14:32",
"date": "05.06.2026"
}
],
"has_more": true,
"oldest_id": 12300
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
TikTok DM cevabı gönder (Business Messaging API — message.list.send scope). Kurallar: müşterinin son mesajından 48 saat içinde ve pencere başına max 10 business mesajı (TiktokDmService::canSendMore guard'ı). Metin max 6000 karakter. Görsel gönderimi pazar-kısıtlı (TR: text-only).
Example request:
curl --request POST \
"https://dowaba.com/api/tiktok/dm/reply" \
--header "Content-Type: application/json" \
--data "{
\"open_id\": \"open-abc123def456\",
\"message\": \"Merhaba, nasıl yardımcı olabilirim?\",
\"profile_id\": 24
}"
const url = new URL(
"https://dowaba.com/api/tiktok/dm/reply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"open_id": "open-abc123def456",
"message": "Merhaba, nasıl yardımcı olabilirim?",
"profile_id": 24
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok/dm/reply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'open_id' => 'open-abc123def456',
'message' => 'Merhaba, nasıl yardımcı olabilirim?',
'profile_id' => 24,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": {
"id": 15,
"message_id": "msg-xyz",
"direction": "out",
"message": "Merhaba",
"metadata": {
"operator": true
},
"created_at": "2026-07-02T12:00:00.000000Z",
"date": "02.07.2026"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
TikTok Marketing
developers.tiktok.com Login Kit'ten TAMAMEN AYRI bir OAuth ekosistemi. Bu controller business-api.tiktok.com app credential'ı ile gelen kullanıcıları handle eder. Mevcut TiktokOAuthController (Login Kit) değiştirilmez — ek katman.
İki ayrı flow:
-
Advertiser flow (Business Center / Ads Manager sahibi) Authorize URL: https://business-api.tiktok.com/portal/auth?app_id=...&redirect_uri=...&state=... Callback: /api/tiktok-marketing/callback?auth_code=...&state=... Token URL: https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/ Param adı: secret, app_id, auth_code (CamelCase! query'de auth_code, body'de farklı yapı olabilir — endpoint'e ilk POST yapınca netleşir).
-
Account holder flow (creator/business TikTok user) Authorize URL: https://www.tiktok.com/v2/auth/authorize?client_key=...&scope=... Callback: /api/tiktok-marketing/account-callback?code=...&state=... Token URL: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth/token/ (veya open.tiktokapis.com Login Kit benzeri — TikTok docs'a göre netleşecek)
Token saklama: mevcut tiktok_profiles tablosu kullanılır. Marketing API'den
gelen profile'lar ayırt edilebilmesi için future migration tiktok_profiles.source
kolonu eklenebilir ('login_kit' | 'marketing_api'). Şimdilik aynı tablo.
Detay: /Users/aydinacar/Documents/dowaba/tiktok.md § 12.10.
Account holder OAuth başlat — frontend bu endpoint'i çağırır, authorize URL döner.
URL'i popup'ta açar; kullanıcı izin verir → TikTok callback'i tetikler.
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok-marketing/oauth/start-account"const url = new URL(
"https://dowaba.com/api/tiktok-marketing/oauth/start-account"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok-marketing/oauth/start-account';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Advertiser OAuth başlat — Business Center / Ads Manager flow.
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok-marketing/oauth/start-advertiser"const url = new URL(
"https://dowaba.com/api/tiktok-marketing/oauth/start-advertiser"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok-marketing/oauth/start-advertiser';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Advertiser callback — Business Center bağlandığında.
TikTok: redirect_uri?auth_code=...&state=...
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok-marketing/callback"const url = new URL(
"https://dowaba.com/api/tiktok-marketing/callback"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok-marketing/callback';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: unsafe-none
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
Invalid state
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Account holder callback — TikTok creator/business account bağlandığında.
TikTok: redirect_uri?code=...&state=...
Example request:
curl --request GET \
--get "https://dowaba.com/api/tiktok-marketing/account-callback"const url = new URL(
"https://dowaba.com/api/tiktok-marketing/account-callback"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tiktok-marketing/account-callback';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (400):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: unsafe-none
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
Invalid state
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Google Yorumlari Entegrasyonu
Kullanicinin Google Business profillerini listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/google-business-profiles"const url = new URL(
"https://dowaba.com/api/google-business-profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel profil olusturma (admin/debug amaclidir, normalde OAuth flow kullanilir).
Example request:
curl --request POST \
"https://dowaba.com/api/google-business-profiles" \
--header "Content-Type: application/json" \
--data "{
\"google_account_id\": \"vmqeopfuudtdsufvyvddq\",
\"google_location_id\": \"amniihfqcoynlazghdtqt\",
\"business_name\": \"qxbajwbpilpmufinllwlo\"
}"
const url = new URL(
"https://dowaba.com/api/google-business-profiles"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"google_account_id": "vmqeopfuudtdsufvyvddq",
"google_location_id": "amniihfqcoynlazghdtqt",
"business_name": "qxbajwbpilpmufinllwlo"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'google_account_id' => 'vmqeopfuudtdsufvyvddq',
'google_location_id' => 'amniihfqcoynlazghdtqt',
'business_name' => 'qxbajwbpilpmufinllwlo',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek Google Business profilinin detayi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/google-business-profiles/17"const url = new URL(
"https://dowaba.com/api/google-business-profiles/17"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles/17';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profil ayarlarini guncelle (bot toggle / otomatik cevap / FAQ kullan).
Example request:
curl --request PUT \
"https://dowaba.com/api/google-business-profiles/17" \
--header "Content-Type: application/json" \
--data "{
\"is_active\": true,
\"ai_bot_enabled\": true,
\"ai_auto_reply_enabled\": false,
\"reply_prompt_override\": \"Musteriye empati ile yaklas\",
\"use_faq\": true,
\"notification_phone\": \"+90 555 *** ** **\"
}"
const url = new URL(
"https://dowaba.com/api/google-business-profiles/17"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"is_active": true,
"ai_bot_enabled": true,
"ai_auto_reply_enabled": false,
"reply_prompt_override": "Musteriye empati ile yaklas",
"use_faq": true,
"notification_phone": "+90 555 *** ** **"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles/17';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'is_active' => true,
'ai_bot_enabled' => true,
'ai_auto_reply_enabled' => false,
'reply_prompt_override' => 'Musteriye empati ile yaklas',
'use_faq' => true,
'notification_phone' => '+90 555 *** ** **',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profili sil + Pub/Sub'tan unsubscribe + site linklerini temizle.
Example request:
curl --request DELETE \
"https://dowaba.com/api/google-business-profiles/17"const url = new URL(
"https://dowaba.com/api/google-business-profiles/17"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles/17';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profil baglantisini test et - accounts.list ile.
Example request:
curl --request POST \
"https://dowaba.com/api/google-business-profiles/17/test"const url = new URL(
"https://dowaba.com/api/google-business-profiles/17/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles/17/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profili bir siteye bagla (pivot insert).
Example request:
curl --request POST \
"https://dowaba.com/api/google-business-profiles/17/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/google-business-profiles/17/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles/17/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profil baglantisini siteden kaldir (pivot delete).
Example request:
curl --request POST \
"https://dowaba.com/api/google-business-profiles/17/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/google-business-profiles/17/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles/17/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir profile bagli site listesi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/google-business-profiles/17/linked-sites"const url = new URL(
"https://dowaba.com/api/google-business-profiles/17/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business-profiles/17/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel sync - Google'dan yorum listesini cek + DB'ye yaz. "Yenile" butonu bunu cagirir.
Example request:
curl --request POST \
"https://dowaba.com/api/google-business/profiles/3/sync"const url = new URL(
"https://dowaba.com/api/google-business/profiles/3/sync"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business/profiles/3/sync';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-level auto-reply toggle. Profil baz?nda ai_auto_reply_enabled set eder.
Example request:
curl --request POST \
"https://dowaba.com/api/google-business/profiles/3/toggle-auto-reply" \
--header "Content-Type: application/json" \
--data "{
\"enabled\": true
}"
const url = new URL(
"https://dowaba.com/api/google-business/profiles/3/toggle-auto-reply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"enabled": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-business/profiles/3/toggle-auto-reply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'enabled' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yorum listesi getir. ?profile_id=X tek profile, yoksa tum profiller. ?filter=pending|answered|all (default: all) ?search=foo reviewer_name/review_comment icinde arar ?rating=1,2,3,4,5 puan filtresi
Example request:
curl --request GET \
--get "https://dowaba.com/api/google-reviews"const url = new URL(
"https://dowaba.com/api/google-reviews"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-reviews';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek bir yorumun detayi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/google-reviews/42"const url = new URL(
"https://dowaba.com/api/google-reviews/42"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-reviews/42';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yoruma manuel yanit gonder. reply_text doluyse overwrite eder.
Example request:
curl --request POST \
"https://dowaba.com/api/google-reviews/42/reply" \
--header "Content-Type: application/json" \
--data "{
\"text\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/google-reviews/42/reply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"text": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-reviews/42/reply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'text' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yaniti sil (Google'dan ve DB'den).
Example request:
curl --request DELETE \
"https://dowaba.com/api/google-reviews/42/reply"const url = new URL(
"https://dowaba.com/api/google-reviews/42/reply"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-reviews/42/reply';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI'dan tekrar oneri al (draft). Google'a gondermez sadece DB'de suggestion field'i yok - frontend response.suggestion'i gosterir.
Example request:
curl --request POST \
"https://dowaba.com/api/google-reviews/7/regenerate-ai"const url = new URL(
"https://dowaba.com/api/google-reviews/7/regenerate-ai"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-reviews/7/regenerate-ai';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Per-review bot toggle (bu yoruma artik AI cevap yazma).
Example request:
curl --request POST \
"https://dowaba.com/api/google-reviews/12/toggle-bot"const url = new URL(
"https://dowaba.com/api/google-reviews/12/toggle-bot"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-reviews/12/toggle-bot';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bu yorumu blokla (AI cevap vermez, panelde de gosterilmez).
Example request:
curl --request POST \
"https://dowaba.com/api/google-reviews/42/toggle-block"const url = new URL(
"https://dowaba.com/api/google-reviews/42/toggle-block"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/google-reviews/42/toggle-block';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
X Entegrasyonu
X OAuth authorize URL ve client_id. PKCE code_verifier üretilip state ile eşleşik Cache'e konur — callback'te kullanılır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/oauth/config"const url = new URL(
"https://dowaba.com/api/x/oauth/config"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/oauth/config';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki OAuth verisini frontend'e döner (kullanıcı onayı öncesi).
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/oauth/pending"const url = new URL(
"https://dowaba.com/api/x/oauth/pending"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/oauth/pending';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki OAuth bilgilerini DB'ye yaz (yeni profil veya güncelleme).
Example request:
curl --request POST \
"https://dowaba.com/api/x/oauth/save" \
--header "Content-Type: application/json" \
--data "{
\"cache_key\": \"a1b2c3d4e5f6\"
}"
const url = new URL(
"https://dowaba.com/api/x/oauth/save"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"cache_key": "a1b2c3d4e5f6"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/oauth/save';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'cache_key' => 'a1b2c3d4e5f6',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcının erişebildiği X profilleri (bayi cascade dahil).
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/profiles"const url = new URL(
"https://dowaba.com/api/x/profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek profil detay + bağlı siteler.
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/profiles/3"const url = new URL(
"https://dowaba.com/api/x/profiles/3"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Profil davranış flag'lerini güncelle.
Example request:
curl --request PATCH \
"https://dowaba.com/api/x/profiles/3" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"is_active\": false,
\"ai_bot_enabled\": false,
\"mention_auto_reply_enabled\": false,
\"dm_auto_reply_enabled\": false,
\"x_prompt\": \"Sen bir destek asistanısın\",
\"use_faq\": true,
\"notification_phone\": \"mqeopfuudtdsufvyv\"
}"
const url = new URL(
"https://dowaba.com/api/x/profiles/3"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"is_active": false,
"ai_bot_enabled": false,
"mention_auto_reply_enabled": false,
"dm_auto_reply_enabled": false,
"x_prompt": "Sen bir destek asistanısın",
"use_faq": true,
"notification_phone": "mqeopfuudtdsufvyv"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'is_active' => false,
'ai_bot_enabled' => false,
'mention_auto_reply_enabled' => false,
'dm_auto_reply_enabled' => false,
'x_prompt' => 'Sen bir destek asistanısın',
'use_faq' => true,
'notification_phone' => 'mqeopfuudtdsufvyv',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlı X profili sil — token'ı X tarafında revoke et + DB'den soft delete.
Example request:
curl --request DELETE \
"https://dowaba.com/api/x/profiles/12"const url = new URL(
"https://dowaba.com/api/x/profiles/12"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/12';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kanal-bazlı AI bot aç/kapat ("Botu Durdur" / "Botu Başlat"). GENİŞ liste kademesi (xProfileIds — WA/TikTok toggleBot paritesi): bayinin profilini sitesinde kullanan pivot-only müşteri de botu durdurabilmeli (kill-switch). `ai_bot_enabled` tüm X otomatik cevaplarının master AND kapısı (mention + DM + webhook job'ları) — update (DAR) buna gerek bırakmaz.
Example request:
curl --request POST \
"https://dowaba.com/api/x/profiles/3/toggle-bot"const url = new URL(
"https://dowaba.com/api/x/profiles/3/toggle-bot"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3/toggle-bot';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı test et — `whoami` çağrısı yap.
Example request:
curl --request POST \
"https://dowaba.com/api/x/profiles/7/test"const url = new URL(
"https://dowaba.com/api/x/profiles/7/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/7/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel mention senkron tetikle (cron beklemeden).
Example request:
curl --request POST \
"https://dowaba.com/api/x/profiles/3/sync"const url = new URL(
"https://dowaba.com/api/x/profiles/3/sync"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3/sync';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel DM senkron tetikle (Faz 2). Scope dm.read gerekir.
Example request:
curl --request POST \
"https://dowaba.com/api/x/profiles/7/sync-dms"const url = new URL(
"https://dowaba.com/api/x/profiles/7/sync-dms"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/7/sync-dms';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
X profili siteye bağla — site_x_profile pivot.
Example request:
curl --request POST \
"https://dowaba.com/api/x/profiles/3/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/x/profiles/3/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site bağlantısını kopar.
Example request:
curl --request POST \
"https://dowaba.com/api/x/profiles/3/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/x/profiles/3/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bu profile bağlı siteler.
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/profiles/3/linked-sites"const url = new URL(
"https://dowaba.com/api/x/profiles/3/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir profilin tüm mention/DM conversation'larını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/conversations" \
--header "Content-Type: application/json" \
--data "{
\"profile_id\": 17,
\"type\": \"mention\"
}"
const url = new URL(
"https://dowaba.com/api/x/conversations"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"profile_id": 17,
"type": "mention"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/conversations';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'profile_id' => 17,
'type' => 'mention',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir conversation'ın mesajlarını döndür. Opt-in sayfalama: `limit`/`before_id` verilmezse ESKİ yanıt ({conversation, messages, marked_read}, tüm mesajlar). Verilirse aynı yanıta `has_more` + `oldest_id` eklenir, `messages` en yeni `limit` ile sınırlanır (yukarı kaydırma cursor'ı).
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/conversations/42/messages?limit=50&before_id=12345"const url = new URL(
"https://dowaba.com/api/x/conversations/42/messages"
);
const params = {
"limit": "50",
"before_id": "12345",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/conversations/42/messages';
$response = $client->get(
$url,
[
'query' => [
'limit' => '50',
'before_id' => '12345',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Sayfalı (limit/before_id verildi)):
{
"conversation": {
"id": 7
},
"messages": [
{
"id": 12300,
"direction": "in",
"content": "[REDACTED]",
"created_at": "2026-06-05T14:32:00.000000Z"
}
],
"marked_read": 0,
"has_more": true,
"oldest_id": 12300
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Conversation bazında AI bot toggle.
Example request:
curl --request POST \
"https://dowaba.com/api/x/conversations/toggle-bot" \
--header "Content-Type: application/json" \
--data "{
\"conversation_id\": \"42\",
\"bot_active\": true
}"
const url = new URL(
"https://dowaba.com/api/x/conversations/toggle-bot"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"conversation_id": "42",
"bot_active": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/conversations/toggle-bot';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'conversation_id' => '42',
'bot_active' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Conversation engelle / engeli kaldır (reengagement guard).
Example request:
curl --request POST \
"https://dowaba.com/api/x/conversations/toggle-block" \
--header "Content-Type: application/json" \
--data "{
\"conversation_id\": \"42\",
\"is_blocked\": false
}"
const url = new URL(
"https://dowaba.com/api/x/conversations/toggle-block"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"conversation_id": "42",
"is_blocked": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/conversations/toggle-block';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'conversation_id' => '42',
'is_blocked' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir mention'a yanıt gönder (manuel veya AI önerisi).
Example request:
curl --request POST \
"https://dowaba.com/api/x/reply" \
--header "Content-Type: application/json" \
--data "{
\"conversation_id\": \"42\",
\"text\": \"mqeopfuudtdsufvyvddqa\",
\"in_reply_to_x_message_id\": \"1234567890123456789\"
}"
const url = new URL(
"https://dowaba.com/api/x/reply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"conversation_id": "42",
"text": "mqeopfuudtdsufvyvddqa",
"in_reply_to_x_message_id": "1234567890123456789"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/reply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'conversation_id' => '42',
'text' => 'mqeopfuudtdsufvyvddqa',
'in_reply_to_x_message_id' => '1234567890123456789',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
X Entegrasyonu (Faz 3)
Account Activity API webhook'unu bu profile için aç (kullanıcı subscription'ı). Webhook URL: https://dowaba.com/api/x/webhook
Example request:
curl --request POST \
"https://dowaba.com/api/x/profiles/3/webhook/subscribe"const url = new URL(
"https://dowaba.com/api/x/profiles/3/webhook/subscribe"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3/webhook/subscribe';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Account Activity API webhook subscription iptal.
Example request:
curl --request DELETE \
"https://dowaba.com/api/x/profiles/3/webhook"const url = new URL(
"https://dowaba.com/api/x/profiles/3/webhook"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/profiles/3/webhook';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
X Paket Sistemi
Paket katalog — frontend modal "Paket Yükle" listesi. 3 sabit paket (starter/pro/enterprise) + fiyat/mesaj/badge bilgisi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/packages/catalog"const url = new URL(
"https://dowaba.com/api/x/packages/catalog"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/packages/catalog';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site için tüm paket geçmişi (active + exhausted + expired + refunded). Admin/müşteri audit için.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/x/packages"const url = new URL(
"https://dowaba.com/api/sites/1/x/packages"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/x/packages';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site için kota özeti — kalan/kullanılan + aktif paketler. Gauge component için kullanılır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/x/packages/summary"const url = new URL(
"https://dowaba.com/api/sites/1/x/packages/summary"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/x/packages/summary';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PayTR iframe token üret + PaytrPayment pending kaydı oluştur. Bayi-müşteri akışı (authz cascade): - `auth.id == site.user_id` → owner kendi alıyor, sold_by_reseller_id=null - `auth.id != site.user_id` → bayi/superadmin başkası için alıyor - Bayi: site.user.reseller_id == auth.id check, sold_by_reseller_id=auth.id - Superadmin (role bypass): sold_by_reseller_id=null (manuel admin)
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/x/packages/checkout" \
--header "Content-Type: application/json" \
--data "{
\"package_key\": \"enterprise\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/x/packages/checkout"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"package_key": "enterprise"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/x/packages/checkout';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'package_key' => 'enterprise',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
X Webhook (Account Activity API)
Tek endpoint — method'a göre CRC veya event handle eder.
Example request:
curl --request GET \
--get "https://dowaba.com/api/x/webhook"const url = new URL(
"https://dowaba.com/api/x/webhook"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/webhook';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (405):
Show headers
cache-control: no-cache, private
content-type: application/json
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Method not allowed"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek endpoint — method'a göre CRC veya event handle eder.
Example request:
curl --request POST \
"https://dowaba.com/api/x/webhook"const url = new URL(
"https://dowaba.com/api/x/webhook"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/x/webhook';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Shopify Entegrasyonu
Shopify Billing API entegrasyonu — App Store §1.2.1 zorunlu uyumu.
Akış:
- Frontend (embedded admin) /create-charge POST → appSubscriptionCreate mutation → confirmationUrl döner → frontend window.top.location'a yönlendirir
- Merchant Shopify'da "Activate" → Shopify returnUrl'e redirect (charge_id query param)
- /return GET → appSubscriptionQuery ile state oku → ACTIVE ise SubscriptionService::activateSubscription → connection.subscription_id güncelle → admin dashboard'a redirect
Webhook tarafı: ShopifyWebhookController::appSubscriptionsUpdate (status change ACTIVE/CANCELLED/EXPIRED/FROZEN/DECLINED → DB güncelle).
Authorize URL üret + CSRF state cache'le.
Example request:
curl --request POST \
"https://dowaba.com/api/shopify/oauth/start" \
--header "Content-Type: application/json" \
--data "{
\"shop\": \"dowabademo\",
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/shopify/oauth/start"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"shop": "dowabademo",
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopify/oauth/start';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'shop' => 'dowabademo',
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın bağlı Shopify mağazalarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/shopify/connections"const url = new URL(
"https://dowaba.com/api/shopify/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopify/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Connection'ı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/shopify/connections/17"const url = new URL(
"https://dowaba.com/api/shopify/connections/17"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopify/connections/17';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST /api/shopify/billing/create-charge — DEPRECATED
Bu endpoint Shopify Manual Pricing (Billing API) modu için yazılmıştı.
2026-05-28: Shopify App Pricing'e geçtik — appSubscriptionCreate mutation
artık reject ediliyor ("Managed Pricing Apps cannot use the Billing API").
Yeni akış: Frontend doğrudan connection.pricing_page_url'e yönlendirir,
merchant Shopify-hosted page'de plan seçer + onaylar, callback bizim
/api/shopify/billing/return'e gelir (eski) veya webhook ile subscription
aktivasyonu yapılır.
Bu endpoint legacy frontend'leri (cache'li tarayıcılar) için 410 Gone
- pricing_page_url ile yönlendirme önerir.
Example request:
curl --request POST \
"https://dowaba.com/api/shopify/billing/create-charge" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/shopify/billing/create-charge"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopify/billing/create-charge';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /api/shopify/billing/return?site_id=X&charge_id=Y
Shopify confirmation sonrası kullanıcı buraya yönlenir. Charge state ACTIVE → SubscriptionService::activateSubscription → admin'e redirect.
Example request:
curl --request GET \
--get "https://dowaba.com/api/shopify/billing/return"const url = new URL(
"https://dowaba.com/api/shopify/billing/return"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopify/billing/return';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (302):
Show headers
cache-control: no-cache, private
location: https://dowaba.com/admin/?shopify_billing_error=missing_site_id
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="refresh" content="0;url='https://dowaba.com/admin/?shopify_billing_error=missing_site_id'" />
<title>Redirecting to https://dowaba.com/admin/?shopify_billing_error=missing_site_id</title>
</head>
<body>
Redirecting to <a href="https://dowaba.com/admin/?shopify_billing_error=missing_site_id">https://dowaba.com/admin/?shopify_billing_error=missing_site_id</a>.
</body>
</html>
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İkas Entegrasyonu
Authorize URL üret + CSRF state cache'le.
Example request:
curl --request POST \
"https://dowaba.com/api/ikas/oauth/start" \
--header "Content-Type: application/json" \
--data "{
\"store\": \"dowabademo\",
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ikas/oauth/start"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"store": "dowabademo",
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ikas/oauth/start';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'store' => 'dowabademo',
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Private App "Hızlı Bağlan" — Partner onayı BEKLEMEDEN. Kullanıcı İkas panelinden (Uygulamalar → Özel Uygulamalar) aldığı client_id + client_secret ile bağlanır. Dowaba client_credentials grant ile token üretir; credentials connection'da encrypted saklanır (token süresi dolunca otomatik yeniden üretilir — refresh_token gerekmez).
Example request:
curl --request POST \
"https://dowaba.com/api/ikas/connections/quick-connect" \
--header "Content-Type: application/json" \
--data "{
\"store\": \"dowabademo\",
\"site_id\": 17,
\"client_id\": \"consequatur\",
\"client_secret\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/ikas/connections/quick-connect"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"store": "dowabademo",
"site_id": 17,
"client_id": "consequatur",
"client_secret": "consequatur"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ikas/connections/quick-connect';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'store' => 'dowabademo',
'site_id' => 17,
'client_id' => 'consequatur',
'client_secret' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) İkas connection'larını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ikas/connections"const url = new URL(
"https://dowaba.com/api/ikas/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ikas/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Connection'ı sil — site'ın İkas bağlantısı kesilir.
Example request:
curl --request DELETE \
"https://dowaba.com/api/ikas/connections/1"const url = new URL(
"https://dowaba.com/api/ikas/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ikas/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Shopier Entegrasyonu
PAT ile bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/shopier/connections" \
--header "Content-Type: application/json" \
--data "{
\"access_token\": \"consequatur\",
\"site_id\": 17,
\"store_name\": \"Butik Moda\"
}"
const url = new URL(
"https://dowaba.com/api/shopier/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"access_token": "consequatur",
"site_id": 17,
"store_name": "Butik Moda"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopier/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'access_token' => 'consequatur',
'site_id' => 17,
'store_name' => 'Butik Moda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) Shopier bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/shopier/connections"const url = new URL(
"https://dowaba.com/api/shopier/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopier/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/shopier/connections/1"const url = new URL(
"https://dowaba.com/api/shopier/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopier/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/shopier/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/shopier/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopier/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 85
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> Shopier REST proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/shopier/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/shopier/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/shopier/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 84
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İdeaSoft Entegrasyonu
Authorize URL üret + CSRF state cache'le.
Example request:
curl --request POST \
"https://dowaba.com/api/ideasoft/oauth/start" \
--header "Content-Type: application/json" \
--data "{
\"store\": \"magaza\",
\"site_id\": 17,
\"client_id\": \"consequatur\",
\"client_secret\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/ideasoft/oauth/start"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"store": "magaza",
"site_id": 17,
"client_id": "consequatur",
"client_secret": "consequatur"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ideasoft/oauth/start';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'store' => 'magaza',
'site_id' => 17,
'client_id' => 'consequatur',
'client_secret' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıları listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ideasoft/connections"const url = new URL(
"https://dowaba.com/api/ideasoft/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ideasoft/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/ideasoft/connections/1"const url = new URL(
"https://dowaba.com/api/ideasoft/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ideasoft/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
OAuth callback (PUBLIC — İdeaSoft redirect eder, popup postMessage).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ideasoft/oauth/callback"const url = new URL(
"https://dowaba.com/api/ideasoft/oauth/callback"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ideasoft/oauth/callback';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
<!DOCTYPE html>
<html lang="tr"><head><meta charset="utf-8"><title>İdeaSoft bağlantı hatası</title>
<style>
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:#fbfaf7;
display:flex;align-items:center;justify-content:center;height:100vh;margin:0;color:#1a1a2e}
.card{background:#fff;padding:40px;border-radius:16px;box-shadow:0 8px 24px rgba(0,0,0,0.08);text-align:center;max-width:400px}
.icon{width:64px;height:64px;border-radius:50%;background:#ef444422;color:#ef4444;
display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-size:32px;font-weight:700}
h1{font-size:20px;margin:0 0 8px} p{color:#525873;font-size:14px;margin:0}
</style></head>
<body>
<div class="card"><div class="icon">✗</div><h1>İdeaSoft bağlantı hatası</h1><p>İdeaSoft izin vermedi</p></div>
<script>
try { if (window.opener) window.opener.postMessage({source:'ideasoft_oauth', payload:{"error":"İdeaSoft izin vermedi"}}, '*'); } catch(e){}
setTimeout(function(){ try{window.close();}catch(e){} }, 2500);
</script>
</body></html>
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ideasoft/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/ideasoft/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ideasoft/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 81
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> İdeaSoft REST proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ideasoft/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/ideasoft/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ideasoft/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 80
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
T-Soft Entegrasyonu
Web servis kullanıcısıyla bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/tsoft/connections" \
--header "Content-Type: application/json" \
--data "{
\"domain\": \"magaza.com\",
\"username\": \"consequatur\",
\"password\": \"O[2UZ5ij-e\\/dl4m{o,\",
\"site_id\": 17,
\"store_name\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/tsoft/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"domain": "magaza.com",
"username": "consequatur",
"password": "O[2UZ5ij-e\/dl4m{o,",
"site_id": 17,
"store_name": "consequatur"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tsoft/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'domain' => 'magaza.com',
'username' => 'consequatur',
'password' => 'O[2UZ5ij-e/dl4m{o,',
'site_id' => 17,
'store_name' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıları listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/tsoft/connections"const url = new URL(
"https://dowaba.com/api/tsoft/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tsoft/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/tsoft/connections/1"const url = new URL(
"https://dowaba.com/api/tsoft/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tsoft/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/tsoft/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/tsoft/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tsoft/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 83
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> T-Soft rest1 proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/tsoft/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/tsoft/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/tsoft/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 82
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ticimax Entegrasyonu
WS Yetki Kodu ile bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/ticimax/connections" \
--header "Content-Type: application/json" \
--data "{
\"domain\": \"magaza.com\",
\"uye_kodu\": \"consequatur\",
\"site_id\": 17,
\"store_name\": \"Butik Moda\"
}"
const url = new URL(
"https://dowaba.com/api/ticimax/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"domain": "magaza.com",
"uye_kodu": "consequatur",
"site_id": 17,
"store_name": "Butik Moda"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ticimax/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'domain' => 'magaza.com',
'uye_kodu' => 'consequatur',
'site_id' => 17,
'store_name' => 'Butik Moda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) Ticimax bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ticimax/connections"const url = new URL(
"https://dowaba.com/api/ticimax/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ticimax/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/ticimax/connections/1"const url = new URL(
"https://dowaba.com/api/ticimax/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ticimax/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ticimax/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/ticimax/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ticimax/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 67
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> Ticimax SOAP proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ticimax/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/ticimax/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ticimax/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 66
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
N11 Entegrasyonu
appkey + appsecret ile bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/n11/connections" \
--header "Content-Type: application/json" \
--data "{
\"app_key\": \"consequatur\",
\"app_secret\": \"consequatur\",
\"site_id\": 17,
\"store_name\": \"Butik Moda\"
}"
const url = new URL(
"https://dowaba.com/api/n11/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"app_key": "consequatur",
"app_secret": "consequatur",
"site_id": 17,
"store_name": "Butik Moda"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/n11/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'app_key' => 'consequatur',
'app_secret' => 'consequatur',
'site_id' => 17,
'store_name' => 'Butik Moda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) N11 bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/n11/connections"const url = new URL(
"https://dowaba.com/api/n11/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/n11/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/n11/connections/1"const url = new URL(
"https://dowaba.com/api/n11/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/n11/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/n11/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/n11/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/n11/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 79
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> N11 REST proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/n11/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/n11/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/n11/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 78
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hepsiburada Entegrasyonu
Merchant API kimlik bilgileri ile bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/hepsiburada/connections" \
--header "Content-Type: application/json" \
--data "{
\"merchant_id\": \"consequatur\",
\"username\": \"consequatur\",
\"secret_key\": \"consequatur\",
\"site_id\": 17,
\"store_name\": \"Butik Moda\"
}"
const url = new URL(
"https://dowaba.com/api/hepsiburada/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"merchant_id": "consequatur",
"username": "consequatur",
"secret_key": "consequatur",
"site_id": 17,
"store_name": "Butik Moda"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/hepsiburada/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'merchant_id' => 'consequatur',
'username' => 'consequatur',
'secret_key' => 'consequatur',
'site_id' => 17,
'store_name' => 'Butik Moda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) Hepsiburada bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/hepsiburada/connections"const url = new URL(
"https://dowaba.com/api/hepsiburada/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/hepsiburada/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/hepsiburada/connections/1"const url = new URL(
"https://dowaba.com/api/hepsiburada/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/hepsiburada/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/hepsiburada/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/hepsiburada/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/hepsiburada/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 77
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> Hepsiburada Merchant API proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/hepsiburada/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/hepsiburada/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/hepsiburada/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 76
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Pazarama Entegrasyonu
API Key + API Secret ile bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/pazarama/connections" \
--header "Content-Type: application/json" \
--data "{
\"apikey\": \"consequatur\",
\"apisecret\": \"consequatur\",
\"site_id\": 17,
\"store_name\": \"Butik Moda\"
}"
const url = new URL(
"https://dowaba.com/api/pazarama/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"apikey": "consequatur",
"apisecret": "consequatur",
"site_id": 17,
"store_name": "Butik Moda"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/pazarama/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'apikey' => 'consequatur',
'apisecret' => 'consequatur',
'site_id' => 17,
'store_name' => 'Butik Moda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) Pazarama bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/pazarama/connections"const url = new URL(
"https://dowaba.com/api/pazarama/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/pazarama/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/pazarama/connections/1"const url = new URL(
"https://dowaba.com/api/pazarama/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/pazarama/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/pazarama/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/pazarama/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/pazarama/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 75
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> Pazarama satıcı REST proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/pazarama/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/pazarama/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/pazarama/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 74
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Çiçeksepeti Entegrasyonu
API anahtarı ile bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/ciceksepeti/connections" \
--header "Content-Type: application/json" \
--data "{
\"api_key\": \"consequatur\",
\"site_id\": 17,
\"store_name\": \"Çiçek Dünyası\",
\"supplier_id\": \"12345\"
}"
const url = new URL(
"https://dowaba.com/api/ciceksepeti/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"api_key": "consequatur",
"site_id": 17,
"store_name": "Çiçek Dünyası",
"supplier_id": "12345"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ciceksepeti/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'api_key' => 'consequatur',
'site_id' => 17,
'store_name' => 'Çiçek Dünyası',
'supplier_id' => '12345',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) Çiçeksepeti bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ciceksepeti/connections"const url = new URL(
"https://dowaba.com/api/ciceksepeti/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ciceksepeti/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/ciceksepeti/connections/1"const url = new URL(
"https://dowaba.com/api/ciceksepeti/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ciceksepeti/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ciceksepeti/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/ciceksepeti/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ciceksepeti/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 73
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> Çiçeksepeti REST proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ciceksepeti/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/ciceksepeti/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ciceksepeti/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 72
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
BigCommerce Entegrasyonu
Store hash + Access Token ile bağlan. Rehber: BigCommerce panelinde Settings → Store-level API accounts → Create API account. OAuth scope olarak "Products: read-only" + "Orders: read-only" seçmeniz yeterli (DoWaba yalnız okur, sipariş oluşturmaz). Store hash, API path'inde görünür: https://api.bigcommerce.com/stores/{store_hash}/v3/
Example request:
curl --request POST \
"https://dowaba.com/api/bigcommerce/connections" \
--header "Content-Type: application/json" \
--data "{
\"store_hash\": \"abc123xyz\",
\"access_token\": \"consequatur\",
\"site_id\": 17,
\"store_name\": \"Butik Moda\"
}"
const url = new URL(
"https://dowaba.com/api/bigcommerce/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"store_hash": "abc123xyz",
"access_token": "consequatur",
"site_id": 17,
"store_name": "Butik Moda"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/bigcommerce/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'store_hash' => 'abc123xyz',
'access_token' => 'consequatur',
'site_id' => 17,
'store_name' => 'Butik Moda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) BigCommerce bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/bigcommerce/connections"const url = new URL(
"https://dowaba.com/api/bigcommerce/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/bigcommerce/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/bigcommerce/connections/1"const url = new URL(
"https://dowaba.com/api/bigcommerce/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/bigcommerce/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/bigcommerce/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/bigcommerce/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/bigcommerce/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 71
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> BigCommerce REST proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/bigcommerce/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/bigcommerce/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/bigcommerce/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 70
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Wix Entegrasyonu
API Key ile bağlan.
Example request:
curl --request POST \
"https://dowaba.com/api/wix/connections" \
--header "Content-Type: application/json" \
--data "{
\"api_key\": \"consequatur\",
\"wix_site_id\": \"12345678-1234-1234-1234-123456789012\",
\"site_id\": 17,
\"store_name\": \"Butik Moda\"
}"
const url = new URL(
"https://dowaba.com/api/wix/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"api_key": "consequatur",
"wix_site_id": "12345678-1234-1234-1234-123456789012",
"site_id": 17,
"store_name": "Butik Moda"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/wix/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'api_key' => 'consequatur',
'wix_site_id' => '12345678-1234-1234-1234-123456789012',
'site_id' => 17,
'store_name' => 'Butik Moda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aktif user'ın (ve bayilik kapsamındaki) Wix bağlantılarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/wix/connections"const url = new URL(
"https://dowaba.com/api/wix/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/wix/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/wix/connections/1"const url = new URL(
"https://dowaba.com/api/wix/connections/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/wix/connections/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/wix/manifest/consequatur"const url = new URL(
"https://dowaba.com/api/wix/manifest/consequatur"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/wix/manifest/consequatur';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 69
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI function call -> Wix REST proxy.
Example request:
curl --request GET \
--get "https://dowaba.com/api/wix/proxy/consequatur/product_search"const url = new URL(
"https://dowaba.com/api/wix/proxy/consequatur/product_search"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/wix/proxy/consequatur/product_search';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 68
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Entegra Entegrasyonu
Kullanıcının erişebildiği site'lar için tüm Entegra bağlantıları.
Example request:
curl --request GET \
--get "https://dowaba.com/api/entegra/connections"const url = new URL(
"https://dowaba.com/api/entegra/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Belirli site için bağlantı detayı (yoksa null).
Example request:
curl --request GET \
--get "https://dowaba.com/api/entegra/connections/site/17"const url = new URL(
"https://dowaba.com/api/entegra/connections/site/17"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/connections/site/17';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni Entegra bağlantısı oluştur + login dene.
Example request:
curl --request POST \
"https://dowaba.com/api/entegra/connections" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"email\": \"qkunze@example.com\",
\"password\": \"O[2UZ5ij-e\\/dl4m{o,\",
\"account_name\": \"Entegra Ana Hesap\",
\"base_url\": \"http:\\/\\/kunze.biz\\/iste-laborum-eius-est-dolor.html\"
}"
const url = new URL(
"https://dowaba.com/api/entegra/connections"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"email": "qkunze@example.com",
"password": "O[2UZ5ij-e\/dl4m{o,",
"account_name": "Entegra Ana Hesap",
"base_url": "http:\/\/kunze.biz\/iste-laborum-eius-est-dolor.html"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/connections';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'email' => 'qkunze@example.com',
'password' => 'O[2UZ5ij-e/dl4m{o,',
'account_name' => 'Entegra Ana Hesap',
'base_url' => 'http://kunze.biz/iste-laborum-eius-est-dolor.html',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mevcut bağlantı için login'i yeniden dene (parola değişti vs.).
Example request:
curl --request POST \
"https://dowaba.com/api/entegra/connections/17/reauth"const url = new URL(
"https://dowaba.com/api/entegra/connections/17/reauth"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/connections/17/reauth';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantı durumu — token canlı mı, refresh gerekiyor mu.
Example request:
curl --request GET \
--get "https://dowaba.com/api/entegra/connections/17/status"const url = new URL(
"https://dowaba.com/api/entegra/connections/17/status"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/connections/17/status';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlantıyı sil — site'ın Entegra entegrasyonunu kapatır.
Example request:
curl --request DELETE \
"https://dowaba.com/api/entegra/connections/17"const url = new URL(
"https://dowaba.com/api/entegra/connections/17"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/connections/17';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bundle Import manifest JSON (PUBLIC — auth yok, token URL'de).
Example request:
curl --request GET \
--get "https://dowaba.com/api/entegra/manifest/mtk_a1b2c3d4"const url = new URL(
"https://dowaba.com/api/entegra/manifest/mtk_a1b2c3d4"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/manifest/mtk_a1b2c3d4';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 5
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Manifest bulunamadı veya bağlantı pasif."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Entegra API proxy — AI fonksiyonlarından gelen çağrıları Entegra'ya yönlendirir.
Example request:
curl --request GET \
--get "https://dowaba.com/api/entegra/proxy/mtk_a1b2c3d4/health"const url = new URL(
"https://dowaba.com/api/entegra/proxy/mtk_a1b2c3d4/health"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/entegra/proxy/mtk_a1b2c3d4/health';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 4
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
{
"error": "Bağlantı bulunamadı veya iptal edilmiş."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sipariş Bildirimleri
Site'ın sipariş bildirimi yapılandırması. Bağlı e-ticaret mağazalarını, her biri için ayarı + olay kurallarını, şablon gönderebilen WhatsApp profillerini ve son 20 gönderim kaydını döner.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/order-notifications"const url = new URL(
"https://dowaba.com/api/sites/1/order-notifications"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/order-notifications';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"events": [
"order_created",
"shipped",
"delivered",
"cancelled",
"refunded"
],
"allowed_categories": [
"UTILITY"
],
"platforms": [
{
"connection_type": "ikas",
"connection_id": 3,
"store_name": "dowabademo",
"setting": {
"id": 1,
"is_active": true,
"delivery_mode": "webhook",
"whatsapp_profile_id": 7,
"consent_confirmed": true,
"webhook_url": "https://dowaba.com/api/ecommerce/ikas/order-webhook/xxx",
"webhook_registered_at": "2027-03-30T10:00:00.000000Z",
"webhook_last_error": null,
"rules": [
{
"event": "shipped",
"is_enabled": true,
"template_name": "kargo_bilgisi",
"template_language": "tr",
"template_category": "UTILITY",
"variable_mappings": {
"1": {
"field": "order_number"
}
},
"button_vars": null
}
]
}
}
],
"whatsapp_profiles": [
{
"id": 7,
"name": "Mağaza",
"display_phone_number": "+90555…",
"template_capable": true
}
],
"logs": [
{
"id": 12,
"event": "shipped",
"status": "sent",
"skip_reason": null,
"phone": "+90 555 *** ** **"
}
]
}
Example response (403):
{
"message": "Bu siteye erişiminiz yok."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ayarı oluştur/güncelle (aktiflik, WhatsApp profili, izin beyanı). Aktifleştirme İKİ ŞART ister: şablon gönderebilen bir profil seçili olmalı ve alıcı izni beyanı (`consent_confirmed`) verilmiş olmalı — ScheduledJob kampanya paritesi. Aktifleştirme başarılıysa webhook platformda otomatik kurulur.
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/order-notifications" \
--header "Content-Type: application/json" \
--data "{
\"connection_type\": \"ikas\",
\"is_active\": true,
\"whatsapp_profile_id\": 7,
\"consent_confirmed\": true
}"
const url = new URL(
"https://dowaba.com/api/sites/1/order-notifications"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"connection_type": "ikas",
"is_active": true,
"whatsapp_profile_id": 7,
"consent_confirmed": true
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/order-notifications';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'connection_type' => 'ikas',
'is_active' => true,
'whatsapp_profile_id' => 7,
'consent_confirmed' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"setting": {
"id": 1,
"is_active": true,
"delivery_mode": "webhook"
}
}
Example response (422):
{
"message": "Aktifleştirmek için alıcı izni beyanı gerekli."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Olay kurallarını toplu kaydet (olay başına tek şablon). KATEGORİ KİLİDİ: her açık kuralın şablonu Meta'dan sorgulanır; kategori UTILITY değilse (ya da okunamıyorsa) kayıt 422 ile REDDEDİLİR. Sipariş bildirimi ETK 6563 m.6/1 istisnasına dayanır ve tanıtım içeren şablon istisnayı düşürür.
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/order-notifications/rules" \
--header "Content-Type: application/json" \
--data "{
\"connection_type\": \"ikas\",
\"rules\": [
{
\"event\": \"shipped\",
\"is_enabled\": true,
\"template_name\": \"kargo_bilgisi\",
\"template_language\": \"tr\",
\"variable_mappings\": [],
\"button_vars\": []
}
]
}"
const url = new URL(
"https://dowaba.com/api/sites/1/order-notifications/rules"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"connection_type": "ikas",
"rules": [
{
"event": "shipped",
"is_enabled": true,
"template_name": "kargo_bilgisi",
"template_language": "tr",
"variable_mappings": [],
"button_vars": []
}
]
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/order-notifications/rules';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'connection_type' => 'ikas',
'rules' => [
[
'event' => 'shipped',
'is_enabled' => true,
'template_name' => 'kargo_bilgisi',
'template_language' => 'tr',
'variable_mappings' => [],
'button_vars' => [],
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"rules": [
{
"event": "shipped",
"template_category": "UTILITY"
}
]
}
Example response (422):
{
"message": "\"kampanya\" şablonu MARKETING kategorisinde — sipariş bildiriminde kullanılamaz."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Test gönderimi — seçilen olayın şablonunu tek numaraya yollar. Deftere (order_notification_logs) YAZILMAZ ama kotadan düşer ve izin/kategori kapılarının hepsinden geçer. `throttle:order-notif-test` (5/dk) ADLI limiter'a tabidir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/order-notifications/test" \
--header "Content-Type: application/json" \
--data "{
\"connection_type\": \"ikas\",
\"event\": \"shipped\",
\"phone\": \"05551234567\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/order-notifications/test"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"connection_type": "ikas",
"event": "shipped",
"phone": "05551234567"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/order-notifications/test';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'connection_type' => 'ikas',
'event' => 'shipped',
'phone' => '05551234567',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Example response (422):
{
"success": false,
"reason": "category_locked",
"message": "Şablon kategorisi MARKETING…"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Webhook'u platformda yeniden kur (self-servis onarım). Saatlik `order-notifications:reconcile-webhooks` cron'u bunu zaten yapar; bu uç kullanıcının beklemeden denemesi içindir.
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/order-notifications/register" \
--header "Content-Type: application/json" \
--data "{
\"connection_type\": \"ikas\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/order-notifications/register"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"connection_type": "ikas"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/order-notifications/register';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'connection_type' => 'ikas',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"webhook_registered_at": "2027-03-30T10:00:00.000000Z"
}
Example response (422):
{
"success": false,
"message": "ikas webhook kurulamadı: …"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
YouTube (Paylaşım)
YouTube OAuth authorize URL + client_id.
Example request:
curl --request GET \
--get "https://dowaba.com/api/youtube/oauth/config"const url = new URL(
"https://dowaba.com/api/youtube/oauth/config"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/youtube/oauth/config';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki kanal bilgisini frontend'e döner (kullanıcı onayı öncesi).
Example request:
curl --request GET \
--get "https://dowaba.com/api/youtube/oauth/pending"const url = new URL(
"https://dowaba.com/api/youtube/oauth/pending"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/youtube/oauth/pending';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki OAuth bilgilerini DB'ye yaz (yeni kanal veya güncelleme).
Example request:
curl --request POST \
"https://dowaba.com/api/youtube/oauth/save" \
--header "Content-Type: application/json" \
--data "{
\"cache_key\": \"a1b2c3d4e5f6\"
}"
const url = new URL(
"https://dowaba.com/api/youtube/oauth/save"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"cache_key": "a1b2c3d4e5f6"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/youtube/oauth/save';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'cache_key' => 'a1b2c3d4e5f6',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcının (cascade) YouTube kanallarını listele.
Example request:
curl --request GET \
--get "https://dowaba.com/api/youtube-profiles"const url = new URL(
"https://dowaba.com/api/youtube-profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/youtube-profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
channels.list ile bağlantıyı test et.
Example request:
curl --request POST \
"https://dowaba.com/api/youtube-profiles/1562/test"const url = new URL(
"https://dowaba.com/api/youtube-profiles/1562/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/youtube-profiles/1562/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
YouTube OAuth callback (PUBLIC — Google bu URL'e redirect eder). Code → token + kanal bilgisi → 5dk Cache → popup postMessage.
Example request:
curl --request GET \
--get "https://dowaba.com/api/youtube/callback"const url = new URL(
"https://dowaba.com/api/youtube/callback"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/youtube/callback';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: unsafe-none
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
<!DOCTYPE html>
<html>
<head><title>YouTube Bağlantısı</title></head>
<body>
<p>İşlem tamamlanıyor...</p>
<script>
(function() {
var oauthData = {"error":"İzin verilmedi"};
var bcSent = false;
var openerSent = false;
try {
if (typeof BroadcastChannel === 'function') {
var bc = new BroadcastChannel('youtube_oauth');
bc.postMessage({ type: 'youtube_oauth', data: oauthData });
bc.close();
bcSent = true;
}
} catch (e) { /* unsupported */ }
var opener = null;
try { opener = window.opener; } catch (e) { /* COOP */ }
if (opener) {
try {
opener.postMessage({ type: 'youtube_oauth', data: oauthData }, '*');
openerSent = true;
} catch (e) { /* cross-origin */ }
}
if (bcSent || openerSent) {
document.body.innerHTML = '<div style="font-family:system-ui,-apple-system,sans-serif;text-align:center;padding:60px 20px;color:#0f172a"><div style="font-size:48px;margin-bottom:16px">✓</div><h2 style="margin:0 0 8px;font-size:20px">YouTube bağlandı</h2><p style="color:#64748b;margin:0">Bu pencereyi kapatabilirsiniz.</p></div>';
setTimeout(function(){ try { window.close(); } catch (e) {} }, 600);
return;
}
window.location.href = "\/admin\/#\/sites?oauth_error=%C4%B0zin+verilmedi";
})();
</script>
</body>
</html>
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Facebook Sayfa (Paylaşım)
FB Sayfa OAuth authorize URL.
Example request:
curl --request GET \
--get "https://dowaba.com/api/facebook-page/oauth/config"const url = new URL(
"https://dowaba.com/api/facebook-page/oauth/config"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/facebook-page/oauth/config';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki yönetilen sayfa listesini döner (kullanıcı hangisini bağlayacak seçer).
Example request:
curl --request GET \
--get "https://dowaba.com/api/facebook-page/oauth/pending"const url = new URL(
"https://dowaba.com/api/facebook-page/oauth/pending"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/facebook-page/oauth/pending';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Seçilen sayfa(ları) DB'ye bağla.
Example request:
curl --request POST \
"https://dowaba.com/api/facebook-page/oauth/save" \
--header "Content-Type: application/json" \
--data "{
\"cache_key\": \"a1b2c3d4e5f6\",
\"page_id\": \"1234567890\"
}"
const url = new URL(
"https://dowaba.com/api/facebook-page/oauth/save"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"cache_key": "a1b2c3d4e5f6",
"page_id": "1234567890"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/facebook-page/oauth/save';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'cache_key' => 'a1b2c3d4e5f6',
'page_id' => '1234567890',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
OAuth sonucundaki TÜM yönetilen sayfaları tek seferde yayına aç (upsert). "Mevcut sayfaları getir" akışı: kullanıcı pick yapmaz, hepsi publish-ready olur.
Example request:
curl --request POST \
"https://dowaba.com/api/facebook-page/oauth/save-all" \
--header "Content-Type: application/json" \
--data "{
\"cache_key\": \"a1b2c3d4e5f6\"
}"
const url = new URL(
"https://dowaba.com/api/facebook-page/oauth/save-all"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"cache_key": "a1b2c3d4e5f6"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/facebook-page/oauth/save-all';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'cache_key' => 'a1b2c3d4e5f6',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
FB OAuth callback (PUBLIC). Code → user token → sayfa listesi → 5dk Cache → popup.
Example request:
curl --request GET \
--get "https://dowaba.com/api/facebook-page/callback"const url = new URL(
"https://dowaba.com/api/facebook-page/callback"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/facebook-page/callback';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: unsafe-none
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
<!DOCTYPE html>
<html><head><title>Facebook Sayfa Bağlantısı</title></head>
<body><p>İşlem tamamlanıyor...</p>
<script>
(function() {
var oauthData = {"error":"İzin verilmedi"};
var bcSent = false, openerSent = false;
try { if (typeof BroadcastChannel === 'function') { var bc = new BroadcastChannel('facebook_page_oauth'); bc.postMessage({ type: 'facebook_page_oauth', data: oauthData }); bc.close(); bcSent = true; } } catch (e) {}
var opener = null; try { opener = window.opener; } catch (e) {}
if (opener) { try { opener.postMessage({ type: 'facebook_page_oauth', data: oauthData }, '*'); openerSent = true; } catch (e) {} }
if (bcSent || openerSent) {
document.body.innerHTML = '<div style="font-family:system-ui,-apple-system,sans-serif;text-align:center;padding:60px 20px;color:#0f172a"><div style="font-size:48px;margin-bottom:16px">✓</div><h2 style="margin:0 0 8px;font-size:20px">Facebook bağlandı</h2><p style="color:#64748b;margin:0">Bu pencereyi kapatabilirsiniz.</p></div>';
setTimeout(function(){ try { window.close(); } catch (e) {} }, 600);
return;
}
window.location.href = "\/admin\/#\/sites?oauth_error=%C4%B0zin+verilmedi";
})();
</script></body></html>
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Threads (Paylaşım)
GET api/threads-profiles
Example request:
curl --request GET \
--get "https://dowaba.com/api/threads-profiles"const url = new URL(
"https://dowaba.com/api/threads-profiles"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/threads-profiles/{id}
Example request:
curl --request GET \
--get "https://dowaba.com/api/threads-profiles/1562"const url = new URL(
"https://dowaba.com/api/threads-profiles/1562"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles/1562';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PATCH api/threads-profiles/{id}
Example request:
curl --request PATCH \
"https://dowaba.com/api/threads-profiles/1562" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"is_active\": false
}"
const url = new URL(
"https://dowaba.com/api/threads-profiles/1562"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"is_active": false
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles/1562';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'is_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE api/threads-profiles/{id}
Example request:
curl --request DELETE \
"https://dowaba.com/api/threads-profiles/1562"const url = new URL(
"https://dowaba.com/api/threads-profiles/1562"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles/1562';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
/me profil sorgusuyla token ve bağlantıyı test eder.
Example request:
curl --request POST \
"https://dowaba.com/api/threads-profiles/1562/test"const url = new URL(
"https://dowaba.com/api/threads-profiles/1562/test"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles/1562/test';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/threads-profiles/{id}/link-site
Example request:
curl --request POST \
"https://dowaba.com/api/threads-profiles/1562/link-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/threads-profiles/1562/link-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles/1562/link-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/threads-profiles/{id}/unlink-site
Example request:
curl --request POST \
"https://dowaba.com/api/threads-profiles/1562/unlink-site" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/threads-profiles/1562/unlink-site"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles/1562/unlink-site';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/threads-profiles/{id}/linked-sites
Example request:
curl --request GET \
--get "https://dowaba.com/api/threads-profiles/1562/linked-sites"const url = new URL(
"https://dowaba.com/api/threads-profiles/1562/linked-sites"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/threads-profiles/1562/linked-sites';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Paylaşım
Bu sayfanın Lead Ads lead'lerini ŞİMDİ senkronla (manuel tetik). Beta kapısı + leads_sync_enabled şart. leads:sync-facebook --profile=id inline çalışır, sonuç satırını döner.
Example request:
curl --request POST \
"https://dowaba.com/api/facebook-page-profiles/1562/sync-leads"const url = new URL(
"https://dowaba.com/api/facebook-page-profiles/1562/sync-leads"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/facebook-page-profiles/1562/sync-leads';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Paylaşım (Sosyal Yayın)
Kullanıcının (cascade) sosyal gönderilerini listele.
Yeni gönderi oluştur (taslak/zamanlanmış) + kanal hedefleri.
AI ile başlık + açıklamayı (caption) güzelleştir. Gemini key cascade + kredi (kendi→owner→bayi→parent→platform+kredi EN SON) SocialCaptionService üzerinden.
Gönderiyi yayınla — queue job (zamanlanmışsa cron bekler).
Birleşik yorum listesi (tüm kanallar). ?channel= + ?status= filtre.
Yoruma cevap yaz (kanal API'sine gönderir).
Yorum moderasyonu: hide | hold | show | delete.
Kullanıcının yorum oto-cevap kurallarını listele.
Paylaşım Kuyrukları
Çok kanallı içerikleri günlük saat slotlarında tüketen, döngüsel ve idempotent yayın kuyrukları. Panel oturumu veya Geliştirici → API Anahtarları ekranında üretilen Sanctum PAT ile aynı auth:sanctum endpoint'i kullanılabilir.
Medya türü ve siteye bağlı hesaplara göre kanal uyumluluğunu döndürür.
Kuyrukları cursor pagination ile listeler.
Kuyruk, içerikler, kanal metinleri, kurallar ve SSS kayıtlarını tek istekte oluşturur.
GET api/social-publish-queues/{socialPublishQueue_id}
PATCH api/social-publish-queues/{socialPublishQueue_id}
DELETE api/social-publish-queues/{socialPublishQueue_id}
POST api/social-publish-queues/{socialPublishQueue_id}/pause
POST api/social-publish-queues/{socialPublishQueue_id}/resume
Mevcut kuyruğa tek transaction'da en fazla 500 içerik ekler.
PATCH api/social-publish-queue-items/{socialPublishQueueItem_id}
DELETE api/social-publish-queue-items/{socialPublishQueueItem_id}
Reklam Yönetimi
Reklam hesabı OAuth authorize URL (site bazlı).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/oauth/config" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/oauth/config"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/oauth/config';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cache'deki reklam hesabı + sayfa/IG listesini döner (kullanıcı seçer).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/oauth/pending"const url = new URL(
"https://dowaba.com/api/ads/oauth/pending"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/oauth/pending';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kullanıcının erişebildiği reklam hesapları (cascade — bayi müşteri sitelerini de görür).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/accounts"const url = new URL(
"https://dowaba.com/api/ads/accounts"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/accounts';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bağlı hesabı düzenlemek için mevcut token ile reklam hesabı + Sayfa/IG listesini YENİDEN getirir (yeni Facebook OAuth GEREKMEDEN). Seçim, mevcut `save()` reconnect kontratıyla kaydedilir (withTrashed updateOrCreate). Token expired / izin çekilmişse `needs_reauth=true` döner → panel OAuth popup akışına düşer (seçili değerler korunur).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/accounts/3/edit-options"const url = new URL(
"https://dowaba.com/api/ads/accounts/3/edit-options"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/accounts/3/edit-options';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Seçilen reklam hesabını (+ Sayfa/IG) siteye bağla. Reconnect: withTrashed updateOrCreate.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/accounts" \
--header "Content-Type: application/json" \
--data "{
\"cache_key\": \"a1b2c3\",
\"site_id\": 5,
\"ad_account_id\": \"act_123\",
\"page_id\": \"consequatur\",
\"instagram_account_id\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/ads/accounts"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"cache_key": "a1b2c3",
"site_id": 5,
"ad_account_id": "act_123",
"page_id": "consequatur",
"instagram_account_id": "consequatur"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/accounts';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'cache_key' => 'a1b2c3',
'site_id' => 5,
'ad_account_id' => 'act_123',
'page_id' => 'consequatur',
'instagram_account_id' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Reklam hesabı bağlantısını kaldır (soft delete — kampanya geçmişi korunur).
Example request:
curl --request DELETE \
"https://dowaba.com/api/ads/accounts/1562"const url = new URL(
"https://dowaba.com/api/ads/accounts/1562"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/accounts/1562';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin reklam hesabındaki Meta Pixel'lerini listele (kurulum kodu + son ateşleme).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/pixels" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/pixels"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/pixels';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni Meta Pixel oluştur (reklam hesabı altında). Kurulum kodu kopyalanabilir.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/pixels" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"name\": \"Dowaba Sitem Pixel\"
}"
const url = new URL(
"https://dowaba.com/api/ads/pixels"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"name": "Dowaba Sitem Pixel"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/pixels';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'name' => 'Dowaba Sitem Pixel',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Katalog ekranı durumu: bağlı mı + (varsa) işletme adı + Meta Commerce Manager deep-link. Katalog LİSTELEMEZ/oluşturmaz (catalog_management yok) — yönetim Meta'da yapılır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/catalogs" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5
}"
const url = new URL(
"https://dowaba.com/api/ads/catalogs"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/catalogs';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Seçilebilen görsel modelleri (Nano Banana 2 / Pro / klasik).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/studio/models"const url = new URL(
"https://dowaba.com/api/ads/studio/models"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/studio/models';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sohbet tabanlı prompt geliştirme (gemini-pro-latest). Müşterinin dilinde yanıt; hazır olunca İngilizce prompt + özet (onaya). Referans görsel pro'ya GÖNDERİLMEZ (yalnız üretimde nano banana'ya).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/studio/chat" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"messages\": [
{
\"role\": \"user\",
\"text\": \"yaz indirimi afişi\"
}
],
\"has_reference\": true
}"
const url = new URL(
"https://dowaba.com/api/ads/studio/chat"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"messages": [
{
"role": "user",
"text": "yaz indirimi afişi"
}
],
"has_reference": true
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/studio/chat';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['stdClass'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('stdClass')),
],
null,
[
'stdClass' => [
'role' => [
'user',
],
'text' => [
'yaz indirimi afişi',
],
],
],
[
'site_id' => 5,
'messages' => [
$o[0],
],
'has_reference' => true,
],
[]
),
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Brief'ten reklam görseli üret (nano banana). Kredi cüzdanından düşülür.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/studio/generate" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"prompt\": \"Yaz indirimi, turuncu, modern afiş\",
\"model\": \"gemini-3.1-flash-image\",
\"aspect_ratio\": \"1:1\",
\"image_size\": \"1K\",
\"title\": \"mqeopfuudtdsufvyvddqa\"
}"
const url = new URL(
"https://dowaba.com/api/ads/studio/generate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"prompt": "Yaz indirimi, turuncu, modern afiş",
"model": "gemini-3.1-flash-image",
"aspect_ratio": "1:1",
"image_size": "1K",
"title": "mqeopfuudtdsufvyvddqa"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/studio/generate';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'prompt' => 'Yaz indirimi, turuncu, modern afiş',
'model' => 'gemini-3.1-flash-image',
'aspect_ratio' => '1:1',
'image_size' => '1K',
'title' => 'mqeopfuudtdsufvyvddqa',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Onaylanan İngilizce prompt + seçili reklam türleri → her tekil oran için görsel (nano banana). Referans görsel (varsa) nano banana'ya geçer (marka rengi/fontu; yeni kompozisyon).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/studio/generate-set" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"prompt\": \"A modern summer-sale poster...\",
\"ad_types\": [
\"feed_square\",
\"story_reels\"
],
\"model\": \"gemini-3.1-flash-image\",
\"reference\": \"data:image\\/png;base64,iVBOR...\",
\"title\": \"mniihfqcoynlazghdtqtq\"
}"
const url = new URL(
"https://dowaba.com/api/ads/studio/generate-set"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"prompt": "A modern summer-sale poster...",
"ad_types": [
"feed_square",
"story_reels"
],
"model": "gemini-3.1-flash-image",
"reference": "data:image\/png;base64,iVBOR...",
"title": "mniihfqcoynlazghdtqtq"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/studio/generate-set';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'prompt' => 'A modern summer-sale poster...',
'ad_types' => [
'feed_square',
'story_reels',
],
'model' => 'gemini-3.1-flash-image',
'reference' => 'data:image/png;base64,iVBOR...',
'title' => 'mniihfqcoynlazghdtqtq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site'in üretilmiş görsel kütüphanesi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/studio/creatives" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/studio/creatives"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/studio/creatives';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Üretilen görseli sil.
Example request:
curl --request DELETE \
"https://dowaba.com/api/ads/studio/creatives/1562"const url = new URL(
"https://dowaba.com/api/ads/studio/creatives/1562"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/studio/creatives/1562';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site'in kampanyaları (lokal mirror).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/campaigns" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/campaigns"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/campaigns';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Meta'daki MEVCUT kampanya/adset/reklamları içe aktar (lokal mirror'a senkronla).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/campaigns/sync" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/campaigns/sync"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/campaigns/sync';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hibrit "Yeni Kampanya": Meta'da kampanya kabuğu (objective + PAUSED) açar; frontend onu Meta Ads Manager'da açıp kreatif/bütçe/hedefleme/yayını orada tamamlatır (deep-link).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/campaigns/shell" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"objective\": \"consequatur\",
\"name\": \"mqeopfuudtdsufvyvddqa\"
}"
const url = new URL(
"https://dowaba.com/api/ads/campaigns/shell"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"objective": "consequatur",
"name": "mqeopfuudtdsufvyvddqa"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/campaigns/shell';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'objective' => 'consequatur',
'name' => 'mqeopfuudtdsufvyvddqa',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sihirbazdan kampanya yayınla (PAUSED oluşturulur, kullanıcı sonra başlatır).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/campaigns" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"name\": \"Yaz İndirimi\",
\"objective\": \"OUTCOME_TRAFFIC\",
\"daily_budget\": 50,
\"creative\": {
\"creative_id\": 17
},
\"targeting\": [],
\"optimization_goal\": \"consequatur\",
\"billing_event\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/ads/campaigns"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"name": "Yaz İndirimi",
"objective": "OUTCOME_TRAFFIC",
"daily_budget": 50,
"creative": {
"creative_id": 17
},
"targeting": [],
"optimization_goal": "consequatur",
"billing_event": "consequatur"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/campaigns';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'name' => 'Yaz İndirimi',
'objective' => 'OUTCOME_TRAFFIC',
'daily_budget' => 50.0,
'creative' => [
'creative_id' => 17,
],
'targeting' => [],
'optimization_goal' => 'consequatur',
'billing_event' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kampanyayı başlat/durdur (ACTIVE/PAUSED).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/campaigns/1562/status" \
--header "Content-Type: application/json" \
--data "{
\"status\": \"ACTIVE\"
}"
const url = new URL(
"https://dowaba.com/api/ads/campaigns/1562/status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "ACTIVE"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/campaigns/1562/status';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'status' => 'ACTIVE',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mevcut kampanyanın GÜNLÜK bütçesini değiştir. CBO/kampanya-bütçeli ise kampanya node'una, değilse (tek) reklam setine yazar. Birden çok set-bütçeli kampanya panelden düzenlenemez.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/campaigns/1562/budget" \
--header "Content-Type: application/json" \
--data "{
\"daily_budget\": 75
}"
const url = new URL(
"https://dowaba.com/api/ads/campaigns/1562/budget"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"daily_budget": 75
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/campaigns/1562/budget';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'daily_budget' => 75.0,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site'in oluşturulmuş hedef kitleleri.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/audiences" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/audiences"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/audiences';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Hedef kitle oluştur — "kendi takipçilerim" (IG/Sayfa engagement) veya lookalike.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/audiences" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"type\": \"ig_engagement\",
\"name\": \"mqeopfuudtdsufvyvddqa\",
\"origin_audience_id\": \"consequatur\",
\"ratio\": 11613.31890586,
\"country\": \"op\"
}"
const url = new URL(
"https://dowaba.com/api/ads/audiences"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"type": "ig_engagement",
"name": "mqeopfuudtdsufvyvddqa",
"origin_audience_id": "consequatur",
"ratio": 11613.31890586,
"country": "op"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/audiences';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'type' => 'ig_engagement',
'name' => 'mqeopfuudtdsufvyvddqa',
'origin_audience_id' => 'consequatur',
'ratio' => 11613.31890586,
'country' => 'op',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
İlgi alanı arama (targeting interests).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/interests" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"q\": \"mqeopfuudtdsufvyvddqamniihfqcoynlazghdtqtqxbajwbpilpmufinllwloauydlsmsjury\"
}"
const url = new URL(
"https://dowaba.com/api/ads/interests"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"q": "mqeopfuudtdsufvyvddqamniihfqcoynlazghdtqtqxbajwbpilpmufinllwloauydlsmsjury"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/interests';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'q' => 'mqeopfuudtdsufvyvddqamniihfqcoynlazghdtqtqxbajwbpilpmufinllwloauydlsmsjury',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site performans özeti: 7g toplam + günlük seri + placement/region breakdown.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/insights" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"days\": 13,
\"status\": \"active\",
\"ad_ids\": [
\"qeopfuudtdsufvyvddqam\"
]
}"
const url = new URL(
"https://dowaba.com/api/ads/insights"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"days": 13,
"status": "active",
"ad_ids": [
"qeopfuudtdsufvyvddqam"
]
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/insights';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'days' => 13,
'status' => 'active',
'ad_ids' => [
'qeopfuudtdsufvyvddqam',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site'ın reklamları (kampanyaya göre gruplanabilir) — performans reklam seçici için. Yalnız aynadaki (mevcut) reklamlar; remote_ad_id + çalışma durumu + kampanya bilgisi.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/insights/ads" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5
}"
const url = new URL(
"https://dowaba.com/api/ads/insights/ads"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/insights/ads';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir bölgeyi (il) hedeflemeden ÇIKAR — ülke (TR) hedefi korunur, il excluded_geo_locations'a eklenir (81 ili tek tek listelemeye gerek yok; sonuç aynı: o ile reklam gösterilmez). Hesabın tüm ad set'lerine uygulanır (read-modify-write). Aksiyon loglanır.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/insights/exclude-region" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"region\": \"Istanbul Province\"
}"
const url = new URL(
"https://dowaba.com/api/ads/insights/exclude-region"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"region": "Istanbul Province"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/insights/exclude-region';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'region' => 'Istanbul Province',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
BİRDEN ÇOK bölgeyi tek seferde hedeflemeden ÇIKAR (toplu seçim). Tek geçişte tüm ad set'lere uygulanır → N×(get+update) yerine az API çağrısı. Eşleşmeyen iller `unmatched`'te döner.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/insights/exclude-regions" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"regions\": [
\"Karaman Province\",
\"Hatay Province\"
]
}"
const url = new URL(
"https://dowaba.com/api/ads/insights/exclude-regions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"regions": [
"Karaman Province",
"Hatay Province"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/insights/exclude-regions';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'regions' => [
'Karaman Province',
'Hatay Province',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Son üretilmiş AI analiz raporu (cache; yoksa null).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/advisor" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"status\": \"paused\",
\"ad_ids\": [
\"mqeopfuudtdsufvyvddqa\"
]
}"
const url = new URL(
"https://dowaba.com/api/ads/advisor"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"status": "paused",
"ad_ids": [
"mqeopfuudtdsufvyvddqa"
]
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/advisor';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'status' => 'paused',
'ad_ids' => [
'mqeopfuudtdsufvyvddqa',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni AI analizi üret (Pro model — kredi düşer). KULLANICI TETİKLER.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/advisor" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"status\": \"active\",
\"ad_ids\": [
\"mqeopfuudtdsufvyvddqa\"
]
}"
const url = new URL(
"https://dowaba.com/api/ads/advisor"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"status": "active",
"ad_ids": [
"mqeopfuudtdsufvyvddqa"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/advisor';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'status' => 'active',
'ad_ids' => [
'mqeopfuudtdsufvyvddqa',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI önerisindeki GÜVENLİ aksiyonu (bölge/yerleşim dışla) tek-tıkla uygula. Sadece geri-alınabilir dışlama aksiyonları; bütçe/kreatif/kitle önerileri panel'de uygulanamaz.
Example request:
curl --request POST \
"https://dowaba.com/api/ads/advisor/apply" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"type\": \"exclude_region\",
\"region\": \"Istanbul Province\",
\"publisher_platform\": \"instagram\",
\"position\": \"reels\"
}"
const url = new URL(
"https://dowaba.com/api/ads/advisor/apply"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"type": "exclude_region",
"region": "Istanbul Province",
"publisher_platform": "instagram",
"position": "reels"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/advisor/apply';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'type' => 'exclude_region',
'region' => 'Istanbul Province',
'publisher_platform' => 'instagram',
'position' => 'reels',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin bekleyen Meta önerileri. Listelenen `new` satırlar `seen`'e çekilir (rozet söner).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/recommendations?site_id=5" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/recommendations"
);
const params = {
"site_id": "5",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/recommendations';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'site_id' => '5',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"recommendations": [
{
"id": 1,
"level": "ad",
"object_remote_id": "1200123",
"rec_type": "BUDGET_INCREASE",
"title": null,
"body": "[REDACTED]",
"severity": null,
"status": "new",
"received_at": "2026-07-31T10:12:00+00:00"
}
],
"pending_count": 3
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir öneriyi yoksay (listeden düşer, geri gelmez).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/recommendations/12/dismiss"const url = new URL(
"https://dowaba.com/api/ads/recommendations/12/dismiss"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/recommendations/12/dismiss';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site'in sızıntı koruması kuralı (yoksa config default'larıyla virtual).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/guard" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/ads/guard"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/guard';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sızıntı koruması kuralını oluştur/güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/ads/guard" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"is_enabled\": true,
\"mode\": \"hybrid\",
\"auto_pause_min_spend_usd\": 45,
\"recommend_cpr_multiplier\": 56,
\"learning_grace_days\": 5,
\"pause_placements\": true,
\"pause_regions\": true,
\"pause_interests\": true
}"
const url = new URL(
"https://dowaba.com/api/ads/guard"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"is_enabled": true,
"mode": "hybrid",
"auto_pause_min_spend_usd": 45,
"recommend_cpr_multiplier": 56,
"learning_grace_days": 5,
"pause_placements": true,
"pause_regions": true,
"pause_interests": true
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/guard';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'is_enabled' => true,
'mode' => 'hybrid',
'auto_pause_min_spend_usd' => 45,
'recommend_cpr_multiplier' => 56,
'learning_grace_days' => 5,
'pause_placements' => true,
'pause_regions' => true,
'pause_interests' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sızıntı koruması aksiyonları (öneri + uygulanan + tasarruf logu).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/guard/actions" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"status\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/ads/guard/actions"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"status": "consequatur"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/guard/actions';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'status' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bekleyen bir öneriyi uygula (placement de-target / ad pause).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/guard/actions/1562/apply"const url = new URL(
"https://dowaba.com/api/ads/guard/actions/1562/apply"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/guard/actions/1562/apply';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Öneriyi reddet (uygulama).
Example request:
curl --request POST \
"https://dowaba.com/api/ads/guard/actions/1562/dismiss"const url = new URL(
"https://dowaba.com/api/ads/guard/actions/1562/dismiss"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/guard/actions/1562/dismiss';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
OAuth callback (PUBLIC). code → long token → reklam hesabı + sayfa/IG listesi → cache → popup.
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/oauth/callback"const url = new URL(
"https://dowaba.com/api/ads/oauth/callback"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/oauth/callback';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: unsafe-none
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
<!DOCTYPE html>
<html><head><title>Reklam Hesabı Bağlantısı</title></head>
<body><p>İşlem tamamlanıyor...</p>
<script>
(function() {
var d = {"error":"İzin verilmedi"};
var sent = false;
try { if (typeof BroadcastChannel === 'function') { var bc = new BroadcastChannel('meta_ads_oauth'); bc.postMessage({ type: 'meta_ads_oauth', data: d }); bc.close(); sent = true; } } catch (e) {}
var opener = null; try { opener = window.opener; } catch (e) {}
if (opener) { try { opener.postMessage({ type: 'meta_ads_oauth', data: d }, '*'); sent = true; } catch (e) {} }
if (sent) {
document.body.innerHTML = '<div style="font-family:system-ui,sans-serif;text-align:center;padding:60px 20px;color:#0f172a"><div style="font-size:48px;margin-bottom:16px">✓</div><h2 style="margin:0 0 8px;font-size:20px">Bağlandı</h2><p style="color:#64748b;margin:0">Bu pencereyi kapatabilirsiniz.</p></div>';
setTimeout(function(){ try { window.close(); } catch (e) {} }, 600);
return;
}
window.location.href = "\/admin\/#\/ads\/accounts?ads_oauth_error=%C4%B0zin+verilmedi";
})();
</script></body></html>
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Üretilen görseli servis et (imzalı URL — auth signature ile).
Example request:
curl --request GET \
--get "https://dowaba.com/api/ads/creatives/1562/image"const url = new URL(
"https://dowaba.com/api/ads/creatives/1562/image"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/ads/creatives/1562/image';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (403):
Show headers
cache-control: no-cache, private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: geolocation=(), microphone=(self), camera=(self), payment=(), usb=(), magnetometer=(), gyroscope=()
cross-origin-opener-policy: same-origin-allow-popups
content-security-policy-report-only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://accounts.google.com https://appleid.cdn-apple.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: blob: https:; font-src 'self' data: https://fonts.gstatic.com; media-src 'self' blob:; connect-src 'self' wss://dowaba.com wss://*.dowaba.com https://generativelanguage.googleapis.com; frame-src 'self' https://accounts.google.com https://appleid.apple.com https://member.netgsm.com.tr; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; worker-src 'self' blob:
content-language: en
vary: Accept-Language, Cookie, Authorization, Origin
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Forbidden</title>
<style>
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}code{font-family:monospace,monospace;font-size:1em}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}code{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-xl{max-width:36rem}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wider{letter-spacing:.05em}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-300 { --text-opacity: 1; color: #e2e8f0; color: rgba(226,232,240,var(--text-opacity)) }}
</style>
<style>
body {
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
</style>
</head>
<body class="antialiased">
<div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center sm:pt-0" role="main">
<div class="max-w-xl mx-auto sm:px-6 lg:px-8">
<div class="flex items-center pt-8 sm:justify-start sm:pt-0">
<h1 class="px-4 text-lg dark:text-gray-300 text-gray-700 border-r border-gray-400 tracking-wider">
403 </h1>
<div class="ml-4 text-lg dark:text-gray-300 text-gray-700 uppercase tracking-wider">
Invalid signature. </div>
</div>
</div>
</div>
</body>
</html>
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Müşteri Talepleri (Callback)
Tüm callback taleplerini listele (tüm kanallar birleşik). ID prefix kanala göre: WhatsApp 'w-', Voice 'v-', Widget 'cs-'.
Example request:
curl --request GET \
--get "https://dowaba.com/api/callback-requests"const url = new URL(
"https://dowaba.com/api/callback-requests"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir site için atama seçenekleri: atanabilir takım üyeleri (açık talep yükleriyle) + otomatik dağıtım ayarının mevcut durumu.
Example request:
curl --request GET \
--get "https://dowaba.com/api/callback-requests/assignment-options?site_id=5" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 73
}"
const url = new URL(
"https://dowaba.com/api/callback-requests/assignment-options"
);
const params = {
"site_id": "5",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 73
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests/assignment-options';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'query' => [
'site_id' => '5',
],
'json' => [
'site_id' => 73,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"auto_assign": false,
"users": [
{
"id": 17,
"name": "Ali Veli",
"email": "a**@example.com",
"role": "agent",
"open_count": 3
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Otomatik dağıtımı aç/kapat. Açıkken yeni müşteri talepleri, sitenin takım üyeleri (agent) arasında en az açık talebi olana otomatik atanır.
Example request:
curl --request PUT \
"https://dowaba.com/api/callback-requests/auto-assign" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"enabled\": true
}"
const url = new URL(
"https://dowaba.com/api/callback-requests/auto-assign"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"enabled": true
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests/auto-assign';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'enabled' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"auto_assign": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
AI özet dilini ayarla (kullanıcıya özel). Müşteri Talepleri başlığındaki seçiciden çağrılır. Özet, site sahibinin bu ayarındaki dilde üretilir (default: TR).
Example request:
curl --request PUT \
"https://dowaba.com/api/callback-requests/summary-locale" \
--header "Content-Type: application/json" \
--data "{
\"locale\": \"tr\"
}"
const url = new URL(
"https://dowaba.com/api/callback-requests/summary-locale"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"locale": "tr"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests/summary-locale';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'locale' => 'tr',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"summary_locale": "tr"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin özet şeması + kullanılabilir sektör şablonları.
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/output-schemas?target=callback_summary"const url = new URL(
"https://dowaba.com/api/sites/1/output-schemas"
);
const params = {
"target": "callback_summary",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/output-schemas';
$response = $client->get(
$url,
[
'query' => [
'target' => 'callback_summary',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"schema": null,
"templates": [
{
"id": 1,
"name": "Oto Galeri",
"description": "...",
"fields": [
{
"key": "arac_marka",
"label": "Araç Markası",
"type": "string"
}
]
}
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin özet şemasını oluştur/güncelle (hedef başına tek şema, upsert).
Example request:
curl --request PUT \
"https://dowaba.com/api/sites/1/output-schemas" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"Oto Galeri\",
\"origin_schema_id\": 1,
\"is_active\": true,
\"fields\": [
{
\"key\": \"arac_marka\",
\"label\": \"Araç Markası\",
\"type\": \"string\",
\"hint\": \"Aracın markası\"
}
],
\"target\": \"callback_summary\"
}"
const url = new URL(
"https://dowaba.com/api/sites/1/output-schemas"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "Oto Galeri",
"origin_schema_id": 1,
"is_active": true,
"fields": [
{
"key": "arac_marka",
"label": "Araç Markası",
"type": "string",
"hint": "Aracın markası"
}
],
"target": "callback_summary"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/output-schemas';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['stdClass'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('stdClass')),
],
null,
[
'stdClass' => [
'key' => [
'arac_marka',
],
'label' => [
'Araç Markası',
],
'type' => [
'string',
],
'hint' => [
'Aracın markası',
],
],
],
[
'name' => 'Oto Galeri',
'origin_schema_id' => 1,
'is_active' => true,
'fields' => [
$o[0],
],
'target' => 'callback_summary',
],
[]
),
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"id": 12,
"name": "Oto Galeri",
"fields": []
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin özet şemasını sil — özet üretimi düz markdown davranışına döner.
Example request:
curl --request DELETE \
"https://dowaba.com/api/sites/1/output-schemas?target=callback_summary"const url = new URL(
"https://dowaba.com/api/sites/1/output-schemas"
);
const params = {
"target": "callback_summary",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/output-schemas';
$response = $client->delete(
$url,
[
'query' => [
'target' => 'callback_summary',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir müşteri talebinin TAM konuşma geçmişini döndür (panel "Tüm konuşmayı gör" akordeonu için on-demand). Liste hafif kalsın diye index'te değil ayrı endpoint.
Example request:
curl --request GET \
--get "https://dowaba.com/api/callback-requests/w-42/conversation"const url = new URL(
"https://dowaba.com/api/callback-requests/w-42/conversation"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests/w-42/conversation';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"direction": "in",
"message": "Merhaba",
"created_at": "2026-06-21T10:00:00Z"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Callback talebinin durumunu güncelle (pending/contacted/no_answer/postponed/resolved).
Example request:
curl --request PUT \
"https://dowaba.com/api/callback-requests/w-42/status" \
--header "Content-Type: application/json" \
--data "{
\"status\": \"resolved\"
}"
const url = new URL(
"https://dowaba.com/api/callback-requests/w-42/status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "resolved"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests/w-42/status';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'status' => 'resolved',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Callback talebine not ekle/güncelle.
Example request:
curl --request PUT \
"https://dowaba.com/api/callback-requests/w-42/note" \
--header "Content-Type: application/json" \
--data "{
\"note\": \"vmqeopfuudtdsufvyvddq\"
}"
const url = new URL(
"https://dowaba.com/api/callback-requests/w-42/note"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"note": "vmqeopfuudtdsufvyvddq"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests/w-42/note';
$response = $client->put(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'note' => 'vmqeopfuudtdsufvyvddq',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Talebi bir takım üyesine ata (veya atamayı kaldır). Atanabilir kullanıcılar: site sahibi + site takım üyeleri (assignment-options endpoint'inden listelenir). Atanan kullanıcıya panel/mobil bildirimi gider.
Example request:
curl --request POST \
"https://dowaba.com/api/callback-requests/w-42/assign" \
--header "Content-Type: application/json" \
--data "{
\"user_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/callback-requests/w-42/assign"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"user_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/callback-requests/w-42/assign';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'user_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Talep atandı",
"assigned_user_id": 17
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Potansiyel Müşteriler (Leads)
Potansiyel Müşteriler (CRM) — Lead yönetimi. module:leads.
Scope: messagingSiteIds() — bayiye bağlı MÜŞTERİ sitelerinin lead'leri kapalı (mesaj+rehber
gizlilik kilidiyle tutarlı; bayi yalnız KENDİ sitelerinin lead'lerini görür/düzenler/siler). store hem manuel hem kaynaktan
(öneri/talep/lead ads) ekleme — source/source_type/source_id ile. Tek otorite plan:
~/.claude/plans/biz-buraya-ba-lad-k-ya-cheeky-mist.md.
Pipeline listesi + pano sayaçları. TÜM süzgeçler opsiyoneldir; hiçbiri verilmezse yanıt eskisiyle aynıdır. `stage_counts` ve `stats` her zaman site kapsamının TAMAMINI anlatır (süzgeçten bağımsız pano toplamı — sütun başlıkları küçülüp büyümesin). Yeni süzgeçlerden en az biri etkinse yanıta EK olarak `stage_counts_filtered` + `stats_filtered` gelir: aynı alanlar (`stage_values` DAHİL — panel süzgeç varsa sütun başlığındaki toplam değeri oradan okur), süzgeçli evren. Süzgeçli agregatta `stage` süzgeci uygulanmaz — yoksa seçili sütun dışındaki her sayaç 0 görünürdü. İki BAĞIMSIZ tarih aralığı: `created_*` (kartın oluşturulması) ve `activity_*` (`last_interaction_at` — kartın son hareketi). Preset verilirse from/to yok sayılır; `custom` preset'inde (veya preset yokken) from/to kullanılır. Sınırlar KAPSAYICIDIR (gün başı → gün sonu), duvar saati Europe/Istanbul, hafta PAZARTESİ başlar. `no_followup=1` = "son söz müşteride" (PR2 aktivite sinyalleri) → global `lead_activity_signals` bayrağı kapalıysa 503. `awaiting_days_min` aynı sinyalleri okur ama bayrak SORMAZ: sinyal yazılmamışsa süzgeç boş döner (hata değil). `no_followup` istendiğinde yanıt `stats.activity_synced_at_max` (ve kökte aynı değer) taşır: sinyalleri en son doğrulayan koşumun zamanı.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads?site_id=12&stage=nitelikli&source=inbox&channel=whatsapp&assigned_user_id=17&search=ali&created_preset=this_week&created_from=2026-08-01&created_to=2026-08-09&activity_preset=last_7&activity_from=2026-08-01&activity_to=2026-08-09&no_followup=1&awaiting_days_min=3&per_page=50" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/leads"
);
const params = {
"site_id": "12",
"stage": "nitelikli",
"source": "inbox",
"channel": "whatsapp",
"assigned_user_id": "17",
"search": "ali",
"created_preset": "this_week",
"created_from": "2026-08-01",
"created_to": "2026-08-09",
"activity_preset": "last_7",
"activity_from": "2026-08-01",
"activity_to": "2026-08-09",
"no_followup": "1",
"awaiting_days_min": "3",
"per_page": "50",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
'query' => [
'site_id' => '12',
'stage' => 'nitelikli',
'source' => 'inbox',
'channel' => 'whatsapp',
'assigned_user_id' => '17',
'search' => 'ali',
'created_preset' => 'this_week',
'created_from' => '2026-08-01',
'created_to' => '2026-08-09',
'activity_preset' => 'last_7',
'activity_from' => '2026-08-01',
'activity_to' => '2026-08-09',
'no_followup' => '1',
'awaiting_days_min' => '3',
'per_page' => '50',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Example response (422, Geçersiz preset veya tarih biçimi):
{
"message": "The selected created preset is invalid."
}
Example response (503, Aktivite sinyalleri kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Manuel VEYA kaynaktan (öneri/talep/lead ads) lead ekle.
Example request:
curl --request POST \
"https://dowaba.com/api/leads" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"name\": \"mqeopfuudtdsufvyvddqa\",
\"phone\": \"mniihfqcoynlazghdtqtq\",
\"email\": \"ablanda@example.org\",
\"stage\": \"consequatur\",
\"source\": \"consequatur\",
\"source_type\": \"mqeopfuudtdsufvyvddqa\",
\"source_id\": 17,
\"channel\": \"mqeopfuudtdsufvyv\",
\"contact_id\": 17,
\"value\": 11613.31890586,
\"notes\": \"opfuudtdsufvyvddqamni\"
}"
const url = new URL(
"https://dowaba.com/api/leads"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"name": "mqeopfuudtdsufvyvddqa",
"phone": "mniihfqcoynlazghdtqtq",
"email": "ablanda@example.org",
"stage": "consequatur",
"source": "consequatur",
"source_type": "mqeopfuudtdsufvyvddqa",
"source_id": 17,
"channel": "mqeopfuudtdsufvyv",
"contact_id": 17,
"value": 11613.31890586,
"notes": "opfuudtdsufvyvddqamni"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'name' => 'mqeopfuudtdsufvyvddqa',
'phone' => 'mniihfqcoynlazghdtqtq',
'email' => 'ablanda@example.org',
'stage' => 'consequatur',
'source' => 'consequatur',
'source_type' => 'mqeopfuudtdsufvyvddqa',
'source_id' => 17,
'channel' => 'mqeopfuudtdsufvyv',
'contact_id' => 17,
'value' => 11613.31890586,
'notes' => 'opfuudtdsufvyvddqamni',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mesaj Kutusu'ndan lead ekle — konuşma (channel + identifier [+ profile_id]) referansıyla.
Site çözümü + IDOR sahiplik doğrulaması + Contact upsert InboxLeadResolver'da (leads-inbox.md § 2). Frontend'in fallback site tahminine GÜVENİLMEZ; profil-bazlı kanallarda site profile'dan çözülür. source her zaman 'inbox'.
Konuşmanın AI özeti ASENKRON olarak lead'in notlarına eklenir (yanıt beklemez).
Example request:
curl --request POST \
"https://dowaba.com/api/leads/inbox" \
--header "Content-Type: application/json" \
--data "{
\"channel\": \"consequatur\",
\"identifier\": \"consequatur\",
\"profile_id\": 17,
\"site_id\": 17,
\"name\": \"mqeopfuudtdsufvyvddqa\",
\"phone\": \"mniihfqcoynlazghdtqtq\",
\"email\": \"ablanda@example.org\",
\"value\": 11613.31890586,
\"notes\": \"opfuudtdsufvyvddqamni\"
}"
const url = new URL(
"https://dowaba.com/api/leads/inbox"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"channel": "consequatur",
"identifier": "consequatur",
"profile_id": 17,
"site_id": 17,
"name": "mqeopfuudtdsufvyvddqa",
"phone": "mniihfqcoynlazghdtqtq",
"email": "ablanda@example.org",
"value": 11613.31890586,
"notes": "opfuudtdsufvyvddqamni"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/inbox';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'channel' => 'consequatur',
'identifier' => 'consequatur',
'profile_id' => 17,
'site_id' => 17,
'name' => 'mqeopfuudtdsufvyvddqa',
'phone' => 'mniihfqcoynlazghdtqtq',
'email' => 'ablanda@example.org',
'value' => 11613.31890586,
'notes' => 'opfuudtdsufvyvddqamni',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
"Bu konuşma zaten lead mi?" — inbox header butonu için idempotent durum sorgusu.
Yazmaz, Contact OLUŞTURMAZ; upsert ile aynı dedup zincirini (findExistingForSite) kullanır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/inbox-status" \
--header "Content-Type: application/json" \
--data "{
\"identifier\": \"vmqeopfuudtdsufvyvddq\",
\"profile_id\": 17,
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/leads/inbox-status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"identifier": "vmqeopfuudtdsufvyvddq",
"profile_id": 17,
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/inbox-status';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'identifier' => 'vmqeopfuudtdsufvyvddq',
'profile_id' => 17,
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/leads/scan
Example request:
curl --request POST \
"https://dowaba.com/api/leads/scan" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17,
\"days\": 13,
\"force\": false
}"
const url = new URL(
"https://dowaba.com/api/leads/scan"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17,
"days": 13,
"force": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scan';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
'days' => 13,
'force' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitede SÜREN tarama; yoksa son 24 saatteki son bitmiş tarama; o da yoksa null. Panel bu ucu sayfa açılışında çağırıp süren taramaya geri bağlanır (resume). Dar throttle YOKTUR: yoklama 3sn'de bir gelir (grup limiti yeterli).
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/scans/active?site_id=12" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/leads/scans/active"
);
const params = {
"site_id": "12",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/active';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'query' => [
'site_id' => '12',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"id": 7,
"status": "running",
"processed_items": 9,
"total_items": 24,
"progress": {
"percent": 37
}
}
}
Example response (200, Aktif tarama yok):
{
"success": true,
"data": null
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Kapsam ön-tahmini — AI ÇALIŞMAZ, yalnız ucuz COUNT'lar. `estimated_ai_calls` ÜST SINIRDIR: gerçek koşuda yeni mesajı olmayan konuşmalar (`no_change`) Gemini'ye hiç gitmez.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/scans/estimate" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 12,
\"scope\": \"no_followup\",
\"channels\": [
\"whatsapp\",
\"mail\"
],
\"include_closed\": false,
\"include_non_leads\": true,
\"lead_ids\": [
41
],
\"date_preset\": \"last_30\",
\"max_items\": 50,
\"profile_id\": 7
}"
const url = new URL(
"https://dowaba.com/api/leads/scans/estimate"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 12,
"scope": "no_followup",
"channels": [
"whatsapp",
"mail"
],
"include_closed": false,
"include_non_leads": true,
"lead_ids": [
41
],
"date_preset": "last_30",
"max_items": 50,
"profile_id": 7
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/estimate';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 12,
'scope' => 'no_followup',
'channels' => [
'whatsapp',
'mail',
],
'include_closed' => false,
'include_non_leads' => true,
'lead_ids' => [
41,
],
'date_preset' => 'last_30',
'max_items' => 50,
'profile_id' => 7,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"profiles": [
{
"id": 7,
"name": "Satış Hattı",
"connection_type": "meta_business"
}
],
"conversations": 24,
"estimated_ai_calls": 24,
"lead_candidates": 18,
"peer_candidates": 6,
"capped": false,
"quota": {
"limit": 1000,
"used": 120,
"remaining": 880
}
}
Example response (422, Hat bu siteye ait değil):
{
"success": false,
"error": "invalid_profile"
}
Example response (503, Özellik kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sitenin tarama geçmişi (yeni → eski, sayfalı).
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/scans?site_id=12&per_page=20" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/leads/scans"
);
const params = {
"site_id": "12",
"per_page": "20",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'query' => [
'site_id' => '12',
'per_page' => '20',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 7,
"status": "done",
"total_items": 24,
"hot_count": 5
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 20,
"total": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Taramayı başlat (arka plan işi kuyruğa girer, 202 döner). Kapsam kohortları: `no_followup` (varsayılan — son söz müşteride) · `all_active` · `date_range` (liste süzgeciyle AYNI sınırlar) · `selected` (`lead_ids`). `include_non_leads` VARSAYILAN AÇIK: lead kartı olmayan konuşmalar da taranır, sıcak/nötr çıkanlar `source=ai_scan` ile lead olur.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/scans" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 12,
\"scope\": \"no_followup\",
\"channels\": [
\"whatsapp\"
],
\"include_closed\": false,
\"include_non_leads\": true,
\"lead_ids\": [
41,
42
],
\"date_preset\": \"last_30\",
\"date_from\": \"2026-08-01\",
\"date_to\": \"2026-08-09\",
\"max_items\": 50,
\"profile_id\": 7
}"
const url = new URL(
"https://dowaba.com/api/leads/scans"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 12,
"scope": "no_followup",
"channels": [
"whatsapp"
],
"include_closed": false,
"include_non_leads": true,
"lead_ids": [
41,
42
],
"date_preset": "last_30",
"date_from": "2026-08-01",
"date_to": "2026-08-09",
"max_items": 50,
"profile_id": 7
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 12,
'scope' => 'no_followup',
'channels' => [
'whatsapp',
],
'include_closed' => false,
'include_non_leads' => true,
'lead_ids' => [
41,
42,
],
'date_preset' => 'last_30',
'date_from' => '2026-08-01',
'date_to' => '2026-08-09',
'max_items' => 50,
'profile_id' => 7,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (202, Kuyruğa alındı):
{
"success": true,
"scan": {
"id": 7,
"status": "pending",
"total_items": 24,
"site_id": 12,
"profile_id": 7
}
}
Example response (409, Bu sitede tarama sürüyor):
{
"success": false,
"error": "already_running",
"scan_id": 6
}
Example response (422, Kota/kredi/kapsam):
{
"success": false,
"error": "quota_exceeded"
}
Example response (422, Hat bu siteye ait değil):
{
"success": false,
"error": "invalid_profile"
}
Example response (503, Özellik kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek tarama + ilerleme yüzdesi (panel yoklamasının ucu — dar throttle YOK).
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/scans/1562" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/leads/scans/1562"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/1562';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"id": 7,
"status": "running",
"processed_items": 9,
"total_items": 24,
"progress": {
"percent": 37
}
}
}
Example response (404, Başka sitenin taraması):
{
"message": "No query results for model [App\\Models\\LeadScan]."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tarama kalemleri (sınıf sekmeleri + "Daha fazla göster"). Dar throttle YOK.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/scans/1562/items?class=sicak&status=done&per_page=50" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"status\": \"error\"
}"
const url = new URL(
"https://dowaba.com/api/leads/scans/1562/items"
);
const params = {
"class": "sicak",
"status": "done",
"per_page": "50",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"status": "error"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/1562/items';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'query' => [
'class' => 'sicak',
'status' => 'done',
'per_page' => '50',
],
'json' => [
'status' => 'error',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 31,
"item_id": 31,
"lead_id": 88,
"channel": "whatsapp",
"qualification": "sicak",
"confidence": 0.9,
"reason": "Fiyat sordu, teklif bekliyor.",
"suggested_message": "Merhaba…",
"status": "done",
"branch": "intent",
"window_open": true,
"is_evolution": false,
"blocked_reason": null
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 50,
"total": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Taramayı iptal et. Satır anında `cancelled` olur; koşan iş bir sonraki turda görüp çıkar (en fazla bir kalem gecikme). Bitmiş tarama değişmez.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/scans/1562/cancel" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/leads/scans/1562/cancel"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/1562/cancel';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": {
"id": 7,
"status": "cancelled"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Onay bekleyenlerin BİRLEŞİK listesi (Pipeline PR5) — iki dal tek yüzeyde. `branch=intent` satırları `outbound_message_intents` (serbest metin, 24h penceresi açık); `branch=campaign` satırları pasif WhatsApp şablon kampanyası (soğuk Meta hattı). `status=blocked` satırları gönderim kapılarında (opt-out / İYS RET / blok / geçersiz e-posta) atlanmıştır. Panel yoklaması olabildiği için DAR throttle YOKTUR.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/scans/1562/pending" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/leads/scans/1562/pending"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/1562/pending';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"items": [
{
"item_id": 31,
"lead_id": 88,
"name": "Ali Veli",
"channel": "whatsapp",
"branch": "intent",
"message": "Merhaba…",
"template_name": null,
"scheduled_job_id": null,
"outbound_intent_id": 57,
"status": "pending_approval",
"blocked_reason": null,
"qualification": "sicak"
}
],
"counts": {
"intent": 1,
"campaign": 0,
"blocked": 0
}
}
Example response (404, Başka sitenin taraması):
{
"message": "No query results for model [App\\Models\\LeadScan]."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sonuç aksiyonlarını uygula (Pipeline PR5): bekleyen listeye ekle · gönderim yolunu seç · aşama taşı. Kalem başına `mode` seçilir: `intent` (serbest metin — 24h penceresi AÇIK olmalı; Telegram/Mail her zaman, Evolution WhatsApp her zaman) · `template_direct` (soğuk Meta WhatsApp, tek istekte en fazla 50) · `campaign` (soğuk Meta WhatsApp, pasif kampanya satırı — **`consent_confirmed` beyanı ZORUNLU**, ETK 6563/İYS). Gönderim kapıları FAIL-CLOSED: opt-out / İYS RET / bloklu / geçersiz e-posta kalemler `skipped` döner, satır YARATILMAZ.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/scans/1562/actions" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"items\": [
{
\"item_id\": 31,
\"mode\": \"intent\",
\"message\": \"Merhaba, teklifimizi hazırladık.\",
\"template_name\": \"kampanya_duyuru\",
\"template_language\": \"tr\",
\"campaign_id\": 42,
\"profile_id\": 7,
\"schedule_type\": \"daily\",
\"schedule_hour\": 5,
\"batch_size\": 8,
\"delay_ms\": 14
}
],
\"consent_confirmed\": true,
\"move_rejected_to_lost\": false,
\"stage_moves\": false
}"
const url = new URL(
"https://dowaba.com/api/leads/scans/1562/actions"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"items": [
{
"item_id": 31,
"mode": "intent",
"message": "Merhaba, teklifimizi hazırladık.",
"template_name": "kampanya_duyuru",
"template_language": "tr",
"campaign_id": 42,
"profile_id": 7,
"schedule_type": "daily",
"schedule_hour": 5,
"batch_size": 8,
"delay_ms": 14
}
],
"consent_confirmed": true,
"move_rejected_to_lost": false,
"stage_moves": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/1562/actions';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'items' => [
[
'item_id' => 31,
'mode' => 'intent',
'message' => 'Merhaba, teklifimizi hazırladık.',
'template_name' => 'kampanya_duyuru',
'template_language' => 'tr',
'campaign_id' => 42,
'profile_id' => 7,
'schedule_type' => 'daily',
'schedule_hour' => 5,
'batch_size' => 8,
'delay_ms' => 14,
],
],
'consent_confirmed' => true,
'move_rejected_to_lost' => false,
'stage_moves' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"created_intents": 3,
"intent_ids": [
57,
58,
59
],
"template_sent": 0,
"contact_group_id": null,
"scheduled_job_ids": [],
"leads_created": 1,
"stage_moved": 0,
"moved_to_lost": 0,
"skipped": [
{
"item_id": 34,
"reason": "opt_out"
}
]
}
Example response (422, Kampanya beyanı yok):
{
"success": false,
"error": "consent_required"
}
Example response (503, Özellik kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bekleyenleri ONAYLA → gönderim serbest (Pipeline PR5). `item_ids` GÖNDERİLMEZSE (ya da boşsa) **tüm uygun bekleyenler** onaylanır (frontend sözleşmesi). Intent dalı `approved` olur (`messages:run-outbound` bir sonraki tetiklemede gönderir); kampanya dalı `is_active=true` + `consent_confirmed_at` damgası alır (`scheduled-jobs:process` gönderir). Zaten gönderilmiş/kuyruğa girmiş satırlar ÇİFT GÖNDERİM riski yüzünden sessizce atlanır.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/scans/1562/approve" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"item_ids\": [
31,
32
]
}"
const url = new URL(
"https://dowaba.com/api/leads/scans/1562/approve"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"item_ids": [
31,
32
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/scans/1562/approve';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'item_ids' => [
31,
32,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"approved": 3,
"intents": 2,
"campaigns": 1
}
Example response (503, Özellik kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Lead'lere WhatsApp konuşması başlatma — ön kontrol (task #11, 2026-07-18).
Pencere/opt-out durumu + site profili döner; hiçbir şey göndermez.
Example request:
curl --request POST \
"https://dowaba.com/api/leads/whatsapp-start/preflight" \
--header "Content-Type: application/json" \
--data "{
\"lead_ids\": [
17
],
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/leads/whatsapp-start/preflight"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"lead_ids": [
17
],
"profile_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/whatsapp-start/preflight';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'lead_ids' => [
17,
],
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Lead'lere WhatsApp konuşması başlat (tek/toplu; mode=text|template).
Uyum gate'i + 24h pencere + kampanya nefes payı servis içinde (LeadWhatsappStarter).
Example request:
curl --request POST \
"https://dowaba.com/api/leads/whatsapp-start" \
--header "Content-Type: application/json" \
--data "{
\"lead_ids\": [
17
],
\"mode\": \"template\",
\"message\": \"mqeopfuudtdsufvyvddqa\",
\"template_name\": \"mniihfqcoynlazghdtqtq\",
\"template_language\": \"xbajwbpilpmuf\",
\"profile_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/leads/whatsapp-start"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"lead_ids": [
17
],
"mode": "template",
"message": "mqeopfuudtdsufvyvddqa",
"template_name": "mniihfqcoynlazghdtqtq",
"template_language": "xbajwbpilpmuf",
"profile_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/whatsapp-start';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'lead_ids' => [
17,
],
'mode' => 'template',
'message' => 'mqeopfuudtdsufvyvddqa',
'template_name' => 'mniihfqcoynlazghdtqtq',
'template_language' => 'xbajwbpilpmuf',
'profile_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aynı siteye ait birden fazla lead'i tek işlemde bir takım üyesine ata veya atamalarını kaldır. İstek tamamen site/tenant kapsamındadır; erişilemeyen tek bir lead id'si bile varsa hiçbir kayıt değiştirilmez.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/bulk-assign" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"lead_ids\": [
41,
42
],
\"assigned_user_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/leads/bulk-assign"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"lead_ids": [
41,
42
],
"assigned_user_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/bulk-assign';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'lead_ids' => [
41,
42,
],
'assigned_user_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Başarılı):
{
"success": true,
"requested_count": 2,
"updated_count": 2,
"unchanged_count": 0,
"assigned_user_id": 17,
"updated_ids": [
41,
42
],
"data": [
{
"id": 41,
"assigned_user_id": 17,
"assigned_user": {
"id": 17,
"name": "Mehmet"
}
}
]
}
Example response (404, Lead kapsam dışında veya bulunamadı):
{
"message": "Not Found"
}
Example response (422, Farklı site veya takım dışı kullanıcı):
{
"success": false,
"error": "mixed_sites",
"message": "Toplu atama için seçilen lead'ler aynı siteye ait olmalıdır."
}
Example response (429, Dakikalık toplu atama sınırı aşıldı):
{
"message": "Too Many Attempts."
}
Example response (503, Özellik kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aynı siteye ait birden fazla lead'i tek işlemde KALICI sil (pipeline seçim modu). All-or-nothing: erişilemeyen tek bir id bile varsa hiçbir kayıt silinmez. Silinen lead'in değişiklik geçmişi (lead_activities) de gider; Lead Reklamları gönderimlerinin "Eklendi" damgası (lead_id) boşaltılır → aynı gönderim tekrar lead'e eklenebilir.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/bulk-delete" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"lead_ids\": [
41,
42
]
}"
const url = new URL(
"https://dowaba.com/api/leads/bulk-delete"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"lead_ids": [
41,
42
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/bulk-delete';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'lead_ids' => [
41,
42,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Başarılı):
{
"success": true,
"deleted_count": 2
}
Example response (404, Lead kapsam dışında veya bulunamadı):
{
"message": "Not Found"
}
Example response (422, Seçim birden fazla siteye yayılıyor):
{
"success": false,
"error": "mixed_sites",
"message": "Toplu silme için seçilen lead'ler aynı siteye ait olmalıdır."
}
Example response (429, Dakikalık toplu işlem sınırı aşıldı):
{
"message": "Too Many Attempts."
}
Example response (503, Özellik kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aynı siteye ait birden fazla lead'i tek işlemde başka bir pano aşamasına taşı (pipeline seçim modu). All-or-nothing: erişilemeyen tek bir id bile varsa hiçbir kayıt değişmez. Zaten hedef aşamada olan kartlara DOKUNULMAZ (`unchanged_count`); değişen her kart için değişiklik geçmişine tekil uçla AYNI otoriteden 'stage_changed' satırı düşer.
requires authentication
Example request:
curl --request POST \
"https://dowaba.com/api/leads/bulk-stage" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"lead_ids\": [
41,
42
],
\"stage\": \"iletisimde\"
}"
const url = new URL(
"https://dowaba.com/api/leads/bulk-stage"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"lead_ids": [
41,
42
],
"stage": "iletisimde"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/bulk-stage';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'lead_ids' => [
41,
42,
],
'stage' => 'iletisimde',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200, Başarılı):
{
"success": true,
"updated_count": 1,
"unchanged_count": 1,
"stage": "iletisimde",
"leads": [
{
"id": 41,
"stage": "iletisimde"
}
]
}
Example response (404, Lead kapsam dışında veya bulunamadı):
{
"message": "Not Found"
}
Example response (422, Seçim birden fazla siteye yayılıyor):
{
"success": false,
"error": "mixed_sites",
"message": "Toplu aşama taşıma için seçilen lead'ler aynı siteye ait olmalıdır."
}
Example response (422, Bilinmeyen aşama):
{
"message": "The selected stage is invalid.",
"errors": {
"stage": [
"The selected stage is invalid."
]
}
}
Example response (429, Dakikalık toplu işlem sınırı aşıldı):
{
"message": "Too Many Attempts."
}
Example response (503, Özellik kapalı):
{
"success": false,
"error": "feature_disabled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Tek lead AI analizi + aşama önerisi. Mesaj İÇERİĞİ okur → messagingSiteIds gate.
Example request:
curl --request POST \
"https://dowaba.com/api/leads/5/analyze"const url = new URL(
"https://dowaba.com/api/leads/5/analyze"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5/analyze';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Sütun içi manuel sıralama: verilen sıradaki lead'lere 1.
.n position atar (scope: erişilebilir site). Yalnız aynı stage'in kartları gönderilir (frontend). Cross-tenant guard: site scope filtresi.
Example request:
curl --request POST \
"https://dowaba.com/api/leads/reorder" \
--header "Content-Type: application/json" \
--data "{
\"stage\": \"consequatur\",
\"ordered_ids\": [
17
]
}"
const url = new URL(
"https://dowaba.com/api/leads/reorder"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"stage": "consequatur",
"ordered_ids": [
17
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/reorder';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'stage' => 'consequatur',
'ordered_ids' => [
17,
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Lead değişiklik geçmişi — kim ne yaptı (oluşturma / aşama / atama / düzenleme).
Yazıcı: LeadActivityLogger (LeadObserver üzerinden otomatik). Aktör adı OKUMA anında users'tan çözülür (KVKK anonimleştirmesi loga otomatik yansır); actor_role yazım anı damgası (owner|agent|subuser|superadmin|other|system). assigned_user_id değişikliklerinde from_label/to_label ad çözümü de okuma anında yapılır.
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/5/activities"const url = new URL(
"https://dowaba.com/api/leads/5/activities"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5/activities';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"data": [
{
"id": 9,
"action": "stage_changed",
"actor_role": "agent",
"actor_name": "Mehmet",
"changes": {
"stage": {
"from": "yeni",
"to": "iletisimde"
}
},
"created_at": "2026-07-11T09:30:00.000000Z"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Lead'in konuşma önizlemesi — Mesaj Önerileri "baloncuk" paritesi (task #12).
Kanal + son 30 mesaj (in/out) döner. Identifier eşlemesi: whatsapp/voice→phone (voice'ta aynı telefonun WA geçmişi denenir), mail→email, IG/TG/Msgr→bağlı contact'ın kanal kolonu. Mesaj İÇERİĞİ okur → messagingSiteIds gate.
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/5/conversation"const url = new URL(
"https://dowaba.com/api/leads/5/conversation"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5/conversation';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"channel": "whatsapp",
"messages": [
{
"direction": "in",
"text": "fiyat nedir",
"created_at": "2026-07-18T09:00:00+03:00"
}
]
}
Example response (422):
{
"success": false,
"error": "no_identifier"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Lead'in ARTIMLI konuşma özeti — SAKLI özeti okur, Gemini'ye GİTMEZ (ücretsiz).
Özet yoksa summary: null döner (hata değil) → panel "Özet çıkar" der.
Mesaj İÇERİĞİNDEN türetilmiş metin döner → messagingSiteIds gate.
Example request:
curl --request GET \
--get "https://dowaba.com/api/leads/5/summary"const url = new URL(
"https://dowaba.com/api/leads/5/summary"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5/summary';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"channel": "whatsapp",
"summary": "Müşteri fiyat sordu…",
"up_to_message_id": 4120,
"up_to_message_at": "2026-08-09T09:00:00+03:00",
"message_count": 43,
"generation_count": 2,
"model": "gemini-flash-lite-latest",
"generated_at": "2026-08-09T09:00:05+03:00",
"summary_data": {
"locale": "tr"
}
}
Example response (422):
{
"success": false,
"error": "no_identifier"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Özeti tazele — saklı özet + SON ÖZETTEN SONRAKİ mesajlar → yeni özet.
Yeni mesaj yoksa (delta_count: 0) Gemini'ye HİÇ çağrı gitmez ve saklı
özet aynen döner (used_ai: false) — "tarananlar tekrar taranmaz".
Maliyet mevcut zincirde: kullanıcının Gemini anahtarı / AI kredisi.
Example request:
curl --request POST \
"https://dowaba.com/api/leads/5/summary/refresh"const url = new URL(
"https://dowaba.com/api/leads/5/summary/refresh"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5/summary/refresh';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"summary": "…",
"delta_count": 3,
"used_ai": true,
"up_to_message_id": 4123
}
Example response (422):
{
"success": false,
"error": "gemini_key_missing"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PATCH api/leads/{id}/stage
Example request:
curl --request PATCH \
"https://dowaba.com/api/leads/5/stage" \
--header "Content-Type: application/json" \
--data "{
\"stage\": \"consequatur\"
}"
const url = new URL(
"https://dowaba.com/api/leads/5/stage"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"stage": "consequatur"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5/stage';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'stage' => 'consequatur',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/leads/{id}/assign
Example request:
curl --request POST \
"https://dowaba.com/api/leads/5/assign" \
--header "Content-Type: application/json" \
--data "{
\"assigned_user_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/leads/5/assign"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"assigned_user_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5/assign';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'assigned_user_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PATCH api/leads/{id}
Example request:
curl --request PATCH \
"https://dowaba.com/api/leads/5" \
--header "Content-Type: application/json" \
--data "{
\"name\": \"vmqeopfuudtdsufvyvddq\",
\"value\": 11613.31890586,
\"notes\": \"opfuudtdsufvyvddqamni\",
\"email\": \"damien.murazik@example.com\",
\"phone\": \"oynlazghdtqtqxbajwbpi\",
\"color\": \"lpmufinllwloauydl\"
}"
const url = new URL(
"https://dowaba.com/api/leads/5"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "vmqeopfuudtdsufvyvddq",
"value": 11613.31890586,
"notes": "opfuudtdsufvyvddqamni",
"email": "damien.murazik@example.com",
"phone": "oynlazghdtqtqxbajwbpi",
"color": "lpmufinllwloauydl"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5';
$response = $client->patch(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'vmqeopfuudtdsufvyvddq',
'value' => 11613.31890586,
'notes' => 'opfuudtdsufvyvddqamni',
'email' => 'damien.murazik@example.com',
'phone' => 'oynlazghdtqtqxbajwbpi',
'color' => 'lpmufinllwloauydl',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE api/leads/{id}
Example request:
curl --request DELETE \
"https://dowaba.com/api/leads/5"const url = new URL(
"https://dowaba.com/api/leads/5"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/leads/5';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/lead-submissions
Example request:
curl --request GET \
--get "https://dowaba.com/api/lead-submissions"const url = new URL(
"https://dowaba.com/api/lead-submissions"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/lead-submissions';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir site için lead atama seçenekleri: atanabilir takım üyeleri (atanmış lead yükleriyle) + otomatik dağıtım ayarının mevcut durumu.
requires authentication
Example request:
curl --request GET \
--get "https://dowaba.com/api/lead-submissions/assignment-options?site_id=5" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 73
}"
const url = new URL(
"https://dowaba.com/api/lead-submissions/assignment-options"
);
const params = {
"site_id": "5",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 73
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/lead-submissions/assignment-options';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'query' => [
'site_id' => '5',
],
'json' => [
'site_id' => 73,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"auto_assign": false,
"users": [
{
"id": 17,
"name": "Ali Veli",
"email": "a**@example.com",
"role": "agent",
"open_count": 3
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Otomatik dağıtımı aç/kapat. Açıkken yeni gelen lead'ler sitenin takım üyeleri (agent) arasında en az lead atanmış olana otomatik atanır.
requires authentication
Example request:
curl --request PUT \
"https://dowaba.com/api/lead-submissions/auto-assign" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 5,
\"enabled\": true
}"
const url = new URL(
"https://dowaba.com/api/lead-submissions/auto-assign"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 5,
"enabled": true
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/lead-submissions/auto-assign';
$response = $client->put(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 5,
'enabled' => true,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"auto_assign": true
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir lead form gönderimini takım üyesine ata (null = atamayı kaldır).
requires authentication
Atama sonrası atanana ÖNCELİKLİ bildirim gider (SMS varsa SMS, yoksa mail — NotificationDispatcher::dispatchLeadAssignment). Site'a bağlı olmayan (null-site) gönderimde takım olmadığından atama yapılamaz (422).
Example request:
curl --request POST \
"https://dowaba.com/api/lead-submissions/12/assign" \
--header "Authorization: Bearer {TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"user_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/lead-submissions/12/assign"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"user_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/lead-submissions/12/assign';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
'Content-Type' => 'application/json',
],
'json' => [
'user_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"message": "Lead atandı",
"assigned_user_id": 17,
"assigned_user_name": "Ali Veli"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Bir lead form gönderimini SİL — Facebook'tan da kalıcı (DELETE /{leadgen_id}) + panelde tombstone.
requires authentication
Scope: index ile aynı (messagingSiteIds VEYA null-site+kendi sayfası) → cross-tenant silme engellenir. Facebook tarafı: sayfa sahibinin (sub.user_id) aktif FB sayfa profili token'ıyla denenir (best-effort). Meta silinmezse (sayfa kopuk) yine yerelde soft-delete → re-sync GERİ EKLEMEZ (tombstone). Bağlı CRM lead kartı da kaldırılır; Kişi + Rıza KORUNUR (Rehber'den ayrı + KVKK yasal kaydı).
Example request:
curl --request DELETE \
"https://dowaba.com/api/lead-submissions/12" \
--header "Authorization: Bearer {TOKEN}"const url = new URL(
"https://dowaba.com/api/lead-submissions/12"
);
const headers = {
"Authorization": "Bearer {TOKEN}",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/lead-submissions/12';
$response = $client->delete(
$url,
[
'headers' => [
'Authorization' => 'Bearer {TOKEN}',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (200):
{
"success": true,
"meta_deleted": true,
"message": "Lead panelden ve Facebook'tan silindi."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Fonksiyon Gateway
Site için kullanılabilir fonksiyonları listele (her kayıt scope: global|override|site).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/functions"const url = new URL(
"https://dowaba.com/api/sites/1/functions"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/functions';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Yeni site-specific fonksiyon yarat (type=http/sql/static).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/functions"const url = new URL(
"https://dowaba.com/api/sites/1/functions"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/functions';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Global fonksiyonu site bazında özelleştir (override kopyası yarat).
Example request:
curl --request POST \
"https://dowaba.com/api/sites/1/functions/1/override"const url = new URL(
"https://dowaba.com/api/sites/1/functions/1/override"
);
fetch(url, {
method: "POST",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/functions/1/override';
$response = $client->post($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-specific fonksiyonu güncelle (global'ler için "override" kullan).
Example request:
curl --request PUT \
"https://dowaba.com/api/functions/1"const url = new URL(
"https://dowaba.com/api/functions/1"
);
fetch(url, {
method: "PUT",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/functions/1';
$response = $client->put($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-specific fonksiyonu güncelle (global'ler için "override" kullan).
Example request:
curl --request PATCH \
"https://dowaba.com/api/functions/1"const url = new URL(
"https://dowaba.com/api/functions/1"
);
fetch(url, {
method: "PATCH",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/functions/1';
$response = $client->patch($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Fonksiyonu mock argümanlarla test et (panel "Test" butonu).
Example request:
curl --request POST \
"https://dowaba.com/api/functions/1/test" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 17
}"
const url = new URL(
"https://dowaba.com/api/functions/1/test"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 17
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/functions/1/test';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 17,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Fonksiyonu ilgili site için aktif/pasif yap. Global tanım değiştirilmez veya kopyalanmaz; siteye ait özel kolonda yalnız kapatılan slug tutulur.
Example request:
curl --request POST \
"https://dowaba.com/api/functions/1/toggle" \
--header "Content-Type: application/json" \
--data "{
\"site_id\": 159,
\"is_active\": false
}"
const url = new URL(
"https://dowaba.com/api/functions/1/toggle"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"site_id": 159,
"is_active": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/functions/1/toggle';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
],
'json' => [
'site_id' => 159,
'is_active' => false,
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site-specific fonksiyonu sil (global'ler silinemez).
Example request:
curl --request DELETE \
"https://dowaba.com/api/functions/1"const url = new URL(
"https://dowaba.com/api/functions/1"
);
fetch(url, {
method: "DELETE",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/functions/1';
$response = $client->delete($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Site bağlantılarını listele (HTTP API + DB).
Example request:
curl --request GET \
--get "https://dowaba.com/api/sites/1/connections"const url = new URL(
"https://dowaba.com/api/sites/1/connections"
);
fetch(url, {
method: "GET",
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://dowaba.com/api/sites/1/connections';
$response = $client->get($url);
$body = $response->getBody();
print_r(json_decode((string) $body));Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.