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 prisoversigtDu 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.
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/jsonAPI-nøgler udstedes til godkendte partnerkonti af Annual Ads-teamet.
Opret en partnerkonto| POST | /v1/partner/advertisersOpret 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 |
| POST | /v1/partner/adsOpret 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}/imageUpload 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-urlIndstil 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}/rankEn annonces aktuelle placering, kategori og geografiske rækkevidde. | ads:read |
| GET | /v1/partner/ads/{id}/statsDet 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 |
| POST | /v1/partner/paymentsStart 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 |
| POST | /v1/partner/referralsOpret et henvisningslink. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsSamlede indtægter fra henvisninger, opdelt efter status. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsDin 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 |
| GET | /v1/partner/access-logFuld opkaldshistorik for denne nøgle — metode, sti, IP-adresse, tidsstempel. | Der |
| GET | /v1/rankings?category={id}&geo={scope}Skrivebeskyttet rangliste for en kategori og et geografisk område. | Offentligt |
| GET | /v1/tiersDe 7 konfigurerede prisniveauer (tærskel, låste fordele). | Offentligt |
| GET | /v1/referral-programDe provisionssatser, der i øjeblikket gælder for henvisningskaskaden og Leaders Pool. | Offentligt |
| GET | /v1/partner-programDen 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.
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.
| POST | /v1/advertisers/{id}/ai/assistantSpørg Annual Ads — en flydende samtaleassistent, der udelukkende giver oplysninger og kun har læseadgang til kontooplysninger. | Offentligt |
| POST | /v1/advertisers/{id}/ai/creative-studioGenerer en annoncetitel, en beskrivelse og søgeord ud fra en kort beskrivelse af virksomheden. | 2 studiepoint |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageGenerer 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-advisorEn 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-auditAnalyser annoncørens egen eksterne hjemmeside og kom med konkrete forslag til SEO-forbedringer. | 2 studiepoint |
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
}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.
<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>data-category | Kategori-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-geo | Geografisk rækkevidde: lokal, regional eller global. Standardindstillingen er global. |
data-count | Antal annoncer, der skal vises. Standardværdien er 4. |
data-columns | Antal kolonner i tabellen. Standardværdien er 2. |
data-layout | grid, 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-offset | Antal 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-partner | Dit 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. |
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.
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.
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.succeeded | En betaling er bekræftet. |
payment.refunded | Der foretages en tilbagebetaling. |
ad.activated | En annonce bliver aktiv, enten automatisk eller efter en administrator har gennemgået den. |
invoice.issued | Der udstedes en faktura. |
referral.payout.completed | En henvisningsprovision er blevet udbetalt. |
referral.payout.failed | En udbetalingsbatch for henvisninger mislykkes hos udbyderen — indtægterne føres tilbage til udestående beløb og forsøges igen. |
rank.changed | En annonces placering ændrer sig — herunder når en anden annoncørs betaling er årsagen hertil. |
ad.expiring_soon | 30, 7 eller 1 dag(e) før en annonce udløber. |
partner_ad_revenue.payout.completed | En udbetaling af andel af annonceindtægter har opnået status som »betalt«. |
partner_ad_revenue.payout.failed | En batch med udbetalinger af andel af annonceindtægter mislykkes hos udbyderen — andelene føres tilbage til udestående beløb og forsøges igen. |
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.
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": "...",
},
)