Annual Ads

Dokumentation til udviklere

Byg direkte på Annual Ads-platformen — opret annoncører, offentliggør annoncer, udløs betalinger og spor placeringer, alt sammen via API’et.

Se den fulde prisoversigt

Du beholder 70 % af det beløb, som dine annoncører i Connect-tilstand betaler for deres annoncer — beløbet overføres automatisk til din tegnebog. Se nedenfor, hvordan det fungerer.

Basis-URL

https://api.adhub365.com
OpenAPI 3

Godkendelse

Hver anmodning godkendes ved hjælp af en hemmelig nøgle i Authorization-headeren ved brug af Bearer-metoden.

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

Sandkasse og produktion

Sandbox-nøgler og produktionsnøgler er fuldstændigt adskilt fra hinanden — en sandbox-nøgle kan aldrig læse eller skrive data, der er oprettet af en produktionsnøgle, og omvendt.

Anvendelsesområder

Hver nøgle er begrænset til de anvendelsesområder, den blev udstedt til — en nøgle har aldrig større adgang end den partnerkonto, der oprettede den.

API-nøgler udstedes til godkendte partnerkonti af Annual Ads-teamet.

Opret en partnerkonto

Fordeling af annonceindtægter

Hvis dine API-nøgler opretter annoncørkonti for dine egne brugere (Connect-tilstand — se »Godkendelse« ovenfor), får du en andel af det, som disse annoncører betaler for deres annoncer. Fordelingen nedenfor hentes i realtid fra netop dette endpoint, er aldrig fastkodet og er helt adskilt fra henvisningsprovisionen længere nede på denne side.

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

70%

Det er din tur

Udbetalingen sker automatisk til den udbetalingslommebog, du har angivet — du behøver ikke at indsende en udbetalingsanmodning.

30%

Går til årlige annoncer

Omhandler moderering, hosting og den rangordningsinfrastruktur, som dine annoncer kører på.

Sådan fungerer det

  1. En af dine annoncører i Connect-tilstand betaler for en annonce via din integration.
  2. Annoncen gennemgås og godkendes – enten automatisk eller af vores moderationsteam.
  3. Din andel er sat i kø til automatisk udbetaling til din tegnebog – det fungerer på samme måde som henvisningsprogrammet nedenfor.
En andel oprettes aldrig, før annoncen rent faktisk er godkendt — hvis den afvises under modereringen, skyldes der intet i forbindelse med den pågældende betaling. En påfyldning på en allerede aktiv annonce medfører ikke en sådan risiko og fordeles straks.

Udbetalingsbetingelser

  • Der er oprettet en kryptovaluta-udbetalingslommebog på din partnerkonto.
  • Der kræves ingen KYC-verifikation fra din side — din partnerkonto er allerede blevet godkendt ved oprettelsen.

Eksempel: aflæsning af akkumulerede aktier

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

Konti

POST/v1/partner/advertisers

Opret en annoncørkonto på vegne af en af dine brugere (Connect-tilstand).

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

Se en annoncørkonto, der er oprettet af denne partner.

advertisers:read

Annoncer

POST/v1/partner/ads

Opret en annonce. Den oprettes som udkast. De valgfri felter »advertiser_type«, »promotion_type«, »link_type« og »promoted_brand« beskriver henholdsvis affiliate-, henvisnings-, creator- eller individuel annoncering — se bemærkningen nedenfor.

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

Søg efter en annonce.

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

Opdater redaktionelt indhold — titel, beskrivelse, link, annoncørtype, kampagnetype, linktype og det promoverede mærke. Kategori, geografi og alt, hvad rangordningsmotoren tager højde for, kan aldrig ændres her.

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

Upload et annoncebillede direkte (JPEG/PNG/WebP, maks. 5 MB). Dette skal gøres inden den første betaling — se afsnittet om betalinger nedenfor.

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

Indstil et annoncens billede via en URL i stedet for at uploade en fil — serveren henter det selv og lægger det op på sin egen server. Samme krav: skal være opfyldt inden den første betaling.

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

En annonces aktuelle placering, kategori og geografiske rækkevidde.

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

Det samlede antal visninger og klik på en annonce — antal forløbne/resterende dage hentes fra felterne `activated_at` og `expires_at`, som allerede findes i GET /{id}, mens rangeringen hentes fra GET /{id}/rank.

ads:read

Betalinger

POST/v1/partner/payments

Start en kryptobetaling til et første køb eller en påfyldning. En første betaling mislykkes med fejlkode 422, medmindre annoncen allerede har et billede — se uploadAdImage/setAdImageUrl ovenfor.

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

Tjek status for en betaling.

payments:read

Henvisninger

POST/v1/partner/referrals

Opret et henvisningslink.

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

Samlede indtægter fra henvisninger, opdelt efter status.

referrals:read

Fordeling af annonceindtægter

GET/v1/partner/ad-revenue/earnings

Din andel på 70 % af det beløb, som de annoncører, du har oprettet i Connect-tilstand, har betalt for deres annoncer, opdelt efter status.

ad-revenue:read

Adgangslog

GET/v1/partner/access-log

Fuld opkaldshistorik for denne nøgle — metode, sti, IP-adresse, tidsstempel.

Der

Offentlige slutpunkter

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

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

Offentligt
GET/v1/tiers

De 7 konfigurerede prisniveauer (tærskel, låste fordele).

Offentligt
GET/v1/referral-program

De provisionssatser, der i øjeblikket gælder for henvisningskaskaden og Leaders Pool.

Offentligt
GET/v1/partner-program

Den nuværende fordeling af annonceindtægterne (Connect-tilstand) mellem dig og Annual Ads.

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

Søgning på naturligt sprog — dirigerer en søgeforespørgsel som f.eks. »møbelannoncører i Kenya« til den relevante kategori og det relevante geografiske område og returnerer derefter ranglisten i den nøjagtige rækkefølge, som den fremkommer.

Offentligt

Affiliate- og henvisningsreklamer

advertiser_type, promotion_type, link_type og promoted_brand er valgfri felter ved POST- og PATCH-anmodninger til /v1/partner/ads — Annual Ads er ikke begrænset til virksomheder, der annoncerer for sig selv. Når link_type er affiliate_link eller referral_invitation_link, eller promotion_type er affiliate_offer eller referral_opportunity, skal affiliate_terms_accepted være true, ellers afvises anmodningen med en 422-fejl. title er begrænset til 35 tegn og description til 80 — begge begrænsninger håndhæves på serversiden, ikke kun i dashboardets brugergrænseflade.

AI-værktøjer

Hver annoncørkonto får adgang til en række indbyggede AI-værktøjer — en generator til annonceindhold og -grafik, en dialogassistent, en budgetrådgiver og en ekstern SEO-revisor — som betales med AI-kreditter ud over den faste årlige pris.

Disse fungerer via annoncørens eget dashboard-login (et sessionstilgangstoken) og ikke via en partner-API-nøgle — en tredjepartsintegration kan ikke påkalde dem på vegne af annoncøren.
POST/v1/advertisers/{id}/ai/assistant

Spørg Annual Ads — en flydende samtaleassistent, der udelukkende giver oplysninger og kun har læseadgang til kontooplysninger.

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

Generer en annoncetitel, en beskrivelse og søgeord ud fra en kort beskrivelse af virksomheden.

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

Generer et billedmateriale (PNG) baseret på den samme virksomhedsbeskrivelse, som er hostet og klar til at blive vedhæftet en annonce.

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

En reel statistisk prognose — aldrig et vilkårligt gæt — for sandsynligheden for at bevare en given placering efter 30, 90 og 365 dage.

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

Analyser annoncørens egen eksterne hjemmeside og kom med konkrete forslag til SEO-forbedringer.

2 studiepoint

Eksempel — generer annonceindhold

Den samme kategori og virksomhedsbeskrivelse ligger også til grund for billedgeneratoren 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
}

Opret et tilhørende billede til den samme annonce:

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

Indsæt en færdiglavet annonceblok på din egen hjemmeside — ingen opsætning, ingen iframe. Skriptet vises direkte på siden inden for et isoleret Shadow DOM, så dets stilarter aldrig påvirker din hjemmeside, og din hjemmesides stilarter aldrig påvirker det.

Føj det til din side

<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 den fulde offentlige rangliste for kategorien her — alle annoncører på platformen, ikke kun dem, du har tilført. For kun at vise annoncer fra annoncører, du har oprettet via Connect-tilstand (dem, der genererer din andel), skal du tilføje »data-partner« sammen med dit partner-ID (du finder det på siden »Udviklere« på dit eget 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>

Hvis dine annoncører dækker flere kategorier, skal du helt udelade »data-category« — ved kun at bruge »data-partner« viser widgeten alle dine annoncer på tværs af alle kategorier i ét gitter, i stedet for at der skal bruges én widgetblok pr. 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 have en enhed i fodtekstformat ved siden af den, der vises i indholdet, hvor hver viser forskellige annoncer? Tilføj en anden widgetblok med data-layout="compact" (en enkelt annonce, der kan foldes sammen til en lille pille) og data-offset indstillet til det antal annoncer, som din første widget 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>

Egenskaber

data-categoryKategori-ID, der skal vises. Obligatorisk — medmindre »data-partner« er angivet; i så fald vil udeladelse af dette medføre, at denne partners annoncer vises på tværs af alle kategorier.
data-geoGeografisk rækkevidde: lokal, regional eller global. Standardindstillingen er global.
data-countAntal annoncer, der skal vises. Standardværdien er 4.
data-columnsAntal kolonner i tabellen. Standardværdien er 2.
data-layoutgrid, list eller compact. Standardindstillingen er grid. compact viser en enkelt annonce (data-count ignoreres) med en knap, der gør det muligt at skjule den i en lille boks og vise den igen — en enhed i fodnote-stil, som aldrig placeres fast af selve scriptet; du kan selv placere og formatere container-div’en, som du vil, på din egen side.
data-offsetAntal annoncer øverst på listen, der skal springes over. Standardværdien er 0. Gør det muligt for en anden widget på samme side (f.eks. en kompakt widget i sidefoden og en rasterwidget længere oppe) at vise forskellige annoncer i stedet for at gentage den samme to gange — angiv antallet af annoncer, som den anden widget allerede viser.
data-partnerDit partner-ID (du finder det på siden »Udviklere« på dit eget kontrolpanel). Valgfrit — uden dette ID viser widgeten den fulde offentlige rangliste for den pågældende kategori, dvs. alle annoncører på platformen. Med dette ID vises kun annoncer fra annoncører, du har tiltrukket via Connect-tilstand — altså dem, der rent faktisk genererer din andel.

Omsætningsandel

Hvordan en partners henvisningsprovision rent faktisk udbetales til vedkommende — procentdelen, udbetalingsmekanismen og forudsætningerne.

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 tal

Provisionsprocenten indstilles af os og kan ændre sig — du bør altid hente den i realtid fra dette endpoint i stedet for at indsætte en fast værdi.

Fuldautomatisk

Der er ingen udbetalingsfrist. Et planlagt job beregner de udbetalingsklare indtægter, grupperer dem efter annoncør og udbetaler dem automatisk, så snart alle nedenstående betingelser er opfyldt.

Udbetalingsbetingelser

  • Annoncørens samlede indtjening, der skal udbetales, når op til minimumsudbetalingsbeløbet.
  • Der er oprettet en kryptovaluta-udbetalingslommebog på deres konto.
  • Deres KYC-status er bekræftet.

Eksempel: aflæsning af akkumuleret overskud

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
}

Prisniveauer (live)

Hent værdierne direkte fra dette endpoint — indsæt aldrig disse værdier direkte i koden, da de kan ændres fra vores side. Lav i stedet en prisvælger til dine egne brugere i stedet for et felt til et frit beløb: hver pris, der vises, er allerede det nøjagtige beløb, der skal sendes, når betalingen oprettes, og de tilgængelige fordele, der vises her, fortæller brugerne præcis, hvad de får for den pris, så de vælger en pris, de forstår, i stedet for at gætte på et tal.

TierPrisLåser op
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Klikbart link
Gold$500.00

Animation unlocked

Klikbart linkAnimation
Platinum$1,000.00

Enhanced exposure

Klikbart linkAnimation
Diamond$2,500.00

Premium placement

Klikbart linkAnimation
Elite$5,000.00

Top-tier visibility

Klikbart linkAnimation
Legendary$10,000.00

Maximum visibility & branding

Klikbart linkAnimation

Hastighedsbegrænsninger

Der er en begrænsning på antallet af anmodninger pr. nøgle pr. minut. Hvert godkendt svar indeholder header-felterne X-RateLimit-Limit, X-RateLimit-Remaining og X-RateLimit-Reset; overskrides grænsen, returneres fejlkoden 429 Too Many Requests sammen med header-feltet Retry-After.

IP-tilladelsesliste

Valgfrit, pr. partner. Indtil du tilføjer en post, accepterer dine nøgler anmodninger fra enhver IP-adresse — den første post ændrer alle denne partners nøgler, så de kun accepterer anmodninger fra adresser på tilladelseslisten.

Webhooks

Hver webhook signeres med HMAC-SHA256 ved hjælp af en hemmelig nøgle, der udstedes én gang ved oprettelsen — kontroller signaturen, før du stoler på indholdet. Begivenhederne sendes kun til den partner, der ejer den pågældende annoncør.

payment.succeededEn betaling er bekræftet.
payment.refundedDer foretages en tilbagebetaling.
ad.activatedEn annonce bliver aktiv, enten automatisk eller efter en administrator har gennemgået den.
invoice.issuedDer udstedes en faktura.
referral.payout.completedEn henvisningsprovision er blevet udbetalt.
referral.payout.failedEn udbetalingsbatch for henvisninger mislykkes hos udbyderen — indtægterne føres tilbage til udestående beløb og forsøges igen.
rank.changedEn annonces placering ændrer sig — herunder når en anden annoncørs betaling er årsagen hertil.
ad.expiring_soon30, 7 eller 1 dag(e) før en annonce udløber.
partner_ad_revenue.payout.completedEn udbetaling af andel af annonceindtægter har opnået status som »betalt«.
partner_ad_revenue.payout.failedEn batch med udbetalinger af andel af annonceindtægter mislykkes hos udbyderen — andelene føres tilbage til udestående beløb og forsøges igen.

Softwareudviklingspakker

Der er planer om officielle JavaScript/TypeScript- og Python-SDK’er, der genereres ud fra netop denne API-specifikation, men de er endnu ikke offentliggjort — indtil da skal du kalde HTTP-API’en direkte.

Hurtigstart

Der findes endnu ikke noget SDK — disse kalder direkte på HTTP-API’et og fungerer allerede i dag på alle sprog.

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