Parámetros de postback de offerwall: Lootably, AdGate Media, CPX Research y BitLabs
Cada offerwall llama a tu servidor cuando un usuario completa una oferta, y cada uno llama de forma distinta a lo mismo. El usuario es {userID} en uno, {s1} en otro y [%USER:UID%] en un tercero. Esta guía pone lado a lado los parámetros de postback de los cuatro offerwalls que más usan los sitios de recompensas y GPT, con cómo avisa cada uno de una reversión y cómo comprobar que un postback es auténtico.
Respuesta corta
Lootably envía {userID}, {transactionID}, {currencyReward}, {revenue}, {ip} y {status}; AdGate Media usa {s1} para el usuario, {points}, {payout} y {state}; CPX Research envía {user_id}, {trans_id}, {amount_local}, {amount_usd} y {status}; BitLabs usa [%USER:UID%], [%TX%], [%VALUE:CURRENCY%] y [%VALUE:USD%]. Acredita cada transacción una sola vez, verifica el hash y trata las reversiones.
- Señal de reversión
- Lootably: status 0. AdGate: state "rejected". CPX Research: status 2. BitLabs: tipo RECONCILIATION.
- Firmas
- Lootably: SHA-256. BitLabs: HMAC SHA-1 de la URL completa. CPX Research: una macro de hash seguro. AdGate: ninguna, lista blanca de IP.
- La misma idea, cuatro nombres
- El ID de usuario es {userID}, {s1}, {user_id} o [%USER:UID%].
- Comprobado con
- La documentación de postback de cada offerwall, octubre de 2026.
Por qué importan los nombres
Un postback es una petición del servidor del offerwall al tuyo. Dice que un usuario completó una oferta y cuánto acreditarle. Tu endpoint lee unos pocos valores: quién es el usuario, qué transacción es, cuántos puntos dar y, a veces, la IP desde la que empezó la oferta. Si uno de ellos se lee del parámetro equivocado, el usuario recibe mal el saldo, dos veces o nunca.
Cada offerwall te deja montar la URL de postback a tu gusto: eliges los nombres de tus parámetros y pones como valores las macros del offerwall, por ejemplo ?user={userID}&tx={transactionID}. Las tablas de abajo recogen las macros. Los nombres de tus parámetros pueden ser los que quieras.
Para revisar una URL que ya tienes, pégala en el comprobador de postback gratuito: marca cada macro que el offerwall no va a rellenar (mayúsculas mal puestas, el nombre de otro offerwall, llaves codificadas en la URL) y lo que le falta al postback.
Lootably
| Macro | Qué lleva |
|---|---|
| {userID} | El usuario que completó la oferta |
| {transactionID} | El ID de esta conversión en Lootably |
| {currencyReward} | La recompensa en tu moneda, según la configuración del placement |
| {revenue} | Lo que ganaste, en USD |
| {ip} | La IP del usuario al empezar la oferta |
| {offerID} / {offerName} | La oferta |
| {goalID} / {goalName} | El objetivo, en ofertas de varios pasos |
| {status} | 1 para una conversión, 0 para un contracargo |
| {hash} | Firma SHA-256 |
El hash es el sha256 de userID, ip, revenue y currencyReward seguidos de tu clave secreta de postback, concatenados en ese orden. Lootably documenta status 0 para los contracargos, pero indica que por ahora solo envía postbacks con status 1: ten lista la gestión de reversiones sin depender todavía de ella.
AdGate Media
| Macro | Qué lleva |
|---|---|
| {s1} | Tu ID de usuario (hasta 255 caracteres) |
| {conversion_id} | El ID de la conversión |
| {points} | Los puntos a acreditar, decimales o enteros |
| {payout} | Lo que ganaste, en USD |
| {offer_id} / {vc_title} | El ID de la oferta y el título que se ve en el muro |
| {session_ip} | La IP del usuario que completó la oferta |
| {state} | approved, rejected o pending |
| {status} | Obsoleto: AdGate pide ahora {state} en su lugar |
El ejemplo del propio AdGate es ?conversion_id={conversion_id}&user_id={s1}&point_value={points}&usd_value={payout}&offer_title={vc_title}. Añade {state}: sin él, AdGate solo envía las conversiones aprobadas; con él, una conversión revertida vuelve a llegar con state rejected y el mismo ID de conversión, así que puedes encontrar el abono original y retirarlo.
AdGate no firma sus postbacks. Publica las IP desde las que llegan y te pide usar una URL de postback que solo llame AdGate, así que permite únicamente esas direcciones en ese endpoint.
CPX Research
| Macro | Qué lleva |
|---|---|
| {user_id} | Tu ID de usuario |
| {trans_id} | El ID de la transacción |
| {amount_local} | La recompensa en tu moneda |
| {amount_usd} | Lo que ganaste, en USD |
| {offer_ID} | La encuesta u oferta |
| {ip_click} | La IP del usuario en el clic |
| {subid} / {subid_2} | Tus propios valores de seguimiento |
| {status} | 1 completada, 2 cancelada |
| {secure_hash} | Firma para verificar el postback |
Un postback típico de CPX es ?status={status}&trans_id={trans_id}&user_id={user_id}&amount_local={amount_local}&amount_usd={amount_usd}&hash={secure_hash}&ip_click={ip_click}. Ojo: una cancelación es status 2, no 0. Un código escrito para otro offerwall que solo mira si llega 0 acreditará las cancelaciones de CPX como si fueran encuestas nuevas.
BitLabs
| Macro | Qué lleva |
|---|---|
| [%USER:UID%] | Tu ID de usuario (hasta 255 caracteres) |
| [%TX%] | El ID de la transacción, para no acreditar dos veces |
| [%VALUE:CURRENCY%] | La recompensa en la moneda de tu app |
| [%VALUE:USD%] | Lo que ganaste, en USD |
| [%USER:IP_ADDRESS%] | La IP del usuario |
| [%OFFER:ID%] / [%OFFER:NAME%] | La oferta |
| [%ACTIVITY:TYPE%] | COMPLETE, SCREENOUT, RECONCILIATION o START_BONUS |
| [%REF%] | En una reconciliación, la transacción original que se retira |
Las integraciones antiguas usan las formas cortas [%UID%], [%VAL%] y [%RAW%]; la documentación actual de BitLabs usa los nombres de arriba. Una reversión llega como un callback de tipo RECONCILIATION: añade [%REF%] para saber qué recompensa revierte.
BitLabs adjunta un hash a cada callback: un HMAC SHA-1 de la URL completa, en hexadecimal, con tu clave secreta de la app. Como cubre toda la URL, verifícalo antes de leer o modificar nada y usa la URL exactamente como llegó.
Lo que debe hacer todo endpoint de postback
- Verifica la firma con el método de ese offerwall y rechaza la petición si no coincide.
- Acredita cada ID de transacción una sola vez. Los offerwalls reintentan cuando tu servidor tarda; un índice único sobre el ID de transacción hace inofensivo el reintento.
- Trata las reversiones. Ten claro qué valor significa reversión en cada offerwall (status 0 en Lootably, state rejected en AdGate, status 2 en CPX Research, tipo RECONCILIATION en BitLabs) y retira la recompensa, o retenla si aún no se ha retirado.
- Responde rápido con la respuesta que espera el offerwall, y deja el trabajo lento para después de contestar.
- Comprueba a la persona, no solo la petición. Un postback bien firmado puede pagar igualmente a una granja: diez cuentas en un mismo móvil, una VPN para parecer de EE. UU., una oferta terminada más rápido de lo que nadie podría jugarla.
Ese último punto es el que ninguna firma cubre. Mira cómo detectar multicuentas en un sitio de recompensas y cómo frenar el fraude con VPN en offerwalls para ver cómo es el fraude que llega con la firma correcta.
Prueba tu endpoint antes de salir en vivo
Cuatro peticiones te dicen si un endpoint está listo. Envíalas tú mismo con curl o desde el navegador, con un usuario de prueba y valores inventados:
- Una conversión normal. El usuario de prueba recibe el saldo una sola vez, en tu moneda.
- La misma petición otra vez. No cambia nada: el ID de transacción ya existe, y tu endpoint sigue respondiendo con éxito para que el offerwall deje de reintentar.
- Una reversión con el valor de estado de ese offerwall. La recompensa se retira o se retiene, y el historial de la cuenta muestra por qué.
- Un hash incorrecto. La petición se rechaza y no se acredita nada.
Si alguna de las cuatro se comporta de otra forma, corrígela antes de activar el offerwall: cada una es una vía por la que se escapa dinero real.
Revisar cada postback sin programar
El relé de postback de CashoutGuard se coloca entre el offerwall y tu endpoint. Pegas tu URL de postback actual, te da una nueva para poner en el offerwall, y cada conversión se puntúa por VPN, emuladores, móviles en la nube y cuentas vinculadas antes de llegarte. Lee las macros de arriba aunque tus parámetros tengan nombres cortos como ?a={userID}&b={transactionID}, y aprende de las reversiones que llegan con un valor de estado, así que cada contracargo mejora la siguiente decisión.