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 preciosTe 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.
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/jsonEl equipo de Annual Ads emite las claves API a las cuentas de socios autorizadas.
Crear una cuenta de socio| POST | /v1/partner/advertisersCrea 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 |
| POST | /v1/partner/adsCrea 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}/imageSube 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-urlConfigura 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}/rankPosición actual, categoría y ámbito geográfico de un anuncio. | ads:read |
| GET | /v1/partner/ads/{id}/statsEl 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 |
| POST | /v1/partner/paymentsInicia 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 |
| POST | /v1/partner/referralsCrea un enlace de recomendación. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsGanancias acumuladas por recomendaciones, desglosadas por estado. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsTu 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 |
| GET | /v1/partner/access-logHistorial completo de llamadas para esta clave: método, ruta, IP, marca de tiempo. | Cualquiera |
| 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/tiersLos 7 niveles de precios configurados (umbral, ventajas desbloqueadas). | Público |
| GET | /v1/referral-programLos porcentajes de comisión vigentes actualmente para la cascada de recomendaciones y el «Leaders Pool». | Público |
| GET | /v1/partner-programEl 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.
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.
| POST | /v1/advertisers/{id}/ai/assistantPregunta 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-studioGenera 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/imageGenera 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-advisorUna 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-auditAnalizar la página web externa del anunciante y sugerir mejoras concretas en materia de SEO. | 2 crédito(s) |
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
}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.
<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>data-category | ID 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-count | Número de anuncios que se mostrarán. El valor predeterminado es 4. |
data-columns | Número de columnas de la tabla. El valor por defecto es 2. |
data-layout | cuadrí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-offset | Nú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-partner | Tu 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. |
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.
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.
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.succeeded | Se ha confirmado un pago. |
payment.refunded | Se ha realizado un reembolso. |
ad.activated | Un anuncio se publica, ya sea de forma automática o tras la revisión de un administrador. |
invoice.issued | Se emite una factura. |
referral.payout.completed | Una comisión por recomendación pasa al estado «pagada». |
referral.payout.failed | Un 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.changed | La posición de un anuncio cambia, incluso cuando ello se debe al pago de otro anunciante. |
ad.expiring_soon | 30, 7 o 1 día(s) antes de que caduque un anuncio. |
partner_ad_revenue.payout.completed | Un pago por participación en los ingresos publicitarios pasa a tener el estado «pagado». |
partner_ad_revenue.payout.failed | Un 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. |
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.
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": "...",
},
)