API per partner
Lezioni di surf vere,con una chiamata API.
Permetti ai tuoi clienti di prenotare lezioni di surf direttamente sulla tua piattaforma. REST · JSON · OCTO — disponibilità reale di ogni scuola, leggibile da qualsiasi marketplace o channel manager. Collega una volta, arrivi a molti.
API attiva · Bearer / X-Partner-API-Key
{
"spot": "Carcavelos",
"date": "2026-06-22",
"time": "10:00",
"level": "iniciante",
"capacity": 6,
"vacancy": 4
}Nessun protocollo chiuso. Parliamo OCTO — lo standard aperto delle prenotazioni di attività. Integri una volta, arrivi a tutti.
OCTO (octo.travel) è il modo in cui i sistemi di prenotazione, i channel manager e i marketplace di attività si parlano. Una integrazione contro SurfBooking, e l'offerta diventa leggibile da qualsiasi acquirente OCTO. Per chi preferisce, restituiamo anche il formato nativo SB e varianti per gli adattatori esistenti.
Cinque tipi di partner. Una API.
Se distribuisci esperienze — un hotel, un'agenzia, un DMC, una app di turismo o una piattaforma di alloggi — l'API di SurfBooking ti mette in mano la disponibilità reale delle lezioni di surf.
Esperienza al check-in
Offrono lezioni di surf come extra all'ospite, con prenotazione in tempo reale — senza telefonate, senza coordinamento manuale.
Pacchetti con surf
Includono lezioni di surf in qualsiasi pacchetto, prenotabili direttamente via API, con idempotenza sulle richieste ripetute.
Surf nell’itinerario
Aggiungono il surf a qualsiasi itinerario di gruppo e confermano la disponibilità in tempo reale, con i posti liberi in diretta.
Elenchi + disponibilità in tempo reale
Mostrano scuole, spot e disponibilità in diretta. Lo scope forecast aggiunge le condizioni per spot.
Upsell di esperienze
Affitti brevi e appartamenti fanno upsell di surf al checkout — confermato in pochi secondi via API.
Come funziona.
Una integrazione. Tutte le scuole della piattaforma. Posti reali, prezzi reali, anti-overbooking — confermato in millisecondi.
Ogni partner si collega solo a ciò che gli serve.
Non è la stessa API per tutti. Ogni chiave è limitata (least-privilege) a ciò che serve a quel partner — mai più di questo.
Disponibilità + prenotazioni
Leggono le lezioni disponibili e creano prenotazioni per conto dell'ospite/cliente. Il percorso v1 (OCTO). L'accesso di chi distribuisce lezioni.
Taglie + condizioni
Consigliano la tavola/muta giusta e leggono le condizioni dello spot. Il percorso v2, con scope sizing e/o forecast — non toccano mai le prenotazioni.
Attribuzione, senza API
Portano clienti e ricevono commissione via /aff + cookie di 90 giorni. Senza chiave, senza integrazione tecnica.
Le chiavi di piattaforma portano scope. Una chiave sizing apre solo gli endpoint di sizing — tutto il resto restituisce 403 insufficient_scope.
Tre cose. Disponibilità, servizi, prenotazioni.
Tutto in REST + JSON, autenticato con la chiave della scuola.
Leggere la disponibilità
Le lezioni reali con giorno, ora, spot, livello, posti e prezzo. Filtra per data e livello. Formati sb · fh · bl · octo.
Elencare i servizi
I tipi di lezione della scuola (livello, gruppo/privata, fascia di prezzo) — in nativo SB o come products OCTO.
Creare e gestire prenotazioni
Crea, consulta e cancella prenotazioni per conto del cliente finale. Idempotente per externalRef, con rivalidazione di posti e rapporti.
Una chiamata e vedi l’API rispondere.
Il descrittore è pubblico. Incollalo nel terminale:
# vedi l’API (senza chiave) curl -s https://www.surfbooking.eu/api/partner/v1
Contratto completo, leggibile dalle macchine — pensato perché agenti di IA e generatori di SDK scoprano da soli l'API: /openapi.json (OpenAPI 3.1) · riferimento interattivo su /docs (Swagger UI).
Prenotazione in 2 passi con 2 chiamate — blocca il posto mentre il tuo cliente paga, poi conferma:
# 1 — hold (expira sozinho; a vaga fica segura)
curl -X POST https://www.surfbooking.eu/api/partner/v1/bookings -H "X-Partner-API-Key: A_TUA_CHAVE" -H "Content-Type: application/json" -d '{"lessonSlotId":"…","customerName":"…","customerEmail":"…",
"status":"ON_HOLD","expirationMinutes":30}'
# 2 — confirm (idempotente; hold expirado devolve 410 e liberta a vaga)
curl -X POST https://www.surfbooking.eu/api/partner/v1/bookings/{id}/confirm -H "X-Partner-API-Key: A_TUA_CHAVE"
Con la chiave della scuola leggi la disponibilità — qui in formato OCTO:
curl -s "https://www.surfbooking.eu/api/partner/v1/availabilities?format=octo&from=2026-07-01&to=2026-07-07" \
-H "Authorization: Bearer sbpk_xxxxxxxxxxxxxxxxxxxxxxxx"Limite: 120 richieste/min per chiave. Ogni risposta porta X-RateLimit-Limit e X-RateLimit-Remaining; superandolo ricevi 429 con Retry-After: 60.
Un assistente dentro la tua scuola, con una chiave solo tua.
Oltre all’API partner, ogni scuola può collegare un assistente MCP alla propria attività. È disattivato per impostazione predefinita e non è ancora stato validato con un client reale.
/api/mcp/escola
JSON-RPC 2.0, protocollo MCP 2025-06-18. Intestazione Authorization: Bearer sbek_…. La scuola viene sempre dalla chiave, mai dagli argomenti.
/api/schools/:id/conector/tokens
Genera la chiave con la sessione del titolare. Corpo: label, role, staffId?, scopes (read, oppure read e propose), expiresInDays (30, 90 o 365). La chiave viene restituita una sola volta.
/api/schools/:id/conector/tokens/:tokenId
Revoca la chiave e fa scadere le proposte in sospeso che ha richiesto.
/api/schools/:id/conector/propostas/:pid/confirmar
Solo il titolare. Invia il payloadHash che ha visto; la modifica passa per lo stesso percorso del pannello, e una lezione cambiata nel frattempo finisce in conflitto.
Strumenti: list_my_schools · get_school_briefing · get_school_schedule · get_bookings_summary · get_lesson_roster · get_stock_summary · get_conditions_for_my_lessons · review_week_with_sea · prepare_lesson_move · prepare_stock_change · list_pending_proposals
Limiti: 60 chiamate al minuto per chiave e 2000 al giorno. Nessuno strumento di denaro, e nulla si applica senza la conferma del titolare. I dettagli sono nella pagina MCP. /mcp
Una chiave per scuola. Il controllo è tuo.
Ogni scuola genera la propria chiave in SurfBooking OS — e la revoca quando vuole. La chiave viaggia in un header, in uno dei due formati:
Header nativo SB
X-Partner-API-Key: sbpk_xxxx… — il formato canonico di SurfBooking.
Compatibile OCTO
Authorization: Bearer sbpk_xxxx… — per i client che parlano OCTO. La stessa chiave.
Genera e revoca le chiavi in SurfBooking OS → Canali di vendita → API Partner. Non salviamo mai la chiave in chiaro — solo il suo digest.
Gli endpoint.
Base: https://www.surfbooking.eu/api/partner/v1
/
Descrittore dell'API (radice, senza chiave). Restituisce name, version, auth, octo e la mappa completa degli endpoints. Aprirlo nel browser reindirizza a questa pagina.
/availabilities
Lezioni prenotabili. Parametri: from, to, level?, format? (sb·fh·bl·octo). Default: from=oggi, to=+30 giorni.
/availability
Alias OCTO di /availabilities — assume format=octo per default (plug-and-play OCTO).
/services
Tipi di lezione della scuola. format? (sb·octo) — in OCTO restituisce products.
/products
Alias OCTO di /services — assume format=octo per default. Array di products OCTO.
/supplier
Identità del fornitore (descrittore OCTO supplier): id, name, endpoint, contact, locales, timeZone.
/bookings
Crea una prenotazione. Corpo: lessonSlotId, customerName, customerEmail, customerPhone?, participants?, externalRef?, notes?.
/bookings/:id
Consulta lo stato di una prenotazione.
/bookings/:id
Cancella una prenotazione.
Il descrittore — GET /api/partner/v1 (senza chiave):
{
"name": "SurfBooking Partner API v1",
"version": "1.0.0",
"auth": "X-Partner-API-Key header, ou Authorization: Bearer (compatível OCTO).",
"octo": {
"supported": true,
"formatParam": "octo",
"supplierEndpoint": "/api/partner/v1/supplier"
},
"endpoints": {
"availabilities": { "method": "GET", "path": "/api/partner/v1/availabilities" },
"services": { "method": "GET", "path": "/api/partner/v1/services" },
"supplier": { "method": "GET", "path": "/api/partner/v1/supplier" },
"createBooking": { "method": "POST", "path": "/api/partner/v1/bookings" },
"getBooking": { "method": "GET", "path": "/api/partner/v1/bookings/:id" },
"cancelBooking": { "method": "DELETE", "path": "/api/partner/v1/bookings/:id" }
}
} Identità del fornitore — GET /supplier (OCTO):
{
"id": "school-uuid-…",
"name": "Nome da Escola",
"endpoint": "https://www.surfbooking.eu/api/partner/v1",
"contact": { "website": "https://www.surfbooking.eu", "email": null, "telephone": null, "address": null },
"locales": ["pt", "en"],
"timeZone": "Europe/Lisbon",
"_sb": { "description": "…", "logoUrl": "…" }
}Richiesta e risposta, sul serio.
Il corpo di una prenotazione e quello che ricevi indietro — esattamente come l’API risponde oggi.
Creare una prenotazione — POST /bookings:
curl -s -X POST https://www.surfbooking.eu/api/partner/v1/bookings \
-H "Authorization: Bearer sbpk_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"lessonSlotId": "a1b2c3d4-…",
"customerName": "Ana Silva",
"customerEmail": "[email protected]",
"customerPhone": "+351912345678",
"participants": 2,
"externalRef": "EXT-7782",
"notes": "Primeira aula"
}'Risposta — 201 Created:
{
"ok": true,
"bookingId": "f1e2d3c4-…",
"createdAt": "2026-06-21T11:42:00.000Z",
"lessonSlotId": "a1b2c3d4-…",
"schoolId": "…",
"status": "confirmed",
"participants": 2,
"totalAmountCents": 7000,
"currency": "EUR"
}Disponibilità in OCTO — GET /availabilities?format=octo restituisce un array:
[
{
"id": "a1b2c3d4-…",
"localDateTimeStart": "2026-07-02T10:00:00",
"localDateTimeEnd": "2026-07-02T12:00:00",
"available": true,
"status": "AVAILABLE",
"vacancies": 4,
"capacity": 6,
"maxUnits": 4,
"pricing": {
"original": 3500, "retail": 3500, "net": 3500,
"currency": "EUR", "currencyPrecision": 2
},
"_sb": { "level": "beginner", "spotName": "…", "bookingUrl": "https://www.surfbooking.eu/aula/…" }
}
]Prezzi in centesimi (minor units) — 3500 = 35,00 €, secondo il currencyPrecision: 2 di OCTO. Le date arrivano nell'ora locale della scuola (Europe/Lisbon).
La stessa disponibilità in altri formati. Nativo SB — ?format=sb (envelope con _meta):
{
"availabilities": [
{
"id": "a1b2c3d4-…",
"date": "2026-07-02",
"startTime": "10:00",
"endTime": "12:00",
"level": "beginner",
"spotsTotal": 6,
"spotsRemaining": 4,
"pricePerPerson": 3500,
"currency": "EUR",
"instructorName": "…",
"spotName": "…",
"schoolId": "…",
"schoolName": "…",
"bookingUrl": "https://www.surfbooking.eu/aula/9f3c1a2b7d"
}
],
"_meta": { "format": "sb", "total": 1, "from": "2026-07-01", "to": "2026-07-07" }
}Un altro sistema di prenotazione — ?format=fh (envelope availabilities):
{
"availabilities": [
{
"pk": "a1b2c3d4-…",
"start_at": "2026-07-02T10:00:00",
"end_at": "2026-07-02T12:00:00",
"capacity": 6,
"num_remaining": 4,
"is_available": true,
"customer_type_rates": [
{ "pk": "a1b2c3d4-…_default", "total": { "amount": "35.00", "currency": "EUR" } }
],
"_sb_meta": { "level": "beginner", "bookingUrl": "https://www.surfbooking.eu/aula/9f3c1a2b7d" }
}
]
}Un altro sistema di prenotazione — ?format=bl (envelope data):
{
"data": [
{
"id": "a1b2c3d4-…",
"date": "2026-07-02",
"startTime": "10:00",
"endTime": "12:00",
"serviceName": "Surf beginner",
"capacity": 6,
"spotsLeft": 4,
"pricePerPerson": 3500,
"currency": "EUR",
"_sb_meta": { "level": "beginner", "bookingUrl": "https://www.surfbooking.eu/aula/9f3c1a2b7d" }
}
]
}In octo la risposta è un array semplice (senza envelope). In sb/fh arriva in availabilities; in bl, in data.
Codici di stato.
Ogni errore porta un corpo JSON { "error": "…" } — leggibile dalle macchine.
missing_api_key · invalid_api_key
Chiave assente, troppo corta, non valida o revocata. Include un hint quando manca l'header.
missing_fields · invalid_email · invalid_date_range
Corpo incompleto, email malformata, o intervallo di date non valido (max 180 giorni, from ≤ to).
slot_not_found · booking_not_found · booking_not_found_or_already_cancelled
La lezione o la prenotazione non esiste in questa scuola — oppure, nel DELETE, era già stata cancellata.
insufficient_spots · slot_expired · slot_not_purchasable · ratio_exceeded · external_ref_exists
Conflitto di stato: nessun posto, lezione nel passato, chiusa alla vendita, rapporto istruttore superato, o externalRef ripetuto (idempotenza — restituisce il bookingId che esiste già).
forbidden · not_owner
La chiave è valida ma non raggiunge quella risorsa: la prenotazione o la lezione è di un'altra scuola. Una chiave vede solo ciò che appartiene alla scuola che l'ha creata.
hold_expired
La prenotazione era in attesa di conferma e la finestra è passata. Non è un errore tuo: il posto è tornato a chi lo vuole. Creala di nuovo.
rate_limit_exceeded
Oltre 120 richieste/min per chiave. Aspetta il Retry-After (60s). Ogni risposta porta X-RateLimit-Remaining.
internal_error
Quella è colpa nostra. Riprova con lo stesso externalRef: creare prenotazioni è idempotente su quella chiave, quindi riprovare non duplica nulla.
Chiave mancante o non valida — 401:
# nessun header di chiave { "error": "missing_api_key", "hint": "Set X-Partner-API-Key header (or Authorization: Bearer)" } # chiave inesistente o revocata { "error": "invalid_api_key" }
Posti insufficienti (anti-overbooking) — 409:
# la lezione non ha più posti per il n. di partecipanti { "error": "insufficient_spots", "remaining": 1 } # externalRef ripetuto → idempotenza: restituisce il bookingId esistente { "error": "external_ref_exists", "bookingId": "f1e2d3c4-…" }
La rivalidazione di posti e rapporti gira dentro una transazione con SELECT … FOR UPDATE — esaurito è esaurito, non c'è mai doppia prenotazione.
Cosa puoi chiedere, e quanto.
Per chiave, non per partner
Ogni risposta porta X-RateLimit-Limit e X-RateLimit-Remaining. Oltre, un 429 con Retry-After: 60. Niente indovinelli: i numeri viaggiano in ogni risposta.
Quella è la pagina, e non c'è cursore
L'intervallo from–to è ciò che limita la risposta; oltre 180 giorni restituisce 400. Non c'è paginazione a cursore di proposito: una lezione ha una data, e chiedere per date è la paginazione naturale di questo dominio. Se ti serve di più, sono due richieste.
Chiavi attive per scuola
Revoca quelle che non usi prima di crearne di nuove. Una chiave revocata smette di funzionare già alla richiesta successiva, senza attese.
Questi tre numeri sono letti dal codice che serve l'API, non scritti qui a mano: se cambiano lì, questa pagina diventa sbagliata e un test lo dice.
Consiglia l’attrezzatura giusta. Senza toccare le prenotazioni.
Il percorso v2 per marchi di attrezzatura, app e IA. Chiave di piattaforma con scope sizing, forecast e/o brand:read — deterministico, senza dati personali, non tocca mai le prenotazioni. Scopri i tuoi scope su /api/partner/v2/meta. Base: https://www.surfbooking.eu/api/partner/v2.
/sizing/board
Tavola consigliata per level + weight. Scope sizing.
/sizing/board/conditions
Tavola calibrata sulla giornata: level, weight, swellPeriodS, swellDirectionDeg, bestSwellDirDeg. Scope sizing.
/sizing/wetsuit
Taglia della muta per weight + height. Scope sizing.
/sizing/leash
Leash per boardSize + category (board·soft_board). Scope sizing.
/sizing/boots
Calzari per shoeSizeEu (es.: 42). Scope sizing.
/spots
Elenca gli spot che puoi consultare — usa un id da qui in /conditions/:spotId. Scope forecast.
/conditions/:spotId
Condizioni dello spot — la stessa shape pubblica, sanificata (non espone mai modello né fonti). Scope forecast.
/intelligence/surf-now
I migliori spot del paese adesso, ordinati per lo score in diretta — limit + level. Scope forecast.
/brand/equipment-stats
Per i marchi di attrezzatura: quante volte ogni taglia del tuo marchio è stata usata nelle lezioni, per month (YYYY-MM). Solo i tuoi dati. Scope brand:read.
/brand/spot-activity
In quali spot l'attrezzatura del tuo marchio è stata più usata, ultimi months (1–12). Scope brand:read.
Raccomandazione di tavola — GET /sizing/board:
curl -s "https://www.surfbooking.eu/api/partner/v2/sizing/board?level=beginner&weight=75" \
-H "X-Partner-API-Key: sbpd_xxxxxxxxxxxxxxxxxxxxxxxx"{ "recommendation": { "category": "soft_board", "size": "8'0" } }Le chiavi di piattaforma (sbpd_…) sono emesse da SurfBooking, non dalla scuola. Scope sbagliato → 403 insufficient_scope. Limite 240 richieste/min per chiave, con Retry-After: 60 al superamento.
Le taglie sul tuo sito. Una riga.
Una pagina iframe autonoma, "Powered by SurfBooking". Mostra le condizioni dello spot, consiglia la tavola per peso e livello, e porta il cliente a prenotare una lezione — con il tuo link partner premium integrato. Senza PII, senza cookie di tracciamento.
<iframe
src="https://www.surfbooking.eu/w/surf?key=sbpd_xxxx&spot=SPOT_ID&slug=O_TEU_SLUG"
width="360" height="520" frameborder="0"></iframe>key = la tua chiave di piattaforma (scope sizing, e forecast se vuoi le condizioni in alto). spot e slug sono opzionali — lo slug collega le prenotazioni generate al tuo /aff (cookie di 90 giorni).
v1 — stabile.
La base è /api/partner/v1. I cambiamenti che rompono la compatibilità entrano in una versione nuova (/v2) — la v1 non ha deprecazione prevista. Possiamo aggiungere campi senza preavviso, quindi leggi in modo tollerante: ignora ciò che ancora non conosci.
Channel manager, marketplace, hotel.
Qualsiasi partner che voglia vendere o mostrare lezioni di surf reali. Progettato sullo standard aperto OCTO, che molti sistemi di prenotazione e channel manager già parlano.
Hotel & resort
Offri lezioni vere ai tuoi ospiti senza gestire nulla — la prenotazione e il pagamento restano su SurfBooking.
Channel managers
Sincronizza la disponibilità in tempo reale, senza doppie prenotazioni. OCTO di fabbrica.
Marketplaces
Elenca l’offerta delle scuole e instrada la prenotazione — con posti e rapporti sempre riconvalidati dalla nostra parte.
Comanda la scuola. Sempre.
Per scuola, revocabile
Ogni chiave vede solo l’offerta della propria scuola. Revocala con un clic e l’accesso muore all’istante.
Mai overbooking
Ogni prenotazione riconvalida posti e rapporti istruttore dentro una transazione. Esaurito è esaurito.
Confermato su SurfBooking
Il flusso di denaro resta dalla nostra parte — il partner instrada, SurfBooking conferma.
Dati protetti
Esce solo ciò che serve alla prenotazione. I contatti dei tuoi allievi non finiscono nella lista di nessuno.
Prendi una chiave e inizia.
L’API è viva. Se hai una scuola di surf, generi la tua chiave nel SurfBooking OS. Se sei un partner esterno — marchio di attrezzatura, app, IA o hotel — richiedi una chiave di piattaforma (emessa da SurfBooking).
Sono una scuola · Apri il SurfBooking OS Sono un partner esterno · Richiedi accesso Vedi il descrittore

