FastCoins ist ein PTC-Netzwerk (Paid-To-Click) für Publisher. Binde unsere Werbung auf deiner Seite ein, deine Nutzer verdienen Token-Belohnungen beim Ansehen, und du erhältst automatisch einen Anteil der Einnahmen.
Erstelle ein Publisher-Konto, bestätige, dass die Domain dir gehört, und erhalte deine API-Zugangsdaten, sobald sie geprüft ist.
-
1Erstelle ein Publisher-Konto unter FastCoins.com/publisher_dashboard. Du brauchst einen Seitennamen und eine URL.
-
2Füge eine Domain hinzu im Tab „Domains“. Jede Domain hat ihren eigenen API Key, Secret Key, Bearer Token, Token-Konfiguration und Postback-URL.
-
3Lege deine Postback-URL fest — den Endpoint auf deinem Server, der Belohnungs-Benachrichtigungen empfängt (siehe Abschnitt Postback unten).
-
4Erzeuge einen Bearer Token im Tab „Domains“. Erforderlich, um PTC-API-Aufrufe zu authentifizieren.
-
5Sende einen Test-Postback aus dem Tab „Domains“, um zu prüfen, ob dein Endpoint korrekt antwortet, bevor du live gehst.
Eine Server-zu-Server-Benachrichtigung, die an deine Website gesendet wird, wenn ein Nutzer das Ansehen einer Werbung abgeschlossen hat — so kannst du Belohnungen automatisch gutschreiben, ganz ohne clientseitigen Code.
🔐 Sicherheitsanforderungen
- Autorisierte Server-IPs:
62.171.140.250,2a02:c207:2329:8601::1— prüfe das ausschließlich gegen$_SERVER['REMOTE_ADDR']. Das ist ein direkter Server-zu-Server-Aufruf, keine Browser-Anfrage, es liegt also kein Proxy/CDN von uns dazwischen; ein Header wieX-Forwarded-Forwird vom Client geliefert und ist trivial zu fälschen — verlass dich dafür nicht darauf. userIpist Pflicht, nicht nur informativ — weise den Callback zurück, wenn er fehlt oder keine gültige IP ist. Wir lösen immer die echte IP des Nutzers auf, der die Werbung abgeschlossen hat (über Cloudflare auf unserer Seite), und senden sie gerade deshalb, damit du dich bei Fraud-Erkennung, IP-Limits und Duplikatsprüfungen darauf verlassen kannst — ein Endpoint, der sie ignoriert, verliert dieses Signal komplett.- Erforderliche HTTP-Antwort: exakt
ok— Kleinbuchstaben, keine Leerzeichen, kein HTML, HTTP 200 - Signaturalgorithmus (empfohlen):
signature_sha256=HMAC-SHA256(subId + transId + reward, secret_key)—secret_keyist der HMAC-Schlüssel, er wird nicht an die Nachricht angehängt.userIpist kein Bestandteil davon. - Signaturalgorithmus (veraltet, wird bei jedem Callback weiterhin mitgesendet):
signature=MD5(subId + transId + reward + secret_key)— Werte ohne Trennzeichen aneinandergereiht. Bleibt unbefristet funktionsfähig für Integrationen, die es vorsignature_sha256gab; nichts zu ändern, wenn du diese bereits prüfst. - Mehr als 8 Dezimalstellen nötig? Jeder Callback trägt zusätzlich
reward_precise(10 Dezimalstellen) mit seiner eigenensignature_sha256_precise=HMAC-SHA256(subId + transId + reward_precise, secret_key)— komplett optional und additiv, genauso berechnet, nur über die präzisere Zeichenkette.reward/signature_sha256/signaturewerden unabhängig davon genau wie bisher gesendet. - Dublettenschutz: prüfe
transIdimmer in deiner Datenbank, bevor du gutschreibst
📋 Postback-Parameter (GET)
Deine Postback-URL erhält diese Parameter per HTTP GET.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| subId | string | ERFORDERLICH | Eindeutige Nutzer-ID in deinem System — der Wert, den du beim Widget/API-Aufruf übergeben hast |
| transId | string | ERFORDERLICH | Eindeutige Transaktions-ID — immer prüfen, um doppelte Gutschriften zu verhindern |
| reward | float | ERFORDERLICH | Belohnung in deiner Token-Währung (bereits mit deinem konfigurierten token_rate umgerechnet), formatiert mit 8 Dezimalstellen |
| reward_precise | float | Optional | Dieselbe Belohnung wie reward, formatiert mit 10 statt 8 Dezimalstellen — nutze sie, wenn 8 Dezimalstellen dir nicht ausreichen |
| reward_name | string | ERFORDERLICH | Token-Name, wie für deine Domain konfiguriert (z. B. POINTS, COINS) |
| reward_value | float | ERFORDERLICH | Wie reward — für Bitcotasks-Kompatibilität enthalten |
| offer_name | string | Optional | Titel der abgeschlossenen Werbung — praktisch fürs Logging |
| offer_type | string | Optional | Immer ptc bei Werbungen von FastCoins |
| payout | float | Optional | Wie reward — für Kompatibilität mit Drittanbietern enthalten |
| userIp | string | ERFORDERLICH | Echte IP-Adresse des Nutzers, der das Offer abgeschlossen hat, auf unserer Seite über Cloudflare aufgelöst, bevor wir diesen Callback senden — weise den Callback zurück, wenn sie fehlt oder FILTER_VALIDATE_IP nicht besteht. Nutze sie für Fraud-Erkennung, IP-Limits, Duplikatsnutzer-Erkennung, Konversions-Audits und Analytics. |
| status | integer | ERFORDERLICH | 1 = Belohnung gutschreiben | 2 = Chargeback (Belohnung abziehen) |
| signature_sha256 | string | ERFORDERLICH | HMAC-SHA256 über subId + transId + reward, mit secret_key als Schlüssel — empfohlen für neue Integrationen |
| signature_sha256_precise | string | Optional | HMAC-SHA256 über subId + transId + reward_precise, mit secret_key als Schlüssel — prüfe diese statt signature_sha256 nur, wenn du auch reward_precise ausliest |
| signature | string | ERFORDERLICH | Veraltet: MD5 über subId + transId + reward + secret_key aneinandergereiht (keine Trennzeichen). Wird bei jedem Callback weiterhin unverändert gesendet — für Integrationen, die es vor signature_sha256 gab. |
| test | integer | Optional | 1 = Test-Postback aus dem Dashboard — keine echten Belohnungen gutschreiben |
🧮 Beispiel: Aufbau und Prüfung einer signierten URL
Ein vollständig durchgerechnetes Beispiel, damit du deine eigene Signaturberechnung vor dem Live-Gang mit unserer abgleichen kannst. Der verwendete Secret Key ist ausgedacht und dient rein der Veranschaulichung.
Secret Key (example only, never a real one): demo_secret_do_not_use_9f8e7d6c Parameters for this conversion: subId = user_12345 transId = txn_987654321 reward = 0.50 status = 1 userIp = 127.0.0.1 signature_sha256 = HMAC-SHA256(subId + transId + reward, secret_key) = HMAC-SHA256("user_12345" . "txn_987654321" . "0.50", demo_secret_do_not_use_9f8e7d6c) = HMAC-SHA256("user_12345txn_9876543210.50", demo_secret_do_not_use_9f8e7d6c) = df3eafaa3e8cf4fe8fb40c7bed633f34bc7b964bca58d2d691314771a042d59c signature (legacy) = MD5(subId + transId + reward + secret_key) = MD5("user_12345" . "txn_987654321" . "0.50" . "demo_secret_do_not_use_9f8e7d6c") = MD5("user_12345txn_9876543210.50demo_secret_do_not_use_9f8e7d6c") = d1eb68e41cbd5770de9384c5be8ebb39 Resulting callback URL: https://yoursite.com/postback.php?subId=user_12345&transId=txn_987654321&reward=0.50&status=1&userIp=127.0.0.1&signature=d1eb68e41cbd5770de9384c5be8ebb39&signature_sha256=df3eafaa3e8cf4fe8fb40c7bed633f34bc7b964bca58d2d691314771a042d59c
reward_name, reward_value, offer_name, offer_type, payout und test der Kürze halber weg — dein echter Callback enthält alle, siehe Tabelle oben.📐 Optional: 10-Dezimalstellen-Präzision (reward_precise)
Gleicher Secret Key, gleicher Callback — nur eine Belohnung mit mehr Nachkommastellen, als die 8 Dezimalstellen von reward fassen können. Rein additiv: überspringe das, wenn 8 Dezimalstellen für deinen Fall genügen.
Same secret key and subId/transId as above, but the underlying reward this time carries more precision: reward = 0.12345679 (8 decimals, rounded) reward_precise = 0.1234567890 (10 decimals) signature_sha256_precise = HMAC-SHA256(subId + transId + reward_precise, secret_key) = HMAC-SHA256("user_12345" . "txn_987654321" . "0.1234567890", demo_secret_do_not_use_9f8e7d6c) = 219d2101a528b8585161bd26c3bb80c5de8a6741d60d2f1778eb805a05f7a707
💻 PHP-Implementierung — postback.php
Speichere das auf deinem Server, hinterlege deinen Secret Key aus dem Tab „Domains“ und füge die vollständige URL ins Feld Postback URL deiner Domain ein.
// ── 1. YOUR SECRET KEY (from Domains tab → Secret Key) ───── $secret = ""; // ← paste your secret key here // ── 2. IP VALIDATION (callback source) ────────────────────── // REMOTE_ADDR only — this call comes straight from our server to // yours, no browser and no proxy of ours in between, so it's the // one value here that can't be spoofed by whoever is calling you. // X-Forwarded-For (or any other header) is attacker-controlled and // must never be trusted for this check. $allowed_ips = ['62.171.140.250', '2a02:c207:2329:8601::1']; $ip = $_SERVER['REMOTE_ADDR'] ?? ''; if (!in_array($ip, $allowed_ips, true)) { echo "ERROR: Invalid source IP"; exit; } // ── 3. COLLECT PARAMETERS ─────────────────────────────────── $userId = $_GET['subId'] ?? null; $transId = $_GET['transId'] ?? null; $status = $_GET['status'] ?? null; $isTest = isset($_GET['test']) && $_GET['test'] == 1; $userIp = $_GET['userIp'] ?? null; // real IP of the ad viewer — required, see step 4 // ── 3b. DYNAMIC PRECISION ──────────────────────────────────── // Prefer reward_precise (10 decimals) when the callback carries it; // fall back to the standard reward (8 decimals) otherwise. Whichever // pair is picked, it's verified against its own matching signature in // step 6 — if that signature is valid, the postback is accepted. $hasPrecise = isset($_GET['reward_precise'], $_GET['signature_sha256_precise']); $reward = $hasPrecise ? $_GET['reward_precise'] : ($_GET['reward'] ?? null); $signature = $hasPrecise ? $_GET['signature_sha256_precise'] : ($_GET['signature_sha256'] ?? null); // ── 4. VALIDATE USER IP (required) ────────────────────────── // userIp is mandatory — this is the real IP of the person who // completed the offer, already resolved through Cloudflare on our // end. Reject the callback outright rather than silently accepting // one without it, since your fraud detection / IP-limit / duplicate- // user checks depend on this value actually being present and valid. if (!$userIp || !filter_var($userIp, FILTER_VALIDATE_IP)) { echo "ERROR: Invalid user IP"; exit; } // ── 5. VALIDATE REQUIRED PARAMS ───────────────────────────── if (!$userId || !$transId || $reward === null || !$signature) { echo "ERROR: Missing parameters"; exit; } // ── 6. VERIFY SIGNATURE ───────────────────────────────────── // Only subId + transId + reward go into this hash — userIp is NOT // part of it. $secret is the HMAC key, not concatenated into the // message. Don't add userIp here unless a different provider's docs // explicitly say their signature scheme includes it. $expected = hash_hmac('sha256', $userId . $transId . $reward, $secret); if (!hash_equals($expected, $signature)) { echo "ERROR: Signature mismatch"; exit; } // ── 7. HANDLE CHARGEBACK (status = 2) ─────────────────────── if ((int)$status === 2) { $reward = -abs((float)$reward); // negative = deduct } // ── 8. TEST CALLBACK ───────────────────────────────────────── // Authenticated and validated like any other callback, but must not // touch a real balance. if ($isTest) { echo "ok"; exit; } // ── 9. PREVENT DUPLICATES, CREDIT REWARD & STORE USER IP ────── // Replace with your actual DB logic. if (!isTransactionProcessed($transId)) { creditUserReward($userId, $reward, $transId); // If your credit function only takes these 3 args, store $userIp // with the conversion separately, e.g.: // saveConversionIp($transId, $userId, $userIp); } // ── 10. REQUIRED RESPONSE ─────────────────────────────────── echo "ok"; // MUST return exactly this, nothing else
🕓 Veraltete Prüfung — MD5
signature bereits mit MD5? Er wird weiterhin bei jedem Callback gesendet, komplett unverändert — das hier ist rein zur Referenz. Nichts zu tun. Neue Integrationen sollten stattdessen signature_sha256 von oben verwenden.$signature = $_GET['signature'] ?? null; $expected = md5($userId . $transId . $reward . $secret); if (!hash_equals($expected, $signature)) { echo "ERROR: Signature mismatch"; exit; } // ...same IP check, userIp check, and crediting logic as the main example above.
🔀 Callback-Ablauf
- 1Callback empfangen
- 2Prüfe
REMOTE_ADDRgegen die IP-Whitelist - 3Lies die Parameter, einschließlich
userIp - 4Validiere
userIp— zurückweisen, wenn er fehlt oder keine gültige IP ist - 5Validiere die übrigen Pflichtparameter
- 6Prüfe die Signatur
- 7Prüfe
status— als Chargeback buchen, wenn2 - 8Wenn
test=1, gibokzurück, ohne etwas gutzuschreiben - 9Prüfe
transIdgegen deine Datenbank, um doppelte Gutschriften zu verhindern - 10Schreibe die Belohnung gut oder storniere sie, und speichere
userIpzusammen mit der Konversion - 11Gib
okzurück
Mögliche Antworten:
ok— Callback verarbeitet (oder als Test-Callback validiert)ERROR: Invalid source IPERROR: Invalid user IPERROR: Missing parametersERROR: Signature mismatch
ok zurückgeben — ohne Leerzeichen, ohne Zeilenumbrüche, ohne HTML.transId.test=1 — schreib dafür nichts gut.Frage verfügbare PTC-Werbung über eine REST-API ab und rendere sie mit deiner eigenen Oberfläche. Kein Widget-Einbau nötig.
🌐 Endpoint
| Segment | Beschreibung |
|---|---|
| API_KEY | Der API Key deiner Domain — zu finden im Tab „Domains“ deines Publisher-Dashboards |
| USER_ID | Eindeutige Kennung des Nutzers in deinem System. Wird im Postback als subId zurückgegeben |
| USER_IP | Echte IP-Adresse des Nutzers — für Werbe-Targeting und Fraud-Prävention. Übergib die echte Client-IP |
| DEVICE | Genau desktop oder mobile — einen dritten Wert gibt es nicht. Tablets (iPad, Android-Tablets) zählen als mobile. Das echte Gerät des Besuchers ist Pflicht, sobald irgendeinAdvertiser eine gerätespezifische Kampagne schaltet: Da du diese API von deinem eigenen Server aufrufst, ist der User-Agent deines Servers nicht der des Besuchers — wir können ihn nicht für dich erkennen, du musst ihn erkennen und durchreichen. Alles andere als desktop/mobile zu senden (auch ein wörtliches "tablet") wird wie ein Weglassen behandelt — mappe es selbst auf mobile. Eine Anfrage, die das weglässt oder falsch schreibt, gibt in dem Fall HTTP 400 zurück. |
[DEVICE] noch nicht sendet, füge es jetzt hinzu. Aktuell wird es still ignoriert, sobald aber gerätespezifisches Targeting live geht, kommt HTTP 400 zurück — warte nicht ab, bis das deinen Feed bricht.🔑 Authentifizierung — Bearer Token
Authorization-Header. Erzeuge einen pro Domain im Tab „Domains“ (🔄-Button neben „Bearer Token“).💻 PHP-Beispiel
// ── YOUR CREDENTIALS (from Domains tab) ───────────────────── $apiKey = 'YOUR_API_KEY'; $bearerToken = 'YOUR_BEARER_TOKEN'; // ── USER DATA ──────────────────────────────────────────────── $userId = $_SESSION['user_id']; // your user's unique ID // REMOTE_ADDR by default — it's the one value here that can't be // spoofed by the visitor. Only read a proxy header instead (e.g. // CF-Connecting-IP) if your own server sits behind a reverse proxy // you control and trust — never a client-supplied header like // X-Forwarded-For, which the visitor's own browser can set to // anything. $userIp = $_SERVER['REMOTE_ADDR'] ?? ''; // Required once any advertiser runs a device-targeted campaign — this // script call happens during the visitor's own page load, so THIS // server's incoming User-Agent is theirs. Don't skip this: a call from a // background job/cron with no real visitor attached has no correct value // to send here. $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; $device = preg_match('/Mobi|Android|iPhone|iPod|iPad|BlackBerry|IEMobile|Opera Mini/i', $userAgent) ? 'mobile' : 'desktop'; // ── BUILD URL ──────────────────────────────────────────────── $url = 'https://FastCoins.com/api/' . $apiKey . '/' . urlencode($userId) . '/' . urlencode($userIp) . '/' . $device; // ── CURL REQUEST ───────────────────────────────────────────── $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $bearerToken, 'Accept: application/json', ], ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $data = json_decode($response, true); // ── HANDLE RESPONSE ────────────────────────────────────────── if ($httpCode === 200 && $data['status'] === '200') { foreach ($data['data'] as $ad) { // $ad['url'] already contains the user subId encoded echo '<a href="' . htmlspecialchars($ad['url']) . '" target="_blank">'; echo htmlspecialchars($ad['title']); echo ' — ' . $ad['reward'] . ' ' . $ad['currency_name']; echo '</a><br>'; } } else { echo 'No ads available.'; }
📦 Antwortformat
Erfolgreiche Antworten liefern HTTP 200 mit dieser JSON-Struktur:
| Feld | Typ | Beschreibung |
|---|---|---|
| id | string | Eindeutige Kennung der Werbung |
| image | string | Vollständige URL des Banner-Bildes — kann leer sein |
| title | string | Anzeigetitel — zeige ihn deinen Nutzern |
| description | string | Kurze Beschreibung der Werbung |
| duration | string | Erforderliche Betrachtungszeit in Sekunden: 2, 30 oder 60 |
| reward | float | Belohnungshöhe in der Token-Währung deiner Domain (bereits umgerechnet) |
| currency_name | string | Token-Name, wie für deine Domain konfiguriert (z. B. COINS, USDT) |
| url | string | Leite den Nutzer hierhin, um die Werbung anzusehen. Das Postback wird bei Abschluss automatisch ausgelöst. Enthält bereits den codierten subId des Nutzers. |
| boosted_campaign | boolean | Ob dies eine beworbene Werbung ist — hebe diese in deiner Oberfläche hervor |
| ad_type | string | Iframe = läuft innerhalb eines Frames | Redirect = der Nutzer gelangt zur Seite desAdvertisers |
⚠️ Fehlercodes
Fehlerantworten teilen dieselbe JSON-Struktur mit einem Statusfeld ungleich 200.
| HTTP | status | Ursache & Lösung |
|---|---|---|
| 401 | 401 | Ungültiger API Key — prüfe das API_KEY-Segment in der URL, oder der Bearer Token fehlt, obwohl die Domain einen verlangt |
| 403 | 403 | Bearer Token stimmt nicht überein — neu erzeugen und im Tab „Domains“ aktualisieren |
| 400 | 400 | Ungültiges USER_ID-Format — muss alphanumerisch sein (a-z, 0-9, _, -, .), maximal 255 Zeichen |
| 400 | 400 | DEVICE-Segment fehlt oder ist ungültig — wird erst zurückgegeben, wenn gerätespezifisches Targeting live ist. Muss exakt desktop oder mobile sein |
| 500 | 500 | Interner Serverfehler — das message-Feld enthält Debug-Details. Kontaktiere den Support, falls es weiterhin auftritt. |
Der Ablauf von Anfang bis Ende: vom API-Aufruf bis zur Belohnungsgutschrift auf deiner Seite.
📡 API + Postback-Ablauf
GET /api/…url der WerbungGET postback.phpok🧩 Widget-Einbau (Alternative)
Wenn du die API nicht nutzen willst, binde das Widget als iframe ein — es erledigt alles automatisch, stilistisch isoliert vom Rest deiner Seite.
<iframe src="https://fastcoins.click/widget-embed.php?api_key=YOUR_API_KEY&sub_id={USER_ID}" style="width:100%;height:640px;border:none;" loading="lazy"></iframe>
YOUR_API_KEY durch den API Key deiner Domain und {USER_ID} durch die ID des aktuellen Nutzers (serverseitig gerendert). Das Widget zeigt verfügbare Werbungen und Aufgaben inline an und löst das Postback bei Abschluss automatisch aus. Passe die 640px im style an, um den iframe höher oder niedriger zu machen, wie es dein Layout erfordert.sub_id (= {USER_ID}) pro echtem Nutzer — kein Aufsplitten über Suffixe. Jeder deiner Nutzer muss durch eine einzelne, stabile ID identifiziert werden. Du wählst das Format — eine opake ID, ein Benutzername, eine E-Mail (z. B. ABD01230A23, [email protected]) — aber ein echter Nutzer entspricht genau einer ID, für immer. Nicht erlaubt: eine Basis-ID zu nehmen und ein numerisches Suffix anzuhängen, um aus einer echten Person viele "Nutzer" zu machen. Die Erkennung ist trennzeichenagnostisch — sie entfernt ein angehängtes
-, _ oder . gefolgt von Ziffern und behandelt den Rest als Identität des Nutzers. Jedes dieser Paare wird abgelehnt: 123-1&123-2ABC_1&ABC_2A23-23&A23-24order.1&order.2
ABD01230A23, 1001, [email protected] sind alle in Ordnung). Wird das Muster erkannt, antwortet die API weiterhin
ok, liefert aber eine Meldung, dass die ID nicht erlaubt ist, und es wird keine Belohnung gutgeschrieben; der Versuch wird als Betrug protokolliert. Erstelle eine Aufgabe (z. B. "registriere dich auf meiner Seite"), hinterlege Geld für N Abschlüsse und bestätige jeden mit einem signierten Server-zu-Server-Postback. Der Nutzer wird automatisch gutgeschrieben, sobald dein Postback ankommt — keine manuelle Freigabe, keine Plattform-Rücklage.
📡 So funktioniert es
/create-taskcka_cid1) Die Postback-URL
GET https://fastcoins.click/webhooks/task-postback.php?cka_cid={CLICK_ID}&sign={SIGN}cka_cid— die Click-ID, die wir an deine Ziel-URL angehängt haben, als der Nutzer startete (your-url?cka_cid=…). Gib sie unverändert zurück.sign—hash_hmac('sha256', $cka_cid, $task_secret)(Hex in Kleinbuchstaben). Das aufgabenspezifische Secret wird unter Create Task → My Tasks angezeigt.
2) Signatur
// PHP
$sign = hash_hmac('sha256', $cka_cid, $task_secret);
// Node.js
const sign = crypto.createHmac('sha256', taskSecret).update(ckaCid).digest('hex');
# Python
import hmac, hashlib
sign = hmac.new(task_secret.encode(), cka_cid.encode(), hashlib.sha256).hexdigest()403, selbst mit gültiger Signatur. Dies plus der HMAC ist das komplette Authentizitätsmodell — halte dein Secret sicher.3) Optionales Analytics-Pixel
Platziere das auf deiner Konversionsseite für dein eigenes Analytics. Es schreibt niemals gut — das Postback oben ist das Einzige, das gutschreibt.
<img src="https://fastcoins.click/task-pixel.php?cid={CLICK_ID}" width="1" height="1" alt="">Empfehlungen für eine zuverlässige, sichere und umsatzstarke Integration.
⚡ Leistung
- Cache API-Antworten mindestens 60 Sekunden pro Nutzer. Rufe die API nicht bei jedem Seitenaufruf auf — Werbungen ändern sich höchstens alle paar Minuten.
- Übergib die echte Nutzer-IP. Nutze standardmäßig
REMOTE_ADDR— es ist der einzige Wert, den der Besucher nicht fälschen kann. Lies nur dann stattdessen einen Proxy-Header (z. B.CF-Connecting-IP), wenn dein eigener Server hinter einem Reverse-Proxy sitzt, den du kontrollierst und dem du vertraust; niemals ein clientseitiger Header wieX-Forwarded-For. Falsche IPs verschlechtern die Targeting-Qualität. - Setze ein 10-Sekunden-Timeout für deine cURL-Aufrufe, um langsame Seitenladezeiten zu vermeiden, falls unsere API vorübergehend langsam ist.
🔒 Sicherheit
- Gebe deinen Secret Key niemals preis — nicht in clientseitigem Code und nicht in öffentlichen Repositories. Er wird ausschließlich serverseitig zur Signaturprüfung verwendet.
- Prüfe
transIdimmer gegen deine Datenbank, bevor du gutschreibst — das verhindert doppelte Belohnungen durch versehentlich erneut gesendete Postbacks. - Validiere die Quell-IP, bevor du ein Postback verarbeitest. Akzeptiere Anfragen nur von
62.171.140.250oder2a02:c207:2329:8601::1. - Verwende HTTPS für deinen Postback-Endpoint. HTTP-Endpoints können blockiert werden.
- Sende genau einen eindeutigen
sub_idpro echtem Nutzer. Hänge keine numerischen Suffixe an eine Basis-ID an (123-1/123-2,ABC_1/ABC_2,order.1/order.2) — jedes Trennzeichen (-_.) wird als Betrug erkannt und ohne Gutschrift abgelehnt. Siehe die Regel oben.
💰 Umsatz
- Boostete Werbungen (
boosted_campaign: true) zahlen mehr — hebe sie in deiner Oberfläche hervor, um die Klickraten zu steigern. - Längere Werbungen (60 s) zahlen deutlich mehr als kurze (2 s). Priorisiere sie, wenn die Nutzeraktivierung hoch ist.
- Balanciere deinen Nutzeranteil — eine höhere Auszahlung zieht mehr aktive Nutzer an; eine niedrigere erhöht deine eigene Marge.
- Auszahlungen sind vom 1. bis 3. jedes Monats möglich — trag es in deinen Kalender ein.
🐛 Fehlerbehebung
- Nutze die Schaltfläche Test Postback im Tab „Domains“, um zu prüfen, ob dein Endpoint exakt
okmit HTTP 200 zurückgibt. - Sieh im Tab Postback Logs nach, um vollständige HTTP-Antworten jedes Postback-Versuchs zu sehen — dort stehen Statuscodes und Serverantworten.
- Fehlgeschlagene Postbacks können einzeln oder in Sammelaktion erneut gesendet werden — keine Daten gehen je dauerhaft verloren.
- Wenn die Signatur immer fehlschlägt: Prüfe bei
signature_sha256, dasssecret_keyals HMAC-Schlüssel übergeben wird (nicht an die Nachricht angehängt) und dass dusubId + transId + rewardohne Trennzeichen hashst; beim veraltetensignature, prüfe, dass dusubId + transId + reward + secretohne Trennzeichen aneinanderreihst. Stelle in beiden Fällen sicher, dassrewardexakt der Zeichenkette aus dem GET-Parameter entspricht (nicht gerundet). - Wenn du
signature_sha256_preciseprüfst: gehasht wird überreward_precise, nicht überreward— die beiden Felder mit der falschen Signatur zu vermischen ist hier der häufigste Fehler.
Bereit zu starten und zu verdienen?
Erstelle dein Publisher-Konto in weniger als 2 Minuten und verifiziere anschließend deine Domain.
Publisher-Dashboard öffnen →