Vada al contenuto
Passavo
Menu

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.

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

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

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

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

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

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