# Uluslararası SMS

https://dev.wisecp.com/tr/uluslararasi-sms

Uluslararası SMS gönderici adı başvurularını, ülke fiyatlarını ve modül ayarlarını yöneten on beş uç.

## Genel Bakış

Bazı ülkeler SMS gönderici adının önceden onaylanmasını zorunlu tutar. Müşteri belgeleriyle birlikte başvurur, siz onaylar ya da reddedersiniz; ilk altı uç bu akışı yürütür.

Geri kalanı satışın kendisiyle ilgilidir: hangi modülle gönderileceği, ülke başına maliyet ve fiyat, kâr marjı ve eski kayıtların temizlenmesi. Fiyatlar tek bir **birincil para biriminde** tutulur; o ayarlanmadan otomatik fiyatlama çalışmaz.

## Referans

### Başvuruları Listeleme

get/api/v1/admin/products/sms/intl-origins

`Products/GetSmsIntlOrigins` admin sayfalı

Müşterilerin ülke bazında açtığı gönderici adı başvurularını döndürür.

Sorgu parametreleri 3

searchstringKayıtlarda arar.

pageintVarsayılan 1.

limitintVarsayılan 25, en çok 100.

Dönen alanlar data[] — 11

idintKayıt kimliği.

origin_idintBağlı yurt içi gönderici adının kimliği.

origin_namestringGönderici adı.

country_codestringÜlke kodu. İki harfli ve küçük harfli.

statusstring`waiting` onay bekliyor, `active` onaylandı, `inactive` reddedildi.

status_messagestringKarara düşülen mesaj.

clientobject 3 alanTalebi açan müşteri.

idintMüşteri kimliği.

full_namestringAd ve soyad.

company_namestringFirma adı.

attachmentsarray 4 alanMüşterinin yüklediği belgeler.

sizeintDosya boyutu, bayt olarak.

file_namestringMüşterinin yüklediği özgün ad.

namestringSunucuda saklanan ad.

file_pathstringDosyanın saklandığı yol.

created_atstring | nullTalebin açıldığı zaman.

approved_datestring | nullOnay zamanı.

rejected_datestring | nullRed zamanı.

Meta 4

totalintSüzgece uyan toplam kayıt.

pageintBulunduğunuz sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa. Sıfır son sayfada olduğunuz anlamına gelir.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/sms/intl-origins' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Products()->GetSmsIntlOrigins();

$waiting = array_filter(
    $response['data'],
    fn (array $r): bool => $r['status'] === 'waiting',
);
```

Yanıt 200

```json
{
  "data": [
    {
      "id": 9,
      "origin_id": 1,
      "origin_name": "ACME",
      "country_code": "sv",
      "status": "waiting",
      "status_message": "",
      "client": { "id": 2, "full_name": "John Doe", "company_name": "" },
      "attachments": [
        {
          "size": 255435,
          "file_name": "licence.jpg",
          "name": "215d8151c44f2d058eee5e5.jpg",
          "file_path": "215d8151c44f2d058eee5e5.jpg"
        }
      ],
      "created_at": "2026-03-09 11:52:45",
      "approved_date": null,
      "rejected_date": null
    }
  ],
  "meta": { "total": 2, "page": 1, "limit": 25, "next_page": 0 }
}
```

### Başvuru Detayı

get/api/v1/admin/products/sms/intl-origins/{id}

`Products/GetSmsIntlOrigin` admin

Tek bir başvuruyu döndürür. Şema liste öğesiyle aynıdır.

Dönen alanlar data — 11

idintKayıt kimliği.

origin_idintBağlı yurt içi gönderici adının kimliği.

origin_namestringGönderici adı.

country_codestringÜlke kodu. İki harfli ve küçük harfli.

statusstring`waiting` onay bekliyor, `active` onaylandı, `inactive` reddedildi.

status_messagestringKarara düşülen mesaj.

clientobject 3 alanTalebi açan müşteri.

idintMüşteri kimliği.

full_namestringAd ve soyad.

company_namestringFirma adı.

attachmentsarray 4 alanMüşterinin yüklediği belgeler.

sizeintDosya boyutu, bayt olarak.

file_namestringMüşterinin yüklediği özgün ad.

namestringSunucuda saklanan ad.

file_pathstringDosyanın saklandığı yol.

created_atstring | nullTalebin açıldığı zaman.

approved_datestring | nullOnay zamanı.

rejected_datestring | nullRed zamanı.

Hatalar 2

not_found404Kayıt bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Products()->GetSmsIntlOrigin(['id' => 9]);
```

### Başvuruyu Karara Bağlama

put/api/v1/admin/products/sms/intl-origins/{id}/status

`Products/SetSmsIntlOriginStatus` admin

Başvuruyu onaylar ya da reddeder.

Gövde 2

actionstringzorunlu`active` onaylar, `inactive` reddeder.

reasonstringKarara düşülecek mesaj. Hazır metinler gerekçe ucundan alınır.

Dönen alanlar data

dataobjectBaşvurunun güncel hâli. Detay şemasıyla aynı. İki karar tarihinden geçerliliğini yitiren temizlenir.

Hatalar 3

not_found404Kayıt bulunamadı.

invalid_action422İşlem `active` ya da `inactive` değil.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9/status' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"action":"inactive","reason":"Documents missing"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9/status', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ action: 'inactive', reason: 'Documents missing' }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9/status');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'action' => 'inactive',
        'reason' => 'Documents missing',
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Hazir gerekceyi sablon listesinden alin ki musteri her seferinde ayni metni gorsun.
$reasons = Api::Products()->GetSmsReasons([], ['group' => 'international-sms'])['data'];

Api::Products()->SetSmsIntlOriginStatus([
    'id'     => 9,
    'action' => 'inactive',
    'reason' => $reasons['en'][0]['description'] ?? '',
]);
```

### Toplu Karar

post/api/v1/admin/products/sms/intl-origins/bulk

`Products/BulkSmsIntlOrigins` admin gerekçe yok

Birden çok başvuruyu tek çağrıda onaylar ya da reddeder.

Gövde 2

idsint[]zorunluBaşvuru kimlikleri.

actionstringzorunlu`active` ya da `inactive`.

Dönen alanlar data — 2

updatedint[]Durumu değişen kimlikler.

actionstringUygulanan durum.

Hatalar 3

ids_required422`ids` boş.

invalid_action422İşlem `active` ya da `inactive` değil.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/bulk' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"ids":[9,10],"action":"active"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/bulk', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ ids: [9, 10], action: 'active' }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/bulk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['ids' => [9, 10], 'action' => 'active']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Toplu ucta gerekce alani YOKTUR: red mesaji gerekiyorsa tek tek karara baglayin.
Api::Products()->BulkSmsIntlOrigins([
    'ids'    => [9, 10],
    'action' => 'active',
]);
```

### Başvuruyu Silme

delete/api/v1/admin/products/sms/intl-origins/{id}

`Products/DeleteSmsIntlOrigin` admin belgeler de gider

Başvuruyu ve yüklenmiş belgelerini siler.

Dönen alanlar data — 2

deletedboolSilme başarılı mı.

idintSilinen başvurunun kimliği.

Hatalar 2

not_found404Kayıt bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-origins/9');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Products()->DeleteSmsIntlOrigin(['id' => 9]);
```

### Teslimat Raporu

get/api/v1/admin/products/sms/intl-reports/{id}

`Products/GetSmsIntlReport` admin modüle sorar

Gönderilmiş bir SMS için sağlayıcıdan canlı teslimat durumu ister.

Dönen alanlar data — 5

modulestringRaporu üreten SMS modülü.

sendingarrayHâlâ yolda olan alıcılar. Satır şekli modüle özgü, sağlayıcıdan sağlayıcıya değişir.

deliveredarrayTeslim edildiği doğrulanan alıcılar.

failedarrayBaşarısız alıcılar.

total_recipientsintModülün bildirdiği toplam. Üç dizinin uzunluğu yerine bunu okuyun; ikisi ayrışabilir.

Hatalar 5

not_found404Rapor bulunamadı.

no_module422Bu rapor için SMS modülü yok.

not_supported422Modül teslimat raporu desteklemiyor.

report_failed422Sağlayıcıdan yanıt alınamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/sms/intl-reports/501' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-reports/501', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-reports/501');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Rapor sagliyiciya sorularak uretilir: yavas olabilir ve modul destegine baglidir.
$response = Api::Products()->GetSmsIntlReport(['id' => 501]);
```

### Red Gerekçelerini Listeleme

get/api/v1/admin/products/sms/reasons

`Products/GetSmsReasons` admin

Başvuru reddederken kullanılan hazır metinleri dil başına döndürür.

Sorgu parametreleri 1

groupstringHangi kanal: `sms` ya da `international-sms`. Varsayılan `sms`, yani parametreyi unutmak yurt içi listeyi verir.

Dönen alanlar data

dataobjectDil kodundan gerekçe listesine eşleme. Her gerekçe bir başlık ve bir açıklama taşır.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -G 'https://panel.ornek.com/api/v1/admin/products/sms/reasons' \
  -H "Authorization: Bearer $API_KEY" \
  -d group=international-sms
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/products/sms/reasons');
url.searchParams.set('group', 'international-sms');

const res  = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
const body = await res.json();
```

```php
$url = 'https://panel.ornek.com/api/v1/admin/products/sms/reasons?' . http_build_query(['group' => 'international-sms']);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Products()->GetSmsReasons([], ['group' => 'international-sms']);
```

### Red Gerekçesi Ekleme

post/api/v1/admin/products/sms/reasons

`Products/AddSmsReason` admin 201

Bir dile hazır red metni ekler.

Gövde 2

langstringzorunluMetnin hangi dile ekleneceği.

reasonstringzorunluGerekçe metni. Başlık ilk elli karakterden üretilir.

Sorgu parametreleri 1

groupstringHangi kanal: `sms` ya da `international-sms`. Varsayılan `sms`, yani parametreyi unutmak yurt içi listeyi verir.

Dönen alanlar data

dataobjectYazımdan sonraki gerekçe setinin tamamı, `201` ile döner. Listeyle aynı şema: kurulu her dil için bir anahtar, her biri kendi listesini taşır. Gerekçesi olmayan dil boş dizi döner.

Hatalar 2

reason_required422Dil ya da metin boş.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/sms/reasons?group=international-sms' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"lang":"en","reason":"Please upload a valid trade licence."}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/reasons?group=international-sms', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    lang: 'en',
    reason: 'Please upload a valid trade licence.',
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/reasons?group=international-sms');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'lang'   => 'en',
        'reason' => 'Please upload a valid trade licence.',
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Products()->AddSmsReason(
    ['lang' => 'en', 'reason' => 'Please upload a valid trade licence.'],
    ['group' => 'international-sms'],
);
```

### Red Gerekçesi Silme

delete/api/v1/admin/products/sms/reasons/{index}

`Products/DeleteSmsReason` admin sırayla silinir

Bir dildeki gerekçeyi listedeki sırasına göre siler.

Sorgu parametreleri 2

langstringzorunluHangi dilin listesinden silineceği.

groupstringHangi kanal: `sms` ya da `international-sms`. Varsayılan `sms`, yani parametreyi unutmak yurt içi listeyi verir.

Dönen alanlar data

dataobjectSilmeden sonraki gerekçe setinin tamamı. Listeyle aynı şema. Liste yeniden numaralanır, silinenin altındaki her gerekçe bir sıra yukarı kayar.

Hatalar 3

lang_required422`lang` verilmedi.

not_found404O sırada gerekçe yok.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE -G 'https://panel.ornek.com/api/v1/admin/products/sms/reasons/0' \
  -H "Authorization: Bearer $API_KEY" \
  -d lang=en \
  -d group=international-sms
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/products/sms/reasons/0');
url.searchParams.set('lang', 'en');
url.searchParams.set('group', 'international-sms');

const res = await fetch(url, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$url = 'https://panel.ornek.com/api/v1/admin/products/sms/reasons/0?' . http_build_query([
    'lang'  => 'en',
    'group' => 'international-sms',
]);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Sira numarasi silme sonrasi KAYAR: birden fazla silecekseniz sondan basa gidin.
foreach ([2, 1] as $index)
    Api::Products()->DeleteSmsReason(['index' => $index], ['lang' => 'en']);
```

### Ayarları Getirme

get/api/v1/admin/products/sms/intl-settings

`Products/GetSmsIntlSettings` admin

Uluslararası SMS için modül, fiyatlama ve ön kayıt ayarlarını döndürür.

Dönen alanlar data — 5

active_modulestringKullanılan SMS modülü. Seçilmemişse `none`.

cron_statusboolFiyatları düzenli yenileyen görev açık mı.

primary_currencyintFiyatların tutulduğu para biriminin kimliği.

profit_ratefloatMaliyetin üzerine eklenen kâr marjı.

pre_register_countriesstring[]Gönderici adının önceden onaylanması gereken ülkeler.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/sms/intl-settings' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-settings', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Products()->GetSmsIntlSettings();
```

### Ayarları Yazma

put/api/v1/admin/products/sms/intl-settings

`Products/SetSmsIntlSettings` admin marj ayrı dal

Modülü, fiyatlama görevini ve ön kayıt ülkelerini ayarlar; ya da yalnız kâr marjını değiştirir.

Gövde 5

marginfloatKâr marjı. Bu alanı göndermek diğerlerini yok sayar ve fiyatları yeniden hesaplar.

active_modulestringKullanılacak SMS modülü.

cron_statusboolFiyatları düzenli yenileyen görevi açar.

primary_currencyintFiyatların tutulacağı para birimi.

countries_pre_registerstring[]Gönderici adının önceden onaylanması gereken ülkeler.

Dönen alanlar data

dataobjectAyarların güncel hâli. Okuma ucuyla aynı şema.

Hatalar 3

module_unsupported422Görev açılmak isteniyor ama modül fiyat çekemiyor.

update_failed422Ayar kaydedilemedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/products/sms/intl-settings' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"active_module":"Twilio","cron_status":true,"primary_currency":1}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    active_module: 'Twilio',
    cron_status: true,
    primary_currency: 1,
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'active_module'    => 'Twilio',
        'cron_status'      => true,
        'primary_currency' => 1,
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// 'margin' govdedeyse DIGER alanlar okunmaz — iki degisikligi ayri istek yapin.
Api::Products()->SetSmsIntlSettings(['active_module' => 'Twilio']);
Api::Products()->SetSmsIntlSettings(['margin' => 20]);
```

### Fiyatları Getirme

get/api/v1/admin/products/sms/intl-pricing

`Products/GetSmsIntlPricing` admin

Ülke başına maliyet ve satış fiyatını döndürür.

Sorgu parametreleri 1

primary_currencyintAyarlardaki para birimi yerine bunu kullanır.

Dönen alanlar data[] — 5

country_codestringÜlke kodu. Burada BÜYÜK harfli; başvuru kayıtlarında küçük.

costfloatSağlayıcıya ödenen maliyet.

amountfloatMüşteriden alınan tutar.

cidintPara birimi kimliği.

statusboolO ülkeye gönderim açık mı.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Products()->GetSmsIntlPricing();
```

### Fiyatları Yazma

put/api/v1/admin/products/sms/intl-pricing

`Products/SetSmsIntlPricing` admin

Ülke başına maliyet ve fiyatı elle yazar.

Gövde 1

valuesobjectzorunluÜlke kodundan fiyat nesnesine eşleme. Her nesne maliyet, satış tutarı, para birimi ve gönderim durumunu taşır. Yalnız gönderdiğiniz ülkeler değişir.

Dönen alanlar data — 1

updatedintGüncellenen ülke sayısı.

Hatalar 2

values_required422`values` boş.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"values":{"US":{"cost":0.01,"amount":0.02,"cid":1,"status":true}}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    values: {
      US: { cost: 0.01, amount: 0.02, cid: 1, status: true },
    },
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'values' => [
            'US' => ['cost' => 0.01, 'amount' => 0.02, 'cid' => 1, 'status' => true],
        ],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Ulke kodu BUYUK harfli yazilir; basvuru kayitlarindaki kucuk harfli kodla karistirmayin.
Api::Products()->SetSmsIntlPricing([
    'values' => [
        'US' => ['cost' => 0.01, 'amount' => 0.02, 'cid' => 1, 'status' => true],
    ],
]);
```

### Fiyatları Modülden Çekme

post/api/v1/admin/products/sms/intl-pricing/auto

`Products/AutoDefineSmsIntlPricing` admin elle girilenleri ezer

Ülke fiyatlarını sağlayıcıdan çeker ve marjı uygulayarak yazar.

Gövde —

——Gövde gerekmez, boş gönderin. Modül, para birimi ve marj uluslararası SMS ayarlarından gelir.

Dönen alanlar data — 1

statusstringİşlemin sonucu.

Hatalar 5

no_module422Seçili SMS modülü yok.

module_unsupported422Modül fiyat çekmeyi desteklemiyor.

no_primary_currency422Birincil para birimi ayarlanmamış.

auto_define_failed422Fiyatlar çekilemedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing/auto' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing/auto', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/intl-pricing/auto');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Ucun uc onkosulu vardir: modul secili, modul fiyat cekebiliyor, para birimi ayarli.
$settings = Api::Products()->GetSmsIntlSettings()['data'];

if ($settings['active_module'] !== 'none' && $settings['primary_currency'] > 0)
    Api::Products()->AutoDefineSmsIntlPricing();
```

### Raporları Temizleme

post/api/v1/admin/products/sms/clear-reports

`Products/ClearSmsReports` admin geri alınamaz

Verilen tarihte ve öncesinde gönderilmiş SMS kayıtlarını siler.

Gövde 2

datestringzorunluKesim tarihi. Bu tarih ve öncesi silinir.

typestringHangi kanal: `domestic` ya da `international`. Varsayılan `domestic`.

Dönen alanlar data — 3

clearedboolTemizlik yapıldı mı.

beforestringKullanılan kesim tarihi.

typestringTemizlenen kanal.

Hatalar 2

invalid_date422Tarih eksik ya da geçersiz.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/sms/clear-reports' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"date":"2026-01-01","type":"international"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/sms/clear-reports', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ date: '2026-01-01', type: 'international' }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/sms/clear-reports');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'date' => '2026-01-01',
        'type' => 'international',
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Kanal belirtmezseniz YURT ICI kayitlar silinir; uluslararasi olanlari acikca isteyin.
Api::Products()->ClearSmsReports([
    'date' => '2026-01-01',
    'type' => 'international',
]);
```

## Tuzaklar

> **Ülke kodunun harf durumu iki uçta farklı**
> 
> Başvuru kayıtları ülke kodunu **küçük** harfle döndürür, fiyatlama uçları ise **büyük** harfle bekler ve döndürür. İkisini eşleştiren kod, harf durumunu dönüştürmezse hiçbir ülkeyi bulamaz ve bunu sessizce yapar.

> **Marj alanı diğerlerini yok sayar**
> 
> Ayar ucunda `margin` gövdedeyse yalnız marj dalı çalışır; modül, para birimi ve ülke listesi **okunmaz**. İkisini birden değiştirmek istiyorsanız iki ayrı istek gönderin.

> **Otomatik fiyatlama elle girilenleri ezer**
> 
> Fiyatları modülden çekmek, elle yazdığınız ülke fiyatlarının üzerine yazar. Birkaç ülkeyi özel olarak fiyatladıysanız bu çağrıdan sonra onları yeniden girmeniz gerekir; ayrıca fiyat görevi açıksa aynı ezme **düzenli olarak** tekrarlanır.

> **Toplu kararda gerekçe yoktur**
> 
> Toplu uç yalnız durumu değiştirir; red mesajı alanı yoktur. Müşterinin neden reddedildiğini görmesini istiyorsanız başvuruları tek tek karara bağlamanız gerekir.

> **Gerekçe sırası silmeden sonra kayar**
> 
> Gerekçeler kimlikle değil listedeki sırayla silinir. Bir gerekçe silindiğinde ondan sonrakilerin sırası bir azalır; art arda silme yapacaksanız **sondan başa** gidin, yoksa yanlış metni silersiniz.

## İlgili Makaleler

- [Ürün Uçları](https://dev.wisecp.com/tr/urun-uclari)
- [Alan Adı Fiyatlama ve Ayarları](https://dev.wisecp.com/tr/alan-adi-fiyatlama)
