API Partner — Documentazione & Tester
Come il sito cliente integra esperienze e prenotazioni di IDV. IDV resta il DB centrale; il sito cliente chiama queste API e riceve webhook real-time.
1. DB centrale: Tutti i dati restano su Italia da Vivere (Experience, ExperienceBooking).
2. API sicura: Il sito cliente chiama https://italiadavivere.com/functions/partnerApi con header x-api-key.
3. Sync real-time: Ogni modifica su IDV (nuova prenotazione, accettazione, ecc.) invia un webhook al sito cliente (se configurato) + polling di fallback.
4. Scalabilità: Ogni sito ha la sua chiave. 1000 siti = 1000 chiavi indipendenti. Le API sono service-role e O(1) per chiave.
Frontend (SDK):
// 1. Copia src/lib/partnerClient.js nel sito cliente
// 2. Salva l'API key in un secret del sito cliente
// 3. Usa le funzioni:
import { idvExperiences, idvBookings, idvStats } from '@/lib/partnerClient';
const API_KEY = process.env.IDV_PARTNER_API_KEY;
// Lista esperienze
const { experiences } = await idvExperiences.list(API_KEY);
// Crea/aggiorna esperienza
await idvExperiences.save(API_KEY, { title: "Cena degustazione", price_per_person: 45, category: "Enogastronomia" });
// Rispondi a una prenotazione
await idvBookings.respond(API_KEY, booking_id, "accepted", "Confermiamo la prenotazione");
// Segna come pagato
await idvBookings.markPaid(API_KEY, booking_id);
// Completa
await idvBookings.complete(API_KEY, booking_id);Backend (webhook receiver):
// Funzione backend sul sito cliente: functions/idvWebhook/entry.ts
import { verifyWebhookSecret } from '@/lib/partnerClient';
export default async function(req) {
const secret = process.env.IDV_WEBHOOK_SECRET;
if (!verifyWebhookSecret(req, secret)) {
return Response.json({ error: 'Non autorizzato' }, { status: 401 });
}
const { event, entity_id, data } = await req.json();
// event: "ExperienceBooking.create" | "ExperienceBooking.update" | "Experience.update" | ...
// Aggiorna la cache/UI del sito cliente (refetch via API o usa data direttamente)
console.log('Notifica IDV:', event, entity_id);
return Response.json({ ok: true });
}