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.
Crie uma conta de publisher, verifique que o domínio é seu e receba suas credenciais de API assim que ele for revisado.
-
1Crie uma conta de publisher em FastCoins.com/publisher_dashboard. Você vai precisar de um nome de site e uma URL.
-
2Adicione 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.
-
3Defina sua URL de postback — o endpoint no seu servidor que recebe as notificações de recompensa (veja a seção de Postback abaixo).
-
4Gere um Bearer Token na aba Domains. É necessário para autenticar as chamadas à API PTC.
-
5Envie um postback de teste na aba Domains para verificar que seu endpoint responde corretamente antes de entrar em produção.
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
- 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 comoX-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.userIpnã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 designature_sha256existir; 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ópriosignature_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/signaturecontinuam sendo enviados exatamente como antes, quer você use isso ou não. - Prevenção de duplicados: verifique sempre
transIdno 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 |
|---|---|---|---|
| subId | string | OBRIGATÓRIO | ID único do usuário no seu sistema — o valor que você passou na chamada do widget/API |
| transId | string | OBRIGATÓRIO | ID único da transação — verifique sempre para evitar créditos duplicados |
| reward | float | OBRIGATÓRIO | Recompensa na sua moeda de token (já convertida usando o token_rate configurado), formatada com 8 decimais |
| reward_precise | float | Opcional | A 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_name | string | OBRIGATÓRIO | Nome do token conforme configurado para o seu domínio (ex.: POINTS, COINS) |
| reward_value | float | OBRIGATÓRIO | Igual a reward — incluído para compatibilidade com bitcotasks |
| offer_name | string | Opcional | Título do anúncio concluído — útil para logs |
| offer_type | string | Opcional | Sempre ptc para visualizações de anúncios do FastCoins |
| payout | float | Opcional | Igual a reward — incluído para compatibilidade com terceiros |
| userIp | string | OBRIGATÓRIO | Endereç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. |
| status | integer | OBRIGATÓRIO | 1 = Creditar recompensa | 2 = Chargeback (deduzir recompensa) |
| signature_sha256 | string | OBRIGATÓRIO | HMAC-SHA256 de subId + transId + reward, usando secret_key como chave — recomendado para novas integrações |
| signature_sha256_precise | string | Opcional | HMAC-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 |
| signature | string | OBRIGATÓRIO | Antigo: 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. |
| test | integer | Opcional | 1 = 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.
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 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.
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.
// ── 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
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.$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
- 1Callback recebido
- 2Confira
REMOTE_ADDRcontra a whitelist de IPs - 3Leia os parâmetros, incluindo
userIp - 4Valide
userIp— rejeite se estiver ausente ou não for um IP válido - 5Valide os demais parâmetros obrigatórios
- 6Verifique a assinatura
- 7Confira
status— aplique como chargeback se for2 - 8Se
test=1, retorneoksem creditar nada - 9Confira
transIdno seu banco de dados para evitar créditos duplicados - 10Credite ou reverta a recompensa, e armazene
userIpjunto com a conversão - 11Retorne
ok
Respostas possíveis:
ok— callback processado (ou validado como callback de teste)ERROR: Invalid source IPERROR: Invalid user IPERROR: Missing parametersERROR: Signature mismatch
ok — sem espaços, sem quebras de linha, sem HTML.transId.test=1 — pule o crédito para eles.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
| Segmento | Descrição |
|---|---|
| API_KEY | A API Key do seu domínio — encontrada na aba Domains do seu Painel do Publisher |
| USER_ID | Identificador único do usuário no seu sistema. Retornado como subId no postback |
| USER_IP | Endereço IP real do usuário — usado para segmentação de anúncios e prevenção de fraude. Passe o IP real do cliente |
| DEVICE | Exatamente 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. |
[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
Authorization. Gere um por domínio na aba Domains (botão 🔄 ao lado de "Bearer Token").💻 Exemplo em 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:
| Campo | Tipo | Descrição |
|---|---|---|
| id | string | Identificador único do anúncio |
| image | string | URL completa da imagem do banner do anúncio — pode estar vazia |
| title | string | Título de exibição — mostre isso aos seus usuários |
| description | string | Descrição curta do anúncio |
| duration | string | Tempo de visualização obrigatório em segundos: 2, 30 ou 60 |
| reward | float | Valor da recompensa na moeda de token do seu domínio (já convertida) |
| currency_name | string | Nome do token conforme configurado para o seu domínio (ex.: COINS, USDT) |
| url | string | Redirecione 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_campaign | boolean | Se é um anúncio promovido — considere destacá-los na sua interface |
| ad_type | string | Iframe = 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.
| HTTP | status | Causa e resolução |
|---|---|---|
| 401 | 401 | API key inválida — confira o segmento API_KEY na URL, ou o Bearer Token está ausente quando o domínio exige um |
| 403 | 403 | Bearer Token incorreto — gere um novo e atualize na aba Domains |
| 400 | 400 | Formato de USER_ID inválido — deve ser alfanumérico (a-z, 0-9, _, -, .), máximo de 255 caracteres |
| 400 | 400 | Segmento DEVICE ausente ou inválido — retornado apenas quando a segmentação por dispositivo estiver no ar. Deve ser exatamente desktop ou mobile |
| 500 | 500 | Erro interno do servidor — o campo message contém detalhes de depuração. Fale com o suporte se persistir. |
O fluxo completo, da chamada de API ao crédito da recompensa no seu site.
📡 Fluxo de API + Postback
GET /api/…url do anúncioGET postback.phpok🧩 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.
<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 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.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-2ABC_1&ABC_2A23-23&A23-24order.1&order.2
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. 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
/create-taskcka_cid1) 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.sign—hash_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()403 mesmo com assinatura válida. Isso mais o HMAC é todo o modelo de autenticidade — mantenha seu segredo seguro.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="">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_ADDRpor 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 comoX-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
transIdno 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.250ou2a02:c207:2329:8601::1. - Use HTTPS no seu endpoint de postback. Endpoints HTTP podem ser bloqueados.
- Envie um único
sub_idpor 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
okcom 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 quesecret_keyé passada como a chave do HMAC (não concatenada na mensagem) e que você faz o hash desubId + transId + rewardsem separadores; para osignatureantigo, verifique que você concatenasubId + transId + reward + secretsem separadores. De qualquer forma, garanta querewardcorresponde à string exata do parâmetro GET (sem arredondar). - Se você valida
signature_sha256_precise: o hash é feito sobrereward_precise, não sobrereward— 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 →