Annual Ads

Documentatie voor ontwikkelaars

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 prijsoverzicht

Je 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.

Basis-URL

https://api.adhub365.com
OpenAPI 3

Authenticatie

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/json

Testomgeving en productieomgeving

Sandbox- en productiesleutels zijn volledig van elkaar gescheiden — een sandbox-sleutel kan nooit gegevens lezen of schrijven die door een productiesleutel zijn aangemaakt, en omgekeerd.

Toepassingsgebieden

Elke sleutel is beperkt tot de toepassingsgebieden waarvoor deze is uitgegeven — een sleutel heeft nooit meer toegangsrechten dan het partneraccount dat deze heeft aangemaakt.

API-sleutels worden door het Annual Ads-team verstrekt aan goedgekeurde partneraccounts.

Een partneraccount aanmaken

Verdeling van advertentie-inkomsten

Als je API-sleutels adverteerdersaccounts aanmaken voor je eigen gebruikers (Connect-modus — zie ‘Authenticatie’ hierboven), verdien je een deel van wat die adverteerders voor hun advertenties betalen. De onderstaande verdeling wordt in realtime opgehaald via ditzelfde eindpunt, is nooit vastgelegd in de code en staat volledig los van de verwijzingscommissie die verderop op deze pagina wordt beschreven.

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

70%

Dat is voor jou

Wordt automatisch uitbetaald naar de door jou ingestelde uitbetalingsportemonnee — je hoeft geen opnameaanvraag in te dienen.

30%

Naar de jaarlijkse advertenties

Behandelt moderatie, hosting en de infrastructuur voor de rangschikking waarop uw advertenties worden weergegeven.

Hoe het werkt

  1. Een van je adverteerders in de Connect-modus betaalt voor een advertentie via jouw integratie.
  2. De advertentie wordt gecontroleerd en goedgekeurd — automatisch of door ons moderatieteam.
  3. Je aandeel staat in de wachtrij voor automatische uitbetaling naar je portemonnee; dit werkt op dezelfde manier als het onderstaande aanbevelingsprogramma.
Een aandeel wordt pas toegekend nadat de advertentie daadwerkelijk is goedgekeurd — als de advertentie door de moderatie wordt afgewezen, wordt er niets uitgekeerd over die betaling. Een aanvulling op een reeds actieve advertentie brengt dit risico niet met zich mee en wordt onmiddellijk verdeeld.

Uitbetalingsvoorwaarden

  • Er is een crypto-uitbetalingsportemonnee geconfigureerd op uw partneraccount.
  • U hoeft zelf geen KYC-procedure te doorlopen — uw partneraccount is al bij het aanmaken gecontroleerd.

Voorbeeld: het aantal opgebouwde aandelen opvragen

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
}

Eindpunten

Rekeningen

POST/v1/partner/advertisers

Maak 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

Advertenties

POST/v1/partner/ads

Maak 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}/image

Upload 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-url

Stel 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}/rank

Huidige positie, categorie en geografisch bereik van een advertentie.

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

Het 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

Betalingen

POST/v1/partner/payments

Start 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

Doorverwijzingen

POST/v1/partner/referrals

Maak een verwijzingslink aan.

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

Cumulatieve inkomsten uit doorverwijzingen, uitgesplitst naar status.

referrals:read

Verdeling van advertentie-inkomsten

GET/v1/partner/ad-revenue/earnings

Uw 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

Toegangslogboek

GET/v1/partner/access-log

Volledig overzicht van de oproepen voor deze sleutel — methode, pad, IP-adres, tijdstempel.

Daar

Openbare eindpunten

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

Een alleen-lezen ranglijst voor een categorie en een geografisch bereik.

Openbaar
GET/v1/tiers

De 7 geconfigureerde prijsniveaus (drempel, ontgrendelde extra’s).

Openbaar
GET/v1/referral-program

De commissiepercentages die momenteel gelden voor de doorverwijzingscascade en de Leaders Pool.

Openbaar
GET/v1/partner-program

De 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.

AI-tools

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.

Deze worden uitgevoerd via de inloggegevens van het eigen dashboard van de adverteerder (een sessietoegangstoken), niet via een API-sleutel van een partner — een integratie van een derde partij kan ze niet namens een adverteerder aanroepen.
POST/v1/advertisers/{id}/ai/assistant

Vraag het aan Annual Ads — een zwevende gespreksassistent, uitsluitend ter informatie, met alleen-lezen-toegang tot accountgegevens.

Openbaar
POST/v1/advertisers/{id}/ai/creative-studio

Genereer een advertentietitel, beschrijving en zoekwoorden op basis van een korte bedrijfsbeschrijving.

2 studiepunt(en)
POST/v1/advertisers/{id}/ai/creative-studio/image

Maak 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-advisor

Een 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-audit

Analyseer de eigen externe website van de adverteerder en doe concrete voorstellen voor SEO-verbeteringen.

2 studiepunt(en)

Voorbeeld — advertentie-inhoud genereren

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
}

Widget

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.

Voeg het toe aan je pagina

<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>

Kenmerken

data-categoryDe 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-geoGeografisch bereik: lokaal, regionaal of wereldwijd. Standaard is dit ingesteld op wereldwijd.
data-countAantal weer te geven advertenties. Standaard is dit 4.
data-columnsAantal kolommen in de tabel. Standaardwaarde is 2.
data-layoutraster, 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-offsetAantal 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-partnerJe 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.

Omzetaandeel

Hoe de doorverwijzingsprovisie van een partner daadwerkelijk bij hem terechtkomt — het percentage, de uitbetalingswijze en de voorwaarden.

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
}

Geen vast aantal

Het commissiepercentage wordt door ons ingesteld en kan veranderen — haal de waarde altijd rechtstreeks op via dit eindpunt in plaats van een waarde vast te leggen.

Volledig automatisch

Er is geen eindpunt voor de uitbetaling. Een geplande taak berekent de uit te betalen inkomsten, groepeert deze per adverteerder en voert de uitbetaling automatisch uit zodra aan alle onderstaande voorwaarden is voldaan.

Uitbetalingsvoorwaarden

  • De totale uit te betalen inkomsten van de adverteerder hebben het minimale uitbetalingsbedrag bereikt.
  • Er is een crypto-uitbetalingsportemonnee geconfigureerd op hun account.
  • Hun KYC-status is geverifieerd.

Voorbeeld: het aflezen van de opgebouwde winst

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
}

Prijsniveaus (live)

Lees de gegevens live vanaf dit eindpunt — codeer deze waarden nooit vast, want ze kunnen aan onze kant veranderen. Maak voor je eigen gebruikers een keuzehulp voor tariefniveaus in plaats van een veld voor een vrij in te vullen bedrag: elke getoonde prijs is al het exacte bedrag dat bij het aanmaken van de betaling moet worden overgemaakt, en de hier getoonde voordelen laten gebruikers precies zien wat ze voor die prijs krijgen, zodat ze een prijs kiezen die ze begrijpen in plaats van een bedrag te moeten raden.

TierPrijsOntgrendelt
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Klikbare link
Gold$500.00

Animation unlocked

Klikbare linkAnimatie
Platinum$1,000.00

Enhanced exposure

Klikbare linkAnimatie
Diamond$2,500.00

Premium placement

Klikbare linkAnimatie
Elite$5,000.00

Top-tier visibility

Klikbare linkAnimatie
Legendary$10,000.00

Maximum visibility & branding

Klikbare linkAnimatie

Beperkingen op het aantal verzoeken

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.

IP-toelatingslijst

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.

Webhooks

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.succeededEen betaling is bevestigd.
payment.refundedDe terugbetaling is uitgevoerd.
ad.activatedEen advertentie wordt actief, automatisch of na controle door een beheerder.
invoice.issuedEr wordt een factuur opgesteld.
referral.payout.completedEen verwijzingscommissie heeft de status ‘betaald’ bereikt.
referral.payout.failedEen uitbetalingsbatch voor verwijzingen mislukt bij de aanbieder — de inkomsten worden teruggestort naar ‘te betalen’ en de verwerking wordt opnieuw geprobeerd.
rank.changedDe positie van een advertentie verandert — ook wanneer dit wordt veroorzaakt door de betaling van een andere adverteerder.
ad.expiring_soon30, 7 of 1 dag(en) voordat een advertentie afloopt.
partner_ad_revenue.payout.completedEen uitbetaling van het aandeel in de advertentie-inkomsten heeft de status ‘betaald’ bereikt.
partner_ad_revenue.payout.failedEen 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.

Softwareontwikkelingskits

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.

Snelstart

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": "...",
    },
)