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 prislistanDu 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.
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/jsonAPI-nycklar utfärdas till godkända partnerkonton av Annual Ads-teamet.
Skapa ett partnerkonto| POST | /v1/partner/advertisersSkapa 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 |
| POST | /v1/partner/adsSkapa 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}/imageLadda 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-urlAnge 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}/rankAktuell placering, kategori och geografisk räckvidd för en annons. | ads:read |
| GET | /v1/partner/ads/{id}/statsTotalt 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 |
| POST | /v1/partner/paymentsStarta 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 |
| POST | /v1/partner/referralsSkapa en rekommendationslänk. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsAckumulerade intäkter från rekommendationer, uppdelade efter status. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsDin 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 |
| GET | /v1/partner/access-logFullständig samtalshistorik för denna nyckel – metod, sökväg, IP-adress, tidsstämpel. | Där |
| GET | /v1/rankings?category={id}&geo={scope}Läsbar ranking för en kategori och ett geografiskt område. | Allmänt |
| GET | /v1/tiersDe 7 konfigurerade prisnivåerna (tröskelvärde, tillgängliga förmåner). | Allmänt |
| GET | /v1/referral-programDe provisionsprocent som för närvarande gäller för rekommendationskedjan och Leaders Pool. | Allmänt |
| GET | /v1/partner-programDen 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.
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.
| POST | /v1/advertisers/{id}/ai/assistantFrå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-studioSkapa en annonstitel, beskrivning och sökord utifrån en kort företagsbeskrivning. | 2 studiepoäng |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageSkapa 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-advisorEn 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-auditAnalysera annonsörens egen externa webbplats och föreslå konkreta SEO-förbättringar. | 2 studiepoäng |
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
}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.
<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>data-category | Kategori-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-geo | Geografisk räckvidd: lokal, regional eller global. Standardinställningen är global. |
data-count | Antal annonser som ska visas. Standardvärdet är 4. |
data-columns | Antal kolumner i tabellen. Standardvärdet är 2. |
data-layout | rutnä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-offset | Antal 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-partner | Ditt 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. |
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.
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.
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.succeeded | En betalning har bekräftats. |
payment.refunded | En återbetalning har genomförts. |
ad.activated | En annons publiceras, antingen automatiskt eller efter granskning av en administratör. |
invoice.issued | En faktura utfärdas. |
referral.payout.completed | En hänvisningsprovision har nått statusen ”betald”. |
referral.payout.failed | En 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.changed | En annonss placering förändras – bland annat när en annan annonsörs betalning leder till detta. |
ad.expiring_soon | 30, 7 eller 1 dag(ar) innan en annons löper ut. |
partner_ad_revenue.payout.completed | En utbetalning av andel av annonsintäkterna har nått statusen ”betald”. |
partner_ad_revenue.payout.failed | En 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. |
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.
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": "...",
},
)