Anteprima di una prenotazione: prezzo, policy e disponibilità (nessuna scrittura)
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://example.com/api/admin/v1/establishments/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/bookings/quote"
payload := strings.NewReader("{ \"customer_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"customer\": { \"first_name\": \"example\", \"last_name\": \"example\", \"email\": \"hello@example.com\", \"phone\": \"example\", \"locale\": \"it\", \"notes\": \"example\", \"tags\": [ \"example\" ], \"agreement_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"marketing_consent\": { \"given_at\": \"2026-04-15T12:00:00Z\", \"source\": \"example\", \"text_version\": \"example\" } }, \"channel\": \"desk\", \"starts_on\": \"2026-04-15\", \"ends_on\": \"2026-04-15\", \"slots\": \"AM\", \"formula\": \"half_day\", \"lines\": [ { \"pack_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"zone_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"spot_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"quantity\": 1, \"extras\": [ { \"extra_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"quantity\": 1 } ] } ], \"extras\": [ { \"extra_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"quantity\": 1 } ], \"promo_code\": \"example\", \"agreement_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"notes_customer\": \"example\", \"notes_internal\": \"example\", \"hold_id\": \"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0\", \"status\": \"draft\", \"hold_ttl_seconds\": 1, \"force\": true }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "arenile_session=<arenile_session>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}const url = 'https://example.com/api/admin/v1/establishments/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/bookings/quote';const options = { method: 'POST', headers: { cookie: 'arenile_session=<arenile_session>', 'Content-Type': 'application/json' }, body: '{"customer_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","customer":{"first_name":"example","last_name":"example","email":"hello@example.com","phone":"example","locale":"it","notes":"example","tags":["example"],"agreement_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","marketing_consent":{"given_at":"2026-04-15T12:00:00Z","source":"example","text_version":"example"}},"channel":"desk","starts_on":"2026-04-15","ends_on":"2026-04-15","slots":"AM","formula":"half_day","lines":[{"pack_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","zone_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","spot_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","quantity":1,"extras":[{"extra_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","quantity":1}]}],"extras":[{"extra_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","quantity":1}],"promo_code":"example","agreement_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","notes_customer":"example","notes_internal":"example","hold_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","status":"draft","hold_ttl_seconds":1,"force":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/admin/v1/establishments/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/bookings/quote \ --header 'Content-Type: application/json' \ --cookie arenile_session=<arenile_session> \ --data '{ "customer_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "customer": { "first_name": "example", "last_name": "example", "email": "hello@example.com", "phone": "example", "locale": "it", "notes": "example", "tags": [ "example" ], "agreement_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "marketing_consent": { "given_at": "2026-04-15T12:00:00Z", "source": "example", "text_version": "example" } }, "channel": "desk", "starts_on": "2026-04-15", "ends_on": "2026-04-15", "slots": "AM", "formula": "half_day", "lines": [ { "pack_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "zone_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "spot_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "quantity": 1, "extras": [ { "extra_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "quantity": 1 } ] } ], "extras": [ { "extra_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "quantity": 1 } ], "promo_code": "example", "agreement_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "notes_customer": "example", "notes_internal": "example", "hold_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "status": "draft", "hold_ttl_seconds": 1, "force": true }'Authorizations
Sezione intitolata “Authorizations”Parameters
Sezione intitolata “Parameters”Path Parameters
Sezione intitolata “Path Parameters”Header Parameters
Sezione intitolata “Header Parameters”Obbligatorio per le richieste autenticate via cookie che modificano
dati: deve coincidere con il valore del cookie arenile_csrf.
Request Bodyrequired
Sezione intitolata “Request Bodyrequired”Prenotazione dal pannello. Il cliente è customer_id oppure customer (creato nella stessa transazione). status: draft (nessuna risorsa), held (hold con scadenza, M4 lo userà per il checkout), confirmed (default: conferma manuale immediata, incasso alla cassa).
object
Dati minimi per una prenotazione dal pannello: solo il cognome è obbligatorio. Email lowercase; telefono E.164 facoltativo (ADR 0020), usato per la deduplica solo se presente.
object
E.164 (es. +393331234567).
Solo interne, mai mostrate al cliente.
Consenso marketing separato e facoltativo (spec 23).
object
Canale di vendita.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fasce prenotate: mattina, pomeriggio o giorno intero.
Formula di durata.
object
Obbligatoria per zone in modalità zone o quantity; dedotta dalla postazione in modalità seat.
Obbligatoria per le zone seat; facoltativa per le zone zone (assegnazione immediata).
Default 1; >1 solo per zone quantity.
object
Extra legati alla prenotazione.
object
Converte questo hold (stessa selezione) invece di allocare di nuovo.
Stato iniziale (default confirmed).
Durata dell’hold per status=held (default ARENILE_HOLD_TTL).
Ignora le violazioni di policy (sempre permesso dal pannello, registrato nell’audit).
Responses
Sezione intitolata “Responses”Anteprima
object
Dettaglio completo del calcolo (spec 8.6), con le regole applicate passo per passo.
object
object
object
Formula a durata fissa.
Importo in centesimi di euro (IVA inclusa).
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fasce prenotate: mattina, pomeriggio o giorno intero.
Importo in centesimi di euro (IVA inclusa).
object
Importo in centesimi di euro (IVA inclusa).
object
Importo in centesimi di euro (IVA inclusa).
Importo in centesimi di euro (IVA inclusa).
object
Importo in centesimi di euro (IVA inclusa).
object
Importo in centesimi di euro (IVA inclusa).
Importo in centesimi di euro (IVA inclusa).
Importo in centesimi di euro (IVA inclusa).
object
Numero decimale esatto come stringa (es. “1.2”, “0.5”, “10”). Mai float nel calcolo.
Importo in centesimi di euro (IVA inclusa).
Importo in centesimi di euro (IVA inclusa).
Importo in centesimi di euro (IVA inclusa).
object
Assente se vale solo la policy di default.
Vincoli di prenotazione (spec 9); i campi assenti ereditano dalla policy di default.
object
object
object
object
ISO 1..7; 0 = qualsiasi.
object
object
Percentuale intera o importo in centesimi.
object
object
Importo in centesimi di euro (IVA inclusa).
object
object
Validità in giorni dei crediti emessi da questa policy (cancellazione, meteo, rilascio): expires_on = giorno di emissione + giorni. Assente o 0 = nessuna scadenza (spec 9, 13.4).
object
Codice stabile (es. lead_time_too_short).
object
Mezza giornata non disponibile per una risorsa (spec 7.2), restituita in Problem.conflicts e nelle anteprime.
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fascia: mattina o pomeriggio.
Example
{ "breakdown": { "lines": [ { "fixed": { "formula": "week" }, "days": [ { "slots": "AM", "applied": [ { "stage": "base" } ] } ] } ] }, "policy": { "rules": { "same_day_booking": { "only_slot": "AM" }, "duration": { "allowed_formulas": [ "half_day" ] }, "payment": { "mode": "full", "deposit": { "type": "percent" } }, "cancellation": [ { "as": "refund" } ], "weather_policy": { "as": "refund" } } }, "conflicts": [ { "slot": "AM", "reason": "spot_unavailable" } ]}Richiesta non valida
Errore RFC 9457 (application/problem+json).
object
Slug stabile del tipo di errore. I client devono basarsi su questo
valore, mai sul testo di title o detail.
Secondi da attendere (solo per rate_limited).
object
Versione corrente della risorsa (solo per version_conflict).
Postazioni con allocazioni future (solo per spot_has_future_allocations).
Vincoli violati (solo per policy_violation).
object
Codice stabile (es. lead_time_too_short).
object
Mezze giornate non disponibili (solo per spot_unavailable, pool_exhausted, quota_exceeded).
Mezza giornata non disponibile per una risorsa (spec 7.2), restituita in Problem.conflicts e nelle anteprime.
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fascia: mattina o pomeriggio.
Stato della prenotazione (spec 10.2).
Cliente già presente con la stessa email o telefono (solo per conflict su createCustomer).
Periodo del soggiorno e data odierna dello stabilimento (solo per booking_outside_period).
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Example
{ "type": "bad_request", "conflicts": [ { "slot": "AM", "reason": "spot_unavailable" } ], "current_status": "draft"}Autenticazione assente o non valida
Errore RFC 9457 (application/problem+json).
object
Slug stabile del tipo di errore. I client devono basarsi su questo
valore, mai sul testo di title o detail.
Secondi da attendere (solo per rate_limited).
object
Versione corrente della risorsa (solo per version_conflict).
Postazioni con allocazioni future (solo per spot_has_future_allocations).
Vincoli violati (solo per policy_violation).
object
Codice stabile (es. lead_time_too_short).
object
Mezze giornate non disponibili (solo per spot_unavailable, pool_exhausted, quota_exceeded).
Mezza giornata non disponibile per una risorsa (spec 7.2), restituita in Problem.conflicts e nelle anteprime.
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fascia: mattina o pomeriggio.
Stato della prenotazione (spec 10.2).
Cliente già presente con la stessa email o telefono (solo per conflict su createCustomer).
Periodo del soggiorno e data odierna dello stabilimento (solo per booking_outside_period).
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Example
{ "type": "bad_request", "conflicts": [ { "slot": "AM", "reason": "spot_unavailable" } ], "current_status": "draft"}Permesso negato
Errore RFC 9457 (application/problem+json).
object
Slug stabile del tipo di errore. I client devono basarsi su questo
valore, mai sul testo di title o detail.
Secondi da attendere (solo per rate_limited).
object
Versione corrente della risorsa (solo per version_conflict).
Postazioni con allocazioni future (solo per spot_has_future_allocations).
Vincoli violati (solo per policy_violation).
object
Codice stabile (es. lead_time_too_short).
object
Mezze giornate non disponibili (solo per spot_unavailable, pool_exhausted, quota_exceeded).
Mezza giornata non disponibile per una risorsa (spec 7.2), restituita in Problem.conflicts e nelle anteprime.
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fascia: mattina o pomeriggio.
Stato della prenotazione (spec 10.2).
Cliente già presente con la stessa email o telefono (solo per conflict su createCustomer).
Periodo del soggiorno e data odierna dello stabilimento (solo per booking_outside_period).
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Example
{ "type": "bad_request", "conflicts": [ { "slot": "AM", "reason": "spot_unavailable" } ], "current_status": "draft"}Risorsa inesistente
Errore RFC 9457 (application/problem+json).
object
Slug stabile del tipo di errore. I client devono basarsi su questo
valore, mai sul testo di title o detail.
Secondi da attendere (solo per rate_limited).
object
Versione corrente della risorsa (solo per version_conflict).
Postazioni con allocazioni future (solo per spot_has_future_allocations).
Vincoli violati (solo per policy_violation).
object
Codice stabile (es. lead_time_too_short).
object
Mezze giornate non disponibili (solo per spot_unavailable, pool_exhausted, quota_exceeded).
Mezza giornata non disponibile per una risorsa (spec 7.2), restituita in Problem.conflicts e nelle anteprime.
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fascia: mattina o pomeriggio.
Stato della prenotazione (spec 10.2).
Cliente già presente con la stessa email o telefono (solo per conflict su createCustomer).
Periodo del soggiorno e data odierna dello stabilimento (solo per booking_outside_period).
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Example
{ "type": "bad_request", "conflicts": [ { "slot": "AM", "reason": "spot_unavailable" } ], "current_status": "draft"}Richiesta valida ma non elaborabile (no_price, policy_violation, email_template_invalid)
Errore RFC 9457 (application/problem+json).
object
Slug stabile del tipo di errore. I client devono basarsi su questo
valore, mai sul testo di title o detail.
Secondi da attendere (solo per rate_limited).
object
Versione corrente della risorsa (solo per version_conflict).
Postazioni con allocazioni future (solo per spot_has_future_allocations).
Vincoli violati (solo per policy_violation).
object
Codice stabile (es. lead_time_too_short).
object
Mezze giornate non disponibili (solo per spot_unavailable, pool_exhausted, quota_exceeded).
Mezza giornata non disponibile per una risorsa (spec 7.2), restituita in Problem.conflicts e nelle anteprime.
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fascia: mattina o pomeriggio.
Stato della prenotazione (spec 10.2).
Cliente già presente con la stessa email o telefono (solo per conflict su createCustomer).
Periodo del soggiorno e data odierna dello stabilimento (solo per booking_outside_period).
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Example
{ "type": "bad_request", "conflicts": [ { "slot": "AM", "reason": "spot_unavailable" } ], "current_status": "draft"}Operazione non ancora disponibile (not_implemented)
Errore RFC 9457 (application/problem+json).
object
Slug stabile del tipo di errore. I client devono basarsi su questo
valore, mai sul testo di title o detail.
Secondi da attendere (solo per rate_limited).
object
Versione corrente della risorsa (solo per version_conflict).
Postazioni con allocazioni future (solo per spot_has_future_allocations).
Vincoli violati (solo per policy_violation).
object
Codice stabile (es. lead_time_too_short).
object
Mezze giornate non disponibili (solo per spot_unavailable, pool_exhausted, quota_exceeded).
Mezza giornata non disponibile per una risorsa (spec 7.2), restituita in Problem.conflicts e nelle anteprime.
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Fascia: mattina o pomeriggio.
Stato della prenotazione (spec 10.2).
Cliente già presente con la stessa email o telefono (solo per conflict su createCustomer).
Periodo del soggiorno e data odierna dello stabilimento (solo per booking_outside_period).
object
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Data di calendario YYYY-MM-DD nel fuso dello stabilimento.
Example
{ "type": "bad_request", "conflicts": [ { "slot": "AM", "reason": "spot_unavailable" } ], "current_status": "draft"}
