📡 Xeora REST API

Documentazione tecnica per integrare Xeora con sistemi esterni, bot e automazioni. Per una guida machine-readable e aggiornata usa GET /config/info.

Per iniziare velocemente: usa le route /tenants/:tenant_id/... con la tua API Key. Le route di discovery sono pubbliche, mentre le operazioni su dati richiedono autenticazione.

📑 Indice

🔐 Autenticazione

La maggior parte delle route operative richiede una API Key tenant. I flussi OTP cliente/prenotazione/ordine usati da chat e clienti richiedono comunque la API Key tenant dell’agente, oltre all’OTP: l’OTP viene inviato/accettato solo se email e dati tenant corrispondono.

Come autenticarsi

Includi la API Key nell’header HTTP:

Authorization: Bearer ***

Nota: il parametro query ?api_key=*** non è più supportato per sicurezza

Base URL

https://xeora.it/wp-json/xeora/v1/

Quale API usare per le integrazioni

Per nuove integrazioni esterne, agenti, bot e automazioni usa le route tenant-scoped:

/wp-json/xeora/v1/tenants/:tenant_id/...

Queste route includono sempre il tenant nel percorso e sono il modello consigliato perché rendono esplicito quale business/tenant sta usando l’integrazione.

Le route legacy come /wp-json/xeora/v1/bookings/... restano disponibili per compatibilità, ma non sono il punto di ingresso consigliato per nuove integrazioni.

🏢 Tenants

GET /tenants

Lista tenant attivi. Richiede autenticazione, tutti i tenant accessibili alla chiave.

{
  "success": true,
  "tenants": [
    { "id": 1, "business_name": "Il Mio Business", "slug": "il-mio-business", "status": "active" }
  ],
  "count": 1
}

🛎️ Servizi

GET /tenants/:tenant_id/services

Lista servizi attivi per tenant. Supporta paginazione.

ParametroTipoDescrizione
service_idopzionaleFiltra un singolo servizio tramite parametro query.
per_pageopzionaleRisultati per pagina (max 100).
pageopzionaleNumero pagina.

Il totale reale è total_items, non count. Se count < total_items, recupera le pagine successive o usa per_page=100.

GET /tenants/:tenant_id/services/:service_id/custom-fields

Campi personalizzati del servizio.

GET /tenants/:tenant_id/services/:service_id/pricing-tiers

Scaglioni di prezzo del servizio.

GET /tenants/:tenant_id/services/:service_id/products

Prodotti extra associati al servizio.

GET /tenants/:tenant_id/services/:service_id/reviews

Recensioni del servizio.

👤 Staff e disponibilità

GET /tenants/:tenant_id/staff

Lista staff attivo. Accetta service_id per filtrare gli operatori compatibili con un servizio.

GET /tenants/:tenant_id/availability

Slot disponibili per una data.

ParametroTipoDescrizione
daterichiestoYYYY-MM-DD
service_idrichiestoID servizio
staff_idrichiesto per hourlyID staff per servizi orari.
duration_minutesopzionaleDurata custom in minuti.
GET /tenants/:tenant_id/monthly-availability

Disponibilità mensile per servizi daily.

ParametroTipoDescrizione
service_idrichiestoID servizio
yearrichiestoAnno
monthrichiestoMese 1-12
staff_idopzionaleID staff, utile per servizi hourly.
GET /tenants/:tenant_id/closed-days

Giorni chiusi in un mese. Non compatibile con tutti gli orari; verifica il tipo di servizio prima di usarlo come regola.

📋 Prenotazioni

POST /tenants/:tenant_id/bookings

Crea una prenotazione. Per servizi hourly servono date/time e staff_id; per daily servono start_date/end_date o days.

{
  "service_id": 15,
  "staff_id": 1,
  "booking_type": "daily",
  "start_date": "2026-06-15",
  "end_date": "2026-06-17",
  "customer_name": "Mario Rossi",
  "customer_email": "mario@example.com",
  "customer_phone": "+39 333 1234567",
  "customer_notes": "Nota opzionale",
  "payment_provider": "paypal",
  "products": [
    { "id": 5, "quantity": 2 }
  ]
}

Risposta con pagamento online

{
  "success": true,
  "message": "Prenotazione creata. Link pagamento: ...",
  "booking_id": 184,
  "appointment_id": 184,
  "status": "pending",
  "payment_status": "pending_paypal",
  "payment_method": "paypal",
  "total_price": 350.00,
  "amount_now": 350.00,
  "approval_url": "https://www.sandbox.paypal.com/checkoutnow?token=***",
  "paypal_order_id": "5O190127TN364715T"
}
URL pagamento: usa approval_url per PayPal o checkout_url per Stripe. Non usare GET /payments/:booking_id/status per recuperare il link: serve solo al polling dello stato pagamento.
GET /tenants/:tenant_id/bookings/:booking_id

Dettaglio prenotazione: richiede API Key tenant + OTP prenotazione.

POST /tenants/:tenant_id/bookings/:booking_id/request-otp

Richiede API Key tenant. Invia OTP alla email della prenotazione solo se email e prenotazione corrispondono.

{ "customer_email": "mario@example.com" }
PUT /tenants/:tenant_id/bookings/:booking_id

Aggiorna prenotazione. Richiede customer_email della prenotazione + otp.

POST /tenants/:tenant_id/bookings/:booking_id/cancel

Cancella prenotazione. Richiede customer_email della prenotazione + otp.

OTP prenotazione: per modificare o cancellare prenotazioni, richiedi l’OTP con POST /tenants/:tenant_id/bookings/:booking_id/request-otp, poi invia customer_email + otp nella chiamata di update/cancel.

Flusso pagamento prenotazione

💳 Pagamenti

GET /payments/:booking_id/status

Polling stato pagamento prenotazione. Richiede API Key tenant + OTP prenotazione. Non restituisce link pagamento.

GET /payments/event/:order_id/status

Polling stato pagamento ordine ticketing/evento. Richiede API Key tenant + OTP ordine. Usa order_id, non event_id.

GET /tenants/:tenant_id/payment-providers

Provider pagamento disponibili per tenant.

👥 Clienti

POST /tenants/:tenant_id/customers

Crea o recupera cliente. In caso di nuovo cliente invia password di accesso e welcome email.

POST /tenants/:tenant_id/customers/request-otp

Richiede API Key tenant. Invia OTP cliente via email solo se l'email ha biglietti o prenotazioni nel tenant. Rate-limited per evitare spam.

POST /tenants/:tenant_id/customers/verify-otp

Verifica OTP cliente solo se email e tenant corrispondono a dati reali del cliente.

{ "email": "mario@example.com", "otp": "123456" }
GET /tenants/:tenant_id/customers/tickets

Biglietti cliente tramite API Key tenant + email + OTP valido e non scaduto.

GET /tenants/:tenant_id/customers/bookings

Prenotazioni cliente tramite API Key tenant + email + OTP valido e non scaduto.

🎫 Eventi, ordini e ticketing

GET /tenants/:tenant_id/events

Lista eventi disponibili.

GET /tenants/:tenant_id/events/:event_id

Dettaglio evento e tipi di biglietto.

GET /tenants/:tenant_id/events/:event_id/tickets

Biglietti disponibili per evento.

GET /tenants/:tenant_id/events/:event_id/stats

Statistiche di vendita dell’evento.

POST /tenants/:tenant_id/events/:event_id/checkout

Inizia pagamento biglietti evento.

POST /tenants/:tenant_id/orders

Crea ordine biglietti. Richiede line_items con id_tipo_biglietto e quantità.

{
  "event_id": 12,
  "customer_name": "Mario Rossi",
  "customer_email": "mario@example.com",
  "customer_phone": "+39 333 1234567",
  "line_items": [
    { "ticket_type_id": 4, "quantity": 2 }
  ],
  "payment_provider": "stripe"
}
GET /tenants/:tenant_id/orders/:order_id

Dettaglio ordine: richiede API Key tenant + OTP ordine.

PUT /tenants/:tenant_id/orders/:order_id/complete

Completa ordine dopo pagamento esterno/manuale.

PUT /tenants/:tenant_id/orders/:order_id/cancel

Cancella ordine. Richiede API Key tenant, email dell'ordine + OTP valido.

GET /tenants/:tenant_id/orders/stats

Statistiche ordini.

Biglietti e validazione

GET /tenants/:tenant_id/tickets

Lista biglietti del tenant.

GET /tenants/:tenant_id/tickets/:ticket_id

Dettaglio biglietto: richiede API Key tenant + OTP ordine. Per chat/WhatsApp preferisci il flusso OTP ordine.

GET /tenants/:tenant_id/tickets/by-number/:ticket_number

Dettaglio biglietto tramite numero: richiede API Key tenant + OTP ordine. Il numero da solo non basta.

GET /tenants/:tenant_id/tickets/:ticket_id/qr

Recupera QR code biglietto: richiede API Key tenant + OTP ordine. Per chat/WhatsApp preferisci il flusso OTP ordine.

POST /tenants/:tenant_id/tickets/:ticket_id/validate

Valida biglietto per check-in.

PUT /tenants/:tenant_id/tickets/:ticket_id/cancel

Cancella biglietto solo con customer_email dell'ordine e OTP ordine valido.

{
  "customer_email": "mario@example.com",
  "otp": "123456"
}
GET /tenants/:tenant_id/tickets/stats

Statistiche biglietti.

Flusso OTP ordine per chat/WhatsApp — pensato per evitare scambio di ticket_id complicati: invia OTP all’email dell’ordine, verifica con customer_email + otp, e ottieni direttamente i QR dell’ordine. Lo stesso OTP può servire anche per cancellare, quindi gestiscilo come azione una tantum.

🛒 Prodotti

POST /tenants/:tenant_id/products

Crea prodotto extra per il tenant. Richiede tenant_id, name e price.

🔗 Webhooks

GET /webhook/agent/config

Configurazione webhook agente.

PUT /webhook/agent

Registra URL webhook.

{
  "webhook_url": "https://il-tuo-server.com/webhook",
  "webhook_secret": "segreto-condiviso",
  "enabled": true
}
DELETE /webhook/agent

Rimuove webhook registrato.

POST /webhooks/payment

Callback payment provider verso Xeora. Pubblico, ma deve contenere un evento Stripe firmato o un evento PayPal verificabile.

📊 Utilizzo API

GET /tenants/:tenant_id/api-usage

Statistiche sui limiti commerciali di creazione prenotazioni/ticket. Le chiamate di discovery, availability e check non consumano questo limite.

GET /config/info

Informazioni API e guida workflow. Endpoint pubblico, non richiede autenticazione.

💡 Esempi pratici

Creare una prenotazione PayPal/Stripe

curl -X POST https://xeora.it/wp-json/xeora/v1/tenants/1/bookings \
  -H "Authorization: Bearer ***" \
  -H "Content-Type: application/json" \
  -d '{
    "service_id": 15,
    "booking_type": "daily",
    "start_date": "2026-06-15",
    "end_date": "2026-06-17",
    "customer_name": "Mario Rossi",
    "customer_email": "mario@example.com",
    "customer_phone": "+39 333 1234567",
    "payment_provider": "paypal"
  }'

Leggere il link pagamento dalla risposta

const response = await fetch('https://xeora.it/wp-json/xeora/v1/tenants/1/bookings', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer...KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    service_id: 15,
    booking_type: 'daily',
    start_date: '2026-06-15',
    end_date: '2026-06-17',
    customer_name: 'Mario Rossi',
    customer_email: 'mario@example.com',
    customer_phone: '+39 333 1234567',
    payment_provider: 'paypal'
  })
});

const data = await response.json();

// PayPal
if (data.approval_url) {
  window.location.href = data.approval_url;
}

// Stripe
if (data.checkout_url) {
  window.location.href = data.checkout_url;
}

Acquistare biglietti evento

curl -X POST https://xeora.it/wp-json/xeora/v1/tenants/1/orders \
  -H "Authorization: Bearer *** \
  -H "Content-Type: application/json" \
  -d '{
    "event_id": 12,
    "customer_name": "Mario Rossi",
    "customer_email": "mario@example.com",
    "customer_phone": "+39 333 1234567",
    "line_items": [
      { "ticket_type_id": 4, "quantity": 2 }
    ],
    "payment_provider": "stripe"
  }'
Nota importante: le API REST di Xeora sono pensate per integrazioni tecniche anche avanzate. Dati non validi o parametri mancanti possono generare errori 4xx. Le creazioni eccessive di prenotazioni o ticket possono generare 429 quando viene raggiunto il limite giornaliero del tenant; le chiamate di discovery, availability e check non consumano questo limite. Per richiedere una API Key tenant, contatta il supporto o l’amministratore del tenant. Dopo la verifica, Xeora fornirà la chiave da usare con Authorization: Bearer ***.
Non vuoi integrare le API da solo?
Usa i nostri agenti IA già pronti e sfrutta Xeora al massimo con l’AI.
Scopri i nostri agenti