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 PreistabelleSie 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.
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/jsonAPI-Schlüssel werden von dem „Annual Ads“-Team an zugelassene Partnerkonten vergeben.
Partnerkonto erstellen| POST | /v1/partner/advertisersErstellen 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 |
| POST | /v1/partner/adsErstellen 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}/imageLaden 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-urlLegen 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}/rankAktueller Rang, Kategorie und geografischer Geltungsbereich einer Anzeige. | ads:read |
| GET | /v1/partner/ads/{id}/statsDie 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 |
| POST | /v1/partner/paymentsStarten 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 |
| POST | /v1/partner/referralsErstellen Sie einen Empfehlungslink. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsKumulierte Empfehlungsprovisionen, aufgeschlüsselt nach Status. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsIhr 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 |
| GET | /v1/partner/access-logVollständiger Aufrufverlauf für diesen Schlüssel – Methode, Pfad, IP-Adresse, Zeitstempel. | Beliebige |
| GET | /v1/rankings?category={id}&geo={scope}Schreibgeschütztes Ranking für eine Kategorie und einen geografischen Bereich. | Öffentlich |
| GET | /v1/tiersDie 7 konfigurierten Preisstufen (Schwellenwert, freigeschaltete Vorteile). | Öffentlich |
| GET | /v1/referral-programDie derzeit geltenden Provisionssätze für die Empfehlungskaskade und den Leaders Pool. | Öffentlich |
| GET | /v1/partner-programDie 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.
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.
| 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-studioErstellen Sie anhand einer kurzen Unternehmensbeschreibung einen Anzeigentitel, eine Beschreibung und Suchbegriffe. | 2 Kredit(e) |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageErstellen 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-advisorEine 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-auditAnalysieren Sie die externe Website des Werbekunden und schlagen Sie konkrete SEO-Verbesserungen vor. | 2 Kredit(e) |
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
}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.
<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>data-category | Anzuzeigende 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-geo | Geografischer Geltungsbereich: lokal, regional oder global. Standardmäßig ist „global“ eingestellt. |
data-count | Anzahl der anzuzeigenden Anzeigen. Standardwert ist 4. |
data-columns | Anzahl der Spalten im Raster. Standardwert ist 2. |
data-layout | Raster, 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-offset | Anzahl 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-partner | Ihre 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. |
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.
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.
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.succeeded | Eine Zahlung wurde bestätigt. |
payment.refunded | Eine Rückerstattung wird vorgenommen. |
ad.activated | Eine Anzeige wird automatisch oder nach Überprüfung durch einen Administrator geschaltet. |
invoice.issued | Es wird eine Rechnung ausgestellt. |
referral.payout.completed | Eine Empfehlungsprovision hat den Status „bezahlt“ erreicht. |
referral.payout.failed | Eine Zahlungscharge für Empfehlungsprovisionen schlägt beim Anbieter fehl – die Erlöse werden in den ausstehenden Zahlungen verbucht und erneut verarbeitet. |
rank.changed | Die Platzierung einer Anzeige ändert sich – auch dann, wenn dies durch die Zahlung eines anderen Werbetreibenden verursacht wird. |
ad.expiring_soon | 30, 7 oder 1 Tag(e) vor Ablauf einer Anzeige. |
partner_ad_revenue.payout.completed | Eine Auszahlung aus der Werbeeinnahmenbeteiligung hat den Status „bezahlt“ erreicht. |
partner_ad_revenue.payout.failed | Eine 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. |
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.
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": "...",
},
)