Costruisca la Sua integrazione
Il Suo catalogo, i Suoi posti liberi, i Suoi ordini, i Suoi biglietti e le Sue scansioni può recuperarli anche un altro programma, che può anche creare ordini da sé. Ecco come funziona — prima in parole semplici, poi con il codice.
- Indirizzo di base
- https://passavo.eu/api/v1
- Versione attuale
- 2026-09-20
- La descrizione stessa
- openapi.json
Che cos’è un’API, e Le serve?
Un’API è una porta sul retro del Suo account. Dove Lei clicca nella schermata di gestione, un programma può passare da quella porta per leggere i Suoi dati o scriverci — senza nessuno davanti a uno schermo.
Le serve solo quando vuole qualcosa che la schermata di gestione non fa: numeri nel Suo sistema, posti liberi sul Suo sito, biglietti da una cassa che ha già. Se può cliccarlo, cliccare è più veloce.
Chi costruisce l’integrazione — il Suo webmaster, il Suo gestionale contabile, qualcuno che sa programmare — ha bisogno di due cose: l’indirizzo qui sotto e una chiave che crea Lei stesso.
Che cosa può costruire
I posti liberi sul Suo sito
Mostri sulla Sua home page quali visite hanno ancora posto questa settimana, nella Sua grafica, con numeri corretti in quel preciso momento.
Alimentare la contabilità
Lasci che il Suo commercialista o il Suo gestionale recuperi da solo le vendite del mese scorso, invece di inviare un export ogni mese.
Uno schermo all’ingresso
Un tablet nell’atrio che mostra quale fascia oraria sta per iniziare e quanti posti sono ancora liberi. Basta una chiamata al minuto.
Vendere dal Suo sistema
Crei un ordine dal programma in cui lavora già, mandi all’acquirente un link di pagamento e scopra tramite un webhook che ha pagato.
L’API fa parte del piano Pro
Le chiavi si creano in Impostazioni → Accesso API. Quella schermata compare nel Suo menu non appena la Sua organizzazione è su quel piano; il piano lo cambia Lei stesso nella schermata di gestione, sotto Abbonamento.
Guardi i piani →Prima provare senza rischi
Accanto a una chiave normale (pv_live_) può creare una chiave di prova (pv_test_). Lavora con il Suo catalogo, le Sue fasce orarie e la Sua capienza reali, e può anche creare ordini. Un ordine di prova non passa mai da un fornitore di pagamento — una pagina di prova simula il pagamento —, non conta nel Suo fatturato e viene eliminato dopo 24 ore. Fino ad allora occupa posti reali: lavori quindi preferibilmente con un prodotto creato apposta. Ciò che è fuori dalla sandbox, come gestire i webhook, lo rifiutiamo a una chiave di prova con il codice sandbox.
Avvio rapido in cinque passi
Da zero a un’integrazione che sa che è stato pagato. Ogni passo richiede minuti, non giorni.
-
Crei una chiave
Apra Impostazioni → Accesso API nella schermata di gestione e crei una chiave con i soli diritti che Le servono. Il token completo lo vede una volta sola; lo conservi come conserva una password.
-
Faccia la prima chiamata
Richieda GET /me con la Sua chiave nell’intestazione Authorization. Riceve la Sua organizzazione, il Suo piano e i diritti della chiave. Se questo funziona, funziona anche il resto.
-
Crei un ordine
Invii le righe da vendere a POST /orders, con una Idempotency-Key — qui è obbligatoria. Se la connessione si interrompe a metà, la stessa chiamata ripetuta non produce un secondo ordine. Il campo reserved_until indica fino a quando i posti Le vengono riservati.
-
Mandi l’acquirente al link di pagamento
Richieda il link di pagamento con POST /orders/{id}/checkout, insieme all’indirizzo dove l’acquirente arriva dopo aver pagato. Mandi l’acquirente a quel link, oppure lo mostri nella Sua pagina. Il pagamento passa dal fornitore che ha già collegato; appena è arrivato, i biglietti vengono creati e inviati.
-
Lasci che un webhook La avvisi
Prepari un indirizzo sul Suo sito e lo registri. Appena qualcosa viene pagato, annullato o scansionato, lo riceve lì — senza dover continuare a chiedere se è successo qualcosa.
curl
curl "https://passavo.eu/api/v1/me" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/me');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/me', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/me", headers=headers)
data = response.json()["data"]
Autenticazione
Ogni richiesta porta la Sua chiave come bearer token. Una chiave appartiene a una sola organizzazione: quell’organizzazione è il mondo intero della richiesta, e non può mai recuperare per sbaglio i dati di qualcun altro.
Authorization: Bearer pv_live_YOUR_API_KEY
Una chiave normale inizia con pv_live_, una chiave sandbox con pv_test_. Quel prefisso non è un segreto ma un aiuto: chi lo vede in un registro sa subito da dove viene.
Il token completo esiste per un istante, alla creazione. Dopo ne conserviamo solo un’impronta irreversibile (sha256). Perso vuol dire davvero perso: revochi la chiave e ne crei una nuova.
Diritti
Una chiave senza diritti non può nulla. È volutamente il contrario di quello che ci si aspetterebbe: queste chiavi vengono date dai clienti a strumenti di terzi, e allora il valore predefinito deve essere «niente» e non «tutto».
- read
- Consultare tutto: le Sue sedi, prodotti, prezzi, posti liberi, sconti, buoni regalo e abbonamenti, e anche i Suoi ordini, biglietti, acquirenti e le scansioni all’ingresso.
- write
- Creare ordini, farli pagare, annullarli e rimborsarli; annullare o rinviare biglietti; registrare l’ingresso dei visitatori; emettere buoni regalo e abbonamenti.
- webhooks
- Gestire le proprie destinazioni webhook.
- external_payment
- Segnare come pagato un ordine che costa denaro senza fornitore di pagamento, per esempio dopo un bonifico o un pagamento in contanti (POST /orders/{id}/mark-paid). Un diritto a parte, accanto a write, così lo dà solo a una cassa o a una contabilità che gestisce Lei stesso. Confermare un ordine da zero euro si può anche senza.
Quando qualcosa va storto
Ogni errore ha la stessa forma, con un codice fisso e un testo tradotto. Legga il codice e non il testo: il testo può essere riscritto, il codice mai.
{
"error": {
"code": "validation_failed",
"message": "…",
"details": {}
}
}
| Codice | Stato | Quando |
|---|---|---|
| unauthenticated | 401 | Chiave assente, sconosciuta, revocata o scaduta. |
| forbidden | 403 | La chiave è valida, ma non può fare questo. |
| plan_required | 403 | Il piano di questa organizzazione non comprende l’API. |
| sandbox | 403 | Una chiave di prova tenta qualcosa fuori dalla sandbox, come gestire i webhook. |
| not_found | 404 | Non esiste, o non esiste dentro questa organizzazione. |
| validation_failed | 422 | La richiesta stessa è sbagliata: un filtro sconosciuto, una data non valida. |
| rate_limited | 429 | Troppe chiamate in un minuto. |
| conflict | 409 | La stessa Idempotency-Key è già stata usata per altro. |
| server_error | 500 | Qualcosa è andato storto dalla nostra parte. |
| slot_unavailable | 409 | La fascia oraria è piena, già iniziata o sconosciuta, oppure non ne è stata scelta nessuna mentre il prodotto la richiede. |
| sold_out | 409 | Il prodotto è esaurito o non è più in vendita. |
| discount_invalid | 422 | Il codice sconto non esiste, è esaurito o non vale qui. |
| payment_provider_missing | 409 | L'organizzazione non ha un fornitore di pagamento collegato. |
| not_cancellable | 409 | L'ordine non può essere annullato nel suo stato attuale. |
| not_refundable | 409 | Su questo ordine non c’è (più) nulla da rimborsare, oppure è stato pagato al di fuori del fornitore di pagamento. |
| check_in_duplicate | 409 | Questo codice è già stato registrato all'ingresso. |
| check_in_invalid | 404 | Questo codice è sconosciuto. |
| check_in_wrong_day | 409 | Questo codice è valido, ma non oggi. |
| check_in_cancelled | 409 | Questo codice appartiene a un biglietto annullato o rimborsato. |
Una riga di un’altra organizzazione restituisce sempre not_found e mai un messaggio che dice che non può accedervi. Se quella differenza fosse visibile, chiunque con una chiave valida potrebbe scoprire quanti prodotti ha il vicino scorrendo i numeri.
Paginazione, ordinamento e filtri
Gli elenchi arrivano una pagina per volta. Non chiede la pagina tre ma quello che viene dopo la pagina precedente: la risposta porta un cursore, e Lei lo rimanda per continuare a leggere. Così un elenco non salta mai righe se qualcosa si aggiunge mentre sfoglia.
| Parametro | Che cosa fa |
|---|---|
| page[size] | Quante righe per pagina; 25 in modo predefinito, 100 al massimo. |
| page[cursor] | Il next_cursor della risposta precedente. Se è vuoto, quella era l’ultima pagina. |
| sort | Su che cosa ordinare. Un trattino davanti inverte l’ordine. |
| filter[…] | Filtrare su un campo che l’endpoint consente. |
| include | Includere relazioni nella stessa risposta, separate da virgole. |
Un parametro che l’endpoint non conosce è un errore, non un silenzio. Chi sbaglia il nome di un filtro deve saperlo — e non ricevere senza accorgersene l’elenco intero senza filtro.
Nella risposta non c’è volutamente un totale: su decine di migliaia di righe quel conteggio costa più della pagina stessa.
{
"data": [ … ],
"meta": { "next_cursor": "…" }
}
Inviare due volte, eseguire una volta
Aggiunga una Idempotency-Key a ogni chiamata che crea o modifica qualcosa — una stringa casuale e unica. Se la stessa chiamata arriva di nuovo con la stessa chiave, riceve esattamente la stessa risposta senza che nulla accada una seconda volta. Per POST /orders è obbligatoria.
Idempotency-Key: 6f1c0b4a-6b2f-4a1b-9c7e-1f2d3e4a5b6c
La stessa chiave con contenuto diverso dà conflict e non succede nulla. Una chiave conservata dura 24 ore e vale per organizzazione.
Versioni
La versione sta nel percorso (/api/v1) e cambia solo in caso di rottura; una seconda versione gira allora accanto e non attraverso. Ogni piccola aggiunta viene datata nell’intestazione Passavo-Version, oggi 2026-09-20.
Che cosa può aggiungersi in questa versione: un campo, un endpoint, un nuovo valore di ordinamento o di filtro, un nuovo codice di errore. Costruisca quindi l’integrazione in modo che un campo sconosciuto non la faccia cadere.
Che cosa non accade mai in questa versione: togliere o rinominare un campo, cambiare un tipo, dare a un codice un altro significato, o rendere obbligatorio un parametro.
Limite di chiamate
Una chiave può fare 120 chiamate al minuto. Il limite vale per chiave e non per indirizzo, così due clienti dietro lo stesso provider cloud non si ostacolano.
Ogni risposta Le dice a che punto è in X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Se supera il limite riceve rate_limited con un Retry-After; aspetti semplicemente quei secondi.
Esempi di codice
La stessa richiesta in quattro linguaggi, per gruppo di endpoint. Sostituisca YOUR_API_KEY con la Sua chiave — e non la metta mai in codice che un visitatore può scaricare.
Account
Chi sono e cosa posso fare.
GET /api/v1/me
curl
curl "https://passavo.eu/api/v1/me" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/me');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/me', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/me", headers=headers)
data = response.json()["data"]
Catalogo
Sedi, prodotti e prezzi.
GET /api/v1/events
curl
curl "https://passavo.eu/api/v1/events" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/events');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/events', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/events", headers=headers)
data = response.json()["data"]
Disponibilità
Fasce orarie e posti liberi.
GET /api/v1/products/{id}/slots
curl
curl "https://passavo.eu/api/v1/products/12/slots" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/products/12/slots');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/products/12/slots', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/products/12/slots", headers=headers)
data = response.json()["data"]
Vendite
Sconti, buoni regalo e tessere annuali.
GET /api/v1/discounts
curl
curl "https://passavo.eu/api/v1/discounts" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/discounts');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/discounts', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/discounts", headers=headers)
data = response.json()["data"]
Ordini
Creare, pagare, annullare e rimborsare ordini.
GET /api/v1/orders
curl
curl "https://passavo.eu/api/v1/orders" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/orders');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/orders', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/orders", headers=headers)
data = response.json()["data"]
Biglietti
Consultare, annullare e rinviare i biglietti.
GET /api/v1/tickets
curl
curl "https://passavo.eu/api/v1/tickets" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/tickets');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/tickets', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/tickets", headers=headers)
data = response.json()["data"]
Ingresso
Check-in all'ingresso.
GET /api/v1/check-ins
curl
curl "https://passavo.eu/api/v1/check-ins" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/check-ins');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/check-ins', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/check-ins", headers=headers)
data = response.json()["data"]
Clienti
Acquirenti, riassunti dagli ordini.
GET /api/v1/customers
curl
curl "https://passavo.eu/api/v1/customers" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/customers');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/customers', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/customers", headers=headers)
data = response.json()["data"]
Meta
La descrizione dell'API stessa.
GET /api/v1/openapi.json
curl
curl "https://passavo.eu/api/v1/openapi.json" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->get('https://passavo.eu/api/v1/openapi.json');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/openapi.json', {
method: 'GET',
headers: {
Accept: 'application/json',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json"}
response = requests.get("https://passavo.eu/api/v1/openapi.json", headers=headers)
data = response.json()["data"]
Webhook
Messaggi che inviamo al tuo server.
GET /api/v1/webhook-deliveries
curl
curl "https://passavo.eu/api/v1/webhook-deliveries" \
-H "Authorization: Bearer pv_live_YOUR_API_KEY" \
-H "Accept: application/json"
PHP
use Illuminate\Support\Facades\Http;
$response = Http::acceptJson()
->withToken('pv_live_YOUR_API_KEY')
->get('https://passavo.eu/api/v1/webhook-deliveries');
$data = $response->json('data');
JavaScript
const response = await fetch('https://passavo.eu/api/v1/webhook-deliveries', {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: 'Bearer pv_live_YOUR_API_KEY',
},
});
const { data } = await response.json();
Python
import requests
headers = {"Accept": "application/json", "Authorization": "Bearer pv_live_YOUR_API_KEY"}
response = requests.get("https://passavo.eu/api/v1/webhook-deliveries", headers=headers)
data = response.json()["data"]
Webhook
Un webhook è il contrario di una chiamata: invece di chiedere in continuazione se è arrivato il pagamento, mandiamo noi un messaggio a un Suo indirizzo appena succede. Questo risparmia migliaia di chiamate al giorno e Lei lo sa subito invece che al giro successivo.
Gestisce le Sue destinazioni nella schermata di gestione in Impostazioni → Accesso API, scheda Webhook, oppure tramite l’API con una chiave che porta il diritto webhooks. Ogni destinazione ha un proprio segreto; con quello verifica che un messaggio venga davvero da noi.
Verificare la firma
Ogni messaggio porta l’intestazione Passavo-Signature nella forma t=<unix>,v1=<hmac-sha256>. t è il momento in cui abbiamo firmato; v1 è un HMAC-SHA256 con il segreto di quella destinazione sul timestamp, un punto e il corpo grezzo. Lo ricalcoli e confronti a tempo costante — un confronto ordinario tradisce, con il tempo che impiega, quanti caratteri erano giusti. Rifiuti anche un messaggio il cui t si discosta di più di 300 secondi dal Suo orologio: così nessuno può riprodurre più tardi un messaggio intercettato.
Verifichi sul corpo GREZZO, prima che il Suo framework lo trasformi in json. Ricostruire il json rimette le chiavi in un altro ordine e allora nessuna firma corrisponde più.
curl
# De handtekening narekenen vanaf de opdrachtregel.
# T is de waarde van t= uit de header Passavo-Signature,
# het resultaat hoort gelijk te zijn aan de waarde van v1=.
printf '%s.%s' "$T" "$BODY" | openssl dgst -sha256 -hmac "$SECRET"
PHP
// De RUWE body, niet $request->all().
$body = $request->getContent();
// "t=1758355200,v1=9f86d0…" uit elkaar halen.
$delen = [];
foreach (explode(',', (string) $request->header('Passavo-Signature')) as $stuk) {
[$sleutel, $waarde] = array_pad(explode('=', trim($stuk), 2), 2, '');
$delen[$sleutel] = $waarde;
}
$t = $delen['t'] ?? '';
$verwacht = hash_hmac('sha256', $t . '.' . $body, $secret);
// hash_equals vergelijkt in constante tijd; de tijdstempel
// houdt een opgevangen bericht tegen dat later opnieuw komt.
if (! ctype_digit($t) || abs(time() - (int) $t) > 300 || ! hash_equals($verwacht, $delen['v1'] ?? '')) {
abort(400);
}
JavaScript
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody: de ruwe body als string, bv. via express.raw().
const header = request.headers['passavo-signature'] ?? '';
const delen = Object.fromEntries(header.split(',').map((s) => s.trim().split('=', 2)));
const verwacht = createHmac('sha256', secret).update(delen.t + '.' + rawBody).digest('hex');
const gekregen = delen.v1 ?? '';
const vers = /^\d+$/.test(delen.t ?? '')
&& Math.abs(Date.now() / 1000 - Number(delen.t)) <= 300;
const geldig = vers
&& verwacht.length === gekregen.length
&& timingSafeEqual(Buffer.from(verwacht), Buffer.from(gekregen));
Python
import hashlib, hmac, time
# raw_body: de ruwe body als bytes, bv. request.get_data() in Flask.
header = request.headers.get("Passavo-Signature", "")
delen = dict(stuk.strip().split("=", 1) for stuk in header.split(",") if "=" in stuk)
t = delen.get("t", "")
verwacht = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
# compare_digest vergelijkt in constante tijd.
geldig = (t.isdigit()
and abs(time.time() - int(t)) <= 300
and hmac.compare_digest(verwacht, delen.get("v1", "")))
L’elenco completo degli eventi e del loro contenuto sta nel riferimento. →
Che cosa cambia
Ogni modifica che merita di essere segnalata riceve una nuova versione datata. Se la Sua integrazione resta su una data più vecchia, continua a funzionare — la data dice solo su quale comportamento è stata costruita.
-
2026-09-20
La prima versione
Chiavi con diritti, una sandbox, un unico formato di risposta e paginazione a cursore. In lettura: la Sua organizzazione, sedi, prodotti, fasce orarie, eventi, sconti, buoni regalo e abbonamenti, ordini, biglietti, acquirenti e scansioni. In scrittura: creare, pagare, annullare e rimborsare ordini, annullare biglietti, registrare ingressi, emettere buoni regalo e abbonamenti. E webhook in uscita, firmati per destinazione.