Bouw rechtstreeks op het Annual Ads-platform — maak adverteerders aan, publiceer advertenties, initieer betalingen en houd de positie bij, volledig via de API.
Bekijk het volledige prijsoverzichtJe behoudt 70% van wat je adverteerders in de Connect-modus voor hun advertenties betalen — dit bedrag wordt automatisch naar je portemonnee overgemaakt. Bekijk hieronder hoe het werkt.
Elk verzoek wordt geverifieerd met een geheime sleutel in de Authorization-header, waarbij gebruik wordt gemaakt van het Bearer-schema.
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonAPI-sleutels worden door het Annual Ads-team verstrekt aan goedgekeurde partneraccounts.
Een partneraccount aanmaken| POST | /v1/partner/advertisersMaak een adverteerdersaccount aan namens een van uw gebruikers (Connect-modus). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Zoek een adverteerdersaccount op dat door deze partner is aangemaakt. | advertisers:read |
| POST | /v1/partner/adsMaak een advertentie aan. Deze krijgt aanvankelijk de status ‘concept’. De optionele velden `advertiser_type`, `promotion_type`, `link_type` en `promoted_brand` geven aan of het gaat om affiliate-, referral-, creator- of individuele advertenties — zie de opmerking hieronder. | ads:write |
| GET | /v1/partner/ads/{id}Zoek een advertentie op. | ads:read |
| PATCH | /v1/partner/ads/{id}Redactionele inhoud bijwerken — titel, beschrijving, link, type adverteerder, type promotie, type link en gepromoot merk. Categorie, regio en alle gegevens die door het ranking-systeem worden gelezen, kunnen hier nooit worden gewijzigd. | ads:write |
| POST | /v1/partner/ads/{id}/imageUpload direct een advertentieafbeelding (JPEG/PNG/WebP, max. 5 MB). Dit is vereist vóór de eerste betaling — zie het gedeelte over betalingen hieronder. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlStel de afbeelding van een advertentie in via een URL in plaats van een bestand te uploaden — de server haalt de afbeelding zelf op en host deze opnieuw. Dezelfde vereiste geldt: dit moet gebeuren vóór de eerste betaling. | ads:write |
| GET | /v1/partner/ads/{id}/rankHuidige positie, categorie en geografisch bereik van een advertentie. | ads:read |
| GET | /v1/partner/ads/{id}/statsHet totale aantal weergaven en klikken voor een advertentie — het aantal verstreken/resterende dagen is afkomstig uit de velden `activated_at` en `expires_at` die al in GET /{id} staan, en de positie is afkomstig uit GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsStart een cryptobetaling voor een eerste aankoop of een herlaadbeurt. Een eerste betaling mislukt met foutcode 422, tenzij de advertentie al een afbeelding bevat — zie uploadAdImage/setAdImageUrl hierboven. | payments:write |
| GET | /v1/partner/payments/{id}De status van een betaling controleren. | payments:read |
| POST | /v1/partner/referralsMaak een verwijzingslink aan. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsCumulatieve inkomsten uit doorverwijzingen, uitgesplitst naar status. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsUw aandeel van 70% in het bedrag dat de adverteerders die u in de Connect-modus hebt aangemaakt, voor hun advertenties hebben betaald, uitgesplitst naar status. | ad-revenue:read |
| GET | /v1/partner/access-logVolledig overzicht van de oproepen voor deze sleutel — methode, pad, IP-adres, tijdstempel. | Daar |
| GET | /v1/rankings?category={id}&geo={scope}Een alleen-lezen ranglijst voor een categorie en een geografisch bereik. | Openbaar |
| GET | /v1/tiersDe 7 geconfigureerde prijsniveaus (drempel, ontgrendelde extra’s). | Openbaar |
| GET | /v1/referral-programDe commissiepercentages die momenteel gelden voor de doorverwijzingscascade en de Leaders Pool. | Openbaar |
| GET | /v1/partner-programDe huidige verdeling van de advertentie-inkomsten (Connect-modus) tussen jou en Annual Ads. | Openbaar |
| GET | /v1/search?q={query}Zoeken in natuurlijke taal — leidt een zoekopdracht zoals "meubeladverteerders in Kenia" door naar de bijbehorende categorie en het bijbehorende geografische gebied, en geeft vervolgens die ranglijst weer, in de exacte volgorde zoals die in werkelijkheid is. | Openbaar |
Affiliate- en aanbevelingsreclame
advertiser_type, promotion_type, link_type en promoted_brand zijn optionele velden bij POST- en PATCH-verzoeken naar /v1/partner/ads — Annual Ads is niet beperkt tot bedrijven die reclame maken voor zichzelf. Wanneer link_type affiliate_link of referral_invitation_link is, of promotion_type affiliate_offer of referral_opportunity is, moet affiliate_terms_accepted op true staan; anders wordt het verzoek afgewezen met een 422. title is beperkt tot 35 tekens en description tot 80 — beide worden server-side afgedwongen, niet alleen in de gebruikersinterface van het dashboard.
Elk adverteerdersaccount krijgt een reeks ingebouwde AI-tools — een generator voor advertentie-inhoud en -afbeeldingen, een conversatie-assistent, een budgetadviseur en een externe SEO-auditor — die worden betaald met AI-credits, bovenop het vaste jaarlijkse tarief.
| POST | /v1/advertisers/{id}/ai/assistantVraag het aan Annual Ads — een zwevende gespreksassistent, uitsluitend ter informatie, met alleen-lezen-toegang tot accountgegevens. | Openbaar |
| POST | /v1/advertisers/{id}/ai/creative-studioGenereer een advertentietitel, beschrijving en zoekwoorden op basis van een korte bedrijfsbeschrijving. | 2 studiepunt(en) |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageMaak een afbeelding (PNG) van dezelfde bedrijfsbeschrijving, die online staat en direct aan een advertentie kan worden toegevoegd. | 8 studiepunt(en) |
| POST | /v1/advertisers/{id}/ai/budget-advisorEen echte statistische prognose — en geenszins een willekeurige schatting — van de kans dat een bepaalde rang na 30, 90 of 365 dagen behouden blijft. | 1 studiepunt(en) |
| POST | /v1/advertisers/{id}/ai/seo-auditAnalyseer de eigen externe website van de adverteerder en doe concrete voorstellen voor SEO-verbeteringen. | 2 studiepunt(en) |
Dezelfde categorie en bedrijfsbeschrijving vormen ook de basis voor de onderstaande afbeeldingsgenerator.
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
}Maak een bijpassende afbeelding voor dezelfde advertentie:
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
}Plaats een kant-en-klare advertentieblok op je eigen site — zonder dat je iets hoeft te bouwen en zonder iframe. Het script wordt rechtstreeks in de pagina weergegeven binnen een geïsoleerde Shadow DOM, zodat de stijlen ervan nooit in je site terechtkomen en de stijlen van je site nooit in het advertentieblok terechtkomen.
<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>Standaard wordt hier de volledige openbare ranglijst voor de categorie weergegeven — alle adverteerders op het platform, niet alleen degenen die je hebt aangetrokken. Om alleen de advertenties weer te geven van adverteerders die je via de Connect-modus hebt aangemaakt (die waarvoor je een aandeel ontvangt), voeg je ‘data-partner’ toe met je partner-ID (te vinden op de pagina ‘Ontwikkelaars’ van je eigen dashboard):
<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>Als je adverteerders in meerdere categorieën actief zijn, laat dan ‘data-category’ helemaal weg — met alleen ‘data-partner’ toont de widget al je advertenties uit alle categorieën in één raster, in plaats van dat je voor elke categorie een apart widgetblok nodig hebt:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>Wil je naast je widget in de inhoud nog een widget in de voettekst plaatsen, waarbij elke widget andere advertenties toont? Voeg dan een tweede widgetblok toe met data-layout="compact" (één advertentie, die kan worden ingeklapt tot een klein bolletje) en stel data-offset in op het aantal advertenties dat je eerste widget al toont:
<!-- 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 | De weer te geven categorie-ID. Verplicht — tenzij `data-partner` is ingesteld; in dat geval worden, als dit veld wordt weggelaten, de advertenties van die partner in alle categorieën weergegeven. |
data-geo | Geografisch bereik: lokaal, regionaal of wereldwijd. Standaard is dit ingesteld op wereldwijd. |
data-count | Aantal weer te geven advertenties. Standaard is dit 4. |
data-columns | Aantal kolommen in de tabel. Standaardwaarde is 2. |
data-layout | raster, lijst of compact. Standaard is ‘raster’ ingesteld. Bij ‘compact’ wordt één advertentie weergegeven (de waarde van ‘data-count’ wordt genegeerd) met een knop om deze samen te vouwen tot een klein bolletje en weer te openen — een element in voettekststijl dat nooit door het script zelf vast wordt gepositioneerd; je kunt de container-div op je eigen pagina naar eigen wens plaatsen en opmaken. |
data-offset | Aantal advertenties uit de top van de ranglijst dat moet worden overgeslagen. Standaard ingesteld op 0. Hiermee kan een tweede widget op dezelfde pagina (bijvoorbeeld een compacte widget in de voettekst en een widget in rastervorm iets hoger op de pagina) andere advertenties weergeven in plaats van dezelfde advertentie twee keer te herhalen — geef het aantal advertenties op dat de andere widget al weergeeft. |
data-partner | Je partner-ID (te vinden op de pagina ‘Ontwikkelaars’ van je eigen dashboard). Optioneel — zonder dit ID toont de widget de volledige openbare ranglijst voor die categorie, met alle adverteerders op het platform. Met dit ID worden alleen advertenties weergegeven van adverteerders die je via de Connect-modus hebt aangetrokken — degenen die daadwerkelijk je aandeel genereren. |
Het aantal verzoeken is per sleutel en per minuut beperkt. Elk geauthenticeerd antwoord bevat de headers X-RateLimit-Limit, X-RateLimit-Remaining en X-RateLimit-Reset; als de limiet wordt overschreden, wordt de statuscode 429 Too Many Requests geretourneerd, samen met een Retry-After-header.
Optioneel, per partner. Zolang je geen vermelding toevoegt, accepteren je sleutels verzoeken van elk willekeurig IP-adres — de eerste vermelding zorgt ervoor dat alle sleutels van die partner voortaan alleen nog maar verzoeken van de toegestane lijst toelaten.
Elke webhook wordt ondertekend met HMAC-SHA256 met behulp van een eenmalig gegenereerd geheim dat bij het aanmaken wordt toegekend — controleer de handtekening voordat je de payload vertrouwt. Gebeurtenissen worden uitsluitend verzonden naar de partner die eigenaar is van de betreffende adverteerder.
payment.succeeded | Een betaling is bevestigd. |
payment.refunded | De terugbetaling is uitgevoerd. |
ad.activated | Een advertentie wordt actief, automatisch of na controle door een beheerder. |
invoice.issued | Er wordt een factuur opgesteld. |
referral.payout.completed | Een verwijzingscommissie heeft de status ‘betaald’ bereikt. |
referral.payout.failed | Een uitbetalingsbatch voor verwijzingen mislukt bij de aanbieder — de inkomsten worden teruggestort naar ‘te betalen’ en de verwerking wordt opnieuw geprobeerd. |
rank.changed | De positie van een advertentie verandert — ook wanneer dit wordt veroorzaakt door de betaling van een andere adverteerder. |
ad.expiring_soon | 30, 7 of 1 dag(en) voordat een advertentie afloopt. |
partner_ad_revenue.payout.completed | Een uitbetaling van het aandeel in de advertentie-inkomsten heeft de status ‘betaald’ bereikt. |
partner_ad_revenue.payout.failed | Een batch voor de uitbetaling van het aandeel in de advertentie-inkomsten mislukt bij de aanbieder — de bedragen worden teruggestuurd naar de te betalen post en de uitbetaling wordt opnieuw geprobeerd. |
Er zijn officiële JavaScript/TypeScript- en Python-SDK’s gepland, die op basis van dezezelfde API-specificatie worden gegenereerd, maar deze zijn nog niet gepubliceerd — maak tot die tijd rechtstreeks gebruik van de HTTP-API.
Er is nog geen SDK beschikbaar — deze maken rechtstreeks gebruik van de HTTP-API en werken nu al in elke programmeertaal.
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": "...",
},
)