MENU navbar-image

Introduction

SMS Merkezi REST API v1 — Profesyonel toplu SMS gönderimi, raporlama, kontak ve şablon yönetimi için RESTful API.

Bu dokümantasyon SMS Merkezi REST API v1 ile entegrasyon için ihtiyacınız olan tüm bilgileri içerir.

**Temel Özellikler:**
- Sanctum Bearer Token kimlik doğrulama (panel'den oluşturulur)
- Endpoint başına ability (yetki) bazlı erişim (örn. `sms.send`, `contacts.read`)
- 60 istek/dakika varsayılan rate limit (sms-send için 30/dk)
- Türk operatörü uyumlu (Kobikom + NetGSM gateway desteği)
- HMAC-SHA256 imzalı outbound webhook (DLR push)
- RFC 7807 Problem Details standardında hata yanıtları
- X-RateLimit-* header'ları ile şeffaf kota takibi

<aside><b>Hızlı başlangıç:</b> Panel → Ayarlar → API Token sekmesinden token oluşturun, ardından <code>Authorization: Bearer &lt;token&gt;</code> header'ı ile istek atın.</aside>

<aside>Sağdaki kod alanında her endpoint için cURL ve JavaScript örneklerini görebilirsiniz. Üstteki sekmelerden dil değiştirebilirsiniz.</aside>

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {API_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Token oluşturmak için panel'e giriş yapın → Ayarlar → API TokenYeni Token Oluştur. Oluşturulan token'ı güvenli bir yerde saklayın (sadece bir kez gösterilir).

Sistem

API Durumu

Public health/status endpoint — auth gerekmez. SaaS müşterileri için "API ayakta mı?" sorusuna cevap; statuspage.io gibi izleme servislerine de bağlanabilir. Gateway durumu config/sms.php'den çekilir; canlı gateway probu Faz 5+'da eklenecek.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/status" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/status"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/status';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/status'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "service": "smsmerkezi-api",
    "version": "v1",
    "release": "1.0.0",
    "env": "production",
    "time": "2026-05-07T10:23:45+00:00",
    "default_gateway": "kobikom",
    "gateways": [
        {
            "slug": "kobikom",
            "status": "operational"
        },
        {
            "slug": "netgsm",
            "status": "operational"
        },
        {
            "slug": "mock",
            "status": "operational"
        }
    ]
}
 

Request      

GET v1/status

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

SMS Gönderim

SMS Gönder

requires authentication

Tek istekte 1..1000 alıcıya SMS gönderir. Eşzamansız (async) çalışır: 202 yanıtı gelince kuyruğa alınmıştır, gerçek durum için GET /v1/sms/{id} ile takip edin.

KVKK opt-out filtresi otomatik uygulanır. Bakiye yetersizse 422 döner.

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/sms/send" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"body\": \"Merhaba, randevunuz yarın saat 14:00\'tedir.\",
    \"recipients\": [
        \"+905551112233\",
        \"+905551112244\"
    ],
    \"originator\": \"SMSMERKEZI\",
    \"scheduled_at\": \"2026-12-31T20:00:00+03:00\",
    \"gateway\": \"kobikom\",
    \"meta\": {
        \"campaign_id\": 42,
        \"ref\": \"order-12345\"
    }
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/sms/send"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "body": "Merhaba, randevunuz yarın saat 14:00'tedir.",
    "recipients": [
        "+905551112233",
        "+905551112244"
    ],
    "originator": "SMSMERKEZI",
    "scheduled_at": "2026-12-31T20:00:00+03:00",
    "gateway": "kobikom",
    "meta": {
        "campaign_id": 42,
        "ref": "order-12345"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/sms/send';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'body' => 'Merhaba, randevunuz yarın saat 14:00\'tedir.',
            'recipients' => [
                '+905551112233',
                '+905551112244',
            ],
            'originator' => 'SMSMERKEZI',
            'scheduled_at' => '2026-12-31T20:00:00+03:00',
            'gateway' => 'kobikom',
            'meta' => [
                'campaign_id' => 42,
                'ref' => 'order-12345',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/sms/send'
payload = {
    "body": "Merhaba, randevunuz yarın saat 14:00'tedir.",
    "recipients": [
        "+905551112233",
        "+905551112244"
    ],
    "originator": "SMSMERKEZI",
    "scheduled_at": "2026-12-31T20:00:00+03:00",
    "gateway": "kobikom",
    "meta": {
        "campaign_id": 42,
        "ref": "order-12345"
    }
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (202, Başarılı kuyruğa alındı):


{
    "data": {
        "id": 123456,
        "uuid": "9c7e4a2f-1b3d-4e5f-9a8b-7c6d5e4f3a2b",
        "body": "Merhaba, randevunuz yarın saat 14:00'tedir.",
        "originator": "SMSMERKEZI",
        "status": "queued",
        "parts": 1,
        "encoding": "GSM7",
        "recipients_count": 2,
        "scheduled_at": null,
        "gateway": "kobikom",
        "created_at": "2026-05-07T10:23:45+00:00"
    }
}
 

Example response (403, Token yetkisi yok):


{
    "type": "https://smsmerkezi.net/errors/forbidden",
    "title": "Forbidden",
    "status": 403,
    "detail": "Bu token \"sms:send\" yetkisine sahip değil.",
    "instance": "/v1/sms/send"
}
 

Example response (422, Validasyon veya bakiye hatası):


{
    "type": "https://smsmerkezi.net/errors/invalid-request",
    "title": "Invalid Request",
    "status": 422,
    "detail": "Yetersiz bakiye. Mevcut: 50, Gereken: 200.",
    "instance": "/v1/sms/send"
}
 

Example response (429, Rate limit (sms-send: 30/dk)):


{
    "type": "https://smsmerkezi.net/errors/rate-limit",
    "title": "Too Many Requests",
    "status": 429,
    "detail": "İstek limiti aşıldı. 60 saniye sonra tekrar deneyin.",
    "retry_after": 60
}
 

Request      

POST v1/sms/send

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

body   string     

Mesaj metni (1..1000 karakter, GSM7/UCS2 otomatik tespit edilir). Example: Merhaba, randevunuz yarın saat 14:00'tedir.

recipients   string[]     

Alıcı listesi (E.164 veya yerel format, 1..1000).

originator   string  optional    

Gönderen adı (alfanumeric max 11 karakter, BTK kayıtlı olmalı). Example: SMSMERKEZI

scheduled_at   string  optional    

İleri tarih (ISO-8601, en az +1 dakika). Example: 2026-12-31T20:00:00+03:00

gateway   string  optional    

Manuel gateway seçimi (varsayılan: tenant'ın aktif gateway'i). Geçerli: kobikom, netgsm, mock. Example: kobikom

meta   object  optional    

Müşteri meta verisi (audit log'a yazılır, freeform JSON).

SMS Raporlama

SMS Detay

requires authentication

Belirli bir SMS mesajının detaylarını ve alıcı durumlarını döner. Multi-tenant izolasyon otomatik uygulanır: başka tenant'a ait mesajlar 404 verir.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/sms/123456" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/sms/123456"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/sms/123456';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/sms/123456'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "data": {
        "id": 123456,
        "uuid": "9c7e4a2f-1b3d-4e5f-9a8b-7c6d5e4f3a2b",
        "body": "Merhaba, randevunuz yarın saat 14:00'tedir.",
        "originator": "SMSMERKEZI",
        "status": "delivered",
        "parts": 1,
        "encoding": "GSM7",
        "recipients_count": 2,
        "gateway": "kobikom",
        "scheduled_at": null,
        "sent_at": "2026-05-07T10:23:46+00:00",
        "created_at": "2026-05-07T10:23:45+00:00",
        "recipients": [
            {
                "msisdn": "+90555***2233",
                "status": "delivered",
                "delivered_at": "2026-05-07T10:23:51+00:00",
                "error_code": null
            },
            {
                "msisdn": "+90555***2244",
                "status": "delivered",
                "delivered_at": "2026-05-07T10:23:52+00:00",
                "error_code": null
            }
        ]
    }
}
 

Example response (404, Bulunamadı (veya başka tenant)):


{
    "type": "https://smsmerkezi.net/errors/not-found",
    "title": "Not Found",
    "status": 404,
    "detail": "Mesaj bulunamadı.",
    "instance": "/v1/sms/123456"
}
 

Request      

GET v1/sms/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Mesaj ID. Example: 123456

SMS Listesi

requires authentication

Kullanıcının tenant'ına ait SMS mesajlarını cursor pagination ile listeler. Sıralama: created_at DESC. Cursor pagination kullanılır; next_cursor alanını sonraki sayfa için ?cursor= parametresine geçirin.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/sms?status=delivered&from=2026-05-01T00%3A00%3A00%2B03%3A00&to=2026-05-07T23%3A59%3A59%2B03%3A00&per_page=50&cursor=eyJpZCI6MTIzfQ%3D%3D" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/sms"
);

const params = {
    "status": "delivered",
    "from": "2026-05-01T00:00:00+03:00",
    "to": "2026-05-07T23:59:59+03:00",
    "per_page": "50",
    "cursor": "eyJpZCI6MTIzfQ==",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/sms';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'delivered',
            'from' => '2026-05-01T00:00:00+03:00',
            'to' => '2026-05-07T23:59:59+03:00',
            'per_page' => '50',
            'cursor' => 'eyJpZCI6MTIzfQ==',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/sms'
params = {
  'status': 'delivered',
  'from': '2026-05-01T00:00:00+03:00',
  'to': '2026-05-07T23:59:59+03:00',
  'per_page': '50',
  'cursor': 'eyJpZCI6MTIzfQ==',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Başarılı liste):


{
    "data": [
        {
            "id": 123456,
            "uuid": "9c7e4a2f-1b3d-4e5f-9a8b-7c6d5e4f3a2b",
            "body": "Merhaba, randevunuz yarın saat 14:00'tedir.",
            "originator": "SMSMERKEZI",
            "status": "delivered",
            "parts": 1,
            "encoding": "GSM7",
            "recipients_count": 2,
            "gateway": "kobikom",
            "created_at": "2026-05-07T10:23:45+00:00"
        }
    ],
    "links": {
        "first": null,
        "last": null,
        "prev": null,
        "next": "https://api.smsmerkezi.net/v1/sms?cursor=eyJpZCI6MTIzfQ"
    },
    "meta": {
        "path": "https://api.smsmerkezi.net/v1/sms",
        "per_page": 20,
        "next_cursor": "eyJpZCI6MTIzfQ",
        "prev_cursor": null
    }
}
 

Example response (403, Token yetkisi yok):


{
    "type": "https://smsmerkezi.net/errors/forbidden",
    "title": "Forbidden",
    "status": 403,
    "detail": "Bu token \"sms:read\" yetkisine sahip değil.",
    "instance": "/v1/sms"
}
 

Request      

GET v1/sms

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

status   string  optional    

Filtre: queued, sent, delivered, failed, undelivered. Example: delivered

from   string  optional    

ISO-8601 başlangıç tarihi (created_at >=). Example: 2026-05-01T00:00:00+03:00

to   string  optional    

ISO-8601 bitiş tarihi (created_at <=). Example: 2026-05-07T23:59:59+03:00

per_page   integer  optional    

Sayfa başı kayıt (1..100, varsayılan 20). Example: 50

cursor   string  optional    

Sonraki sayfa cursor (önceki yanıttaki next_cursor). Example: eyJpZCI6MTIzfQ==

Bakiye

Bakiye Sorgula

requires authentication

Tenant'ın güncel SMS kredisi bilgisini döner. Üç değer içerir:

Çok parçalı (UCS2 veya >160 GSM7) mesajlarda parça sayısı kadar kredi düşer.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/balance" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/balance"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/balance';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/balance'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "balance": 5000,
    "reserved": 120,
    "available": 4880,
    "currency": "sms"
}
 

Example response (403, Token yetkisi yok):


{
    "type": "https://smsmerkezi.net/errors/forbidden",
    "title": "Forbidden",
    "status": 403,
    "detail": "Bu token \"balance:read\" yetkisine sahip değil.",
    "instance": "/v1/balance"
}
 

Request      

GET v1/balance

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

API Token

Token Listesi

requires authentication

Kullanıcının kendi adına oluşturulmuş tüm API token'larını listeler. Token hash'i veya plain text DEĞER asla dönmez; sadece metadata.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/tokens" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/tokens"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/tokens';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/tokens'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "data": [
        {
            "id": 7,
            "name": "Üretim CRM Entegrasyonu",
            "abilities": [
                "sms:send",
                "sms:read",
                "balance:read"
            ],
            "last_used_at": "2026-05-07T08:45:12+00:00",
            "created_at": "2026-04-20T14:22:33+00:00"
        }
    ]
}
 

Request      

GET v1/tokens

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Token Oluştur

requires authentication

Yeni bir API token oluşturur. plain_text_token alanı SADECE bu yanıtta gösterilir; saklamak müşterinin sorumluluğudur. Kayıp token için yeni bir token oluşturmak ve eskisini revoke etmek gerekir.

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/tokens" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Üretim CRM Entegrasyonu\",
    \"abilities\": [
        \"sms:send\",
        \"sms:read\",
        \"balance:read\"
    ]
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/tokens"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Üretim CRM Entegrasyonu",
    "abilities": [
        "sms:send",
        "sms:read",
        "balance:read"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/tokens';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Üretim CRM Entegrasyonu',
            'abilities' => [
                'sms:send',
                'sms:read',
                'balance:read',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/tokens'
payload = {
    "name": "Üretim CRM Entegrasyonu",
    "abilities": [
        "sms:send",
        "sms:read",
        "balance:read"
    ]
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, Başarılı oluşturuldu):


{
    "id": 7,
    "name": "Üretim CRM Entegrasyonu",
    "abilities": [
        "sms:send",
        "sms:read",
        "balance:read"
    ],
    "plain_text_token": "7|aBcD1234eFgH5678iJkL9012mNoP3456qRsT7890"
}
 

Request      

POST v1/tokens

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Token tanımı (max 64 karakter, müşteri için anlamlı). Example: Üretim CRM Entegrasyonu

abilities   string[]     

Token yetkileri (en az 1). Geçerli: sms:send, sms:read, balance:read, *.

Token İptal

requires authentication

Belirli bir token'ı kalıcı olarak iptal eder (hard delete). İptal sonrası o token ile yapılan istekler 401 Unauthorized döner.

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/tokens/7" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/tokens/7"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/tokens/7';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/tokens/7'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "status": "revoked"
}
 

Example response (404, Token bulunamadı):


{
    "type": "https://smsmerkezi.net/errors/not-found",
    "title": "Not Found",
    "status": 404,
    "detail": "Token bulunamadı.",
    "instance": "/v1/tokens/7"
}
 

Request      

DELETE v1/tokens/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

İptal edilecek token ID. Example: 7

Admin - Audit Log

Audit Log Listesi (Sistem Geneli)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/audit-logs?tenant_id=16&user_id=16&action=architecto&entity_type=architecto&date_from=architecto&date_to=architecto&cursor=architecto" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/audit-logs"
);

const params = {
    "tenant_id": "16",
    "user_id": "16",
    "action": "architecto",
    "entity_type": "architecto",
    "date_from": "architecto",
    "date_to": "architecto",
    "cursor": "architecto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/audit-logs';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'tenant_id' => '16',
            'user_id' => '16',
            'action' => 'architecto',
            'entity_type' => 'architecto',
            'date_from' => 'architecto',
            'date_to' => 'architecto',
            'cursor' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/audit-logs'
params = {
  'tenant_id': '16',
  'user_id': '16',
  'action': 'architecto',
  'entity_type': 'architecto',
  'date_from': 'architecto',
  'date_to': 'architecto',
  'cursor': 'architecto',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Request      

GET v1/admin/audit-logs

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

tenant_id   integer  optional    

Tenant filtresi. Example: 16

user_id   integer  optional    

User filtresi. Example: 16

action   string  optional    

Action exact match. Example: architecto

entity_type   string  optional    

Entity type LIKE. Example: architecto

date_from   string  optional    

Tarih basi (Y-m-d). Example: architecto

date_to   string  optional    

Tarih sonu (Y-m-d). Example: architecto

cursor   string  optional    

Cursor. Example: architecto

Admin - Failed Jobs

Failed Jobs Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/failed-jobs?queue=architecto&exception=architecto&from=architecto&to=architecto&page=16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/failed-jobs"
);

const params = {
    "queue": "architecto",
    "exception": "architecto",
    "from": "architecto",
    "to": "architecto",
    "page": "16",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/failed-jobs';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'queue' => 'architecto',
            'exception' => 'architecto',
            'from' => 'architecto',
            'to' => 'architecto',
            'page' => '16',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/failed-jobs'
params = {
  'queue': 'architecto',
  'exception': 'architecto',
  'from': 'architecto',
  'to': 'architecto',
  'page': '16',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Request      

GET v1/admin/failed-jobs

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

queue   string  optional    

Queue ismi (sms, dlr, default). Example: architecto

exception   string  optional    

Exception class substring (ILIKE/LIKE). Example: architecto

from   string  optional    

Tarih basi (Y-m-d). Example: architecto

to   string  optional    

Tarih sonu (Y-m-d). Example: architecto

page   integer  optional    

Sayfa numarasi. Example: 16

Failed Job Retry

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed/retry" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed/retry"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed/retry';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed/retry'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Example response (404, Failed job bulunamadi):



 

Request      

POST v1/admin/failed-jobs/{uuid}/retry

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   string     

Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

Failed Job Forget (Sil)

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/failed-jobs/6ff8f7f6-1eb3-3525-be4a-3932c805afed'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Basarili):

Empty response
 

Example response (403, Yetki yok):



 

Example response (404, Failed job bulunamadi):



 

Request      

DELETE v1/admin/failed-jobs/{uuid}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   string     

Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

Admin - Marketing Packages

Paket Listesi (Tum, aktif+pasif)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/marketing/packages" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/marketing/packages"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Request      

GET v1/admin/marketing/packages

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Paket Detay

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/marketing/packages/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/marketing/packages/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/admin/marketing/packages/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the package. Example: 564

Paket Olustur

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/admin/marketing/packages" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/marketing/packages"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/admin/marketing/packages

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Paket Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/admin/marketing/packages/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/marketing/packages/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

PUT v1/admin/marketing/packages/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the package. Example: 564

Paket Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/admin/marketing/packages/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/marketing/packages/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Basarili):

Empty response
 

Request      

DELETE v1/admin/marketing/packages/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the package. Example: 564

is_active Toggle

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/admin/marketing/packages/564/toggle" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/marketing/packages/564/toggle"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564/toggle';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/marketing/packages/564/toggle'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/admin/marketing/packages/{id}/toggle

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the package. Example: 564

Admin - Sender ID

Sender ID Listesi (Tum tenant'lar)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/sender-ids?status=architecto" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/sender-ids"
);

const params = {
    "status": "architecto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/sender-ids';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/sender-ids'
params = {
  'status': 'architecto',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Request      

GET v1/admin/sender-ids

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

status   string  optional    

pending|approved|rejected|all. Default: pending. Example: architecto

Sender ID Onayla

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/admin/sender-ids/564/approve" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/sender-ids/564/approve"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/sender-ids/564/approve';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/sender-ids/564/approve'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili (idempotent: zaten approved ise de 200)):



 

Example response (403, Yetki yok):



 

Example response (404, Bulunamadi):



 

Request      

POST v1/admin/sender-ids/{id}/approve

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the sender id. Example: 564

Sender ID Reddet

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/admin/sender-ids/564/reject" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reject_reason\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/sender-ids/564/reject"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reject_reason": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/sender-ids/564/reject';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'reject_reason' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/sender-ids/564/reject'
payload = {
    "reject_reason": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Example response (404, Bulunamadi):



 

Example response (422, Validation hatasi):



 

Request      

POST v1/admin/sender-ids/{id}/reject

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the sender id. Example: 564

Body Parameters

reject_reason   string     

Red sebebi (5-500 karakter). Example: architecto

Admin - Tenant Yonetimi

Tenant Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/tenants" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/tenants"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/tenants';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/tenants'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok (super_admin gerekli)):



 

Request      

GET v1/admin/tenants

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Tenant Detay

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/tenants/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/tenants/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/tenants/564';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/tenants/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Example response (404, Tenant bulunamadi):



 

Request      

GET v1/admin/tenants/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: 564

DLR Toggle

requires authentication

Example request:
curl --request PATCH \
    "https://api.smsmerkezi.net/v1/admin/tenants/564/dlr" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"enabled\": true
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/tenants/564/dlr"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/tenants/564/dlr';
$response = $client->patch(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/tenants/564/dlr'
payload = {
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Example response (404, Tenant bulunamadi):



 

Example response (422, Validation hatasi):



 

Request      

PATCH v1/admin/tenants/{id}/dlr

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: 564

Body Parameters

enabled   boolean     

DLR polling aktif/pasif. Example: true

Gateway Set

requires authentication

Example request:
curl --request PATCH \
    "https://api.smsmerkezi.net/v1/admin/tenants/564/gateway" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"gateway\": \"netgsm\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/tenants/564/gateway"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "gateway": "netgsm"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/tenants/564/gateway';
$response = $client->patch(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'gateway' => 'netgsm',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/tenants/564/gateway'
payload = {
    "gateway": "netgsm"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Example response (404, Tenant bulunamadi):



 

Example response (422, Validation hatasi):



 

Request      

PATCH v1/admin/tenants/{id}/gateway

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: 564

Body Parameters

gateway   string     

kobikom|netgsm|mock. Example: netgsm

Auth API

Login (mobil/SPA)

requires authentication

Email + sifre ile token alir. 2FA aktif kullanicilar icin "challenge_token" doner; istemci /v1/auth/two-factor/challenge'a kodu gonderir. KVKK onayi eksik kullanicilar 422 + "kvkk_required" doner, /v1/auth/kvkk-consent'e yonlendirilir.

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/auth/login" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"ali@firma.com\",
    \"password\": \"GucluParola2026!\",
    \"device_name\": \"iPhone 16\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/auth/login"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "ali@firma.com",
    "password": "GucluParola2026!",
    "device_name": "iPhone 16"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/auth/login';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'ali@firma.com',
            'password' => 'GucluParola2026!',
            'device_name' => 'iPhone 16',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/auth/login'
payload = {
    "email": "ali@firma.com",
    "password": "GucluParola2026!",
    "device_name": "iPhone 16"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
content-type: application/problem+json
cache-control: no-cache, private
x-ratelimit-limit: 30
x-ratelimit-remaining: 29
 

{
    "type": "https://smsmerkezi.net/errors/unauthorized",
    "title": "Unauthorized",
    "status": 401,
    "detail": "Email veya sifre hatali.",
    "instance": "/v1/auth/login"
}
 

Request      

POST v1/auth/login

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

Email. Example: ali@firma.com

password   string     

Sifre. Example: GucluParola2026!

device_name   string  optional    

Token tanimi (cihaz adi). Example: iPhone 16

Register (mobil/SPA)

requires authentication

Yeni tenant + admin user yaratir, KVKK consent timestamp + IP kaydeder, email verification mail tetikler ve token doner.

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/auth/register" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"company_name\": \"Akin Tekstil A.S.\",
    \"name\": \"Ali Akin\",
    \"email\": \"ali@akintekstil.com\",
    \"password\": \"|]|{+-\",
    \"phone\": \"+905551234567\",
    \"kvkk_consent\": false,
    \"device_name\": \"iPhone 16\",
    \"password_confirmation\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/auth/register"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "company_name": "Akin Tekstil A.S.",
    "name": "Ali Akin",
    "email": "ali@akintekstil.com",
    "password": "|]|{+-",
    "phone": "+905551234567",
    "kvkk_consent": false,
    "device_name": "iPhone 16",
    "password_confirmation": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/auth/register';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'company_name' => 'Akin Tekstil A.S.',
            'name' => 'Ali Akin',
            'email' => 'ali@akintekstil.com',
            'password' => '|]|{+-',
            'phone' => '+905551234567',
            'kvkk_consent' => false,
            'device_name' => 'iPhone 16',
            'password_confirmation' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/auth/register'
payload = {
    "company_name": "Akin Tekstil A.S.",
    "name": "Ali Akin",
    "email": "ali@akintekstil.com",
    "password": "|]|{+-",
    "phone": "+905551234567",
    "kvkk_consent": false,
    "device_name": "iPhone 16",
    "password_confirmation": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 28
 

{
    "message": "parola doğrulaması eşleşmiyor. (and 2 more errors)",
    "errors": {
        "password": [
            "parola doğrulaması eşleşmiyor.",
            "parola en az 8 karakter olmalıdır."
        ],
        "kvkk_consent": [
            "KVKK aydinlatma metnini onaylamaniz gerekir."
        ]
    }
}
 

Request      

POST v1/auth/register

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

company_name   string     

Firma adi. Example: Akin Tekstil A.S.

name   string     

Ad Soyad. Example: Ali Akin

email   string     

Email. Example: ali@akintekstil.com

password   string     

Min 8, karisik (Password::defaults). Example: |]|{+-

phone   string  optional    

Telefon (opsiyonel). Example: +905551234567

kvkk_consent   boolean     

Aydinlatma metni onayi. Example: false

device_name   string  optional    

Cihaz adi (token name). Example: iPhone 16

password_confirmation   string     

password ile ayni. Example: architecto

Two-Factor Challenge (mobil/SPA)

requires authentication

/v1/auth/login donen challenge_token ile birlikte TOTP code veya recovery_code gonderilir. Basariliysa token doner.

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/auth/two-factor/challenge" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"challenge_token\": \"architecto\",
    \"code\": \"123456\",
    \"recovery_code\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/auth/two-factor/challenge"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "challenge_token": "architecto",
    "code": "123456",
    "recovery_code": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/auth/two-factor/challenge';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'challenge_token' => 'architecto',
            'code' => '123456',
            'recovery_code' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/auth/two-factor/challenge'
payload = {
    "challenge_token": "architecto",
    "code": "123456",
    "recovery_code": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 10
x-ratelimit-remaining: 9
 

{
    "message": "challenge token 36 karakter olmalıdır.",
    "errors": {
        "challenge_token": [
            "challenge token 36 karakter olmalıdır."
        ]
    }
}
 

Request      

POST v1/auth/two-factor/challenge

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

challenge_token   string     

Login'den donen UUID. Example: architecto

code   string  optional    

TOTP 6 hanesi. Example: 123456

recovery_code   string  optional    

Recovery code (10 char). Example: architecto

requires authentication

Eski/migrate edilmis kullanici KVKK onayi eksikse /login'den donen consent_token ile onay verir. Basariliysa final access token doner.

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/auth/kvkk-consent" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"consent_token\": \"architecto\",
    \"kvkk_consent\": false,
    \"device_name\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/auth/kvkk-consent"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "consent_token": "architecto",
    "kvkk_consent": false,
    "device_name": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/auth/kvkk-consent';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'consent_token' => 'architecto',
            'kvkk_consent' => false,
            'device_name' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/auth/kvkk-consent'
payload = {
    "consent_token": "architecto",
    "kvkk_consent": false,
    "device_name": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 26
 

{
    "message": "consent token 36 karakter olmalıdır. (and 1 more error)",
    "errors": {
        "consent_token": [
            "consent token 36 karakter olmalıdır."
        ],
        "kvkk_consent": [
            "Devam etmek icin KVKK aydinlatma metnini onaylamaniz gerekir."
        ]
    }
}
 

Logout (mobil/SPA)

requires authentication

Mevcut access token'i kalici olarak iptal eder.

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/auth/logout" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/auth/logout"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/auth/logout';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/auth/logout'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/auth/logout

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Current User (me)

requires authentication

Mevcut access token'in sahibi user'i + tenant + permissions doner. Flutter init icin zorunlu — splash sonrasi uygulama state'i hidrate edilir.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/auth/me" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/auth/me"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/auth/me';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/auth/me'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/auth/me

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Genel

GET v1/health

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/health" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/health"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/health';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/health'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "status": "ok",
    "service": "smsmerkezi-api",
    "version": "v1",
    "env": "production",
    "time": "2026-05-21T20:23:13+03:00",
    "phase": "faz5"
}
 

Request      

GET v1/health

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST v1/webhooks/cozum-merkezi

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/webhooks/cozum-merkezi" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/webhooks/cozum-merkezi"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/webhooks/cozum-merkezi';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/webhooks/cozum-merkezi'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (503):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "error": "webhook_not_configured"
}
 

Request      

POST v1/webhooks/cozum-merkezi

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET v1/panel/einvoices

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/einvoices" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/einvoices"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/einvoices';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/einvoices'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/einvoices

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET v1/panel/einvoices/{id}

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/einvoices/16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/einvoices/16"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/einvoices/16';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/einvoices/16'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/einvoices/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the einvoice. Example: 16

GET v1/panel/reseller/children

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/reseller/children" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/reseller/children"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/reseller/children';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/reseller/children'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/reseller/children

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST v1/panel/reseller/children

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/reseller/children" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"slug\": \"n\",
    \"admin_name\": \"g\",
    \"admin_email\": \"rowan.gulgowski@example.com\",
    \"admin_password\": \"d\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/reseller/children"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "slug": "n",
    "admin_name": "g",
    "admin_email": "rowan.gulgowski@example.com",
    "admin_password": "d"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/reseller/children';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'b',
            'slug' => 'n',
            'admin_name' => 'g',
            'admin_email' => 'rowan.gulgowski@example.com',
            'admin_password' => 'd',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/reseller/children'
payload = {
    "name": "b",
    "slug": "n",
    "admin_name": "g",
    "admin_email": "rowan.gulgowski@example.com",
    "admin_password": "d"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/panel/reseller/children

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

value 120 karakterden uzun olmamalıdır. Example: b

slug   string     

Must contain only letters, numbers, dashes and underscores. value 60 karakterden uzun olmamalıdır. Example: n

admin_name   string     

value 120 karakterden uzun olmamalıdır. Example: g

admin_email   string     

value geçerli bir e-posta adresi olmalıdır. value 160 karakterden uzun olmamalıdır. Example: rowan.gulgowski@example.com

admin_password   string     

value en az 10 karakter olmalıdır. value 120 karakterden uzun olmamalıdır. Example: d

GET v1/panel/reseller/children/{tenant}

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/reseller/children/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/reseller/children/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/reseller/children/564';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/reseller/children/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/reseller/children/{tenant}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

tenant   string     

Example: 564

GET v1/panel/reseller/transfers

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/reseller/transfers" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/reseller/transfers"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/reseller/transfers';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/reseller/transfers'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/reseller/transfers

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST v1/panel/reseller/transfers

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/reseller/transfers" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"child_tenant_id\": 16,
    \"amount\": 22,
    \"kind\": \"sms\",
    \"note\": \"g\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/reseller/transfers"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "child_tenant_id": 16,
    "amount": 22,
    "kind": "sms",
    "note": "g"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/reseller/transfers';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'child_tenant_id' => 16,
            'amount' => 22,
            'kind' => 'sms',
            'note' => 'g',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/reseller/transfers'
payload = {
    "child_tenant_id": 16,
    "amount": 22,
    "kind": "sms",
    "note": "g"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/panel/reseller/transfers

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

child_tenant_id   integer     

Example: 16

amount   integer     

value en az 1 olmalıdır. value 10000000 değerinden büyük olmamalıdır. Example: 22

kind   string  optional    

Example: sms

Must be one of:
  • sms
  • whatsapp
  • telegram
note   string  optional    

value 500 karakterden uzun olmamalıdır. Example: g

POST v1/panel/reseller/transfers/{transfer}/reverse

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/reseller/transfers/564/reverse" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"note\": \"b\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/reseller/transfers/564/reverse"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "note": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/reseller/transfers/564/reverse';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'note' => 'b',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/reseller/transfers/564/reverse'
payload = {
    "note": "b"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/panel/reseller/transfers/{transfer}/reverse

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

transfer   string     

The transfer. Example: 564

Body Parameters

note   string  optional    

value 500 karakterden uzun olmamalıdır. Example: b

Tescil Belgesi Indir (binary stream)

requires authentication

Inertia karsiligindan farkli: Response StreamedResponse, problem+json fallback Request reddedildiginde donulur.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/admin/sender-ids/564/document" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/admin/sender-ids/564/document"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/admin/sender-ids/564/document';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/admin/sender-ids/564/document'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/admin/sender-ids/{id}/document

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the sender id. Example: 564

POST v1/wa/qr/event

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/wa/qr/event" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"session_id\": \"b\",
    \"event\": \"disconnected\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/wa/qr/event"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "session_id": "b",
    "event": "disconnected"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/wa/qr/event';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'session_id' => 'b',
            'event' => 'disconnected',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/wa/qr/event'
payload = {
    "session_id": "b",
    "event": "disconnected"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "ok": false,
    "error": "unauthorized"
}
 

Request      

POST v1/wa/qr/event

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

session_id   string     

value 64 karakterden uzun olmamalıdır. Example: b

event   string     

Example: disconnected

Must be one of:
  • qr_ready
  • connected
  • disconnected
  • message_status
data   object  optional    

Panel - 2FA

2FA Durum

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/2fa" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/2fa"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/2fa';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/2fa'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "enabled": false,
        "pending_confirmation": false,
        "recovery_codes_count": 0,
        "confirmed_at": null
    }
}
 

Request      

GET v1/panel/2fa

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

2FA Setup Verisi (QR + secret)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/2fa/setup" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/2fa/setup"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/2fa/setup';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/2fa/setup'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (422, Aktif veya pending degil):



 

Request      

GET v1/panel/2fa/setup

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

2FA Setup Baslat

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/2fa/enable" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/2fa/enable"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/2fa/enable';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/2fa/enable'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (409, Zaten aktif):



 

Request      

POST v1/panel/2fa/enable

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

2FA Onayla

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/2fa/confirm" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"code\": \"123456\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/2fa/confirm"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "code": "123456"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/2fa/confirm';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'code' => '123456',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/2fa/confirm'
payload = {
    "code": "123456"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili — recovery_codes tek sefer plain):



 

Example response (409, Zaten aktif):



 

Example response (422, Kod hatali):



 

Request      

POST v1/panel/2fa/confirm

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

code   string     

6 haneli kod. Example: 123456

Recovery Kodlari Yenile

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/2fa/recovery-codes/regenerate" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"password\": \"|]|{+-\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/2fa/recovery-codes/regenerate"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "password": "|]|{+-"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/2fa/recovery-codes/regenerate';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'password' => '|]|{+-',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/2fa/recovery-codes/regenerate'
payload = {
    "password": "|]|{+-"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (422, Sifre hatali / 2FA aktif degil):



 

Request      

POST v1/panel/2fa/recovery-codes/regenerate

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

password   string     

Mevcut sifre re-confirm. Example: |]|{+-

2FA Kapat

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/2fa" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"password\": \"|]|{+-\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/2fa"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "password": "|]|{+-"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/2fa';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'password' => '|]|{+-',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/2fa'
payload = {
    "password": "|]|{+-"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (422, Sifre hatali):



 

Request      

DELETE v1/panel/2fa

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

password   string     

Mevcut sifre re-confirm. Example: |]|{+-

Panel - Audit Log

Audit Log Listesi

requires authentication

Tenant'in kendi olay izi (login, sms.send, contact.created, vs.).

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/audit-logs?user_id=12&action=login&entity_type=Contact&date_from=2026-05-01&date_to=2026-05-11&per_page=100&cursor=eyJpZCI6OTl9" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/audit-logs"
);

const params = {
    "user_id": "12",
    "action": "login",
    "entity_type": "Contact",
    "date_from": "2026-05-01",
    "date_to": "2026-05-11",
    "per_page": "100",
    "cursor": "eyJpZCI6OTl9",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/audit-logs';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'user_id' => '12',
            'action' => 'login',
            'entity_type' => 'Contact',
            'date_from' => '2026-05-01',
            'date_to' => '2026-05-11',
            'per_page' => '100',
            'cursor' => 'eyJpZCI6OTl9',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/audit-logs'
params = {
  'user_id': '12',
  'action': 'login',
  'entity_type': 'Contact',
  'date_from': '2026-05-01',
  'date_to': '2026-05-11',
  'per_page': '100',
  'cursor': 'eyJpZCI6OTl9',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):



 

Request      

GET v1/panel/audit-logs

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

user_id   integer  optional    

Belirli kullanici filtresi. Example: 12

action   string  optional    

Olay adi (esitlik). Example: login

entity_type   string  optional    

Entity sinif adi (like). Example: Contact

date_from   string  optional    

ISO tarih. Example: 2026-05-01

date_to   string  optional    

ISO tarih. Example: 2026-05-11

per_page   integer  optional    

1..200 (default 50). Example: 100

cursor   string  optional    

Sonraki sayfa cursor. Example: eyJpZCI6OTl9

Audit Log Detay

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/audit-logs/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/audit-logs/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/audit-logs/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/audit-logs/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (404, Bulunamadi):



 

Request      

GET v1/panel/audit-logs/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Audit log ID. Example: 1

Panel - Ayarlar

Ayarlar Ozeti

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/settings" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/settings"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/settings';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/settings'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "tenant": {},
        "user": {},
        "settings": {}
    }
}
 

Request      

GET v1/panel/settings

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Profil Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/settings/profile" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Ahmet Yilmaz\",
    \"tenant_name\": \"ABC Sirket\",
    \"default_originator\": \"ABCSIRKET\",
    \"webhook_url\": \"https:\\/\\/example.com\\/wh\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/settings/profile"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Ahmet Yilmaz",
    "tenant_name": "ABC Sirket",
    "default_originator": "ABCSIRKET",
    "webhook_url": "https:\/\/example.com\/wh"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/settings/profile';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Ahmet Yilmaz',
            'tenant_name' => 'ABC Sirket',
            'default_originator' => 'ABCSIRKET',
            'webhook_url' => 'https://example.com/wh',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/settings/profile'
payload = {
    "name": "Ahmet Yilmaz",
    "tenant_name": "ABC Sirket",
    "default_originator": "ABCSIRKET",
    "webhook_url": "https:\/\/example.com\/wh"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Request      

PUT v1/panel/settings/profile

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Kullanici adi. Example: Ahmet Yilmaz

tenant_name   string  optional    

(admin only) Tenant adi. Example: ABC Sirket

default_originator   string  optional    

(admin only) Varsayilan gonderici. Example: ABCSIRKET

webhook_url   string  optional    

(admin only) URL. Example: https://example.com/wh

Sifre Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/settings/password" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"current_password\": \"architecto\",
    \"new_password\": \"yenisifre12345\",
    \"new_password_confirmation\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/settings/password"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "current_password": "architecto",
    "new_password": "yenisifre12345",
    "new_password_confirmation": "architecto"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/settings/password';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'current_password' => 'architecto',
            'new_password' => 'yenisifre12345',
            'new_password_confirmation' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/settings/password'
payload = {
    "current_password": "architecto",
    "new_password": "yenisifre12345",
    "new_password_confirmation": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (422, Mevcut sifre hatali):



 

Request      

PUT v1/panel/settings/password

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

current_password   string     

Mevcut sifre. Example: architecto

new_password   string     

Yeni sifre (min 12). Example: yenisifre12345

new_password_confirmation   string     

Yeni sifre tekrar. Example: architecto

KVKK Riza Geri Cek

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/settings/kvkk-revoke" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reason\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/settings/kvkk-revoke"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reason": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/settings/kvkk-revoke';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'reason' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/settings/kvkk-revoke'
payload = {
    "reason": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (202, Basarili):



 

Request      

POST v1/panel/settings/kvkk-revoke

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

reason   string  optional    

Aciklama (max 500). Example: architecto

Panel - Bakiye

Bakiye Ozeti

requires authentication

Mevcut bakiye, rezerve ve kullanilabilir tutar + yasam boyu yukleme/tuketim.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/balance" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/balance"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/balance';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/balance'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "balance": 1500,
        "reserved": 50,
        "available": 1450,
        "last_topup_at": "2026-05-10T12:34:00+00:00"
    },
    "stats": {
        "lifetime_topup": 5000,
        "lifetime_consumed": 3500
    }
}
 

Request      

GET v1/panel/balance

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Bakiye Hareket Gecmisi

requires authentication

Append-only ledger (topup/send/reserve/release/refund/adjustment/expiry).

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/balance/history?reason=topup&date_from=2026-04-01&date_to=2026-05-11&per_page=50&cursor=eyJpZCI6MTAwfQ" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/balance/history"
);

const params = {
    "reason": "topup",
    "date_from": "2026-04-01",
    "date_to": "2026-05-11",
    "per_page": "50",
    "cursor": "eyJpZCI6MTAwfQ",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/balance/history';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'reason' => 'topup',
            'date_from' => '2026-04-01',
            'date_to' => '2026-05-11',
            'per_page' => '50',
            'cursor' => 'eyJpZCI6MTAwfQ',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/balance/history'
params = {
  'reason': 'topup',
  'date_from': '2026-04-01',
  'date_to': '2026-05-11',
  'per_page': '50',
  'cursor': 'eyJpZCI6MTAwfQ',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "reason": "topup",
            "reason_label": "Bakiye Yukleme",
            "delta": 1000,
            "balance_after": 1500,
            "reference_id": null,
            "created_at": "2026-05-10T12:34:00+00:00"
        }
    ],
    "meta": {
        "next_cursor": null,
        "prev_cursor": null,
        "has_more": false,
        "per_page": 30
    }
}
 

Request      

GET v1/panel/balance/history

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

reason   string  optional    

all|topup|send|reserve|release|refund|adjustment|expiry. Example: topup

date_from   string  optional    

ISO tarih (YYYY-MM-DD). Example: 2026-04-01

date_to   string  optional    

ISO tarih (YYYY-MM-DD). Example: 2026-05-11

per_page   integer  optional    

1..100 (default 30). Example: 50

cursor   string  optional    

Sonraki sayfa cursor. Example: eyJpZCI6MTAwfQ

Panel - Bakiye Uyarilari

Bakiye Uyari Config

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/balance-alert" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/balance-alert"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/balance-alert';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/balance-alert'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "thresholds": [
            500,
            100
        ],
        "emails": [
            "ops@example.com"
        ],
        "last_triggered_threshold": null,
        "current_balance": 1500,
        "available_balance": 1450,
        "webhook_subscribed_balance_low": false
    }
}
 

Request      

GET v1/panel/balance-alert

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Bakiye Uyari Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/balance-alert" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"thresholds\": [
        500,
        100
    ],
    \"emails\": [
        \"ops@example.com\"
    ]
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/balance-alert"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "thresholds": [
        500,
        100
    ],
    "emails": [
        "ops@example.com"
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/balance-alert';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'thresholds' => [
                500,
                100,
            ],
            'emails' => [
                'ops@example.com',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/balance-alert'
payload = {
    "thresholds": [
        500,
        100
    ],
    "emails": [
        "ops@example.com"
    ]
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):


{
    "data": {
        "thresholds": [
            500,
            100
        ],
        "emails": [
            "ops@example.com"
        ]
    }
}
 

Example response (403, viewer/operator):



 

Request      

PUT v1/panel/balance-alert

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

thresholds   integer[]     

Esik dizisi (1..5 adet).

emails   string[]  optional    

Email listesi (max 5).

Test Alarmi Tetikle

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/balance-alert/test" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/balance-alert/test"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/balance-alert/test';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/balance-alert/test'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (202, Basarili):


{
    "data": {
        "queued": true,
        "threshold": 100,
        "current_balance": 1500
    }
}
 

Example response (422, Esik tanimsiz):


{
    "type": "...",
    "title": "Validation Error",
    "status": 422
}
 

Request      

POST v1/panel/balance-alert/test

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Panel - Bildirimler

Bildirim Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/notifications" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/notifications"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/notifications';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/notifications'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Request      

GET v1/panel/notifications

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Son Bildirimler (Header Zil)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/notifications/recent" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/notifications/recent"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/notifications/recent';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/notifications/recent'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Request      

GET v1/panel/notifications/recent

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Tumunu Okundu Isaretle

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/notifications/read-all" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/notifications/read-all"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/notifications/read-all';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/notifications/read-all'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "marked_count": 5
    }
}
 

Request      

POST v1/panel/notifications/read-all

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Okundu Isaretle

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-.../read" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-.../read"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-.../read';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-.../read'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "id": "...",
        "read_at": "..."
    }
}
 

Example response (404, Bulunamadi):



 

Request      

POST v1/panel/notifications/{id}/read

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

Bildirim UUID. Example: 0190b8a4-...

Bildirim Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-..." \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-..."
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-...';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/notifications/0190b8a4-...'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Basarili):

Empty response
 

Example response (404, Bulunamadi):



 

Request      

DELETE v1/panel/notifications/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

Bildirim UUID. Example: 0190b8a4-...

Panel - Dogum Gunu

Dogum Gunu Ayari + Listeler

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/birthday" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/birthday"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/birthday';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/birthday'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "setting": {
            "id": 1,
            "is_active": true,
            "template_id": null,
            "template_name": null,
            "custom_body": "Iyi ki dogdun!",
            "sender_id_id": 2,
            "sender_id_label": "FIRMA",
            "send_time": "09:00",
            "last_run_date": null
        },
        "templates": [
            {
                "id": 1,
                "name": "Tebrik 1"
            }
        ],
        "sender_ids": [
            {
                "id": 2,
                "label": "FIRMA"
            }
        ]
    }
}
 

Request      

GET v1/panel/birthday

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Dogum Gunu Ayarini Guncelle/Olustur (upsert)

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/birthday" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"is_active\": true,
    \"template_id\": null,
    \"custom_body\": \"\\\"Iyi ki dogdun!\\\"\",
    \"sender_id_id\": 2,
    \"send_time\": \"\\\"09:00\\\"\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/birthday"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "is_active": true,
    "template_id": null,
    "custom_body": "\"Iyi ki dogdun!\"",
    "sender_id_id": 2,
    "send_time": "\"09:00\""
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/birthday';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'is_active' => true,
            'template_id' => null,
            'custom_body' => '"Iyi ki dogdun!"',
            'sender_id_id' => 2,
            'send_time' => '"09:00"',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/birthday'
payload = {
    "is_active": true,
    "template_id": null,
    "custom_body": "\"Iyi ki dogdun!\"",
    "sender_id_id": 2,
    "send_time": "\"09:00\""
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):


{
    "data": {
        "id": 1,
        "is_active": true,
        "template_id": null,
        "template_name": null,
        "custom_body": "Iyi ki dogdun!",
        "sender_id_id": 2,
        "sender_id_label": "FIRMA",
        "send_time": "09:00",
        "last_run_date": null
    }
}
 

Request      

PUT v1/panel/birthday

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

is_active   boolean  optional    

required. Example: true

template_id   integer  optional    

nullable.

custom_body   string  optional    

nullable. Example: "Iyi ki dogdun!"

sender_id_id   integer  optional    

nullable. Example: 2

send_time   string     

H:i (07:00 - 12:00). Example: "09:00"

Bugun Dogum Gunu Olan Kontaklar

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/birthday/today" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/birthday/today"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/birthday/today';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/birthday/today'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "name": "Ali",
            "msisdn": "+905551234567",
            "birth_date": "1990-05-15"
        }
    ]
}
 

Request      

GET v1/panel/birthday/today

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Onumuzdeki N Gun Dogum Gunleri (varsayilan 30)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/birthday/upcoming?days=30" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/birthday/upcoming"
);

const params = {
    "days": "30",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/birthday/upcoming';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'days' => '30',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/birthday/upcoming'
params = {
  'days': '30',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "date": "2026-05-15",
            "contacts": [
                {
                    "id": 1,
                    "name": "Ali",
                    "msisdn": "+905551234567",
                    "birth_date": "1990-05-15"
                }
            ]
        }
    ]
}
 

Request      

GET v1/panel/birthday/upcoming

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

days   integer  optional    

nullable. 1-90, varsayilan 30. Example: 30

Son Dispatch Loglari (audit/historik)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/birthday/logs?limit=50" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/birthday/logs"
);

const params = {
    "limit": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/birthday/logs';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/birthday/logs'
params = {
  'limit': '50',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "contact_id": 5,
            "msisdn": "+905551234567",
            "sent_on": "2026-05-14",
            "created_at": "2026-05-14T09:00:00+00:00"
        }
    ]
}
 

Request      

GET v1/panel/birthday/logs

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

limit   integer  optional    

nullable. 1-200, varsayilan 50. Example: 50

Panel - Doktor Kampanyalari

Doktor Kampanya Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/campaigns" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/campaigns"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/campaigns';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/campaigns'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "name": "Hatirlatma",
            "doctor_id": 2,
            "schedule_type": "daily",
            "schedule_time": "10:00",
            "is_active": true
        }
    ]
}
 

Request      

GET v1/panel/campaigns

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Yeni Kampanya Olustur

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/campaigns" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"doctor_id\": 1,
    \"name\": \"Hatirlatma\",
    \"template_id\": 3,
    \"custom_body\": \"Sayin {{name}} hatirlatmadir.\",
    \"sender_id_id\": 5,
    \"schedule_type\": \"weekly\",
    \"schedule_days\": [
        1,
        3,
        5
    ],
    \"schedule_day_of_month\": 15,
    \"schedule_time\": \"10:00\",
    \"is_active\": \"true\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/campaigns"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "doctor_id": 1,
    "name": "Hatirlatma",
    "template_id": 3,
    "custom_body": "Sayin {{name}} hatirlatmadir.",
    "sender_id_id": 5,
    "schedule_type": "weekly",
    "schedule_days": [
        1,
        3,
        5
    ],
    "schedule_day_of_month": 15,
    "schedule_time": "10:00",
    "is_active": "true"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/campaigns';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'doctor_id' => 1,
            'name' => 'Hatirlatma',
            'template_id' => 3,
            'custom_body' => 'Sayin {{name}} hatirlatmadir.',
            'sender_id_id' => 5,
            'schedule_type' => 'weekly',
            'schedule_days' => [
                1,
                3,
                5,
            ],
            'schedule_day_of_month' => 15,
            'schedule_time' => '10:00',
            'is_active' => 'true',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/campaigns'
payload = {
    "doctor_id": 1,
    "name": "Hatirlatma",
    "template_id": 3,
    "custom_body": "Sayin {{name}} hatirlatmadir.",
    "sender_id_id": 5,
    "schedule_type": "weekly",
    "schedule_days": [
        1,
        3,
        5
    ],
    "schedule_day_of_month": 15,
    "schedule_time": "10:00",
    "is_active": "true"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, Basarili):



 

Example response (422, Validation):


{
    "type": "https://smsmerkezi.net/errors/validation-error",
    "title": "Validation Error",
    "status": 422
}
 

Request      

POST v1/panel/campaigns

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

doctor_id   integer  optional    

required. Example: 1

name   string     

max 120, unique per (tenant, doctor). Example: Hatirlatma

template_id   integer  optional    

nullable, XOR with custom_body. Example: 3

custom_body   string  optional    

nullable max 1000, XOR with template_id. Example: Sayin {{name}} hatirlatmadir.

sender_id_id   integer  optional    

nullable, must be approved sender id of this tenant. Example: 5

schedule_type   string  optional    

required, one of daily|weekly|monthly|once. Example: weekly

schedule_days   integer[]     

if schedule_type=weekly, items 1..7 (1=Mon).

schedule_day_of_month   integer     

if schedule_type=monthly, 1..28. Example: 15

schedule_time   string     

H:i. Example: 10:00

is_active   boolean.  optional    

Example: true

Kampanya Detayi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/campaigns/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/campaigns/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/campaigns/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/campaigns/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/campaigns/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Kampanya Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/campaigns/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/campaigns/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/campaigns/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/campaigns/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

PUT v1/panel/campaigns/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Kampanya Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/campaigns/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/campaigns/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/campaigns/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/campaigns/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204):

Empty response
 

Request      

DELETE v1/panel/campaigns/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Panel - Doktorlar

Doktor Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/doctors" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/doctors"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/doctors';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/doctors'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "name": "Dr. Ayse Yilmaz",
            "branch": "Kardiyoloji",
            "phone_internal": "1001",
            "phone_external": "05551112233",
            "sms_rule_id": 2,
            "priority": 0,
            "notes": null,
            "is_active": true,
            "created_at": "2026-05-14T08:00:00+00:00"
        }
    ]
}
 

Request      

GET v1/panel/doctors

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Yeni Doktor Olustur

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/doctors" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Dr. Ayse Yilmaz\",
    \"branch\": \"Kardiyoloji\",
    \"phone_internal\": \"1001\",
    \"phone_external\": \"05551112233\",
    \"sms_rule_id\": 2,
    \"priority\": 0,
    \"notes\": \"Pazartesi ozel mesai\",
    \"is_active\": \"true\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/doctors"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Dr. Ayse Yilmaz",
    "branch": "Kardiyoloji",
    "phone_internal": "1001",
    "phone_external": "05551112233",
    "sms_rule_id": 2,
    "priority": 0,
    "notes": "Pazartesi ozel mesai",
    "is_active": "true"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/doctors';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Dr. Ayse Yilmaz',
            'branch' => 'Kardiyoloji',
            'phone_internal' => '1001',
            'phone_external' => '05551112233',
            'sms_rule_id' => 2,
            'priority' => 0,
            'notes' => 'Pazartesi ozel mesai',
            'is_active' => 'true',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/doctors'
payload = {
    "name": "Dr. Ayse Yilmaz",
    "branch": "Kardiyoloji",
    "phone_internal": "1001",
    "phone_external": "05551112233",
    "sms_rule_id": 2,
    "priority": 0,
    "notes": "Pazartesi ozel mesai",
    "is_active": "true"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, Basarili):


{
    "data": {
        "id": 1,
        "name": "..."
    }
}
 

Example response (422, Validation):


{
    "type": "https://smsmerkezi.net/errors/validation-error",
    "title": "Validation Error",
    "status": 422,
    "detail": "...",
    "instance": "/v1/panel/doctors"
}
 

Request      

POST v1/panel/doctors

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

max 120, unique per tenant. Example: Dr. Ayse Yilmaz

branch   string  optional    

nullable max 120. Example: Kardiyoloji

phone_internal   string  optional    

nullable max 20. Example: 1001

phone_external   string  optional    

nullable max 20. Example: 05551112233

sms_rule_id   integer  optional    

nullable, must belong to same tenant. Example: 2

priority   integer     

0..9999 (lower = higher priority). Example: 0

notes   string  optional    

nullable max 1000. Example: Pazartesi ozel mesai

is_active   boolean.  optional    

Example: true

Doktor Detayi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/doctors/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/doctors/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/doctors/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/doctors/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/doctors/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Doktor Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/doctors/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/doctors/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/doctors/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/doctors/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

PUT v1/panel/doctors/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Doktor Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/doctors/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/doctors/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/doctors/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/doctors/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204):

Empty response
 

Request      

DELETE v1/panel/doctors/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Panel - Gelen Kurallar

Gelen Mesaj Kurallari Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/inbound-rules" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/inbound-rules"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/inbound-rules

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Yeni Gelen Mesaj Kurali

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/inbound-rules" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"architecto\",
    \"pattern_type\": \"architecto\",
    \"pattern\": \"architecto\",
    \"channel_filter\": \"architecto\",
    \"action_type\": \"architecto\",
    \"action_payload\": [],
    \"priority\": 16,
    \"stop_processing\": \"architecto\",
    \"is_active\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/inbound-rules"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "architecto",
    "pattern_type": "architecto",
    "pattern": "architecto",
    "channel_filter": "architecto",
    "action_type": "architecto",
    "action_payload": [],
    "priority": 16,
    "stop_processing": "architecto",
    "is_active": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'architecto',
            'pattern_type' => 'architecto',
            'pattern' => 'architecto',
            'channel_filter' => 'architecto',
            'action_type' => 'architecto',
            'action_payload' => [],
            'priority' => 16,
            'stop_processing' => 'architecto',
            'is_active' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules'
payload = {
    "name": "architecto",
    "pattern_type": "architecto",
    "pattern": "architecto",
    "channel_filter": "architecto",
    "action_type": "architecto",
    "action_payload": [],
    "priority": 16,
    "stop_processing": "architecto",
    "is_active": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/panel/inbound-rules

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

max 120. Example: architecto

pattern_type   string     

one of: keyword|contains|regex. Example: architecto

pattern   string     

max 500. Example: architecto

channel_filter   string  optional    

one of: all|sms|whatsapp|telegram. Default all. Example: architecto

action_type   string     

one of: auto_reply|forward|tag|optout. Example: architecto

action_payload   object  optional    

nullable.

priority   integer  optional    

1..9999. Default 100. Example: 16

stop_processing   boolean.  optional    

Default true. Example: architecto

is_active   boolean.  optional    

Default true. Example: architecto

Kural Detayi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/inbound-rules/16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/inbound-rules/16"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules/16';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules/16'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/inbound-rules/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 16

Kural Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/inbound-rules/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/inbound-rules/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules/564';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

PUT v1/panel/inbound-rules/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the inbound rule. Example: 564

Kural Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/inbound-rules/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/inbound-rules/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules/564';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/inbound-rules/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204):

Empty response
 

Request      

DELETE v1/panel/inbound-rules/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the inbound rule. Example: 564

Panel - Kanallar

Kanal Ayarlari Ozeti

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/channels/settings" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/settings"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/settings';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/settings'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "whatsapp": {},
        "telegram": {},
        "credits": {}
    }
}
 

Request      

GET v1/panel/channels/settings

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

WhatsApp Ayarlarini Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/channels/settings/whatsapp" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"phone_number_id\": \"100000000000000\",
    \"business_account_id\": \"200000000000000\",
    \"access_token\": \"EAAB...\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/settings/whatsapp"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "phone_number_id": "100000000000000",
    "business_account_id": "200000000000000",
    "access_token": "EAAB..."
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/settings/whatsapp';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'phone_number_id' => '100000000000000',
            'business_account_id' => '200000000000000',
            'access_token' => 'EAAB...',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/settings/whatsapp'
payload = {
    "phone_number_id": "100000000000000",
    "business_account_id": "200000000000000",
    "access_token": "EAAB..."
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):


{
    "data": {
        "whatsapp": {
            "has_token": true
        }
    }
}
 

Request      

PUT v1/panel/channels/settings/whatsapp

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

phone_number_id   string  optional    

Meta phone_number_id. Example: 100000000000000

business_account_id   string  optional    

Meta business_account_id. Example: 200000000000000

access_token   string  optional    

Meta access token (saklanmaz, sadece encrypt). Example: EAAB...

Telegram Ayarlarini Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/channels/settings/telegram" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"bot_token\": \"12345:ABC-XYZ\",
    \"default_chat_id\": \"-100123456\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/settings/telegram"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "bot_token": "12345:ABC-XYZ",
    "default_chat_id": "-100123456"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/settings/telegram';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'bot_token' => '12345:ABC-XYZ',
            'default_chat_id' => '-100123456',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/settings/telegram'
payload = {
    "bot_token": "12345:ABC-XYZ",
    "default_chat_id": "-100123456"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):


{
    "data": {
        "telegram": {
            "has_token": true
        }
    }
}
 

Request      

PUT v1/panel/channels/settings/telegram

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

bot_token   string  optional    

Telegram bot token. Example: 12345:ABC-XYZ

default_chat_id   string  optional    

Varsayilan chat id. Example: -100123456

Kanal Ozeti

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/channels/architecto" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/architecto"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/architecto'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "channel": "whatsapp",
        "driver": "meta",
        "credits": 99,
        "cost": "0.15",
        "configured": true
    }
}
 

Request      

GET v1/panel/channels/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the channel. Example: architecto

channel   string     

whatsapp|telegram. Example: whatsapp

Kanal Mesaji Gonder

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"recipient\": \"905551234567\",
    \"body\": \"Merhaba\",
    \"template_name\": \"order_confirmation\",
    \"template_language\": \"tr\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "recipient": "905551234567",
    "body": "Merhaba",
    "template_name": "order_confirmation",
    "template_language": "tr"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'recipient' => '905551234567',
            'body' => 'Merhaba',
            'template_name' => 'order_confirmation',
            'template_language' => 'tr',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send'
payload = {
    "recipient": "905551234567",
    "body": "Merhaba",
    "template_name": "order_confirmation",
    "template_language": "tr"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):


{
    "data": {
        "message_id": 1,
        "status": "sent",
        "credits_after": 99
    }
}
 

Request      

POST v1/panel/channels/{channel}/send

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

channel   string     

whatsapp|telegram. Example: whatsapp

Body Parameters

recipient   string     

Alici (msisdn veya chat_id). Example: 905551234567

body   string     

Mesaj govdesi (max 4096). Example: Merhaba

template_name   string  optional    

Opsiyonel WA template adi. Example: order_confirmation

template_language   string  optional    

Opsiyonel template dili (default tr). Example: tr

Kanal Etkilesimli Mesaj Gonder (WA button/list)

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-interactive" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"recipient\": \"905551234567\",
    \"body\": \"Lutfen secim yapin\",
    \"type\": \"button\",
    \"header\": \"Siparis\",
    \"footer\": \"SMS Merkezi\",
    \"button_text\": \"Sec\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-interactive"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "recipient": "905551234567",
    "body": "Lutfen secim yapin",
    "type": "button",
    "header": "Siparis",
    "footer": "SMS Merkezi",
    "button_text": "Sec"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-interactive';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'recipient' => '905551234567',
            'body' => 'Lutfen secim yapin',
            'type' => 'button',
            'header' => 'Siparis',
            'footer' => 'SMS Merkezi',
            'button_text' => 'Sec',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-interactive'
payload = {
    "recipient": "905551234567",
    "body": "Lutfen secim yapin",
    "type": "button",
    "header": "Siparis",
    "footer": "SMS Merkezi",
    "button_text": "Sec"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):


{
    "data": {
        "message_id": 1,
        "status": "sent",
        "credits_after": 99,
        "channel": "whatsapp",
        "interactive_type": "button"
    }
}
 

Request      

POST v1/panel/channels/{channel}/send-interactive

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

channel   string     

Sadece whatsapp destekli (telegram 422 doner). Example: whatsapp

Body Parameters

recipient   string     

Alici msisdn. Example: 905551234567

body   string     

Govde metni (max 1024). Example: Lutfen secim yapin

type   string     

Etkilesim tipi: button veya list. Example: button

header   string  optional    

Opsiyonel header (max 60). Example: Siparis

footer   string  optional    

Opsiyonel footer (max 60). Example: SMS Merkezi

buttons   object[]  optional    

button tipinde 1-3 dugme. id+title zorunlu.

button_text   string  optional    

list tipinde, listeyi acan buton metni. Example: Sec

sections   object[]  optional    

list tipinde 1+ section (title + rows).

Kanal Medya Mesaji Gonder (WA image/document/video/audio + TG photo)

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-media" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"recipient\": \"905551234567\",
    \"type\": \"image\",
    \"url\": \"https:\\/\\/cdn.example.com\\/file.jpg\",
    \"caption\": \"Faturanizin onizlemesi\",
    \"filename\": \"fatura.pdf\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-media"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "recipient": "905551234567",
    "type": "image",
    "url": "https:\/\/cdn.example.com\/file.jpg",
    "caption": "Faturanizin onizlemesi",
    "filename": "fatura.pdf"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-media';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'recipient' => '905551234567',
            'type' => 'image',
            'url' => 'https://cdn.example.com/file.jpg',
            'caption' => 'Faturanizin onizlemesi',
            'filename' => 'fatura.pdf',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/send-media'
payload = {
    "recipient": "905551234567",
    "type": "image",
    "url": "https:\/\/cdn.example.com\/file.jpg",
    "caption": "Faturanizin onizlemesi",
    "filename": "fatura.pdf"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):


{
    "data": {
        "message_id": 1,
        "status": "sent",
        "credits_after": 99,
        "channel": "whatsapp",
        "media_type": "image"
    }
}
 

Request      

POST v1/panel/channels/{channel}/send-media

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

channel   string     

whatsapp|telegram. Example: whatsapp

Body Parameters

recipient   string     

Alici (msisdn veya chat_id). Example: 905551234567

type   string     

Medya tipi. WA: image|document|video|audio. TG: image (photo). Example: image

url   string     

HTTPS medya URL (max 2048). Example: https://cdn.example.com/file.jpg

caption   string  optional    

Opsiyonel altyazi (audio haric, max 1024). Example: Faturanizin onizlemesi

filename   string  optional    

Opsiyonel dosya adi (sadece document, max 240). Example: fatura.pdf

Panel - Kontaklar

Kontak Listesi

requires authentication

Tenant'in kontak rehberini cursor pagination ile listeler.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/contacts?search=ahmet&tag=vip&status=active&province=Istanbul&sector=gida&per_page=50&cursor=eyJpZCI6MTIzfQ" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/contacts"
);

const params = {
    "search": "ahmet",
    "tag": "vip",
    "status": "active",
    "province": "Istanbul",
    "sector": "gida",
    "per_page": "50",
    "cursor": "eyJpZCI6MTIzfQ",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/contacts';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'ahmet',
            'tag' => 'vip',
            'status' => 'active',
            'province' => 'Istanbul',
            'sector' => 'gida',
            'per_page' => '50',
            'cursor' => 'eyJpZCI6MTIzfQ',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/contacts'
params = {
  'search': 'ahmet',
  'tag': 'vip',
  'status': 'active',
  'province': 'Istanbul',
  'sector': 'gida',
  'per_page': '50',
  'cursor': 'eyJpZCI6MTIzfQ',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "name": "Ahmet",
            "msisdn": "5551234567",
            "tags": [
                "vip"
            ],
            "opt_out_at": null,
            "address_country": "TR",
            "address_province": "Istanbul",
            "sector": "gida",
            "created_at": "2026-05-11T08:00:00+00:00"
        }
    ],
    "meta": {
        "next_cursor": null,
        "prev_cursor": null,
        "has_more": false,
        "per_page": 30,
        "can_see_full_msisdn": true
    },
    "stats": {
        "total": 42,
        "active": 40,
        "opted_out": 2
    }
}
 

Request      

GET v1/panel/contacts

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

search   string  optional    

Isim veya msisdn arama. Example: ahmet

tag   string  optional    

Tek bir tag (JSONB contains). Example: vip

status   string  optional    

all|active|opted_out (default all). Example: active

province   string  optional    

Il bazli filtre (address_province esitlik). Example: Istanbul

sector   string  optional    

Sektor like-arama. Example: gida

per_page   integer  optional    

1..100 (default 30). Example: 50

cursor   string  optional    

Sonraki sayfa cursor. Example: eyJpZCI6MTIzfQ

Yeni Kontak Olustur

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/contacts" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Ahmet Yilmaz\",
    \"msisdn\": \"05551234567\",
    \"tags\": \"vip,musteri\",
    \"address_country\": \"TR\",
    \"address_province\": \"Istanbul\",
    \"address_district\": \"Kadikoy\",
    \"landline\": \"02161234567\",
    \"sector\": \"gida\",
    \"gender\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/contacts"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Ahmet Yilmaz",
    "msisdn": "05551234567",
    "tags": "vip,musteri",
    "address_country": "TR",
    "address_province": "Istanbul",
    "address_district": "Kadikoy",
    "landline": "02161234567",
    "sector": "gida",
    "gender": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/contacts';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Ahmet Yilmaz',
            'msisdn' => '05551234567',
            'tags' => 'vip,musteri',
            'address_country' => 'TR',
            'address_province' => 'Istanbul',
            'address_district' => 'Kadikoy',
            'landline' => '02161234567',
            'sector' => 'gida',
            'gender' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/contacts'
payload = {
    "name": "Ahmet Yilmaz",
    "msisdn": "05551234567",
    "tags": "vip,musteri",
    "address_country": "TR",
    "address_province": "Istanbul",
    "address_district": "Kadikoy",
    "landline": "02161234567",
    "sector": "gida",
    "gender": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, Basarili):


{
    "data": {
        "id": 1,
        "name": "Ahmet",
        "msisdn": "5551234567"
    }
}
 

Example response (422, Duplicate msisdn):


{
    "type": "https://smsmerkezi.net/errors/validation-error",
    "title": "Validation Error",
    "status": 422,
    "detail": "Bu numara rehberinizde zaten kayitli.",
    "instance": "/v1/panel/contacts"
}
 

Request      

POST v1/panel/contacts

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string  optional    

Optional, max 150. Example: Ahmet Yilmaz

msisdn   string     

10-15 hane telefon (TR icin 5XX...). Example: 05551234567

tags   string  optional    

Virgulle ayrilmis tag listesi. Example: vip,musteri

address_country   string  optional    

ISO alpha-2 (default TR). Example: TR

address_province   string  optional    

Il. Example: Istanbul

address_district   string  optional    

Ilce. Example: Kadikoy

landline   string  optional    

Sabit telefon. Example: 02161234567

sector   string  optional    

Sektor. Example: gida

gender   string  optional    

Faz 16 — cinsiyet (male/female/unknown). Example: architecto

Kontak Detayi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/contacts/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/contacts/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/contacts/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/contacts/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Ahmet",
        "msisdn": "5551234567"
    }
}
 

Example response (404, Bulunamadi):


{
    "type": "https://smsmerkezi.net/errors/not-found",
    "title": "Not Found",
    "status": 404,
    "detail": "Kontak bulunamadi.",
    "instance": "/v1/panel/contacts/999"
}
 

Request      

GET v1/panel/contacts/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Kontak ID. Example: 1

Kontak Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/contacts/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"msisdn\": \"n\",
    \"tags\": \"g\",
    \"address_country\": \"zm\",
    \"address_province\": \"i\",
    \"address_district\": \"y\",
    \"landline\": \"vdljnikhwaykcmyu\",
    \"sector\": \"w\",
    \"gender\": \"architecto\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/contacts/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "msisdn": "n",
    "tags": "g",
    "address_country": "zm",
    "address_province": "i",
    "address_district": "y",
    "landline": "vdljnikhwaykcmyu",
    "sector": "w",
    "gender": "architecto"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/contacts/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'b',
            'msisdn' => 'n',
            'tags' => 'g',
            'address_country' => 'zm',
            'address_province' => 'i',
            'address_district' => 'y',
            'landline' => 'vdljnikhwaykcmyu',
            'sector' => 'w',
            'gender' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/contacts/1'
payload = {
    "name": "b",
    "msisdn": "n",
    "tags": "g",
    "address_country": "zm",
    "address_province": "i",
    "address_district": "y",
    "landline": "vdljnikhwaykcmyu",
    "sector": "w",
    "gender": "architecto"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Ahmet Yeni",
        "msisdn": "5551234567"
    }
}
 

Request      

PUT v1/panel/contacts/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Kontak ID. Example: 1

Body Parameters

name   string  optional    

value 150 karakterden uzun olmamalıdır. Example: b

msisdn   string     

value 32 karakterden uzun olmamalıdır. Example: n

tags   string  optional    

value 255 karakterden uzun olmamalıdır. Example: g

address_country   string  optional    

value 2 karakter olmalıdır. Example: zm

address_province   string  optional    

value 64 karakterden uzun olmamalıdır. Example: i

address_district   string  optional    

value 64 karakterden uzun olmamalıdır. Example: y

landline   string  optional    

value 20 karakterden uzun olmamalıdır. Example: vdljnikhwaykcmyu

sector   string  optional    

value 64 karakterden uzun olmamalıdır. Example: w

gender   string  optional    

Faz 16 — cinsiyet (male/female/unknown). Example: architecto

Kontak Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/contacts/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/contacts/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/contacts/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/contacts/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Basarili silindi):

Empty response
 

Request      

DELETE v1/panel/contacts/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Kontak ID. Example: 1

Panel - Kullanicilar

Kullanici + Bekleyen Davet Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/users" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/users"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/users';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/users'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Request      

GET v1/panel/users

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Kullanici Davet Et

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/users/invite" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"yeni@example.com\",
    \"role\": \"operator\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/users/invite"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "yeni@example.com",
    "role": "operator"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/users/invite';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'yeni@example.com',
            'role' => 'operator',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/users/invite'
payload = {
    "email": "yeni@example.com",
    "role": "operator"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, Basarili):



 

Example response (403, Yetki yok):



 

Example response (422, Email kayitli / pending davet var):



 

Request      

POST v1/panel/users/invite

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

Davet edilecek email. Example: yeni@example.com

role   string     

admin|operator|viewer. Example: operator

Davet Iptal

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/users/invitations/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/users/invitations/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/users/invitations/564';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/users/invitations/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Yetki yok):



 

Example response (404, Davet bulunamadi):



 

Example response (422, Davet zaten kabul/iptal/expire):



 

Request      

DELETE v1/panel/users/invitations/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the invitation. Example: 564

Kullanici Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/users/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/users/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/users/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/users/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Basarili):

Empty response
 

Example response (403, Yetki yok):



 

Example response (404, Kullanici bulunamadi):



 

Example response (422, Kendini silemezsin):



 

Request      

DELETE v1/panel/users/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the user. Example: 1

Panel - Kurallar

Doktor SMS Kural Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/rules" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/rules"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/rules';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/rules'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "name": "Dr. Ayse - mesai",
            "outer_lines_count": 2,
            "inner_lines_count": 4,
            "weekday_start": "09:00",
            "weekday_end": "17:00",
            "saturday_start": null,
            "saturday_end": null,
            "sunday_start": null,
            "sunday_end": null,
            "lunch_break_active": true,
            "lunch_break_start": "12:00",
            "lunch_break_end": "13:00",
            "is_active": true,
            "created_at": "2026-05-14T08:00:00+00:00"
        }
    ]
}
 

Request      

GET v1/panel/rules

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Yeni Kural Olustur

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/rules" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Dr. Ayse - mesai\",
    \"outer_lines_count\": 2,
    \"inner_lines_count\": 4,
    \"weekday_start\": \"09:00\",
    \"weekday_end\": \"17:00\",
    \"saturday_start\": \"09:00\",
    \"saturday_end\": \"13:00\",
    \"sunday_start\": null,
    \"sunday_end\": null,
    \"lunch_break_active\": \"true\",
    \"lunch_break_start\": \"12:00\",
    \"lunch_break_end\": \"13:00\",
    \"is_active\": \"true\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/rules"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Dr. Ayse - mesai",
    "outer_lines_count": 2,
    "inner_lines_count": 4,
    "weekday_start": "09:00",
    "weekday_end": "17:00",
    "saturday_start": "09:00",
    "saturday_end": "13:00",
    "sunday_start": null,
    "sunday_end": null,
    "lunch_break_active": "true",
    "lunch_break_start": "12:00",
    "lunch_break_end": "13:00",
    "is_active": "true"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/rules';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Dr. Ayse - mesai',
            'outer_lines_count' => 2,
            'inner_lines_count' => 4,
            'weekday_start' => '09:00',
            'weekday_end' => '17:00',
            'saturday_start' => '09:00',
            'saturday_end' => '13:00',
            'sunday_start' => null,
            'sunday_end' => null,
            'lunch_break_active' => 'true',
            'lunch_break_start' => '12:00',
            'lunch_break_end' => '13:00',
            'is_active' => 'true',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/rules'
payload = {
    "name": "Dr. Ayse - mesai",
    "outer_lines_count": 2,
    "inner_lines_count": 4,
    "weekday_start": "09:00",
    "weekday_end": "17:00",
    "saturday_start": "09:00",
    "saturday_end": "13:00",
    "sunday_start": null,
    "sunday_end": null,
    "lunch_break_active": "true",
    "lunch_break_start": "12:00",
    "lunch_break_end": "13:00",
    "is_active": "true"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201, Basarili):


{
    "data": {
        "id": 1,
        "name": "..."
    }
}
 

Example response (422, Validation):


{
    "type": "https://smsmerkezi.net/errors/validation-error",
    "title": "Validation Error",
    "status": 422,
    "detail": "...",
    "instance": "/v1/panel/rules"
}
 

Request      

POST v1/panel/rules

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

max 120, unique per tenant. Example: Dr. Ayse - mesai

outer_lines_count   integer     

0..9999. Example: 2

inner_lines_count   integer     

0..9999. Example: 4

weekday_start   string     

HH:MM. Example: 09:00

weekday_end   string     

HH:MM > weekday_start. Example: 17:00

saturday_start   string  optional    

nullable HH:MM. Example: 09:00

saturday_end   string  optional    

nullable HH:MM > saturday_start. Example: 13:00

sunday_start   string  optional    

nullable HH:MM.

sunday_end   string  optional    

nullable HH:MM > sunday_start.

lunch_break_active   boolean.  optional    

Example: true

lunch_break_start   string  optional    

nullable HH:MM. Example: 12:00

lunch_break_end   string  optional    

nullable HH:MM > lunch_break_start. Example: 13:00

is_active   boolean.  optional    

Example: true

Kural Detayi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/rules/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/rules/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/rules/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/rules/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/rules/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Kural Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/rules/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/rules/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/rules/1';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/rules/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

PUT v1/panel/rules/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Kural Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/rules/1" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/rules/1"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/rules/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/rules/1'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204):

Empty response
 

Request      

DELETE v1/panel/rules/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer  optional    

required. Example: 1

Panel - Raporlar

Rapor Verisi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/reports?date_from=2026-04-11&date_to=2026-05-11" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/reports"
);

const params = {
    "date_from": "2026-04-11",
    "date_to": "2026-05-11",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/reports';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'date_from' => '2026-04-11',
            'date_to' => '2026-05-11',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/reports'
params = {
  'date_from': '2026-04-11',
  'date_to': '2026-05-11',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):



 

Request      

GET v1/panel/reports

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

date_from   string  optional    

ISO tarih (default: 30 gun once). Example: 2026-04-11

date_to   string  optional    

ISO tarih (default: bugun). Example: 2026-05-11

Panel - SMS

Panel SMS Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/sms?status=delivered&originator=SMSMERKEZI&date_from=2026-05-01&date_to=2026-05-11&per_page=50&cursor=architecto" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/sms"
);

const params = {
    "status": "delivered",
    "originator": "SMSMERKEZI",
    "date_from": "2026-05-01",
    "date_to": "2026-05-11",
    "per_page": "50",
    "cursor": "architecto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/sms';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'delivered',
            'originator' => 'SMSMERKEZI',
            'date_from' => '2026-05-01',
            'date_to' => '2026-05-11',
            'per_page' => '50',
            'cursor' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/sms'
params = {
  'status': 'delivered',
  'originator': 'SMSMERKEZI',
  'date_from': '2026-05-01',
  'date_to': '2026-05-11',
  'per_page': '50',
  'cursor': 'architecto',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "originator": "SMSMERKEZI",
            "body": "Merhaba",
            "status": "delivered",
            "recipients_count": 2,
            "recipients_sample": [
                "555****4567"
            ],
            "created_at": "2026-05-11T08:00:00+00:00"
        }
    ],
    "meta": {
        "next_cursor": null,
        "has_more": false,
        "per_page": 25,
        "can_see_full_msisdn": false
    },
    "stats": {
        "total": 100,
        "delivered": 80,
        "failed": 5,
        "queued": 15,
        "sent": 0
    }
}
 

Request      

GET v1/panel/sms

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

status   string  optional    

Liste filtresi (queued|sending|sent|delivered|failed|expired|cancelled|all). Example: delivered

originator   string  optional    

Gonderici basliga gore like-arama. Example: SMSMERKEZI

date_from   string  optional    

Tarih (Y-m-d). Example: 2026-05-01

date_to   string  optional    

Tarih (Y-m-d). Example: 2026-05-11

per_page   integer  optional    

1..100 (default 25). Example: 50

cursor   string  optional    

Sonraki sayfa cursor. Example: architecto

Panel SMS Detayi (recipients dahil)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/sms/16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/sms/16"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/sms/16';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/sms/16'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "id": 1,
        "originator": "SMSMERKEZI",
        "body": "Merhaba",
        "status": "delivered",
        "recipients": [
            {
                "id": 1,
                "msisdn": "555****4567",
                "status": "delivered"
            }
        ]
    }
}
 

Request      

GET v1/panel/sms/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

SMS ID. Example: 16

Panel - Sablonlar

Sablon Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/templates?search=hosgeldin&active=active&per_page=50&cursor=architecto" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/templates"
);

const params = {
    "search": "hosgeldin",
    "active": "active",
    "per_page": "50",
    "cursor": "architecto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/templates';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'hosgeldin',
            'active' => 'active',
            'per_page' => '50',
            'cursor' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/templates'
params = {
  'search': 'hosgeldin',
  'active': 'active',
  'per_page': '50',
  'cursor': 'architecto',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "name": "Hosgeldin",
            "body": "Merhaba {{name}}",
            "encoding": "gsm7",
            "variables": [
                "name"
            ],
            "is_active": true
        }
    ],
    "meta": {
        "next_cursor": null,
        "has_more": false,
        "per_page": 30
    },
    "stats": {
        "total": 5,
        "active": 4,
        "inactive": 1
    }
}
 

Request      

GET v1/panel/templates

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

search   string  optional    

Isim veya body arama. Example: hosgeldin

active   string  optional    

all|active|inactive (default all). Example: active

per_page   integer  optional    

1..100 (default 30). Example: 50

cursor   string  optional    

Sonraki sayfa cursor. Example: architecto

Yeni Sablon

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/templates" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Hosgeldin\",
    \"body\": \"Merhaba {{name}}, hosgeldiniz.\",
    \"is_active\": true
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/templates"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Hosgeldin",
    "body": "Merhaba {{name}}, hosgeldiniz.",
    "is_active": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/templates';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Hosgeldin',
            'body' => 'Merhaba {{name}}, hosgeldiniz.',
            'is_active' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/templates'
payload = {
    "name": "Hosgeldin",
    "body": "Merhaba {{name}}, hosgeldiniz.",
    "is_active": true
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "id": 1,
        "name": "Hosgeldin",
        "encoding": "gsm7",
        "variables": [
            "name"
        ]
    }
}
 

Request      

POST v1/panel/templates

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

max 100. Example: Hosgeldin

body   string     

max 1530. Example: Merhaba {{name}}, hosgeldiniz.

is_active   boolean  optional    

default true. Example: true

Sablon Detayi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/templates/16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/templates/16"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/templates/16';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/templates/16'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Hosgeldin",
        "body": "Merhaba {{name}}"
    }
}
 

Request      

GET v1/panel/templates/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Sablon ID. Example: 16

Sablon Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/templates/16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"body\": \"n\",
    \"is_active\": false
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/templates/16"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "body": "n",
    "is_active": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/templates/16';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'b',
            'body' => 'n',
            'is_active' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/templates/16'
payload = {
    "name": "b",
    "body": "n",
    "is_active": false
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Hosgeldin Yeni"
    }
}
 

Request      

PUT v1/panel/templates/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Sablon ID. Example: 16

Body Parameters

name   string     

value 100 karakterden uzun olmamalıdır. Example: b

body   string     

value 1530 karakterden uzun olmamalıdır. Example: n

is_active   boolean  optional    

Example: false

Sablon Sil

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/templates/16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/templates/16"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/templates/16';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/templates/16'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Basarili silindi):

Empty response
 

Request      

DELETE v1/panel/templates/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Sablon ID. Example: 16

Panel - Scheduled SMS

Ileri Tarihli SMS Listesi

requires authentication

scheduled_messages tablosundan tenant'a ait kayitlari run_at sirali doner. Iliskili Message + ilk 3 recipient (KVKK maskeli — viewer rolunde) dahil.

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/scheduled-messages?status=pending&date_from=2026-05-11&date_to=2026-12-31&per_page=25&cursor=architecto" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/scheduled-messages"
);

const params = {
    "status": "pending",
    "date_from": "2026-05-11",
    "date_to": "2026-12-31",
    "per_page": "25",
    "cursor": "architecto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/scheduled-messages';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'pending',
            'date_from' => '2026-05-11',
            'date_to' => '2026-12-31',
            'per_page' => '25',
            'cursor' => 'architecto',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/scheduled-messages'
params = {
  'status': 'pending',
  'date_from': '2026-05-11',
  'date_to': '2026-12-31',
  'per_page': '25',
  'cursor': 'architecto',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "message_id": 42,
            "run_at": "2026-12-31T20:00:00+03:00",
            "status": "pending",
            "fired_at": null,
            "body": "Merhaba",
            "originator": "SMSMERKEZI",
            "encoding": "gsm7",
            "parts_count": 1,
            "recipients_count": 2,
            "recipients_sample": [
                "555****4567"
            ],
            "created_at": "2026-05-11T10:00:00+00:00"
        }
    ],
    "meta": {
        "next_cursor": null,
        "has_more": false,
        "per_page": 25,
        "can_see_full_msisdn": false
    },
    "stats": {
        "total": 12,
        "pending": 8,
        "fired": 3,
        "cancelled": 1
    }
}
 

Request      

GET v1/panel/scheduled-messages

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

status   string  optional    

Liste filtresi (pending|fired|cancelled|all). Example: pending

date_from   string  optional    

ISO date — run_at >= bu tarih. Example: 2026-05-11

date_to   string  optional    

ISO date — run_at <= bu tarih. Example: 2026-12-31

per_page   integer  optional    

1..100 (default 25). Example: 25

cursor   string  optional    

Sonraki sayfa cursor. Example: architecto

Ileri Tarihli SMS Iptal

requires authentication

Sadece status=pending olan scheduled mesaj iptal edilebilir. Iliskili Message + recipients -> status=cancelled, scheduled.status=cancelled Rezerv bakiye SmsBalance::release ile geri verilir (idempotent).

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/scheduled-messages/16" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/scheduled-messages/16"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/scheduled-messages/16';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/scheduled-messages/16'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200, Iptal basarili):


{
    "data": {
        "id": 1,
        "status": "cancelled",
        "released_credits": 2
    }
}
 

Example response (404, Bulunamadi (problem+json)):



 

Example response (422, Zaten fired/cancelled (problem+json)):



 

Request      

DELETE v1/panel/scheduled-messages/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

ScheduledMessage ID. Example: 16

Panel - Sender ID

Sender ID Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/sender-ids" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/sender-ids"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/sender-ids';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/sender-ids'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Request      

GET v1/panel/sender-ids

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Sender ID Olustur (multipart)

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/sender-ids" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "label=ABCSIRKET"\
    --form "document=@/tmp/php5OhNR8" 
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/sender-ids"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('label', 'ABCSIRKET');
body.append('document', document.querySelector('input[name="document"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/sender-ids';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'label',
                'contents' => 'ABCSIRKET'
            ],
            [
                'name' => 'document',
                'contents' => fopen('/tmp/php5OhNR8', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/sender-ids'
files = {
  'label': (None, 'ABCSIRKET'),
  'document': open('/tmp/php5OhNR8', 'rb')}
payload = {
    "label": "ABCSIRKET"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files)
response.json()

Example response (201, Basarili):



 

Example response (422, Validation):



 

Request      

POST v1/panel/sender-ids

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

label   string     

1-11 char alfanumerik + . + -. Example: ABCSIRKET

document   file     

PDF/JPG/PNG max 5MB. Example: /tmp/php5OhNR8

Sender ID Detay

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/sender-ids/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/sender-ids/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/sender-ids/564';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/sender-ids/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (404, Bulunamadi):



 

Request      

GET v1/panel/sender-ids/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the sender id. Example: 564

Sender ID Sil (pending/rejected)

requires authentication

Example request:
curl --request DELETE \
    "https://api.smsmerkezi.net/v1/panel/sender-ids/564" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/sender-ids/564"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/sender-ids/564';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/sender-ids/564'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Basarili):

Empty response
 

Example response (404, Bulunamadi):



 

Example response (422, Approved silinmez):



 

Request      

DELETE v1/panel/sender-ids/{id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the sender id. Example: 564

Panel - Tenant Switcher (super_admin)

Tenant Listesi (super_admin)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/tenant-switcher?q=abc&cursor=architecto&per_page=20" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/tenant-switcher"
);

const params = {
    "q": "abc",
    "cursor": "architecto",
    "per_page": "20",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'q' => 'abc',
            'cursor' => 'architecto',
            'per_page' => '20',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher'
params = {
  'q': 'abc',
  'cursor': 'architecto',
  'per_page': '20',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):



 

Example response (403, Super admin degil):



 

Request      

GET v1/panel/tenant-switcher

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

q   string  optional    

Search (ad/slug ILIKE). Example: abc

cursor   string  optional    

Cursor pagination. Example: architecto

per_page   integer  optional    

1-100. Example: 20

Acting-As Durum (super_admin)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/tenant-switcher/status" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/tenant-switcher/status"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher/status';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher/status'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Super admin degil):



 

Request      

GET v1/panel/tenant-switcher/status

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Switch — token-meta tablosuna acting_as tenant yaz (mobil/REST stateless).

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/tenant-switcher/switch" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"tenant_id\": 549
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/tenant-switcher/switch"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "tenant_id": 549
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher/switch';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'tenant_id' => 549,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher/switch'
payload = {
    "tenant_id": 549
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (403, Super admin degil veya token yok):



 

Example response (404, Tenant bulunamadi veya status uygun degil):



 

Example response (422, Validation fail):



 

Request      

POST v1/panel/tenant-switcher/switch

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

tenant_id   integer     

Hedef tenant id. Example: 549

Clear — token-meta tablosundaki acting_as'i temizle.

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/tenant-switcher/clear" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/tenant-switcher/clear"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher/clear';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/tenant-switcher/clear'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (403, Super admin degil veya token yok):



 

Request      

POST v1/panel/tenant-switcher/clear

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Panel - Toplu SMS

Toplu SMS Kampanya Listesi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/bulk-sms?status=completed&cursor=architecto&per_page=20" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/bulk-sms"
);

const params = {
    "status": "completed",
    "cursor": "architecto",
    "per_page": "20",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'completed',
            'cursor' => 'architecto',
            'per_page' => '20',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms'
params = {
  'status': 'completed',
  'cursor': 'architecto',
  'per_page': '20',
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Basarili):


{
    "data": [
        {
            "id": 1,
            "name": "Mayis kampanya",
            "status": "completed",
            "total_recipients": 150,
            "sent_count": 148,
            "failed_count": 2,
            "progress_percent": 100
        }
    ],
    "meta": {
        "next_cursor": null,
        "has_more": false,
        "per_page": 20
    },
    "statuses": [
        "queued",
        "processing",
        "completed",
        "partial",
        "cancelled",
        "failed"
    ]
}
 

Request      

GET v1/panel/bulk-sms

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

status   string  optional    

queued|processing|completed|partial|cancelled|failed|all. Example: completed

cursor   string  optional    

Sonraki sayfa cursor. Example: architecto

per_page   integer  optional    

1..100 (default 20). Example: 20

Yeni Toplu Kampanya Olustur

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/bulk-sms" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "name=Mayis kampanya"\
    --form "body=Bayram indirimi devam ediyor."\
    --form "originator=SMSMERKEZI"\
    --form "source_type=manual"\
    --form "manual_recipients=5551234567,Ahmet"\
    --form "scheduled_at=2052-06-14"\
    --form "file=@/tmp/phppVyWgB" 
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/bulk-sms"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('name', 'Mayis kampanya');
body.append('body', 'Bayram indirimi devam ediyor.');
body.append('originator', 'SMSMERKEZI');
body.append('source_type', 'manual');
body.append('manual_recipients', '5551234567,Ahmet');
body.append('scheduled_at', '2052-06-14');
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://api.smsmerkezi.net/v1/panel/bulk-sms';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'name',
                'contents' => 'Mayis kampanya'
            ],
            [
                'name' => 'body',
                'contents' => 'Bayram indirimi devam ediyor.'
            ],
            [
                'name' => 'originator',
                'contents' => 'SMSMERKEZI'
            ],
            [
                'name' => 'source_type',
                'contents' => 'manual'
            ],
            [
                'name' => 'manual_recipients',
                'contents' => '5551234567,Ahmet'
            ],
            [
                'name' => 'scheduled_at',
                'contents' => '2052-06-14'
            ],
            [
                'name' => 'file',
                'contents' => fopen('/tmp/phppVyWgB', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms'
files = {
  'name': (None, 'Mayis kampanya'),
  'body': (None, 'Bayram indirimi devam ediyor.'),
  'originator': (None, 'SMSMERKEZI'),
  'source_type': (None, 'manual'),
  'manual_recipients': (None, '5551234567,Ahmet'),
  'scheduled_at': (None, '2052-06-14'),
  'file': open('/tmp/phppVyWgB', 'rb')}
payload = {
    "name": "Mayis kampanya",
    "body": "Bayram indirimi devam ediyor.",
    "originator": "SMSMERKEZI",
    "source_type": "manual",
    "manual_recipients": "5551234567,Ahmet",
    "scheduled_at": "2052-06-14"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files)
response.json()

Example response (201, Basarili):


{
    "data": {
        "id": 42,
        "status": "queued",
        "total_recipients": 150,
        "parts_count": 1
    }
}
 

Example response (422, Validation):


{
    "type": "https://smsmerkezi.net/errors/validation-error",
    "title": "Validation Error",
    "status": 422,
    "detail": "Dosya bos veya parse edilemedi.",
    "instance": "/v1/panel/bulk-sms"
}
 

Request      

POST v1/panel/bulk-sms

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

name   string     

Kampanya adi (max 120). Example: Mayis kampanya

body   string     

Mesaj govdesi (max 1000). Example: Bayram indirimi devam ediyor.

originator   string  optional    

Gonderici basligi (max 11, BTK lisansli). Example: SMSMERKEZI

source_type   string     

file|manual. Example: manual

file   file  optional    

(multipart) Sadece source_type=file iken. CSV/TXT, max 5MB. Example: /tmp/phppVyWgB

manual_recipients   string  optional    

Sadece source_type=manual iken. Her satirda bir alici (msisdn[,name]). Example: 5551234567,Ahmet

scheduled_at   string  optional    

Faz 22.2 — Mobil paritesi: scheduled_at ISO8601 (gelecek tarih). Yoksa anlik dispatch. value geçerli bir tarih olmalıdır. value now tarihinden sonra olmalıdır. Example: 2052-06-14

Kampanya Detayi

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/bulk-sms/3" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/bulk-sms/3"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms/3';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms/3'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/bulk-sms/{bulkJob_id}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

bulkJob_id   integer     

The ID of the bulkJob. Example: 3

bulkJob   integer     

Kampanya ID. Example: 16

Kampanya Progress (Polling)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/bulk-sms/3/progress" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/bulk-sms/3/progress"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms/3/progress';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms/3/progress'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "status": "processing",
    "sent_count": 80,
    "failed_count": 2,
    "total_recipients": 150,
    "progress_percent": 54.66,
    "is_active": true,
    "is_final": false
}
 

Request      

GET v1/panel/bulk-sms/{bulkJob_id}/progress

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

bulkJob_id   integer     

The ID of the bulkJob. Example: 3

bulkJob   integer     

Kampanya ID. Example: 16

Kampanyayi Iptal Et

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/bulk-sms/3/cancel" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/bulk-sms/3/cancel"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms/3/cancel';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/bulk-sms/3/cancel'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 42,
        "status": "processing",
        "cancelled_at": "2026-05-11T08:00:00+00:00"
    }
}
 

Example response (409, Zaten kapali):


{
    "type": "https://smsmerkezi.net/errors/conflict",
    "title": "Conflict",
    "status": 409,
    "detail": "Kampanya zaten tamamlandi veya durduruldu.",
    "instance": "/v1/panel/bulk-sms/42/cancel"
}
 

Request      

POST v1/panel/bulk-sms/{bulkJob_id}/cancel

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

bulkJob_id   integer     

The ID of the bulkJob. Example: 3

bulkJob   integer     

Kampanya ID. Example: 16

Panel - Webhook

Webhook Config

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/webhooks" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/webhooks"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/webhooks';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/webhooks'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Request      

GET v1/panel/webhooks

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Webhook Guncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/webhooks" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"url\": \"http:\\/\\/www.bailey.biz\\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html\",
    \"events\": [
        \"architecto\"
    ],
    \"retry_policy\": \"architecto\",
    \"active\": false
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/webhooks"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "url": "http:\/\/www.bailey.biz\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html",
    "events": [
        "architecto"
    ],
    "retry_policy": "architecto",
    "active": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/webhooks';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'url' => 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html',
            'events' => [
                'architecto',
            ],
            'retry_policy' => 'architecto',
            'active' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/webhooks'
payload = {
    "url": "http:\/\/www.bailey.biz\/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html",
    "events": [
        "architecto"
    ],
    "retry_policy": "architecto",
    "active": false
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200, Basarili):



 

Example response (403, viewer/operator):



 

Example response (422, Validation):



 

Request      

PUT v1/panel/webhooks

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

url   string  optional    

Webhook URL (https zorunlu). Example: http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html

events   string[]  optional    

Olay listesi.

retry_policy   string     

standard|aggressive. Example: architecto

active   boolean  optional    

required. Example: false

Secret Yenile (Bir kez plain doner)

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/webhooks/secret/regenerate" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/webhooks/secret/regenerate"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/webhooks/secret/regenerate';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/webhooks/secret/regenerate'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili):


{
    "data": {
        "plain_secret": "wsk_...",
        "has_secret": true
    }
}
 

Request      

POST v1/panel/webhooks/secret/regenerate

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Test Ping

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/webhooks/test" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/webhooks/test"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/webhooks/test';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/webhooks/test'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200, Basarili):



 

Example response (422, Webhook hazir degil):



 

Request      

POST v1/panel/webhooks/test

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Panel - WhatsApp QR

WhatsApp QR durumu (mobil polling icin).

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/status" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/status"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/status';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/status'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, success):


{
    "data": {
        "session": {
            "status": "connected",
            "qr_data_url": null,
            "phone_number": "905551112233",
            "last_error": null,
            "last_error_key": null,
            "qr_generated_at": null
        },
        "whatsapp_driver": "qr"
    }
}
 

Request      

GET v1/panel/channels/whatsapp/qr/status

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

WhatsApp QR oturum baslat.

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/start" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/start"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/start';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/start'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/panel/channels/whatsapp/qr/start

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

WhatsApp QR oturum durdur.

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/stop" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/stop"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/stop';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/channels/whatsapp/qr/stop'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

POST v1/panel/channels/whatsapp/qr/stop

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Panel - Ödeme

Ödeme ekranı verisi (paketler + sağlayıcılar + fatura bilgisi durumu + bakiye)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/payments" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/payments"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/payments';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/payments'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "data": {
        "packages": [
            {
                "id": 1,
                "name": "Mini",
                "slug": "mini",
                "sms_count": 1000,
                "price_total": 15000,
                "is_featured": false,
                "color_theme": "blue"
            }
        ],
        "providers": [
            {
                "id": 1,
                "code": "paynkolay",
                "label": "PayNKolay",
                "is_default": true,
                "test_mode": false
            }
        ],
        "invoice_complete": true,
        "invoice_info": {
            "vkn_tckn": "1234567890",
            "unvan": "ABC",
            "adres": "..."
        },
        "balance": 350
    }
}
 

Request      

GET v1/panel/payments

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Geçmiş ödemeler (son 50)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/payments/history" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/payments/history"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/payments/history';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/payments/history'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "data": [
        {
            "id": 1,
            "order_ref": "KTR_1_ABC12345",
            "status": "paid",
            "amount_tl": 150
        }
    ]
}
 

Request      

GET v1/panel/payments/history

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Ödeme başlatma (POS init)

requires authentication

Example request:
curl --request POST \
    "https://api.smsmerkezi.net/v1/panel/payments/init" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"package_id\": 1,
    \"provider_id\": 1
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/payments/init"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "package_id": 1,
    "provider_id": 1
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/payments/init';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'package_id' => 1,
            'provider_id' => 1,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/payments/init'
payload = {
    "package_id": 1,
    "provider_id": 1
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200, Başarılı (form tipi)):


{
    "data": {
        "ok": true,
        "order_ref": "KTR_1_ABC12345",
        "payment": {
            "type": "form",
            "url": "https://...",
            "fields": {
                "sx": "...",
                "amount": "..."
            }
        }
    }
}
 

Example response (422, Fatura bilgisi eksik):


{
    "type": "https://smsmerkezi.net/problems/invoice-info-missing",
    "title": "Fatura bilgisi eksik",
    "status": 422,
    "detail": "Ödeme yapmadan önce fatura bilgilerinizi doldurun.",
    "invoice_required": true
}
 

Request      

POST v1/panel/payments/init

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

package_id   integer     

Paket ID. Example: 1

provider_id   integer     

Sağlayıcı ID. Example: 1

Mevcut fatura bilgileri

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/payments/invoice-info" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/payments/invoice-info"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/payments/invoice-info';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/payments/invoice-info'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "data": {
        "invoice_info": {
            "vkn_tckn": "1234567890",
            "unvan": "ABC LTD",
            "adres": "...",
            "vergi_dairesi": "Kadıköy",
            "eposta": "info@x.com"
        }
    }
}
 

Request      

GET v1/panel/payments/invoice-info

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Fatura bilgilerini güncelle

requires authentication

Example request:
curl --request PUT \
    "https://api.smsmerkezi.net/v1/panel/payments/invoice-info" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"vkn_tckn\": \"1234567890\",
    \"unvan\": \"ABC Ltd. Şti.\",
    \"adres\": \"Bağdat Cad. No:1 Kadıköy\\/İstanbul\",
    \"vergi_dairesi\": \"Kadıköy\",
    \"eposta\": \"muhasebe@x.com\"
}"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/payments/invoice-info"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "vkn_tckn": "1234567890",
    "unvan": "ABC Ltd. Şti.",
    "adres": "Bağdat Cad. No:1 Kadıköy\/İstanbul",
    "vergi_dairesi": "Kadıköy",
    "eposta": "muhasebe@x.com"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/payments/invoice-info';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'vkn_tckn' => '1234567890',
            'unvan' => 'ABC Ltd. Şti.',
            'adres' => 'Bağdat Cad. No:1 Kadıköy/İstanbul',
            'vergi_dairesi' => 'Kadıköy',
            'eposta' => 'muhasebe@x.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/payments/invoice-info'
payload = {
    "vkn_tckn": "1234567890",
    "unvan": "ABC Ltd. Şti.",
    "adres": "Bağdat Cad. No:1 Kadıköy\/İstanbul",
    "vergi_dairesi": "Kadıköy",
    "eposta": "muhasebe@x.com"
}
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

PUT v1/panel/payments/invoice-info

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

vkn_tckn   string     

10 veya 11 hane. Example: 1234567890

unvan   string     

Şirket veya kişi adı. Example: ABC Ltd. Şti.

adres   string     

En az 10 karakter. Example: Bağdat Cad. No:1 Kadıköy/İstanbul

vergi_dairesi   string  optional    

optional Vergi dairesi. Example: Kadıköy

eposta   string  optional    

optional E-posta. Example: muhasebe@x.com

Fatura PDF indirme (paid order için)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/payments/1/invoice" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/payments/1/invoice"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/payments/1/invoice';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/payments/1/invoice'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Unauthenticated."
}
 

Request      

GET v1/panel/payments/{order}/invoice

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

order   integer     

PaymentOrder id. Example: 1

Tek sipariş detayı (polling friendly)

requires authentication

Example request:
curl --request GET \
    --get "https://api.smsmerkezi.net/v1/panel/payments/KTR_1_ABC12345" \
    --header "Authorization: Bearer {API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.smsmerkezi.net/v1/panel/payments/KTR_1_ABC12345"
);

const headers = {
    "Authorization": "Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.smsmerkezi.net/v1/panel/payments/KTR_1_ABC12345';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://api.smsmerkezi.net/v1/panel/payments/KTR_1_ABC12345'
headers = {
  'Authorization': 'Bearer {API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Başarılı):


{
    "data": {
        "order": {
            "order_ref": "KTR_1_ABC12345",
            "status": "paid",
            "amount_tl": 150,
            "paid_at": "2026-05-15T10:00:00+00:00"
        },
        "balance": 1350
    }
}
 

Request      

GET v1/panel/payments/{ref}

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

ref   string     

Sipariş referansı. Example: KTR_1_ABC12345