# Satış Ortaklığı

https://dev.wisecp.com/tr/satis-ortakligi

Satış ortaklığını açan, komisyonu belirleyen, kazancın ödenmesini yürüten ve şüpheli referansları tarayan dokuz uç.

## Genel Bakış

Satış ortaklığında müşteri, getirdiği her satıştan komisyon kazanır. Bu uçlar ortaklığı açar, komisyon kuralını belirler, kazancın ödenmesini yürütür ve şüpheli referansları tarar.

Komisyonun iki periyodu vardır: `lifetime` müşterinin her yenilemesinde öder, `onetime` yalnız ilk satışta. Seçim ortak başınadır.

## Referans

### Ortaklık Durumunu Getirme

get/api/v1/admin/clients/{id}/affiliate

`Clients/GetClientAffiliate` admin

Müşterinin satış ortaklığı durumunu, komisyon ayarlarını ve bakiyesini döndürür.

Dönen alanlar data — 8

is_affiliateboolMüşteri satış ortağı mı.

activated_atdatetimeOrtaklığın açıldığı tarih.

disabledboolOrtaklık devre dışı mı.

disabled_reasonstringDevre dışı bırakma nedeni.

commission_valuefloatKomisyon oranı, yüzde olarak. 0 ile 100 arasında.

commission_periodstring`lifetime` her yenilemede komisyon verir, `onetime` yalnız ilk satışta. Boş değer varsayılanı kullanır.

balancefloatOrtağın kazanç bakiyesi.

currency_idintBakiyenin para birimi kimliği.

Hatalar 2

not_found404Müşteri bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/clients/42/affiliate' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/affiliate', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/affiliate');
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::Clients()->GetClientAffiliate(['id' => 42]);

if (!($response['data']['is_affiliate'] ?? false)) {
    return;
}
```

### Ortaklığı Açma

post/api/v1/admin/clients/{id}/affiliate

`Clients/ActivateClientAffiliate` admin

Müşteriyi satış ortağı yapar. Zaten ortak olan bir müşteride hata döner.

Gövde 3

commission_valuenumberKomisyon oranı. 0-100 aralığına sıkıştırılır; dışarıdaki değer reddedilmez, kırpılır.

commission_periodstring`lifetime` ya da `onetime`. Başka bir değer boşa çevrilir.

currency_idintBakiye para birimi. Liste: `reference/currencies`.

Dönen alanlar data

dataobjectAçılan ortaklık, `201` ile döner. Durum ucuyla aynı şekildedir.

Hatalar 4

not_found404Müşteri bulunamadı.

already_affiliate422Müşteri zaten satış ortağı.

activate_failed500Ortaklık açılamadı.

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/clients/42/affiliate' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"commission_value":10,"commission_period":"lifetime","currency_id":1}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/affiliate', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    commission_value: 10,
    commission_period: 'lifetime',
    currency_id: 1,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/affiliate');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'commission_value'  => 10,
        'commission_period' => 'lifetime',
        'currency_id'       => 1,
    ]),
]);

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

```php
$response = Api::Clients()->ActivateClientAffiliate([
    'id'                => 42,
    'commission_value'  => 10,
    'commission_period' => 'lifetime',
    'currency_id'       => 1,
]);
```

### Ortaklık Ayarlarını Güncelleme

patch/api/v1/admin/clients/{id}/affiliate

`Clients/UpdateClientAffiliate` admin engelleme burada

Komisyonu, bakiyeyi ve ortağın durumunu değiştirir. Engelleme de bu uçtan yapılır.

Gövde 7

commission_valuenumberKomisyon oranı; 0-100 aralığına sıkıştırılır.

commission_periodstring`lifetime` ya da `onetime`.

currency_idintBakiye para birimi.

balancenumberOrtağın bakiyesi. Negatif gönderilirse sıfıra çekilir.

disabledboolOrtaklığı devre dışı bırakır ya da geri açar.

disabled_reasonstringDevre dışı nedeni. Yalnız `disabled` açıkken yazılır.

block_partnerboolOrtağı engeller **ve bekleyen ödeme taleplerini iptal eder**.

Dönen alanlar data

dataobjectGüncel ortaklık. Durum ucuyla aynı şekildedir.

Hatalar 3

not_found404Müşteri bulunamadı.

not_affiliate422Müşteri satış ortağı değil.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/clients/42/affiliate' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"commission_value":15}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/affiliate', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ commission_value: 15 }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/affiliate');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['commission_value' => 15]),
]);

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

```php
// Engelleme bekleyen odeme taleplerini de iptal eder.
$response = Api::Clients()->UpdateClientAffiliate([
    'id'            => 42,
    'block_partner' => true,
    'block_reason'  => 'Sahte referans',
]);
```

### Sahtecilik Analizi

post/api/v1/admin/clients/{id}/affiliate/fraud-check

`Clients/CheckClientAffiliateFraud` admin

Ortağın giriş yaptığı IP adreslerini, yönlendirdiği müşterilerin giriş IP'leriyle karşılaştırır ve aynı IP'yi paylaşan her yönlendirilen müşteriyi listeler. Personelin "müşteri olarak giriş" oturumları yok sayılır. Önce `state` alanını okuyun: `no_referrals` ve `no_logins` karşılaştırılacak veri olmadığı anlamına gelir, temiz sonuç değildir.

Gövde —

——Gövde gerekmez. Tarama her zaman ortağın tüm referans geçmişini kapsar ve daraltılamaz.

Dönen alanlar data — 7

statestring`match` · `clean` · `no_referrals` · `no_logins`. Son ikisi ortağın yönlendirdiği müşteri ya da karşılaştırılacak kendi girişi olmadığını söyler.

has_issuesboolYalnız `state` `match` iken `true`.

referral_countintOrtağın yönlendirdiği müşteri sayısı.

matching_ipsarrayHer ortak IP ve yönlendirilen müşteri için bir satır; `state` `match` değilse boş.

matching_ips[].ipstringHem ortağın hem yönlendirilen müşterinin giriş yaptığı IP.

matching_ips[].referral_user_idintYönlendirilen müşterinin ID'si.

matching_ips[].referral_namestringYönlendirilen müşterinin adı (ad boşsa şirket adı).

Hatalar 3

not_found404Müşteri bulunamadı.

not_affiliate422Müşteri satış ortağı 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/clients/42/affiliate/fraud-check' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/affiliate/fraud-check', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/affiliate/fraud-check');
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
$response = Api::Clients()->CheckClientAffiliateFraud(['id' => 42]);

// Tarama yalnizca rapor uretir; engellemeyi siz karar verip yaparsiniz.
if (($response['data']['state'] ?? '') === 'match') {
    $sharedIps = $response['data']['matching_ips'];
}
```

### Ödeme Taleplerini Listeleme

get/api/v1/admin/clients/{id}/affiliate/withdrawals

`Clients/GetClientAffiliateWithdrawals` admin

Ortağın kazancını çekmek için açtığı talepleri döndürür.

Dönen alanlar data[] — 6

idintÖdeme talebinin kimliği.

amountfloatTalep tutarı.

gatewaystringÖdemenin yapılacağı yöntem.

statusstring`awaiting`, `process`, `completed`, `rejected` ya da `cancelled`.

status_msgstringDuruma dair not.

created_atdatetimeTalep tarihi.

Hatalar 3

not_found404Müşteri bulunamadı.

not_affiliate422Müşteri satış ortağı değil.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/clients/42/affiliate/withdrawals' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/affiliate/withdrawals', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/affiliate/withdrawals');
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::Clients()->GetClientAffiliateWithdrawals(['id' => 42]);
```

### Ödeme Talebini Güncelleme

patch/api/v1/admin/clients/{id}/affiliate/withdrawals/{wid}

`Clients/UpdateClientAffiliateWithdrawal` admin makbuz eklenebilir

Talebin durumunu değiştirir. Ödemeyi yaptıysanız makbuzu da bu istekte iletirsiniz.

Gövde 4

statusstringzorunluYeni durum. Eski adlar kabul edilir: `pending` → `awaiting`, `inprocess` → `process`, `paid` → `completed`.

status_msgstringOrtağa iletilecek mesaj.

receiptstring | objectÖdeme makbuzu. Yalnız `completed`'a geçerken kabul edilir. base64 data-URI, `{filename, content}` ya da `{url}`. İzinli: görsel ve PDF.

remove_receiptboolVar olan makbuzu kaldırır.

Dönen alanlar data

dataobjectGüncel ödeme talebi. Talep listesindeki öğeyle aynı şekildedir.

Hatalar 4

not_found404Müşteri ya da ödeme talebi bulunamadı.

status_required422`status` boş.

file_invalid422Makbuz çözümlenemedi ya da yüklenemedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/clients/42/affiliate/withdrawals/5' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"completed","receipt":{"url":"https://ornek.com/makbuz.pdf"}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/42/affiliate/withdrawals/5', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    status: 'completed',
    receipt: { url: 'https://ornek.com/makbuz.pdf' },
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/42/affiliate/withdrawals/5');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'status'  => 'completed',
        'receipt' => ['url' => 'https://ornek.com/makbuz.pdf'],
    ]),
]);

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

```php
$response = Api::Clients()->UpdateClientAffiliateWithdrawal([
    'id'      => 42,
    'wid'     => 5,
    'status'  => 'completed',
    'receipt' => ['url' => 'https://ornek.com/makbuz.pdf'],
]);
```

### Hazır Metinleri Listeleme

get/api/v1/admin/clients/affiliate/templates

`Clients/GetAffiliateTemplates` admin

Ortaklık işlerinde kullanılan hazır metinleri döndürür: kapatma nedenleri, ödeme notları, engelleme nedenleri.

Dönen alanlar data — 3

deactivate_reasonsstring[]Ortaklığı kapatma nedenleri.

withdrawal_notesstring[]Ödeme talebine düşülen notlar.

block_reasonsstring[]Engelleme nedenleri.

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/clients/affiliate/templates' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/clients/affiliate/templates', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/affiliate/templates');
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::Clients()->GetAffiliateTemplates();
```

### Hazır Metin Ekleme

post/api/v1/admin/clients/affiliate/templates

`Clients/AddAffiliateTemplate` admin

Seçtiğiniz türe yeni bir metin ekler.

Gövde 2

typestringzorunluMetnin türü: `deactivate_reasons`, `withdrawal_notes` ya da `block_reasons`.

valuestringzorunluEklenecek metin.

Dönen alanlar data — 2

typestringMetnin eklendiği tür.

itemsstring[]O türün güncel listesi.

Hatalar 3

type_invalid422Tür üç değerden biri değil.

value_required422`value` 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/clients/affiliate/templates' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type":"block_reasons","value":"Sahte referans tespit edildi"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/affiliate/templates', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ type: 'block_reasons', value: 'Sahte referans tespit edildi' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/affiliate/templates');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'type'  => 'block_reasons',
        'value' => 'Sahte referans tespit edildi',
    ]),
]);

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

```php
$response = Api::Clients()->AddAffiliateTemplate([
    'type'  => 'block_reasons',
    'value' => 'Sahte referans tespit edildi',
]);
```

### Hazır Metin Silme

delete/api/v1/admin/clients/affiliate/templates

`Clients/DeleteAffiliateTemplate` admin metinle silinir

Bir metni listeden çıkarır. Kimlik değil, metnin kendisi gönderilir.

Gövde 2

typestringzorunluMetnin türü: `deactivate_reasons`, `withdrawal_notes` ya da `block_reasons`.

valuestringzorunluSilinecek metin. Listedekiyle birebir aynı olmalı.

Dönen alanlar data — 2

typestringMetnin çıkarıldığı tür.

itemsstring[]O türün güncel listesi.

Hatalar 3

type_invalid422Tür üç değerden biri değil.

value_required422`value` boş.

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/clients/affiliate/templates' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type":"block_reasons","value":"Sahte referans tespit edildi"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/affiliate/templates', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ type: 'block_reasons', value: 'Sahte referans tespit edildi' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/affiliate/templates');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'type'  => 'block_reasons',
        'value' => 'Sahte referans tespit edildi',
    ]),
]);

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

```php
$response = Api::Clients()->DeleteAffiliateTemplate([
    'type'  => 'block_reasons',
    'value' => 'Sahte referans tespit edildi',
]);
```

## Tuzaklar

> **Değerler reddedilmez, kırpılır**
> 
> Komisyon oranı 0-100 aralığına **sıkıştırılır**, negatif bakiye sıfıra çekilir ve tanınmayan bir komisyon periyodu boşa döner. Hiçbiri hata vermez; yanlış bir değer sessizce düzeltilmiş olarak kaydedilir. Yazdıktan sonra okuyup doğrulayın.

> **Engellemek bekleyen ödemeleri iptal eder**
> 
> `block_partner` yalnız ortağı durdurmaz; bekleyen ödeme taleplerini de iptal eder. Ödemesi yapılmak üzere olan bir ortağı engellemeden önce talep listesine bakın.

> **Sahtecilik taraması karar vermez**
> 
> Tarama yalnız rapor üretir: kendi kendine referans sayısı ve aynı IP'den gelen kayıtlar. Ortağı engellemek ayrı bir istektir ve kararı siz verirsiniz.

## İlgili Makaleler

- [Müşteri Uçları](https://dev.wisecp.com/tr/musteri-uclari)
- [Kara Liste ve Mükerrer Hesap](https://dev.wisecp.com/tr/kara-liste-ve-mukerrer-hesap)
