Sviluppa direttamente sulla piattaforma Annual Ads: crea inserzionisti, pubblica annunci, avvia i pagamenti e monitora il posizionamento, il tutto tramite l'API.
Consulta la tabella completa dei prezziTi rimane il 70% di quanto pagano gli inserzionisti in modalità Connect per i loro annunci — importo che viene versato automaticamente sul tuo portafoglio. Scopri come funziona qui sotto.
Ogni richiesta viene autenticata tramite una chiave segreta nell'intestazione Authorization, utilizzando lo schema Bearer.
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonLe chiavi API vengono rilasciate agli account dei partner approvati dal team Annual Ads.
Crea un account partner| POST | /v1/partner/advertisersCrea un account inserzionista per conto di uno dei tuoi utenti (modalità Connect). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Cerca un account pubblicitario creato da questo partner. | advertisers:read |
| POST | /v1/partner/adsCrea un annuncio. Inizialmente avrà lo stato di bozza. I campi facoltativi `advertiser_type`, `promotion_type`, `link_type` e `promoted_brand` descrivono la pubblicità di affiliazione, di referral, di creator o individuale — vedi la nota qui sotto. | ads:write |
| GET | /v1/partner/ads/{id}Cerca un annuncio. | ads:read |
| PATCH | /v1/partner/ads/{id}Aggiorna i contenuti editoriali: titolo, descrizione, link, tipo di inserzionista, tipo di promozione, tipo di link e marchio promosso. La categoria, l'area geografica e qualsiasi altro dato preso in considerazione dal motore di classificazione non possono mai essere modificati in questa sezione. | ads:write |
| POST | /v1/partner/ads/{id}/imageCarica direttamente un’immagine per l’annuncio (formati JPEG/PNG/WebP, max 5 MB). Obbligatorio prima del primo pagamento — vedi la sezione dedicata ai pagamenti qui sotto. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlImposta l'immagine di un annuncio tramite un URL invece di caricare un file: il server la recupera e la ospita autonomamente. Stesso requisito: da soddisfare prima del primo pagamento. | ads:write |
| GET | /v1/partner/ads/{id}/rankPosizione attuale, categoria e ambito geografico di un annuncio. | ads:read |
| GET | /v1/partner/ads/{id}/statsIl totale delle visualizzazioni e dei clic per un annuncio — i giorni trascorsi/rimanenti provengono dai campi `activated_at`/`expires_at` già presenti in GET /{id}, mentre il posizionamento proviene da GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsAvvia un pagamento in criptovaluta per un primo acquisto o una ricarica. Il pagamento iniziale genera un errore 422 a meno che l'annuncio non contenga già un'immagine — vedi uploadAdImage/setAdImageUrl sopra. | payments:write |
| GET | /v1/partner/payments/{id}Verifica lo stato di un pagamento. | payments:read |
| POST | /v1/partner/referralsCrea un link di riferimento. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsGuadagni cumulativi derivanti dai referral, suddivisi per stato. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsLa tua quota del 70% di quanto gli inserzionisti che hai creato in modalità Connect hanno pagato per i loro annunci, suddivisa per stato. | ad-revenue:read |
| GET | /v1/partner/access-logCronologia completa delle chiamate per questa chiave: metodo, percorso, indirizzo IP, data e ora. | Qualsiasi |
| GET | /v1/rankings?category={id}&geo={scope}Classifica in sola lettura per una categoria e un ambito geografico. | Pubblico |
| GET | /v1/tiersI 7 livelli tariffari configurati (soglia, vantaggi sbloccati). | Pubblico |
| GET | /v1/referral-programLe percentuali di commissione attualmente in vigore per la cascata di referral e il Leaders Pool. | Pubblico |
| GET | /v1/partner-programL'attuale ripartizione dei ricavi pubblicitari (modalità Connect) tra te e Annual Ads. | Pubblico |
| GET | /v1/search?q={query}Ricerca in linguaggio naturale: indirizza una query come "pubblicitari di mobili in Kenya" alla categoria e all'area geografica corrispondenti, quindi restituisce la classifica, nell'ordine esatto in cui appare. | Pubblico |
Pubblicità di affiliazione e di segnalazione
advertiser_type, promotion_type, link_type e promoted_brand sono campi facoltativi nelle richieste POST e PATCH a /v1/partner/ads — Annual Ads non si limita alle aziende che pubblicizzano se stesse. Quando link_type è affiliate_link o referral_invitation_link, oppure promotion_type è affiliate_offer o referral_opportunity, affiliate_terms_accepted deve essere true, altrimenti la richiesta viene respinta con un codice di errore 422. title ha un limite massimo di 35 caratteri e description di 80 — entrambi i limiti sono applicati lato server, non solo nell’interfaccia utente della dashboard.
Ogni account pubblicitario dispone di una serie di strumenti basati sull’intelligenza artificiale integrati — un generatore di contenuti e immagini pubblicitarie, un assistente conversazionale, un consulente per la gestione del budget e uno strumento di verifica SEO esterno — pagabili con crediti AI, oltre al canone annuale forfettario.
| POST | /v1/advertisers/{id}/ai/assistantChiedi ad Annual Ads — un assistente conversazionale fluttuante, a scopo puramente informativo, con accesso in sola lettura ai dati dell'account. | Pubblico |
| POST | /v1/advertisers/{id}/ai/creative-studioGenera il titolo, la descrizione e le parole chiave di un annuncio partendo da una breve descrizione dell'attività. | 2 crediti |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageGenera un’immagine di presentazione (PNG) basata sulla stessa descrizione dell’attività, già ospitata e pronta per essere allegata a un annuncio. | 8 crediti |
| POST | /v1/advertisers/{id}/ai/budget-advisorUna vera e propria proiezione statistica — mai una semplice ipotesi — delle probabilità di mantenere un determinato rango a 30, 90 e 365 giorni. | 1 crediti |
| POST | /v1/advertisers/{id}/ai/seo-auditAnalizzare il sito web esterno dell'inserzionista e proporre miglioramenti concreti in termini di SEO. | 2 crediti |
La stessa categoria e la stessa descrizione dell'attività sono alla base anche del generatore di immagini riportato di seguito.
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
}Genera un'immagine corrispondente per lo stesso annuncio:
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
}Inserisci un blocco pubblicitario già pronto sul tuo sito: nessuna fase di creazione, nessun iframe. Lo script viene visualizzato direttamente nella pagina all’interno di uno Shadow DOM isolato, quindi i suoi stili non interferiscono mai con il tuo sito e viceversa.
<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>Per impostazione predefinita, viene visualizzata la classifica pubblica completa della categoria, ovvero tutti gli inserzionisti presenti sulla piattaforma, non solo quelli che hai acquisito tu. Per visualizzare solo gli annunci degli inserzionisti che hai creato tramite la modalità Connect (quelli che generano la tua quota), aggiungi "data-partner" con il tuo ID partner (lo trovi nella pagina "Sviluppatori" della tua 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>Se i tuoi inserzionisti appartengono a diverse categorie, elimina del tutto "data-category": utilizzando solo "data-partner", il widget mostrerà tutti i tuoi annunci di tutte le categorie in un'unica griglia, invece di richiedere un blocco widget per ogni categoria:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>Vuoi un'unità in stile piè di pagina accanto a quella inserita nel contenuto, in modo che ciascuna mostri annunci diversi? Aggiungi un secondo blocco widget con data-layout="compact" (un singolo annuncio, comprimibile in una piccola pillola) e data-offset impostato sul numero di annunci già visualizzati dal tuo primo widget:
<!-- 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 | ID della categoria da visualizzare. Obbligatorio — a meno che non sia impostato "data-partner"; in tal caso, omettendolo, verranno visualizzati gli annunci di quel partner in tutte le categorie. |
data-geo | Ambito geografico: locale, regionale o globale. L'impostazione predefinita è "globale". |
data-count | Numero di annunci da visualizzare. Il valore predefinito è 4. |
data-columns | Numero di colonne della griglia. Il valore predefinito è 2. |
data-layout | griglia, elenco o compatto. L'impostazione predefinita è "griglia". L'opzione "compatto" mostra un singolo annuncio (il valore di `data-count` viene ignorato) con un pulsante che consente di ridurlo in una piccola pillola e di ripristinarlo: si tratta di un'unità in stile piè di pagina, che lo script non posiziona mai in modo fisso; spetta a te posizionare e personalizzare il div contenitore come preferisci nella tua pagina. |
data-offset | Numero di annunci in cima alla classifica da saltare. Il valore predefinito è 0. Consente a un secondo widget nella stessa pagina (ad esempio, uno compatto nel piè di pagina e uno a griglia più in alto) di mostrare annunci diversi invece di ripetere lo stesso annuncio due volte: specificare il numero di annunci già visualizzati dall'altro widget. |
data-partner | Il tuo ID partner (lo trovi nella pagina "Sviluppatori" della tua dashboard). Facoltativo: senza questo ID, il widget mostra la classifica pubblica completa per quella categoria, ovvero tutti gli inserzionisti presenti sulla piattaforma. Con questo ID, vengono visualizzati solo gli annunci degli inserzionisti che hai acquisito tramite la modalità Connect, ovvero quelli che generano effettivamente la tua quota. |
Il numero di richieste è limitato per chiave e al minuto. Ogni risposta autenticata include le intestazioni X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset; il superamento del limite comporta la restituzione del codice di errore 429 Too Many Requests con l'intestazione Retry-After.
Opzionale, per partner. Finché non si aggiunge una voce, le chiavi accettano richieste da qualsiasi indirizzo IP; la prima voce imposta tutte le chiavi di quel partner in modo che accettino solo gli indirizzi presenti nella lista bianca.
Ogni webhook è firmato con HMAC-SHA256 utilizzando una chiave segreta generata una sola volta al momento della creazione: verificare la firma prima di considerare attendibile il payload. Gli eventi vengono inviati esclusivamente al partner a cui appartiene l'inserzionista in questione.
payment.succeeded | Il pagamento è stato confermato. |
payment.refunded | Il rimborso è stato effettuato. |
ad.activated | Un annuncio viene pubblicato, automaticamente o dopo la revisione da parte dell'amministratore. |
invoice.issued | Viene emessa una fattura. |
referral.payout.completed | Una commissione di segnalazione raggiunge lo stato "pagata". |
referral.payout.failed | Un lotto di pagamenti relativi ai referral non va a buon fine presso il fornitore: i guadagni tornano nella voce “da pagare” e vengono riprovati. |
rank.changed | Il posizionamento di un annuncio cambia, anche quando ciò è determinato dal pagamento effettuato da un altro inserzionista. |
ad.expiring_soon | 30, 7 o 1 giorno prima della scadenza di un annuncio. |
partner_ad_revenue.payout.completed | Un pagamento relativo alla quota di ricavi pubblicitari raggiunge lo stato "pagato". |
partner_ad_revenue.payout.failed | Un batch di pagamento relativo alla quota di ricavi pubblicitari non va a buon fine presso il fornitore: le quote tornano nella voce "da pagare" e vengono riprovate. |
Sono previsti SDK ufficiali per JavaScript/TypeScript e Python, generati sulla base di questa stessa specifica API, ma non sono ancora stati pubblicati: fino ad allora, si prega di richiamare direttamente l'API HTTP.
Non è ancora disponibile un SDK: queste funzionalità richiamano direttamente l'API HTTP e funzionano già oggi in qualsiasi linguaggio di programmazione.
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": "...",
},
)