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 (429):

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

{
    "type": "https://smsmerkezi.net/errors/too-many-attempts",
    "title": "Too Many Attempts",
    "status": 429,
    "detail": "Cok fazla deneme. 2 saniye sonra tekrar deneyin.",
    "instance": "/v1/auth/login",
    "retry_after_seconds": 2
}
 

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: 0
 

{
    "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 (429):

Show headers
x-ratelimit-limit: 30
x-ratelimit-remaining: 0
retry-after: 0
x-ratelimit-reset: 1778497551
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Too Many Attempts."
}
 

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 (429):

Show headers
x-ratelimit-limit: 30
x-ratelimit-remaining: 0
retry-after: 0
x-ratelimit-reset: 1778497551
cache-control: no-cache, private
content-type: application/json
 

{
    "message": "Too Many Attempts."
}
 

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-11T14:05:50+03:00",
    "phase": "faz5"
}
 

Request      

GET v1/health

Headers

Authorization        

Example: Bearer {API_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

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

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 - 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\"
}"
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"
};

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',
        ],
    ]
);
$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"
}
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

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\"
}"
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"
};

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',
        ],
    ]
);
$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"
}
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

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/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/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/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/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 (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   string     

The ID of the user. Example: 564

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\": true
}"
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": true
};

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' => true,
        ],
    ]
);
$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": true
}
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: true

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 - 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/php5qNWiK" 
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/php5qNWiK', '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/php5qNWiK', '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/php5qNWiK

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

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 "file=@/tmp/phprKHrKG" 
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('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' => 'file',
                'contents' => fopen('/tmp/phprKHrKG', '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'),
  'file': open('/tmp/phprKHrKG', 'rb')}
payload = {
    "name": "Mayis kampanya",
    "body": "Bayram indirimi devam ediyor.",
    "originator": "SMSMERKEZI",
    "source_type": "manual",
    "manual_recipients": "5551234567,Ahmet"
}
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/phprKHrKG

manual_recipients   string  optional    

Sadece source_type=manual iken. Her satirda bir alici (msisdn[,name]). Example: 5551234567,Ahmet

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