API v4.4 Espace PublisherTableau de bord
📡 Guide d'intégration publisher

FastCoins API Publisher
Documentation

Tout ce qu'il te faut pour intégrer des publicités PTC sur ton site — notifications Postback S2S et référence complète de l'API.

Postback S2S PTC API Authentification Bearer Token Exemples PHP Gratuit et public
Vue d'ensemble

FastCoins est un réseau de publishers PTC (Paid-To-Click). Intègre nos publicités sur ton site, tes utilisateurs gagnent des récompenses en tokens en les regardant, et tu perçois automatiquement une part des revenus.

📡
Postback (S2S)
Ton serveur est notifié via HTTP GET quand un utilisateur termine une publicité. Idéal pour créditer les récompenses automatiquement, sans code côté client.
🔌
PTC API
Récupère les publicités disponibles par programmation et affiche-les avec ta propre interface. Aucun widget à intégrer.
🪙
Tokens personnalisés
Configure ton propre nom de token et ton taux de conversion. Les récompenses sont automatiquement converties et envoyées via postback.
💰
Partage des revenus
Tu contrôles le pourcentage reversé à l'utilisateur. Le reste, c'est ton revenu de publisher — retirable chaque mois (du 1 au 3).
🚀
Premiers pas

Crée un compte publisher, vérifie que le domaine t'appartient et reçois tes identifiants API une fois qu'il est examiné.

  • 1
    Crée un compte publisher sur FastCoins.com/publisher_dashboard. Il te faut un nom de site et une URL.
  • 2
    Ajoute un domaine dans l'onglet Domains. Chaque domaine a sa propre API Key, Secret Key, Bearer Token, configuration de token et URL de postback.
  • 3
    Définis ton URL de postback — l'endpoint sur ton serveur qui reçoit les notifications de récompense (voir la section Postback ci-dessous).
  • 4
    Génère un Bearer Token depuis l'onglet Domains. Indispensable pour authentifier les appels à l'API PTC.
  • 5
    Envoie un postback de test depuis l'onglet Domains pour vérifier que ton endpoint répond correctement avant la mise en production.
ℹ️
Retraits : les soldes publisher ne peuvent être retirés que du 1er au 3 de chaque mois. Planifie ta trésorerie en conséquence.
📬
Intégration par Postback (S2S)

Une notification serveur à serveur envoyée à ton site web quand un utilisateur termine la vue d'une publicité, pour que tu puisses créditer les récompenses automatiquement, sans aucun code côté client.

🔐 Exigences de sécurité

⚠️
Valide toujours l'IP source et la signature avant de créditer une récompense. Ne crédite jamais sur la seule foi des paramètres.
  • IP serveur autorisées: 62.171.140.250, 2a02:c207:2329:8601::1 — vérifie ceci uniquement contre $_SERVER['REMOTE_ADDR']. Il s'agit d'un appel direct de serveur à serveur, pas d'une requête de navigateur : aucun proxy/CDN de notre part ne s'intercale ; un en-tête comme X-Forwarded-For est fourni par le client et trivialement falsifiable, ne te fie donc pas à lui pour cette vérification.
  • userIp est obligatoire, pas seulement informatif — rejette le callback s'il est absent ou si ce n'est pas une IP valide. Nous résolvons et envoyons toujours l'IP réelle du visiteur qui a terminé la publicité (via Cloudflare de notre côté) précisément pour que tu puisses t'y fier : détection de fraude, limites par IP, contrôles d'utilisateurs en double — un endpoint qui l'ignore perd complètement ce signal.
  • Réponse HTTP requise : exactement ok — en minuscules, sans espaces, sans HTML, HTTP 200
  • Algorithme de signature (recommandé) : signature_sha256 = HMAC-SHA256(subId + transId + reward, secret_key)secret_key est la clé HMAC, elle n'est pas concaténée dans le message. userIp n'en fait pas partie.
  • Algorithme de signature (ancien, toujours envoyé à chaque callback) : signature = MD5(subId + transId + reward + secret_key) — valeurs concaténées sans séparateur. Maintenu indéfiniment pour les intégrations créées avant l'existence de signature_sha256 ; rien à changer si tu vérifies déjà celle-ci.
  • Besoin de plus de 8 décimales ? Chaque callback transporte aussi reward_precise (10 décimales) avec son propre signature_sha256_precise = HMAC-SHA256(subId + transId + reward_precise, secret_key) — totalement optionnel et additif, calculé de la même façon, simplement sur la chaîne plus précise. reward/signature_sha256/signature continuent d'être envoyés exactement comme avant, que tu l'utilises ou non.
  • Prévention des doublons : vérifie toujours transId dans ta base de données avant de créditer

📋 Paramètres du postback (GET)

Ton URL de postback reçoit ces paramètres via HTTP GET.

Paramètre Type Requis Description
subIdstringREQUISID unique de l'utilisateur dans ton système — la valeur que tu as passée à l'appel du widget/API
transIdstringREQUISID de transaction unique — vérifie-le toujours pour éviter les crédits en double
rewardfloatREQUISRécompense dans ta devise de token (déjà convertie selon ton token_rate configuré), formatée à 8 décimales
reward_precisefloatOptionnelLa même récompense que reward, formatée à 10 décimales au lieu de 8 — à utiliser quand 8 décimales ne te suffisent pas
reward_namestringREQUISNom du token tel que configuré pour ton domaine (p. ex. POINTS, COINS)
reward_valuefloatREQUISIdentique à reward — inclus pour la compatibilité avec bitcotasks
offer_namestringOptionnelTitre de la publicité terminée — utile pour les journaux
offer_typestringOptionnelToujours ptc pour les vues de publicités FastCoins
payoutfloatOptionnelIdentique à reward — inclus pour la compatibilité avec des tiers
userIpstringREQUISAdresse IP réelle de l'utilisateur qui a complété l'offre, résolue via Cloudflare de notre côté avant l'envoi de ce callback — rejette le callback s'il est absent ou échoue à FILTER_VALIDATE_IP. Sers-t'en pour la détection de fraude, les limites par IP, la détection d'utilisateurs en double, l'audit des conversions et les statistiques.
statusintegerREQUIS1 = Créditer la récompense  |  2 = Rétrofacturation (déduire la récompense)
signature_sha256stringREQUISHMAC-SHA256 de subId + transId + reward, avec secret_key comme clé — recommandé pour les nouvelles intégrations
signature_sha256_precisestringOptionnelHMAC-SHA256 de subId + transId + reward_precise, avec secret_key comme clé — vérifie celle-ci au lieu de signature_sha256 seulement si tu lis aussi reward_precise
signaturestringREQUISAncien : MD5 de subId + transId + reward + secret_key concaténés (sans séparateur). Toujours envoyé à chaque callback, à l'identique — conservé pour les intégrations créées avant l'existence de signature_sha256.
testintegerOptionnel1 = postback de test depuis le tableau de bord — ne crédite pas de vraies récompenses

🧮 Exemple : construction et vérification d'une URL signée

Un exemple complet et détaillé pour que tu puisses confronter ton propre calcul de signature au nôtre avant la mise en production. La clé secrète utilisée est inventée, purement pour illustrer.

example
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
⚠️
N'utilise jamais cette clé secrète d'exemple pour quoi que ce soit de réel — elle est publique, imprimée dans cette documentation. Calcule tes signatures avec la vraie Secret Key de ton onglet Domains, et ne colle jamais cette vraie clé en public (outils de chat, docs, dépôts publics) — traite-la exactement comme un mot de passe. Cet exemple omet aussi reward_name, reward_value, offer_name, offer_type, payout et test par souci de concision — ton vrai callback les inclut tous, voir le tableau ci-dessus.

📐 Optionnel : précision à 10 décimales (reward_precise)

Même clé secrète, même callback — juste une récompense avec plus de précision décimale que ne le permettent les 8 décimales de reward. Totalement additif : passe ton chemin si 8 décimales couvrent déjà ton cas.

example-precise
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

💻 Implémentation PHP — postback.php

Enregistre ceci sur ton serveur, renseigne ta Secret Key de l'onglet Domains, puis colle l'URL complète dans le champ Postback URL de ton domaine.

postback.php
// ── 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

🕓 Vérification ancienne — MD5

💡
Tu vérifies déjà signature avec MD5 ? Il est toujours envoyé à chaque callback, parfaitement inchangé — ceci n'est là que pour référence. Aucune action requise. Les nouvelles intégrations doivent utiliser signature_sha256 ci-dessus.
postback-legacy.php
$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.

🔀 Flux du callback

  • 1
    Callback reçu
  • 2
    Vérifie REMOTE_ADDR contre la liste blanche d'IP
  • 3
    Lis les paramètres, y compris userIp
  • 4
    Valide userIp — rejette s'il est absent ou si ce n'est pas une IP valide
  • 5
    Valide les autres paramètres requis
  • 6
    Vérifie la signature
  • 7
    Vérifie status — traite comme une rétrofacturation si 2
  • 8
    Si test=1, renvoie ok sans rien créditer
  • 9
    Vérifie transId dans ta base de données pour éviter les crédits en double
  • 10
    Crédite ou annule la récompense, et stocke userIp avec la conversion
  • 11
    Renvoie ok

Réponses possibles :

  • ok — callback traité (ou validé comme callback de test)
  • ERROR: Invalid source IP
  • ERROR: Invalid user IP
  • ERROR: Missing parameters
  • ERROR: Signature mismatch
Réponse requise : renvoie HTTP 200 avec un corps exactement ok — sans espaces, sans retours à la ligne, sans HTML.
⚠️
Les postbacks en échec peuvent être renvoyés depuis l'onglet Postback Logs de ton tableau de bord. Rends toujours ton endpoint idempotent — sans risque de l'appeler plusieurs fois pour le même transId.
💡
Teste d'abord : utilise le bouton Test Postback dans l'onglet Domains pour vérifier ton endpoint avant la mise en production. Les postbacks de test incluent test=1 — ne crédite rien pour eux.
🔌
API PTC — Récupérer les publicités par programmation

Interroge les publicités PTC disponibles via une API REST et affiche-les avec ta propre interface. Aucun widget à intégrer.

🌐 Endpoint

GET https://FastCoins.com/api/[API_KEY]/[USER_ID]/[USER_IP]/[DEVICE]
SegmentDescription
API_KEYL'API Key de ton domaine — à trouver dans l'onglet Domains de ton Espace Publisher
USER_IDIdentifiant unique de l'utilisateur dans ton système. Renvoyé en tant que subId dans le postback
USER_IPAdresse IP réelle de l'utilisateur — utilisée pour le ciblage des publicités et la prévention de la fraude. Passe la vraie IP du client
DEVICEExactement desktop ou mobile — il n'existe pas de troisième valeur. Les tablettes (iPad, tablettes Android) comptent comme mobile. Le vrai appareil du visiteur est requis dès qu'un annonceur lance une campagne ciblée par appareil : comme tu appelles cette API depuis ton propre serveur, le User-Agent de ton serveur n'est pas celui du visiteur, nous ne pouvons donc pas le détecter à ta place — tu dois le détecter et le transmettre. Envoyer autre chose que desktop/mobile (y compris le littéral "tablet") est traité comme une omission — convertis toi-même en mobile. Une requête qui l'omet ou le mal orthographie renvoie HTTP 400 dans ce cas.
⚠️
Changement cassant : si ton intégration n'envoie pas encore [DEVICE], ajoute-le maintenant. C'est aujourd'hui ignoré silencieusement, mais cela renverra HTTP 400 dès que le ciblage par appareil sera actif — n'attends pas que ça casse ton flux.

🔑 Authentification — Bearer Token

⚠️
Chaque requête API exige un Bearer Token dans l'en-tête Authorization. Génères-en un par domaine depuis l'onglet Domains (bouton 🔄 à côté de "Bearer Token").
Authorization: Bearer [YOUR_BEARER_TOKEN]
ℹ️
Si un domaine n'a pas de Bearer Token configuré, l'authentification est ignorée. Configure-en toujours un en production.

💻 Exemple PHP

get-ads.php
// ── 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.';
}

📦 Format de réponse

Les réponses réussies renvoient HTTP 200 avec cette structure JSON :

{ "status": "200", "message": "success", "data": [ { "id": "123", "image": "https://FastCoins.com/banners/ad.png", "title": "Visit Our Site & Earn", "description": "Watch this ad for 30 seconds", "duration": "30", "reward": "100.0000", "currency_name": "Coins", "url": "https://FastCoins.com/view/abc123", "boosted_campaign": false, "ad_type": "Iframe" } ] }
ChampTypeDescription
idstringIdentifiant unique de la publicité
imagestringURL complète de l'image de la bannière — peut être vide
titlestringTitre à afficher — montre-le à tes utilisateurs
descriptionstringDescription courte de la publicité
durationstringTemps de visionnage requis en secondes : 2, 30 ou 60
rewardfloatMontant de la récompense dans la devise de token de ton domaine (déjà convertie)
currency_namestringNom du token tel que configuré pour ton domaine (p. ex. COINS, USDT)
urlstringRedirige l'utilisateur ici pour regarder la publicité. Le postback se déclenche automatiquement à la fin. Encode déjà le subId de l'utilisateur.
boosted_campaignbooleanIndique s'il s'agit d'une publicité mise en avant — pense à les mettre en évidence dans ton interface
ad_typestringIframe = se joue dans un cadre  |  Redirect = l'utilisateur va sur la page de l'annonceur

⚠️ Codes d'erreur

Les réponses d'erreur partagent la même structure JSON avec un champ de statut différent de 200.

HTTPstatusCause et résolution
401401Clé API invalide — vérifie le segment API_KEY dans l'URL, ou le Bearer Token est absent alors que le domaine en exige un
403403Bearer Token incorrect — régénère-le et mets-le à jour dans l'onglet Domains
400400Format USER_ID invalide — doit être alphanumérique (a-z, 0-9, _, -, .), 255 caractères maximum
400400Segment DEVICE manquant ou invalide — renvoyé seulement une fois le ciblage par appareil actif. Doit être exactement desktop ou mobile
500500Erreur interne du serveur — le champ message contient des détails de débogage. Contacte le support si cela persiste.
🔄
Flux d'intégration

Le flux complet, de l'appel API au crédit de la récompense sur ton site.

📡 Flux API + Postback

Ton site appelle
GET /api/…
L'utilisateur clique sur le url de la pub
L'utilisateur regarde la publicité sur FastCoins.com
FastCoins déclenche
GET postback.php
Valide et crédite la récompense
Renvoie ok

🧩 Widget intégré (alternative)

Si tu préfères ne pas utiliser l'API, intègre le widget en iframe — il gère tout automatiquement, avec des styles isolés du reste de ta page.

widget-embed.php
<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>
ℹ️
Remplace YOUR_API_KEY par l'API Key de ton domaine et {USER_ID} par l'ID de l'utilisateur courant (rendu côté serveur). Le widget affiche les publicités et tâches disponibles en ligne et déclenche le postback automatiquement à la fin. Ajuste les 640px dans style pour rendre l'iframe plus haut ou plus bas selon ta mise en page.
⚠️
Un seul sub_id (= {USER_ID}) par utilisateur réel — pas de découpe par suffixe. Chacun de tes utilisateurs doit être identifié par un id unique et stable. Tu choisis le format — un id opaque, un pseudonyme, un e-mail (p. ex. ABD01230A23, [email protected]) — mais un utilisateur réel correspond à exactement un id, pour toujours.

Interdit : prendre un id de base et y ajouter un suffixe numérique pour fabriquer plusieurs "utilisateurs" à partir d'une seule personne réelle. La détection est agnostique au séparateur — elle retire un -, _ ou . final suivi de chiffres et traite le reste comme l'identité de l'utilisateur. Chacun de ces couples est rejeté :
  • 123-1 & 123-2
  • ABC_1 & ABC_2
  • A23-23 & A23-24
  • order.1 & order.2
Un id continu sans séparateur est une identité unique et n'est jamais scindé (ABD01230A23, 1001, [email protected] conviennent tous).

Quand le schéma est détecté, l'API répond quand même ok mais renvoie un message expliquant que l'id n'est pas autorisé et aucune récompense n'est créditée ; la tentative est journalisée comme fraude.
Tâches (CPA) — pour les annonceurs

Crée une tâche (p. ex. "inscris-toi sur mon site"), finance N complétions et confirme chacune avec un postback signé de serveur à serveur. L'utilisateur est crédité automatiquement dès l'arrivée de ton postback — pas de validation manuelle, pas de retenue de la plateforme.

📡 Comment ça marche

Tu crées la tâche
/create-task
L'utilisateur ouvre ton URL avec cka_cid
L'utilisateur accomplit l'action
Ton serveur appelle notre postback
Utilisateur crédité instantanément

1) L'URL du postback

GET https://fastcoins.click/webhooks/task-postback.php?cka_cid={CLICK_ID}&sign={SIGN}
  • cka_cid — le click id que nous avons ajouté à ton URL de destination au départ de l'utilisateur (your-url?cka_cid=…). Renvoie-le tel quel.
  • signhash_hmac('sha256', $cka_cid, $task_secret) (hex minuscule). Le secret propre à chaque tâche est affiché dans Create Task → My Tasks.

2) Signature

// 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()
ℹ️
Seules les IP de tes serveurs en liste blanche peuvent appeler le postback (configuré par tâche). Toute autre IP reçoit 403, même avec une signature valide. Ceci plus le HMAC constitue tout le modèle d'authenticité — garde ton secret en sécurité.
⚠️
Le crédit est immédiat et définitif sur ton postback — il n'y a pas de rétrofacturation. Une complétion est créditée à l'instant où ton postback signé est vérifié, car ton postback EST la preuve que l'utilisateur a fait le travail. Assure-toi que tes propres contrôles antifraude s'exécutent avant d'appeler le postback : une fois envoyé, impossible de revenir en arrière. N'appelle-le que pour des complétions dont tu es sûr qu'elles sont authentiques.

3) Pixel analytics optionnel

Place ceci sur ta page de conversion pour tes propres statistiques. Il ne crédite jamais — le postback ci-dessus est la seule chose qui crédite.

<img src="https://fastcoins.click/task-pixel.php?cid={CLICK_ID}" width="1" height="1" alt="">
💡
Bonnes pratiques

Recommandations pour une intégration fiable, sécurisée et rentable.

⚡ Performances

  • Mets les réponses de l'API en cache pendant au moins 60 secondes par utilisateur. N'appelle pas l'API à chaque chargement de page — les publicités changent au maximum toutes les quelques minutes.
  • Transmets la vraie IP de l'utilisateur. Utilise REMOTE_ADDR par défaut — c'est la seule valeur impossible à falsifier par le visiteur. Ne lis un en-tête de proxy à la place (p. ex. CF-Connecting-IP) que si ton propre serveur est derrière un reverse proxy que tu contrôles et auquel tu fais confiance ; jamais un en-tête fourni par le client comme X-Forwarded-For. Des IP incorrectes dégradent la qualité du ciblage publicitaire.
  • Règle un timeout de 10 secondes sur tes appels cURL pour éviter des chargements de page lents si notre API est temporairement lente.

🔒 Sécurité

  • N'expose jamais ta Secret Key dans du code côté client ou des dépôts publics. Elle n'est utilisée que côté serveur, pour la validation des signatures.
  • Vérifie toujours transId dans ta base de données avant de créditer — cela évite les récompenses en double dues à des renvois accidentels de postback.
  • Valide l'IP source avant de traiter tout postback. N'accepte les requêtes que de 62.171.140.250 ou 2a02:c207:2329:8601::1.
  • Utilise HTTPS pour ton endpoint de postback. Les endpoints HTTP peuvent être bloqués.
  • Envoie un seul sub_id par utilisateur réel. N'ajoute pas de suffixes numériques à un id de base (123-1/123-2, ABC_1/ABC_2, order.1/order.2) — tout séparateur (- _ .) est détecté comme fraude et rejeté sans crédit de récompense. Voir la règle ci-dessus.

💰 Revenus

  • Les publicités boostées (boosted_campaign: true) rapportent plus — mets-les en évidence dans ton interface pour augmenter les taux de clic.
  • Les publicités longues (60 s) rapportent nettement plus que les courtes (2 s). Priorise-les quand l'engagement des utilisateurs est élevé.
  • Équilibre la part de l'utilisateur — un paiement plus élevé attire plus d'utilisateurs actifs ; un paiement plus faible augmente ta propre marge.
  • Les retraits sont ouverts du 1 au 3 de chaque mois — note-le dans ton agenda.

🐛 Débogage

  • Utilise le bouton Test Postback dans l'onglet Domains pour vérifier que ton endpoint renvoie exactement ok avec HTTP 200.
  • Consulte l'onglet Postback Logs pour voir les réponses HTTP complètes de chaque tentative de postback — il affiche les codes de statut et les réponses du serveur.
  • Les postbacks en échec peuvent être renvoyés un par un ou en masse depuis l'onglet des logs. Aucune donnée n'est jamais définitivement perdue.
  • Si la signature échoue toujours : pour signature_sha256, vérifie que secret_key est passée comme clé HMAC (et non concaténée dans le message) et que tu haches subId + transId + reward sans séparateur ; pour l'ancien signature, vérifie que tu concatènes subId + transId + reward + secret sans séparateur. Dans tous les cas, assure-toi que reward correspond exactement à la chaîne du paramètre GET (sans arrondi).
  • Si tu vérifies signature_sha256_precise : le hachage se fait sur reward_precise, pas sur reward — mélanger les deux champs avec la mauvaise signature est l'erreur la plus courante ici.

Prêt à commencer à gagner ?

Crée ton compte publisher en moins de 2 minutes, puis vérifie ton domaine pour te lancer.

Ouvrir l'Espace Publisher →
✓ Copié dans le presse-papiers