Annual Ads

Documentación para desarrolladores

Desarrolla directamente en la plataforma Annual Ads: crea anunciantes, publica anuncios, procesa pagos y realiza un seguimiento de la posición en los resultados de búsqueda, todo ello a través de la API.

Consulta la tabla completa de precios

Te quedas con el 70 % de lo que pagan tus anunciantes en modo Connect por sus anuncios, que se ingresa automáticamente en tu monedero. A continuación te explicamos cómo funciona.

URL base

https://api.adhub365.com
OpenAPI 3

Autenticación

Cada solicitud se autentica mediante una clave secreta incluida en el encabezado «Authorization», utilizando el esquema «Bearer».

POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/json

Entorno de pruebas y entorno de producción

Las claves del entorno de pruebas y de producción están totalmente aisladas entre sí: una clave del entorno de pruebas nunca puede leer ni escribir datos creados por una clave de producción, y viceversa.

Ámbitos de aplicación

Cada clave está limitada a los ámbitos para los que se ha emitido; una clave nunca tiene más acceso que la cuenta asociada que la ha creado.

El equipo de Annual Ads emite las claves API a las cuentas de socios autorizadas.

Crear una cuenta de socio

Reparto de ingresos publicitarios

Si tus claves API crean cuentas de anunciante para tus propios usuarios (modo «Connect»; véase «Autenticación» más arriba), obtendrás una parte de lo que esos anunciantes paguen por sus anuncios. El reparto que se indica a continuación se lee en tiempo real desde este mismo punto final, nunca está codificado de forma fija, y es totalmente independiente de la comisión por recomendación que aparece más abajo en esta página.

GET https://api.adhub365.com/v1/partner-program
{
  "partner_share_percentage": 0.7,
  "platform_share_percentage": 0.3
}

70%

Te toca a ti

Se ingresa automáticamente en tu monedero de pagos configurado; no es necesario solicitar ningún retiro.

30%

Se incluye en los anuncios anuales

Abarca la moderación, el alojamiento y la infraestructura de clasificación en la que se publican tus anuncios.

Cómo funciona

  1. Uno de tus anunciantes del modo «Connect» paga por un anuncio a través de tu integración.
  2. El anuncio se revisa y se aprueba, ya sea de forma automática o por nuestro equipo de moderación.
  3. Tu participación está en cola para su pago automático a tu monedero, siguiendo el mismo mecanismo que el programa de recomendación que se describe a continuación.
Nunca se genera una participación antes de que el anuncio se apruebe realmente; si el equipo de moderación lo rechaza, no se adeuda nada de ese pago. Una recarga en un anuncio ya activo no conlleva ese riesgo y se reparte de inmediato.

Condiciones de pago

  • Se ha configurado un monedero para pagos en criptomonedas en tu cuenta de socio.
  • No es necesario que realices ningún proceso de KYC: tu cuenta de socio ya ha sido verificada en el momento de su creación.

Ejemplo: lectura de acciones acumuladas

GET https://api.adhub365.com/v1/partner/ad-revenue/earnings
Authorization: Bearer sk_sandbox_...
{
  "shares": [
    {
      "id": "share_1a2b...",
      "payment_id": "pay_9f2a...",
      "ad_id": "ad_7c31...",
      "partner_amount_usd": 140.0,
      "platform_amount_usd": 60.0,
      "status": "paid",
      "payable_after": "2026-08-03T00:00:00Z",
      "paid_at": "2026-08-05T10:12:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 140.0
}

Puntos finales

Cuentas

POST/v1/partner/advertisers

Crea una cuenta de anunciante en nombre de uno de tus usuarios (modo «Connect»).

advertisers:write
GET/v1/partner/advertisers/{id}

Busca una cuenta de anunciante creada por este socio.

advertisers:read

Anuncios

POST/v1/partner/ads

Crea un anuncio. Al principio, aparecerá como «borrador». Los campos opcionales «advertiser_type», «promotion_type», «link_type» y «promoted_brand» describen si se trata de publicidad de afiliados, de recomendación, de creadores o individual; consulta la nota que aparece a continuación.

ads:write
GET/v1/partner/ads/{id}

Busca un anuncio.

ads:read
PATCH/v1/partner/ads/{id}

Actualizar el contenido editorial: título, descripción, enlace, tipo de anunciante, tipo de promoción, tipo de enlace y marca promocionada. La categoría, la zona geográfica y cualquier dato que tenga en cuenta el motor de clasificación no se pueden modificar aquí.

ads:write
POST/v1/partner/ads/{id}/image

Sube directamente una imagen del anuncio (JPEG/PNG/WebP, máximo 5 MB). Es obligatorio antes del primer pago; consulta la sección sobre pagos más abajo.

ads:write
POST/v1/partner/ads/{id}/image-url

Configura la imagen de un anuncio a partir de una URL en lugar de subir un archivo: el servidor la descarga y la aloja por sí mismo. El mismo requisito: hay que hacerlo antes del primer pago.

ads:write
GET/v1/partner/ads/{id}/rank

Posición actual, categoría y ámbito geográfico de un anuncio.

ads:read
GET/v1/partner/ads/{id}/stats

El total de visualizaciones y clics de un anuncio —los días transcurridos y restantes— proceden de los campos «activated_at» y «expires_at» que ya figuran en GET /{id}, y la posición, de GET /{id}/rank.

ads:read

Pagos

POST/v1/partner/payments

Inicia un pago con criptomonedas para una compra inicial o una recarga. El pago inicial fallará con el código de error 422 a menos que el anuncio ya tenga una imagen; consulta «uploadAdImage/setAdImageUrl» más arriba.

payments:write
GET/v1/partner/payments/{id}

Comprueba el estado de un pago.

payments:read

Recomendaciones

POST/v1/partner/referrals

Crea un enlace de recomendación.

referrals:write
GET/v1/partner/referrals/{code}/earnings

Ganancias acumuladas por recomendaciones, desglosadas por estado.

referrals:read

Reparto de ingresos publicitarios

GET/v1/partner/ad-revenue/earnings

Tu participación del 70 % de lo que los anunciantes que has creado en el modo «Connect» han pagado por sus anuncios, desglosada por estado.

ad-revenue:read

Registro de acceso

GET/v1/partner/access-log

Historial completo de llamadas para esta clave: método, ruta, IP, marca de tiempo.

Cualquiera

Puntos finales públicos

GET/v1/rankings?category={id}&geo={scope}

Clasificación de solo lectura para una categoría y un ámbito geográfico.

Público
GET/v1/tiers

Los 7 niveles de precios configurados (umbral, ventajas desbloqueadas).

Público
GET/v1/referral-program

Los porcentajes de comisión vigentes actualmente para la cascada de recomendaciones y el «Leaders Pool».

Público
GET/v1/partner-program

El reparto actual de los ingresos publicitarios (modo Connect) entre tú y Annual Ads.

Público
GET/v1/search?q={query}

Búsqueda en lenguaje natural: dirige una consulta como «anunciantes de muebles en Kenia» a la categoría y el ámbito geográfico correspondientes, y a continuación muestra los resultados ordenados tal y como aparecen en la clasificación real.

Público

Publicidad de afiliados y de recomendación

advertiser_type, promotion_type, link_type y promoted_brand son campos opcionales en las solicitudes POST y PATCH a /v1/partner/ads: Annual Ads no se limita a las empresas que se anuncian a sí mismas. Cuando link_type es affiliate_link o referral_invitation_link, o promotion_type es affiliate_offer o referral_opportunity, affiliate_terms_accepted debe ser «true»; de lo contrario, la solicitud se rechaza con un código 422. El título tiene un límite de 35 caracteres y la descripción, de 80; ambos límites se aplican del lado del servidor, no solo en la interfaz de usuario del panel de control.

Herramientas de IA

Cada cuenta de anunciante dispone de un conjunto de herramientas de IA integradas —un generador de contenido y elementos visuales para anuncios, un asistente conversacional, un asesor de presupuesto y un auditor externo de SEO— que se pagan con créditos de IA, además de la tarifa plana anual.

Estas funciones se ejecutan a través del inicio de sesión en el panel de control del anunciante (un token de acceso de sesión), y no mediante una clave API de socio; por lo tanto, una integración de terceros no puede invocarlas en nombre del anunciante.
POST/v1/advertisers/{id}/ai/assistant

Pregunta a Annual Ads: un asistente conversacional flotante, de carácter meramente informativo y con acceso de solo lectura a los datos de la cuenta.

Público
POST/v1/advertisers/{id}/ai/creative-studio

Genera el título, la descripción y las palabras clave de un anuncio a partir de una breve descripción de la empresa.

2 crédito(s)
POST/v1/advertisers/{id}/ai/creative-studio/image

Genera una imagen del anuncio (PNG) a partir de la misma descripción de la empresa, alojada y lista para adjuntarla a un anuncio.

8 crédito(s)
POST/v1/advertisers/{id}/ai/budget-advisor

Una proyección estadística real —nunca una estimación aproximada— de las probabilidades de mantener una posición determinada a los 30, 90 y 365 días.

1 crédito(s)
POST/v1/advertisers/{id}/ai/seo-audit

Analizar la página web externa del anunciante y sugerir mejoras concretas en materia de SEO.

2 crédito(s)

Ejemplo: generar contenido publicitario

Esa misma categoría y descripción de la actividad también sirven de base para el generador de imágenes que aparece a continuación.

POST https://api.adhub365.com/v1/advertisers/{advertiser_id}/ai/creative-studio
Authorization: Bearer <session access token>
Content-Type: application/json

{
  "category_name": "Furniture",
  "business_description": "We sell handmade oak dining tables"
}
{
  "title": "Handmade Oak Dining Tables — Built to Last",
  "description": "Solid oak dining tables crafted by hand, built to last a lifetime.",
  "keywords": ["oak furniture", "dining table", "handmade"],
  "credits_remaining": 8
}

Genera un elemento visual a juego para el mismo anuncio:

POST https://api.adhub365.com/v1/advertisers/{advertiser_id}/ai/creative-studio/image
Authorization: Bearer <session access token>
Content-Type: application/json

{
  "category_name": "Furniture",
  "business_description": "We sell handmade oak dining tables"
}
{
  "visual_url": "https://cdn.uploadscenter.com/file_01m1...",
  "credits_remaining": 4
}

Widget

Inserta un bloque publicitario ya preparado en tu propia web: sin necesidad de programarlo ni de utilizar iframes. El script se muestra directamente en la página dentro de un Shadow DOM aislado, por lo que sus estilos nunca se filtran a tu web, y los estilos de tu web nunca se filtran al bloque publicitario.

Añádelo a tu página

<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-count="4"
  data-columns="2"
></div>
<script async src="https://adhub365.com/widget.js"></script>

De forma predeterminada, se muestra la clasificación pública completa de la categoría: todos los anunciantes de la plataforma, no solo los que tú has incorporado. Para mostrar únicamente los anuncios de los anunciantes que has creado a través del modo Connect (los que generan tu participación), añade «data-partner» junto con tu ID de socio (lo encontrarás en la página «Desarrolladores» de tu propio panel de control):

<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>

Si tus anunciantes abarcan varias categorías, elimina por completo «data-category»: con solo «data-partner», el widget muestra todos tus anuncios de todas las categorías en una sola cuadrícula, en lugar de necesitar un bloque de widget por categoría:

<div
  class="annualads-widget"
  data-geo="global"
  data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>

¿Quieres un bloque de estilo pie de página junto al que ya tienes en el contenido, de modo que cada uno muestre anuncios diferentes? Añade un segundo bloque de widgets con data-layout="compact" (un único anuncio, que se puede contraer en un pequeño recuadro) y data-offset establecido en el número de anuncios que ya muestra tu primer widget:

<!-- in your content -->
<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-count="4"
  data-columns="2"
></div>

<!-- in your footer, showing different ads via data-offset -->
<div
  class="annualads-widget"
  data-category="YOUR_CATEGORY_ID"
  data-geo="global"
  data-layout="compact"
  data-offset="4"
></div>
<script async src="https://adhub365.com/widget.js"></script>

Atributos

data-categoryID de la categoría que se va a mostrar. Obligatorio, salvo que se haya establecido un «data-partner»; en ese caso, si se omite, se mostrarán los anuncios de ese socio en todas las categorías.
data-geoÁmbito geográfico: local, regional o mundial. El valor predeterminado es «mundial».
data-countNúmero de anuncios que se mostrarán. El valor predeterminado es 4.
data-columnsNúmero de columnas de la tabla. El valor por defecto es 2.
data-layoutcuadrícula, lista o compacto. El valor predeterminado es «cuadrícula». La opción «compacto» muestra un único anuncio (se ignora el atributo «data-count») con un botón para ocultarlo en un pequeño recuadro y volver a mostrarlo; se trata de un elemento de estilo pie de página que el script nunca posiciona de forma fija, por lo que puedes colocar y aplicar el estilo al div contenedor como prefieras en tu propia página.
data-offsetNúmero de anuncios mejor posicionados que se deben omitir. El valor predeterminado es 0. Permite que un segundo widget en la misma página (por ejemplo, uno compacto en el pie de página y otro en forma de cuadrícula más arriba) muestre anuncios diferentes en lugar de repetir el mismo dos veces; indica el número de anuncios que ya muestra el otro widget.
data-partnerTu ID de socio (lo encontrarás en la página «Desarrolladores» de tu panel de control). Opcional: sin él, el widget muestra la clasificación pública completa de esa categoría, es decir, todos los anunciantes de la plataforma. Con él, solo se muestran los anuncios de los anunciantes que hayas captado a través del modo Connect, es decir, aquellos que realmente generan tu participación.

Participación en los ingresos

Cómo se abona realmente a un colaborador la comisión por recomendación: el porcentaje, el mecanismo de pago y las condiciones previas.

GET https://api.adhub365.com/v1/referral-program
{
  "levels": [
    {
      "level": 1,
      "percentage": 0.1
    }
  ],
  "leaders_pool_percentage_of_gmv": 0.05,
  "founding_advertiser_pool_percentage_of_gmv": 0.05,
  "payout_verification_window_hours": 48,
  "min_payout_usd": 1
}

No es un número fijo

El porcentaje de comisión lo configuramos nosotros y puede variar; por lo tanto, compruébalo siempre en tiempo real desde este punto de acceso, en lugar de introducir un valor fijo.

Totalmente automático

No hay un plazo límite para el cobro. Una tarea programada calcula las ganancias a cobrar, las agrupa por anunciante y las abona automáticamente una vez que se cumplen todas las condiciones que se indican a continuación.

Condiciones de pago

  • Los ingresos totales a cobrar del anunciante alcanzan el importe mínimo de pago.
  • Se ha configurado una cartera de pagos en criptomonedas en su cuenta.
  • Se ha verificado su estado de KYC.

Ejemplo: consulta de los ingresos acumulados

GET https://api.adhub365.com/v1/partner/referrals/{code}/earnings
Authorization: Bearer sk_sandbox_...
{
  "code": "ann-2f8c",
  "earnings": [
    {
      "id": "earn_1a2b...",
      "payment_id": "pay_9f2a...",
      "amount_usd": 30.0,
      "status": "paid",
      "payable_after": "2026-08-01T00:00:00Z",
      "paid_at": "2026-08-03T14:22:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 30.0
}

Niveles de precios (activos)

Lee los datos en tiempo real desde este punto final; nunca introduzcas estos valores de forma fija, ya que pueden cambiar por nuestra parte. Crea un selector de planes para tus propios usuarios en lugar de un campo de importe libre: cada precio que se muestra es ya la cantidad exacta que hay que enviar al realizar el pago, y las ventajas desbloqueadas que se muestran aquí indican a los usuarios exactamente qué obtienen por ese precio, de modo que elijan un precio que entiendan en lugar de tener que adivinar una cifra.

NivelPrecioDesbloqueos
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Enlace en el que se puede hacer clic
Gold$500.00

Animation unlocked

Enlace en el que se puede hacer clicAnimación
Platinum$1,000.00

Enhanced exposure

Enlace en el que se puede hacer clicAnimación
Diamond$2,500.00

Premium placement

Enlace en el que se puede hacer clicAnimación
Elite$5,000.00

Top-tier visibility

Enlace en el que se puede hacer clicAnimación
Legendary$10,000.00

Maximum visibility & branding

Enlace en el que se puede hacer clicAnimación

Límites de frecuencia

Las solicitudes están limitadas por clave y por minuto. Cada respuesta autenticada incluye los encabezados X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset; si se supera el límite, se devuelve el código de error 429 «Too Many Requests» junto con el encabezado Retry-After.

Lista de direcciones IP autorizadas

Opcional, por socio. Hasta que añadas una entrada, tus claves aceptan solicitudes desde cualquier dirección IP; la primera entrada cambia todas las claves de ese socio para que solo acepten direcciones de la lista blanca.

Webhooks

Cada webhook se firma con HMAC-SHA256 utilizando un secreto que se genera una sola vez, en el momento de su creación; comprueba la firma antes de dar por válida la carga útil. Los eventos se envían únicamente al socio al que pertenece el anunciante correspondiente.

payment.succeededSe ha confirmado un pago.
payment.refundedSe ha realizado un reembolso.
ad.activatedUn anuncio se publica, ya sea de forma automática o tras la revisión de un administrador.
invoice.issuedSe emite una factura.
referral.payout.completedUna comisión por recomendación pasa al estado «pagada».
referral.payout.failedUn lote de pagos por recomendaciones falla en el proveedor: los ingresos vuelven a la cuenta de cuentas por pagar y se vuelve a intentar el pago.
rank.changedLa posición de un anuncio cambia, incluso cuando ello se debe al pago de otro anunciante.
ad.expiring_soon30, 7 o 1 día(s) antes de que caduque un anuncio.
partner_ad_revenue.payout.completedUn pago por participación en los ingresos publicitarios pasa a tener el estado «pagado».
partner_ad_revenue.payout.failedUn lote de pagos de participación en los ingresos publicitarios falla en el proveedor; las participaciones vuelven a la cuenta de cuentas por pagar y se vuelve a intentar el pago.

SDK

Se prevé la publicación de los SDK oficiales de JavaScript/TypeScript y Python, generados a partir de esta misma especificación de la API, pero aún no se han publicado; hasta entonces, utiliza directamente la API HTTP.

Inicio rápido

Aún no hay ningún SDK: estas funciones llaman directamente a la API HTTP y funcionan ya mismo en cualquier lenguaje de programación.

cURL

curl -X POST https://api.adhub365.com/v1/partner/ads \
  -H "Authorization: Bearer sk_sandbox_..." \
  -H "Content-Type: application/json" \
  -d '{"advertiser_id":"adv_9f2a...","category_id":"cat_furniture","geo_scope":"local","title":"..."}'

JavaScript

await fetch("https://api.adhub365.com/v1/partner/ads", {
  method: "POST",
  headers: {
    Authorization: "Bearer sk_sandbox_...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    advertiser_id: "adv_9f2a...",
    category_id: "cat_furniture",
    geo_scope: "local",
    title: "...",
  }),
});

Python

import requests

requests.post(
    "https://api.adhub365.com/v1/partner/ads",
    headers={"Authorization": "Bearer sk_sandbox_..."},
    json={
        "advertiser_id": "adv_9f2a...",
        "category_id": "cat_furniture",
        "geo_scope": "local",
        "title": "...",
    },
)