API referansı

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.

EndpointAnlamı
POST https://app.revrake.com/v1/postbackTek bir olayı veya olayların toplu gönderimini bildirir. İmzalı.
POST https://app.revrake.com/v1/filesGünlük bir REG veya SALES dosyası gönderir. İmzalı.
GET https://app.revrake.com/v1/reportsBir raporu JSON veya CSV olarak okur. İmzalı; operatör veya affiliate anahtarıyla.
GET https://app.revrake.com/v1/commissionsKomisyon defterini sayfa sayfa okur. İmzalı; operatör veya affiliate anahtarıyla.
GET https://app.revrake.com/v1/affiliatesMarkanı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/dealsAnlaş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 aitNe 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 403 affiliate_inactive ile yanıtlanır.
  • Bir affiliate anahtarıyla affiliate parametresi yok sayılır ve by=affiliate gü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ıkDeğer
X-RevRake-KeyAnahtar ID'niz. pb_ (operatör) veya ak_ (affiliate) ile başlar.
X-RevRake-TimestampSaniye cinsinden geçerli Unix zamanı. Bir istek, bu zamandan beş dakika öncesine veya sonrasına kadar kabul edilir.
X-RevRake-SignatureGizli 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:

  1. Gövdeyi oluşturun ve göndereceğiniz baytları aynen saklayın.
  2. Saniye cinsinden geçerli Unix zamanını ondalık metin olarak alın.
  3. Zaman damgasını, bir noktayı (.) ve gövdeyi art arda ekleyin.
  4. Bunun HMAC-SHA256'sını gizli anahtarınızla hesaplayın ve küçük harfli hex olarak yazın.
  5. 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-Type başlığı zorunlu değildir. Olaylar için application/json, dosyalar için text/csv gö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ırAnlamı
120Anahtar başına, dakikada okuma sayısı: GET /v1/reports ve GET /v1/commissions birlikte
30 000Anahtar başına, dakikada olay isteği: POST /v1/postback, bir seferde 1.000'e kadar
60Anahtar başına, dakikada dosya: POST /v1/files, bir seferde 10'a kadar
4 MBPOST /v1/postback gövdesi, tek olay veya toplu gönderim
32 MBPOST /v1/files gövdesi
1 – 1000Bir toplu gönderimdeki olay sayısı
200 000Bir dosyadaki veri satırı sayısı
300 sX-RevRake-Timestamp ile gerçek zaman arasındaki fark, her iki yönde
24 hts ve period değerlerinin ne kadar gelecekte olabileceği
100player_id uzunluğu, karakter olarak
200txn_id uzunluğu, karakter olarak
0 / 2Bir 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 – 365Bir raporun days değeri
10, 25, 50, 100, 500, 1000Defterin per_page değeri: şu değerlerden biri
1 – 100 000Defterin page değeri
100q uzunluğu, karakter olarak; daha uzun metin kesilir
200Bir takip linkindeki sub1–sub5 değerlerinin, her UTM etiketinin ve her reklam click ID'sinin uzunluğu, karakter olarak; daha uzun değerler kesilir
10Affiliate başına postback hedefi sayısı
2000Bir postback adres şablonunun uzunluğu, karakter olarak
5 sBir tracker'ın bir postback'e yanıt vermesi için tanınan süre
50Portalda gösterilen gelen günlüğü: son 7 günün en yeni girdileri
2000Bir webhook endpoint adresinin uzunluğu, karakter olarak
5 sBir webhook endpoint'inin yanıt vermek için sahip olduğu süre
20Endpoint kapatılmadan önce art arda başarısız webhook denemesi sayısı
100Teslimat günlüğünde webhook endpoint başına gösterilen teslimatlar
2 – 40Bir promosyon kodunun uzunluğu: harf, rakam, tire ve alt çizgi
32 MBRevRake'in adresinizden aldığı bir dosyanın boyutu
60 sAdresinizin alınan bir dosyayı teslim etmek için sahip olduğu süre
0 – 3600 sKayıt süresi kuralı için tıklamadan sonraki saniye (0 kapatır)
0 – 365Açık bir fraud işaretinin kendiliğinden karara bağlanmasından önceki gün sayısı (0 hiçbir zaman demektir)
1 – 200Tek 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 / minBir affiliate'in oluşturabileceği takip linkleri: bir seferde 60, sonra dakikada bir. Bunun ötesinde yanıt Retry-After ile 429 olur
2 MBPortalda 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 zaman 120) ve X-RateLimit-Remaining (şu anda kaç okuma kaldığı) başlıklarını taşır.
  • Sınır aşıldığında yanıt, bir Retry-After başlığıyla birlikte 429 rate_limited olur: 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 422 ile 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 (Z veya +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" veya 25.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_id ve btag hariç: 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"}
AlanTürZorunluÖrnekAnlamı
player_idstringevet"PLR-1001"Oyuncu için sizin ID'niz. En fazla 100 karakter. Olayın anahtarıdır.
click_idstringhayır"01K6QF3M8Z5T7W9XB2C4D6E8GH"Oyuncunun geldiği cid: 26 karakter, harf ve rakam; büyük veya küçük harf.
btagstringhayır"1001_1"Platformunuzun oyuncuda sakladığı btag: <affiliate numarası>_<link numarası>, yalnızca rakam.
promo_codestringhayı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_hashstringhayı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_domainstringhayı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.
ipstringhayı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.
countrystringhayı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.
tsstringhayı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}
AlanTürZorunluÖrnekAnlamı
player_idstringevet"PLR-1001"Oyuncu için sizin ID'niz. En fazla 100 karakter.
txn_idstringevet"TX-88213"Sizin işlem ID'niz. En fazla 200 karakter. Olayın anahtarıdır.
amountstring | numberevet"25.00"Yatırım tutarı, sıfırdan büyük.
currencystringhayır"KES"Yatırımın para birimi. Her para birimi kabul edilir.
tsstringhayı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.
firstbooleanhayırtrueBu 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"}
AlanTürZorunluÖrnekAnlamı
txn_idstringevet"CB-5001"Chargeback'in kendisi için sizin ID'niz. En fazla 200 karakter. Olayın anahtarıdır.
ref_txn_idstringevet"TX-88213"Geri çekilen yatırımın txn_id'si.
player_idstringhayır"PLR-1001"İsteğe bağlı. Gönderilirse referans verilen yatırımın oyuncusuyla eşleşmelidir.
tsstringhayı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"}
AlanTürZorunluÖrnekAnlamı
player_idstringevet"PLR-1001"Oyuncu için sizin ID'niz. En fazla 100 karakter.
periodstringevet"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.
amountstring | numberevet"118.40"Dönemin net oyun geliri (NGR). Oyuncu kazandıysa negatif.
currencystringhayır"KES"Tutarın para birimi.
ggrstring | numberhayır"240.00"İsteğe bağlı. Dönemin brüt oyun geliri, aynı para biriminde. Affiliate'e gösterilir; komisyonu değiştirmez.
bonusesstring | numberhayır"80.00"İsteğe bağlı. Brüt gelirden düşülen bonuslar. Yalnızca gösterilir.
feesstring | numberhayır"21.60"İsteğe bağlı. Brüt gelirden düşülen ücretler, örneğin ödeme veya platform ücretleri. Yalnızca gösterilir.
taxesstring | numberhayır"20.00"İsteğe bağlı. Brüt gelirden düşülen vergiler. Yalnızca gösterilir.
tsstringhayı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.

AlanTürAnlamı
statusstringaccepted; olay zaten kayıtlıysa duplicate.
event_typestringGönderdiğiniz type.
event_idstringKaydedilen olayın RevRake ID'si, bir UUID. Her yeniden gönderimde aynıdır.
attributionobjectBir kayıt için: atıf kararı.
attribution.attributedbooleanOyuncunun bir affiliate'e ait olup olmadığı.
attribution.reasonstringNeden. Aşağıdaki tabloya bakın.
attribution.affiliate_numberintegerAffiliate. Yalnızca atfedildiyse.
attribution.link_numberintegerAffiliate'in linki. Yalnızca atfedildiyse.
attribution.click_idstringEşleşen tıklama, varsa.
attribution.policy_versionintegerKararı veren, markanın atıf kuralının sürümü.
attribution.window_daysintegerO sürümün atıf penceresi, gün olarak.
attribution.modelstringlast_click veya first_click: o sürümün modeli.
commissionobjectBir yatırım, bir chargeback ve ngr için: olayın defterdeki etkisi.
commission.effectstringcreated, cancelled (beklemedeki bir komisyon reddedildi), reversed (bir iade satırı eklendi) veya none.
commission.typestringcpa, revshare, adjustment veya reversal.
commission.amount_minorintegerAnlaş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.statusstringhold, approved veya rejected.
commission.reasonstringeffect değeri none olduğunda neden hiçbir şey oluşturulmadığı. Aşağıdaki tabloya bakın.
waiting_for_playerbooleanOyuncusu 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_ofstringCanlı 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.
detailstringduplicate_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.

reasonAnlamı
clickAtfedildiClick ID, pencere içindeki bir tıklamayla eşleşti.
first_clickAtfedildiKural 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_clickAtfedildiBtag bir linkle eşleşti ve o linkte pencere içinde bir tıklama bulundu.
btag_onlyAtfedildiBtag bir linkle eşleşti; pencere içinde tıklama bulunamadı.
promo_codeAtfedildiNe click ID ne de btag oyuncuyu atfetti ve promosyon kodu onaylı bir affiliate'in koduyla eşleşti.
no_tagAtfedilmediKayıtta ne click ID ne de btag vardı.
unknown_clickAtfedilmediClick ID sizinkilerden değil ve btag gönderilmedi.
unknown_btagAtfedilmediBtag hatalı biçimde ya da hiçbir linkle eşleşmiyor.
outside_windowAtfedilmediTıklama atıf penceresinden daha eski ya da kayıttan daha sonra.
affiliate_inactiveAtfedilmediAffiliate onaylı değil ya da tıklama yapıldığında onaylı değildi.
unknown_promo_codeAtfedilmediYalnızca bir promosyon kodu gönderildi ve kodlarınızdan hiçbiriyle eşleşmiyor.
promo_code_retiredAtfedilmediYalnızca bir promosyon kodu gönderildi ve kod kullanımdan kaldırılmış.

Neden komisyon oluşturulmadı

commission.reasonAnlamı
unattributedOyuncu hiçbir affiliate'e ait değil.
not_firstOyuncunun ilk yatırımı değil.
already_earnedOyuncunun CPA'sı zaten kazanılmıştı. İkinci bir "ilk" yatırım hiçbir şey ödemez ve bir işaret oluşturur.
no_deal_versionAffiliate'in anlaşması yok ya da olay sırasında anlaşmanın bir sürümü yoktu.
country_blockedOyuncu, anlaşmanın ödeme yapmadığı bir ülkeden. Oyuncu kayıtlı ve atfedilmiş olarak kalır.
no_cpa_in_dealAnlaşma CPA ödemiyor.
below_thresholdAnlaş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_commissionBir chargeback için: yatırım hiçbir şey kazandırmamıştı.
no_revshare_in_dealngr için: anlaşma RevShare ödemiyor.
fx_rate_missingngr için: dönem için henüz kur yok. Bildirim saklanır ve kur oluştuğunda fiyatlandırılır.
unchangedngr 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
}
AlanTürAnlamı
resultsarrayGönderildikleri sırayla, olay başına bir girdi.
results[].indexintegerOlayın dizideki konumu, 0'dan başlar.
results[].statusstringaccepted, duplicate veya rejected.
results[].event_typestringTekil yanıttaki gibi. Reddedilen bir olayda bulunmaz.
results[].event_idstringTekil yanıttaki gibi. Reddedilen bir olayda bulunmaz.
results[].attributionobjectTekil yanıttaki gibi.
results[].commissionobjectTekil yanıttaki gibi.
results[].waiting_for_playerbooleanTekil yanıttaki gibi.
results[].fieldstringReddedilen bir olay için: düzeltilecek alan.
results[].messagestringReddedilen bir olay için: neyin düzeltileceği.
acceptedintegerKaç olayın kaydedildiği.
duplicateintegerKaçının zaten kayıtlı olduğu.
rejectedintegerKaçı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ütunZorunluAnlamı
registration_dateevetOyuncunun kaydolduğu zaman. ts olur.
player_idevetOyuncu için sizin ID'niz.
btagevetOyuncuda saklanan btag. Boş olabilir: oyuncu o zaman, bir promosyon kodu atfetmedikçe, atfedilmez.
promo_codehayırİsteğe bağlı. Oyuncunun kayıt olurken girdiği promosyon kodu; bir kaydın promo_code alanı olarak kullanılır.
player_countryhayı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ütunZorunluAnlamı
activitydateevetÇalışma alanının dosya saat dilimine göre belirlenen etkinlik günü.
player_idevetOyuncu için sizin ID'niz.
currencyevetSatırdaki tutarların para birimi. Boşsa: çalışma alanının raporlama para birimi.
depositsevetGü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_amountevetİ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.
chargebackevetBu 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_revenuehayırAdı 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_revenuehayı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.
*_bonushayırİsteğe bağlı. Adı bonus olan veya _bonus ile biten sütunlar; bonuses içinde toplanır. Yalnızca gösterilir.
*_feeshayırİsteğe bağlı. Adı fees olan veya _fees ile biten sütunlar; fees içinde toplanır. Yalnızca gösterilir.
*_taxeshayı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_amount ve chargeback zorunlu 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_missing ile bekletir. Eksik chargeback kuru, ödemeye dahil edilmiş komisyonlar da dahil, mutabakata kadar chargeback_fx_missing ile ö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_missing ile beklemede kalır. İşlem referansının incelenmesi için ref_txn_id alanı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."]
}
AlanTürAnlamı
idstringBu içe aktarımın RevRake ID'si.
filenamestringVerdiğiniz ad ya da reg.csv / sales.csv.
kindstringreg veya sales.
uploaded_atstringAlındığı zaman.
rows_totalintegerDosyadaki veri satırları.
acceptedintegerKaydedilen olaylar.
duplicatesintegerZaten kayıtlı olan olaylar.
rejectedintegerReddedilen satırlar veya olaylar. Her biri, satırın kendisiyle birlikte gelen günlüğündedir.
skippedintegerKaydedilecek bir şey içermeyen satırlar.
problemsarray of stringReddedilen 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
ParametreTürÖrnekAnlamı
bystringlinkSatırların nasıl gruplandığı: day, link, sub1, country veya affiliate. Varsayılan day. affiliate verildiğinde by=affiliate, day olarak yanıtlanır.
daysinteger7Bugün dahil kaç gün: 1 ile 365 arası. Varsayılan 30.
fromstring2026-09-01Herhangi 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.
tostring2026-09-30Dönemin son günü, dahil. Varsayılan bugün.
affiliateinteger1001Bir 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.
tagstringInfluencersGruplar 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.
formatstringcsvcsv, 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
  }
}
AlanTürAnlamı
bystringKullanılan gruplama.
fromstringRaporun ilk günü, YYYY-MM-DD.
tostringSon gün: çalışma alanının saat dilimine göre bugün ya da verdiğiniz to.
currencystringÇalışma alanının raporlama para birimi. Kazanç bu para birimindedir.
rowsarrayGrup başına bir girdi.
rows[].keystringGrubu tanımlayan değer: gün, linkin veya affiliate'in RevRake ID'si, sub1 değeri ya da iki harfli ülke kodu.
rows[].labelstringPortalı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[].clicksintegerTemiz tıklamalar.
rows[].flagged_clicksintegerBot, tekrar, patlama veya onaylı olmayan bir affiliate'e ait olarak işaretlenen tıklamalar. clicks içinde yer almaz.
rows[].registrationsintegerAtfedilen oyuncular.
rows[].ftdsintegerİlk yatırımlar.
rows[].earnings_minorintegerKazanılan komisyonlar, raporlama para biriminin en küçük biriminde, her birinin kazanıldığı günün kuruyla.
totalobjectSatı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
ParametreTürÖrnekAnlamı
statusstringapprovedhold, approved, paid veya rejected. Varsayılan: tümü.
fromstring2026-09-01Yalnızca bu zamanda veya sonrasında gerçekleşen satırlar: RFC 3339 ya da UTC olarak bir gün, YYYY-MM-DD.
tostring2026-10-01Yalnızca bu zamandan önce gerçekleşen satırlar. Aynı biçimler.
affiliateinteger1001Bir 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.
tagstringInfluencersGruplar 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.
qstringPLR-1001Oyuncu ID'si veya affiliate adı bu metni içeren satırlar. En fazla 100 karakter.
sortstringwhenwhen, affiliate, player, status, deposit veya commission. Varsayılan when.
dirstringascasc veya desc. Varsayılan desc.
pageinteger2Sayfa, 1'den başlar. Varsayılan 1.
per_pageinteger50010, 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
}
AlanTürAnlamı
currencystringÇalışma alanının raporlama para birimi.
totalsobjectDurum 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.
owedobjectPara birimi ve durum başına toplam, her komisyonun kendi para biriminde: borçlu olunan tutar. totals ile aynı satırlar üzerinden.
periodbooleanfrom veya to verildiğinde true; bu durumda totals ve owed yalnızca o dönemi kapsar.
commissionsarrayBu sayfanın satırları.
totalintegerFiltrelerle eşleşen satır sayısı.
pageintegerYanıtlanan sayfa.
per_pageintegerKullanılan sayfa başına satır sayısı.

Bir komisyon satırı

AlanTürAnlamı
idstringSatırın RevRake ID'si, bir UUID. Asla değişmez: güncellemeyi buna göre yapın.
occurred_atstringKomisyonun kazanıldığı zaman: yatırımın zamanı, gelir döneminin sonu ya da chargeback'in zamanı.
typestringcpa, revshare, adjustment, reversal veya tier.
amount_minorintegerKomisyon, currency para biriminin en küçük biriminde. Bir iade ve aşağı yönlü bir düzeltme için negatiftir.
currencystringKomisyonun para birimi: anlaşmanın para birimi.
reporting_minorinteger | nullÇalışma alanının raporlama para biriminde komisyon, kazanıldığı günün kuruyla. O kur eksikken null.
gross_minorintegerKomisyonun dayandığı yatırım veya net gelir, gross_currency para biriminin en küçük biriminde.
gross_currencystringYatırımın veya gelirin para birimi.
rate_snapshotintegerUygulanan koşullar: en küçük birimde CPA tutarı ya da yüzdenin yüzde biri cinsinden RevShare oranı (2500, %25 demektir).
statusstringhold, approved, paid veya rejected. Bkz. komisyon durumları.
status_reasonstringBir 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_notestringGeri alınan bir komisyon için operatörün notu, affiliate'in okuduğu şekliyle. Diğer durumlarda boştur.
hold_untilstring | nullBekletme süresinin dolduğu zaman. Bir iade için null.
affiliate_numberintegerAffiliate'in numarası.
affiliate_namestringAffiliate'in adı.
player_refstringOyuncu için sizin ID'niz.
deal_namestringAnlaşma.
deal_versionintegerSatı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

AlanTürAnlamı
numberintegerOrtak numarası, btag'in ilk kısmı; bir bağlantıda bağlantı numarası, ikinci kısmı.
namestringOrtağın adı.
emailstringOrtağın e-posta adresi.
statusstringpending, approved, rejected veya suspended.
dealstringOrtağın anlaşmasının adı; onaydan önce boş.
created_atstringOluşturulma zamanı, RFC 3339.
decided_atstring | nullBaşvurunun onaylandığı veya reddedildiği ya da hesabın askıya alındığı an; öncesinde null.

Her bağlantı

AlanTürAnlamı
affiliate_numberintegerBağlantının ait olduğu ortağın numarası.
numberintegerOrtak numarası, btag'in ilk kısmı; bir bağlantıda bağlantı numarası, ikinci kısmı.
codestringBağlantı adresindeki kod.
urlstringİzleme bağlantısı; markanın doğrulanmış izleme alan adında veya ortak alan adında.
btagstring<affiliate_number>_<number>.
campaignstringBağlantının kampanya etiketi.
landing_pathstring | nullBağlantının sitenizde açtığı sayfa; markanın varsayılanı için null.
subsstring[5]Bağlantıda sabitlenen sub1–sub5; ayarlanmamışsa boş metin.
promo_codestring | nullBir kod için oluşturulmuş bağlantıda promosyon kodu; değilse null.
vanity_urlstring | nullOrtak ayarladıysa kısa adres /go/<ad>; değilse null.
created_atstringOluşturulma zamanı, RFC 3339.

Her anlaşma

AlanTürAnlamı
namestringOrtağın adı.
currencystringAnlaşmanın kazandırdığı ve ödediği para birimi.
listedbooleanHerkese açık başvuru sayfasının anlaşmayı gösterip göstermediği.
defaultbooleanYeni ortakların bu anlaşmayı alıp almadığı.
versionintegerAnlaşmanın şu an geçerli sürümü.
effective_atstringO sürümün yürürlüğe girdiği an, RFC 3339.
termsobjectO 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.

AlanTürAnlamı
click_idstringAçılış sayfanıza ve postback'lere geçen tıklama kimliği.
clicked_atstringTıklamanın zamanı.
affiliate_numberintegerOrtak numarası.
link_numberintegerBağlantı numarası.
btagstring<affiliate_number>_<link_number>.
countrystringİki harfli ülke kodu; bilinmiyorsa boş.
devicestringTarayıcıya göre desktop, mobile, tablet veya bot.
osstringTarayıcıya göre işletim sistemi.
browserstringTarayıcı.
sub1 … sub5stringsub1–sub5: tıklamanın alt kimlikleri.
utm_source … utm_contentstringutm_source–utm_content: tıklamanın UTM etiketleri.
gclid, fbclid, ttclid, msclkid, wbraidstringgclid, fbclid, ttclid, msclkid, wbraid: açılış URL'sindeki reklam platformu tıklama kimlikleri.
refererstringZiyaretçinin geldiği sayfa.
flagsstringTı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.

AlanTürAnlamı
player_idstringOyuncu kimliğiniz.
registered_atstringGönderdiğiniz kayıt zamanı.
arrived_atstringRevRake'in kaydettiği an.
countrystringİki harfli ülke kodu; bilinmiyorsa boş.
attributedbooleanBir ortağa atfedildiğinde true.
attribution_reasonstringNedeni, postback yanıtındaki gibi: click, btag_only, promo_code, no_tag…
affiliate_numberintegerOrtak numarası.
link_numberintegerBağlantı numarası.
btagstring<affiliate_number>_<link_number>.
click_idstringOyuncuyu atfeden tıklama; yoksa boş.
policy_versionintegerKararı 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.

AlanTürAnlamı
event_idstringOlayın RevRake kimliği.
typestringregistration, deposit, chargeback, daily_sales veya ngr; komisyon için cpa, revshare, tier, adjustment veya reversal.
external_idstringOlayın anahtarı: oyuncu kimliği, işlem kimliği ya da oyuncu ve dönem.
player_idstringOyuncu kimliğiniz.
occurred_atstringBildirdiğiniz gerçekleşme zamanı; komisyonda kazanıldığı an.
received_atstringRevRake'in olayı kabul ettiği an.
sourcestrings2s (API) veya file (günlük dosya).
payloadJSONRevRake'in okuduğu haliyle olay, JSON.
resultJSONRevRake'in yanıtı, JSON.

commissions.csv.gz: o gün yazılan komisyon satırları.

AlanTürAnlamı
commission_idstringSatırın kimliği, GET /v1/commissions'daki id.
created_atstringSatırın yazıldığı an.
occurred_atstringBildirdiğiniz gerçekleşme zamanı; komisyonda kazanıldığı an.
typestringregistration, deposit, chargeback, daily_sales veya ngr; komisyon için cpa, revshare, tier, adjustment veya reversal.
statusstringAktarım anında hold, approved, paid veya rejected.
status_reasonstringNeden bekletildiği veya reddedildiği; değilse boş.
affiliate_numberintegerOrtak numarası.
player_idstringOyuncu kimliğiniz.
dealstringAnlaşmanın adı.
deal_versionintegerOnu fiyatlayan anlaşma sürümü.
grossdecimalArkasındaki yatırım veya net gelir.
gross_currencystringOnun para birimi.
amountdecimalKomisyon.
currencystringAnlaşmanın para birimi.
reporting_amountdecimalRaporlama para birimindeki komisyon; kur eksikken boş.
reporting_currencystringÇalışma alanının raporlama para birimi.
reverses_idstringTers kayıtta, ters çevrilen satır.
payout_item_idstringAy 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.

OlayAnahtarAynı anahtar yeniden gelirse
registrationplayer_idİlk yanıt. Etiketler farklı olsa bile atıf yeniden kararlaştırılmaz.
deposittxn_idKayı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.
chargebacktxn_idİlk yanıt. Aynı yatırımın yeni bir txn_id ile ikinci chargeback'i reddedilir.
ngrplayer_id ve periodAynı 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.
CSVREG satırı: player_idBir registration gibi.
CSVSALES 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.
CSVSALES satırı, gelir: oyuncu ve günngr 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ı

DurumerrorEndpointNe zamanNe 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.
400bad_requestPOST /v1/postbackGö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.
401unknown_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.
401bad_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.
401bad_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.
403affiliate_inactiveGET /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.
404unknown_affiliateGET /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.
413too_largePOST /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.
422invalidPOST /v1/*, GET /v1/reportsOlay veya dosya bu haliyle kullanılamaz.İsteği düzeltin. Aynı istek yeniden gönderilirse aynı yanıtı alır.
429rate_limitedGET /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.
500internal/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 422 invalid ile ve field olmadan reddedilir.
  • Operatör anahtarıyla gelen hatalı bir zaman damgası veya imza için dönen 401, gelen günlüğünde bad_signature olarak 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 (from ve to) 422 ile yanıtlanır. İzin verilmeyen bir değere sahip diğer her parametre yok sayılır ve varsayılanı kullanılır. Yanıttaki by, page ve per_page değerlerini kontrol edin.
  • Zaman aşımında, 429 ve 500 yanıtlarında yeniden deneyin. Başka bir 4xx yanıtını değiştirmeden yeniden denemeyin.

Bir 422 yanıtında field neyi belirtir

fieldNe zaman
bodyGö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).
typetype eksik ya da dört türden biri değil.
player_idEksik ya da 100 karakterden uzun; doldurulmamış bir yer tutucu; ngr için, kayıtlı olmayan bir oyuncu.
click_idDoldurulmamış bir yer tutucu. Mesaj misconfigured_macro ile başlar.
btagDoldurulmamış bir yer tutucu. Mesaj misconfigured_macro ile başlar.
promo_codeDoldurulmamış bir yer tutucu. Mesaj misconfigured_macro ile başlar.
txn_idEksik ya da 200 karakterden uzun.
ref_txn_idEksik; bu txn_id ile bilinen bir yatırım yok; ya da yatırım zaten geri çekilmiş.
amountPara 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.
ggrngr için: para biriminde ondalık bir tutar değil.
bonusesngr için: para biriminde ondalık bir tutar değil.
feesngr için: para biriminde ondalık bir tutar değil.
taxesngr için: para biriminde ondalık bir tutar değil.
tsBir günden fazla gelecekte.
periodBir gün veya ay değil ya da gelecekte.
fromGET /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.
chargebackBir 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.

statusAnlamı
acceptedŞimdi kaydedildi. Yanıt ne yaptığını söyler.
duplicateAynı 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.
rejectedYalnı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.effectAnlamı
createdBir komisyon satırı oluşturuldu: bir CPA, bir RevShare ya da düzeltilmiş bir rakam için bir düzeltme.
cancelledBir chargeback, hâlâ beklemede olan bir komisyonu reddetti.
reversedBir chargeback, onaylanmış veya ödenmiş bir komisyona karşı bir iade satırı ekledi.
noneSatır oluşturulmadı. reason nedenini söyler.

Komisyon türleri

typeAnlamı
cpaAnlaş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.
revshareBir oyuncunun bir döneme ait net oyun gelirinin (NGR) payı. Oyuncunun kazandığı bir dönem için negatiftir.
adjustmentDüzeltilmiş bir gelir rakamının yarattığı fark.
reversalOnaylandı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.
tierAnlaş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:

statusAnlamı
holdBekliyor: anlaşmanın bekletme süresinin dolmasını ya da status_reason alanının belirttiği şeyi.
approvedBekletme 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.
paidSatı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_reasonHangi durumlaAnlamı
fx_rate_missingholdGerekli 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_missinghold, approved, paidChargeback 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_missingholdKayı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_referralholdAçı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_velocityholdAçı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_conversionholdAçık bir fraud işareti: oyuncu için ikinci bir "ilk" yatırım bildirildi. Operatörü bekler.
paid_trafficholdAçık bir fraud işareti: oyuncuyu getiren tıklama bir reklam ağının click ID'sini taşıyordu. Operatörü bekler.
disposable_emailholdAçık bir fraud işareti: oyuncu geçici bir e-posta alan adıyla kaydoldu. Operatörü bekler.
geo_mismatchholdAçık bir fraud işareti: oyuncu, tıklamanın ülkesinden farklı bir ülkede kaydoldu. Operatörü bekler.
fast_registrationholdAçık bir fraud işareti: oyuncu, tıklamadan sonra belirlenen saniye içinde kaydoldu. Operatörü bekler.
affiliate_pendingholdKomisyon kazanıldığında affiliate henüz onaylanmamıştı. Affiliate onaylandığında satır yalnızca normal bekletme süresini bekler.
affiliate_rejectedholdAffiliate'in başvurusu reddedildi.
affiliate_suspendedholdKomisyon kazanıldığında affiliate askıya alınmıştı. Affiliate yeniden etkinleştirildiğinde satır yalnızca normal bekletme süresini bekler.
chargebackrejected, approvedReddedilen 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_thresholdrejectedKurlar kullanılabilir olduğunda uygun ilk yatırım veya net toplam yatırım tutarı anlaşma eşiğinin altında kaldı.
fraudrejected, approvedOperatör, satırı bekleten fraud işaretini onayladı ya da komisyonu fraud nedeniyle geri aldı.
base_rejectedrejectedİkisi de beklemedeyken komisyonu reddedilen bir kademe ek ödemesi.
self_excludedrejected, approvedOperatö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_accountrejected, approvedOperatör komisyonu geri aldı: oyuncunun başka bir hesabı var.
bonus_abuserejected, approvedOperatör komisyonu bonus suistimali nedeniyle geri aldı.
terms_breachrejected, approvedOperatör komisyonu program şartlarının ihlali nedeniyle geri aldı.
test_accountrejected, approvedOperatör komisyonu geri aldı: oyuncu bir test hesabıydı.
otherrejected, approvedOperatö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 durumuAnlamı
draftAy kapatıldı. Operatör kalemleri inceler.
approvedKilitlendi. 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 durumuAnlamı
payableBu pakette ödenecek.
carriedMinimum ödemenin altında ya da sıfırdan büyük değil: sonraki pakete devreder.
heldAffiliate'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_detailsAffiliate ödemenin nereye yapılacağını girmedi. Banka dosyasında yer almaz.
written_offAy 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_date veya player_id eksik ya da okunamıyor.
  • SALES: activitydate veya player_id eksik 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

DurumAnlamı
acceptedKaydedildi, yaptığı şeyle birlikte.
duplicateZaten kayıtlı; ilk yanıt döndürüldü.
rejectedReddedildi; ayrıntıda hangi alan olduğu ve nedeni belirtilir.
bad_signatureZaman damgası veya imza hatalıydı.
testEntegrasyon sayfasından bir test olayı. Gerçek yoldan geçer ve hiçbir şey kaydetmez.

Bir postback teslimatının durumları

DurumAnlamı
queuedİlk denemesini ya da bir sonraki yeniden denemeyi bekliyor. Portal bunu bekliyor veya yeniden deneniyor olarak gösterir.
deliveredTracker 2xx durumuyla yanıt verdi.
deadHer yeniden deneme başarısız oldu. Portal bunu vazgeçildi olarak gösterir; affiliate onu elle yeniden gönderebilir.

Bir affiliate'in durumları

DurumAnlamı
pendingBaşvurdu; operatör henüz karar vermedi.
approvedProgramda aktif.
rejectedBaşvuru reddedildi.
suspendedOperatö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

ParametreAnlamı
sub1 … sub5Affiliate'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_contentTıklamayla kaydedilir ve landing sayfasına aktarılır. Adresteki bir değer, linke sabitlenen değerin yerini alır.
gclid fbclid ttclid msclkid wbraidReklam ağı click ID'leri. Tıklamayla birlikte saklanır; postback makrosu olarak kullanılabilir. Aktarılmaz.

Landing URL'sine eklenen parametreler

ParametreAnlamı
cidClick 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_contentTıklamanın UTM etiketleri, boş değillerse.
  • Markanın landing URL'si sorgusunda {click_id} içeriyorsa click ID oraya yazılır ve cid eklenmez.
  • Onaylı olmayan bir affiliate'in linkine yapılan tıklama kaydedilir ve işaretlenir; ziyaretçi cid ve btag olmadan yönlendirilir: tıklama atfedilemez.
  • Botlar, link önizlemeleri, HEAD istekleri, 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 404 ve 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
registrationleadBir oyuncu affiliate'e atfedildi.
ftdsaleBir ilk yatırım affiliate'e bir CPA komisyonu kazandırdı.
commission_approvedapprovedBir komisyon, bekletme süresi dolduğunda onaylandı.
commission_rejectedrejectedBeklemedeki bir komisyon bir incelemenin ardından reddedildi.
commission_paidpaidBir komisyon bir ödeme paketinde ödendi.
chargebackrejectedBir 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.

OlayKeitaroBinomRedTrackBeMob
registrationleadleadothernew
ftdsalesalependingapproved
commission_approvedsalesaleapprovedapproved
commission_rejectedrejectedrejectdeclineddeclined
commission_paidsalesaleapprovedapproved
chargebackrejectedrejectdeclinedchargeback

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.

MakroAnlamı
{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.

Keitarohttps://YOUR-TRACKER-DOMAIN/POSTBACK-KEY/postback?subid={sub1}&status={status}&payout={commission}&currency={currency}&tid={conversion_id}
Binomhttps://YOUR-TRACKER-DOMAIN/click?cnv_id={sub1}&payout={commission}&cnv_status={status}&cnv_currency={currency}
Voluumhttps://YOUR-TRACKER-DOMAIN/postback?cid={sub1}&payout={commission}&currency={currency}&txid={event_id}&et={event}
RedTrackhttps://YOUR-TRACKER-DOMAIN/postback?clickid={sub1}&sum={commission}&status={status}&type={event}&rdtk_event_id={event_id}
BeMobhttps://YOUR-TRACKER-DOMAIN/postback?cid={sub1}&payout={commission}&txid={conversion_id}&status={status}
PeerClickhttps://YOUR-TRACKER-DOMAIN/postback?cid={sub1}&payout={commission}&txid={conversion_id}&status={status}&currency={currency}
FunnelFlux Prohttps://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}&currency={currency}&tid={conversion_id}&eid={event_id}
GET https://tracker.example/postback?click_id=TRACKER_CLICK_ID&event=ftd&status=sale&payout=40.00&currency=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/1 olan bir GET isteğidir. En fazla üç yönlendirmeyi izler ve 5 saniye sonra vazgeçer. Sertifikalar doğrulanır.
  • Bir 2xx yanı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:// veya https:// adresi olmalıdır.

Bir deneme neden başarısız oldu

timeout5 saniye içinde yanıt yok.
dnsSunucu adı bulunamadı.
refusedBağlantı reddedildi.
blocked_addressAdres özel veya yerel.
tlsSertifika sorunu.
too_many_redirectsÜçten fazla yönlendirme.
http_errorTracker 2xx dışında bir durumla yanıt verdi.
otherBağ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.

Olaydata alanlarıNe zaman
affiliate.appliedaffiliate_number affiliate_name email promotes_on trafficBiri 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.approvedaffiliate_number affiliate_name email reason decided_by invitedBir 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.rejectedaffiliate_number affiliate_name email reason decided_byBir başvuruyu reddettiniz.
affiliate.suspendedaffiliate_number affiliate_name email reason decided_byOnaylı bir affiliate'i askıya aldınız.
player.registeredplayer_id occurred_at attributed affiliate_number affiliate_name attribution_reasonBir oyuncu, imzalı bir olayla veya bir REG dosyası satırıyla, atfedilmiş olsun ya da olmasın kaydedildi. Oyuncu başına bir kez.
commission.createdplayer_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currencyKomisyon 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.approvedplayer_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currencyBeklemedeki 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.rejectedplayer_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currencyBeklemedeki 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.paidplayer_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currencyBir 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.reversedplayer_id occurred_at attributed affiliate_number affiliate_name commission_id commission_type amount amount_currency commission commission_currencyBir 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_closedbatch_id period reference items payable_by_currency closed_by_handBir ay, bir kişi tarafından veya zamanlanmış kapanışla taslak bir ödeme paketine kapatıldı.
payout.batch_approvedbatch_idTaslak bir ödeme paketi onaylandı ve kilitlendi.
payout.paidbatch_id item_id affiliate_number affiliate_name currency amountOnaylı bir paketin bir kalemi ödendi olarak işaretlendi. Bütün kalemleri ödenmiş bir paket kendine ait bir olay göndermez.
tracking.health_alertbrand kind since quiet_hours clicks_at_leastBir 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_clearedbrand raised_at cleared_atİzleme sağlığı uyarısından sonraki ilk kayıt geldi ve uyarı kalktı.
flag.raisedkind detail affiliate_number affiliate_nameBir 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_offdestination failures affiliate_number affiliate_nameBir ortağın postback hedefi, yeniden deneme merdiveninin izin verdiği art arda başarısız teslimattan sonra kapatıldı.
file.latesource datePlanlı 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.testmessageYalnı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:

AlanTürAnlamı
idstringOlayı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.
typestringYukarıdaki tablodaki olay.
created_atstringOlayın sıraya alındığı zaman, UTC olarak RFC 3339 biçiminde, saniye kesirleriyle.
dataobjectOlayı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ıkDeğer
RevRake-EventOlay, gövdedeki type ile aynı.
RevRake-DeliveryBu 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-TimestampBu denemenin gönderildiği zaman, Unix saniyesi olarak. Her denemede yenidir.
RevRake-SignatureEndpoint'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ı

AlanTürAnlamı
affiliate_numberintegerAffiliate'in numarası.
affiliate_namestringAffiliate'in adı.
emailstringAffiliate'in giriş yaptığı e-posta adresi.
promotes_onstringBaşvuranın nerede tanıtım yaptığı hakkında yazdıkları.
trafficarray of stringBaşvuranın işaretlediği trafik kaynakları: seo, telegram, paid_social, youtube, email veya offline.
reasonstringAffiliate'e verilen gerekçe. Ret veya askıya almada her zaman vardır; onayda boş olabilir.
decided_bystringKararı veren ya da affiliate'i ekleyen ekip üyesinin e-posta adresi.
invitedbooleanAffiliate'i başvuru olmadan kendiniz ekleyip davet ettiyseniz true. Aksi halde yer almaz.
player_idstringOyuncu için sizin kimliğiniz.
occurred_atstringNe 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ı.
attributedbooleanOyuncunun bir affiliate'e ait olup olmadığı. Bir komisyon için her zaman true.
attribution_reasonstringOyuncunun neden atfedildiği veya atfedilmediği: atıf nedenlerinden biri.
commission_idstringRevRake'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_typestringKomisyon 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ü.
amountstringBir 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_currencystringamount para biriminin ISO kodu.
commissionstringKomisyon, 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_currencystringKomisyonun para biriminin ISO kodu: anlaşmanınki.
batch_idstringRevRake'in ödeme paketi kimliği, bir UUID.
periodstringPaketin kapattığı ay, YYYY-MM.
referencestringPaketin banka dosyasındaki referansı, örneğin po_2026-09_demo.
itemsintegerPaketin, durumları ne olursa olsun, kaç kalemi olduğu.
payable_by_currencyobjectPara 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_handbooleanAyı bir kişi kapattıysa true, zamanlanmış kapanış için false.
item_idstringRevRake'in ödeme kalemi kimliği, bir UUID.
currencystringKalemin para birimi.
messagestringTestin ulaştığını söyleyen bir cümle.

Bir isteği doğrulayın

  1. Ham gövdeyi, herhangi bir JSON ayrıştırmasından önce bayt olarak okuyun.
  2. RevRake-Timestamp değ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.
  3. 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-Signature ile karşılaştırın.
  4. Gövdeyi ancak ondan sonra ayrıştırın. id değerini daha önce işlediyseniz 2xx ile yanıt verin ve hiçbir şey yapmayın.
  5. 5 saniye içinde herhangi bir 2xx ile 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 id alanı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_at veya occurred_at değerine göre sıralayın.
  • 5 saniye içinde bir 2xx yanı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 3xx yanıtı redirect hatası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.test olayı 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 bir 3xx ile 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 4xx ile 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 id değ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 2xx ile 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 redirect ile 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_id kullanın ve GET /v1/commissions ile 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