Reglas publicitarias (se abre en una nueva pestaña)
/ DESARROLLADORES
Panel de control

PIXORA ADS / DOCUMENTACIÓN PARA DESARROLLADORES

Pixora Ads SDK y API para desarrolladores

Monetización de editores y seguimiento de campañas de sitios web: guías prácticas, código de trabajo y solución de problemas en un solo lugar.

PIXORA ADS / FLUJO DE DATOS01 — 06
  1. 01tu plataforma
  2. 02Tu backend
  3. 03Pixora Ads API
  4. 04oferta nativa
  5. 05Acción verificada
  6. 06Ingresos del editor

Su clave permanece en su servidor. Pixora Ads verifica la acción completada antes de que se registren los ingresos del editor.

01 / PARA EMPEZAR

Cómo funciona la monetización

#

Seleccione formatos al registrar su propiedad para moderación. Las imágenes y los vídeos son tipos creativos; nativo, intersticial y recompensado son escenarios de entrega. No existe un método showVideo() independiente: el servidor selecciona una creatividad coincidente.

Métododonde aparece el anuncioRecompensa del espectador
showNative()Tarjeta de imagen/video en su contenedorNinguno
showInterstitial()Superposición dentro de tu Mini App; inmediatamente desestimadoNinguno
showRewarded()Superposición después de la suscripción explícita del usuarioDespués de una visualización verificada; Los bonos internos requieren tu backend.

Mini App la publicidad permanece dentro de la interfaz del socio. La navegación del anunciante es opcional; al descartar el anuncio vuelve a su pantalla. Los bots utilizan anuncios de conversación pagados por clic; Los canales usan publicaciones con CPM o CPC. La CTA conduce al anunciante. Este JavaScript SDK es para Mini Apps, no para mensajes.

Los ingresos del editor y las bonificaciones de los espectadores son independientes. Utilice anuncios nativos o intersticiales para monetizar sin recompensas. Las impresiones normales requieren al menos un 50 % de visibilidad creativa durante un segundo continuo en una ventana activa y reproducción real de vídeo. El servidor verifica la elegibilidad, los límites y el presupuesto antes de confirmar la entrega.

Para nuevas integraciones, utilice SDK 1.8.4: init() y un método show explícito. Legacy create()/mount() sigue siendo compatible.

02 / PARA EMPEZAR

Inicio rápido

#
  1. Abra Monetización → Propiedades → Conecte una propiedad y elija Mini App, bot o canal público.
  2. Proporcione un nombre, Telegram URL y una descripción del tema y la audiencia. Para Mini Apps utilice el enlace del bot o un enlace directo t.me/bot/appname. Seleccione nativo, intersticial y/o recompensado antes de la moderación. Describa la ubicación del anuncio en la descripción; no hay ningún campo separado.
  3. Verificar control: token de bot para bots/Mini Apps; Permisos de administrador para canales. El token verifica el control del bot; un moderador revisa la ubicación.
  4. Para Mini Apps y bots, cree una clave API después de la aprobación y manténgala en el lado del servidor. La publicación automática del canal no necesita un servidor separado o una clave API: guarde la configuración de publicación y verifique los permisos del bot.
  5. Ejecute la prueba a continuación, conecte su backend y SDK o prepare un anuncio en el panel. Los anuncios en vivo requieren una propiedad activa y una demanda coincidente; La conexión no garantiza el llenado de anuncios ni ingresos.
03 / PARA EMPEZAR

Ver un ejemplo práctico

#

La demostración de @pixorAds_networkbot muestra el recorrido completo del usuario: abriendo un Mini App, solicitando un anuncio a través de un servidor y mostrando el formato elegido dentro del Mini App. Puedes probarlo antes de conectar tu propia propiedad.

  1. Abra el bot y ejecute su Mini App. El backend de demostración verifica la sesión Telegram a través de /api/v1/ad-network/demo/session.
  2. El SDK llama a /api/v1/ad-network/demo/offer en el mismo origen. La clave secreta del editor permanece en el servidor.
  3. Si no hay ninguna oferta paga equivalente, la aplicación de demostración muestra un video introductorio. Este es el estado vacío del editor, no una vista de anuncio: no genera ningún cargo, recompensa ni ingresos para el editor.
Demostración: monte SDK después de la verificación 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: "es"});await placement.showNative();
04 / INTEGRACIÓN

Mini App · JavaScript / React

#

Cargue el script una vez en HTML. Establezca el punto final en su propio backend en el mismo origen. Nunca expongas la tecla API al navegador. Antes de init(), envíe Telegram.WebApp.initData a su backend: verifique su firma y antigüedad, cree una sesión y, para la autenticación de cookies, devuelva un token CSRF para la opción csrfToken. Copie el ID del editor público de la tarjeta de propiedad. Los ejemplos siguientes son anuncios nativos sin recompensas; consulte Mostrar métodos para otros escenarios. Pase el token CSRF de la sesión como accesorio de React y destruya() al desmontar.

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 / INTEGRACIÓN

Mostrar métodos

#
Métododonde aparece el anuncioRecompensa del espectador
showNative()Tarjeta de imagen/video en su contenedorNinguno
showInterstitial()Superposición dentro de tu Mini App; inmediatamente desestimadoNinguno
showRewarded()Superposición después de la suscripción explícita del usuarioDespués de una visualización verificada; Los bonos internos requieren tu backend.

Elija un ejemplo a continuación. Cargue el SDK y haga que su servidor verifique primero la sesión Telegram. Reemplace PublisherId con su ID de propiedad pública. csrfTokenFromYourSession es el token CSRF de su sesión, no una clave API. /api/pixorads/offer es una ruta que implementas en tu 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 del método

llamarResultado
init(options)Crea un controlador sin mostrar un anuncio. Las opciones no válidas se lanzan sincrónicamente. Habilita trackAudience de forma predeterminada.
showNative()Promesa<PublisherState>: listo, vacío o error con código. listo significa prestado, no facturado.
showInterstitial() / showRewarded()La promesa se resuelve sobre el despido. Errores y rechazo no_fill: use try/catch. Declaraciones de despido anticipado completadas: falso.
getState()Último evento SDK; no situación financiera o equilibrio.
trackVisit()Promesa<{recorded:boolean}>. Faltan datos de PublisherId/firmado Telegram, modo de prueba o falla de red. Se registran resultados: falso.
destroy()Cancela solicitudes, elimina la tarjeta/superposición y los oyentes. Crea un nuevo controlador para una nueva pantalla.
EditorMostrarResultado
{  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}

Sólo se puede abrir un visor de anuncios a la vez. No ejecute showNative() y un método de pantalla completa simultáneamente en un controlador. Continúe su aplicación en no_fill; Nunca reemplace una recompensa prometida con un anuncio común y corriente. Destruye el controlador cuando se retira la pantalla, no inmediatamente después de renderizar una tarjeta.

06 / INTEGRACIÓN

Recompensas y verificación

#

Los nativos y los intersticiales no necesitan integración de recompensa. En modo recompensado Pixora Ads verifica la vista; su backend otorga monedas, vidas u otros bonos adicionales dentro de su aplicación.

  1. Lea el recibo opaco de showRewarded() después del despido. Es una prueba para verificar, no un monto de recompensa.
  2. Envíelo a su backend autenticado. Verifíquelo usando la clave de esta propiedad y haga coincidir telegram_id con su propio usuario de sesión.
  3. En una transacción, guarde el recibo_id único y otorgue el bono configurado por el servidor. Las solicitudes repetidas deben devolver el resultado existente sin conceder dos veces.
recompensar/verificar · solo tu backend
// 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.

Respuesta: recompensado, recibo_id, sesión_id, editor_id, telegrama_id, operación_id, recompensa, moneda, completado_en. Los recibos duran siete días y están vinculados a la propiedad. La verificación no transfiere dinero. Si su backend no está disponible, vuelva a intentar obtener el mismo recibo en lugar de requerir otra visualización del anuncio.

Cuándo usar onReward

onReward({receipt, session_id}) se activa al finalizar mientras el visor puede permanecer abierto. Es una alternativa a la tramitación del recibo tras el despido. El SDK no espera ni vuelve a intentar su devolución de llamada asíncrona: implemente errores y vuelva a intentarlo usted mismo. Si utiliza ambas rutas, la deduplicación del servidor mediante recibo_id es esencial. Las notificaciones de eventos y los clics en CTA nunca autorizan una bonificación.

API las cantidades son unidades menores enteras: XTR / 1000 = Estrellas; RUB / 1000 = rublos; USD / 1.000.000 = dólares. recompensa: 70 con moneda: XTR significa 0,07 estrellas. En una oferta, visor_recompensa/visor_moneda describen la recompensa del espectador; recompensa y monto_editor utilizan la moneda de la campaña. Publisher_Ingresos estima USD ganancias, fijadas en la confirmación. Ninguno de los dos define la cantidad de monedas en su aplicación.

07 / INTEGRACIÓN

Backend y tecla API

#

Su backend autentica al usuario, limita las solicitudes y solicita un anuncio de Pixora Ads. Reenvía la respuesta JSON al widget. Reutilice una clave de idempotencia para reintentos de la misma solicitud lógica; Utilice una nueva clave para una nueva oferta.

Solicitud del 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"}'
Nodo.js/Expreso
// 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 o revocar una clave la desactiva y sus enlaces de ubicación. Actualice su variable de entorno y cree nuevas ubicaciones. Las sesiones iniciadas conservan sus términos, pero las nuevas acciones de los espectadores verifican el estado actual y la versión clave.

08 / INTEGRACIÓN

Bots · anuncios de conversación

#

El formato principal del bot es un anuncio tras una respuesta útil, pagado por visita confirmada. Los tokens de BotFather permanecen en el servidor propietario; los espectadores no necesitan registrarse por separado.

Guía, SDK y entrega de prueba gratuita

Configure la entrega, apruebe creatividades y vea tarifas e ingresos en la tarjeta de propiedad del bot en Anuncios de conversación. La visualización recompensada sigue siendo un formato opcional con su propia integración.

09 / INTEGRACIÓN

Canales · CPM y CPC

#

Agrega un canal público con tu cuenta y el bot Pixora Ads como administradores. Después de la moderación, verifique los permisos de publicación y eliminación. Elija vistas (CPM, predeterminado) o clics confirmados (CPC) en la configuración del canal. Establezca ganancias mínimas y el límite de resultados por publicación. La publicación y aprobación automáticas están disponibles para ambos.

CPM paga Telegram vistas de contador en las primeras 24 horas, incluidos los forwards; este no es un alcance o una finalización únicos. CPC paga navegación confirmada en una página corta sin registro. Las vistas, vistas previas y repeticiones del mismo anunciante en canales dentro de las 24 horas son gratuitas. Una huella digital de IP y de agente de usuario no es prueba de una persona única. Los lectores no reciben ninguna recompensa.

La liquidación sigue a la colocación de 24 horas y luego a la suspensión de la campaña. El historial de publicaciones muestra ganancias, vistas pagas o clics y fechas de lanzamiento. Los precios y las acciones del canal son independientes de Mini Apps; Las tasas actuales aparecen en las ganancias de la propiedad.

10 / INTEGRACIÓN

Offerwall · tareas y recompensas

#

Presentación de demostración · SDK 1.3.3

Pruebe 10 tipos de tareas sin registrar una propiedad. El DemoClient independiente devuelve un catálogo de muestra y simula la verificación en la memoria del navegador. Nunca llama al API financiero, emite recibos ni confirma recompensas reales. Esto demuestra la interfaz de usuario, no la integración del backend.

Abrir escaparate de demostración →
JavaScript · Cliente de demostración
// 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 · Conexión, entorno de pruebas no financiero, bonificaciones y diagnósticos en un solo panel.

Apertura de tareas e informes · SDK 1.3

Después del inicio, llame a client.open(attemptId) y abra su URL. Esta reacción arma/observación de encuestas o crea un enlace a un sitio web protegido. No utilice la URL del anunciante sin formato. Los bots pueden abrir hosting_url para continuar con el mismo intento en la interfaz alojada.

Informes: client.report(id), submitReport(id, {version, body, images, draft}, clave); Las respuestas del producto utilizan {version, answers}. Cargue hasta 3 capturas de pantalla con uploadReportImage(id, base64). Apelar con apelación(id, {version, reason}, clave). Reutilice la misma clave para los reintentos. report_updated informa el estado y la fecha límite, nunca recompensa la elegibilidad. Otorgar solo después de la verificación de backend de return_eligible.

Un catálogo de tareas: una pantalla alojada, Mini App componente y API para su propia interfaz o Telegram bot. Se admiten suscripciones a canales públicos y uniones a grupos. Pixora Ads debe ser administrador del chat de destino. Los primeros lanzamientos de bots y las acciones Mini App confirmadas por el anunciante también se admiten después de una prueba de integración. Se admiten reacciones de grupos públicos, encuestas Pixora Ads no anónimas, nuevos aumentos Premium, visitas a sitios web, navegación y tareas de informes, incluida la investigación de productos. La disponibilidad del sitio web depende de la configuración del servicio. No se admiten formatos de compra dedicados ni tareas de varios pasos.

1. Prepare su propiedad

Agregue y verifique una propiedad en Mis propiedades y complete la moderación. En Tareas y recompensas, elija el modo de recompensa, configure las devoluciones de llamadas y habilite las tareas. Solo son elegibles las campañas cuyos anunciantes habilitaron explícitamente la distribución de socios.

Elija tipos de tareas

Seleccione Tipos de tareas en Offerwall configuración: por ejemplo, suscripciones, Mini App acciones o informes de tareas. Los 10 tipos admitidos están seleccionados de forma predeterminada. Borrar todos los tipos impide que se ofrezcan nuevas tareas. La disponibilidad real también depende de las campañas, la configuración del servicio y el usuario.

El servidor aplica su selección a cada integración: pantalla alojada, SDK, componente y bot API. La próxima actualización del catálogo refleja la configuración sin cambios de integración. Las tareas iniciadas permanecen en Mi progreso: los usuarios pueden completarlas, verificarlas y recibir la recompensa acordada incluso si ese tipo ya no se acepta.

client.catalog() devuelve la selección de options.task_types del servidor, los elementos disponibles y el historial de tareas iniciadas. Las respuestas anteriores pueden omitir el campo. Nunca filtre el historial por opciones.task_types ni pase una lista personalizada al Cliente, conéctese o inicie: solo el propietario de la propiedad cambia esta configuración en el panel.

  • Pixora Ads recompensa: un usuario registrado gana dinero en efectivo; la propiedad gana una parte de la tarifa de la plataforma. Participación inicial: 50% de la cuota.
  • Recompensa de propiedad: otorgas monedas o acceso; su propiedad gana una parte del precio resultante. Participación inicial: 80%. Su servidor ofrece recompensas internas.

Los recursos compartidos son configurables y congelados cuando comienza una tarea. Los ingresos de la propiedad se registran en USD a un tipo de cambio congelado y se retienen después de la verificación final (24 horas por defecto). La retención de membresía se muestra por separado. Una acción confirmada no significa que los ingresos se puedan retirar inmediatamente.

Las recompensas por referencias de tareas se financian con la parte restante de la plataforma después de la división del editor. No reducen la recompensa de usuario acordada ni los ingresos de la propiedad.

2. Elige una integración

Antes de habilitar tareas, abra Monetización → Offerwall → Conexión. Guarde la configuración, cree una tarea de muestra y complétela. Su evento tiene test=true, user_id=null y cero ingresos monetarios. Nunca le des crédito a un usuario real por ello. Repita la prueba después de cambiar la configuración.

Con los webhooks, la prueba se envía a la URL guardada con la firma HMAC habitual. De lo contrario, busque GET /publisher-api/tests. Su servidor lo reconoce a través de POST /publisher-api/tests/{conversion_id}/ack con X-PixorAds-Key. HTTP 2xx por sí solo no confirma una recompensa. Los eventos de prueba permanecen disponibles durante 24 horas.

Pantalla alojada: copie el enlace Telegram desde la configuración del muro de ofertas. Funciona en Mini Apps, bots y publicaciones de canales. La atribución de la fuente se conserva y no crea una relación de referencia.

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>

El componente se ejecuta dentro de un Telegram Mini App utilizando initData firmado para el bot verificado en la propiedad. Nunca expongas una clave API en el navegador. Tema: claro/oscuro; altura: variable 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. Agregue las rutas /viewer/... y /publisher-api/... que se muestran aquí. El cliente ({baseUrl}) acepta solo un origen HTTPS, como https://pixora-ads.com, sin ruta, consulta o hash.

Llamada de eliminación en pantalla client.disconnect(): las solicitudes pendientes fallan y se desconectan y el token del espectador se borra. Obtenga el consentimiento y vuelva a conectarse antes de seguir usándolo. Después de una respuesta perdida, recarga el historial; Vuelva a intentar iniciar o enviar el informe con la clave original porque es posible que el servidor haya guardado la solicitud. El SDK no vuelve a intentarlo automáticamente.

3. Bot API

Los ejemplos listos incluyen /bonus y /bonusbalance, botones de inicio/verificación, conciliación después del reinicio, pruebas de configuración y deduplicación de recompensas. Sondean el API y no necesitan un webhook público.

Cada archivo comienza con comandos de configuración y variables de entorno. Los ejemplos acreditan un saldo SQLite independiente. Para la moneda de tu juego, coloca el crédito y UNIQUE(conversion_id) en una transacción en tu propia base de datos; reconocer sólo después de comprometerse. No inicie un segundo proceso de sondeo para un bot existente: integre los controladores en su aplicación.

Su servidor bot usa la propiedad API clave en X-PixorAds-Key. Solicita una sesión para un Telegram ID. Si verificado = falso, muestra la URL de verificación para que el usuario pueda verificar su cuenta Telegram y aceptar los términos. Una identificación arbitraria no puede generar recompensas. La prueba de identidad dura un día; Las solicitudes del servidor no lo amplían.

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.

Un usuario tiene un espacio separado para tareas rápidas y puede realizar hasta cinco tareas de informes en mapas, mercados y tareas extendidas. La revisión y la espera de la entrega no cuentan para este límite. Las tareas existentes que regresan para revisión o desde la entrega permanecen disponibles. Las nuevas asignaciones no están disponibles mientras se alcanza el límite. La navegación no reserva presupuesto y reiniciar la misma campaña a través de otra propiedad no crea una segunda recompensa.

Manejar HTTP 409 task_assignment_limit al iniciar una tarea: se alcanza el límite de tarea de informe. task_quick_assignment_limit significa que el espacio de tarea rápida está ocupado. Mostrar un mensaje claro y conservar la tarjeta seleccionada; no cambie automáticamente a una ejecución diferente. Estos errores no crean ninguna nueva asignación o reserva. Una vez que haya capacidad disponible, vuelva a intentarlo. Después de un error de red, reutilice la misma clave de comando.

4. Entregar recompensas en el servidor.

Configure un webhook HTTPS público. El secreto de firma está en la configuración del muro de ofertas. X-PixorAds-Signature = HMAC-SHA256(secreto, marca de tiempo + '.' + bytes de cuerpo sin formato); la marca de tiempo es X-PixorAds-Timestamp. Utilice la verificación de tiempo constante y una desviación horaria limitada (por ejemplo, 5 minutos). No vuelva a serializar JSON antes de la verificación.

  • completed — acción observada, retención de membresía pendiente. Se permite una bonificación anticipada solo para el modo avanzado explícitamente habilitado;
  • qualified — verificación final aprobada: otorga la recompensa interna una vez;
  • revoked — la verificación de retención falló; sin pago;
  • paid — ingresos de la propiedad liberados de la retención.

Antes de acreditar, solicite GET /publisher-api/rewards/{conversion_id}. Verifique telegram_id,reward_mode=partner, test=false yreward_eligible=true. Acredite las unidades de recompensa de esa respuesta exactamente una vez. Después de que se confirme su transacción, PUBLICAR /publisher-api/rewards/{conversion_id}/ack con {reference: 'your credit identifier'}. Vuelva a intentarlo con la misma referencia después de los errores de red. Este reconocimiento le aparece al usuario y en análisis; no activa Pixora Ads transferencias de dinero.

5. Bonos flexibles

Elija unidades fijas o unidades por $1 de ingreso de propiedad. Las unidades se redondean hacia abajo y están limitadas por su mínimo y máximo. Los multiplicadores de promoción tienen fecha de finalización. Los términos se congelan al inicio de la tarea; Los precios de los anunciantes y la división monetaria se mantienen sin cambios. Las estimaciones del catálogo pueden cambiar antes del inicio si cambian la configuración o los tipos de cambio.

De forma predeterminada, se otorga después de la verificación final. En la modalidad anticipada, la propiedad otorga su propio bono después del control inicial bajo su propia responsabilidad: la falta de retención de la membresía cancela los ingresos de la propiedad. Pixora Ads no recupera las bonificaciones internas gastadas. Las recompensas en efectivo y la liberación de ingresos no se aceleran.

Utilice conversion_id como clave de recompensa y guárdela de forma atómica con la recompensa bajo una restricción ÚNICA. Deduplicar event_id. Los eventos pueden repetirse o llegar desordenados. Devuelva 2xx solo después de un almacenamiento duradero. Hasta 12 intentos de entrega; Los errores y los reintentos manuales están disponibles en el panel de propiedades.

Si utiliza el recibo de un resultado final, envíelo a su servidor: POST /publisher-api/reward/verify con la clave de propiedad. Haga coincidir telegram_id y conversion_id con su usuario. Un recibo no reemplaza la deduplicación de pagos. Sin webhooks, historial de encuestas y resultados finales.

Anunciantes: lanzamientos de bots y acciones Mini App

Crea un bot o una campaña Mini App. Abra el asistente Offerwall 1.2 en su configuración: acción → integración → prueba → inicio. Establezca la condición exacta, el nombre del evento del servidor, la fecha límite y el período de verificación. Los lanzamientos de bots requieren un nuevo usuario; Mini App los objetivos pueden permitir a los usuarios existentes. Cada resultado se acredita una vez.

Guardar un objetivo de servidor excluye la campaña de las tareas nativas. Después de la prueba, seleccione Solo socios. Se siguen aplicando la financiación de la campaña, la moderación y el precio acordado. Establece el objetivo y los plazos en un borrador antes de la moderación. Cree una nueva campaña para cambiar las condiciones aprobadas.

Los enlaces contienen start=px_… para bots o startapp=px__… para Mini Apps. Vincule el token a una ID Telegram de una actualización de bot auténtica o de initData validados. Nunca confíe en una identificación de usuario o indicador de finalización proporcionados por el navegador. Abrir un enlace o validar initData no demuestra en sí mismo que se haya cumplido el objetivo.

ENVIAR /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}

Firmar X-PixorAds-Signature = hex(HMAC-SHA256(secret, marca de tiempo + '.' + rawBody)); X-PixorAds-Timestamp son segundos de Unix, con una tolerancia de 5 minutos. Guarde el secreto del asistente de campaña únicamente en su servidor. En los reintentos, mantenga el cuerpo y el event_id, actualizando la marca de tiempo y la firma. Los reintentos no generan pagos adicionales; una carga útil modificada con el mismo event_id devuelve 409.

first_seen_at es la primera aparición original de la cuenta en su servicio, no el tiempo de clic en el anuncio. Preservar el historial tras la eliminación de cuentas. Las tareas de nuevos usuarios requieren que se realice al inicio de la tarea o después. ocurrió_at es el tiempo de finalización. Ambas fechas requieren una zona horaria. La confirmación debe llegar antes de la fecha límite. Una firma autentifica al remitente; el anunciante sigue siendo responsable de la historia veraz y la evidencia de objetivos.

Enviar estado=rechazado para rechazar un resultado, o revocado para revocar una confirmación previa. Incluya el motivo: usuario_existente, condiciones_no_cumplidas, fraude o usuario_cancelado. Se permite la revocación antes de la liquidación definitiva, incluido el período de verificación. Después de la liquidación, result_final requiere una investigación de soporte. Un intento rechazado no se puede volver a confirmar.

Para HTTP 200, inspeccionar aceptado y justificar; El procesamiento no es una promesa de pago. Un trabajador en segundo plano procesa los resultados confirmados. Los diagnósticos del asistente muestran los estados de ejecución y de ingresos del editor por separado. Las firmas no válidas devuelven 401, cargas útiles no válidas 422, límites de velocidad 429. Vuelva a intentar eventos persistentes desde su bandeja de salida en caso de fallas de red o 5xx.

La prueba de creación emite un token separado de una hora vinculado a su ID Telegram. Ejecuta la misma validación sin reservas de presupuesto, créditos ni notificaciones de recompensas. Utilice fechas sintéticas después de la creación de la prueba para una prueba positiva, pero solo el historial real de la base de datos para resultados en vivo. Los cambios de configuración o clave requieren una nueva prueba. Las claves reemplazadas dejan de funcionar inmediatamente, incluso en los intentos existentes.

Descargue la ayuda del servidor Python: firma, validación de initData, envío de eventos

Informes y límites

Pase la ubicación al Cliente, como atributo de componente o en una solicitud de sesión API. Utilice entre 1 y 40 letras ASCII, dígitos, _ o -. El widget informa una tarjeta cuando al menos el 50% es visible. En una interfaz de usuario personalizada, llame a client.visible([campaignId]) después de la visualización real, no de la carga del catálogo. Se desconoce la visibilidad de los mensajes del bot, así que no informe sobre la visibilidad de la tarjeta allí.

El soporte está vinculado a una ejecución: POST /viewer/attempts/{id}/ticket con {message: 'description'}, o client.support(id, mensaje). La respuesta aparece en historial[].ticket. Los editores ven sus propias solicitudes; los operadores responden en Red publicitaria → Offerwall soporte.

El panel informa inicios, verificaciones de retención, resultados confirmados, cancelaciones, gastos de anunciantes e ingresos de propiedad. Los períodos se refieren a la fecha de inicio de la tarea. Una solicitud de catálogo no es una impresión de anuncio, un alcance único ni una acción facturable. La facturación incluye sólo los resultados finales verificados.

11 / INTEGRACIÓN

Audiencia y segmentación

#

Utilice init({publisherId, trackAudience:true}); este es el valor predeterminado de init(). Establezca false para optar por no participar. trackVisit() utiliza Telegram initData firmado como máximo con una hora de antigüedad. La instalación solo en un espacio publicitario mide a sus visitantes, no a toda la audiencia de su aplicación.

Llame a trackVisit() en retornos significativos sin sondeo. El servidor deduplica a las personas. registrado: falso significa que no se guardó ninguna observación, ni un error en el anuncio. trackAudience:false deshabilita el envío automático pero no bloquea una llamada explícita a trackVisit().

Los bots informan actividad genuina a través de POST /api/v1/ad-network/publisher-api/activity con {telegram_id} y una clave X-PixorAds-Key exclusiva del servidor. Estas son observaciones informadas por socios, no evidencia de visualización paga. Los canales actualizan el recuento de suscriptores después de la verificación del administrador; Los suscriptores no son alcance publicitario.

La actividad durante 24 horas/7 días/30 días, los espectadores de anuncios únicos, las impresiones visibles y las vistas completadas están separadas. Los pronósticos necesitan siete días UTC completos para cada propiedad seleccionada; El historial de segmentación no admitido no produce ninguna estimación. Las audiencias medidas se deduplican; Los suscriptores del canal no se suman. Los grupos inferiores a 20 están ocultos para los anunciantes.

Divulgar la medición a los usuarios. Habilite personalizado: verdadero solo con permiso para usar un perfil Pixora Ads existente. Nunca sustituya initDataUnsafe por initData firmado. Las observaciones de actividad utilizan identificadores HMAC retenidos por hasta 90 días.

12 / REFERENCIA

Prueba de integración

#

El SDK real a continuación se ejecuta con test: true. No se solicitan anuncios ni cambios de dinero ni estadísticas. Haga clic en el botón de la tarjeta. Utilice el mismo modo en su página; no requiere ningún punto final.

Modo de prueba
window.PixorAdsPublisher.mount({  element: document.getElementById("pixorads"),  language: "es",  test: true});
13 / REFERENCIA

SDK opciones y eventos

#
OpciónPropósito y defecto
publisherIdPúblico Mini App UUID. Requerido para visualización y medición integradas; No es una clave secreta.
endpointSu ruta de oferta POST del mismo origen, requerida con test:false. Recibe idioma, formato y context_token disponible.
elementRequerido para showNative() y create(). Opcional para métodos de pantalla completa a través de init().
csrfTokenSu token CSRF de sesión de cookies, enviado a su punto final como X-CSRF-Token.
languageru = ruso, en = inglés (predeterminado). Controles SDK Coincidencia de idioma de UI y campaña: el idioma elegido o Todos los idiomas. No traduce textos o videos creativos. Pase el idioma actual de la aplicación.
timeoutMs1000–30000 ms, valor predeterminado 10000. Tiempo de espera de recuperación de oferta; El inicio del visor tiene un tiempo de espera independiente de 20 segundos.
testfalso. True deshabilita las solicitudes y pagos de anuncios/mediciones. Native genera una tarjeta de prueba; Los métodos de pantalla completa no abren un visor.
trackAudienceinicio(): verdadero; crear()/montar(): falso. Llama automáticamente a trackVisit() en el momento de la creación. Establezca explícitamente para su política de medición.
personalizedfalso. Utilice un perfil Pixora Ads existente solo con el permiso del usuario; el SDK no muestra una solicitud de consentimiento.
embeddedSiempre habilitado por init(). El valor predeterminado es falso en create()/mount() heredado: la tarjeta recompensada se abre para una visualización Pixora Ads separada.
onRewardDevolución de llamada con {receipt, session_id}; su backend debe verificarlo. No esperado ni reintentado por el SDK.
onEventcargando, listo, vacío, error, abierto, completado, cerrado, impresión_reportada, prueba_clic, destruido. Eventos de UI, no garantías financieras.

Nuevas integraciones: init() → método elegido → destroy() al quitar la pantalla. La creación heredada () requiere un elemento; mount() utiliza la selección automática y devuelve una promesa de estado. PixorAdsPublisher.mount(opciones) no expone ningún controlador; utilice init() o create() para la gestión del ciclo de vida.

Tiempo de ejecución y CSP

La visualización integrada en vivo requiere HTTPS y un inicio Telegram con initData firmado con una antigüedad máxima de una hora. Utilice test:true en un navegador normal; initDataUnsafe no es una prueba de identidad. Actualice los datos de lanzamiento caducados volviendo a abrir Mini App, no cambiando auth_date.

Permitir https://pixora-ads.com en script-src, frame-src y connect-src; permitir activos de tarjeta en img-src y media-src. Conserve los permisos existentes de su aplicación. Si CSP restringe los estilos, verifique la compatibilidad: SDK aplica estilos en línea a su tarjeta y superposición. Nunca envíe la clave API al navegador.

TypeScript: guarde los .d.ts en una carpeta incluida por tsconfig y use window.PixorAdsPublisher. Estas declaraciones describen un script global, no un módulo npm. No existe un paquete npm oficial.

Descargar declaraciones de TypeScript
14 / REFERENCIA

Referencia del editor API

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

Solicite una oferta nativa, intersticial o bonificada de su servidor. La clave del editor nunca debe enviarse a un navegador o Mini App.

AUTENTICACIÓNX-PixorAds-KeyClave secreta del editor
ENCABEZADOSContent-Type: application/jsonIdempotency-Key: …
CUERPO JSON{ "language": "ru" | "en", "format": "native" | "interstitial" | "rewarded" }el idioma predeterminado es en; El formato predeterminado es automático (heredado). Reenvía el SDK context_token sin cambios cuando se proporciona.
RESPUESTAS200 · 401 · 409 · 422 · 429Ver manejo de errores a continuación
Solicitud del 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"}'

ZONA DE JUEGOS LOCALES

Crear una solicitud segura

ru = ruso, en = inglés. Este idioma se utiliza para la interfaz de usuario SDK y la coincidencia de campañas, incluidas las campañas marcadas como Todos los idiomas. Las creatividades no se traducen. Pase el idioma de su aplicación; predeterminado: en. Este ejemplo no envía ninguna solicitud.

Ejemplo de respuesta

A continuación se muestra un ejemplo recompensado abreviado. Devuelve el JSON ascendente completo sin cambios, incluidas las URL, el formato y los campos de contabilidad. Facturación de uso nativo/intersticial = impresión_confirmada e incluye URL de impresión. recompensa y cantidad_editor son unidades enteras menores: divida XTR y RUB entre 1000, USD entre 1.000.000. Recompensa del espectador: visor_recompensa/visor_moneda. Ingresos estimados del editor USD: editor_ingresos.

200 · recompensado · extracto
{  "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.

Las colocaciones ordinarias duran cinco minutos; Las ubicaciones premiadas duran 24 horas. Siga expires_at. Clave de idempotencia: hasta 80 caracteres, uno por solicitud lógica. Los reintentos recompensados ​​reproducen la respuesta. La repetición de una oferta ordinaria emitida devuelve una ubicación_already_emitida: solicita una nueva ubicación con una nueva clave. Evite los bucles de reintento.

15 / REFERENCIA

Errores y solución de problemas

#
CódigoQue comprobar
same_origin_backend_requiredApunte el punto final a su backend, no directamente a Pixora Ads
authentication_required / 401 / 403Sesión de usuario, CSRF y una clave API de servidor válida
publisher_unavailable / 409Moderación, pausa, suspensión y disponibilidad de la red.
invalid_publisher_keyClave correcta de la propiedad; comprobar si fue revocado
placement_expired / 410Cree una nueva ubicación con una nueva clave de idempotencia
rate_limited / 429Retroceder los reintentos; Mini Apps: 60 solicitudes/minuto por propiedad; robot CPC: 120; También se aplican límites de IP
timeout / network_errorDisponibilidad de backend, HTTPS, CSP connect-src y tiempo de espera
invalid_adReenviar API JSON sin reescribir la URL; no devolver una página HTML de inicio de sesión
no_fill / source: noneNo hay demanda coincidente. Mantenga un estado vacío e inténtelo más tarde
publisher_format_unavailableEl formato seleccionado no está habilitado para esta propiedad. Consulta sus formatos declarados.
viewer_in_progressEspere a que se cierre el visor actual; Evite llamadas paralelas. Vuelva a crear el controlador después de destruir().
placement_already_issuedYa se emitió una colocación ordinaria. Solicite uno nuevo con una nueva clave de idempotencia.
verified_viewer_requiredProporcione un ID de editor y un Telegram.WebApp.initData válido. Los píxeles anónimos no pueden confirmar impresiones pagas; use el SDK actual.
impression_unconfirmedLa impresión no fue confirmada. El renderizado no son ganancias; verifique el estado de la propiedad y la frescura de la sesión Telegram.
16 / REFERENCIA

Estadísticas y soporte

#

Las estadísticas de propiedad muestran sesiones emitidas, terminaciones verificadas, ingresos retenidos e ingresos liberados. Las impresiones ordinarias confirmadas son independientes de las completaciones recompensadas; una solicitud de oferta, una presentación de tarjeta o un clic por sí solo no prueba ganancias. Las ganancias se acumulan en USD. Mini Apps: 80% durante la promoción actual, luego 70%; campañas de nuevos canales: 90%, luego 88%; bot CPC tiene una tarifa independiente. Las tasas actuales aparecen en las ganancias de la propiedad. Los anuncios comunes utilizan ingresos por impresiones pagas; Recompensado utiliza los ingresos después de la recompensa del espectador. Los precios y las acciones del canal se fijan en el momento de la creación de la campaña y los cambios en el momento de la reserva. Mini App los términos se fijan en el momento de la emisión y USD en el momento de la confirmación. El histórico RUB y las Estrellas siguen separados. USD los retiros utilizan únicamente criptomonedas. Las tarifas dependen de las ofertas de la subasta y de la demanda disponible. Las restricciones pueden mantener los ingresos bajo revisión.

Póngase en contacto con el soporte con el ID de propiedad, la hora del error, el estado HTTP y el código. No envíe su clave API ni su token de bot.

17 / PARA ANUNCIANTES

Formatos de redes publicitarias

#

Seleccione formatos al registrar su propiedad para moderación. Las imágenes y los vídeos son tipos creativos; nativo, intersticial y recompensado son escenarios de entrega. No existe un método showVideo() independiente: el servidor selecciona una creatividad coincidente.

Métododonde aparece el anuncioRecompensa del espectador
showNative()Tarjeta de imagen/video en su contenedorNinguno
showInterstitial()Superposición dentro de tu Mini App; inmediatamente desestimadoNinguno
showRewarded()Superposición después de la suscripción explícita del usuarioDespués de una visualización verificada; Los bonos internos requieren tu backend.

Mini App la publicidad permanece dentro de la interfaz del socio. La navegación del anunciante es opcional; al descartar el anuncio vuelve a su pantalla. Los bots utilizan anuncios de conversación pagados por clic; Los canales usan publicaciones con CPM o CPC. La CTA conduce al anunciante. Este JavaScript SDK es para Mini Apps, no para mensajes.

Los ingresos del editor y las bonificaciones de los espectadores son independientes. Utilice anuncios nativos o intersticiales para monetizar sin recompensas. Las impresiones normales requieren al menos un 50 % de visibilidad creativa durante un segundo continuo en una ventana activa y reproducción real de vídeo. El servidor verifica la elegibilidad, los límites y el presupuesto antes de confirmar la entrega.

Para nuevas integraciones, utilice SDK 1.8.4: init() y un método show explícito. Legacy create()/mount() sigue siendo compatible.

18 / PARA ANUNCIANTES

Pixor Pixel

#
PIXOR PIXEL / CAPA DE SEÑAL

Del clic en el anuncio a la acción en su sitio

Pixel recuerda el px_click anónimo y muestra lo que hacen los visitantes después de seguir un anuncio. Vincúlelo mientras crea una campaña en el sitio web o en la configuración de esa campaña.

01Crear un píxelPanel → Píxeles y eventos. Agregue y verifique su dominio HTTPS.
02Instalar el fragmentoAgregue el script a su sitio. En modo de prueba, confirme PageView y su evento objetivo en el diario.
03Vincular una campañaPromocionar → Nueva campaña → Tráfico del sitio web → Paso de audiencia. Elige un Píxel en su propio panel. Para una campaña existente, abra su configuración.
04Verificar y publicarVerifique los eventos de prueba, luego abra el sitio HTTPS verificado a través de una visita de campaña al sitio web real: crea px_click. Confirme el resultado con una devolución de datos del servidor firmada.
CAMPAÑA API

Enlace sin girar una llave

El panel guarda su selección inmediatamente. Para la automatización, utilice la identificación UUID interna de GET /api/v1/pixels; el px_… pixel_id público es para el script. Enviar nulo para desconectar. Solo el propietario de la campaña puede realizar este cambio.

PUT /api/v1/campaigns/{campaign_id}/attribution/pixel
{ "pixel_id": "<pixel UUID>" }
Instalar en su sitio
<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>// Llame desde su devolución de llamada de consentimiento CMP real, nunca automáticamente:function onAnalyticsConsentChanged(granted) {  window.PixorAdsPixel.consent(granted ? "granted" : "denied");}  // Solo después de que su servidor acepte el cliente potencial:  // window.PixorAdsPixel.track("Lead", { eventId: acceptedLead.event_id });</script>

Conecte su devolución de llamada de consentimiento de CMP: este fragmento no recopila eventos antes del consentimiento. Los eventos del navegador muestran el embudo; una devolución de datos firmada con el mismo event_id confirma una conversión analítica sin cambiar la facturación. La URL de un sitio directo no crea px_click. Mantenga la clave de firma únicamente en su backend.

19 / PARA SOCIOS

Devoluciones de datos de referencia

#

Envíe hitos de referencia a Keitaro, Binom v2 o su servidor. Se trata de análisis salientes: no cambia los pagos ni reemplaza los webhooks de recompensa Offerwall ni la confirmación del servidor Pixel.

1. Conecta tu rastreador

Socios → Enlaces → Devoluciones de datos: elija un rastreador, ingrese su punto final HTTPS público, agregue objetivos y enlaces guardados. Obtenga una vista previa de la solicitud generada, pruebe la entrega y habilite la integración. Una integración puede servir a varios enlaces; cada enlace tiene una integración.

Abrir enlaces de socios

2. Conserve el ID de clic de su rastreador

URL de oferta de seguimiento
# 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}

Utilice el código de su enlace guardado; su rastreador sustituye su macro de clic. tracker_click_id es el identificador externo (hasta 128 caracteres); click_id es el ID interno independiente de Pixora. El puente guarda la ID externa y abre el sitio web seleccionado, bot o Mini App. Un enlace directo Telegram con valores sub_id fijos no captura el ID de clic dinámico del rastreador.

3. Elige objetivos y montos

EventoCondición
Registro completo
registration
Una vez después de la confirmación por correo electrónico o Telegram verificación y aceptación de los términos requeridos.
5 a 15 tareas completadas
tasks
Umbral de tarea paga configurable; porterías separadas para 5, 10 y 15.
Umbral de ganancias
earnings
Ganancias de tareas confirmadas en la moneda seleccionada, una vez por objetivo.
Saldo depositado
deposit
El primer depósito acreditado o cada uno de ellos igual o superior al monto seleccionado.
Comisión de socios liberada
commission
Comisión de referencia confirmada y disponible.

Hasta 24 goles por integración. cantidad es la cantidad del evento; El pago son ingresos del socio: el depósito de 1000 RUB de una referencia no son 1000 RUB de ingresos del socio. Sólo la comisión genera un pago monetario de forma predeterminada. Las monedas permanecen separadas; Las estrellas no se convierten a rublos ni a dólares. En la configuración API, cantidad_minor es una cadena entera: RUB y XTR usan 1000 unidades, USD 1.000.000. El monto saliente y el pago son cadenas decimales en sus monedas.

Keitaro recibe un tid estable por objetivo y evento, por lo que los reintentos no agregan otra conversión. En Binom, reserve evento1…evento24 y una moneda de pago, RUB o USD. El adaptador envía valores absolutos de eventos e ingresos acumulativos con enable_upsell=1 y enable_postback=1. No los vuelvas a agregar en las reglas de tu rastreador.

Punto final personalizado: GET o POST

OBTENER · Ejemplo 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}

Las macros solo se permiten en los valores de consulta: tracker_click_id, click_id, event_id, goal_id, event, link_id, sub_id_1…sub_id_5, monto, moneda, pago, moneda_pago y ocurrió_at. Envuelva los nombres de las macros entre llaves. status, objetivo y cantidad menor no son macros. event_id y tracker_click_id se agregan a las solicitudes GET personalizadas incluso cuando se omiten en su plantilla.

POST envía JSON fijo con esos campos más esquema_version=1, test_mode, event_type y corrects_event_id; no es una plantilla de cuerpo personalizada. Almacene event_id con una restricción ÚNICA en la misma transacción que se procesa y devuelva 2xx para duplicados. Un event_type=correction hace referencia a su evento original a través de corrects_event_id. Nunca dé crédito a usuarios reales por eventos test_mode=true.

Entrega, reintentos y diario

La vista previa no envía ninguna solicitud. Una prueba de entrega utiliza un ID sintético de px_test_…; HTTP 2xx demuestra solo una respuesta de punto final, no una conversión de rastreador. Para una verificación de extremo a extremo, siga el enlace de su rastreador y alcance una meta. El diario muestra el evento, el estado y el motivo del error mientras enmascara los parámetros secretos.

Las fallas de red, 429 y 5xx se reintentan con retroceso, hasta 8 intentos automáticos por ciclo. Otros 4xx y redirecciones detienen la entrega. El reintento manual mantiene el event_id, la URL y la carga útil originales. Un evento fallido bloquea eventos posteriores para ese clic externo: restaure el punto final y vuelva a intentarlo. Los cambios de configuración se aplican a visitas futuras sin reenviar el historial. Se conserva la atribución de referencia original.

Gestión API: /api/v1/referrals/postbacks, solo propietario autenticado. GET listas y POST crea; /{id} admite GET y PUT; /{id}/events es el diario; /preview y /{id}/preview procesan una solicitud; /{id}/test y /events/{event_id}/retry entregan explícitamente. Crear, guardar, probar y reintentar requiere Idempotency-Key (de 1 a 96 caracteres); las actualizaciones necesitan la versión actual. La clave del editor X-PixorAds no se utiliza aquí.