Annual Ads

Utviklerdokumentasjon

Bygg direkte på Annual Ads-plattformen – opprett annonsører, publiser annonser, utløs betalinger og følg med på rangeringen, alt via API-et.

Se den fullstendige prisoversikten

Du beholder 70 % av det annonsørene dine i Connect-modus betaler for annonsene sine – beløpet blir automatisk satt inn på lommeboken din. Se hvordan det fungerer nedenfor.

Grunn-URL

https://api.adhub365.com
OpenAPI 3

Autentisering

Hver forespørsel autentiseres med en hemmelig nøkkel i «Authorization»-overskriften, ved hjelp av «Bearer»-ordningen.

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

Testmiljø og produksjonsmiljø

Sandkasse- og produksjonsnøkler er fullstendig isolert fra hverandre — en sandkasse-nøkkel kan aldri lese eller skrive data som er opprettet av en produksjonsnøkkel, og omvendt.

Omfang

Hver nøkkel er begrenset til de områdene den ble utstedt for – en nøkkel har aldri større tilgang enn partnerkontoen som opprettet den.

API-nøkler utstedes til godkjente partnerkontoer av Annual Ads-teamet.

Opprett en partnerkonto

Inntektsdeling fra annonser

Hvis API-nøklene dine oppretter annonsørkontoer for dine egne brukere (Connect-modus – se «Autentisering» ovenfor), tjener du en andel av det disse annonsørene betaler for annonsene sine. Fordelingen nedenfor hentes i sanntid fra nettopp dette endepunktet, er aldri fastkodet og er helt adskilt fra henvisningsprovisjonen lenger ned på denne siden.

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

70%

Det er opp til deg

Utbetales automatisk til den lommeboken du har angitt for utbetalinger — du trenger ikke å sende inn noen uttaksforespørsel.

30%

Går til årlige annonser

Omhandler moderering, hosting og rangeringinfrastrukturen som annonsene dine kjører på.

Slik fungerer det

  1. En av annonsørene dine i Connect-modus betaler for en annonse via integrasjonen din.
  2. Annonsen blir gjennomgått og godkjent – enten automatisk eller av vårt modereringsteam.
  3. Andelen din står i kø for automatisk utbetaling til lommeboken din – det er samme mekanisme som i henvisningsprogrammet nedenfor.
En andel opprettes aldri før annonsen faktisk er godkjent – hvis moderatoren avviser den, skal det ikke betales noe for den betalingen. En påfylling på en allerede aktiv annonse medfører ingen slik risiko og fordeles umiddelbart.

Utbetalingsvilkår

  • Det er opprettet en lommebok for utbetaling av kryptovaluta på partnerkontoen din.
  • Du trenger ikke å gjennomføre noen KYC-verifisering – partnerkontoen din er allerede godkjent ved opprettelsen.

Eksempel: å lese antall akkumulerte aksjer

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
}

Endepunkter

Kontoer

POST/v1/partner/advertisers

Opprett en annonsørkonto på vegne av en av brukerne dine (Connect-modus).

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

Søk etter en annonsørkonto opprettet av denne partneren.

advertisers:read

Annonser

POST/v1/partner/ads

Opprett en annonse. Den opprettes først som utkast. De valgfrie feltene «advertiser_type», «promotion_type», «link_type» og «promoted_brand» beskriver henholdsvis affiliate-, henvisnings-, skaper- eller individuell annonsering – se merknaden nedenfor.

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

Slå opp en annonse.

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

Oppdater redaksjonelt innhold – tittel, beskrivelse, lenke, annonsørtype, kampanjetype, lenketype og markedsført merke. Kategori, geografisk område og alt annet som leses av rangeringmotoren, kan aldri endres her.

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

Last opp et annonsebilde direkte (JPEG/PNG/WebP, maks. 5 MB). Dette må gjøres før den første betalingen — se avsnittet om betalinger nedenfor.

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

Angi bildet til en annonse ved hjelp av en URL i stedet for å laste opp en fil – serveren henter og legger det ut på egen hånd. Samme krav: må gjøres før den første betalingen.

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

Gjeldende rangering, kategori og geografisk dekningsområde for en annonse.

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

Totalt antall visninger og klikk for en annonse — antall dager som har gått/gjenstår hentes fra feltene `activated_at` og `expires_at` som allerede finnes i GET /{id}, mens rangeringen hentes fra GET /{id}/rank.

ads:read

Betalinger

POST/v1/partner/payments

Start en kryptovaluta-betaling for et første kjøp eller en påfylling. En første betaling mislykkes med feilkode 422 med mindre annonsen allerede har et bilde — se uploadAdImage/setAdImageUrl ovenfor.

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

Sjekk statusen på en betaling.

payments:read

Henvisninger

POST/v1/partner/referrals

Opprett en henvisningslenke.

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

Samlet inntekt fra henvisninger, fordelt etter status.

referrals:read

Inntektsdeling fra annonser

GET/v1/partner/ad-revenue/earnings

Din andel på 70 % av det annonsørene du opprettet i Connect-modus betalte for annonsene sine, fordelt etter status.

ad-revenue:read

Tilgangslogg

GET/v1/partner/access-log

Fullstendig anropshistorikk for denne nøkkelen — metode, sti, IP-adresse, tidsstempel.

Der

Offentlige endepunkter

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

Skrivebeskyttet rangering for en kategori og et geografisk område.

Offentlig
GET/v1/tiers

De 7 konfigurerte prisnivåene (terskel, tilgjengelige fordeler).

Offentlig
GET/v1/referral-program

Provisjonssatsene som for øyeblikket gjelder for henvisningskaskaden og Leaders Pool.

Offentlig
GET/v1/partner-program

Den nåværende fordelingen av annonseinntekter (Connect-modus) mellom deg og Annual Ads.

Offentlig
GET/v1/search?q={query}

Søk i naturlig språk — videresender et søk som «møbelannonsører i Kenya» til den aktuelle kategorien og det aktuelle geografiske området, og viser deretter rangeringen i nøyaktig den rekkefølgen den foreligger.

Offentlig

Affiliate- og henvisningsannonsering

advertiser_type, promotion_type, link_type og promoted_brand er valgfrie felt ved POST- og PATCH-forespørsler til /v1/partner/ads — Annual Ads er ikke begrenset til bedrifter som annonserer for seg selv. Når link_type er affiliate_link eller referral_invitation_link, eller promotion_type er affiliate_offer eller referral_opportunity, må affiliate_terms_accepted være true, ellers avvises forespørselen med en 422-feil. title har en begrensning på 35 tegn og description på 80 – begge håndheves på serversiden, ikke bare i brukergrensesnittet på dashbordet.

AI-verktøy

Hver annonsørkonto får tilgang til en rekke innebygde AI-verktøy – en generator for annonseinnhold og grafikk, en samtaleassistent, en budsjettrådgiver og en ekstern SEO-revisor – som betales med AI-kreditter, i tillegg til den faste årsprisen.

Disse kjøres via annonsørens egen pålogging til kontrollpanelet (et tilgangstoken for økten), ikke via en API-nøkkel fra en samarbeidspartner – en tredjepartsintegrasjon kan ikke kalle dem opp på vegne av annonsøren.
POST/v1/advertisers/{id}/ai/assistant

Spør Annual Ads — en flytende samtaleassistent, kun til informasjonsformål, med skrivebeskyttet tilgang til kontodata.

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

Generer en annonsetittel, beskrivelse og søkeord ut fra en kort beskrivelse av virksomheten.

2 studiepoeng
POST/v1/advertisers/{id}/ai/creative-studio/image

Lag et bilde av oppføringen (PNG) basert på den samme bedriftsbeskrivelsen, som er lagret og klart til å legges ved en annonse.

8 studiepoeng
POST/v1/advertisers/{id}/ai/budget-advisor

En reell statistisk prognose — aldri et gjetning — av sannsynligheten for å beholde en gitt rangering etter 30, 90 og 365 dager.

1 studiepoeng
POST/v1/advertisers/{id}/ai/seo-audit

Analyser annonsørens egen eksterne nettside og foreslå konkrete SEO-forbedringer.

2 studiepoeng

Eksempel — generere annonseinnhold

Den samme kategorien og virksomhetsbeskrivelsen ligger også til grunn for bildegeneratoren nedenfor.

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
}

Lag et tilhørende bilde til den samme annonsen:

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

Legg inn en ferdiglaget annonseenhet på din egen nettside – uten å måtte bygge noe selv og uten iframe. Skriptet vises direkte på siden inne i et isolert Shadow DOM, slik at stilene fra annonseenheten aldri påvirker nettstedet ditt, og stilene fra nettstedet ditt aldri påvirker annonseenheten.

Legg det til på siden din

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

Som standard vises her den fullstendige offentlige rangeringen for kategorien – alle annonsører på plattformen, ikke bare de du har hentet inn. For å vise kun annonsene fra annonsører du har opprettet via Connect-modus (de som genererer andelen din), legger du til «data-partner» med partner-ID-en din (du finner den på «Utviklere»-siden i ditt eget dashbord):

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

Hvis annonsørene dine spenner over flere kategorier, bør du fjerne «data-category» helt — med bare «data-partner» viser widgeten alle annonsene dine på tvers av alle kategoriene i ett rutenett, i stedet for at du trenger én widgetblokk per kategori:

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

Vil du ha en enhet i bunntekststil ved siden av den som vises i innholdet, slik at hver av dem viser forskjellige annonser? Legg til en ny widgetblokk med data-layout="compact" (én enkelt annonse, som kan skjules til en liten «pille») og data-offset satt til antall annonser som den første widgeten din allerede viser:

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

Egenskaper

data-categoryKategori-ID som skal vises. Obligatorisk — med mindre «data-partner» er angitt; i så fall vil utelatelse av dette føre til at annonsene til den aktuelle partneren vises i alle kategorier.
data-geoGeografisk omfang: lokalt, regionalt eller globalt. Standardinnstillingen er globalt.
data-countAntall annonser som skal vises. Standardverdien er 4.
data-columnsAntall kolonner i rutenettet. Standardverdien er 2.
data-layoutrutenett, liste eller kompakt. Standardinnstillingen er rutenett. «kompakt» viser én enkelt annonse (data-count ignoreres) med en knapp for å skjule den i en liten boks og vise den igjen – en enhet i fotnote-stil som aldri plasseres fast av selve skriptet; du kan plassere og utforme container-div-en akkurat slik du ønsker på din egen side.
data-offsetAntall topprangerte annonser som skal hoppes over. Standardverdien er 0. Dette gjør at en annen widget på samme side (f.eks. en kompakt widget i bunnteksten og en rutenett-widget lenger oppe) kan vise forskjellige annonser i stedet for å gjenta den samme to ganger – angiv antallet annonser som den andre widgeten allerede viser.
data-partnerPartner-ID-en din (du finner den på «Utviklere»-siden i ditt eget dashbord). Valgfritt – uten denne viser widgeten den fullstendige offentlige rangeringen for den aktuelle kategorien, med alle annonsører på plattformen. Med denne vises kun annonser fra annonsører du har hentet inn via Connect-modus – altså de som faktisk genererer din andel.

Inntektsandel

Hvordan en partners henvisningsprovisjon faktisk utbetales til vedkommende — prosentandelen, utbetalingsmåten og forutsetningene.

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
}

Ikke et fast tall

Provisjonsprosenten konfigureres av oss og kan endres — sjekk alltid den aktuelle verdien direkte fra dette endepunktet, i stedet for å hardkode en verdi.

Helt automatisk

Det er ingen tidsfrist for uttak. En planlagt oppgave beregner utbetalbare inntekter, grupperer dem etter annonsør og utbetaler dem automatisk så snart alle vilkårene nedenfor er oppfylt.

Utbetalingsvilkår

  • Annonsørens samlede utbetalbare inntekter når minimumsbeløpet for utbetaling.
  • Det er opprettet en lommebok for utbetaling av kryptovaluta på kontoen deres.
  • Deres KYC-status er bekreftet.

Eksempel: oppgaver om akkumulert overskudd

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
}

Prisnivåer (live)

Les verdiene direkte fra dette endepunktet — du må aldri hardkode disse verdiene, da de kan endres fra vår side. Lag en prisvelger for dine egne brukere i stedet for et felt for fritt valgt beløp: hver pris som vises er allerede det nøyaktige beløpet som skal sendes når betalingen opprettes, og de tilgjengelige fordelene som vises her forteller brukerne nøyaktig hva de får for den prisen, slik at de velger en pris de forstår i stedet for å gjette seg frem til et tall.

TierPrisLåser opp
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Klikkbar lenke
Gold$500.00

Animation unlocked

Klikkbar lenkeAnimasjon
Platinum$1,000.00

Enhanced exposure

Klikkbar lenkeAnimasjon
Diamond$2,500.00

Premium placement

Klikkbar lenkeAnimasjon
Elite$5,000.00

Top-tier visibility

Klikkbar lenkeAnimasjon
Legendary$10,000.00

Maximum visibility & branding

Klikkbar lenkeAnimasjon

Hastighetsbegrensninger

Det er satt en grense for antall forespørsler per nøkkel per minutt. Hvert godkjent svar inneholder overskriftene X-RateLimit-Limit, X-RateLimit-Remaining og X-RateLimit-Reset. Hvis grensen overskrides, returneres feilkoden 429 Too Many Requests sammen med overskriften Retry-After.

IP-tillatelsesliste

Valgfritt, per partner. Inntil du legger til en oppføring, godtar nøklene dine forespørsler fra alle IP-adresser — den første oppføringen endrer alle nøklene til den aktuelle partneren slik at de kun tillater tilgang fra adresser på tillatelseslisten.

Webhooks

Hver webhook signeres med HMAC-SHA256 ved hjelp av en hemmelig nøkkel som utstedes én gang ved opprettelsen – sjekk signaturen før du stoler på innholdet. Hendelser leveres kun til den partneren som eier den tilknyttede annonsøren.

payment.succeededEn betaling er bekreftet.
payment.refundedEn refusjon er gjennomført.
ad.activatedEn annonse blir aktivert, enten automatisk eller etter at en administrator har vurdert den.
invoice.issuedDet utstedes en faktura.
referral.payout.completedEn henvisningsprovisjon har nådd statusen «betalt».
referral.payout.failedEn utbetalingsbatch for henvisninger mislykkes hos leverandøren – inntektene føres tilbake til utestående beløp og forsøkes på nytt.
rank.changedEn annonses rangering endres – blant annet når en annen annonsørs betaling fører til dette.
ad.expiring_soon30, 7 eller 1 dag(er) før en annonse utløper.
partner_ad_revenue.payout.completedEn utbetaling av andel av annonseinntekter har fått statusen «betalt».
partner_ad_revenue.payout.failedEn batch med utbetalinger av andel av annonseinntekter mislykkes hos leverandøren — andelene føres tilbake til utestående beløp og forsøkes på nytt.

Programvareutviklingspakker

Offisielle SDK-er for JavaScript/TypeScript og Python, som er generert ut fra denne API-spesifikasjonen, er planlagt, men er ennå ikke publisert — bruk HTTP-API-et direkte inntil da.

Hurtigstart

Det finnes ikke noe SDK ennå — disse kaller HTTP-API-et direkte og fungerer allerede i dag uansett hvilket språk man bruker.

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