RevRake API'si.
Bir operatörün platformunun RevRake'e gönderdiği her şey, geri dönen yanıtlar ve RevRake'in affiliate tracker'larına ve operatörün kendi sistemlerine gönderdikleri. İşlerin hangi sırayla yapılacağı için entegrasyon rehberini okuyun.
Temel URL'ler
API, operatörün platformu için dört imzalı endpoint'ten (ikisi yazma, ikisi okuma için) ve ziyaretçilerin açtığı takip linkinden oluşur. İmzalı endpoint'ler ayrıca bir OpenAPI 3.1 dosyası olarak yayımlanır.
| Endpoint | Anlamı |
|---|---|
POST https://app.revrake.com/v1/postback | Tek bir olayı veya olayların toplu gönderimini bildirir. İmzalı. |
POST https://app.revrake.com/v1/files | Günlük bir REG veya SALES dosyası gönderir. İmzalı. |
GET https://app.revrake.com/v1/reports | Bir raporu JSON veya CSV olarak okur. İmzalı; operatör veya affiliate anahtarıyla. |
GET https://app.revrake.com/v1/commissions | Komisyon defterini sayfa sayfa okur. İmzalı; operatör veya affiliate anahtarıyla. |
GET https://app.revrake.com/v1/affiliates | Markanın ortaklarını listeler. İmzalı, operatör anahtarıyla. |
GET https://app.revrake.com/v1/links | İzleme bağlantılarını listeler. İmzalı, operatör veya ortak anahtarıyla. |
GET https://app.revrake.com/v1/deals | Anlaşmaları şu an geçerli koşullarla listeler. İmzalı, operatör anahtarıyla. |
GET https://track.revrake.com/c/{code} | Takip linki: tıklamayı kaydeder ve yönlendirir. İmzasız. |
app.revrake.com adresindeki portallar, oturum açmış bir kullanıcının arkasında kendi endpoint'lerini kullanır. Bunlar herkese açık bir API değildir ve haber verilmeden değişebilir. Raporlar, defter ve ödeme satırları oradan CSV olarak da indirilebilir.
Anahtarlar
İki tür anahtar vardır. Her birinin bir anahtar ID'si ve bir gizli anahtarı vardır ve her biri istekleri aynı şekilde imzalar. Anahtarlar asla paylaşılmaz: her tarafın kendi anahtarı vardır.
| Anahtar ID'sinin başı | Kime ait | Ne yapabilir |
|---|---|---|
pb_ | Operatör. Marka başına bir etkin anahtar; operatör portalının Entegrasyon sayfasındadır. Gizli anahtarı bir çalışma alanı yöneticisi görebilir ve anahtarı o yenileyebilir. | Olay ve dosya gönderir. Programın tamamının ya da affiliate=<number> ile tek bir affiliate'in raporlarını ve defterini okur. |
ak_ | Tek bir affiliate. Her affiliate kendi anahtarını affiliate portalının API sekmesinde oluşturur. Gizli anahtar yalnızca bir kez, anahtar oluşturulduğunda gösterilir. | O affiliate'in kendi raporlarını ve komisyonlarını okur, başka hiçbir şeyi okumaz. Olay gönderemez: /v1/postback ve /v1/files, 401 unknown_key ile yanıt verir. |
Operatör anahtarını asla bir affiliate'e vermeyin. Her affiliate'in rakamlarını okur ve olay yazabilir. API erişimi isteyen bir affiliate kendi anahtarını oluşturur.
- Her iki türde de yeni bir anahtar eskisini hemen iptal eder. Bir affiliate anahtarını iptal edip anahtarsız da kalabilir.
- Bir affiliate anahtarı yalnızca affiliate programda onaylıyken çalışır. Aksi halde bir okuma
403affiliate_inactiveile yanıtlanır. - Bir affiliate anahtarıyla
affiliateparametresi yok sayılır veby=affiliategün bazında yanıtlanır. - Okumaların hız sınırı anahtar başına sayılır.
Kimlik doğrulama
Her /v1 isteği bir anahtarla imzalanır. Her istek üç başlık taşır:
| Başlık | Değer |
|---|---|
X-RevRake-Key | Anahtar ID'niz. pb_ (operatör) veya ak_ (affiliate) ile başlar. |
X-RevRake-Timestamp | Saniye cinsinden geçerli Unix zamanı. Bir istek, bu zamandan beş dakika öncesine veya sonrasına kadar kabul edilir. |
X-RevRake-Signature | Gizli anahtarınızla hesaplanan küçük harfli hex HMAC-SHA256: bir POST için <timestamp>.<body> değerinin, bir GET için <timestamp>.<path>?<query> değerinin. |
Bir isteği imzalamak için:
- Gövdeyi oluşturun ve göndereceğiniz baytları aynen saklayın.
- Saniye cinsinden geçerli Unix zamanını ondalık metin olarak alın.
- Zaman damgasını, bir noktayı (
.) ve gövdeyi art arda ekleyin. - Bunun HMAC-SHA256'sını gizli anahtarınızla hesaplayın ve küçük harfli hex olarak yazın.
- Gövdeyi değiştirmeden, üç başlıkla birlikte gönderin.
Bir okumayı imzalama
Bir GET isteğinin gövdesi yoktur; bu nedenle imza onun yerine istek hedefini kapsar: yol ve sorgu, tam olarak gönderildiği haliyle, örneğin 1790000000./v1/reports?by=link&days=7. Sorgu yoksa imzalanan metin zaman damgası, bir nokta ve yoldur. Adresi bir kez oluşturun, o metni imzalayın ve o metni gönderin: imzaladıktan sonra sorguyu yeniden sıralayan veya yeniden kodlayan bir istemci imzayı bozar.
- Önce anahtar, sonra zaman damgası, sonra imza kontrol edilir.
Content-Typebaşlığı zorunlu değildir. Olaylar içinapplication/json, dosyalar içintext/csvgönderin.- Yenilenen bir anahtar hemen çalışmayı durdurur.
İmzalama örnekleri
Her örnekte tek bir imzalama fonksiyonu vardır; örnek bir kayıt gönderir ve ardından bir rapor okur. Anahtar ID'sini ve gizli anahtarı kendinizinkilerle değiştirin.
curl
KEY="pb_your_key_id"
SECRET="your_secret"
BASE="https://app.revrake.com"
# sign <payload>: hex HMAC-SHA256 of "<timestamp>.<payload>" under the secret
sign() { printf '%s.%s' "$TS" "$1" | openssl dgst -sha256 -hmac "$SECRET" -hex | sed 's/^.* //'; }
# Write: the payload is the body.
TS=$(date +%s)
BODY='{"type":"registration","player_id":"PLR-1001","click_id":"CID_FROM_LANDING_URL"}'
curl -X POST "$BASE/v1/postback" \
-H "Content-Type: application/json" \
-H "X-RevRake-Key: $KEY" \
-H "X-RevRake-Timestamp: $TS" \
-H "X-RevRake-Signature: $(sign "$BODY")" \
-d "$BODY"
# Read: the payload is the path and the query, exactly as sent.
TS=$(date +%s)
TARGET='/v1/reports?by=link&days=7'
curl "$BASE$TARGET" \
-H "X-RevRake-Key: $KEY" \
-H "X-RevRake-Timestamp: $TS" \
-H "X-RevRake-Signature: $(sign "$TARGET")" Node.js
import { createHmac } from 'node:crypto';
const KEY = 'pb_your_key_id';
const SECRET = 'your_secret';
const BASE = 'https://app.revrake.com';
// hex HMAC-SHA256 of "<timestamp>.<payload>" under the secret
function sign(secret, timestamp, payload) {
return createHmac('sha256', secret).update(`${timestamp}.${payload}`).digest('hex');
}
function headers(payload) {
const ts = Math.floor(Date.now() / 1000).toString();
return { 'X-RevRake-Key': KEY, 'X-RevRake-Timestamp': ts, 'X-RevRake-Signature': sign(SECRET, ts, payload) };
}
// Write: the payload is the body. Send the same string you signed.
const body = JSON.stringify({ type: 'registration', player_id: 'PLR-1001', click_id: 'CID_FROM_LANDING_URL' });
const write = await fetch(`${BASE}/v1/postback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...headers(body) },
body,
});
console.log(write.status, await write.json());
// Read: the payload is the path and the query, exactly as sent.
const target = '/v1/reports?by=link&days=7';
const read = await fetch(BASE + target, { headers: headers(target) });
console.log(read.status, await read.json()); Python
import hashlib
import hmac
import json
import time
import urllib.error
import urllib.request
KEY = "pb_your_key_id"
SECRET = "your_secret"
BASE = "https://app.revrake.com"
def sign(secret: str, timestamp: str, payload: bytes) -> str:
"""hex HMAC-SHA256 of "<timestamp>.<payload>" under the secret"""
return hmac.new(secret.encode(), timestamp.encode() + b"." + payload, hashlib.sha256).hexdigest()
def call(method: str, target: str, body: bytes | None = None):
ts = str(int(time.time()))
# Write: the payload is the body. Read: the path and the query, as sent.
payload = body if body is not None else target.encode()
headers = {"X-RevRake-Key": KEY, "X-RevRake-Timestamp": ts, "X-RevRake-Signature": sign(SECRET, ts, payload)}
if body is not None:
headers["Content-Type"] = "application/json"
req = urllib.request.Request(BASE + target, data=body, method=method, headers=headers)
try:
with urllib.request.urlopen(req, timeout=10) as res:
return res.status, json.load(res)
except urllib.error.HTTPError as e:
return e.code, json.load(e)
event = {"type": "registration", "player_id": "PLR-1001", "click_id": "CID_FROM_LANDING_URL"}
print(*call("POST", "/v1/postback", json.dumps(event).encode()))
print(*call("GET", "/v1/reports?by=link&days=7")) PHP
<?php
const KEY = 'pb_your_key_id';
const SECRET = 'your_secret';
const BASE = 'https://app.revrake.com';
// hex HMAC-SHA256 of "<timestamp>.<payload>" under the secret
function sign(string $secret, string $timestamp, string $payload): string
{
return hash_hmac('sha256', $timestamp . '.' . $payload, $secret);
}
function call(string $method, string $target, ?string $body = null): array
{
$ts = (string) time();
// Write: the payload is the body. Read: the path and the query, as sent.
$payload = $body ?? $target;
$headers = [
'X-RevRake-Key: ' . KEY,
'X-RevRake-Timestamp: ' . $ts,
'X-RevRake-Signature: ' . sign(SECRET, $ts, $payload),
];
$ch = curl_init(BASE . $target);
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => $method, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10]);
if ($body !== null) {
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$answer = curl_exec($ch);
return [curl_getinfo($ch, CURLINFO_RESPONSE_CODE), json_decode($answer, true)];
}
$event = ['type' => 'registration', 'player_id' => 'PLR-1001', 'click_id' => 'CID_FROM_LANDING_URL'];
print_r(call('POST', '/v1/postback', json_encode($event)));
print_r(call('GET', '/v1/reports?by=link&days=7')); Go
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"net/http"
"strconv"
"time"
)
const (
key = "pb_your_key_id"
secret = "your_secret"
base = "https://app.revrake.com"
)
// sign is the hex HMAC-SHA256 of "<timestamp>.<payload>" under the secret.
func sign(secret, timestamp string, payload []byte) string {
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(timestamp + "."))
mac.Write(payload)
return hex.EncodeToString(mac.Sum(nil))
}
func call(method, target string, body []byte) (int, string, error) {
ts := strconv.FormatInt(time.Now().Unix(), 10)
// Write: the payload is the body. Read: the path and the query, as sent.
payload := body
if body == nil {
payload = []byte(target)
}
req, err := http.NewRequest(method, base+target, bytes.NewReader(body))
if err != nil {
return 0, "", err
}
req.Header.Set("X-RevRake-Key", key)
req.Header.Set("X-RevRake-Timestamp", ts)
req.Header.Set("X-RevRake-Signature", sign(secret, ts, payload))
if body != nil {
req.Header.Set("Content-Type", "application/json")
}
res, err := (&http.Client{Timeout: 10 * time.Second}).Do(req)
if err != nil {
return 0, "", err
}
defer res.Body.Close()
answer, err := io.ReadAll(res.Body)
return res.StatusCode, string(answer), err
}
func main() {
event := []byte(`{"type":"registration","player_id":"PLR-1001","click_id":"CID_FROM_LANDING_URL"}`)
fmt.Println(call("POST", "/v1/postback", event))
fmt.Println(call("GET", "/v1/reports?by=link&days=7", nil))
} Test vektörü
Bu girdilerle kodunuz tam olarak şu imzaları üretmelidir:
- Gizli anahtar
- test_secret
- Zaman damgası
- 1791072000
- Gövde
- {"type":"registration","player_id":"PLR-1001","btag":"1001_1"}
- İmza
- 115d8c73c6069d8953a36ca3a68c114da6232e4ba31889fd519d41ab1350a603
- Bir okumanın istek hedefi
- /v1/reports?by=link&days=7
- Okumanın imzası
- ed1ed72dd7ddef22c762f63b8919011e7c36c7214b55b72693c5927fb4b911d0
Sınırlar
Ürünün bugün entegrasyonlara, takibe ve affiliate'lere uyguladığı sınırların tamamı, rakamlarıyla birlikte bunlardır. Giriş, parola sıfırlama ve başvuruların da kötüye kullanıma karşı sınırları vardır.
| Sınır | Anlamı |
|---|---|
| 120 | Anahtar başına, dakikada okuma sayısı: GET /v1/reports ve GET /v1/commissions birlikte |
| 30 000 | Anahtar başına, dakikada olay isteği: POST /v1/postback, bir seferde 1.000'e kadar |
| 60 | Anahtar başına, dakikada dosya: POST /v1/files, bir seferde 10'a kadar |
| 4 MB | POST /v1/postback gövdesi, tek olay veya toplu gönderim |
| 32 MB | POST /v1/files gövdesi |
| 1 – 1000 | Bir toplu gönderimdeki olay sayısı |
| 200 000 | Bir dosyadaki veri satırı sayısı |
| 300 s | X-RevRake-Timestamp ile gerçek zaman arasındaki fark, her iki yönde |
| 24 h | ts ve period değerlerinin ne kadar gelecekte olabileceği |
| 100 | player_id uzunluğu, karakter olarak |
| 200 | txn_id uzunluğu, karakter olarak |
| 0 / 2 | Bir tutardaki ondalık basamak sayısı: para biriminin basamak sayısı (çoğunda iki; XOF, UGX veya JPY gibi para birimlerinde sıfır) |
| 1 – 365 | Bir raporun days değeri |
| 10, 25, 50, 100, 500, 1000 | Defterin per_page değeri: şu değerlerden biri |
| 1 – 100 000 | Defterin page değeri |
| 100 | q uzunluğu, karakter olarak; daha uzun metin kesilir |
| 200 | Bir takip linkindeki sub1–sub5 değerlerinin, her UTM etiketinin ve her reklam click ID'sinin uzunluğu, karakter olarak; daha uzun değerler kesilir |
| 10 | Affiliate başına postback hedefi sayısı |
| 2000 | Bir postback adres şablonunun uzunluğu, karakter olarak |
| 5 s | Bir tracker'ın bir postback'e yanıt vermesi için tanınan süre |
| 50 | Portalda gösterilen gelen günlüğü: son 7 günün en yeni girdileri |
| 2000 | Bir webhook endpoint adresinin uzunluğu, karakter olarak |
| 5 s | Bir webhook endpoint'inin yanıt vermek için sahip olduğu süre |
| 20 | Endpoint kapatılmadan önce art arda başarısız webhook denemesi sayısı |
| 100 | Teslimat günlüğünde webhook endpoint başına gösterilen teslimatlar |
| 2 – 40 | Bir promosyon kodunun uzunluğu: harf, rakam, tire ve alt çizgi |
| 32 MB | RevRake'in adresinizden aldığı bir dosyanın boyutu |
| 60 s | Adresinizin alınan bir dosyayı teslim etmek için sahip olduğu süre |
| 0 – 3600 s | Kayıt süresi kuralı için tıklamadan sonraki saniye (0 kapatır) |
| 0 – 365 | Açık bir fraud işaretinin kendiliğinden karara bağlanmasından önceki gün sayısı (0 hiçbir zaman demektir) |
| 1 – 200 | Tek bir toplu kararda serbest bırakılan veya onaylanan işaretler |
| 0 – 10 000 (20) | Tıklama patlaması işareti konmadan önce tek bir adresten bir linke dakikada yapılabilecek tıklama sayısı (0 kapatır; değiştirmezseniz 20) |
| 60 + 1 / min | Bir affiliate'in oluşturabileceği takip linkleri: bir seferde 60, sonra dakikada bir. Bunun ötesinde yanıt Retry-After ile 429 olur |
| 2 MB | Portalda yüklenen bir banner görselinin boyutu: PNG, JPEG, GIF veya WebP |
İki yazma endpoint'i, POST /v1/postback ve POST /v1/files, anahtar başına sınırlıdır (tabloya bakın). Her yanıt X-RateLimit-Limit ve X-RateLimit-Remaining taşır; ret, Retry-After ile birlikte 429 olur. Olaylarınızı geldikleri hızda gönderin, geriye dönük yükleme için toplu gönderim kullanın. Takip linkinin hız sınırı yoktur; bir linke tek adresten gelen olağandışı bir tıklama patlaması fraud işareti oluşturur ve yine de yönlendirilir.
Okumaların hız sınırı
- Her anahtar dakikada 120 okuma yapabilir. Hak, 120'lik bir kovadır: bir okuma kovadan bir hak alır ve her yarım saniyede bir hak geri gelir. Bir süredir kullanılmamış bir anahtar art arda 120 okuma yapabilir; ondan sonra saniyede iki.
- Her okuma yanıtı
X-RateLimit-Limit(her zaman120) veX-RateLimit-Remaining(şu anda kaç okuma kaldığı) başlıklarını taşır. - Sınır aşıldığında yanıt, bir
Retry-Afterbaşlığıyla birlikte429rate_limitedolur: beklenecek saniye. Bekleyin, sonra aynı isteği yeni bir zaman damgasıyla imzalayarak yeniden gönderin. - Sınır anahtar başına sayılır: operatörün anahtarının ve her affiliate'in anahtarının kendi hakkı vardır.
HTTP/1.1 200 OK
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117 HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
Retry-After: 1
{"error":"rate_limited","message":"Too many requests: at most 120 reads a minute per key. One more is allowed every half second; wait the seconds in Retry-After and try again."} Bir 429 yanıtını ele alma
// read(target) signs one GET with a fresh timestamp and sends it,
// as in the signing samples.
async function readWithRetry(target, tries = 5) {
for (let i = 0; i < tries; i++) {
const res = await read(target);
if (res.status !== 429) return res;
const seconds = Number(res.headers.get('Retry-After')) || 1;
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
}
throw new Error('still rate limited after ' + tries + ' tries');
} POST /v1/postback
Operatörün platformundan tek bir olayı bildirir. Gövde, bir type alanı ve o türün alanlarını taşıyan bir JSON nesnesi ya da bu tür nesnelerden oluşan bir JSON dizisidir (toplu gönderim).
POST https://app.revrake.com/v1/postback typeşunlardan biridir:registration,deposit,chargeback,ngr.- Tür için listelenmeyen bir alan
422ile reddedilir; böylece bir yazım hatası asla sessizce yok sayılmaz. ts, olayın RFC 3339 biçimindeki zamanıdır (2026-10-04T08:15:00Z). Verilmezse isteğin zamanı kullanılır. Bir UTC farkı taşımalıdır (Zveya+03:00); UTC farkı olmayan bir zaman reddedilir. Bir günden fazla gelecekte olamaz.- Tutar, JSON metni veya JSON sayısı olarak bir ondalık değerdir:
"25.00"veya25.5. Binlik ayırıcı ve üs kullanılmaz; ondalık basamak sayısı para birimininkini aşamaz. currencyüç harfli bir ISO 4217 kodudur. Küçük harf kabul edilir. Verilmezse çalışma alanının raporlama para birimi kullanılır.- Metin değerlerinin başındaki ve sonundaki boşluklar kırpılır;
click_idvebtaghariç: bunları landing sayfasına geldikleri haliyle aynen gönderin.
registration
Yeni bir oyuncu. click_id, btag, promo_code veya bunlardan birkaçını gönderin; hiçbiri yoksa oyuncu atfedilmemiş olarak kaydedilir. Oyuncu bir kez, burada atfedilir. Yanıt: attribution.
{"type":"registration","player_id":"PLR-1001","click_id":"01K6QF3M8Z5T7W9XB2C4D6E8GH","btag":"1001_1"} | Alan | Tür | Zorunlu | Örnek | Anlamı |
|---|---|---|---|---|
player_id | string | evet | "PLR-1001" | Oyuncu için sizin ID'niz. En fazla 100 karakter. Olayın anahtarıdır. |
click_id | string | hayır | "01K6QF3M8Z5T7W9XB2C4D6E8GH" | Oyuncunun geldiği cid: 26 karakter, harf ve rakam; büyük veya küçük harf. |
btag | string | hayır | "1001_1" | Platformunuzun oyuncuda sakladığı btag: <affiliate numarası>_<link numarası>, yalnızca rakam. |
promo_code | string | hayır | "GARAGE50" | Oyuncunun kayıt olurken girdiği promosyon kodu. Büyük/küçük harf fark etmez. Oyuncuyu yalnızca click_id ve btag atfetmediğinde atfeder. |
email_hash | string | hayır | "9f86d081…0f00a08" | Küçük harfe çevrilmiş e-postanın hex SHA-256'sı. Yalnızca kendine yönlendirme kontrolünde kullanılır. |
email_domain | string | hayır | "example.com" | Oyuncunun e-postasının alan adı, @ işaretinden sonraki kısım (example.com). Yalnızca geçici e-posta kuralında kullanılır. Yalnızca alan adını gönderin: adresin tamamı gelirse oyuncuda yalnızca alan adı tutulur, ancak gelen günlüğü isteği geldiği haliyle göstermeye devam eder. |
ip | string | hayır | "203.0.113.7" | Kayıt sırasındaki IP adresi. Hash'lenir; yalnızca kendine yönlendirme kontrolünde ve bir btag için eşleşen tıklamayı bulmakta kullanılır. |
country | string | hayır | "KE" | Oyuncunun ülkesi: iki harf, ISO 3166-1 alpha-2 (GB, KE). Küçük harf kabul edilir. İki harf olmayan bir değer oyuncuyu ülkesiz bırakır. Alan gönderilmezse oyuncuyu getiren tıklamanın ülkesi kullanılır. Bir anlaşma, ödeme yapmadığı ülkeleri listeleyebilir. |
ts | string | hayır | "2026-10-04T08:15:00Z" | Oyuncunun kaydolduğu zaman. Atıf penceresi bu zamandan ölçülür. |
{
"status": "accepted",
"event_type": "registration",
"event_id": "0199b2c4-6f1e-7a53-9d0c-2b8f4e1a7c33",
"attribution": {
"attributed": true,
"reason": "click",
"affiliate_number": 1001,
"link_number": 1,
"click_id": "01K6QF3M8Z5T7W9XB2C4D6E8GH",
"policy_version": 1,
"window_days": 30,
"model": "last_click"
}
} deposit
Her para yatırma işlemi için işlem kimliğinizi txn_id alanında taşıyan bir deposit olayı gönderin. Anlaşma, CPA eşiğini ilk yatırımla mı yoksa chargeback tutarları düşülmüş toplam yatırımla mı karşılaştıracağını belirler. Koşul sağlandığında oyuncu başına bir CPA komisyonu beklemede oluşturulur.
{"type":"deposit","player_id":"PLR-1001","txn_id":"TX-88213","amount":"25.00","currency":"KES","first":true} | Alan | Tür | Zorunlu | Örnek | Anlamı |
|---|---|---|---|---|
player_id | string | evet | "PLR-1001" | Oyuncu için sizin ID'niz. En fazla 100 karakter. |
txn_id | string | evet | "TX-88213" | Sizin işlem ID'niz. En fazla 200 karakter. Olayın anahtarıdır. |
amount | string | number | evet | "25.00" | Yatırım tutarı, sıfırdan büyük. |
currency | string | hayır | "KES" | Yatırımın para birimi. Her para birimi kabul edilir. |
ts | string | hayır | "2026-10-04T08:20:00Z" | Yatırımın yapıldığı zaman. Hangi anlaşma sürümünün ve hangi günün kurunun uygulanacağını belirler. |
first | boolean | hayır | true | Bu oyuncunun ilk yatırımıysa true. Verilmezse, RevRake oyuncuya ait daha önceki bir yatırım bilmiyorsa yatırım ilk sayılır. |
{
"status": "accepted",
"event_type": "deposit",
"event_id": "0199b2c9-03aa-7e10-b6d2-91c07f5e2a18",
"commission": {
"effect": "created",
"type": "cpa",
"amount_minor": 4000,
"status": "hold"
}
} chargeback
Kendi txn_id değeriyle bir chargeback olayı gönderin; asıl yatırımın txn_id değerini ref_txn_id alanına yazın. Bu, yatırımın tamamını geri alır. Toplam yatırıma dayalı CPA’da komisyon yalnızca kalan uygun toplam eşiğin altına düşerse geri alınır: bekleyen komisyon iptal edilir; onaylanmış veya ödenmiş komisyon için iade satırı eklenir.
{"type":"chargeback","txn_id":"CB-5001","ref_txn_id":"TX-88213"} | Alan | Tür | Zorunlu | Örnek | Anlamı |
|---|---|---|---|---|
txn_id | string | evet | "CB-5001" | Chargeback'in kendisi için sizin ID'niz. En fazla 200 karakter. Olayın anahtarıdır. |
ref_txn_id | string | evet | "TX-88213" | Geri çekilen yatırımın txn_id'si. |
player_id | string | hayır | "PLR-1001" | İsteğe bağlı. Gönderilirse referans verilen yatırımın oyuncusuyla eşleşmelidir. |
ts | string | hayır | "2026-10-09T11:00:00Z" | Chargeback'in gerçekleştiği zaman. |
{
"status": "accepted",
"event_type": "chargeback",
"event_id": "0199cc10-7b2d-7c41-a3f0-5d2e8b9c1f47",
"commission": {
"effect": "cancelled",
"type": "cpa",
"amount_minor": 4000,
"status": "rejected"
}
} ngr
Bir oyuncunun bir güne veya bir aya ait net oyun geliri (NGR). Dönemin sonunda yürürlükte olan anlaşma sürümündeki RevShare'i beklemede olarak kazandırır. Oyuncu kayıtlı olmalıdır. Yanıt: commission.
{"type":"ngr","player_id":"PLR-1001","period":"2026-10-03","amount":"118.40","currency":"KES"} | Alan | Tür | Zorunlu | Örnek | Anlamı |
|---|---|---|---|---|
player_id | string | evet | "PLR-1001" | Oyuncu için sizin ID'niz. En fazla 100 karakter. |
period | string | evet | "2026-10-03" | Tutarın ait olduğu gün (YYYY-MM-DD) veya ay (YYYY-MM). Bir ay ile ilk günü farklı dönemlerdir. Bir günden fazla gelecekte olamaz. |
amount | string | number | evet | "118.40" | Dönemin net oyun geliri (NGR). Oyuncu kazandıysa negatif. |
currency | string | hayır | "KES" | Tutarın para birimi. |
ggr | string | number | hayır | "240.00" | İsteğe bağlı. Dönemin brüt oyun geliri, aynı para biriminde. Affiliate'e gösterilir; komisyonu değiştirmez. |
bonuses | string | number | hayır | "80.00" | İsteğe bağlı. Brüt gelirden düşülen bonuslar. Yalnızca gösterilir. |
fees | string | number | hayır | "21.60" | İsteğe bağlı. Brüt gelirden düşülen ücretler, örneğin ödeme veya platform ücretleri. Yalnızca gösterilir. |
taxes | string | number | hayır | "20.00" | İsteğe bağlı. Brüt gelirden düşülen vergiler. Yalnızca gösterilir. |
ts | string | hayır | "2026-10-04T02:00:00Z" | Rakamın bildirildiği zaman. |
{
"status": "accepted",
"event_type": "ngr",
"event_id": "0199b2d1-5c0e-7b42-8a17-3e9d6f0c4b21",
"commission": {
"effect": "created",
"type": "revshare",
"amount_minor": 2960,
"status": "hold"
}
} { veya } içeren bir click_id, btag, promo_code veya player_id reddedilir: bu, platformunuzun bir yer tutucuyu doldurmadan gönderdiği anlamına gelir.
Yanıt
Kaydedilen veya zaten kayıtlı olan bir olay 200 ve bir JSON nesnesiyle yanıtlanır. Geçerli olmayan alanlar yanıtta yer almaz.
| Alan | Tür | Anlamı |
|---|---|---|
status | string | accepted; olay zaten kayıtlıysa duplicate. |
event_type | string | Gönderdiğiniz type. |
event_id | string | Kaydedilen olayın RevRake ID'si, bir UUID. Her yeniden gönderimde aynıdır. |
attribution | object | Bir kayıt için: atıf kararı. |
attribution.attributed | boolean | Oyuncunun bir affiliate'e ait olup olmadığı. |
attribution.reason | string | Neden. Aşağıdaki tabloya bakın. |
attribution.affiliate_number | integer | Affiliate. Yalnızca atfedildiyse. |
attribution.link_number | integer | Affiliate'in linki. Yalnızca atfedildiyse. |
attribution.click_id | string | Eşleşen tıklama, varsa. |
attribution.policy_version | integer | Kararı veren, markanın atıf kuralının sürümü. |
attribution.window_days | integer | O sürümün atıf penceresi, gün olarak. |
attribution.model | string | last_click veya first_click: o sürümün modeli. |
commission | object | Bir yatırım, bir chargeback ve ngr için: olayın defterdeki etkisi. |
commission.effect | string | created, cancelled (beklemedeki bir komisyon reddedildi), reversed (bir iade satırı eklendi) veya none. |
commission.type | string | cpa, revshare, adjustment veya reversal. |
commission.amount_minor | integer | Anlaşmanın para biriminin en küçük biriminde tutar (4000, 40.00 demektir). Bir iade ve aşağı yönlü bir düzeltme için negatiftir. |
commission.status | string | hold, approved veya rejected. |
commission.reason | string | effect değeri none olduğunda neden hiçbir şey oluşturulmadığı. Aşağıdaki tabloya bakın. |
waiting_for_player | boolean | Oyuncusu henüz kayıtlı olmayan bir yatırım için true. Yatırım saklanır ve kayıt geldiğinde fiyatlandırılır. |
duplicate_of | string | Canlı olaylar ile eski günlük dosyalar arasındaki eski ilk yatırım eşleşmesi için önceki event_id. Güncel SALES özetleri günlük kapsam kullanır ve her gerçek işlem kimliğini korur. |
detail | string | duplicate_of ile birlikte: bu yatırımın hangi önceki yatırımı tekrarladığını söyleyen bir cümle. |
{
"status": "accepted",
"event_type": "deposit",
"event_id": "0199b2c9-03aa-7e10-b6d2-91c07f5e2a18",
"waiting_for_player": true
} {
"status": "duplicate",
"event_type": "deposit",
"event_id": "0199b31f-8c02-7a66-b4e1-2d7f9a3c6e15",
"duplicate_of": "0199b2c9-03aa-7e10-b6d2-91c07f5e2a18",
"detail": "The same deposit (TX-88213) was already reported through the API; this one adds nothing."
} {
"status": "duplicate",
"event_type": "deposit",
"event_id": "0199b2ca-11d4-7f09-8c55-0a6e2d4b7f90",
"commission": { "effect": "none", "reason": "not_first" }
} Bir komisyon hold durumuyla oluşturulur. Anlaşmanın bekletme süresi dolduğunda otomatik olarak onaylanır; onu hâlâ bekleten bir şey varsa onaylanmaz: açık bir fraud işareti, onaylı olmayan bir affiliate veya eksik bir kur.
Atıf nedenleri
Önce click ID denenir. Sizinkilerden biri değilse btag denenir. Kural btag'in kazandığını söylüyorsa ve btag bir linkle eşleşiyorsa, bunun yerine önce btag denenir. Bir linkle eşleşen btag, tıklama bulunamasa bile oyuncuyu atfeder. Promosyon kodu en son, yalnızca ne click ID ne de btag oyuncuyu atfetmediğinde denenir. Kural, penceresi ve ikisinden hangisinin kazandığı Entegrasyon sayfasında belirlenir; her değişiklik yeni bir sürümdür. Politika promosyon kodunun geçerli olduğunu söylediğinde, bir bağlantıyla eşleşen kod ikisinden önce denenir; eşleşmeyen kod onlara geri döner. Bir anlaşma kendi penceresini belirleyebilir; bu, ortaklarının bağlantılarındaki tıklamalar için politikanın penceresinin yerini alır.
reason | Anlamı | |
|---|---|---|
click | Atfedildi | Click ID, pencere içindeki bir tıklamayla eşleşti. |
first_click | Atfedildi | Kural ilk tıklamadır: click ID pencere içindeki bir tıklamayla eşleşti ve aynı ziyaretçinin (aynı adres ve cihaz) pencere içindeki daha önceki sayılan bir tıklaması onun yerine atandı. |
btag_click | Atfedildi | Btag bir linkle eşleşti ve o linkte pencere içinde bir tıklama bulundu. |
btag_only | Atfedildi | Btag bir linkle eşleşti; pencere içinde tıklama bulunamadı. |
promo_code | Atfedildi | Ne click ID ne de btag oyuncuyu atfetti ve promosyon kodu onaylı bir affiliate'in koduyla eşleşti. |
no_tag | Atfedilmedi | Kayıtta ne click ID ne de btag vardı. |
unknown_click | Atfedilmedi | Click ID sizinkilerden değil ve btag gönderilmedi. |
unknown_btag | Atfedilmedi | Btag hatalı biçimde ya da hiçbir linkle eşleşmiyor. |
outside_window | Atfedilmedi | Tıklama atıf penceresinden daha eski ya da kayıttan daha sonra. |
affiliate_inactive | Atfedilmedi | Affiliate onaylı değil ya da tıklama yapıldığında onaylı değildi. |
unknown_promo_code | Atfedilmedi | Yalnızca bir promosyon kodu gönderildi ve kodlarınızdan hiçbiriyle eşleşmiyor. |
promo_code_retired | Atfedilmedi | Yalnızca bir promosyon kodu gönderildi ve kod kullanımdan kaldırılmış. |
Neden komisyon oluşturulmadı
commission.reason | Anlamı |
|---|---|
unattributed | Oyuncu hiçbir affiliate'e ait değil. |
not_first | Oyuncunun ilk yatırımı değil. |
already_earned | Oyuncunun CPA'sı zaten kazanılmıştı. İkinci bir "ilk" yatırım hiçbir şey ödemez ve bir işaret oluşturur. |
no_deal_version | Affiliate'in anlaşması yok ya da olay sırasında anlaşmanın bir sürümü yoktu. |
country_blocked | Oyuncu, anlaşmanın ödeme yapmadığı bir ülkeden. Oyuncu kayıtlı ve atfedilmiş olarak kalır. |
no_cpa_in_deal | Anlaşma CPA ödemiyor. |
below_threshold | Anlaşmanın CPA esasına göre ilk yatırım veya net toplam yatırım tutarı eşiğin altındadır. |
no_commission | Bir chargeback için: yatırım hiçbir şey kazandırmamıştı. |
no_revshare_in_deal | ngr için: anlaşma RevShare ödemiyor. |
fx_rate_missing | ngr için: dönem için henüz kur yok. Bildirim saklanır ve kur oluştuğunda fiyatlandırılır. |
unchanged | ngr için: komisyonda hiçbir şeyi değiştirmeyen düzeltilmiş bir rakam. |
Toplu gönderim
Gövde, aynı endpoint'e aynı başlıklarla gönderilen, 1 ile 1.000 arasında olaydan oluşan bir JSON dizisi olabilir. İmza dizinin tamamını kapsar. Olaylar sırayla ve her biri ayrı işlenir; böylece reddedilen bir olay diğerlerini asla durdurmaz.
Okunabilen bir toplu istek, içindeki her olay reddedilmiş olsa bile 200 ile yanıtlanır. Sayılara bakın.
[
{"type":"deposit","player_id":"PLR-1001","txn_id":"TX-88213","amount":"25.00","first":true},
{"type":"ngr","player_id":"PLR-1001","period":"2026-10-03","amount":"118.40"},
{"type":"ngr","player_id":"PLR-1002","period":"October","amount":"-12.50"}
] {
"results": [
{
"index": 0,
"status": "accepted",
"event_type": "deposit",
"event_id": "0199b2c9-03aa-7e10-b6d2-91c07f5e2a18",
"commission": { "effect": "created", "type": "cpa", "amount_minor": 4000, "status": "hold" }
},
{
"index": 1,
"status": "duplicate",
"event_type": "ngr",
"event_id": "0199b2d1-5c0e-7b42-8a17-3e9d6f0c4b21",
"commission": { "effect": "created", "type": "revshare", "amount_minor": 2960, "status": "hold" }
},
{
"index": 2,
"status": "rejected",
"field": "period",
"message": "period must be a day (2026-10-03) or a month (2026-10), not in the future."
}
],
"accepted": 1,
"duplicate": 1,
"rejected": 1
} | Alan | Tür | Anlamı |
|---|---|---|
results | array | Gönderildikleri sırayla, olay başına bir girdi. |
results[].index | integer | Olayın dizideki konumu, 0'dan başlar. |
results[].status | string | accepted, duplicate veya rejected. |
results[].event_type | string | Tekil yanıttaki gibi. Reddedilen bir olayda bulunmaz. |
results[].event_id | string | Tekil yanıttaki gibi. Reddedilen bir olayda bulunmaz. |
results[].attribution | object | Tekil yanıttaki gibi. |
results[].commission | object | Tekil yanıttaki gibi. |
results[].waiting_for_player | boolean | Tekil yanıttaki gibi. |
results[].field | string | Reddedilen bir olay için: düzeltilecek alan. |
results[].message | string | Reddedilen bir olay için: neyin düzeltileceği. |
accepted | integer | Kaç olayın kaydedildiği. |
duplicate | integer | Kaçının zaten kayıtlı olduğu. |
rejected | integer | Kaçının reddedildiği. |
POST /v1/files
Entegrasyon sayfasından yüklemeye ya da RevRake'in dosyayı platformunuzun yayımladığı bir adresten almasına alternatif olarak günlük bir CSV dosyası gönderir. Gövde dosyanın kendisidir; başlıklar ve imza bir olaydakilerle aynıdır ve imza zaman damgasını ve dosyayı kapsar. Dosya adı filename sorgu parametresinde verilir; portalda gösterilir, başka bir amaçla kullanılmaz.
POST https://app.revrake.com/v1/files?filename=sales-2026-10-03.csv Hangi dosya olduğuna başlık satırı karar verir: registration_date sütunu olan dosya bir REG dosyasıdır, activitydate sütunu olan dosya bir SALES dosyasıdır. Sütun adları büyük/küçük harf ayrımı yapılmadan eşleştirilir. Aşağıda listelenmeyen sütunlar dosyada kalabilir; yok sayılırlar.
Kabul edilen biçimler: YYYY-MM-DD, YYYY-MM-DD HH:MM:SS, YYYY-MM-DDTHH:MM:SS, RFC 3339 veya YYYY/MM/DD. UTC ofseti yoksa çalışma alanı Ayarlar bölümündeki dosya saat dilimi kullanılır (varsayılan UTC). Ofsetli zaman damgası kesin bir anı belirtir; SALES için bu anın dosya saat dilimindeki takvim günü kullanılır. Gün ve ay tahmin edilmez: 30/09/2026 reddedilir.
REG dosyası: kayıtlı oyuncu başına bir satır
| Sütun | Zorunlu | Anlamı |
|---|---|---|
registration_date | evet | Oyuncunun kaydolduğu zaman. ts olur. |
player_id | evet | Oyuncu için sizin ID'niz. |
btag | evet | Oyuncuda saklanan btag. Boş olabilir: oyuncu o zaman, bir promosyon kodu atfetmedikçe, atfedilmez. |
promo_code | hayır | İsteğe bağlı. Oyuncunun kayıt olurken girdiği promosyon kodu; bir kaydın promo_code alanı olarak kullanılır. |
player_country | hayır | İsteğe bağlı. Oyuncunun iki harfli ülke kodu (ISO 3166-1 alpha-2); bir kaydın country alanı olarak kullanılır. Boş: tıklamanın ülkesi. |
brand_name,registration_date,btag,promo_code,player_id,player_country
Example,2026-10-03,1001_1,,PLR-1001,KE
Example,2026-10-03,,,PLR-1002,KE
Example,2026-10-03,,GARAGE50,PLR-1003,KE SALES dosyası: oyuncu ve gün başına bir satır
| Sütun | Zorunlu | Anlamı |
|---|---|---|
activitydate | evet | Çalışma alanının dosya saat dilimine göre belirlenen etkinlik günü. |
player_id | evet | Oyuncu için sizin ID'niz. |
currency | evet | Satırdaki tutarların para birimi. Boşsa: çalışma alanının raporlama para birimi. |
deposits | evet | Günün brüt yatırım toplamı; o gün gerçekleşen ilk yatırım dahildir. Tüm zamanların toplamı değildir; chargeback tutarlarını düşmeyin. |
first_deposit_amount | evet | İlk yatırımın tutarı, yalnızca gerçekleştiği gün; diğer günlerde sıfır. Zaten deposits içindedir, tekrar eklenmez. Günün brüt yatırım toplamını aşamaz. |
chargeback | evet | Bu etkinlik gününün toplam chargeback tutarı; brüt yatırımlardan ayrıdır. Tüm zamanların toplamı değildir. CPA için toplam yatırımı azaltır, ancak belirli bir işlemi tanımlamaz. |
*_net_revenue | hayır | Adı net_revenue olan veya _net_revenue ile biten her sütun. Doldurulmuş hücreler oyuncunun o güne ait net gelirinde toplanır ve ngr olarak bildirilir. Hiçbiri doldurulmamış bir satır gelir bildirmez. |
*_gross_revenue | hayır | İsteğe bağlı. Adı gross_revenue olan veya _gross_revenue ile biten sütunlar; günün ngr olayının ggr değerinde toplanır. Yalnızca affiliate'e gösterilir. |
*_bonus | hayır | İsteğe bağlı. Adı bonus olan veya _bonus ile biten sütunlar; bonuses içinde toplanır. Yalnızca gösterilir. |
*_fees | hayır | İsteğe bağlı. Adı fees olan veya _fees ile biten sütunlar; fees içinde toplanır. Yalnızca gösterilir. |
*_taxes | hayır | İsteğe bağlı. Adı taxes olan veya _taxes ile biten sütunlar; taxes içinde toplanır. Yalnızca gösterilir. |
brand_name,activitydate,player_id,btag,currency,deposits,first_deposit_amount,chargeback,casino_net_revenue,sports_net_revenue
Example,2026-10-03,PLR-1001,1001_1,KES,3500.00,2500.00,0,118.40,0
Example,2026-10-03,PLR-1002,,KES,900.00,0,0,-12.50, - Her SALES satırı bir günlük para özeti ve gelir hücreleri doluysa ayrı bir NGR olayı kaydeder. Bağımsız işlenirler: para özetinin reddedilmesi kabul edilmiş geliri geri almaz; tersi de geçerlidir. Yanıttaki tüm sorunları kontrol edin.
- Marka, oyuncu ve etkinlik günü başına bir özet vardır; ilk kabul edilen para birimi sabitlenir. Dosya yeniden adlandırılsa veya sıralansa da aynı parasal değerler tekrar olarak işlenir. Kabul edilmiş bir günün tutarlarını, para birimini veya saat dilimi sınırlarını değiştirmek, sıfırdan yapılan değişiklikler dahil, çakışmadır. Önceden kaydedilmiş tutarlar değişmez.
deposits,first_deposit_amountvechargebackzorunlu sütunlardır. Boş hücreler sıfırdır. Tutarlar negatif olmayan, satırın para birimi hassasiyetine uygun ondalık sayılar olmalıdır. Dışa aktarımı bağlamadan önce bu tanımları platformunuzla doğrulayın.- REG dosyasını SALES’ten önce gönderin. Önce gelen para özetleri saklanır ve kayıt geldiğinde hesaplanır. Bilinmeyen oyuncunun NGR verisi reddedilir: REG sonrasında SALES veya NGR’yi tekrar gönderin. Saklanan para özeti tekrar olarak işlenir.
- Özet, dosya saat dilimindeki etkinlik günü ve para biriminin tekil postback’lerini kapsar; tutarlar iki kez eklenmez. İşlem kimlikleri referans olarak kullanılabilir kalır. Bilinen yatırım veya chargeback tutarlarının özeti aşması ya da ilk yatırıma ilişkin çelişkili kanıtlar çakışma oluşturur.
- Toplam yatırıma dayalı CPA’da yatırımlar eksi chargeback tutarları anlaşma eşiğine ulaşmalıdır. Her günlük nakit akışı etkinlik tarihinin kurunu, tekil postback’ler ise kendi UTC gününün kurunu kullanır. Eksik kurlar hesaplamayı
fx_rate_missingile bekletir. Eksik chargeback kuru, ödemeye dahil edilmiş komisyonlar da dahil, mutabakata kadarchargeback_fx_missingile ödemeyi engeller. - İlk yatırıma dayalı CPA’da toplam chargeback hangi yatırımın geri alındığını göstermeyebilir. Kayıtlı oyuncunun belirsiz para özeti reddedilir. Özet REG’den önce geldiyse saklanır ve kayıt kabul edilir, ancak oluşan CPA
chargeback_reference_missingile beklemede kalır. İşlem referansının incelenmesi içinref_txn_idalanına asıl yatırımın işlem kimliğini yazarak chargeback gönderin. - Gelir, değiştirilemeyen parasal toplamlardan ayrıdır: günlük NGR tutarı değişirse düzeltme bildirimi sayılır ve komisyon farkı bir düzeltme olarak eklenir.
Yanıt
Okunabilir dosya 200 döndürür. Sayaçlar yalnızca satır değil olay bazındadır: bir SALES satırı para özeti ve NGR’yi ayrı kaydedebilir, kısmi başarı da mümkündür. Her zaman rejected ve problems alanlarını kontrol edin.
{
"id": "0199b31e-2a40-7d18-9b6c-4f1e7a2c5d03",
"filename": "sales-2026-10-03.csv",
"kind": "sales",
"uploaded_at": "2026-10-04T02:00:07Z",
"rows_total": 2,
"accepted": 3,
"duplicates": 0,
"rejected": 1,
"skipped": 0,
"problems": ["line 3: Player PLR-1002 is not registered. Send the registration first."]
} | Alan | Tür | Anlamı |
|---|---|---|
id | string | Bu içe aktarımın RevRake ID'si. |
filename | string | Verdiğiniz ad ya da reg.csv / sales.csv. |
kind | string | reg veya sales. |
uploaded_at | string | Alındığı zaman. |
rows_total | integer | Dosyadaki veri satırları. |
accepted | integer | Kaydedilen olaylar. |
duplicates | integer | Zaten kayıtlı olan olaylar. |
rejected | integer | Reddedilen satırlar veya olaylar. Her biri, satırın kendisiyle birlikte gelen günlüğündedir. |
skipped | integer | Kaydedilecek bir şey içermeyen satırlar. |
problems | array of string | Reddedilen ilk 20 satır, line N: reason biçiminde. Hiç yoksa yanıtta yer almaz. |
GET /v1/reports
Raporlar sayfasındaki raporu verir: tıklamalar, işaretlenen tıklamalar, kayıtlar, ilk yatırımlar ve kazanç; tek bir ölçüte göre gruplanmış olarak, çalışma alanının saat dilimine göre bugüne kadarki günler için. Bugünün rakamları bir rapor istendiğinde yenilenir; yoğun bir programda en fazla 30 saniyede bir.
GET https://app.revrake.com/v1/reports?by=link&days=7 | Parametre | Tür | Örnek | Anlamı |
|---|---|---|---|
by | string | link | Satırların nasıl gruplandığı: day, link, sub1, country veya affiliate. Varsayılan day. affiliate verildiğinde by=affiliate, day olarak yanıtlanır. |
days | integer | 7 | Bugün dahil kaç gün: 1 ile 365 arası. Varsayılan 30. |
from | string | 2026-09-01 | Herhangi bir dönemin ilk günü, çalışma alanının saat diliminde YYYY-MM-DD. from veya to verildiğinde days yok sayılır. En fazla 366 gün. |
to | string | 2026-09-30 | Dönemin son günü, dahil. Varsayılan bugün. |
affiliate | integer | 1001 | Bir affiliate numarası. Raporu o affiliate ile sınırlar. Yalnızca operatör anahtarıyla; her zaman kendi affiliate'ini okuyan bir affiliate anahtarıyla yok sayılır. |
tag | string | Influencers | Gruplar sayfasındaki gibi bir grubun adı (birden fazlası için tekrarlayın: herhangi biri). Yalnızca operatör anahtarıyla; affiliate veya ortak anahtarıyla yok sayılır. Bilinmeyen bir ad 422 unknown_tag döner. |
format | string | csv | csv, JSON yerine bir CSV dosyası döndürür. |
{
"by": "link",
"from": "2026-09-28",
"to": "2026-10-04",
"currency": "KES",
"rows": [
{
"key": "0199a7f0-41c2-7e55-b1d9-6c3a8e2f7b10",
"label": "telegram-october",
"clicks": 1840,
"flagged_clicks": 212,
"registrations": 96,
"ftds": 31,
"earnings_minor": 12400000
}
],
"total": {
"key": "",
"label": "",
"clicks": 1840,
"flagged_clicks": 212,
"registrations": 96,
"ftds": 31,
"earnings_minor": 12400000
}
} | Alan | Tür | Anlamı |
|---|---|---|
by | string | Kullanılan gruplama. |
from | string | Raporun ilk günü, YYYY-MM-DD. |
to | string | Son gün: çalışma alanının saat dilimine göre bugün ya da verdiğiniz to. |
currency | string | Çalışma alanının raporlama para birimi. Kazanç bu para birimindedir. |
rows | array | Grup başına bir girdi. |
rows[].key | string | Grubu tanımlayan değer: gün, linkin veya affiliate'in RevRake ID'si, sub1 değeri ya da iki harfli ülke kodu. |
rows[].label | string | Portalın grup için gösterdiği metin: gün, linkin kampanya etiketi, sub1 değeri, ülke ya da affiliate'in adı ve numarası. |
rows[].clicks | integer | Temiz tıklamalar. |
rows[].flagged_clicks | integer | Bot, tekrar, patlama veya onaylı olmayan bir affiliate'e ait olarak işaretlenen tıklamalar. clicks içinde yer almaz. |
rows[].registrations | integer | Atfedilen oyuncular. |
rows[].ftds | integer | İlk yatırımlar. |
rows[].earnings_minor | integer | Kazanılan komisyonlar, raporlama para biriminin en küçük biriminde, her birinin kazanıldığı günün kuruyla. |
total | object | Satırların toplamı, bir satırın biçiminde. |
CSV olarak
format=csv ile yanıt bir dosyadır. İlk sütunu gruplamanın adını taşır ve etiketi içerir; ardından clicks, flagged_clicks, registrations, first_deposits ve ondalık olarak earnings_<currency> gelir. Son satır toplamdır.
link,clicks,flagged_clicks,registrations,first_deposits,earnings_KES
telegram-october,1840,212,96,31,124000.00
total,1840,212,96,31,124000.00 GET /v1/commissions
Komisyon defterinin bir sayfasını verir; başka türlü sıralamadıysanız en yeni en üstte. Satırların tutarları asla düzenlenmez ve satırlar asla silinmez, ancak bir satırın status değeri yazıldıktan sonra değişir: hold, sonra approved, sonra paid ya da rejected. Bir senkronizasyon yalnızca yeni satırları almamalı, bir dönemi yeniden okuyup satırları id değerine göre güncellemelidir.
GET https://app.revrake.com/v1/commissions?from=2026-09-01&to=2026-10-01&per_page=500 | Parametre | Tür | Örnek | Anlamı |
|---|---|---|---|
status | string | approved | hold, approved, paid veya rejected. Varsayılan: tümü. |
from | string | 2026-09-01 | Yalnızca bu zamanda veya sonrasında gerçekleşen satırlar: RFC 3339 ya da UTC olarak bir gün, YYYY-MM-DD. |
to | string | 2026-10-01 | Yalnızca bu zamandan önce gerçekleşen satırlar. Aynı biçimler. |
affiliate | integer | 1001 | Bir affiliate numarası. Satırları, totals ve owed değerlerini o affiliate ile sınırlar. Yalnızca operatör anahtarıyla; bir affiliate anahtarıyla yok sayılır. |
tag | string | Influencers | Gruplar sayfasındaki gibi bir grubun adı (birden fazlası için tekrarlayın: herhangi biri). Yalnızca operatör anahtarıyla; affiliate veya ortak anahtarıyla yok sayılır. Bilinmeyen bir ad 422 unknown_tag döner. |
q | string | PLR-1001 | Oyuncu ID'si veya affiliate adı bu metni içeren satırlar. En fazla 100 karakter. |
sort | string | when | when, affiliate, player, status, deposit veya commission. Varsayılan when. |
dir | string | asc | asc veya desc. Varsayılan desc. |
page | integer | 2 | Sayfa, 1'den başlar. Varsayılan 1. |
per_page | integer | 500 | 10, 25, 50, 100, 500 veya 1000. Varsayılan 25. |
{
"currency": "KES",
"totals": { "hold": 1240000, "approved": 3720000, "paid": 9800000 },
"owed": { "KES": { "hold": 1240000, "approved": 3720000, "paid": 9800000 } },
"period": true,
"commissions": [
{
"id": "0199b2c9-0a11-7c3e-9f20-7d4b1e6a2c58",
"occurred_at": "2026-09-14T08:20:00Z",
"type": "cpa",
"currency": "KES",
"gross_currency": "KES",
"reporting_minor": 400000,
"affiliate_name": "Odds Garage",
"affiliate_number": 1001,
"player_ref": "PLR-1001",
"deal_name": "CPA 4000",
"deal_version": 2,
"gross_minor": 250000,
"rate_snapshot": 400000,
"amount_minor": 400000,
"status": "approved",
"status_reason": "",
"hold_until": "2026-10-14T08:20:00Z",
"status_note": ""
}
],
"total": 1,
"page": 1,
"per_page": 500
} | Alan | Tür | Anlamı |
|---|---|---|
currency | string | Çalışma alanının raporlama para birimi. |
totals | object | Durum başına toplam, raporlama para biriminin en küçük biriminde: defterin tamamı üzerinden ya da from veya to verildiğinde o dönem üzerinden. affiliate dışındaki diğer filtrelerle sınırlanmaz. Hâlâ kur bekleyen satırlar buna dahil değildir. |
owed | object | Para birimi ve durum başına toplam, her komisyonun kendi para biriminde: borçlu olunan tutar. totals ile aynı satırlar üzerinden. |
period | boolean | from veya to verildiğinde true; bu durumda totals ve owed yalnızca o dönemi kapsar. |
commissions | array | Bu sayfanın satırları. |
total | integer | Filtrelerle eşleşen satır sayısı. |
page | integer | Yanıtlanan sayfa. |
per_page | integer | Kullanılan sayfa başına satır sayısı. |
Bir komisyon satırı
| Alan | Tür | Anlamı |
|---|---|---|
id | string | Satırın RevRake ID'si, bir UUID. Asla değişmez: güncellemeyi buna göre yapın. |
occurred_at | string | Komisyonun kazanıldığı zaman: yatırımın zamanı, gelir döneminin sonu ya da chargeback'in zamanı. |
type | string | cpa, revshare, adjustment, reversal veya tier. |
amount_minor | integer | Komisyon, currency para biriminin en küçük biriminde. Bir iade ve aşağı yönlü bir düzeltme için negatiftir. |
currency | string | Komisyonun para birimi: anlaşmanın para birimi. |
reporting_minor | integer | null | Çalışma alanının raporlama para biriminde komisyon, kazanıldığı günün kuruyla. O kur eksikken null. |
gross_minor | integer | Komisyonun dayandığı yatırım veya net gelir, gross_currency para biriminin en küçük biriminde. |
gross_currency | string | Yatırımın veya gelirin para birimi. |
rate_snapshot | integer | Uygulanan koşullar: en küçük birimde CPA tutarı ya da yüzdenin yüzde biri cinsinden RevShare oranı (2500, %25 demektir). |
status | string | hold, approved, paid veya rejected. Bkz. komisyon durumları. |
status_reason | string | Bir satırın neden hâlâ beklemede olduğu ya da neden reddedildiği. Diğer durumlarda boştur. Her değer nedenler tablosunda yer alır. |
status_note | string | Geri alınan bir komisyon için operatörün notu, affiliate'in okuduğu şekliyle. Diğer durumlarda boştur. |
hold_until | string | null | Bekletme süresinin dolduğu zaman. Bir iade için null. |
affiliate_number | integer | Affiliate'in numarası. |
affiliate_name | string | Affiliate'in adı. |
player_ref | string | Oyuncu için sizin ID'niz. |
deal_name | string | Anlaşma. |
deal_version | integer | Satırı fiyatlandıran anlaşma sürümü. |
Program listeleri: ortaklar, bağlantılar, anlaşmalar
Arka ucunuz programı portalın gösterdiği gibi listeleyebilir; diğer okumalar gibi imzalanır ve aynı sınıra sayılır. GET /v1/affiliates ve GET /v1/deals operatör anahtarı ister; ortak anahtarıyla 403 operator_key_required döner. GET /v1/links markanın bağlantılarını ya da affiliate=<numara> ile bir ortağınkileri döner; ortak anahtarıyla yalnızca o ortağınkileri.
Listeler page (1'den başlar) ve per_page (1–500, varsayılan 100) ile sayfalanır ve total içerir. GET /v1/affiliates ayrıca status alır: pending, approved, rejected veya suspended. API üzerinden ortak veya bağlantı oluşturma henüz sunulmuyor: ne için kullanacağınızı bize yazın.
GET https://app.revrake.com/v1/links?affiliate=1001&per_page=100 Her ortak
| Alan | Tür | Anlamı |
|---|---|---|
number | integer | Ortak numarası, btag'in ilk kısmı; bir bağlantıda bağlantı numarası, ikinci kısmı. |
name | string | Ortağın adı. |
email | string | Ortağın e-posta adresi. |
status | string | pending, approved, rejected veya suspended. |
deal | string | Ortağın anlaşmasının adı; onaydan önce boş. |
created_at | string | Oluşturulma zamanı, RFC 3339. |
decided_at | string | null | Başvurunun onaylandığı veya reddedildiği ya da hesabın askıya alındığı an; öncesinde null. |
Her bağlantı
| Alan | Tür | Anlamı |
|---|---|---|
affiliate_number | integer | Bağlantının ait olduğu ortağın numarası. |
number | integer | Ortak numarası, btag'in ilk kısmı; bir bağlantıda bağlantı numarası, ikinci kısmı. |
code | string | Bağlantı adresindeki kod. |
url | string | İzleme bağlantısı; markanın doğrulanmış izleme alan adında veya ortak alan adında. |
btag | string | <affiliate_number>_<number>. |
campaign | string | Bağlantının kampanya etiketi. |
landing_path | string | null | Bağlantının sitenizde açtığı sayfa; markanın varsayılanı için null. |
subs | string[5] | Bağlantıda sabitlenen sub1–sub5; ayarlanmamışsa boş metin. |
promo_code | string | null | Bir kod için oluşturulmuş bağlantıda promosyon kodu; değilse null. |
vanity_url | string | null | Ortak ayarladıysa kısa adres /go/<ad>; değilse null. |
created_at | string | Oluşturulma zamanı, RFC 3339. |
Her anlaşma
| Alan | Tür | Anlamı |
|---|---|---|
name | string | Ortağın adı. |
currency | string | Anlaşmanın kazandırdığı ve ödediği para birimi. |
listed | boolean | Herkese açık başvuru sayfasının anlaşmayı gösterip göstermediği. |
default | boolean | Yeni ortakların bu anlaşmayı alıp almadığı. |
version | integer | Anlaşmanın şu an geçerli sürümü. |
effective_at | string | O sürümün yürürlüğe girdiği an, RFC 3339. |
terms | object | O sürümün koşulları: tutarlar küçük birimlerde, paylar baz puanda (2500 = %25), bekletme günleri, eksi ay kuralı, anlaşmanın kendi atıf penceresi, kademeler. |
Veri ambarı aktarımı
Entegrasyon sayfasında ayarlanır: RevRake her gece her markanın bir önceki gününü S3 uyumlu herhangi bir hizmetteki kendi kovanıza, <klasör>/<marka>/<YYYY-AA-GG>/ yoluna yazar; gün, çalışma alanının saat diliminde sayılır. gzip ile sıkıştırılmış dört CSV dosyası (UTF-8, başlık satırı, RFC 4180 tırnaklama), ardından manifest.json. Manifest en son yazılır: bir günü manifest oluştuğunda yükleyin ve her dosyanın rows, bytes ve sha256 değerlerini karşılaştırın.
Bir satır geldiği güne aittir (tıklama: yapıldığı an), bu yüzden geç gelen günlük dosya geldiği günde yer alır, asla kaybolmaz. Zamanlar milisaniyeli UTC, RFC 3339; tutarlar kendi para biriminde ondalık. Durumlar aktarım anındakidir: bir komisyonun durumu sonra değişir, güncel durum için GET /v1/commissions'ı yeniden okuyun. Başarısız bir gün her saat yeniden denenir ve yedi güne kadar geriye telafi edilir; bir günü yeniden aktarmak dosyalarının üzerine yazar. Dosyanın sonuna yeni sütunlar eklenebilir; bir yükleyicinin değişmesi gerektiğinde manifestteki schema_version değişir.
manifest.json: schema_version, workspace, brand, day, timezone, from ve to (günün UTC sınırları), generated_at ve files: her biri için name, rows, bytes, sha256 (sıkıştırılmış dosyanın).
clicks.csv.gz: o gün markanın bağlantılarındaki tüm tıklamalar, işaretlenenler dahil.
| Alan | Tür | Anlamı |
|---|---|---|
click_id | string | Açılış sayfanıza ve postback'lere geçen tıklama kimliği. |
clicked_at | string | Tıklamanın zamanı. |
affiliate_number | integer | Ortak numarası. |
link_number | integer | Bağlantı numarası. |
btag | string | <affiliate_number>_<link_number>. |
country | string | İki harfli ülke kodu; bilinmiyorsa boş. |
device | string | Tarayıcıya göre desktop, mobile, tablet veya bot. |
os | string | Tarayıcıya göre işletim sistemi. |
browser | string | Tarayıcı. |
sub1 … sub5 | string | sub1–sub5: tıklamanın alt kimlikleri. |
utm_source … utm_content | string | utm_source–utm_content: tıklamanın UTM etiketleri. |
gclid, fbclid, ttclid, msclkid, wbraid | string | gclid, fbclid, ttclid, msclkid, wbraid: açılış URL'sindeki reklam platformu tıklama kimlikleri. |
referer | string | Ziyaretçinin geldiği sayfa. |
flags | string | Tıklamanın neden sayılmadığı, ; ile ayrılmış: bot, duplicate, burst, inactive. Temiz tıklamada boş. |
players.csv.gz: kaydı o gün gelen oyuncular.
| Alan | Tür | Anlamı |
|---|---|---|
player_id | string | Oyuncu kimliğiniz. |
registered_at | string | Gönderdiğiniz kayıt zamanı. |
arrived_at | string | RevRake'in kaydettiği an. |
country | string | İki harfli ülke kodu; bilinmiyorsa boş. |
attributed | boolean | Bir ortağa atfedildiğinde true. |
attribution_reason | string | Nedeni, postback yanıtındaki gibi: click, btag_only, promo_code, no_tag… |
affiliate_number | integer | Ortak numarası. |
link_number | integer | Bağlantı numarası. |
btag | string | <affiliate_number>_<link_number>. |
click_id | string | Oyuncuyu atfeden tıklama; yoksa boş. |
policy_version | integer | Kararı veren atıf politikası sürümü. |
events.csv.gz: günlük SALES özetleri dahil o gün gelen, markanın kabul edilmiş tüm olayları ve içerikleri.
| Alan | Tür | Anlamı |
|---|---|---|
event_id | string | Olayın RevRake kimliği. |
type | string | registration, deposit, chargeback, daily_sales veya ngr; komisyon için cpa, revshare, tier, adjustment veya reversal. |
external_id | string | Olayın anahtarı: oyuncu kimliği, işlem kimliği ya da oyuncu ve dönem. |
player_id | string | Oyuncu kimliğiniz. |
occurred_at | string | Bildirdiğiniz gerçekleşme zamanı; komisyonda kazanıldığı an. |
received_at | string | RevRake'in olayı kabul ettiği an. |
source | string | s2s (API) veya file (günlük dosya). |
payload | JSON | RevRake'in okuduğu haliyle olay, JSON. |
result | JSON | RevRake'in yanıtı, JSON. |
commissions.csv.gz: o gün yazılan komisyon satırları.
| Alan | Tür | Anlamı |
|---|---|---|
commission_id | string | Satırın kimliği, GET /v1/commissions'daki id. |
created_at | string | Satırın yazıldığı an. |
occurred_at | string | Bildirdiğiniz gerçekleşme zamanı; komisyonda kazanıldığı an. |
type | string | registration, deposit, chargeback, daily_sales veya ngr; komisyon için cpa, revshare, tier, adjustment veya reversal. |
status | string | Aktarım anında hold, approved, paid veya rejected. |
status_reason | string | Neden bekletildiği veya reddedildiği; değilse boş. |
affiliate_number | integer | Ortak numarası. |
player_id | string | Oyuncu kimliğiniz. |
deal | string | Anlaşmanın adı. |
deal_version | integer | Onu fiyatlayan anlaşma sürümü. |
gross | decimal | Arkasındaki yatırım veya net gelir. |
gross_currency | string | Onun para birimi. |
amount | decimal | Komisyon. |
currency | string | Anlaşmanın para birimi. |
reporting_amount | decimal | Raporlama para birimindeki komisyon; kur eksikken boş. |
reporting_currency | string | Çalışma alanının raporlama para birimi. |
reverses_id | string | Ters kayıtta, ters çevrilen satır. |
payout_item_id | string | Ay kapandığında onu alan ödeme satırı. |
Idempotency (tekrarın zararsızlığı)
Her olayın doğal bir anahtarı vardır. Aynı içeriğin tekrarı kayıtlı yanıtı "status":"duplicate" ile döndürür. Kayıt bekleyen yatırımın yanıtı kayıt geldiğinde güncellenir. Değişen parasal bilgiler çakışabilir; NGR düzeltmeleri revizyon kullanır. Zaman aşımından sonra yeni imza zaman damgasıyla tekrar deneyin.
| Olay | Anahtar | Aynı anahtar yeniden gelirse |
|---|---|---|
registration | player_id | İlk yanıt. Etiketler farklı olsa bile atıf yeniden kararlaştırılmaz. |
deposit | txn_id | Kayıtlı yanıt; beklenen kayıt geldiğinde güncellenir. Oyuncu, tutar veya para birimi değişirse çakışır. İşlemi kapsayan SALES özeti işlem kimliğini silmez. |
chargeback | txn_id | İlk yanıt. Aynı yatırımın yeni bir txn_id ile ikinci chargeback'i reddedilir. |
ngr | player_id ve period | Aynı tutar ve para birimi: ilk yanıt. Farklı bir tutar: bir düzeltme; yeni bir revizyon olarak saklanır ve fark bir adjustment olarak kaydedilir. |
| CSV | REG satırı: player_id | Bir registration gibi. |
| CSV | SALES para özeti: marka, oyuncu ve etkinlik günü | Aynı toplamlar tekrar sayılır. Yatırımlar, ilk yatırım, chargeback tutarları, para birimi veya gün sınırları değişirse, önceki özet sıfır olsa bile çakışır. |
| CSV | SALES satırı, gelir: oyuncu ve gün | ngr gibi: yeniden dışa aktarımda değişen bir rakam bir düzeltmedir. |
Durumlar ve hatalar
API'nin verebileceği her yanıt ve bir kaydın alabileceği her durum, tek bir yerde. Bir hata bir JSON nesnesiyle yanıtlanır: error (kod), message (İngilizce bir cümle) ve invalid için field.
{"error":"invalid","field":"amount","message":"amount must be a positive decimal in KES, for example 25.00."} HTTP durumları ve hata kodları
| Durum | error | Endpoint | Ne zaman | Ne yapmalı |
|---|---|---|---|---|
| 200 | – | /v1/* | İstek işlendi. Bir olay için: kaydedildi ya da zaten kayıtlıydı. Bir toplu istek veya dosya için: okundu; sayılara bakın, bazı öğeler reddedilmiş olabilir. | |
| 400 | bad_request | POST /v1/postback | Gövde bir dizi olarak başlıyor ama olaylardan oluşan bir JSON dizisi değil. | İsteği düzeltin. Aynı istek yeniden gönderilirse aynı yanıtı alır. |
| 401 | unknown_key | /v1/* | X-RevRake-Key içindeki anahtar bilinmiyor veya iptal edilmiş ya da bir yazma endpoint'inde affiliate anahtarı kullanılmış. | Geçerli anahtarı kullanın. Yeniden göndermek işe yaramaz. |
| 401 | bad_timestamp | /v1/* | X-RevRake-Timestamp eksik, saniye cinsinden bir tam sayı değil ya da beş dakikadan fazla sapmış. | Saati ve imza kodunu kontrol edin, sonra yeni bir zaman damgasıyla yeniden gönderin. |
| 401 | bad_signature | /v1/* | İmza, zaman damgası ve gövdeyle eşleşmiyor (bir okumada: yol ve sorguyla). | Saati ve imza kodunu kontrol edin, sonra yeni bir zaman damgasıyla yeniden gönderin. |
| 403 | affiliate_inactive | GET /v1/* | Affiliate'i programda onaylı olmayan bir affiliate anahtarıyla yapılan okuma: beklemede, reddedilmiş veya askıya alınmış. | İstekte düzeltilecek bir şey yok: hesabın operatör tarafından onaylanması gerekir. |
| 404 | unknown_affiliate | GET /v1/* | Operatör anahtarıyla yapılan bir okuma: affiliate içindeki numaraya sahip bir affiliate yok. | İsteği düzeltin. Aynı istek yeniden gönderilirse aynı yanıtı alır. |
| 405 | – | /v1/* | Endpoint bu metodu kabul etmiyor. JSON gövdesi yoktur. | İsteği düzeltin. Aynı istek yeniden gönderilirse aynı yanıtı alır. |
| 413 | too_large | POST /v1/* | Gövde, endpoint'in sınırından büyük. | İsteği düzeltin. Aynı istek yeniden gönderilirse aynı yanıtı alır. |
| 422 | invalid | POST /v1/*, GET /v1/reports | Olay veya dosya bu haliyle kullanılamaz. | İsteği düzeltin. Aynı istek yeniden gönderilirse aynı yanıtı alır. |
| 429 | rate_limited | GET /v1/* | Anahtarın hakkından fazla okuma yapıldı. Yanıt Retry-After taşır. | Retry-After içindeki saniye kadar bekleyin, sonra yeniden gönderin. |
| 500 | internal | /v1/* | Bizim tarafımızda bir şeyler ters gitti. | Yeniden gönderin. |
- Hiç olay içermeyen ya da 1.000'den fazla olay içeren bir toplu istek
422invalidile vefieldolmadan reddedilir. - Operatör anahtarıyla gelen hatalı bir zaman damgası veya imza için dönen
401, gelen günlüğündebad_signatureolarak listelenir. Bilinmeyen bir anahtarla veya bir affiliate anahtarıyla gelen istek günlüğe yazılmaz. - Bir okuma yalnızca kullanılamayan bir rapor dönemi için (
fromveto)422ile yanıtlanır. İzin verilmeyen bir değere sahip diğer her parametre yok sayılır ve varsayılanı kullanılır. Yanıttakiby,pageveper_pagedeğerlerini kontrol edin. - Zaman aşımında,
429ve500yanıtlarında yeniden deneyin. Başka bir4xxyanıtını değiştirmeden yeniden denemeyin.
Bir 422 yanıtında field neyi belirtir
field | Ne zaman |
|---|---|
body | Gövde geçerli bir JSON değil ya da bilinmeyen veya hatalı biçimli bir alan taşıyor (örneğin RFC 3339 olmayan bir ts). |
type | type eksik ya da dört türden biri değil. |
player_id | Eksik ya da 100 karakterden uzun; doldurulmamış bir yer tutucu; ngr için, kayıtlı olmayan bir oyuncu. |
click_id | Doldurulmamış bir yer tutucu. Mesaj misconfigured_macro ile başlar. |
btag | Doldurulmamış bir yer tutucu. Mesaj misconfigured_macro ile başlar. |
promo_code | Doldurulmamış bir yer tutucu. Mesaj misconfigured_macro ile başlar. |
txn_id | Eksik ya da 200 karakterden uzun. |
ref_txn_id | Eksik; bu txn_id ile bilinen bir yatırım yok; ya da yatırım zaten geri çekilmiş. |
amount | Para biriminin izin verdiği bir ondalık değer değil; bir yatırım için, sıfırdan büyük değil. |
currency | Üç harfli bir kod değil. |
ggr | ngr için: para biriminde ondalık bir tutar değil. |
bonuses | ngr için: para biriminde ondalık bir tutar değil. |
fees | ngr için: para biriminde ondalık bir tutar değil. |
taxes | ngr için: para biriminde ondalık bir tutar değil. |
ts | Bir günden fazla gelecekte. |
period | Bir gün veya ay değil ya da gelecekte. |
from | GET /v1/reports için: from veya to YYYY-MM-DD değil, from to değerinden sonra ya da aralarında 366 günden fazla var. |
file | /v1/files için: dosya boş, CSV değil, ne REG ne de SALES dosyası, zorunlu bir sütunu eksik ya da 200.000'den fazla satırı var. |
chargeback | Bir SALES dosyasında: chargeback hücresi uygulanamıyor. Mesaj nedenini söyler. |
Bir olayın durumu
Tek bir olayın yanıtında ve bir toplu isteğin results alanında olay başına yer alır.
status | Anlamı |
|---|---|
accepted | Şimdi kaydedildi. Yanıt ne yaptığını söyler. |
duplicate | Aynı anahtarla zaten kayıtlıdır; aynı içeriğin tekrarı hiçbir şeyi değiştirmez. Eski kanallar arası ilk yatırım eşleşmesi de duplicate_of döndürebilir. Güncel SALES özetleri gerçek postback işlemlerini korur ve kapsanan günlük tutarları yalnızca bir kez sayar. |
rejected | Yalnızca toplu istekte: olay field ve message ile reddedildi. Tek başına gönderilip reddedilen bir olay bunun yerine 422 alır. |
Bir olayın defterdeki etkisi
commission.effect | Anlamı |
|---|---|
created | Bir komisyon satırı oluşturuldu: bir CPA, bir RevShare ya da düzeltilmiş bir rakam için bir düzeltme. |
cancelled | Bir chargeback, hâlâ beklemede olan bir komisyonu reddetti. |
reversed | Bir chargeback, onaylanmış veya ödenmiş bir komisyona karşı bir iade satırı ekledi. |
none | Satır oluşturulmadı. reason nedenini söyler. |
Komisyon türleri
type | Anlamı |
|---|---|
cpa | Anlaşmanın CPA esasına göre ilk yatırım veya chargeback tutarları düşülmüş toplam yatırım eşiği karşıladığında oyuncu başına bir komisyon. |
revshare | Bir oyuncunun bir döneme ait net oyun gelirinin (NGR) payı. Oyuncunun kazandığı bir dönem için negatiftir. |
adjustment | Düzeltilmiş bir gelir rakamının yarattığı fark. |
reversal | Onaylandıktan veya ödendikten sonra geri alınan bir komisyonun negatifi: bir chargeback ile ya da operatör tarafından bir gerekçeyle. Hemen onaylanır ve bir sonraki ödemeden düşülür. |
tier | Anlaşmanın bir hacim kademesinden gelen ek ödeme: bir affiliate bir takvim ayında yeterince yeni yatırım yapan oyuncu getirdiğinde, kademe oranı ile temel oran arasındaki fark o ayın her komisyonunun yanına eklenir. Komisyonuyla aynı bekletmede bekler; komisyon zaten onaylanmışsa hemen onaylanır. Komisyonu reddedildikten veya iade edildikten sonra önceki bir ek ödemeyi geri aldığında negatiftir. |
Komisyon durumları
Bir satır bir kez yazılır ve tutarları asla değişmez. Durumu değişir:
status | Anlamı |
|---|---|
hold | Bekliyor: anlaşmanın bekletme süresinin dolmasını ya da status_reason alanının belirttiği şeyi. |
approved | Bekletme süresi doldu ve satırı bekleten bir şey yok. Bir sonraki aylık ödeme paketine girer. İadeler ve bazı düzeltmeler baştan onaylıdır. |
paid | Satırı içeren ödeme kalemi ödendi olarak işaretlendi. |
rejected | Ödenmeyecek. status_reason nedenini söyler, varsa operatörün notu status_note içindedir. |
status_reason değerleri
Satır yalnızca bekletme süresini bekliyorsa ve normalde onaylanmış veya ödenmiş komisyonlarda boştur. Eksik chargeback kuru onaylanmış satırı da engelleyebilir. Dolandırıcılık bekletmeleri operatörü veya ayarlanmış işaret süresinin dolmasını bekler.
status_reason | Hangi durumla | Anlamı |
|---|---|---|
fx_rate_missing | hold | Gerekli döviz kuru eksik. Hesaplama kur gelene kadar bekler; günlük SALES akışları etkinlik tarihini, tekil postback’ler UTC olay gününü kullanır. |
chargeback_fx_missing | hold, approved, paid | Chargeback henüz değerlenemiyor. Kur gelene ve mutabakat tamamlanana kadar CPA ve kademe ekleri yeni ödemeye alınamaz veya mevcut ödemede ödenmiş olarak işaretlenemez. |
chargeback_reference_missing | hold | Kayıttan önce gelen özet, ilk yatırıma dayalı CPA için geri alınan yatırımı belirlemeyen toplam chargeback içerir. Kayıt ve özet korunur; oluşan CPA işlem referansı incelenene kadar beklemede kalır. |
self_referral | hold | Açık bir fraud işareti: oyuncu, affiliate'in kendisi gibi görünüyor. Operatörün işareti serbest bırakmasını veya onaylamasını bekler. |
click_velocity | hold | Açık bir fraud işareti ya da bir patlamanın parçası olan bir tıklama: bir dakikada tek bir adresten tek bir linke, markanın izin verdiğinden fazla tıklama. Operatörü bekler. |
duplicate_conversion | hold | Açık bir fraud işareti: oyuncu için ikinci bir "ilk" yatırım bildirildi. Operatörü bekler. |
paid_traffic | hold | Açık bir fraud işareti: oyuncuyu getiren tıklama bir reklam ağının click ID'sini taşıyordu. Operatörü bekler. |
disposable_email | hold | Açık bir fraud işareti: oyuncu geçici bir e-posta alan adıyla kaydoldu. Operatörü bekler. |
geo_mismatch | hold | Açık bir fraud işareti: oyuncu, tıklamanın ülkesinden farklı bir ülkede kaydoldu. Operatörü bekler. |
fast_registration | hold | Açık bir fraud işareti: oyuncu, tıklamadan sonra belirlenen saniye içinde kaydoldu. Operatörü bekler. |
affiliate_pending | hold | Komisyon kazanıldığında affiliate henüz onaylanmamıştı. Affiliate onaylandığında satır yalnızca normal bekletme süresini bekler. |
affiliate_rejected | hold | Affiliate'in başvurusu reddedildi. |
affiliate_suspended | hold | Komisyon kazanıldığında affiliate askıya alınmıştı. Affiliate yeniden etkinleştirildiğinde satır yalnızca normal bekletme süresini bekler. |
chargeback | rejected, approved | Reddedilen bir satırda: bir chargeback onu beklemedeyken iptal etti. Bir iade satırında: bir chargeback'in ardından bir komisyonu geri alır. |
below_threshold | rejected | Kurlar kullanılabilir olduğunda uygun ilk yatırım veya net toplam yatırım tutarı anlaşma eşiğinin altında kaldı. |
fraud | rejected, approved | Operatör, satırı bekleten fraud işaretini onayladı ya da komisyonu fraud nedeniyle geri aldı. |
base_rejected | rejected | İkisi de beklemedeyken komisyonu reddedilen bir kademe ek ödemesi. |
self_excluded | rejected, approved | Operatör komisyonu geri aldı: oyuncu kendini dışladı. Reddedilen bir satırda komisyon henüz bir ödemede değildi; bir iade satırında ödemedeydi. |
duplicate_account | rejected, approved | Operatör komisyonu geri aldı: oyuncunun başka bir hesabı var. |
bonus_abuse | rejected, approved | Operatör komisyonu bonus suistimali nedeniyle geri aldı. |
terms_breach | rejected, approved | Operatör komisyonu program şartlarının ihlali nedeniyle geri aldı. |
test_account | rejected, approved | Operatör komisyonu geri aldı: oyuncu bir test hesabıydı. |
other | rejected, approved | Operatör komisyonu, status_note içinde yazılı başka bir nedenle geri aldı. |
Ödeme durumları
Bir ay, affiliate ve para birimi başına bir kalem içeren bir ödeme paketine kapanır. Paketler ve kalemler portalda işlenir; API bunların sonucunu komisyon satırlarının paid durumu olarak gösterir.
| Paket durumu | Anlamı |
|---|---|
draft | Ay kapatıldı. Operatör kalemleri inceler. |
approved | Kilitlendi. Faturalama açıkken ödenecek her kalem bir fatura numarası alır. Banka dosyası (CSV) indirilebilir ve kalemler ödenebilir. |
paid | Ödenecek her kalem ödendi olarak işaretlendi. |
| Kalem durumu | Anlamı |
|---|---|
payable | Bu pakette ödenecek. |
carried | Minimum ödemenin altında ya da sıfırdan büyük değil: sonraki pakete devreder. |
held | Affiliate'in açık bir fraud işareti var ya da program kimlik doğrulanana kadar ödemeleri bekletiyor ve doğrulama henüz kaydedilmedi. Portal hangisi olduğunu söyler. Operatör kalemi serbest bırakabilir; kimlik doğrulamasını kaydetmek de onu serbest bırakır. |
no_details | Affiliate ödemenin nereye yapılacağını girmedi. Banka dosyasında yer almaz. |
written_off | Ay sıfırın altında bitti ve affiliate'in anlaşması eksi bir ayı devretmiyor: bakiye kapanışta silinir ve sonraki pakete hiçbir şey devretmez. Bir üst sınır varsa kalem carried olur ve sınırın üstündeki kısmı silinmiş olarak kaydeder. |
paid | Ödendi olarak işaretlendi. Komisyon satırları paid olur ve affiliate'in tracker'ına haber verilir. |
Bir dosya satırı neden reddedilir
Reddedilen bir satır rejected içinde sayılır, problems içinde line N: reason biçiminde listelenir ve satırın kendisiyle birlikte gelen günlüğünde saklanır. Bir olayın reddedilebileceği nedenlere ek olarak:
- Satır geçerli CSV değildir.
- REG:
registration_dateveyaplayer_ideksik ya da okunamıyor. - SALES:
activitydateveyaplayer_ideksik ya da okunamıyor. - SALES, gelir: oyuncu kayıtlı değil.
- SALES, para: tutar negatif, okunamıyor veya para birimine göre çok fazla ondalık basamak içeriyor.
- SALES: ilk yatırım brüt yatırımları aşıyor.
- SALES: kabul edilen gün değişen parasal toplamlarla, para birimiyle veya saat dilimi sınırlarıyla yeniden dışa aktarılmış.
- SALES: bilinen tekil yatırımlar veya chargeback işlemleri günlük özeti aşıyor.
- SALES: ilk yatırım kanıtı başka bir günle veya bilinen işlemle çelişiyor.
- SALES: kayıtlı oyuncunun ilk yatırıma dayalı CPA’sı için toplam chargeback belirsizdir.
Gelen günlüğündeki sonuçlar
| Durum | Anlamı |
|---|---|
accepted | Kaydedildi, yaptığı şeyle birlikte. |
duplicate | Zaten kayıtlı; ilk yanıt döndürüldü. |
rejected | Reddedildi; ayrıntıda hangi alan olduğu ve nedeni belirtilir. |
bad_signature | Zaman damgası veya imza hatalıydı. |
test | Entegrasyon sayfasından bir test olayı. Gerçek yoldan geçer ve hiçbir şey kaydetmez. |
Bir postback teslimatının durumları
| Durum | Anlamı |
|---|---|
queued | İlk denemesini ya da bir sonraki yeniden denemeyi bekliyor. Portal bunu bekliyor veya yeniden deneniyor olarak gösterir. |
delivered | Tracker 2xx durumuyla yanıt verdi. |
dead | Her yeniden deneme başarısız oldu. Portal bunu vazgeçildi olarak gösterir; affiliate onu elle yeniden gönderebilir. |
Bir affiliate'in durumları
| Durum | Anlamı |
|---|---|
pending | Başvurdu; operatör henüz karar vermedi. |
approved | Programda aktif. |
rejected | Başvuru reddedildi. |
suspended | Operatör tarafından durduruldu. |
Takip linki
Bir takip linkini platformunuz çağırmaz, bir ziyaretçi açar. Link tıklamayı kaydeder ve markanın landing sayfasına bir 302 yönlendirmesiyle yanıt verir. Marka sitesini doğrulayana kadar ziyaretçi önce linkin nereye gittiğini söyleyen kısa bir sayfa görür. Hedef host marka ayarlarından gelir; bir link yalnızca onun üzerinde bir yol seçebilir.
GET https://track.revrake.com/c/a8Kq2Zx?sub1=TRACKER_CLICK_ID&utm_source=telegram HTTP/1.1 302 Found
Location: https://your-site.example/landing?btag=1001_1&cid=01K6QF3M8Z5T7W9XB2C4D6E8GH&utm_source=telegram
Cache-Control: no-store Linkteki parametreler
| Parametre | Anlamı |
|---|---|
sub1 … sub5 | Affiliate'in kendi değerleri; tıklamayla birlikte saklanır ve postback'lerde geri döner. Adresteki bir değer, linke sabitlenen değerin yerini alır. |
utm_source utm_medium utm_campaign utm_term utm_content | Tıklamayla kaydedilir ve landing sayfasına aktarılır. Adresteki bir değer, linke sabitlenen değerin yerini alır. |
gclid fbclid ttclid msclkid wbraid | Reklam ağı click ID'leri. Tıklamayla birlikte saklanır; postback makrosu olarak kullanılabilir. Aktarılmaz. |
Landing URL'sine eklenen parametreler
| Parametre | Anlamı |
|---|---|
cid | Click ID: 26 karakterlik Crockford base32 (rakamlar ve I, L, O, U dışındaki büyük harfler). Zamana göre sıralanır. Metin olarak saklayın. |
btag | <affiliate numarası>_<link numarası>: bir ile dokuz arası rakam, bir alt çizgi, bir ile dokuz arası rakam. |
utm_source … utm_content | Tıklamanın UTM etiketleri, boş değillerse. |
- Markanın landing URL'si sorgusunda
{click_id}içeriyorsa click ID oraya yazılır vecideklenmez. - Onaylı olmayan bir affiliate'in linkine yapılan tıklama kaydedilir ve işaretlenir; ziyaretçi
cidvebtagolmadan yönlendirilir: tıklama atfedilemez. - Botlar, link önizlemeleri,
HEADistekleri, user agent taşımayan istekler ve bir saat içindeki tekrar tıklamalar kaydedilir ve işaretlenir, atılmaz. Raporlar bunları dışarıda bırakır. - Linkteki diğer parametreler saklanmaz ve aktarılmaz.
- Affiliate'in kısa bir ad verdiği bir link
/go/<name>adresinde de,/c/<code>adresindekiyle tamamen aynı şekilde yanıt verir. Kendi doğrulanmış takip alan adı olan bir marka, iki yolu o alan adında da sunar. - Bilinmeyen bir kod
404ve bir HTML hata sayfasıyla yanıtlanır; markası henüz bir hedef belirlememiş bir link de öyle.
Affiliate tracker'larına postback
Bu kısım operatörden iş gerektirmez. Her affiliate portalında en fazla 10 hedef ekler: makrolu bir adres şablonu ve haberdar edilmek istediği olaylar. Affiliate'in oyuncularından biri için bir olay kaydedildiğinde RevRake şablonu doldurur ve bir GET isteğiyle çağırır.
Olaylar
| Olay | {status} | Ne zaman |
|---|---|---|
registration | lead | Bir oyuncu affiliate'e atfedildi. |
ftd | sale | Bir ilk yatırım affiliate'e bir CPA komisyonu kazandırdı. |
commission_approved | approved | Bir komisyon, bekletme süresi dolduğunda onaylandı. |
commission_rejected | rejected | Beklemedeki bir komisyon bir incelemenin ardından reddedildi. |
commission_paid | paid | Bir komisyon bir ödeme paketinde ödendi. |
chargeback | rejected | Bir chargeback bir komisyonu geri aldı. |
Ön ayara göre durum sözcükleri
Bir ön ayardan oluşturulan hedef, {status} içinde tracker'ının tanıdığı sözcükleri gönderir. Voluum, PeerClick ve FunnelFlux Pro ön ayarları ile "Diğer / özel", yukarıdaki tablodaki sözcükleri gönderir. Sözcükler, hedefin taşıdığı ön ayarı izler; hedefin kayıtlı adresi asla değiştirilmez.
| Olay | Keitaro | Binom | RedTrack | BeMob |
|---|---|---|---|---|
registration | lead | lead | other | new |
ftd | sale | sale | pending | approved |
commission_approved | sale | sale | approved | approved |
commission_rejected | rejected | reject | declined | declined |
commission_paid | sale | sale | approved | approved |
chargeback | rejected | reject | declined | chargeback |
Makrolar
Makro, süslü parantez içinde bir addır. URL kodlanmış değeriyle değiştirilir. Adlar büyük/küçük harf ayrımı yapılmadan eşleştirilir. RevRake'in tanımadığı bir ad olduğu gibi gönderilir; böylece bir yazım hatası teslimat günlüğünde görünür. Bilinmeyen bir değer boş gönderilir.
| Makro | Anlamı |
|---|---|
{click_id} | RevRake click ID'si (landing URL'sindeki cid). Oyuncu yalnızca btag ile atfedildiyse boştur. |
{sub1} … {sub5} | Tıklamanın sub1–sub5 değerleri. sub1 genellikle affiliate'in tracker'ının click ID'sini taşır. |
{event} | Olay adı, yukarıdaki tablodaki gibi. |
{status} | Tracker'ların olay için kullandığı sözcük, yukarıdaki tablodaki gibi; bir ön ayardan oluşturulan hedefte ise tracker'ın kendi sözcüğü (bir sonraki tabloya bakın). |
{event_id} | Her olay için farklıdır ve yeniden denemelerde değişmez. |
{conversion_id} | Tek bir komisyonla ilgili her olay için aynıdır: ftd, commission_approved, commission_rejected, commission_paid ve chargeback. Kaydın kendi ID'si vardır. Aynı ID ile yeniden gelen bir dönüşümü güncelleyen bir tracker'da işlem ID'si olarak kullanın; böylece gelir bir kez sayılır. |
{player_id} {affiliate_id} {brand_id} {link_id} | Operatörün oyuncu ID'si, affiliate numarası, program ve link numarası. |
{campaign} | Linkin kampanya etiketi. |
{commission} {commission_minor} | Komisyon, ondalık (40.00) veya en küçük birimde (4000). Kayıt için boş, reddedilen bir komisyon için 0, chargeback için negatiftir. |
{amount} {amount_minor} | Komisyonun dayandığı yatırım veya gelir, ondalık veya en küçük birimde, yapıldığı para biriminde. Kayıt için boştur. |
{amount_currency} | Yatırımın para biriminin ISO kodu. Kayıt için boştur. |
{commission_currency} | Komisyonun para biriminin ISO kodu: anlaşmanın para birimi. Kayıt için boştur. |
{currency} | Postback'in ilgili olduğu paranın ISO kodu: bir komisyon varsa komisyonun para birimi, yoksa yatırımın, o da yoksa çalışma alanının raporlama para birimi. |
{occurred_at} {occurred_at_unix} | Ne zaman gerçekleştiği, RFC 3339 biçiminde veya Unix saniyesi olarak. |
{country} {device} {os} {browser} {referer} | Tıklama hakkında bilinenler: ülke, cihaz türü, işletim sistemi, tarayıcı, referrer. |
{utm_source} {utm_medium} {utm_campaign} {utm_term} {utm_content} | Tıklamanın UTM etiketleri. |
{gclid} {fbclid} {ttclid} {msclkid} {wbraid} | Tıklama taşıyorsa reklam ağı click ID'leri. |
Aynı makroların diğer adları
Tracker'lar aynı şeyler için farklı adlar kullanır. Şunlar da kabul edilir:
{subid} | = {sub1} |
{clickid} | = {click_id} |
{payout} | = {commission} |
{txid} | = {event_id} |
{transaction_id} | = {event_id} |
Ön ayarlar
Affiliate portalında şu şablonlar hazır gelir. Affiliate sunucu adını kendi tracker'ınınkiyle değiştirir. Her şablon kendi tracker'ının dokümantasyonunu izler: tracker'ın aynı ID ile yeniden gelen bir dönüşümü güncellediği yerde işlem parametresinde {conversion_id}, sonraki olayları atacağı yerde {event_id} bulunur.
| Keitaro | https://YOUR-TRACKER-DOMAIN/POSTBACK-KEY/postback?subid={sub1}&status={status}&payout={commission}¤cy={currency}&tid={conversion_id} |
| Binom | https://YOUR-TRACKER-DOMAIN/click?cnv_id={sub1}&payout={commission}&cnv_status={status}&cnv_currency={currency} |
| Voluum | https://YOUR-TRACKER-DOMAIN/postback?cid={sub1}&payout={commission}¤cy={currency}&txid={event_id}&et={event} |
| RedTrack | https://YOUR-TRACKER-DOMAIN/postback?clickid={sub1}&sum={commission}&status={status}&type={event}&rdtk_event_id={event_id} |
| BeMob | https://YOUR-TRACKER-DOMAIN/postback?cid={sub1}&payout={commission}&txid={conversion_id}&status={status} |
| PeerClick | https://YOUR-TRACKER-DOMAIN/postback?cid={sub1}&payout={commission}&txid={conversion_id}&status={status}¤cy={currency} |
| FunnelFlux Pro | https://YOUR-TRACKER-DOMAIN/pb/?hit={sub1}&tx={conversion_id}&rev={commission}&status={status} |
Bir örnek
https://YOUR-TRACKER-DOMAIN/postback?click_id={sub1}&event={event}&status={status}&payout={commission}¤cy={currency}&tid={conversion_id}&eid={event_id} GET https://tracker.example/postback?click_id=TRACKER_CLICK_ID&event=ftd&status=sale&payout=40.00¤cy=KES&tid=0199b2c9-0a11-7c3e-9f20-7d4b1e6a2c58&eid=0199b2c9-03aa-7e10-b6d2-91c07f5e2a18%3Aftd Teslimat
- Bir postback, bildirdiği olayla aynı veritabanı işleminde kuyruğa alınır ve yaklaşık on saniye içinde, en eskisi önce olacak şekilde gönderilir.
- İstek, user agent değeri
RevRake-Postback/1olan birGETisteğidir. En fazla üç yönlendirmeyi izler ve 5 saniye sonra vazgeçer. Sertifikalar doğrulanır. - Bir
2xxyanıtı başarıdır. Bunun dışındaki her şey başarısızlıktır ve 1 dakika, 5 dakika, 25 dakika, 2 saat, 10 saat ve 24 saat sonra yeniden denenir. - Son yeniden denemeden sonra teslimat vazgeçildi olarak işaretlenir. Affiliate onu elle yeniden gönderebilir.
- Her deneme süresi, durumu ve yanıtın ilk 500 karakteriyle kaydedilir.
- Art arda 5 ve 15 başarısızlıktan sonra hedefin sahibi bir e-posta alır. 20'de hedef kapatılır. Teslimatları, hedef kapalıyken gerçekleşen olayların teslimatları dahil, kuyruğa girmeye devam eder ve affiliate hedefi yeniden açtığında gönderilir. Affiliate'in kendisinin kapattığı bir hedefe yeni bir şey gönderilmez.
- RevRake yalnızca herkese açık adresleri çağırır. Loopback, özel, link-local ve carrier-grade NAT adresleri bağlantı kurulurken reddedilir; böylece bir yönlendirme bu kuralı aşamaz.
- Şablon, en fazla 2.000 karakterlik tam bir
http://veyahttps://adresi olmalıdır.
Bir deneme neden başarısız oldu
timeout | 5 saniye içinde yanıt yok. |
dns | Sunucu adı bulunamadı. |
refused | Bağlantı reddedildi. |
blocked_address | Adres özel veya yerel. |
tls | Sertifika sorunu. |
too_many_redirects | Üçten fazla yönlendirme. |
http_error | Tracker 2xx dışında bir durumla yanıt verdi. |
other | Bağlantı başka bir nedenle başarısız oldu. |
Operatör webhook'ları
Webhook'lar, programda olanları operatörün kendi sistemlerine (bir CRM, bir veri ambarı, bir sohbet kanalı) bildirir. Bir çalışma alanı yöneticisi, operatör portalının Entegrasyon sayfasında bir endpoint ekler: sunucunuzdaki adres, gönderilecek olaylar ve isteğe bağlı bir açıklama. Bu olayların her biri için RevRake adrese imzalı bir JSON POST isteği gönderir. Diğer ekip üyeleri endpoint'leri göremez ve değiştiremez.
Adres, herkese açık bir sunucuda tam bir https:// adresidir (http:// kabul edilir, ancak https:// kullanın). Her endpoint'in whsec_ ile başlayan kendi gizli anahtarı vardır. Endpoint oluşturulduğunda veya gizli anahtarı yenilendiğinde yalnızca bir kez gösterilir: o anda kopyalayın. Yenileme hemen yeni bir gizli anahtar oluşturur ve eskisi imzalamayı bırakır.
Bir uç nokta Slack veya Microsoft Teams kanalı da olabilir: “Slack mesajı” veya “Microsoft Teams mesajı”nı seçin ve kanalın gelen webhook adresini yapıştırın (Teams için “Bir Teams webhook isteği alındığında” iş akışı). Her olay imzalı JSON yerine kanala bir cümle olarak gelir; bir tutar yalnızca o büyüklükten itibaren ilk yatırımları bırakabilir.
Olaylar
Her endpoint için bir veya daha fazlasını işaretleyin. data alanları aşağıda açıklanmıştır; geçerli olmayan bir alan gönderilmez.
| Olay | data alanları | Ne zaman |
|---|---|---|
affiliate.applied | affiliate_number affiliate_name email promotes_on traffic | Biri program sayfanızdan veya anlaşmaya özel bir davet linkiyle başvurdu. Başvuru yapıldığında gönderilir; bu, başvuranın e-postasını onaylamasından önce olabilir. Kendiniz eklediğiniz ve davet ettiğiniz bir affiliate bunun yerine affiliate.approved gönderir. |
affiliate.approved | affiliate_number affiliate_name email reason decided_by invited | Bir affiliate'i onayladınız: yeni bir başvuru ya da daha önce reddettiğiniz veya askıya aldığınız biri. Kendiniz eklediğiniz ve davet ettiğiniz bir affiliate hemen onaylanır ve bu olayı invited değeri true olarak gönderir. |
affiliate.rejected | affiliate_number affiliate_name email reason decided_by | Bir başvuruyu reddettiniz. |
affiliate.suspended | affiliate_number affiliate_name email reason decided_by | Onaylı bir affiliate'i askıya aldınız. |
player.registered | player_id occurred_at attributed affiliate_number affiliate_name attribution_reason | Bir oyuncu, imzalı bir olayla veya bir REG dosyası satırıyla, atfedilmiş olsun ya da olmasın kaydedildi. Oyuncu başına bir kez. |
commission.created | player_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currency | Komisyon satırı oluşturuldu: anlaşmanın ilk yatırım veya toplam yatırım esasına göre uygun CPA ya da bildirilen net gelir için gelir payı veya düzeltme. Kademe ekleri ve iadeler bu olayı göndermez. |
commission.approved | player_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currency | Beklemedeki bir komisyon, bekletme süresi bittiği için onaylandı; kademe ekleri dahil. Baştan onaylı oluşturulan bir satır bu olayı göndermez. |
commission.rejected | player_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currency | Beklemedeki bir komisyon, onu bekleten fraud işaretini onayladığınız için reddedildi. commission sıfırdır. Bir chargeback ile iptal edilen CPA bunun yerine commission.reversed gönderir. |
commission.paid | player_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currency | Bir komisyon satırı ödendi: ödendi olarak işaretlenen bir ödeme kalemindeki her satır için bir olay, iade ve kademe satırları dahil. |
commission.reversed | player_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currency | Bir chargeback bir CPA'yı geri aldı: beklemedeyken iptal edildi ya da onaylandıktan veya ödendikten sonra yeni bir satırla geri alındı. commission_id CPA'yı belirtir, commission onun negatifidir ve amount chargeback yapılan yatırımdır. |
payout.batch_closed | batch_id period reference items payable_by_currency closed_by_hand | Bir ay, bir kişi tarafından veya zamanlanmış kapanışla taslak bir ödeme paketine kapatıldı. |
payout.batch_approved | batch_id | Taslak bir ödeme paketi onaylandı ve kilitlendi. |
payout.paid | batch_id item_id affiliate_number affiliate_name currency amount | Onaylı bir paketin bir kalemi ödendi olarak işaretlendi. Bütün kalemleri ödenmiş bir paket kendine ait bir olay göndermez. |
tracking.health_alert | brand kind since quiet_hours clicks_at_least | Bir markanın bağlantıları belirlenen saatlerde en az belirlenen sayıda tıklama aldı ve hiç kayıt gelmedi (Entegrasyon sayfası, İzleme sağlığı). Bir kez gönderilir; her saat kontrol edilir. |
tracking.health_cleared | brand raised_at cleared_at | İzleme sağlığı uyarısından sonraki ilk kayıt geldi ve uyarı kalktı. |
flag.raised | kind detail affiliate_number affiliate_name | Bir ortak hakkında yeni bir dolandırıcılık işareti oluştu (bir kural, tekrarlanan ilk yatırım veya kendi kendine yönlendirme ile). Tıklama patlaması işaretleri yalnızca İşaretler sayfasındadır. |
postback.destination_off | destination failures affiliate_number affiliate_name | Bir ortağın postback hedefi, yeniden deneme merdiveninin izin verdiği art arda başarısız teslimattan sonra kapatıldı. |
file.late | source date | Planlı olarak alınan bir günlük dosya, alım saatinden üç saat sonra hâlâ gelmemişti. Dosya ve gün başına bir kez. |
webhook.test | message | Yalnızca "Test gönder" düğmesinden. İşaretlenemez, yeniden denenmez ve teslimat günlüğünde yer almaz. |
Gövde
Her istek tek bir JSON nesnesi taşır:
| Alan | Tür | Anlamı |
|---|---|---|
id | string | Olayın kimliği, bir UUID. Olayı alan her endpoint için ve her yeniden denemede aynıdır: tekrarları ayıklamak için kullanın. |
type | string | Yukarıdaki tablodaki olay. |
created_at | string | Olayın sıraya alındığı zaman, UTC olarak RFC 3339 biçiminde, saniye kesirleriyle. |
data | object | Olayın bilgileri. Aşağıdaki alanlara bakın. |
{
"id": "0199b2c9-0a11-7c3e-9f20-7d4b1e6a2c58",
"type": "commission.created",
"created_at": "2026-10-05T09:12:44.318204Z",
"data": {
"player_id": "PLR-1001",
"occurred_at": "2026-10-05T09:12:40Z",
"attributed": true,
"affiliate_number": 1001,
"affiliate_name": "Odds Garage",
"commission_id": "0199b2c9-0a0f-7a51-8c3d-5e2f4a6b7c90",
"commission_type": "cpa",
"amount": "25.00",
"amount_currency": "USD",
"commission": "40.00",
"commission_currency": "USD"
}
} Anahtarlar herhangi bir sırada gelebilir ve JSON'un boşlukları sabit değildir. Baytları alındığı haliyle doğrulayın, sonra ayrıştırın.
Başlıklar
| Başlık | Değer |
|---|---|
RevRake-Event | Olay, gövdedeki type ile aynı. |
RevRake-Delivery | Bu endpoint'e yapılan bu teslimatın kimliği, bir UUID. Her yeniden denemede ve bir teslimat elle yeniden gönderildiğinde aynıdır. |
RevRake-Timestamp | Bu denemenin gönderildiği zaman, Unix saniyesi olarak. Her denemede yenidir. |
RevRake-Signature | Endpoint'in gizli anahtarıyla <timestamp>.<raw body> üzerinden hesaplanan küçük harfli hex HMAC-SHA256. Her denemede yenidir. |
İstek ayrıca Content-Type: application/json başlığını ve RevRake-Webhook/1 kullanıcı aracısını taşır.
POST /revrake-webhook HTTP/1.1
Host: example.com
Content-Type: application/json
User-Agent: RevRake-Webhook/1
RevRake-Event: commission.created
RevRake-Delivery: 0199b2c9-0b7e-7d02-8a41-3c5e6f708192
RevRake-Timestamp: 1791191571
RevRake-Signature: <hex HMAC-SHA256 of "1791191571.<raw body>"> data alanları
| Alan | Tür | Anlamı |
|---|---|---|
affiliate_number | integer | Affiliate'in numarası. |
affiliate_name | string | Affiliate'in adı. |
email | string | Affiliate'in giriş yaptığı e-posta adresi. |
promotes_on | string | Başvuranın nerede tanıtım yaptığı hakkında yazdıkları. |
traffic | array of string | Başvuranın işaretlediği trafik kaynakları: seo, telegram, paid_social, youtube, email veya offline. |
reason | string | Affiliate'e verilen gerekçe. Ret veya askıya almada her zaman vardır; onayda boş olabilir. |
decided_by | string | Kararı veren ya da affiliate'i ekleyen ekip üyesinin e-posta adresi. |
invited | boolean | Affiliate'i başvuru olmadan kendiniz ekleyip davet ettiyseniz true. Aksi halde yer almaz. |
player_id | string | Oyuncu için sizin kimliğiniz. |
occurred_at | string | Ne zaman gerçekleştiği, RFC 3339 biçiminde: kayıt, yatırım, gelir döneminin sonu veya chargeback. Onay, ret veya ödeme için: değişikliğin anı. |
attributed | boolean | Oyuncunun bir affiliate'e ait olup olmadığı. Bir komisyon için her zaman true. |
attribution_reason | string | Oyuncunun neden atfedildiği veya atfedilmediği: atıf nedenlerinden biri. |
commission_id | string | RevRake'in komisyon satırı kimliği: GET /v1/commissions içindeki satırın id değeri. O komisyonla ilgili her olayda aynıdır. |
commission_type | string | Komisyon satırının türü: cpa, revshare, adjustment veya tier; commission.paid içindeki bir iade satırı için reversal. commission.reversed içinde, geri alınan CPA'nın türü. |
amount | string | Bir komisyon için: arkasındaki yatırım veya net gelir, ondalık sayı olarak, kendi para biriminde. payout.paid için: kalemin tutarı, ondalık sayı olarak. |
amount_currency | string | amount para biriminin ISO kodu. |
commission | string | Komisyon, anlaşmanın para biriminde ondalık sayı olarak (40.00). İade, aşağı yönlü düzeltme ve oyuncunun kazandığı bir dönem için negatiftir. |
commission_currency | string | Komisyonun para biriminin ISO kodu: anlaşmanınki. |
batch_id | string | RevRake'in ödeme paketi kimliği, bir UUID. |
period | string | Paketin kapattığı ay, YYYY-MM. |
reference | string | Paketin banka dosyasındaki referansı, örneğin po_2026-09_demo. |
items | integer | Paketin, durumları ne olursa olsun, kaç kalemi olduğu. |
payable_by_currency | object | Para birimi başına, bütün kalemlerin tutarlarının ondalık sayı olarak toplamı (1250.00), durumları ne olursa olsun, devredilen kalemler dahil. |
closed_by_hand | boolean | Ayı bir kişi kapattıysa true, zamanlanmış kapanış için false. |
item_id | string | RevRake'in ödeme kalemi kimliği, bir UUID. |
currency | string | Kalemin para birimi. |
message | string | Testin ulaştığını söyleyen bir cümle. |
Bir isteği doğrulayın
- Ham gövdeyi, herhangi bir JSON ayrıştırmasından önce bayt olarak okuyun.
RevRake-Timestampdeğerinin saatinizden en fazla 5 dakika farklı olduğunu kontrol edin, değilse isteği reddedin; böylece kaydedilmiş bir istek daha sonra yeniden oynatılamaz.- Zaman damgası, bir nokta ve ham gövdenin endpoint'in gizli anahtarıyla hex HMAC-SHA256 değerini hesaplayın ve sabit sürede
RevRake-Signatureile karşılaştırın. - Gövdeyi ancak ondan sonra ayrıştırın.
iddeğerini daha önce işlediyseniz2xxile yanıt verin ve hiçbir şey yapmayın. - 5 saniye içinde herhangi bir
2xxile yanıt verin ve yavaş işleri sonra yapın.
Entegrasyon sayfasının gösterdiği haliyle, Node.js ve Python'da aynı kontrol:
Node.js
const crypto = require("node:crypto");
// raw: the body exactly as received (a Buffer), before parsing it as JSON.
function verify(raw, headers, secret) {
const ts = headers["revrake-timestamp"] ?? "";
if (!/^\d+$/.test(ts) || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(ts + ".").update(raw).digest();
const got = Buffer.from(headers["revrake-signature"] ?? "", "hex");
return got.length === expected.length && crypto.timingSafeEqual(got, expected);
} Python
import hashlib, hmac, time
# raw: the body exactly as received (bytes), before parsing it as JSON.
def verify(raw: bytes, headers, secret: str) -> bool:
ts = headers.get("RevRake-Timestamp", "")
if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
return False
expected = hmac.new(secret.encode(), ts.encode() + b"." + raw, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, headers.get("RevRake-Signature", "")) Teslimat, yeniden denemeler ve kapatma
- Bir teslimat, bildirdiği değişiklikle aynı işlemde (transaction) sıraya alınır; bu yüzden bir olay yalnızca ve yalnızca değişiklik kaydedildiyse gönderilir. Yaklaşık on saniye içinde, en eskiden başlayarak gönderilir.
- Teslimat en az bir kezdir: aynı olay birden çok kez gelebilir, örneğin yanıtınız yolda kaybolduğunda. Tekrarları gövdenin
idalanına göre ayıklayın. - Sıra garanti edilmez: bir yeniden deneme, daha sonraki bir olaydan sonra gelebilir. Olayları geliş zamanına göre değil,
created_atveyaoccurred_atdeğerine göre sıralayın. - 5 saniye içinde bir
2xxyanıtı başarıdır. Diğer her şey başarısızlıktır ve aynı gövdeyle, yeni bir zaman damgası ve imzayla 1 dakika, 5 dakika, 25 dakika, 2 saat, 10 saat ve 24 saat sonra yeniden denenir. - Son yeniden denemeden sonra teslimat vazgeçildi olarak işaretlenir. Bir yönetici onu teslimat günlüğünden yeniden gönderebilir; o zaman yeniden denemelerin tamamını yeniden alır.
- Art arda 20 başarısız denemeden sonra endpoint kapatılır. Olayları sıraya girmeye devam eder ve bir yönetici onu yeniden açtığında sıraya giren her şey gönderilir. Bu olduğunda e-posta gönderilmez: her endpoint'in durumu Entegrasyon sayfasındadır.
- Kendiniz kapattığınız bir endpoint yeni bir şey almaz: kapalıyken onun için hiçbir olay sıraya alınmaz.
- RevRake yalnızca herkese açık adresleri çağırır: 5 saniye sonra vazgeçer ve sertifikaları doğrular. Loopback, özel, link-local ve carrier-grade NAT adresleri reddedilir. Yönlendirmeler izlenmez: bir
3xxyanıtıredirecthatasıyla başarısızlıktır ve teslimat günlüğü yönlendirilen adresi gösterir.
Test edin ve teslimat günlüğünü okuyun
- Bir endpoint'te "Test gönder" düğmesine basın: gerçek bir olay gibi imzalanmış bir
webhook.testolayı hemen gönderilir ve endpoint'inizin hangi durumla yanıt verdiğini ve ne kadar sürdüğünü görürsünüz. Bir test yeniden denenmez, teslimat günlüğünde listelenmez ve başarısızlık olarak sayılmaz. - Bir endpoint'in teslimat günlüğü en son 100 teslimatını gösterir: olay, durum (bekliyor, yeniden deneniyor, vazgeçildi veya gönderildi), deneme sayısı, son durum veya hata, yanıtınızın ilk 500 karakteri, bir sonraki deneme ve gönderildiği haliyle gövde.
- Başarısız bir deneme, bir postback ile aynı kelimelerle açıklanır (bir deneme neden başarısız oldu bölümüne bakın), buna ek olarak
redirect: endpoint'iniz bir3xxile yanıt verdi. Durumlar bir postback teslimatının durumlarıdır.
{
"id": "0199b2d4-5c60-7b1a-9e3f-1a2b3c4d5e6f",
"type": "webhook.test",
"created_at": "2026-10-05T09:30:02.104377Z",
"data": {
"message": "A test from RevRake. If you can read this, your endpoint works."
}
} İyi uygulamalar
- Gizli anahtarı sunucunuzda tutun, asla bir sayfada veya uygulamada değil. Sızarsa yenileyin ve endpoint'inizi hemen yenisine geçirin: eski gizli anahtar anında durur.
- İmzası eşleşmeyen bir isteğe
4xxile yanıt verin. Geçerli gizli anahtarla imzalanarak yeniden denenir; böylece siz anahtarı yenilerken yapılan bir teslimat kaybolmaz. - İşlediğiniz her olayın
iddeğerini saklayın ve gördüğünüz bir olayı yok sayın. - Önce yanıt verin, sonra çalışın: olayı kendi kuyruğunuza koyun ve
2xxile yanıt verin; böylece yavaş bir veritabanı RevRake'in yeniden denemesine asla yol açmaz. - Endpoint'inizin son adresini girin. Yönlendirmeler izlenmez: deneme
redirectile başarısız olur ve teslimat günlüğü bunun yerine kullanılacak adresi gösterir. - Bir komisyonla ilgili olayları birleştirmek için
commission_idkullanın veGET /v1/commissionsile mutabakat yapın: son 60 günün her gece okunması kaçırılan her şeyi yakalar. - Yalnızca kullandığınız olayları işaretleyin. Her biri sunucunuza bir istektir.
OpenAPI dosyası
Dört imzalı endpoint, her durum ve neden bir numaralandırma (enum) olarak, kod üreteçleri ve API istemcileri için openapi.yaml (OpenAPI 3.1) dosyasında tanımlanır. Adresi değişmez.
Bağlanmaya hazır mısınız? Programınızı oluşturun ve anahtarınızı alın.
Programınızı kendiniz oluşturursunuz: kaydolun, e-postanızı onaylayın, birkaç dakika içinde içeridesiniz. Operatörler için sonsuza kadar ücretsiz. Kart yok.
Sorularınız için bize yazın: hello@revrake.com