Regras de publicidade (abre em uma nova aba)
/ DESENVOLVEDORES
Painel

PIXORA ADS / DOCUMENTAÇÃO PARA DESENVOLVEDORES

Pixora Ads SDK e API para desenvolvedores

Monetização do editor e rastreamento de campanhas do site: guias práticos, código funcional e solução de problemas em um só lugar.

PIXORA ADS / FLUXO DE DADOS01 — 06
  1. 01Sua plataforma
  2. 02Seu back-end
  3. 03Pixora Ads API
  4. 04Oferta nativa
  5. 05Ação verificada
  6. 06Receita do editor

Sua chave permanece em seu servidor. Pixora Ads verifica a ação concluída antes que a receita do editor seja registrada.

01 / COMEÇANDO

Como funciona a monetização

#

Selecione formatos ao registrar sua propriedade para moderação. Imagens e vídeos são tipos criativos; nativo, intersticial e recompensado são cenários de entrega. Não existe um método showVideo() separado: o servidor seleciona um criativo correspondente.

MétodoOnde o anúncio apareceRecompensa do espectador
showNative()Placa de imagem/vídeo em seu contêinerNenhum
showInterstitial()Sobreponha dentro do seu Mini App; imediatamente dispensávelNenhum
showRewarded()Sobreposição após aceitação explícita do usuárioApós visualização verificada; bônus internos exigem seu back-end

Mini App a publicidade fica dentro da interface do parceiro. A navegação do anunciante é opcional; descartar o anúncio retorna à sua tela. Os bots usam anúncios de conversação pagos por clique; canais usam postagens com CPM ou CPC. O CTA leva ao anunciante. Este JavaScript SDK é para Mini Apps, não para mensagens.

A receita do editor e os bônus dos espectadores são separados. Use nativo ou intersticial para monetizar sem recompensas. As impressões comuns exigem pelo menos 50% de visibilidade criativa por um segundo contínuo em uma janela ativa e reprodução real do vídeo. O servidor verifica a elegibilidade, limites e orçamento antes de confirmar a entrega.

Para novas integrações use SDK 1.8.4: init() e um método show explícito. O legado create()/mount() permanece compatível.

02 / COMEÇANDO

Início rápido

#
  1. Abra Monetização → Propriedades → Conecte uma propriedade e escolha Mini App, bot ou canal público.
  2. Forneça um nome, Telegram URL e uma descrição do tópico e do público. Para Mini Apps use o link do bot ou um link direto t.me/bot/appname. Selecione nativo, intersticial e/ou premiado antes da moderação. Descreva o posicionamento do anúncio na descrição; não há campo separado.
  3. Verifique o controle: token de bot para bots/Mini Apps; permissões de administrador para canais. O token verifica o controle do bot; um moderador analisa o posicionamento.
  4. Para Mini Apps e bots, crie uma chave API após aprovação e mantenha-a no servidor. A postagem automática no canal não precisa de servidor separado ou chave API: salve as configurações de postagem e verifique as permissões do bot.
  5. Execute o teste abaixo, conecte seu backend e SDK ou prepare um anúncio no painel. Os anúncios ao vivo exigem uma propriedade ativa e uma demanda correspondente; a conexão não garante preenchimento de anúncios ou receita.
03 / COMEÇANDO

Veja um exemplo funcional

#

A demonstração @pixorAds_networkbot mostra a jornada completa do usuário: abrindo um Mini App, solicitando um anúncio através de um servidor e mostrando o formato escolhido dentro do Mini App. Você pode tentar antes de conectar sua própria propriedade.

  1. Abra o bot e inicie seu Mini App. O back-end de demonstração verifica a sessão Telegram por meio de /api/v1/ad-network/demo/session.
  2. O SDK chama /api/v1/ad-network/demo/offer na mesma origem. A chave secreta do editor permanece no servidor.
  3. Se não houver oferta paga correspondente, o aplicativo de demonstração mostrará um vídeo introdutório. Este é o próprio estado vazio do editor, não uma visualização de anúncio: ele não gera cobrança, recompensa ou receita do editor.
Demonstração: montagem SDK após verificação Telegram
// Demo only: run after loading pixorads-publisher.v1.8.4.js inside Telegram.const session = await fetch("/api/v1/ad-network/demo/session", {  method: "POST",  credentials: "same-origin",  headers: { "Content-Type": "application/json" },  body: JSON.stringify({ init_data: window.Telegram.WebApp.initData })});if (!session.ok) throw new Error("Telegram session could not be verified");const { csrf_token, publisher_id } = await session.json();const placement = window.PixorAdsPublisher.init({  element: document.getElementById("pixorads"),  endpoint: "/api/v1/ad-network/demo/offer",  csrfToken: csrf_token,  publisherId: publisher_id,  language: "pt"});await placement.showNative();
04 / INTEGRAÇÃO

Mini App · JavaScript / React

#

Carregue o script uma vez em HTML. Defina o endpoint para seu próprio back-end na mesma origem. Nunca exponha a chave API ao navegador. Antes de init(), envie Telegram.WebApp.initData para seu backend: verifique sua assinatura e idade, crie uma sessão e, para autenticação de cookie, retorne um token CSRF para a opção csrfToken. Copie o publisherId público do cartão de propriedade. Os exemplos abaixo são anúncios nativos sem recompensas; consulte Mostrar métodos para outros cenários. Passe o token CSRF da sessão como um suporte React e destroy() na desmontagem.

HTML
<!-- Render this page AFTER your backend verifies the Telegram session. --><!-- Your backend inserts its session CSRF token into this meta tag. --><meta name="csrf-token" content="YOUR_SESSION_CSRF_TOKEN"><script src="https://pixora-ads.com/sdk/pixorads-publisher.v1.8.4.js"></script><div id="pixorads"></div><script type="module">  const placement = window.PixorAdsPublisher.init({    element: document.getElementById("pixorads"),    endpoint: "/api/pixorads/offer",    csrfToken: document.querySelector('meta[name="csrf-token"]').content,    publisherId: "YOUR_PUBLIC_MINIAPP_PUBLISHER_ID",    trackAudience: false,    personalized: false,    language: "en"  });  const state = await placement.showNative();  if (state.status === "error") console.warn(state.code);  // empty: no ad available. Continue the app; do not retry in a loop.  // On screen removal: placement.destroy();</script>
05 / INTEGRAÇÃO

Mostrar métodos

#
MétodoOnde o anúncio apareceRecompensa do espectador
showNative()Placa de imagem/vídeo em seu contêinerNenhum
showInterstitial()Sobreponha dentro do seu Mini App; imediatamente dispensávelNenhum
showRewarded()Sobreposição após aceitação explícita do usuárioApós visualização verificada; bônus internos exigem seu back-end

Escolha um exemplo abaixo. Carregue o SDK e faça com que seu back-end verifique a sessão Telegram primeiro. Substitua publisherId pelo seu ID de propriedade pública. csrfTokenFromYourSession é o token CSRF da sua sessão, não uma chave API. /api/pixorads/offer é uma rota que você implementa em seu backend.

native
// Prerequisites: SDK loaded, your session verified, <div id="ad-slot"></div>.const ads = window.PixorAdsPublisher.init({  publisherId: "YOUR_PUBLIC_MINIAPP_PUBLISHER_ID",  endpoint: "/api/pixorads/offer",  csrfToken: csrfTokenFromYourSession,  element: document.getElementById("ad-slot"),  language: "en",  trackAudience: false, // Enable explicitly if you measure app activity.  personalized: false});const state = await ads.showNative();if (state.status === "empty") {  // No matching ad. Continue your app normally; try later.} else if (state.status === "error") {  console.warn("Ad unavailable:", state.code);}// ready means rendered, NOT a paid impression.// Keep ads alive while the card is visible.// When removing this screen: ads.destroy();

Resultados do método

LigarResultado
init(options)Cria um controlador sem exibir um anúncio. Opções inválidas são lançadas de forma síncrona. Ativa trackAudience por padrão.
showNative()Promessa<PublisherState>: pronto, vazio ou erro com código. pronto significa renderizado, não faturado.
showInterstitial() / showRewarded()Promessa resolve demissão. Erros e rejeição no_fill - use try/catch. Devoluções de desligamento antecipado concluídas:falso.
getState()Último evento SDK; não situação financeira ou equilíbrio.
trackVisit()Prometo<{recorded:boolean}>. Dados ausentes de publisherId/assinado Telegram, modo de teste ou falha de rede retornam registrados:falso.
destroy()Cancela solicitações, remove o cartão/sobreposição e ouvintes. Crie um novo controlador para uma nova tela.
EditorShowResult
{  shown: true,              // Viewer handshake completed; NOT proof of payment  completed: false,         // true only for completed rewarded viewing  impression_confirmed: true // Ordinary viewer confirmation, when available  // receipt, session_id: present when supplied by the viewer  // test:true => {shown:false, completed:false, test:true}; no overlay or payout}

Apenas um visualizador de anúncios pode ser aberto por vez. Não execute showNative() e um método de tela inteira simultaneamente em um controlador. Continue seu aplicativo em no_fill; nunca substitua uma recompensa prometida por um anúncio comum. Destrua o controlador quando sua tela for removida, não imediatamente após renderizar uma carta.

06 / INTEGRAÇÃO

Recompensas e verificação

#

Nativo e intersticial não precisam de integração de recompensa. No modo recompensado Pixora Ads verifica a visualização; seu back-end concede moedas, vidas ou outros bônus adicionais dentro do seu aplicativo.

  1. Leia o recibo opaco de showRewarded() após a demissão. É uma prova a ser verificada, não um valor de recompensa.
  2. Envie-o para seu back-end autenticado. Verifique-o usando a chave desta propriedade e combine telegram_id com seu próprio usuário de sessão.
  3. Em uma transação, salve o recibo_id exclusivo e conceda o bônus configurado pelo servidor. Solicitações repetidas devem retornar o resultado existente sem conceder duas vezes.
recompensar/verificar · apenas seu back-end
// Inside YOUR authenticated, CSRF-protected reward route.// req.user.telegramId must come from a verified session, never the request body.const response = await fetch("https://pixora-ads.com/api/v1/ad-network/publisher-api/reward/verify", {  method: "POST",  headers: {"Content-Type": "application/json", "X-PixorAds-Key": process.env.PIXORADS_PUBLISHER_KEY},  body: JSON.stringify({receipt: req.body.receipt}),  signal: AbortSignal.timeout(8000)});if (!response.ok) throw new Error("Reward not verified");const proof = await response.json();if (!proof.rewarded || String(proof.telegram_id) !== String(req.user.telegramId)) {  throw new Error("Wrong viewer");}// YOUR database transaction (required; not implemented by this snippet):// 1. Insert (receipt_id, your_user_id) into a ledger with UNIQUE(receipt_id).// 2. On a new row, grant YOUR server-configured internal bonus.// 3. On duplicate, return the existing result for the same user.// Commit both operations together, then return 2xx to the browser.// Never take a reward amount from req.body or credit proof.reward as app coins.

Resposta: recompensado, recibo_id, sessão_id, editor_id, telegrama_id, operação_id, recompensa, moeda, concluído_at. Os recibos duram sete dias e são vinculados à propriedade. A verificação não transfere dinheiro. Se o seu back-end não estiver disponível, tente novamente o mesmo recebimento em vez de exigir outra visualização do anúncio.

Quando usar onReward

onReward({receipt, session_id}) é acionado após a conclusão, enquanto o visualizador pode permanecer aberto. É uma alternativa ao processamento do recibo após a demissão. O SDK não aguarda nem tenta novamente seu retorno de chamada assíncrono: implemente erros e tente novamente. Se você usar os dois caminhos, a desduplicação do servidor por recibo_id será essencial. Notificações onEvent e cliques de CTA nunca autorizam um bônus.

API valores são unidades inteiras menores: XTR / 1000 = Estrelas; RUB / 1000 = rublos; USD / 1.000.000 = dólares. recompensa:70 com moeda:XTR significa 0,07 estrelas. Em uma oferta, viewer_reward/viewer_currency descreve a recompensa do visualizador; recompensa e publisher_amount usam a moeda da campanha. publisher_income estima USD ganhos, fixados na confirmação. Nenhum deles define o número de moedas em seu aplicativo.

07 / INTEGRAÇÃO

Back-end e chave API

#

Seu back-end autentica o usuário, limita as solicitações e solicita um anúncio de Pixora Ads. Encaminhe a resposta JSON para o widget. Reutilize uma Chave de Idempotência para novas tentativas da mesma solicitação lógica; use uma nova chave para uma nova oferta.

Solicitação do servidor
curl https://pixora-ads.com/api/v1/ad-network/publisher-api/offer \  -H "X-PixorAds-Key: $PIXORADS_PUBLISHER_KEY" \  -H "Idempotency-Key: unique-logical-request-id" \  -H "Content-Type: application/json" \  -d '{"language":"en","format":"native"}'
Node.js/Expresso
// Node.js 22+ / Express. Keep this code on YOUR SERVER.// app, requireYourSession, verifyYourCsrf and yourRateLimit// belong to your app. Implement them before exposing the route.import { randomUUID } from "node:crypto";app.post("/api/pixorads/offer", requireYourSession,  verifyYourCsrf, yourRateLimit, async (req, res) => {    res.set("Cache-Control", "no-store");    const language = req.body?.language ?? "en";    const context_token = req.body?.context_token ?? "";    const excluded_campaigns = req.body?.excluded_campaigns ?? [];    const excluded_frequency_groups = req.body?.excluded_frequency_groups ?? [];    // Legacy create().mount() omits format; preserve the API's auto default.    const format = req.body?.format ?? "auto";    if (!["ru", "en"].includes(language)) return res.status(400).json({error:{code:"invalid_language"}});    if (typeof context_token !== "string" || context_token.length > 2048) return res.status(400).json({error:{code:"invalid_viewer_context"}});    if (!["auto", "native", "interstitial", "rewarded"].includes(format)) return res.status(400).json({error:{code:"invalid_format"}});    const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;    if (![excluded_campaigns, excluded_frequency_groups].every(ids => Array.isArray(ids) && ids.length <= 100 && ids.every(id => typeof id === "string" && uuid.test(id)))) return res.status(400).json({error:{code:"invalid_exclusions"}});    // Reuse this ID only when retrying the SAME body upstream. SDK fallback    // attempts carry distinct keys and narrowing-only frequency hints.    const requestId = req.get("Idempotency-Key") || randomUUID();    if (!/^[A-Za-z0-9:_-]{1,80}$/.test(requestId)) return res.status(400).json({error:{code:"invalid_idempotency_key"}});    try {      const response = await fetch(        "https://pixora-ads.com/api/v1/ad-network/publisher-api/offer",        {          method: "POST",          headers: {            "Content-Type": "application/json",            "X-PixorAds-Key": process.env.PIXORADS_PUBLISHER_KEY,            "Idempotency-Key": requestId          },          body: JSON.stringify({ language, context_token, format, excluded_campaigns, excluded_frequency_groups }),          signal: AbortSignal.timeout(8000)        }      );      const retryAfter = response.headers.get("Retry-After");      if (retryAfter) res.set("Retry-After", retryAfter);      const payload = await response.json();      // Preserve structured error.code so the SDK can show useful diagnostics.      res.status(response.status).json(payload);    } catch {      res.status(503).json({ error: { code: "upstream_unavailable" } });    }  });

Girar ou revogar uma chave desativa ela e seus links de posicionamento. Atualize sua variável de ambiente e crie novas veiculações. As sessões iniciadas mantêm seus termos, mas as novas ações do visualizador verificam o status atual e a versão da chave.

08 / INTEGRAÇÃO

Bots · anúncios de conversa

#

O principal formato do bot é um anúncio após uma resposta útil, pago por visita confirmada. Os tokens BotFather permanecem no servidor proprietário; os espectadores não precisam de registro separado.

Guia, SDK e entrega de teste gratuita

Configure a entrega, aprove criativos e visualize taxas e ganhos no cartão de propriedade do bot em Anúncios de conversa. A visualização premiada continua sendo um formato opcional com integração própria.

09 / INTEGRAÇÃO

Canais · CPM e CPC

#

Adicione um canal público com sua conta e o bot Pixora Ads como administradores. Após a moderação, verifique as permissões de postagem e exclusão. Escolha visualizações (CPM, padrão) ou cliques confirmados (CPC) nas configurações do canal. Defina ganhos mínimos e limite de resultados por postagem. Publicação e aprovação automáticas estão disponíveis para ambos.

CPM paga Telegram contra-visualizações nas primeiras 24 horas, incluindo encaminhamentos; este não é um alcance ou conclusão único. CPC paga navegação confirmada em página curta sem cadastro. Visualizações, pré-visualizações e repetições para o mesmo anunciante em canais dentro de 24 horas são gratuitas. Uma impressão digital de IP e de agente de usuário não é prova de uma pessoa única. Os leitores não recebem recompensa.

A liquidação segue a colocação de 24 horas e, em seguida, a suspensão da campanha. O histórico de postagens mostra ganhos, visualizações pagas ou cliques e datas de lançamento. Os preços e ações do canal são independentes de Mini Apps; as taxas atuais aparecem nos ganhos imobiliários.

10 / INTEGRAÇÃO

Offerwall · tarefas e recompensas

#

Vitrine de demonstração · SDK 1.3.3

Experimente 10 tipos de tarefas sem registrar uma propriedade. O DemoClient separado retorna um catálogo de amostra e simula a verificação na memória do navegador. Nunca liga para o API financeiro, emite recibos ou confirma recompensas reais. Isso demonstra a IU, não a integração de back-end.

Abra a vitrine de demonstração →
JavaScript · DemoCliente
// Load /sdk/pixorads-offerwall.v1.3.3.js first.const demo = new PixorAdsOfferwall.DemoClient();const { items } = await demo.catalog();const attempt = await demo.start(items[0].id, "demo-1");await demo.check(attempt.id); // demo_completed; paid=false; no receiptdemo.reset();

Offerwall 1.3 · Conexão, sandbox não financeira, bônus e diagnósticos em um único painel.

Abertura de tarefas e relatórios · SDK 1.3

Após iniciar, chame client.open(attemptId) e abra sua url. Esta reação de armas/observação de pesquisa ou cria um link de site protegido. Não use o URL bruto do anunciante. Os bots podem abrir hospedado_url para continuar a mesma tentativa na interface hospedada.

Relatórios: client.report(id), submitReport(id, {version, body, images, draft}, chave); as respostas do produto usam {version, answers}. Carregue até 3 capturas de tela com uploadReportImage(id, base64). Apelação com apelação(id, {version, reason}, chave). Reutilize a mesma chave para novas tentativas. report_updated informa o status e o prazo, nunca recompensa a elegibilidade. Conceda somente após verificação de back-end de reward_eligible.

Um catálogo de tarefas: uma tela hospedada, componente Mini App e API para sua própria interface ou bot Telegram. Assinaturas de canais públicos e participações em grupos são suportadas. Pixora Ads deve ser administrador do chat de destino. Os primeiros lançamentos de bot e ações Mini App confirmadas pelo anunciante também são suportados após um teste de integração. São suportadas reações de grupos públicos, enquetes Pixora Ads não anônimas, novos aumentos de Premium, visitas a sites, navegação e tarefas de relatórios, incluindo pesquisa de produtos. A disponibilidade do site depende das configurações do serviço. Formatos de compra dedicados e tarefas de várias etapas não são suportados.

1. Prepare seu imóvel

Adicione e verifique uma propriedade em Minhas propriedades e conclua a moderação. Em Tarefas e recompensas escolha o modo de recompensa, configure retornos de chamada e habilite tarefas. Somente campanhas cujos anunciantes ativaram explicitamente a distribuição por parceiros são qualificadas.

Escolha os tipos de tarefas

Selecione Tipos de tarefas nas configurações Offerwall: por exemplo, assinaturas, ações Mini App ou tarefas de relatório. Todos os 10 tipos suportados são selecionados por padrão. Limpar todos os tipos impede que novas tarefas sejam oferecidas. A disponibilidade real também depende das campanhas, das configurações do serviço e do usuário.

O servidor aplica sua seleção a cada integração: tela hospedada, SDK, componente e bot API. A próxima atualização do catálogo reflete as configurações sem alterações de integração. As tarefas iniciadas permanecem em Meu progresso: os usuários podem concluí-las, verificá-las e receber a recompensa acordada mesmo que esse tipo não seja mais aceito.

client.catalog() retorna a seleção de options.task_types do servidor, itens disponíveis e histórico de tarefas iniciadas. As respostas anteriores podem omitir o campo. Nunca filtre o histórico por options.task_types ou passe uma lista personalizada para o Cliente, conecte ou inicie: somente o proprietário do imóvel altera essas configurações no dashboard.

  • Pixora Ads recompensa: um usuário cadastrado ganha dinheiro; a propriedade ganha uma parte da taxa de plataforma. Participação inicial: 50% da taxa.
  • Recompensa de propriedade: você concede moedas ou acesso; sua propriedade ganha uma parte do preço resultante. Participação inicial: 80%. Seu servidor oferece recompensas internas.

Os compartilhamentos são configuráveis e congelados quando uma tarefa é iniciada. Os rendimentos de propriedade são registados em USD a uma taxa de câmbio congelada e mantidos após verificação final (24 horas por defeito). A retenção de associados é mostrada separadamente. Uma ação confirmada não significa que a renda possa ser retirada imediatamente.

As recompensas por indicação de tarefas são financiadas pela parcela da plataforma restante após a divisão do editor. Eles não reduzem a recompensa acordada do usuário ou a renda de propriedade.

2. Escolha uma integração

Antes de habilitar tarefas, abra Monetização → Offerwall → Conexão. Salve as configurações, crie uma tarefa de exemplo e conclua-a. Seu evento possui test=true, user_id=null e zero rendimento monetário. Nunca dê crédito a um usuário real por isso. Repita o teste após alterar as configurações.

Com webhooks, o teste é enviado para a URL salva com a assinatura HMAC usual. Caso contrário, busque GET /publisher-api/tests. Seu servidor reconhece isso por meio de POST /publisher-api/tests/{conversion_id}/ack com X-PixorAds-Key. O HTTP 2xx por si só não confirma uma recompensa. Os eventos de teste permanecem disponíveis por 24 horas.

Tela hospedada: copie o link Telegram das configurações do offerwall. Funciona em Mini Apps, bots e postagens de canal. A atribuição da fonte é preservada e não cria um relacionamento de referência.

HTML
<script src="https://pixora-ads.com/sdk/pixorads-offerwall.v1.3.3.js"></script><pixorads-task publisher-id="YOUR_PUBLISHER_UUID" theme="light"></pixorads-task>

O componente é executado dentro de um Telegram Mini App usando initData assinado para o bot verificado na propriedade. Nunca exponha uma chave API no navegador. Tema: claro/escuro; altura: variável CSS --pixorads-offerwall-height.

JavaScript
const client = new PixorAdsOfferwall.Client({ publisherId: "YOUR_PUBLISHER_UUID", telegramInitData: Telegram.WebApp.initData });// Show terms and obtain consent before connect().const { items, history, options } = await client.connect({ accepted: true });// items already honor the publisher's task_types on the server.// Show an empty state when items is empty; always render history separately.// Call only when the user chooses a task from items.async function startSelectedTask(campaignId, retryKey) {  const task = await client.start(campaignId, retryKey);  const destination = await client.open(task.id);  return { task, url: destination.url };}// Open the returned protected URL; offer a separate Check button.async function checkTask(attemptId) {  return client.check(attemptId);}// Do not grant a reward based on a JavaScript event.

API base: https://pixora-ads.com/api/v1/offerwall. Anexe os caminhos /viewer/... e /publisher-api/... mostrados aqui. Cliente ({baseUrl}) aceita apenas uma origem HTTPS, como https://pixora-ads.com, sem caminho, consulta ou hash.

Na chamada de remoção da tela client.disconnect(): as solicitações pendentes falham com a desconexão e o token do visualizador é limpo. Obtenha consentimento e reconecte-se antes de continuar a usar. Após uma resposta perdida, recarregue o histórico; tente novamente iniciar ou enviar o relatório com a chave original porque o servidor pode ter salvo a solicitação. O SDK não tenta novamente automaticamente.

3. Bot API

Exemplos prontos incluem /bonus e /bonusbalance, botões iniciar/verificar, reconciliação após reinicialização, testes de configuração e desduplicação de recompensas. Eles pesquisam o API e não precisam de um webhook público.

Cada arquivo começa com comandos de configuração e variáveis de ambiente. Os exemplos dão crédito a um saldo SQLite independente. Para a moeda do seu jogo, coloque o crédito e UNIQUE(conversion_id) em uma transação em seu próprio banco de dados; reconhecer somente após o commit. Não inicie um segundo processo de pesquisa para um bot existente: integre os manipuladores ao seu aplicativo.

Seu servidor bot usa a propriedade API key em X-PixorAds-Key. Solicite uma sessão para um ID Telegram. Se verify=false, mostre verify_url para que o usuário possa verificar sua conta Telegram e aceitar os termos. Um ID arbitrário não pode gerar recompensas. A prova de identidade dura um dia; as solicitações do servidor não o estendem.

Python · httpx
import os, httpxBASE = "https://pixora-ads.com/api/v1/offerwall"KEY = os.environ["PIXORADS_KEY"]async def get_tasks(telegram_user_id):    async with httpx.AsyncClient(timeout=20) as api:        r = await api.post(BASE + "/publisher-api/session",            headers={"X-PixorAds-Key": KEY},            json={"telegram_id": telegram_user_id})        r.raise_for_status()        session = r.json()        if not session["verified"]:            return session  # Show verification_url as a button.        token = session["viewer_token"]        r = await api.get(BASE + "/viewer/catalog",            headers={"Authorization": "Bearer " + token})        r.raise_for_status()        return {"verified": True, "token": token, **r.json()}# Call only after the user selects a task.async def start_task(token, campaign_id, retry_key):    async with httpx.AsyncClient(timeout=20) as api:        r = await api.post(BASE + "/viewer/start",            headers={"Authorization": "Bearer " + token,                     "Idempotency-Key": retry_key},            json={"campaign_id": campaign_id})        r.raise_for_status()        return r.json()# Send title, reward and conditions. POST /viewer/attempts/{id}/open# with the viewer token and use its url; for reports use hosted_url.# A separate Check callback POSTs /viewer/attempts/{task_id}/check.# Keep tokens on your server and bind callbacks to the same user.# Store retry_key before the request and reuse it on retries.# If items is empty, continue the ordinary bot flow.

Um usuário tem um slot separado para tarefas rápidas e pode realizar até cinco tarefas de relatório em mapas, mercados e tarefas estendidas. A revisão e a espera pela entrega não contam para este limite. As tarefas existentes retornadas para revisão ou de entrega permanecem disponíveis. Novas atribuições ficarão indisponíveis enquanto o limite for atingido. A navegação não reserva orçamento e reiniciar a mesma campanha através de outra propriedade não gera uma segunda recompensa.

Lidar com HTTP 409 task_assignment_limit ao iniciar uma tarefa: o limite de tarefa de relatório foi atingido. task_quick_assignment_limit significa que o slot de tarefa rápida está ocupado. Mostre uma mensagem clara e mantenha o cartão selecionado; não mude para uma execução diferente automaticamente. Esses erros não criam nenhuma nova atribuição ou reserva. Quando a capacidade estiver disponível, tente novamente. Após um erro de rede, reutilize a mesma chave de comando.

4. Entregue recompensas no servidor

Configure um webhook HTTPS público. O segredo de assinatura está nas configurações do offerwall. X-PixorAds-Signature = HMAC-SHA256(segredo, carimbo de data / hora + '.' + bytes do corpo bruto); carimbo de data / hora é X-PixorAds-Timestamp. Use verificação de tempo constante e uma distorção de relógio limitada (por exemplo, 5 minutos). Não serialize novamente o JSON antes da verificação.

  • completed — ação observada, retenção de membro pendente. Um bônus antecipado é permitido apenas para o modo avançado explicitamente ativado;
  • qualified — verificação final aprovada: conceda a recompensa interna uma vez;
  • revoked — a verificação de retenção falhou; sem pagamento;
  • paid — rendimentos de propriedade liberados de retenção.

Antes de creditar, solicite GET /publisher-api/rewards/{conversion_id}. Verifique telegram_id, reward_mode=partner, test=false e reward_eligible=true. Dê crédito a reward_units dessa resposta exatamente uma vez. Após a confirmação da transação, POST /publisher-api/rewards/{conversion_id}/ack com {reference: 'your credit identifier'}. Tente novamente com a mesma referência após erros de rede. Este reconhecimento aparece para o usuário e nas análises; não aciona Pixora Ads transferências de dinheiro.

5. Bônus flexíveis

Escolha unidades fixas ou unidades por $ 1 de renda de propriedade. As unidades são arredondadas e limitadas pelo mínimo e máximo. Os multiplicadores de promoção têm uma data de término. Os termos congelam no início da tarefa; os preços dos anunciantes e a divisão monetária permanecem inalterados. As estimativas do catálogo podem mudar antes do início se as configurações ou as taxas de câmbio mudarem.

Por padrão, conceda após a verificação final. Na modalidade antecipada, a propriedade concede seu próprio bônus após a verificação inicial por sua conta e risco: a não manutenção da adesão cancela os rendimentos da propriedade. Pixora Ads não recupera bônus internos gastos. As recompensas em dinheiro e a liberação de receitas não são aceleradas.

Use Conversion_id como chave de recompensa e salve-o atomicamente com a recompensa sob uma restrição UNIQUE. Desduplicar event_id. Os eventos podem ser repetidos ou chegar fora de ordem. Devolva 2xx somente após armazenamento durável. Até 12 tentativas de entrega; erros e novas tentativas manuais estão disponíveis no painel de propriedades.

Se estiver usando o recibo de um resultado final, envie-o para o seu servidor: POST /publisher-api/reward/verify com a chave da propriedade. Combine telegram_id e Conversion_id com seu usuário. Um recibo não substitui a desduplicação de pagamento. Sem webhooks, histórico de enquetes e resultados finais.

Anunciantes: lançamentos de bots e ações Mini App

Crie um bot ou campanha Mini App. Abra o assistente Offerwall 1.2 em suas configurações: ação → integração → teste → lançamento. Defina a condição exata, nome do evento do servidor, prazo e período de verificação. Os lançamentos de bots exigem um novo usuário; Mini App metas podem permitir usuários existentes. Cada resultado é creditado uma vez.

Salvar uma meta de servidor exclui a campanha das tarefas nativas. Após o teste, selecione Somente parceiros. O financiamento da campanha, a moderação e o preço acordado ainda se aplicam. Defina a meta e os prazos em um rascunho antes da moderação. Crie uma nova campanha para alterar as condições aprovadas.

Os links contêm start=px_… para bots ou startapp=px_… para Mini Apps. Vincule o token a um ID Telegram de uma atualização de bot autêntica ou initData validado. Nunca confie em um ID de usuário ou sinalizador de conclusão fornecido pelo navegador. Abrir um link ou validar initData não prova, por si só, a conclusão da meta.

POST /api/v1/offerwall/actions/postback
{  "campaign_id": "CAMPAIGN_UUID",  "attempt_token": "px_ATTEMPT_TOKEN",  "event_id": "your-stable-event-id",  "telegram_id": 123456789,  "event_name": "tutorial_complete",  "occurred_at": "2026-10-06T10:05:00Z",  "first_seen_at": "2026-10-06T10:01:00Z",  "status": "completed",  "reason": null}

Assinar X-PixorAds-Signature = hex(HMAC-SHA256(segredo, carimbo de data/hora + '.' + rawBody)); X-PixorAds-Timestamp são segundos Unix, com tolerância de 5 minutos. Armazene o segredo do assistente de campanha apenas no seu servidor. Nas novas tentativas, mantenha o corpo e o event_id, atualizando o carimbo de data e hora e a assinatura. As novas tentativas não criam pagamentos extras; uma carga alterada com o mesmo event_id retorna 409.

first_seen_at é a primeira aparição original da conta em seu serviço, não o tempo de clique no anúncio. Preservar o histórico durante a exclusão da conta. As tarefas de novos usuários exigem que isso ocorra no início ou após o início da tarefa. ocorreu_at é o tempo de conclusão. Ambas as datas requerem um fuso horário. A confirmação deve chegar antes do prazo. Uma assinatura autentica o remetente; o anunciante continua responsável pela história verídica e pelas evidências do objetivo.

Envie status=rejected para rejeitar um resultado ou revogado para revogar uma confirmação anterior. Inclua o motivo: usuário_existente, condições_não_atendidas, fraude ou usuário_cancelado. A revogação é permitida antes da liquidação final, incluindo o período de verificação. Após a liquidação, result_final requer uma investigação de suporte. Uma tentativa rejeitada não pode ser reconfirmada.

Para HTTP 200, inspecione aceito e motivo; o processamento não é uma promessa de pagamento. Um trabalhador em segundo plano processa resultados confirmados. Os diagnósticos do assistente mostram os estados de execução e de receita do editor separadamente. Assinaturas inválidas retornam 401, cargas inválidas 422, limites de taxa 429. Tente novamente eventos persistentes de sua caixa de saída em caso de falhas de rede ou 5xx.

Crie problemas de teste com um token separado de uma hora vinculado ao seu ID Telegram. Ele executa a mesma validação sem reservas de orçamento, créditos ou notificações de recompensas. Use datas sintéticas após a criação do teste para um teste positivo, mas apenas o histórico real do banco de dados para resultados ao vivo. As configurações ou alterações importantes exigem um novo teste. As chaves substituídas param de funcionar imediatamente, inclusive nas tentativas existentes.

Baixe o auxiliar do servidor Python: assinatura, validação initData, envio de eventos

Relatórios e limites

Passe o posicionamento para o Cliente, como um atributo de componente ou em uma solicitação de sessão API. Use de 1 a 40 letras ASCII, dígitos _ ou -. O widget reporta um cartão quando pelo menos 50% está visível. Em uma interface de usuário personalizada, chame client.visible([campaignId]) após a exibição real, não o carregamento do catálogo. A visibilidade da mensagem do bot é desconhecida, portanto, não relate a visibilidade do cartão lá.

O suporte está vinculado a uma execução: POST /viewer/attempts/{id}/ticket com {message: 'description'} ou client.support(id, message). A resposta aparece em histórico[].ticket. Os editores veem suas próprias solicitações; os operadores respondem em Rede de anúncios → Offerwall suporte.

O painel de relatórios inicia, verificações de retenção, resultados confirmados, cancelamentos, gastos de anunciantes e receitas de propriedade. Os períodos referem-se à data de início da tarefa. Uma solicitação de catálogo não é uma impressão de anúncio, alcance único ou ação faturável. O faturamento inclui apenas os resultados finais verificados.

11 / INTEGRAÇÃO

Público e segmentação

#

Use init({publisherId, trackAudience:true}); este é o padrão do init(). Defina falso para cancelar. trackVisit() usa Telegram initData assinado com no máximo uma hora. A instalação apenas em um espaço de anúncio mede seus visitantes, não todo o público do seu aplicativo.

Chame trackVisit() em retornos significativos sem pesquisa. O servidor desduplica pessoas. gravado:falso significa que nenhuma observação foi salva, nem uma falha no anúncio. trackAudience:false desativa o envio automático, mas não bloqueia uma chamada trackVisit() explícita.

Os bots relatam atividade genuína via POST /api/v1/ad-network/publisher-api/activity com {telegram_id} e uma chave X-PixorAds somente para servidor. Estas são observações relatadas por parceiros, não evidências pagas. Os canais atualizam as contagens de assinantes após a verificação do administrador; os assinantes não têm alcance de publicidade.

Atividade durante 24 horas/7/30 dias, visualizadores de anúncios únicos, impressões visíveis e visualizações concluídas são separados. As previsões precisam de sete dias UTC completos para cada propriedade selecionada; o histórico de segmentação sem suporte não produz estimativa. Os públicos medidos são desduplicados; os assinantes do canal não são somados. Grupos com menos de 20 anos ficam ocultos dos anunciantes.

Divulgue a medição aos usuários. Habilite personalizado:true somente com permissão para usar um perfil Pixora Ads existente. Nunca substitua initDataUnsafe por initData assinado. As observações de atividades usam identificadores HMAC retidos por até 90 dias.

12 / REFERÊNCIA

Teste de integração

#

O real SDK abaixo é executado com test: true. Nenhum anúncio é solicitado e nenhum dinheiro ou alteração de estatísticas. Clique no botão do cartão. Use o mesmo modo em sua página; não requer nenhum ponto final.

Modo de teste
window.PixorAdsPublisher.mount({  element: document.getElementById("pixorads"),  language: "pt",  test: true});
13 / REFERÊNCIA

SDK opções e eventos

#
OpçãoObjetivo e padrão
publisherIdPúblico Mini App UUID. Necessário para visualização e medição incorporadas; não é uma chave secreta.
endpointSua rota de oferta POST de mesma origem, exigida com test:false. Recebe idioma, formato e context_token disponível.
elementObrigatório para showNative() e create(). Opcional para métodos de tela inteira através de init().
csrfTokenSeu token CSRF de sessão de cookie, enviado ao seu endpoint como X-CSRF-Token.
languageru = russo, en = inglês (padrão). Controles SDK Correspondência de idioma da UI e da campanha: o idioma escolhido ou Todos os idiomas. Não traduz texto ou vídeo criativo. Passe o idioma atual do aplicativo.
timeoutMs1.000–30.000 ms, padrão 10.000. Tempo limite de busca de oferta; a inicialização do visualizador tem um tempo limite separado de 20 segundos.
testfalso. True desativa solicitações e pagamentos de anúncios/medições. Native renderiza um cartão de teste; métodos de tela cheia não abrem um visualizador.
trackAudienceinicialização(): verdadeiro; criar()/montar(): falso. Chama trackVisit() automaticamente na criação. Defina explicitamente para sua política de medição.
personalizedfalso. Use um perfil Pixora Ads existente somente com permissão do usuário; o SDK não mostra um prompt de consentimento.
embeddedSempre habilitado por init(). O padrão é falso no legado create()/mount(): o cartão premiado abre uma visualização Pixora Ads separada.
onRewardRetorno de chamada com {receipt, session_id}; seu back-end deve verificá-lo. Não aguardado ou tentado novamente pelo SDK.
onEventcarregando, pronto, vazio, erro, aberto, concluído, fechado, impression_reported, test_clicked, destruído. Eventos de UI, não garantias financeiras.

Novas integrações: init() → método escolhido → destroy() ao remover a tela. Legacy create() requer elemento; mount() usa seleção automática e retorna uma promessa de estado. PixorAdsPublisher.mount(options) não expõe nenhum controlador; use init() ou create() para gerenciamento do ciclo de vida.

Tempo de execução e CSP

A visualização incorporada ao vivo requer HTTPS e uma inicialização Telegram com initData assinado com no máximo uma hora. Use test:true em um navegador comum; initDataUnsafe não é prova de identidade. Atualize os dados de lançamento expirados reabrindo o Mini App, não alterando auth_date.

Permitir https://pixora-ads.com em script-src, frame-src e connect-src; permitir ativos de cartão em img-src e media-src. Mantenha as permissões existentes do seu aplicativo. Se o CSP restringir estilos, verifique a compatibilidade: SDK aplica estilos embutidos ao seu cartão e sobreposição. Nunca envie a chave API para o navegador.

TypeScript: salve o .d.ts em uma pasta incluída pelo tsconfig e use window.PixorAdsPublisher. Estas declarações descrevem um script global, não um módulo npm. Não existe um pacote npm oficial.

Baixe declarações TypeScript
14 / REFERÊNCIA

Referência do editor API

#
POSTAR/api/v1/ad-network/publisher-api/offer

Solicite uma oferta nativa, intersticial ou recompensada do seu servidor. A chave do editor nunca deve ser enviada para um navegador ou Mini App.

AUTENTICAÇÃOX-PixorAds-KeyChave secreta do editor
CABEÇALHOSContent-Type: application/jsonIdempotency-Key: …
CORPO JSON{ "language": "ru" | "en", "format": "native" | "interstitial" | "rewarded" }o idioma padrão é en; o formato padrão é automático (legado). Encaminhe o SDK context_token inalterado quando fornecido.
RESPOSTAS200 · 401 · 409 · 422 · 429Veja o tratamento de erros abaixo
Solicitação do servidor
curl https://pixora-ads.com/api/v1/ad-network/publisher-api/offer \  -H "X-PixorAds-Key: $PIXORADS_PUBLISHER_KEY" \  -H "Idempotency-Key: unique-logical-request-id" \  -H "Content-Type: application/json" \  -d '{"language":"en","format":"native"}'

PLAYGROUND LOCAL

Crie uma solicitação segura

ru = russo, en = inglês. Este idioma é usado para interface de usuário SDK e correspondência de campanha, incluindo campanhas marcadas como Todos os idiomas. Os criativos não são traduzidos. Passe o idioma do seu aplicativo; padrão: en. Este exemplo não envia nenhuma solicitação.

Exemplo de resposta

Abaixo está um exemplo abreviado de recompensa. Retorne o JSON upstream completo inalterado, incluindo URLs, formato e campos de contabilidade. Faturamento de uso nativo/intersticial = confirm_impression e inclui impression_url. recompensa e publisher_amount são unidades inteiras menores: divida XTR e RUB por 1000, USD por 1.000.000. Recompensa do visualizador: viewer_reward/viewer_currency. Ganhos estimados de USD editores: publisher_income.

200 · recompensado · trecho
{  "source": "pixorads",  "placement_id": "<placement UUID>",  "title": "<advertisement title>",  "text": "<plain text>",  "disclosure": "Реклама · Ad · Pixora Ads",  "url": "https://t.me/pixoradsbot?startapp=net_<32 hex characters>",  "expires_at": "<ISO 8601 timestamp>",  "format": "rewarded",  "billing": "completed_rewarded_session",  "currency": "XTR",  "reward": 70,  "publisher_amount": 1}// No suitable demand: { "source": "none", "monetag_enabled": false }// Rewarded response excerpt, not a complete offer to return from your backend.// Example: 70 XTR minor units = 0.07 Stars; 1 = 0.001 Stars.// Ordinary: billing:"confirmed_impression", reward:0, impression_url present.// Forward the FULL upstream JSON unchanged; never build it from this excerpt.

As colocações normais duram cinco minutos; as colocações premiadas duram 24 horas. Siga expira_at. Chave de Idempotência: até 80 caracteres, um por solicitação lógica. Novas tentativas recompensadas reproduzem a resposta. A repetição de uma oferta comum emitida retorna posicionamento_already_issued: solicite um novo posicionamento com uma nova chave. Evite loops de repetição.

15 / REFERÊNCIA

Erros e solução de problemas

#
CódigoO que verificar
same_origin_backend_requiredAponte o endpoint para o seu back-end, não diretamente para Pixora Ads
authentication_required / 401 / 403Sessão do usuário, CSRF e uma chave API de servidor válida
publisher_unavailable / 409Moderação, pausa, suspensão e disponibilidade de rede
invalid_publisher_keyChave correta do imóvel; verifique se foi revogado
placement_expired / 410Crie um novo posicionamento com uma nova chave de idempotência
rate_limited / 429Recue nas tentativas; Mini Apps: 60 solicitações/minuto por propriedade; bot CPC: 120; Limites de IP também se aplicam
timeout / network_errorDisponibilidade de back-end, HTTPS, CSP connect-src e tempo limite
invalid_adEncaminhar API JSON sem reescrever a URL; não retorne uma página HTML de login
no_fill / source: noneNenhuma demanda correspondente. Mantenha um estado vazio e tente mais tarde
publisher_format_unavailableO formato selecionado não está habilitado para esta propriedade. Verifique seus formatos declarados.
viewer_in_progressAguarde o fechamento do visualizador atual; evite chamadas paralelas. Recrie o controlador após destroy().
placement_already_issuedUma colocação ordinária já foi emitida. Solicite um novo com uma nova Chave de Idempotência.
verified_viewer_requiredForneça publisherId e Telegram.WebApp.initData válido. Pixels anônimos não podem confirmar impressões pagas; use o SDK atual.
impression_unconfirmedA impressão não foi confirmada. Renderizar não é lucro; verifique o status da propriedade e a atualização da sessão Telegram.
16 / REFERÊNCIA

Estatísticas e suporte

#

As estatísticas de propriedades mostram sessões emitidas, conclusões verificadas, receitas retidas e receitas liberadas. As impressões comuns confirmadas são separadas das conclusões premiadas; uma solicitação de oferta, renderização de cartão ou clique por si só não comprova ganhos. Os ganhos são acumulados em USD. Mini Apps: 80% durante a promoção atual, depois 70%; campanhas de novos canais: 90%, depois 88%; bot CPC tem uma taxa independente. As taxas atuais aparecem nos ganhos imobiliários. Anúncios comuns usam receita de impressões pagas; Recompensado usa a receita após a recompensa do espectador. Os preços e as ações dos canais são fixados na criação da campanha e o câmbio na pós-reserva. Mini App os prazos são fixados na emissão e USD na confirmação. Histórico RUB e Estrelas permanecem separados. USD as retiradas usam apenas criptografia. As taxas dependem dos lances do leilão e da demanda disponível. As restrições podem manter a renda sob revisão.

Entre em contato com o suporte com o ID da propriedade, hora do erro, status HTTP e código. Não envie sua chave API ou token de bot.

17 / PARA ANUNCIANTES

Formatos de redes de anúncios

#

Selecione formatos ao registrar sua propriedade para moderação. Imagens e vídeos são tipos criativos; nativo, intersticial e recompensado são cenários de entrega. Não existe um método showVideo() separado: o servidor seleciona um criativo correspondente.

MétodoOnde o anúncio apareceRecompensa do espectador
showNative()Placa de imagem/vídeo em seu contêinerNenhum
showInterstitial()Sobreponha dentro do seu Mini App; imediatamente dispensávelNenhum
showRewarded()Sobreposição após aceitação explícita do usuárioApós visualização verificada; bônus internos exigem seu back-end

Mini App a publicidade fica dentro da interface do parceiro. A navegação do anunciante é opcional; descartar o anúncio retorna à sua tela. Os bots usam anúncios de conversação pagos por clique; canais usam postagens com CPM ou CPC. O CTA leva ao anunciante. Este JavaScript SDK é para Mini Apps, não para mensagens.

A receita do editor e os bônus dos espectadores são separados. Use nativo ou intersticial para monetizar sem recompensas. As impressões comuns exigem pelo menos 50% de visibilidade criativa por um segundo contínuo em uma janela ativa e reprodução real do vídeo. O servidor verifica a elegibilidade, limites e orçamento antes de confirmar a entrega.

Para novas integrações use SDK 1.8.4: init() e um método show explícito. O legado create()/mount() permanece compatível.

18 / PARA ANUNCIANTES

Pixor Pixel

#
PIXOR PIXEL / CAMADA DE SINAL

Do clique no anúncio à ação em seu site

Pixel lembra o px_click anônimo e mostra o que os visitantes fazem depois de seguir um anúncio. Vincule-o ao criar uma campanha no site ou nas configurações dessa campanha.

01Crie um pixelPainel → Pixels e eventos. Adicione e verifique seu domínio HTTPS.
02Instale o trechoAdicione o script ao seu site. No modo de teste, confirme o PageView e seu evento alvo no diário.
03Vincular uma campanhaPromover → Nova campanha → Tráfego do site → Etapa de público. Escolha um Pixel em seu próprio painel. Para uma campanha existente, abra suas configurações.
04Verifique e entre no arVerifique os eventos de teste e, em seguida, abra o site HTTPS verificado por meio de uma visita de campanha real ao site: isso cria px_click. Confirme o resultado com um postback de servidor assinado.
CAMPANHA API

Link sem girar uma chave

O painel salva sua seleção imediatamente. Para automação, use o ID UUID interno de GET /api/v1/pixels; o público px_… pixel_id é para o script. Envie nulo para desconectar. Somente o proprietário da campanha pode fazer essa alteração.

PUT /api/v1/campaigns/{campaign_id}/attribution/pixel
{ "pixel_id": "<pixel UUID>" }
Instale no seu site
<script>  window.PixorAdsPixel = window.PixorAdsPixel || { q: [] };  window.PixorAdsPixel.track = window.PixorAdsPixel.track || function (name, options) {    window.PixorAdsPixel.q.push([name, options]);  };  window.PixorAdsPixel.consent = window.PixorAdsPixel.consent || function (value) {    window.PixorAdsPixel.q.push(["consent", value]);  };</script><script async data-consent="required" src="https://pixora-ads.com/sdk/pixorads-pixel.js?pixel_id=px_your_id"></script><script>// Ligue a partir do seu retorno de chamada de consentimento CMP real, nunca automaticamente:function onAnalyticsConsentChanged(granted) {  window.PixorAdsPixel.consent(granted ? "granted" : "denied");}  // Somente depois que seu servidor aceitar o lead:  // window.PixorAdsPixel.track("Lead", { eventId: acceptedLead.event_id });</script>

Conecte seu retorno de chamada de consentimento CMP: este snippet não coleta eventos antes do consentimento. Os eventos do navegador mostram o funil; um postback assinado com o mesmo event_id confirma uma conversão analítica sem alterar o faturamento. Um URL direto do site não cria px_click. Mantenha a chave de assinatura apenas no seu back-end.

19 / PARA PARCEIROS

Postbacks de referência

#

Envie marcos de referência para Keitaro, Binom v2 ou seu servidor. Esta é uma análise de saída: ela não altera os pagamentos nem substitui os webhooks de recompensa Offerwall ou a confirmação do servidor Pixel.

1. Conecte seu rastreador

Parceiros → Links → Postbacks: escolha um rastreador, insira seu endpoint HTTPS público, adicione metas e links salvos. Visualize a solicitação gerada, teste a entrega e habilite a integração. Uma integração pode servir vários links; cada link possui uma integração.

Abra links de parceiros

2. Preserve o ID de clique do seu rastreador

URL de oferta do rastreador
# Keitarohttps://pixora-ads.com/api/v1/referrals/track/YOUR_LINK_CODE?tracker_click_id={subid}# Binomhttps://pixora-ads.com/api/v1/referrals/track/YOUR_LINK_CODE?tracker_click_id={clickid}

Use o código do seu link salvo; seu rastreador substitui sua macro de clique. tracker_click_id é o identificador externo (até 128 caracteres); click_id é o ID interno separado de Pixora. A ponte salva o ID externo e abre o site, bot ou Mini App selecionado. Um link direto Telegram com valores de sub_id fixos não captura o ID de clique dinâmico do rastreador.

3. Escolha metas e valores

EventoCondição
Registro concluído
registration
Uma vez após confirmação por e-mail ou Telegram verificação e aceitação dos termos exigidos.
5–15 tarefas concluídas
tasks
Limite configurável de tarefas pagas; metas separadas para 5, 10 e 15.
Limite de ganhos
earnings
Ganhos de tarefas confirmados na moeda selecionada, uma vez por meta.
Saldo depositado
deposit
Primeiro ou todo depósito creditado igual ou superior ao valor selecionado.
Comissão de parceiro liberada
commission
Comissão de referência confirmada e disponível.

Até 24 gols por integração. amount é o valor do evento; o pagamento é a renda do parceiro: o depósito de 1.000 RUB de uma indicação não representa 1.000 RUB da receita do parceiro. Apenas a comissão gera pagamento monetário por padrão. As moedas permanecem separadas; As estrelas não são convertidas em rublos ou dólares. Nas configurações API, amount_minor é uma string inteira: RUB e XTR usam 1.000 unidades, USD 1.000.000. O valor de saída e o pagamento são sequências decimais em suas moedas.

Keitaro recebe um tid estável por gol e evento para que novas tentativas não adicionem outra conversão. No Binom, reserve event1…event24 e uma moeda de pagamento, RUB ou USD. O adaptador envia valores absolutos de eventos e receita cumulativa com disable_upsell=1 e disable_postback=1. Não os adicione novamente nas regras do seu rastreador.

Endpoint personalizado: GET ou POST

GET · Exemplo de URL
https://tracker.example/pixora?click={tracker_click_id}&goal={goal_id}&event={event}&amount={amount}&currency={currency}&payout={payout}&payout_currency={payout_currency}

Macros são permitidas apenas em valores de consulta: tracker_click_id, click_id, event_id, goal_id, event, link_id, sub_id_1…sub_id_5, quantidade, moeda, pagamento, payout_currency e ocorreu_at. Coloque os nomes das macros entre colchetes. status, meta e quantidade_minor não são macros. event_id e tracker_click_id são adicionados a solicitações GET personalizadas mesmo quando omitidos em seu modelo.

POST envia JSON fixo com esses campos mais schema_version=1, test_mode, event_type e corrects_event_id; não é um modelo de corpo personalizado. Armazene event_id com uma restrição UNIQUE na mesma transação do processamento e retorne 2xx para duplicatas. Um event_type=correction faz referência ao seu evento original por meio de corrects_event_id. Nunca credite usuários reais em eventos test_mode=true.

Entrega, novas tentativas e diário

A visualização não envia nenhuma solicitação. Um teste de entrega usa um ID px_test_… sintético; HTTP 2xx prova apenas uma resposta de endpoint, não uma conversão de rastreador. Para uma verificação de ponta a ponta, siga o link do seu rastreador e alcance uma meta. O diário mostra o evento, o status e o motivo do erro enquanto mascara os parâmetros secretos.

As falhas de rede 429 e 5xx são repetidas com backoff, até 8 tentativas automáticas por ciclo. Outros 4xx e redirecionamentos interrompem a entrega. A nova tentativa manual mantém o event_id, URL e carga útil originais. Um evento com falha bloqueia eventos posteriores para esse clique externo: restaure o endpoint e tente novamente. As alterações nas configurações se aplicam a visitas futuras sem reenvio do histórico. A atribuição de referência original é preservada.

Gerenciamento API: /api/v1/referrals/postbacks, somente proprietário autenticado. Listas GET e criações POST; /{id} suporta GET e PUT; /{id}/events é o diário; /preview e /{id}/preview renderizam uma solicitação; /{id}/test e /events/{event_id}/retry entregam explicitamente. Criar, salvar, testar e tentar novamente exigem chave de idempotência (1 a 96 caracteres); as atualizações precisam da versão atual. O editor X-PixorAds-Key não é usado aqui.