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.

URL di base per tutte le richieste: 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

CampoTipoObbligatorioDescrizione
restaurantCategoryIdsinteger[]SìID delle categorie di ristoranti da abbinare. Almeno uno.
areaLatnumberSìLatitudine dell'area per cui pubblichi gli annunci.
areaLonnumberSìLongitudine dell'area per cui pubblichi gli annunci.
productsobject[]SìI prodotti attualmente visibili — una voce per prodotto (struttura sotto).

products[] — ogni prodotto

CampoTipoObbligatorioDescrizione
referenceIdstringSìIl tuo ID opaco del prodotto. Restituito in matchedProductReferenceIds così sai dove collocare la campagna.
productNamestringSìNome visualizzato del prodotto.
categoryNamestringSì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[]

CampoTipoDescrizione
idintegerID 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.
titlestringTitolo visualizzato (solo campagne homepage).
dateStartstring | nullInizio della finestra di pubblicazione (ISO 8601), oppure null.
dateEndstring | nullFine della finestra di pubblicazione (ISO 8601), oppure null.
advisorobjectL'inserzionista dietro la campagna — campi: id, name, logo, link.
masterProductsobject[]Prodotti presentati dalla campagna, ognuno con id, name, categoryName.
promotedProductobjectL'unico prodotto promosso, se presente — id, name, categoryName.
matchedProductReferenceIdsstring[]I referenceId inviati a cui questa campagna corrisponde.
homepageobjectCreatività 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

CampoTipoObbligatorioDescrizione
idAdCampaignintegerSìID della campagna a cui si riferisce l'evento (l'id ottenuto dalla ricerca).
eventType"VIEW" | "CLICK" | "BUY"SìL'evento che stai registrando.
idUserintegerNoID 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

CampoTipoDescrizione
idintegerID dell'evento registrato.
idAdCampaignintegerID della campagna a cui si riferisce l'evento (l'id ottenuto dalla ricerca).
eventType"VIEW" | "CLICK" | "BUY"L'evento che stai registrando.
amountnumberImporto addebitato alla campagna per questo evento.
remainingBudgetnumberBudget 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

CampoTipoObbligatorioDescrizione
idAdCampaignsinteger[]SìID delle campagne per cui registrare lo stesso evento. Almeno uno.
eventType"VIEW" | "CLICK" | "BUY"SìL'evento che stai registrando.
idUserintegerNoID facoltativo dell'utente finale, per l'attribuzione.

Risposta batch — ogni elemento di results[]

CampoTipoDescrizione
idAdCampaignintegerID 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.
messagestringDettaglio dell'errore quando status è error.
L'endpoint batch restituisce un array 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:

StatoSignificato
400La campagna non è attiva, non è ancora iniziata, è terminata oppure il tipo di evento non è supportato.
402Budget residuo insufficiente — la campagna non può più essere addebitata.
404Campagna non trovata.