Annual Ads

Documentazione per sviluppatori

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 prezzi

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

URL di base

https://api.adhub365.com
OpenAPI 3

Autenticazione

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

Sandbox e produzione

Le chiavi dell'ambiente di test e quelle dell'ambiente di produzione sono completamente isolate l'una dall'altra: una chiave dell'ambiente di test non può mai leggere né scrivere dati creati da una chiave dell'ambiente di produzione, e viceversa.

Campi di applicazione

Ogni chiave è limitata agli ambiti per cui è stata emessa: una chiave non ha mai un livello di accesso superiore a quello dell’account partner che l’ha creata.

Le chiavi API vengono rilasciate agli account dei partner approvati dal team Annual Ads.

Crea un account partner

Ripartizione dei ricavi pubblicitari

Se le tue chiavi API creano account pubblicitari per i tuoi utenti (modalità Connect — vedi la sezione “Autenticazione” sopra), guadagni una percentuale su quanto pagano tali inserzionisti per i propri annunci. La ripartizione riportata di seguito viene letta in tempo reale da questo stesso endpoint, non è mai hardcoded ed è completamente separata dalla commissione di referral indicata più in basso in questa pagina.

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

70%

A te

Il pagamento viene versato automaticamente sul portafoglio di pagamento da te configurato — non è necessaria alcuna richiesta di prelievo.

30%

Vai alla sezione "Pubblicità annuali"

Tratta argomenti quali la moderazione, l'hosting e l'infrastruttura di classificazione su cui vengono pubblicati i tuoi annunci.

Come funziona

  1. Uno dei tuoi inserzionisti in modalità Connect paga un annuncio tramite la tua integrazione.
  2. L'annuncio viene esaminato e approvato, automaticamente o dal nostro team di moderazione.
  3. La tua quota è in coda per il pagamento automatico sul tuo portafoglio, con lo stesso meccanismo del programma di referral descritto di seguito.
Una quota non viene mai generata prima che l'annuncio sia stato effettivamente approvato: se la moderazione lo rifiuta, non è dovuto alcun importo relativo a quel pagamento. Una ricarica su un annuncio già attivo non comporta alcun rischio di questo tipo e viene ripartita immediatamente.

Condizioni di pagamento

  • Sul tuo account partner è stato configurato un portafoglio per i pagamenti in criptovaluta.
  • Non è richiesta alcuna procedura KYC da parte tua: il tuo account partner è già stato verificato al momento della creazione.

Esempio: lettura delle quote accumulate

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
}

Punti finali

Conti

POST/v1/partner/advertisers

Crea 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

Pubblicità

POST/v1/partner/ads

Crea 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}/image

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

Imposta 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}/rank

Posizione attuale, categoria e ambito geografico di un annuncio.

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

Il 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

Pagamenti

POST/v1/partner/payments

Avvia 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

Segnalazioni

POST/v1/partner/referrals

Crea un link di riferimento.

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

Guadagni cumulativi derivanti dai referral, suddivisi per stato.

referrals:read

Ripartizione dei ricavi pubblicitari

GET/v1/partner/ad-revenue/earnings

La 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

Registro degli accessi

GET/v1/partner/access-log

Cronologia completa delle chiamate per questa chiave: metodo, percorso, indirizzo IP, data e ora.

Qualsiasi

Endpoint pubblici

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

Classifica in sola lettura per una categoria e un ambito geografico.

Pubblico
GET/v1/tiers

I 7 livelli tariffari configurati (soglia, vantaggi sbloccati).

Pubblico
GET/v1/referral-program

Le percentuali di commissione attualmente in vigore per la cascata di referral e il Leaders Pool.

Pubblico
GET/v1/partner-program

L'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.

Strumenti di intelligenza artificiale

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.

Queste operazioni vengono eseguite tramite l'accesso alla dashboard dell'inserzionista (un token di accesso alla sessione), non tramite una chiave API di un partner: un'integrazione di terze parti non può richiamarle per conto dell'inserzionista.
POST/v1/advertisers/{id}/ai/assistant

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

Genera 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/image

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

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

Analizzare il sito web esterno dell'inserzionista e proporre miglioramenti concreti in termini di SEO.

2 crediti

Esempio — generare contenuti pubblicitari

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
}

Widget

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.

Aggiungilo alla tua pagina

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

Attributi

data-categoryID 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-geoAmbito geografico: locale, regionale o globale. L'impostazione predefinita è "globale".
data-countNumero di annunci da visualizzare. Il valore predefinito è 4.
data-columnsNumero di colonne della griglia. Il valore predefinito è 2.
data-layoutgriglia, 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-offsetNumero 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-partnerIl 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.

Quota dei ricavi

Come viene effettivamente corrisposta al partner la commissione di segnalazione: la percentuale, le modalità di pagamento e i requisiti necessari.

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
}

Non è un numero fisso

La percentuale di commissione viene configurata da noi e può subire variazioni: ti consigliamo di leggerla sempre in tempo reale da questo endpoint, anziché inserire un valore fisso nel codice.

Completamente automatico

Non è previsto un termine per il prelievo. Un’attività pianificata calcola i guadagni maturati, li raggruppa per inserzionista ed effettua il pagamento automaticamente una volta soddisfatte tutte le condizioni riportate di seguito.

Condizioni di pagamento

  • I guadagni totali dovuti all'inserzionista raggiungono l'importo minimo di pagamento.
  • Sul loro conto è stato configurato un portafoglio per il prelievo di criptovalute.
  • Il loro stato KYC è stato verificato.

Esempio: lettura degli utili accumulati

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
}

Livelli di prezzo (attivi)

Leggi i dati in tempo reale da questo endpoint — non inserire mai questi valori in modo statico, poiché potrebbero cambiare da parte nostra. Crea un selettore di livelli per i tuoi utenti invece di un campo con importo libero: ogni prezzo visualizzato corrisponde già all’importo esatto da inviare al momento della creazione del pagamento, e i vantaggi sbloccati qui indicati spiegano agli utenti esattamente cosa ottengono con quel prezzo, in modo che scelgano un prezzo che comprendono invece di indovinare una cifra.

LivelloPrezzoSblocchi
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Link cliccabile
Gold$500.00

Animation unlocked

Link cliccabileAnimazione
Platinum$1,000.00

Enhanced exposure

Link cliccabileAnimazione
Diamond$2,500.00

Premium placement

Link cliccabileAnimazione
Elite$5,000.00

Top-tier visibility

Link cliccabileAnimazione
Legendary$10,000.00

Maximum visibility & branding

Link cliccabileAnimazione

Limiti di frequenza

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.

Lista di indirizzi IP autorizzati

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.

Webhook

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.succeededIl pagamento è stato confermato.
payment.refundedIl rimborso è stato effettuato.
ad.activatedUn annuncio viene pubblicato, automaticamente o dopo la revisione da parte dell'amministratore.
invoice.issuedViene emessa una fattura.
referral.payout.completedUna commissione di segnalazione raggiunge lo stato "pagata".
referral.payout.failedUn 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.changedIl posizionamento di un annuncio cambia, anche quando ciò è determinato dal pagamento effettuato da un altro inserzionista.
ad.expiring_soon30, 7 o 1 giorno prima della scadenza di un annuncio.
partner_ad_revenue.payout.completedUn pagamento relativo alla quota di ricavi pubblicitari raggiunge lo stato "pagato".
partner_ad_revenue.payout.failedUn 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.

SDK

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.

Guida rapida

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