Annual Ads

Entwicklerdokumentation

Arbeiten Sie direkt auf der Annual Ads-Plattform – legen Sie Werbekunden an, veröffentlichen Sie Anzeigen, lösen Sie Zahlungen aus und verfolgen Sie die Platzierung – alles über die API.

Zur vollständigen Preistabelle

Sie behalten 70 % von dem, was Ihre Werbekunden im Connect-Modus für ihre Anzeigen bezahlen – der Betrag wird automatisch auf Ihr Wallet überwiesen. Wie das funktioniert, erfahren Sie weiter unten.

Basis-URL

https://api.adhub365.com
OpenAPI 3

Authentifizierung

Jede Anfrage wird mithilfe eines geheimen Schlüssels im „Authorization“-Header unter Verwendung des „Bearer“-Schemas authentifiziert.

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

Sandbox und Produktion

Sandbox- und Produktionsschlüssel sind vollständig voneinander isoliert – ein Sandbox-Schlüssel kann niemals Daten lesen oder schreiben, die von einem Produktionsschlüssel erstellt wurden, und umgekehrt.

Anwendungsbereiche

Jeder Schlüssel ist auf die Bereiche beschränkt, für die er ausgestellt wurde – ein Schlüssel verfügt niemals über mehr Zugriffsrechte als das Partnerkonto, das ihn erstellt hat.

API-Schlüssel werden von dem „Annual Ads“-Team an zugelassene Partnerkonten vergeben.

Partnerkonto erstellen

Umsatzbeteiligung aus Werbung

Wenn Ihre API-Schlüssel Werbekundenkonten für Ihre eigenen Nutzer erstellen (Connect-Modus – siehe „Authentifizierung“ weiter oben), erhalten Sie einen Anteil an den Beträgen, die diese Werbekunden für ihre Anzeigen zahlen. Die unten aufgeführte Aufteilung wird live von diesem Endpunkt ausgelesen, ist niemals fest codiert und völlig unabhängig von der weiter unten auf dieser Seite beschriebenen Empfehlungsprovision.

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

70%

Das geht an dich

Die Auszahlung erfolgt automatisch auf Ihre konfigurierte Auszahlungs-Wallet – eine Auszahlungsanforderung ist nicht erforderlich.

30%

Geht zu den Jahresanzeigen

Behandelt die Themen Moderation, Hosting und die Ranking-Infrastruktur, auf der Ihre Anzeigen geschaltet werden.

So funktioniert es

  1. Einer Ihrer Werbekunden im Connect-Modus bezahlt eine Anzeige über Ihre Integration.
  2. Die Anzeige wird geprüft und freigegeben – entweder automatisch oder durch unser Moderationsteam.
  3. Ihr Anteil wird für die automatische Auszahlung auf Ihr Wallet in die Warteschlange gestellt – nach dem gleichen Prinzip wie beim unten beschriebenen Empfehlungsprogramm.
Eine Beteiligung wird erst dann generiert, wenn die Anzeige tatsächlich freigegeben wurde – wird sie bei der Moderation abgelehnt, entsteht kein Anspruch auf diese Zahlung. Eine Aufstockung einer bereits aktiven Anzeige birgt kein solches Risiko und wird sofort ausgeschüttet.

Auszahlungsbedingungen

  • In Ihrem Partnerkonto ist eine Wallet für Krypto-Auszahlungen eingerichtet.
  • Von Ihrer Seite ist keine KYC-Prüfung erforderlich – Ihr Partnerkonto wurde bereits bei der Erstellung überprüft.

Beispiel: Auslesen der kumulierten Anteile

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
}

Endpunkte

Konten

POST/v1/partner/advertisers

Erstellen Sie im Namen eines Ihrer Nutzer ein Werbekundenkonto (Connect-Modus).

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

Ein von diesem Partner erstelltes Werbekundenkonto suchen.

advertisers:read

Anzeigen

POST/v1/partner/ads

Erstellen Sie eine Anzeige. Diese wird zunächst als Entwurf gespeichert. Die optionalen Felder „advertiser_type“, „promotion_type“, „link_type“ und „promoted_brand“ beschreiben Affiliate-, Empfehlungs-, Creator- oder Einzelwerbung – siehe den Hinweis unten.

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

Eine Anzeige nachschlagen.

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

Redaktionelle Inhalte aktualisieren – Titel, Beschreibung, Link, Werbetreibendtyp, Werbemaßnahmetyp, Linktyp und beworbene Marke. Kategorie, geografische Angaben und alle anderen Faktoren, die von der Ranking-Engine berücksichtigt werden, können hier nicht geändert werden.

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

Laden Sie ein Anzeigenbild direkt hoch (JPEG/PNG/WebP, max. 5 MB). Dies ist vor der ersten Zahlung erforderlich – siehe den Abschnitt „Zahlungen“ weiter unten.

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

Legen Sie das Bild einer Anzeige über eine URL fest, anstatt eine Datei hochzuladen – der Server ruft es selbst ab und stellt es bereit. Gleiche Voraussetzung: Dies muss vor der ersten Zahlung erfolgen.

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

Aktueller Rang, Kategorie und geografischer Geltungsbereich einer Anzeige.

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

Die Gesamtzahl der Aufrufe und Klicks für eine Anzeige sowie die bereits verstrichenen bzw. verbleibenden Tage stammen aus den Feldern „activated_at“ und „expires_at“, die bereits in GET /{id} enthalten sind, und der Rang aus GET /{id}/rank.

ads:read

Zahlungen

POST/v1/partner/payments

Starten Sie eine Krypto-Zahlung für einen Erstkauf oder eine Aufladung. Eine Erstzahlung schlägt mit dem Fehlercode 422 fehl, es sei denn, die Anzeige enthält bereits ein Bild – siehe „uploadAdImage/setAdImageUrl“ weiter oben.

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

Den Status einer Zahlung überprüfen.

payments:read

Empfehlungen

POST/v1/partner/referrals

Erstellen Sie einen Empfehlungslink.

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

Kumulierte Empfehlungsprovisionen, aufgeschlüsselt nach Status.

referrals:read

Umsatzbeteiligung aus Werbung

GET/v1/partner/ad-revenue/earnings

Ihr Anteil von 70 % an den Beträgen, die die von Ihnen im Connect-Modus erstellten Werbekunden für ihre Anzeigen bezahlt haben, aufgeschlüsselt nach Status.

ad-revenue:read

Zugriffsprotokoll

GET/v1/partner/access-log

Vollständiger Aufrufverlauf für diesen Schlüssel – Methode, Pfad, IP-Adresse, Zeitstempel.

Beliebige

Öffentliche Endpunkte

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

Schreibgeschütztes Ranking für eine Kategorie und einen geografischen Bereich.

Öffentlich
GET/v1/tiers

Die 7 konfigurierten Preisstufen (Schwellenwert, freigeschaltete Vorteile).

Öffentlich
GET/v1/referral-program

Die derzeit geltenden Provisionssätze für die Empfehlungskaskade und den Leaders Pool.

Öffentlich
GET/v1/partner-program

Die derzeitige Aufteilung der Werbeeinnahmen (Connect-Modus) zwischen Ihnen und Annual Ads.

Öffentlich
GET/v1/search?q={query}

Suche in natürlicher Sprache – leitet eine Suchanfrage wie „Möbelwerber in Kenia“ an die passende Kategorie und den entsprechenden geografischen Bereich weiter und gibt dann das Ranking in seiner exakten Reihenfolge zurück.

Öffentlich

Affiliate- und Empfehlungswerbung

„advertiser_type“, „promotion_type“, „link_type“ und „promoted_brand“ sind optionale Felder bei POST- und PATCH-Anfragen an /v1/partner/ads – Annual Ads ist nicht auf Unternehmen beschränkt, die für sich selbst werben. Wenn „link_type“ den Wert „affiliate_link“ oder „referral_invitation_link“ hat oder „promotion_type“ den Wert „affiliate_offer“ oder „referral_opportunity“, muss „affiliate_terms_accepted“ den Wert „true“ haben, andernfalls wird die Anfrage mit einem 422-Fehler abgelehnt. „title“ ist auf 35 Zeichen und „description“ auf 80 Zeichen begrenzt – beides wird serverseitig durchgesetzt, nicht nur in der Benutzeroberfläche des Dashboards.

KI-Tools

Jedes Werbekundenkonto verfügt über eine Reihe integrierter KI-Tools – einen Generator für Anzeigeninhalte und -grafiken, einen Chat-Assistenten, einen Budgetberater und ein externes SEO-Prüftool –, die zusätzlich zum pauschalen Jahrespreis mit KI-Guthaben bezahlt werden.

Diese werden über den Login des Werbetreibenden in dessen Dashboard (ein Sitzungszugriffstoken) aufgerufen, nicht über einen API-Schlüssel eines Partners – eine Integration eines Drittanbieters kann sie nicht im Namen des Werbetreibenden aufrufen.
POST/v1/advertisers/{id}/ai/assistant

„Ask Annual Ads“ – ein schwebender Gesprächsassistent, der ausschließlich zu Informationszwecken dient und nur Lesezugriff auf Kontodaten hat.

Öffentlich
POST/v1/advertisers/{id}/ai/creative-studio

Erstellen Sie anhand einer kurzen Unternehmensbeschreibung einen Anzeigentitel, eine Beschreibung und Suchbegriffe.

2 Kredit(e)
POST/v1/advertisers/{id}/ai/creative-studio/image

Erstellen Sie aus derselben Unternehmensbeschreibung eine visuelle Darstellung (PNG), die bereits bereitgestellt ist und direkt an eine Anzeige angehängt werden kann.

8 Kredit(e)
POST/v1/advertisers/{id}/ai/budget-advisor

Eine echte statistische Prognose – niemals eine willkürliche Schätzung – der Wahrscheinlichkeit, einen bestimmten Rang nach 30, 90 bzw. 365 Tagen zu behalten.

1 Kredit(e)
POST/v1/advertisers/{id}/ai/seo-audit

Analysieren Sie die externe Website des Werbekunden und schlagen Sie konkrete SEO-Verbesserungen vor.

2 Kredit(e)

Beispiel – Anzeigeninhalt erstellen

Die gleiche Kategorie und Geschäftsbeschreibung dienen auch als Grundlage für den untenstehenden Bildgenerator.

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
}

Erstellen Sie eine passende Grafik für dieselbe Anzeige:

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

Fügen Sie eine vorgefertigte Anzeigeneinheit in Ihre eigene Website ein – ganz ohne Programmieraufwand und ohne Iframe. Das Skript wird direkt auf der Seite in einem isolierten Shadow-DOM gerendert, sodass dessen Stile niemals auf Ihre Website übergreifen und umgekehrt auch die Stile Ihrer Website niemals in das Skript übergreifen.

Füge es deiner Seite hinzu

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

Standardmäßig wird hier die vollständige öffentliche Rangliste für die Kategorie angezeigt – also alle Werbetreibenden auf der Plattform, nicht nur diejenigen, die Sie geworben haben. Um nur die Anzeigen der Werbetreibenden anzuzeigen, die Sie über den Connect-Modus gewonnen haben (d. h. diejenigen, die Ihren Anteil generieren), fügen Sie „data-partner“ mit Ihrer Partner-ID hinzu (diese finden Sie auf der Seite „Entwickler“ in Ihrem eigenen 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>

Wenn Ihre Werbekunden mehrere Kategorien abdecken, lassen Sie „data-category“ ganz weg – mit „data-partner“ allein zeigt das Widget alle Ihre Anzeigen aus allen Kategorien in einem Raster an, sodass Sie nicht für jede Kategorie einen eigenen Widget-Block benötigen:

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

Möchten Sie neben Ihrem Widget im Inhalt ein weiteres im Fußbereich platzieren, in dem jeweils andere Anzeigen angezeigt werden? Fügen Sie einen zweiten Widget-Block mit „data-layout=“compact““ (eine einzelne Anzeige, die sich zu einer kleinen Pille zusammenklappen lässt) hinzu und setzen Sie „data-offset“ auf die Anzahl der Anzeigen, die Ihr erstes Widget bereits anzeigt:

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

Attribute

data-categoryAnzuzeigende Kategorie-ID. Erforderlich – es sei denn, „data-partner“ ist festgelegt; in diesem Fall werden durch Weglassen die Anzeigen dieses Partners in allen Kategorien angezeigt.
data-geoGeografischer Geltungsbereich: lokal, regional oder global. Standardmäßig ist „global“ eingestellt.
data-countAnzahl der anzuzeigenden Anzeigen. Standardwert ist 4.
data-columnsAnzahl der Spalten im Raster. Standardwert ist 2.
data-layoutRaster, Liste oder Kompaktansicht. Standardmäßig ist „Raster“ eingestellt. Bei der Kompaktansicht wird eine einzelne Anzeige (der Wert von „data-count“ wird ignoriert) mit einer Schaltfläche angezeigt, über die sie zu einer kleinen Pille minimiert und wieder herangezogen werden kann – eine Einheit im Fußzeilenstil, die vom Skript selbst niemals fest positioniert wird; Sie können das Container-Div auf Ihrer eigenen Seite nach Belieben platzieren und gestalten.
data-offsetAnzahl der Anzeigen mit der höchsten Platzierung, die übersprungen werden sollen. Der Standardwert ist 0. Damit kann ein zweites Widget auf derselben Seite (z. B. ein kompaktes Widget in der Fußzeile und ein Raster-Widget weiter oben) andere Anzeigen anzeigen, anstatt dieselbe Anzeige zweimal zu wiederholen – geben Sie die Anzahl der Anzeigen an, die das andere Widget bereits anzeigt.
data-partnerIhre Partner-ID (zu finden auf der Seite „Entwickler“ in Ihrem eigenen Dashboard). Optional – ohne diese ID zeigt das Widget die vollständige öffentliche Rangliste für diese Kategorie an, also alle Werbetreibenden auf der Plattform. Mit dieser ID werden nur Anzeigen von Werbetreibenden angezeigt, die Sie über den Connect-Modus gewonnen haben – also diejenigen, die tatsächlich Ihren Anteil generieren.

Umsatzbeteiligung

Wie die Empfehlungsprovision eines Partners tatsächlich bei ihm ankommt – der Prozentsatz, die Auszahlungsmodalitäten und die Voraussetzungen.

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
}

Keine feste Zahl

Der Provisionssatz wird von uns festgelegt und kann sich ändern – lesen Sie ihn daher immer direkt von diesem Endpunkt ab, anstatt einen Wert fest zu programmieren.

Vollautomatisch

Es gibt keinen Auszahlungszeitpunkt. Ein planmäßiger Job ermittelt die auszuzahlenden Einnahmen, fasst sie nach Werbetreibenden zusammen und führt die Auszahlung automatisch durch, sobald alle unten aufgeführten Bedingungen erfüllt sind.

Auszahlungsbedingungen

  • Die insgesamt auszuzahlenden Einnahmen des Werbetreibenden erreichen den Mindestauszahlungsbetrag.
  • In ihrem Konto ist eine Wallet für Krypto-Auszahlungen eingerichtet.
  • Ihr KYC-Status ist verifiziert.

Beispiel: Ablesen der kumulierten Erträge

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
}

Preisstufen (live)

Lesen Sie die Werte live von diesem Endpunkt aus – geben Sie diese Werte niemals fest ein, da sie sich auf unserer Seite ändern können. Erstellen Sie für Ihre eigenen Nutzer eine Preisauswahl statt eines Feldes für einen frei wählbaren Betrag: Jeder angezeigte Preis entspricht bereits dem genauen Betrag, der bei der Erstellung der Zahlung zu überweisen ist, und die hier angezeigten freigeschalteten Vorteile erklären den Nutzern genau, was sie für diesen Preis erhalten, sodass sie einen Preis wählen, den sie verstehen, anstatt eine Zahl zu erraten.

TierPreisFreischaltungen
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Klickbarer Link
Gold$500.00

Animation unlocked

Klickbarer LinkAnimation
Platinum$1,000.00

Enhanced exposure

Klickbarer LinkAnimation
Diamond$2,500.00

Premium placement

Klickbarer LinkAnimation
Elite$5,000.00

Top-tier visibility

Klickbarer LinkAnimation
Legendary$10,000.00

Maximum visibility & branding

Klickbarer LinkAnimation

Ratenbegrenzungen

Die Anzahl der Anfragen ist pro Schlüssel und Minute begrenzt. Jede authentifizierte Antwort enthält die Header „X-RateLimit-Limit“, „X-RateLimit-Remaining“ und „X-RateLimit-Reset“; bei Überschreitung des Limits wird der Status „429 Too Many Requests“ mit einem „Retry-After“-Header zurückgegeben.

IP-Zulassungsliste

Optional, pro Partner. Solange Sie keinen Eintrag hinzufügen, akzeptieren Ihre Schlüssel Anfragen von jeder beliebigen IP-Adresse – der erste Eintrag stellt alle Schlüssel dieses Partners so ein, dass nur noch Adressen aus der Whitelist zugelassen werden.

Webhooks

Jeder Webhook wird mit HMAC-SHA256 unter Verwendung eines einmaligen, bei der Erstellung generierten Geheimschlüssels signiert – überprüfen Sie die Signatur, bevor Sie der Nutzlast vertrauen. Ereignisse werden ausschließlich an den Partner übermittelt, dem der jeweilige Werbetreibende angehört.

payment.succeededEine Zahlung wurde bestätigt.
payment.refundedEine Rückerstattung wird vorgenommen.
ad.activatedEine Anzeige wird automatisch oder nach Überprüfung durch einen Administrator geschaltet.
invoice.issuedEs wird eine Rechnung ausgestellt.
referral.payout.completedEine Empfehlungsprovision hat den Status „bezahlt“ erreicht.
referral.payout.failedEine Zahlungscharge für Empfehlungsprovisionen schlägt beim Anbieter fehl – die Erlöse werden in den ausstehenden Zahlungen verbucht und erneut verarbeitet.
rank.changedDie Platzierung einer Anzeige ändert sich – auch dann, wenn dies durch die Zahlung eines anderen Werbetreibenden verursacht wird.
ad.expiring_soon30, 7 oder 1 Tag(e) vor Ablauf einer Anzeige.
partner_ad_revenue.payout.completedEine Auszahlung aus der Werbeeinnahmenbeteiligung hat den Status „bezahlt“ erreicht.
partner_ad_revenue.payout.failedEine Stapelverarbeitung zur Auszahlung von Anteilen an Werbeeinnahmen schlägt beim Anbieter fehl – die Anteile werden wieder in die Auszahlungsliste aufgenommen und der Vorgang wird erneut versucht.

SDKs

Offizielle JavaScript-/TypeScript- und Python-SDKs, die auf Basis derselben API-Spezifikation erstellt wurden, sind geplant, aber noch nicht veröffentlicht – bis dahin sollten Sie die HTTP-API direkt aufrufen.

Schnellstart

Es gibt noch kein SDK – diese rufen die HTTP-API direkt auf und funktionieren bereits heute in jeder Programmiersprache.

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