Annual Ads

Dokumentation för utvecklare

Bygg direkt på Annual Ads-plattformen – skapa annonsörer, publicera annonser, initiera betalningar och följ rankningen, helt och hållet via API:et.

Se den fullständiga prislistan

Du behåller 70 % av det belopp som dina annonsörer i Connect-läget betalar för sina annonser – beloppet betalas automatiskt in till din plånbok. Se nedan hur det fungerar.

Bas-URL

https://api.adhub365.com
OpenAPI 3

Autentisering

Varje förfrågan autentiseras med en hemlig nyckel i Authorization-rubriken, med hjälp av Bearer-metoden.

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

Testmiljö och produktionsmiljö

Sandbox-nycklar och produktionsnycklar är helt åtskilda från varandra – en sandbox-nyckel kan aldrig läsa eller skriva data som skapats av en produktionsnyckel, och tvärtom.

Tillämpningsområden

Varje nyckel är begränsad till de tillämpningsområden som den utfärdades för – en nyckel har aldrig större åtkomst än det partnerkonto som skapade den.

API-nycklar utfärdas till godkända partnerkonton av Annual Ads-teamet.

Skapa ett partnerkonto

Intäktsdelning från annonser

Om dina API-nycklar skapar annonsörskonton åt dina egna användare (Connect-läge – se ”Autentisering” ovan) får du en andel av det som dessa annonsörer betalar för sina annonser. Fördelningen nedan hämtas i realtid från samma slutpunkt, är aldrig fastkodad och är helt skild från den hänvisningsprovision som beskrivs längre ner på denna sida.

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

70%

Det är din tur

Betalas automatiskt till den utbetalningsplånbok du har ställt in – ingen uttagsbegäran behövs.

30%

Går till årliga annonser

Här behandlas moderering, värdtjänster och den rankningsinfrastruktur som dina annonser körs på.

Så här fungerar det

  1. En av dina annonsörer i Connect-läget betalar för en annons via din integration.
  2. Annonsen granskas och godkänns – antingen automatiskt eller av vårt modereringsteam.
  3. Din andel står i kö för automatisk utbetalning till din plånbok, enligt samma princip som i rekommendationsprogrammet nedan.
En andel skapas aldrig innan annonsen faktiskt har godkänts – om den avvisas vid granskningen utgår ingen ersättning för den betalningen. En påfyllning av en redan aktiv annons medför ingen sådan risk och andelen delas ut omedelbart.

Utbetalningsvillkor

  • En plånbok för utbetalningar i kryptovaluta är konfigurerad på ditt partnerkonto.
  • Du behöver inte genomföra någon KYC-process – ditt partnerkonto har redan granskats när det skapades.

Exempel: avläsning av ackumulerade andelar

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
}

Slutpunkter

Konton

POST/v1/partner/advertisers

Skapa ett annonsörskonto åt en av dina användare (Connect-läge).

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

Sök upp ett annonsörskonto som skapats av denna partner.

advertisers:read

Annonser

POST/v1/partner/ads

Skapa en annons. Den skapas först som utkast. De valfria fälten advertiser_type, promotion_type, link_type och promoted_brand beskriver om det rör sig om affiliate-, hänvisnings-, kreatörs- eller privatannonsering – se anmärkningen nedan.

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

Sök efter en annons.

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

Uppdatera redaktionellt innehåll — titel, beskrivning, länk, annonsörstyp, kampanjtyp, länktyp och marknadsfört varumärke. Kategori, geografiskt område och allt annat som läses av rankningsmotorn kan aldrig ändras här.

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

Ladda upp en annonsbild direkt (JPEG/PNG/WebP, max 5 MB). Måste göras innan den första betalningen – se avsnittet om betalningar nedan.

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

Ange en annonsbild via en URL istället för att ladda upp en fil – servern hämtar och lägger upp den själv. Samma krav gäller: detta måste göras innan den första betalningen.

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

Aktuell placering, kategori och geografisk räckvidd för en annons.

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

Totalt antal visningar och klick för en annons – antal förflutna/återstående dagar hämtas från fälten `activated_at` och `expires_at` som redan finns i GET /{id}, och rankningen hämtas från GET /{id}/rank.

ads:read

Betalningar

POST/v1/partner/payments

Starta en kryptovalutabetalning för ett första köp eller en påfyllning. En första betalning misslyckas med felkod 422 om inte annonsen redan har en bild – se uploadAdImage/setAdImageUrl ovan.

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

Kontrollera statusen för en betalning.

payments:read

Rekommendationer

POST/v1/partner/referrals

Skapa en rekommendationslänk.

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

Ackumulerade intäkter från rekommendationer, uppdelade efter status.

referrals:read

Intäktsdelning från annonser

GET/v1/partner/ad-revenue/earnings

Din andel på 70 % av det belopp som de annonsörer du skapat i Connect-läget har betalat för sina annonser, uppdelat efter status.

ad-revenue:read

Åtkomstlogg

GET/v1/partner/access-log

Fullständig samtalshistorik för denna nyckel – metod, sökväg, IP-adress, tidsstämpel.

Där

Offentliga slutpunkter

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

Läsbar ranking för en kategori och ett geografiskt område.

Allmänt
GET/v1/tiers

De 7 konfigurerade prisnivåerna (tröskelvärde, tillgängliga förmåner).

Allmänt
GET/v1/referral-program

De provisionsprocent som för närvarande gäller för rekommendationskedjan och Leaders Pool.

Allmänt
GET/v1/partner-program

Den nuvarande fördelningen av annonsintäkterna (Connect-läget) mellan dig och Annual Ads.

Allmänt
GET/v1/search?q={query}

Sökning med naturligt språk — vidarebefordrar en sökfråga som ”möbelannonsörer i Kenya” till motsvarande kategori och geografiskt område, och returnerar sedan den rankningen i exakt samma ordning som den faktiskt visas.

Allmänt

Affiliate- och rekommendationsannonsering

advertiser_type, promotion_type, link_type och promoted_brand är valfria fält vid POST- och PATCH-förfrågningar till /v1/partner/ads — Annual Ads är inte begränsat till företag som marknadsför sig själva. När link_type är affiliate_link eller referral_invitation_link, eller promotion_type är affiliate_offer eller referral_opportunity, måste affiliate_terms_accepted vara true, annars avvisas begäran med ett 422-fel. title har en gräns på 35 tecken och description på 80 – båda gränserna tillämpas på serversidan, inte bara i gränssnittet på instrumentpanelen.

AI-verktyg

Varje annonsörskonto får tillgång till en uppsättning inbyggda AI-verktyg – en generator för annonsinnehåll och bilder, en konversationsassistent, en budgetrådgivare och en extern SEO-granskare – som betalas med AI-krediter utöver den fasta årsavgiften.

Dessa körs via annonsörens egen inloggning till kontrollpanelen (ett sessionstillträdes-token), inte via en API-nyckel från en partner – en tredjepartsintegration kan inte anropa dem på annonsörens vägnar.
POST/v1/advertisers/{id}/ai/assistant

Fråga Annual Ads – en flytande konversationsassistent, endast för informationsändamål, med skrivskyddad åtkomst till kontodata.

Allmänt
POST/v1/advertisers/{id}/ai/creative-studio

Skapa en annonstitel, beskrivning och sökord utifrån en kort företagsbeskrivning.

2 studiepoäng
POST/v1/advertisers/{id}/ai/creative-studio/image

Skapa en bild (PNG) av företagsannonsen utifrån samma företagsbeskrivning, som redan finns tillgänglig och är redo att bifogas en annons.

8 studiepoäng
POST/v1/advertisers/{id}/ai/budget-advisor

En verklig statistisk prognos – aldrig en gissning – av sannolikheten att behålla en viss rang efter 30, 90 respektive 365 dagar.

1 studiepoäng
POST/v1/advertisers/{id}/ai/seo-audit

Analysera annonsörens egen externa webbplats och föreslå konkreta SEO-förbättringar.

2 studiepoäng

Exempel – skapa annonsinnehåll

Samma kategori och verksamhetsbeskrivning ligger även till grund för bildgeneratorn nedan.

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
}

Skapa en passande bild till samma annons:

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

Lägg in en färdig annonsenhet på din egen webbplats – utan att behöva bygga något själv och utan iframe. Skriptet renderas direkt på sidan inuti ett isolerat Shadow DOM, vilket innebär att dess stilar aldrig påverkar din webbplats och att din webbplats stilar aldrig påverkar det.

Lägg till det på din sida

<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 visas här den fullständiga offentliga rankningen för kategorin – alla annonsörer på plattformen, inte bara de som du har värvat. För att endast visa annonser från annonsörer som du har skapat via Connect-läget (de som genererar din andel) lägger du till data-partner tillsammans med ditt partner-ID (du hittar det på sidan ”Utvecklare” i din egen kontrollpanel):

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

Om dina annonsörer spänner över flera kategorier ska du ta bort ”data-category” helt och hållet – med endast ”data-partner” visar widgeten alla dina annonser från alla kategorier i ett enda rutnät, istället för att du behöver ett widgetblock per kategori:

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

Vill du ha en enhet i fotnoten bredvid den som finns i själva innehållet, där var och en visar olika annonser? Lägg till ett andra widgetblock med data-layout="compact" (en enda annons, som kan fällas ihop till en liten ruta) och data-offset inställt på det antal annonser som din första widget redan visar:

<!-- 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 ska visas. Obligatoriskt — såvida inte ”data-partner” är angivet; i så fall visar man genom att utelämna det denna partners annonser i alla kategorier.
data-geoGeografisk räckvidd: lokal, regional eller global. Standardinställningen är global.
data-countAntal annonser som ska visas. Standardvärdet är 4.
data-columnsAntal kolumner i tabellen. Standardvärdet är 2.
data-layoutrutnät, lista eller kompakt. Standardinställningen är rutnät. I läget ”kompakt” visas en enda annons (data-count ignoreras) med en knapp för att dölja den till en liten ruta och visa den igen – en enhet i sidfotsstil som aldrig placeras fast av skriptet självt; du placerar och utformar behållar-div:en precis som du vill på din egen sida.
data-offsetAntal topprankade annonser som ska hoppas över. Standardvärdet är 0. Gör det möjligt för en andra widget på samma sida (t.ex. en kompakt widget i sidfoten och en rutnätswidget längre upp) att visa olika annonser istället för att upprepa samma annons två gånger – ange antalet annonser som den andra widgeten redan visar.
data-partnerDitt partner-ID (du hittar det på sidan ”Utvecklare” i din egen kontrollpanel). Valfritt – utan detta visar widgeten den fullständiga offentliga rankningen för den kategorin, med alla annonsörer på plattformen. Med detta visas endast annonser från annonsörer som du har värvat via Connect-läget – de som faktiskt genererar din andel.

Intäktsandel

Hur en partners rekommendationsprovision faktiskt betalas ut till denne – procentandelen, utbetalningsmekanismen och villkoren.

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
}

Inget fast antal

Provisionsprocenten konfigureras av oss och kan ändras – läs alltid av den i realtid från denna endpoint istället för att ange ett fast värde.

Helautomatisk

Det finns inget slutdatum för utbetalning. Ett schemalagt jobb sammanställer intäkter som är klara för utbetalning, grupperar dem per annonsör och betalar ut dem automatiskt så snart alla villkor nedan är uppfyllda.

Utbetalningsvillkor

  • Annonsörens totala utbetalningsbara intäkter uppnår minimibeloppet för utbetalning.
  • En plånbok för utbetalningar i kryptovaluta har konfigurerats på deras konto.
  • Deras KYC-status har verifierats.

Exempel: avläsning av ackumulerade intäkter

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)

Läs värdena direkt från denna slutpunkt – ange aldrig dessa värden direkt i koden, eftersom de kan ändras från vår sida. Skapa en prisväljare för dina egna användare istället för ett fält för fritt val av belopp: varje pris som visas är redan det exakta beloppet som ska skickas när betalningen skapas, och de upplåsta förmånerna som visas här talar om för användarna exakt vad de får för det priset, så att de väljer ett pris de förstår istället för att gissa ett belopp.

TierPrisLåser upp
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Klickbar länk
Gold$500.00

Animation unlocked

Klickbar länkAnimation
Platinum$1,000.00

Enhanced exposure

Klickbar länkAnimation
Diamond$2,500.00

Premium placement

Klickbar länkAnimation
Elite$5,000.00

Top-tier visibility

Klickbar länkAnimation
Legendary$10,000.00

Maximum visibility & branding

Klickbar länkAnimation

Begränsningar av antalet förfrågningar

Antalet förfrågningar är begränsat per nyckel och per minut. Varje autentiserat svar innehåller rubrikerna X-RateLimit-Limit, X-RateLimit-Remaining och X-RateLimit-Reset. Om gränsen överskrids returneras felkoden 429 Too Many Requests tillsammans med rubriken Retry-After.

IP-tillåtelselista

Valfritt, per partner. Tills du lägger till en post godkänner dina nycklar förfrågningar från vilken IP-adress som helst – den första posten gör att alla den partnerns nycklar endast godkänner anslutningar från adresser på tillåtelselistan.

Webhooks

Varje webhook signeras med HMAC-SHA256 med hjälp av en hemlig nyckel som genereras en gång vid skapandet – kontrollera signaturen innan du litar på datamängden. Händelser levereras endast till den partner som äger den berörda annonsören.

payment.succeededEn betalning har bekräftats.
payment.refundedEn återbetalning har genomförts.
ad.activatedEn annons publiceras, antingen automatiskt eller efter granskning av en administratör.
invoice.issuedEn faktura utfärdas.
referral.payout.completedEn hänvisningsprovision har nått statusen ”betald”.
referral.payout.failedEn utbetalningsomgång för hänvisningar misslyckas hos leverantören – intäkterna återförs till utestående belopp och försöket görs på nytt.
rank.changedEn annonss placering förändras – bland annat när en annan annonsörs betalning leder till detta.
ad.expiring_soon30, 7 eller 1 dag(ar) innan en annons löper ut.
partner_ad_revenue.payout.completedEn utbetalning av andel av annonsintäkterna har nått statusen ”betald”.
partner_ad_revenue.payout.failedEn batch med utbetalningar av andel av annonsintäkter misslyckas hos leverantören — andelarna återförs till utestående betalningar och försöket görs på nytt.

Programvaruutvecklingspaket

Officiella SDK:er för JavaScript/TypeScript och Python, som genereras utifrån samma API-specifikation, är planerade men har ännu inte publicerats – använd därför HTTP-API:et direkt tills dess.

Quickstart

Inget SDK ännu – dessa anropar HTTP-API:et direkt och fungerar redan idag i vilket programmeringsspråk som helst.

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