Guida per sviluppatori
Pubblicare campagne e inviare eventi
Integra le campagne sponsorizzate nella tua app in due passaggi: recupera le campagne che corrispondono al tuo contesto, poi invia un VIEW quando ne viene mostrata una e un CLICK quando viene toccata. Questa guida illustra l'intero ciclo con esempi pronti da copiare.
Panoramica
L'integrazione è un ciclo breve. Chiedi al nostro server quali campagne mostrare per una determinata posizione e contesto di menu, le mostri e restituisci gli eventi così i budget vengono addebitati e i report restano accurati.
Passaggio 1
Recupera campagne
Cerca le campagne che corrispondono alle tue categorie di ristoranti, alla posizione e ai prodotti.
Passaggio 2
Invia un VIEW
Quando una campagna viene mostrata a un utente, invia un evento VIEW.
Passaggio 3
Invia un CLICK
Quando l'utente la tocca, invia un evento CLICK.
https://adv.api.waithero.com (produzione). Per lo sviluppo locale usa http://localhost:3040.Recupera campagne
Chiama POST /api/v1/client/campaigns/search con il contesto per cui vuoi gli annunci: gli ID delle categorie di ristoranti, la posizione e i prodotti attualmente visibili. La risposta contiene le campagne da mostrare — conserva l<code>id</code> di ogni campagna, ti servirà per inviare gli eventi.
const res = await fetch(
"https://adv.api.waithero.com/api/v1/client/campaigns/search",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": process.env.CAMPAIGNS_API_KEY,
},
body: JSON.stringify({
restaurantCategoryIds: [12, 34],
areaLat: 45.4642,
areaLon: 9.19,
products: [
{ referenceId: "sku-123", productName: "Margherita", categoryName: "Pizza" },
],
}),
},
)
const { campaigns } = await res.json()
// Render campaigns, and remember each campaign.id for event reporting.Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| restaurantCategoryIds | integer[] | Sì | ID delle categorie di ristoranti da abbinare. Almeno uno. |
| areaLat | number | Sì | Latitudine dell'area per cui pubblichi gli annunci. |
| areaLon | number | Sì | Longitudine dell'area per cui pubblichi gli annunci. |
| products | object[] | Sì | I prodotti attualmente visibili — una voce per prodotto (struttura sotto). |
products[] — ogni prodotto
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| referenceId | string | Sì | Il tuo ID opaco del prodotto. Restituito in matchedProductReferenceIds così sai dove collocare la campagna. |
| productName | string | Sì | Nome visualizzato del prodotto. |
| categoryName | string | Sì | Nome della categoria del prodotto. |
Ogni campagna nella risposta include il suo id, il type (HOMEPAGE, SUGGESTION o HIGHLIGHT), l<code>advisor</code>, leventuale promotedProduct e matchedProductReferenceIds — i referenceId che hai inviato e a cui questa campagna corrisponde, così sai esattamente dove posizionarla.
Risposta — ogni elemento di campaigns[]
| Campo | Tipo | Descrizione |
|---|---|---|
| id | integer | ID della campagna. Conservalo — lo invii come idAdCampaign quando registri gli eventi. |
| type | "HOMEPAGE" | "SUGGESTION" | "HIGHLIGHT" | Dove mostrare la campagna. |
| status | "DRAFT" | "ACTIVE" | "PAUSED" | "ENDED" | Stato della campagna; le campagne pubblicate sono ACTIVE. |
| title | string | Titolo visualizzato (solo campagne homepage). |
| dateStart | string | null | Inizio della finestra di pubblicazione (ISO 8601), oppure null. |
| dateEnd | string | null | Fine della finestra di pubblicazione (ISO 8601), oppure null. |
| advisor | object | L'inserzionista dietro la campagna — campi: id, name, logo, link. |
| masterProducts | object[] | Prodotti presentati dalla campagna, ognuno con id, name, categoryName. |
| promotedProduct | object | L'unico prodotto promosso, se presente — id, name, categoryName. |
| matchedProductReferenceIds | string[] | I referenceId inviati a cui questa campagna corrisponde. |
| homepage | object | Creatività homepage (solo campagne homepage) — link, title, description, image. |
Invia eventi VIEW e CLICK
Invia un evento a POST /api/v1/events con l<code>idAdCampaign</code> della campagna e un <code>eventType</code> pari a <code>VIEW</code> o <code>CLICK</code>. Invia un <code>VIEW</code> nel momento in cui una campagna diventa visibile e un <code>CLICK</code> quando lutente la tocca.
async function reportEvent(idAdCampaign, eventType) {
await fetch("https://adv.api.waithero.com/api/v1/events", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": process.env.CAMPAIGNS_API_KEY,
},
body: JSON.stringify({ idAdCampaign, eventType }),
})
}
// When the ad is shown:
reportEvent(42, "VIEW")
// When the user taps it:
reportEvent(42, "CLICK")Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| idAdCampaign | integer | Sì | ID della campagna a cui si riferisce l'evento (l'id ottenuto dalla ricerca). |
| eventType | "VIEW" | "CLICK" | "BUY" | Sì | L'evento che stai registrando. |
| idUser | integer | No | ID facoltativo dell'utente finale, per l'attribuzione. |
Una chiamata riuscita restituisce l'evento registrato con l<code>amount</code> addebitato e il nuovo <code>remainingBudget</code> della campagna.
Risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| id | integer | ID dell'evento registrato. |
| idAdCampaign | integer | ID della campagna a cui si riferisce l'evento (l'id ottenuto dalla ricerca). |
| eventType | "VIEW" | "CLICK" | "BUY" | L'evento che stai registrando. |
| amount | number | Importo addebitato alla campagna per questo evento. |
| remainingBudget | number | Budget residuo della campagna dopo l'addebito. |
Inviare più campagne insieme
Se hai mostrato più campagne in una sola vista, inviale insieme con POST /api/v1/events/batch — stesso eventType e un elenco di ID campagna.
curl -X POST "https://adv.api.waithero.com/api/v1/events/batch" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{ "idAdCampaigns": [42, 43], "eventType": "VIEW" }'Corpo della richiesta batch
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| idAdCampaigns | integer[] | Sì | ID delle campagne per cui registrare lo stesso evento. Almeno uno. |
| eventType | "VIEW" | "CLICK" | "BUY" | Sì | L'evento che stai registrando. |
| idUser | integer | No | ID facoltativo dell'utente finale, per l'attribuzione. |
Risposta batch — ogni elemento di results[]
| Campo | Tipo | Descrizione |
|---|---|---|
| idAdCampaign | integer | ID della campagna a cui si riferisce l'evento (l'id ottenuto dalla ricerca). |
| status | "ok" | "error" | ok se l'evento è stato registrato per quella campagna, altrimenti error. |
| message | string | Dettaglio dell'errore quando status è error. |
results per campagna; ogni voce è ok o error, così una campagna in errore non blocca mai le altre.Errori e budget
La registrazione di un evento addebita il budget residuo della campagna (il suo costPerView o costPerClick). Quando il budget di una campagna raggiunge zero, viene terminata automaticamente e smette di comparire nelle ricerche successive. Gestisci queste risposte quando invii gli eventi:
| Stato | Significato |
|---|---|
| 400 | La campagna non è attiva, non è ancora iniziata, è terminata oppure il tipo di evento non è supportato. |
| 402 | Budget residuo insufficiente — la campagna non può più essere addebitata. |
| 404 | Campagna non trovata. |