API v4.4 Painel do PublisherPainel
📡 Guia de integração para publishers

FastCoins API de Publisher
Documentação

Tudo o que você precisa para integrar anúncios PTC no seu site — notificações Postback S2S e referência completa da API.

Postback S2S PTC API Autenticação Bearer Token Exemplos em PHP Gratuito e público
Visão geral

O FastCoins é uma rede de publishers PTC (Paid-To-Click). Incorpore nossos anúncios no seu site, seus usuários ganham recompensas em tokens por visualizá-los e você recebe uma parcela da receita automaticamente.

📡
Postback (S2S)
Seu servidor recebe uma notificação via HTTP GET quando um usuário conclui um anúncio. Ideal para creditar recompensas automaticamente sem código no lado do cliente.
🔌
PTC API
Busque os anúncios disponíveis programaticamente e exiba-os com sua própria interface. Não é preciso incorporar nenhum widget.
🪙
Tokens personalizados
Configure seu próprio nome de token e taxa de conversão. As recompensas são convertidas e enviadas automaticamente via postback.
💰
Divisão de receita
Você controla o percentual pago ao usuário. O restante é a sua receita de publisher — sacável mensalmente (dias 1–3).
🚀
Primeiros passos

Crie uma conta de publisher, verifique que o domínio é seu e receba suas credenciais de API assim que ele for revisado.

  • 1
    Crie uma conta de publisher em FastCoins.com/publisher_dashboard. Você vai precisar de um nome de site e uma URL.
  • 2
    Adicione um domínio na aba Domains. Cada domínio tem a própria API Key, Secret Key, Bearer Token, configuração de token e URL de postback.
  • 3
    Defina sua URL de postback — o endpoint no seu servidor que recebe as notificações de recompensa (veja a seção de Postback abaixo).
  • 4
    Gere um Bearer Token na aba Domains. É necessário para autenticar as chamadas à API PTC.
  • 5
    Envie um postback de teste na aba Domains para verificar que seu endpoint responde corretamente antes de entrar em produção.
ℹ️
Saques: os saldos de publisher só podem ser sacados do dia 1 ao dia 3 de cada mês. Planeje seu fluxo de caixa de acordo.
📬
Integração por Postback (S2S)

Uma notificação de servidor para servidor enviada ao seu site quando um usuário termina de visualizar um anúncio, para que você possa creditar recompensas automaticamente sem código no lado do cliente.

🔐 Requisitos de segurança

⚠️
Valide sempre o IP de origem e a assinatura antes de creditar qualquer recompensa. Nunca credite com base apenas nos parâmetros.
  • IP do servidor autorizados: 62.171.140.250, 2a02:c207:2329:8601::1 — verifique isso apenas contra $_SERVER['REMOTE_ADDR']. É uma chamada direta de servidor para servidor, não uma requisição de navegador, então não há proxy/CDN nosso no meio; um header como X-Forwarded-For é fornecido pelo cliente e trivial de falsificar, então não confie nele para essa verificação.
  • userIp é obrigatório, não é apenas informativo — rejeite o callback se estiver ausente ou não for um IP válido. Sempre resolvemos e enviamos o IP real do usuário que concluiu o anúncio (via Cloudflare no nosso lado) justamente para que você possa confiar nele na detecção de fraude, limites por IP e checagens de usuários duplicados — um endpoint que o ignora perde totalmente esse sinal.
  • Resposta HTTP obrigatória: exatamente ok — em minúsculas, sem espaços, sem HTML, HTTP 200
  • Algoritmo de assinatura (recomendado): signature_sha256 = HMAC-SHA256(subId + transId + reward, secret_key)secret_key é a chave do HMAC, não é concatenada na mensagem. userIp não faz parte dela.
  • Algoritmo de assinatura (antigo, ainda enviado em todo callback): signature = MD5(subId + transId + reward + secret_key) — valores concatenados sem separadores. Mantido funcionando indefinidamente para integrações criadas antes de signature_sha256 existir; nada a mudar se você já valida essa.
  • Precisa de mais de 8 decimais? Todo callback também traz reward_precise (10 decimais) com o seu próprio signature_sha256_precise = HMAC-SHA256(subId + transId + reward_precise, secret_key) — totalmente opcional e aditivo, calculado da mesma forma, só que sobre a string de maior precisão. reward/signature_sha256/signature continuam sendo enviados exatamente como antes, quer você use isso ou não.
  • Prevenção de duplicados: verifique sempre transId no seu banco de dados antes de creditar

📋 Parâmetros do postback (GET)

Sua URL de postback recebe estes parâmetros via HTTP GET.

Parâmetro Tipo Obrigatório Descrição
subIdstringOBRIGATÓRIOID único do usuário no seu sistema — o valor que você passou na chamada do widget/API
transIdstringOBRIGATÓRIOID único da transação — verifique sempre para evitar créditos duplicados
rewardfloatOBRIGATÓRIORecompensa na sua moeda de token (já convertida usando o token_rate configurado), formatada com 8 decimais
reward_precisefloatOpcionalA mesma recompensa de reward, formatada com 10 decimais em vez de 8 — use quando 8 decimais não forem precisão suficiente para você
reward_namestringOBRIGATÓRIONome do token conforme configurado para o seu domínio (ex.: POINTS, COINS)
reward_valuefloatOBRIGATÓRIOIgual a reward — incluído para compatibilidade com bitcotasks
offer_namestringOpcionalTítulo do anúncio concluído — útil para logs
offer_typestringOpcionalSempre ptc para visualizações de anúncios do FastCoins
payoutfloatOpcionalIgual a reward — incluído para compatibilidade com terceiros
userIpstringOBRIGATÓRIOEndereço IP real do usuário que concluiu a oferta, resolvido via Cloudflare no nosso lado antes de enviarmos este callback — rejeite o callback se estiver ausente ou falhar no FILTER_VALIDATE_IP. Use para detecção de fraude, limites por IP, detecção de usuários duplicados, auditoria de conversões e analytics.
statusintegerOBRIGATÓRIO1 = Creditar recompensa  |  2 = Chargeback (deduzir recompensa)
signature_sha256stringOBRIGATÓRIOHMAC-SHA256 de subId + transId + reward, usando secret_key como chave — recomendado para novas integrações
signature_sha256_precisestringOpcionalHMAC-SHA256 de subId + transId + reward_precise, usando secret_key como chave — valide esta em vez de signature_sha256 apenas se também estiver lendo reward_precise
signaturestringOBRIGATÓRIOAntigo: MD5 de subId + transId + reward + secret_key concatenados (sem separadores). Ainda enviado em todo callback, sem alterações — mantido para integrações criadas antes de signature_sha256 existir.
testintegerOpcional1 = postback de teste do painel — não credite recompensas reais

🧮 Exemplo: construção e verificação de uma URL assinada

Um exemplo completo resolvido para você conferir o seu próprio cálculo de assinatura contra o nosso antes de entrar em produção. A chave secreta usada é inventada, apenas para ilustração.

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
⚠️
Nunca use esta chave secreta de exemplo para nada real — ela é pública, está impressa nesta documentação. Calcule suas assinaturas com a Secret Key real da sua aba Domains e nunca cole essa chave real em lugar algum público (ferramentas de chat, docs, repositórios públicos) — trate-a exatamente como uma senha. Este exemplo também omite reward_name, reward_value, offer_name, offer_type, payout e test por brevidade — seu callback real inclui todos, conforme a tabela acima.

📐 Opcional: precisão de 10 decimais (reward_precise)

Mesma chave secreta, mesmo callback — apenas uma recompensa com mais precisão decimal do que os 8 decimais de reward conseguem guardar. Totalmente aditivo: ignore se 8 decimais já atendem o seu caso.

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

💻 Implementação em PHP — postback.php

Salve isto no seu servidor, defina sua Secret Key da aba Domains e cole a URL completa no campo Postback URL do seu domínio.

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

🕓 Validação antiga — MD5

💡
Já valida signature com MD5? Ele ainda é enviado em todo callback, exatamente igual — isto está aqui apenas como referência. Nenhuma ação necessária. Integrações novas devem usar signature_sha256, acima.
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.

🔀 Fluxo do callback

  • 1
    Callback recebido
  • 2
    Confira REMOTE_ADDR contra a whitelist de IPs
  • 3
    Leia os parâmetros, incluindo userIp
  • 4
    Valide userIp — rejeite se estiver ausente ou não for um IP válido
  • 5
    Valide os demais parâmetros obrigatórios
  • 6
    Verifique a assinatura
  • 7
    Confira status — aplique como chargeback se for 2
  • 8
    Se test=1, retorne ok sem creditar nada
  • 9
    Confira transId no seu banco de dados para evitar créditos duplicados
  • 10
    Credite ou reverta a recompensa, e armazene userIp junto com a conversão
  • 11
    Retorne ok

Respostas possíveis:

  • ok — callback processado (ou validado como callback de teste)
  • ERROR: Invalid source IP
  • ERROR: Invalid user IP
  • ERROR: Missing parameters
  • ERROR: Signature mismatch
Resposta obrigatória: retorne HTTP 200 com o corpo exatamente ok — sem espaços, sem quebras de linha, sem HTML.
⚠️
Postbacks que falharam podem ser reenviados na aba Postback Logs do seu painel. Faça sempre seu endpoint idempotente — seguro de chamar várias vezes para o mesmo transId.
💡
Teste primeiro: use o botão Test Postback na aba Domains para verificar seu endpoint antes de entrar em produção. Postbacks de teste incluem test=1 — pule o crédito para eles.
🔌
API PTC — Busque anúncios programaticamente

Consulte os anúncios PTC disponíveis via API REST e renderize-os com a sua própria interface. Não é preciso incorporar nenhum widget.

🌐 Endpoint

GET https://FastCoins.com/api/[API_KEY]/[USER_ID]/[USER_IP]/[DEVICE]
SegmentoDescrição
API_KEYA API Key do seu domínio — encontrada na aba Domains do seu Painel do Publisher
USER_IDIdentificador único do usuário no seu sistema. Retornado como subId no postback
USER_IPEndereço IP real do usuário — usado para segmentação de anúncios e prevenção de fraude. Passe o IP real do cliente
DEVICEExatamente desktop ou mobile — não existe um terceiro valor. Tablets (iPad, tablets Android) contam como mobile. O dispositivo real do visitante é obrigatório assim que qualquer advertiser tiver uma campanha com segmentação por dispositivo: como você chama esta API do seu próprio servidor, o User-Agent do seu servidor não é o do visitante, então não podemos detectar por você — você deve detectar e repassar. Enviar qualquer coisa diferente de desktop/mobile (incluindo um literal "tablet") é tratado igual a omitir — converta para mobile você mesmo. Uma requisição que omita ou escreva errado retorna HTTP 400 nesse caso.
⚠️
Mudança importante: se sua integração ainda não envia [DEVICE], adicione agora. Hoje é silenciosamente ignorado, mas passa a retornar HTTP 400 assim que a segmentação por dispositivo entrar no ar — não espere isso quebrar seu feed.

🔑 Autenticação — Bearer Token

⚠️
Toda requisição à API exige um Bearer Token no header Authorization. Gere um por domínio na aba Domains (botão 🔄 ao lado de "Bearer Token").
Authorization: Bearer [YOUR_BEARER_TOKEN]
ℹ️
Se um domínio não tem Bearer Token configurado, a autenticação é pulada. Configure sempre um em ambientes de produção.

💻 Exemplo em 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.';
}

📦 Formato da resposta

Respostas bem-sucedidas retornam HTTP 200 com esta estrutura 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" } ] }
CampoTipoDescrição
idstringIdentificador único do anúncio
imagestringURL completa da imagem do banner do anúncio — pode estar vazia
titlestringTítulo de exibição — mostre isso aos seus usuários
descriptionstringDescrição curta do anúncio
durationstringTempo de visualização obrigatório em segundos: 2, 30 ou 60
rewardfloatValor da recompensa na moeda de token do seu domínio (já convertida)
currency_namestringNome do token conforme configurado para o seu domínio (ex.: COINS, USDT)
urlstringRedirecione o usuário para aqui para assistir ao anúncio. O postback dispara automaticamente na conclusão. Já codifica o subId do usuário.
boosted_campaignbooleanSe é um anúncio promovido — considere destacá-los na sua interface
ad_typestringIframe = roda dentro de um frame  |  Redirect = o usuário vai para a página do advertiser

⚠️ Códigos de erro

Respostas de erro compartilham a mesma estrutura JSON com um campo de status diferente de 200.

HTTPstatusCausa e resolução
401401API key inválida — confira o segmento API_KEY na URL, ou o Bearer Token está ausente quando o domínio exige um
403403Bearer Token incorreto — gere um novo e atualize na aba Domains
400400Formato de USER_ID inválido — deve ser alfanumérico (a-z, 0-9, _, -, .), máximo de 255 caracteres
400400Segmento DEVICE ausente ou inválido — retornado apenas quando a segmentação por dispositivo estiver no ar. Deve ser exatamente desktop ou mobile
500500Erro interno do servidor — o campo message contém detalhes de depuração. Fale com o suporte se persistir.
🔄
Fluxo de integração

O fluxo completo, da chamada de API ao crédito da recompensa no seu site.

📡 Fluxo de API + Postback

Seu site chama
GET /api/…
O usuário clica no url do anúncio
O usuário assiste ao anúncio no FastCoins.com
O FastCoins dispara
GET postback.php
Valide e credite a recompensa
Retorne ok

🧩 Widget incorporado (alternativa)

Se preferir não usar a API, incorpore o widget como um iframe — ele cuida de tudo automaticamente, com estilos isolados do resto da sua página.

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>
ℹ️
Substitua YOUR_API_KEY pela API Key do seu domínio e {USER_ID} pelo ID do usuário atual (renderizado no servidor). O widget exibe os anúncios e tarefas disponíveis inline e dispara o postback automaticamente na conclusão. Ajuste os 640px no style para deixar o iframe mais alto ou mais baixo conforme o seu layout.
⚠️
Um único sub_id (= {USER_ID}) por usuário real — sem sufixos para multiplicar. Cada um dos seus usuários deve ser identificado por um único id estável. Você escolhe o formato — um id opaco, um nome de usuário, um e-mail (ex.: ABD01230A23, [email protected]) — mas um usuário real corresponde a exatamente um id, para sempre.

Não permitido: pegar um id base e acrescentar um sufixo numérico para fabricar vários "usuários" a partir de uma pessoa real. A detecção é agnóstica ao separador — ela remove um -, _ ou . final seguido de dígitos e trata o restante como a identidade do usuário. Qualquer um destes pares é rejeitado:
  • 123-1 & 123-2
  • ABC_1 & ABC_2
  • A23-23 & A23-24
  • order.1 & order.2
Um id contínuo sem separador é uma identidade única e nunca é dividido (ABD01230A23, 1001, [email protected] são todos válidos).

Quando o padrão é detectado, a API ainda responde ok, mas retorna uma mensagem explicando que o id não é permitido e nenhuma recompensa é creditada; a tentativa é registrada como fraude.
Tarefas (CPA) — para advertisers

Crie uma tarefa (ex.: "cadastre-se no meu site"), financie N conclusões e confirme cada uma com um postback assinado de servidor para servidor. O usuário é creditado automaticamente no momento em que seu postback chega — sem aprovação manual, sem retenção da plataforma.

📡 Como funciona

Você cria a tarefa
/create-task
O usuário abre sua URL com cka_cid
O usuário conclui a ação
Seu servidor chama o nosso postback
Usuário creditado instantaneamente

1) A URL do postback

GET https://fastcoins.click/webhooks/task-postback.php?cka_cid={CLICK_ID}&sign={SIGN}
  • cka_cid — o click id que anexamos à sua URL de destino quando o usuário começou (your-url?cka_cid=…). Devolva-o sem alterações.
  • signhash_hmac('sha256', $cka_cid, $task_secret) (hex em minúsculas). O segredo de cada tarefa é exibido em Create Task → My Tasks.

2) Assinatura

// 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()
ℹ️
Somente os IPs do seu servidor na whitelist podem chamar o postback (configurado por tarefa). Qualquer outro IP recebe 403 mesmo com assinatura válida. Isso mais o HMAC é todo o modelo de autenticidade — mantenha seu segredo seguro.
⚠️
O crédito é imediato e definitivo no seu postback — não há chargeback. Uma conclusão é creditada no instante em que seu postback assinado é verificado, porque o seu postback É a prova de que o usuário fez o trabalho. Garanta que suas próprias verificações antifraude rodem antes de chamar o postback: depois de enviado, não dá para reverter. Chame-o apenas para conclusões em que você tem certeza de que são genuínas.

3) Pixel de analytics opcional

Coloque isto na sua página de conversão para o seu próprio analytics. Ele nunca credita — o postback acima é a única coisa que credita.

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

Recomendações para uma integração confiável, segura e de alta receita.

⚡ Desempenho

  • Coloque as respostas da API em cache por pelo menos 60 segundos por usuário. Não chame a API a cada carregamento de página — os anúncios mudam no máximo a cada poucos minutos.
  • Passe o IP real do usuário. Use REMOTE_ADDR por padrão — é o único valor que o visitante não consegue falsificar. Leia um header de proxy no lugar (ex.: CF-Connecting-IP) apenas se o seu próprio servidor estiver atrás de um reverse proxy que você controla e confia; nunca um header fornecido pelo cliente como X-Forwarded-For. IPs incorretos reduzem a qualidade da segmentação de anúncios.
  • Defina um timeout de 10 segundos nas suas chamadas cURL para evitar carregamentos lentos de página se a nossa API estiver temporariamente lenta.

🔒 Segurança

  • Nunca exponha sua Secret Key em código do lado do cliente nem em repositórios públicos. Ela é usada apenas no servidor para validação de assinaturas.
  • Sempre confira transId no seu banco de dados antes de creditar — isso evita recompensas duplicadas por reenvios acidentais de postback.
  • Valide o IP de origem antes de processar qualquer postback. Aceite requisições apenas de 62.171.140.250 ou 2a02:c207:2329:8601::1.
  • Use HTTPS no seu endpoint de postback. Endpoints HTTP podem ser bloqueados.
  • Envie um único sub_id por usuário real. Não acrescente sufixos numéricos a um id base (123-1/123-2, ABC_1/ABC_2, order.1/order.2) — qualquer separador (- _ .) é detectado como fraude e rejeitado sem creditar recompensa. Veja a regra acima.

💰 Receita

  • Anúncios impulsionados (boosted_campaign: true) pagam mais — destaque-os na sua interface para aumentar as taxas de clique.
  • Anúncios mais longos (60s) pagam significativamente mais que os curtos (2s). Priorize-os quando o engajamento dos usuários estiver alto.
  • Equilibre a parcela do usuário — um pagamento maior atrai mais usuários ativos; um pagamento menor aumenta a sua própria margem.
  • Os saques estão abertos do dia 1 ao 3 de cada mês — marque no seu calendário.

🐛 Depuração

  • Use o botão Test Postback na aba Domains para verificar que seu endpoint retorna exatamente ok com HTTP 200.
  • Confira a aba Postback Logs para ver as respostas HTTP completas de cada tentativa de postback — ela mostra códigos de status e respostas do servidor.
  • Postbacks que falharam podem ser reenviados individualmente ou em lote na aba de logs. Nenhum dado é perdido permanentemente.
  • Se a assinatura sempre falha: para signature_sha256, verifique que secret_key é passada como a chave do HMAC (não concatenada na mensagem) e que você faz o hash de subId + transId + reward sem separadores; para o signature antigo, verifique que você concatena subId + transId + reward + secret sem separadores. De qualquer forma, garanta que reward corresponde à string exata do parâmetro GET (sem arredondar).
  • Se você valida signature_sha256_precise: o hash é feito sobre reward_precise, não sobre reward — misturar os dois campos com a assinatura errada é o erro mais comum aqui.

Pronto para começar a ganhar?

Crie sua conta de publisher em menos de 2 minutos e verifique seu domínio para começar.

Abrir o Painel do Publisher →
✓ Copiado para a área de transferência