Développez directement sur la plateforme Annual Ads : créez des annonceurs, publiez des annonces, déclenchez des paiements et suivez le classement, le tout via l'API.
Consultez le barème tarifaire completVous conservez 70 % d’une partie des sommes versées par vos annonceurs en mode Connect pour leurs publicités — versée automatiquement sur votre portefeuille. Découvrez ci-dessous comment cela fonctionne.
Chaque requête est authentifiée à l'aide d'une clé secrète figurant dans l'en-tête « Authorization », selon le schéma « Bearer ».
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonLes clés API sont attribuées aux comptes des partenaires agréés par l'équipe Annual Ads.
Créer un compte partenaire| POST | /v1/partner/advertisersCréez un compte annonceur au nom de l'un de vos utilisateurs (mode « Connect »). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Rechercher un compte annonceur créé par ce partenaire. | advertisers:read |
| POST | /v1/partner/adsCréez une annonce. Elle apparaît d'abord en statut « brouillon ». Les champs facultatifs `advertiser_type`, `promotion_type`, `link_type` et `promoted_brand` permettent de préciser s'il s'agit d'une publicité d'affiliation, de parrainage, de créateur ou individuelle — voir la remarque ci-dessous. | ads:write |
| GET | /v1/partner/ads/{id}Consulter une annonce. | ads:read |
| PATCH | /v1/partner/ads/{id}Mettre à jour le contenu éditorial : titre, description, lien, type d'annonceur, type de promotion, type de lien et marque promue. La catégorie, la zone géographique et tout autre élément pris en compte par le moteur de classement ne peuvent en aucun cas être modifiés ici. | ads:write |
| POST | /v1/partner/ads/{id}/imageTéléchargez directement une image pour votre annonce (JPEG/PNG/WebP, 5 Mo max.). Cette étape est obligatoire avant le premier paiement — voir la section « Paiements » ci-dessous. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlDéfinissez l'image d'une annonce à partir d'une URL plutôt que de télécharger un fichier : le serveur la récupère et la réhéberge lui-même. Même condition : à remplir avant le premier paiement. | ads:write |
| GET | /v1/partner/ads/{id}/rankClassement actuel, catégorie et zone géographique d'une annonce. | ads:read |
| GET | /v1/partner/ads/{id}/statsLe nombre total d'impressions et de clics pour une annonce, ainsi que le nombre de jours écoulés ou restants, proviennent des champs `activated_at` et `expires_at` déjà présents dans la requête GET /{id}, tandis que le classement provient de la requête GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsLancez un paiement en cryptomonnaie pour un premier achat ou une recharge. Un premier paiement échoue avec le code d'erreur 422 à moins que l'annonce ne comporte déjà une image — voir les méthodes uploadAdImage/setAdImageUrl ci-dessus. | payments:write |
| GET | /v1/partner/payments/{id}Vérifier le statut d'un paiement. | payments:read |
| POST | /v1/partner/referralsCréer un lien de parrainage. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsRémunérations cumulées issues du parrainage, ventilées par statut. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsVotre part de 70 % du montant versé par les annonceurs que vous avez créés en mode Connect pour leurs publicités, ventilée par statut. | ad-revenue:read |
| GET | /v1/partner/access-logHistorique complet des appels pour cette clé : méthode, chemin d'accès, adresse IP, horodatage. | N'importe quel |
| GET | /v1/rankings?category={id}&geo={scope}Classement en lecture seule pour une catégorie et une zone géographique. | Public |
| GET | /v1/tiersLes 7 niveaux tarifaires définis (seuil, avantages débloqués). | Public |
| GET | /v1/referral-programLes taux de commission actuellement en vigueur pour le programme de parrainage en cascade et le « Leaders Pool ». | Public |
| GET | /v1/partner-programLa répartition actuelle des recettes publicitaires (mode Connect) entre vous et Annual Ads. | Public |
| GET | /v1/search?q={query}Recherche en langage naturel : elle achemine une requête telle que « annonceurs de mobilier au Kenya » vers la catégorie et la zone géographique correspondantes, puis renvoie ce classement, dans son ordre exact tel qu'il apparaît réellement. | Public |
Publicité d'affiliation et de parrainage
advertiser_type, promotion_type, link_type et promoted_brand sont des champs facultatifs pour les requêtes POST et PATCH sur /v1/partner/ads — Annual Ads ne se limite pas aux entreprises qui font leur propre publicité. Lorsque link_type vaut affiliate_link ou referral_invitation_link, ou que promotion_type vaut affiliate_offer ou referral_opportunity, affiliate_terms_accepted doit être défini sur true, sinon la requête est rejetée avec un code d'erreur 422. Le champ « title » est limité à 35 caractères et le champ « description » à 80 — ces limites sont appliquées côté serveur, et pas uniquement dans l’interface utilisateur du tableau de bord.
Chaque compte publicitaire dispose d'un ensemble d'outils d'IA intégrés — un générateur de contenu et d'éléments visuels publicitaires, un assistant conversationnel, un conseiller en budget et un outil d'audit SEO externe — financés par des crédits IA, en plus du forfait annuel.
| POST | /v1/advertisers/{id}/ai/assistantAsk Annual Ads — un assistant conversationnel flottant, à titre purement informatif, avec un accès en lecture seule aux données du compte. | Public |
| POST | /v1/advertisers/{id}/ai/creative-studioGénérer un titre, une description et des mots-clés pour une annonce à partir d'une brève présentation de l'entreprise. | 2 crédit(s) |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageGénérer une image de présentation (PNG) à partir de cette même description d'entreprise, hébergée et prête à être jointe à une annonce. | 8 crédit(s) |
| POST | /v1/advertisers/{id}/ai/budget-advisorUne véritable projection statistique — et en aucun cas une estimation approximative — des probabilités de conserver un rang donné à 30, 90 et 365 jours. | 1 crédit(s) |
| POST | /v1/advertisers/{id}/ai/seo-auditAnalyser le site web externe de l'annonceur et proposer des améliorations concrètes en matière de référencement naturel (SEO). | 2 crédit(s) |
La même catégorie et la même description d'activité alimentent également le générateur d'images ci-dessous.
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
}Créer un visuel correspondant à cette même publicité :
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
}Ajoutez un bloc publicitaire prêt à l'emploi sur votre site — sans aucune étape de création, ni iframe. Le script s'affiche directement dans la page au sein d'un Shadow DOM isolé ; ainsi, ses styles n'interfèrent jamais avec ceux de votre site, et inversement.
<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>Par défaut, cela affiche le classement public complet de la catégorie, c'est-à-dire tous les annonceurs de la plateforme, et pas seulement ceux que vous avez recrutés. Pour n'afficher que les publicités des annonceurs que vous avez créés via le mode Connect (ceux qui génèrent votre commission), ajoutez « data-partner » suivi de votre identifiant de partenaire (que vous trouverez sur la page « Développeurs » de votre tableau de bord) :
<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 vos annonceurs appartiennent à plusieurs catégories, supprimez complètement « data-category » : en utilisant uniquement « data-partner », le widget affiche toutes vos publicités, toutes catégories confondues, dans une seule grille, ce qui vous évite d'avoir à créer un bloc de widget par catégorie :
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>Vous souhaitez afficher un bloc de type « pied de page » en plus de celui intégré au contenu, chacun présentant des publicités différentes ? Ajoutez un deuxième bloc de widgets avec l'attribut data-layout="compact" (une seule publicité, pouvant être réduite en une petite bulle) et l'attribut data-offset défini sur le nombre de publicités déjà affichées par votre premier 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 catégorie à afficher. Obligatoire — sauf si le paramètre « data-partner » est défini, auquel cas son omission entraîne l'affichage des publicités de ce partenaire dans toutes les catégories. |
data-geo | Portée géographique : locale, régionale ou mondiale. La valeur par défaut est « mondiale ». |
data-count | Nombre d'annonces à afficher. Valeur par défaut : 4. |
data-columns | Nombre de colonnes de la grille. La valeur par défaut est 2. |
data-layout | « grid », « list » ou « compact ». La valeur par défaut est « grid ». L'option « compact » affiche une seule annonce (la valeur « data-count » est ignorée) accompagnée d'un bouton permettant de la réduire en une petite vignette et de la réafficher — il s'agit d'un élément de type pied de page qui n'est jamais positionné de manière fixe par le script lui-même ; vous pouvez donc placer et styliser la balise div contenante comme bon vous semble sur votre propre page. |
data-offset | Nombre d'annonces les mieux classées à ignorer. La valeur par défaut est 0. Permet à un deuxième widget sur la même page (par exemple, un widget compact dans le pied de page et un widget en grille plus haut) d'afficher des annonces différentes au lieu de répéter deux fois la même — indiquez le nombre d'annonces que l'autre widget affiche déjà. |
data-partner | Votre identifiant de partenaire (vous le trouverez sur la page « Développeurs » de votre tableau de bord). Facultatif : sans cet identifiant, le widget affiche le classement public complet de cette catégorie, c'est-à-dire tous les annonceurs présents sur la plateforme. Avec cet identifiant, seules s'affichent les publicités des annonceurs que vous avez recrutés via le mode Connect, c'est-à-dire celles qui génèrent effectivement votre commission. |
Le nombre de requêtes est plafonné par clé et par minute. Chaque réponse authentifiée comporte les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset ; tout dépassement de la limite entraîne le retour du code d'erreur 429 « Too Many Requests » accompagné d'un en-tête Retry-After.
Facultatif, par partenaire. Tant que vous n’avez pas ajouté d’entrée, vos clés acceptent les requêtes provenant de n’importe quelle adresse IP ; la première entrée fait passer toutes les clés de ce partenaire en mode « liste blanche uniquement ».
Chaque webhook est signé à l'aide de l'algorithme HMAC-SHA256, avec une clé secrète générée une seule fois, au moment de sa création. Il convient de vérifier la signature avant de considérer la charge utile comme fiable. Les événements ne sont transmis qu'au partenaire auquel appartient l'annonceur concerné.
payment.succeeded | Un paiement a été validé. |
payment.refunded | Un remboursement a été effectué. |
ad.activated | Une annonce est mise en ligne, soit automatiquement, soit après vérification par un administrateur. |
invoice.issued | Une facture est émise. |
referral.payout.completed | Une commission de parrainage est considérée comme versée. |
referral.payout.failed | Un lot de paiements liés aux parrainages échoue chez le prestataire — les gains sont replacés dans le compte « À payer » et font l'objet d'une nouvelle tentative. |
rank.changed | Le classement d'une annonce évolue, notamment lorsque le paiement effectué par un autre annonceur en est la cause. |
ad.expiring_soon | 30, 7 ou 1 jour(s) avant l'expiration d'une annonce. |
partner_ad_revenue.payout.completed | Un versement au titre de la participation aux recettes publicitaires passe au statut « payé ». |
partner_ad_revenue.payout.failed | Un lot de paiements au titre du partage des recettes publicitaires échoue chez le fournisseur — les montants reviennent dans le compte des créances et font l'objet d'une nouvelle tentative. |
Des SDK officiels pour JavaScript/TypeScript et Python, générés à partir de cette même spécification d'API, sont prévus mais n'ont pas encore été publiés ; d'ici là, veuillez vous connecter directement à l'API HTTP.
Il n'y a pas encore de SDK : ces outils appellent directement l'API HTTP et fonctionnent dès aujourd'hui dans n'importe quel langage.
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": "...",
},
)