Annual Ads

Kehittäjien ohjeet

Kehitä suoraan Annual Ads -alustalla — luo mainostajia, julkaise mainoksia, käynnistä maksuja ja seuraa sijoitusta kokonaan sovellusliittymän (API) kautta.

Katso koko hintataulukko

Sinulle jää 70 % siitä summasta, jonka Connect-tilassa olevat mainostajasi maksavat mainoksistaan — summa maksetaan automaattisesti lompakkoosi. Katso alta, miten se toimii.

Perus-URL

https://api.adhub365.com
OpenAPI 3

Todentaminen

Jokainen pyyntö todennetaan salaisella avaimella Authorization-otsikossa Bearer-menetelmää käyttäen.

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

Kokeilu- ja tuotantoympäristö

Sandbox- ja tuotantotunnukset on erotettu toisistaan täysin — sandbox-tunnus ei voi milloinkaan lukea tai kirjoittaa tuotantotunnuksen luomia tietoja, eikä päinvastoin.

Soveltamisalat

Jokainen avain on rajoitettu niihin käyttöalueisiin, joille se on myönnetty — avaimella ei ole koskaan laajempia käyttöoikeuksia kuin sen luoneella kumppanitilillä.

Annual Ads -tiimi myöntää API-avaimet hyväksytyille kumppanitileille.

Luo kumppanitili

Mainostulojen jakaminen

Jos API-avaimesi luovat mainostajatilejä omille käyttäjillesi (Connect-tila – katso kohta ”Todennus” yllä), saat osuuden siitä, mitä kyseiset mainostajat maksavat mainoksistaan. Alla esitetty jakosuhde luetaan reaaliaikaisesti tästä samasta päätepisteestä; se ei ole koskaan koodattu kiinteästi, ja se on täysin erillinen tämän sivun alempana mainitusta viittauspalkkiosta.

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

70%

Se kuuluu sinulle

Maksetaan automaattisesti määrittämääsi maksulompakkoon – nostopyyntöä ei tarvita.

30%

Siirtyy vuosittaisiin mainoksiin

Käsittelee moderointia, isännöintiä sekä mainostesi näyttämiseen käytettävää sijoitusinfrastruktuuria.

Kuinka se toimii

  1. Yksi Connect-tilassa toimivista mainostajistasi maksaa mainoksesta integrointisi kautta.
  2. Mainos tarkistetaan ja hyväksytään – joko automaattisesti tai moderointitiimimme toimesta.
  3. Osuutesi on jonossa automaattista maksua varten lompakkoosi – sama menettelytapa kuin alla kuvatussa suositteluohjelmassa.
Osuutta ei luoda ennen kuin mainos on tosiasiallisesti hyväksytty — jos moderointi hylkää sen, kyseisestä maksusta ei ole velkaa mitään. Jo aktiivisena olevan mainoksen lisämaksu ei sisällä tällaista riskiä, ja osuus jaetaan välittömästi.

Maksuehdot

  • Kryptovaluutan maksulompakko on määritetty kumppanitilillesi.
  • Sinun puoleltasi ei vaadita KYC-tunnistautumista — kumppanitilisi on jo tarkistettu avaamisen yhteydessä.

Esimerkki: kertyneiden osakkeiden lukeminen

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
}

Päätepisteet

Tilit

POST/v1/partner/advertisers

Luo mainostajatili jonkin käyttäjäsi puolesta (Connect-tila).

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

Etsi tämän yhteistyökumppanin luoma mainostajatili.

advertisers:read

Mainokset

POST/v1/partner/ads

Luo mainos. Se on aluksi luonnosvaiheessa. Valinnaiset kentät advertiser_type, promotion_type, link_type ja promoted_brand kuvaavat kumppani-, viittaus-, sisällöntuottaja- tai yksityishenkilön mainontaa — katso alla oleva huomautus.

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

Etsi ilmoitus.

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

Päivitä toimituksellinen sisältö — otsikko, kuvaus, linkki, mainostajan tyyppi, mainostyypin, linkkityypin ja mainostetun brändin. Luokkaa, maantieteellistä aluetta tai muita tekijöitä, joita sijoitusmoottori huomioi, ei voi muuttaa tässä.

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

Lataa mainoskuva suoraan (JPEG/PNG/WebP, enintään 5 Mt). Vaaditaan ennen ensimmäistä maksua — katso alla oleva maksut-osio.

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

Määritä mainoksen kuva URL-osoitteesta tiedoston lataamisen sijaan — palvelin hakee kuvan ja tallentaa sen uudelleen itse. Sama vaatimus: tämä on tehtävä ennen ensimmäistä maksua.

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

Mainoksen nykyinen sijoitus, luokka ja maantieteellinen kattavuus.

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

Mainoksen katselukertojen ja klikkausten kokonaismäärä sekä kuluneet/jäljellä olevat päivät saadaan kentistä activated_at ja expires_at, jotka sisältyvät jo GET /{id} -pyyntöön, ja sijoitus saadaan GET /{id}/rank -pyynnöstä.

ads:read

Maksut

POST/v1/partner/payments

Aloita kryptomaksu ensimmäistä ostosta tai saldon lisäystä varten. Ensimmäinen maksu epäonnistuu virhekoodilla 422, ellei mainoksessa ole jo kuvaa — katso yllä oleva uploadAdImage/setAdImageUrl.

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

Tarkista maksun tila.

payments:read

Suositukset

POST/v1/partner/referrals

Luo suosittelulinkki.

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

Kertyneet viittaustulot, jaoteltuna statuksen mukaan.

referrals:read

Mainostulojen jakaminen

GET/v1/partner/ad-revenue/earnings

70 %:n osuutesi siitä summasta, jonka Connect-tilassa luomasi mainostajat ovat maksaneet mainoksistaan, jaoteltuna tilan mukaan.

ad-revenue:read

Käyttöloki

GET/v1/partner/access-log

Tämän avaimen täydellinen kutsuhistoria – menetelmä, polku, IP-osoite, aikaleima.

Siellä

Julkiset päätepisteet

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

Vain luku -oikeuksin nähtävä ranking tietyn kategorian ja maantieteellisen alueen osalta.

Julkinen
GET/v1/tiers

7 määritettyä hintatasoa (kynnysarvo, avatut edut).

Julkinen
GET/v1/referral-program

Viittausketjussa ja Leaders Poolissa tällä hetkellä voimassa olevat provisio-osuudet.

Julkinen
GET/v1/partner-program

Nykyinen mainostulojen jakosuhde (Connect-tila) sinun ja Annual Ads -palvelun välillä.

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

Luonnollisen kielen haku — ohjaa hakulausekkeen, kuten ”huonekalumainostajat Keniassa”, vastaavaan luokkaan ja maantieteelliseen alueeseen ja palauttaa sitten tulokset tarkalleen niiden todellisessa järjestyksessä.

Julkinen

Kumppani- ja suosittelumainonta

advertiser_type, promotion_type, link_type ja promoted_brand ovat valinnaisia kenttiä POST- ja PATCH-pyynnöissä osoitteeseen /v1/partner/ads — Annual Ads -palvelu ei rajoitu pelkästään itseään mainostaviin yrityksiin. Kun link_type on affiliate_link tai referral_invitation_link tai promotion_type on affiliate_offer tai referral_opportunity, affiliate_terms_accepted-kentän arvon on oltava true, muuten pyyntö hylätään virhekoodilla 422. title-kentän enimmäispituus on 35 merkkiä ja description-kentän 80 merkkiä — molempia rajoituksia valvotaan palvelinpuolella, ei pelkästään hallintapaneelin käyttöliittymässä.

Tekoälytyökalut

Jokaiseen mainostajatiliin kuuluu joukko sisäänrakennettuja tekoälytyökaluja – mainossisällön ja visuaalisen materiaalin luontityökalu, keskusteluavustaja, budjettineuvoja sekä ulkoinen SEO-tarkastaja –, joiden käyttö maksetaan tekoälykrediiteillä kiinteän vuosimaksun lisäksi.

Nämä toimivat mainostajan oman hallintapaneelin kirjautumistunnuksen (istunnon pääsytunnuksen) kautta, eivät kumppanin API-avaimen kautta — kolmannen osapuolen integraatio ei voi kutsua niitä mainostajan puolesta.
POST/v1/advertisers/{id}/ai/assistant

Kysy Annual Adsiltä — kelluva keskusteluavustaja, joka tarjoaa vain tietoa ja jolla on vain lukuoikeudet tilitietoihin.

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

Luo mainoksen otsikko, kuvaus ja avainsanat lyhyen yrityskuvauksen perusteella.

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

Luo kyseisen yrityksen kuvauspohjalta visuaalinen esittelykuva (PNG), joka on jo valmiina liitettäväksi mainokseen.

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

Todellinen tilastollinen ennuste — ei missään nimessä arvaus — siitä, kuinka suuret mahdollisuudet ovat säilyttää tietty sijoitus 30, 90 ja 365 päivän kuluttua.

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

Analysoi mainostajan oma ulkoinen verkkosivusto ja ehdota konkreettisia SEO-parannuksia.

2 opintopistettä

Esimerkki — mainossisällön luominen

Sama luokka ja liiketoimintakuvaus toimivat myös alla olevan kuvageneraattorin perustana.

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
}

Luo samaan mainokseen sopiva kuva:

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

Lisää valmiiksi laadittu mainosyksikkö omalle sivustollesi — ilman kehitysvaihetta, ilman iframe-kehyksiä. Skripti renderöidään suoraan sivulle eristetyn Shadow DOM:n sisällä, joten sen tyylit eivät koskaan vaikuta sivustoosi, eikä sivustosi tyylit vaikuta siihen.

Lisää se sivullesi

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

Oletusasetuksena tässä näkyy kyseisen kategorian koko julkinen ranking – kaikki alustan mainostajat, ei vain ne, jotka olet itse tuonut mukaan. Jos haluat näyttää vain niiden mainostajien mainokset, jotka olet luonut Connect-tilassa (eli ne, joista saat osuutesi), lisää data-partner-attribuutti ja kumppanitunnuksesi (löydät sen oman hallintapaneelisi Kehittäjät-sivulta):

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

Jos mainostajasi kuuluvat useaan luokkaan, poista data-category kokonaan — kun käytät pelkästään data-partner-attribuuttia, widget näyttää kaikki mainoksesi kaikista luokista yhdessä ruudukossa, eikä jokaiselle luokalle tarvita erillistä widget-lohkoa:

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

Haluatko sisältöalueen vieressä olevan alatunnisteen tyyppisen yksikön, jossa kummassakin näytetään eri mainoksia? Lisää toinen widget-lohko, jossa on attribuutti data-layout="compact" (yksi mainos, joka voidaan taittaa pieneksi pilleriksi) ja attribuutti data-offset asetettuna sen mukaan, kuinka monta mainosta ensimmäisessä widgetissä jo näytetään:

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

Ominaisuudet

data-categoryNäytettävä luokkatunnus. Pakollinen — ellei data-partner-asetusta ole määritetty; jos se on määritetty, tämän kentän jättäminen tyhjäksi näyttää kyseisen kumppanin mainoksia kaikissa luokissa.
data-geoMaantieteellinen laajuus: paikallinen, alueellinen tai maailmanlaajuinen. Oletusasetuksena on maailmanlaajuinen.
data-countNäytettävien mainosten määrä. Oletusarvo on 4.
data-columnsRuudukon sarakkeiden lukumäärä. Oletusarvo on 2.
data-layoutruudukko, luettelo tai kompakti. Oletusasetuksena on ruudukko. Kompakti-asetuksella näytetään yksi mainos (data-count-arvoa ei huomioida) sekä painike, jolla mainoksen voi kutistaa pieneksi pilleriksi ja palauttaa takaisin — kyseessä on alatunnisteen tyyppinen yksikkö, jota skripti ei itse aseta kiinteään paikkaan, vaan voit sijoittaa ja muotoilla container-div-elementin sivullasi haluamallasi tavalla.
data-offsetOhitettavien kärkimainosten määrä. Oletusarvo on 0. Tämän avulla samalla sivulla oleva toinen widget (esim. kompakti widget sivun alatunnisteessa ja ruudukkomuotoinen widget ylempänä) voi näyttää erilaisia mainoksia sen sijaan, että sama mainos toistettaisiin kahdesti — syötä se mainosten määrä, jonka toinen widget jo näyttää.
data-partnerKumppanitunnuksesi (löydät sen oman hallintapaneelin Kehittäjät-sivulta). Valinnainen — ilman tätä tunnusta widget näyttää kyseisen kategorian täydellisen julkisen ranking-listan, joka sisältää kaikki alustan mainostajat. Tunnuksen avulla näkyvät vain niiden mainostajien mainokset, jotka olet tuonut alustalle Connect-tilan kautta — eli ne, joista sinulle kertyy osuus.

Tulonjako

Miten kumppanin välityspalkkio tosiasiassa maksetaan hänelle — prosenttiosuus, maksutapa ja edellytykset.

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
}

Ei kiinteä luku

Provisioprosentti määritetään meidän puoleltamme, ja se voi muuttua — tarkista se aina reaaliaikaisesti tästä päätepisteestä sen sijaan, että koodaisit arvon kiinteästi.

Täysin automaattinen

Nostolle ei ole määräaikaa. Aikataulun mukainen tehtävä laskee maksettavat tulot, ryhmittelee ne mainostajittain ja suorittaa maksun automaattisesti, kun kaikki alla mainitut ehdot täyttyvät.

Maksuehdot

  • Mainostajan maksettavat tulot yhteensä saavuttavat vähimmäismaksurajan.
  • Heidän tililleen on määritetty kryptovaluutan maksulompakko.
  • Heidän KYC-tietonsa on vahvistettu.

Esimerkki: kertyneiden tulojen lukeminen

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
}

Hintatasot (käytössä)

Lue tiedot suoraan tästä päätepisteestä — älä koskaan määritä näitä arvoja kiinteästi koodiin, sillä ne voivat muuttua meidän puoleltamme. Luo omille käyttäjillesi hintatasovalitsin ilmaisen summan kentän sijaan: jokainen näkyvä hinta on jo tarkalleen se summa, joka lähetetään maksua luotaessa, ja tässä näkyvät avatut edut kertovat käyttäjille tarkalleen, mitä kyseisellä hinnalla saa, joten he valitsevat hinnan, jonka ymmärtävät, sen sijaan että arvaisivat summaa.

TasoHintaAvaamiset
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Klikattava linkki
Gold$500.00

Animation unlocked

Klikattava linkkiAnimaatio
Platinum$1,000.00

Enhanced exposure

Klikattava linkkiAnimaatio
Diamond$2,500.00

Premium placement

Klikattava linkkiAnimaatio
Elite$5,000.00

Top-tier visibility

Klikattava linkkiAnimaatio
Legendary$10,000.00

Maximum visibility & branding

Klikattava linkkiAnimaatio

Nopeusrajoitukset

Pyyntöjen määrä on rajoitettu avainta ja minuuttia kohden. Jokaisessa todennetussa vastauksessa on X-RateLimit-Limit-, X-RateLimit-Remaining- ja X-RateLimit-Reset-otsikot; rajan ylittäminen palauttaa virheen 429 Too Many Requests, jossa on Retry-After-otsikko.

IP-sallittujen luettelo

Valinnainen, kumppanikohtaisesti. Ennen kuin lisäät merkinnän, avaimesi hyväksyvät pyyntöjä mistä tahansa IP-osoitteesta — ensimmäinen merkintä muuttaa kyseisen kumppanin kaikki avaimet sallittujen listalle rajoitetuiksi.

Webhookit

Jokainen webhook allekirjoitetaan HMAC-SHA256-algoritmilla käyttäen kertaluonteista salaisuutta, joka luodaan webhookin luomisen yhteydessä — tarkista allekirjoitus ennen kuin luotat datapakettiin. Tapahtumat toimitetaan ainoastaan sille kumppanille, joka omistaa kyseisen mainostajan.

payment.succeededMaksu on vahvistettu.
payment.refundedHyvitys on suoritettu.
ad.activatedMainos julkaistaan joko automaattisesti tai järjestelmänvalvojan tarkastuksen jälkeen.
invoice.issuedLasku laaditaan.
referral.payout.completedViittauspalkkio on tullut maksettavaksi.
referral.payout.failedViittauspalkkioiden maksuerä epäonnistuu palveluntarjoajan puolella — tulot palautetaan maksettavaksi ja yritetään uudelleen.
rank.changedMainoksen sijoitus muuttuu — myös silloin, kun toisen mainostajan maksu aiheuttaa muutoksen.
ad.expiring_soon30, 7 tai 1 päivä ennen ilmoituksen voimassaolon päättymistä.
partner_ad_revenue.payout.completedMainostulojen jakosumma on saavuttanut maksetun tilan.
partner_ad_revenue.payout.failedMainostulojen jakosumman maksu epäonnistuu palveluntarjoajan puolella — osuudet palautuvat maksettavien erien joukkoon ja maksu yritetään uudelleen.

Ohjelmistokehityspaketit

Tämän saman API-määrittelyn pohjalta laadittuja virallisia JavaScript-/TypeScript- ja Python-SDK-paketteja on suunnitteilla, mutta niitä ei ole vielä julkaistu — siihen asti voit käyttää HTTP-rajapintaa suoraan.

Pikaopas

SDK:ta ei ole vielä saatavilla — nämä kutsuvat HTTP-rajapintaa suoraan ja toimivat jo nyt millä tahansa ohjelmointikielellä.

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