SnapShotBox API

REST-API v1 für Integrationen mit externen Tools.

Authentifizierung

Alle Endpoints erwarten einen API-Key als X-API-Key Header oder als Bearer-Token.

X-API-Key: ssb_<prefix>_<secret>

API-Keys werden im Admin-Bereich erstellt. Rate-Limit: 1000 Anfragen pro Stunde (konfigurierbar pro Key).

Base URL

https://pqgajztsmyaylotjojfr.supabase.co/functions/v1/public-api

Endpoints

GET/leadsscope: read

Alle Leads (limit, max 200)

POST/leadsscope: write

Neuen Lead erstellen

{ "contact_email": "max@example.com", "contact_name": "Max", "event_type": "Hochzeit", "event_date": "2026-08-15" }
GET/leads/{id}scope: read

Einzelnen Lead abrufen

PUT/leads/{id}/statusscope: write

Lead-Status ändern

{ "status": "qualified" }
GET/bookingsscope: read

Alle Buchungen

GET/bookings/{id}scope: read

Einzelne Buchung

POST/bookingsscope: write

Neue Buchung

{ "event_date": "2026-08-15T16:00:00Z", "account_id": "uuid", "title": "Hochzeit" }
GET/bookings/availability?date=2026-08-15scope: read

Verfügbarkeit prüfen

GET/contactsscope: read

Alle Kunden

POST/contactsscope: write

Neuen Kunden anlegen

{ "display_name": "Max Mustermann", "contact_email": "max@example.com" }

Beispiel-Code

JavaScript / Node.js

const res = await fetch("https://pqgajztsmyaylotjojfr.supabase.co/functions/v1/public-api/leads", {
  headers: { "X-API-Key": "ssb_xxxx_xxxxxxx" }
});
const { data } = await res.json();

Python

import requests
r = requests.get("https://pqgajztsmyaylotjojfr.supabase.co/functions/v1/public-api/leads",
  headers={"X-API-Key": "ssb_xxxx_xxxxxxx"})
print(r.json())

PHP

<?php
$ch = curl_init("https://pqgajztsmyaylotjojfr.supabase.co/functions/v1/public-api/leads");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-API-Key: ssb_xxxx_xxxxxxx"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);

Webhooks

Webhooks senden ein POST an deine URL, sobald ein Event ausgelöst wird. Die Auslieferung wird per HMAC-SHA256 signiert:

X-SnapShotBox-Event: on_lead_created X-SnapShotBox-Signature: sha256=<hex>

Die Signatur prüfst du gegen dein Webhook-Secret und den rohen Body:

// Node.js
const sig = crypto.createHmac("sha256", SECRET).update(rawBody).digest("hex");
if (sig !== req.headers["x-snapshotbox-signature"].replace("sha256=", "")) {
  return res.status(401).end();
}

Verfügbare Events

  • on_lead_created; Neuer Lead eingegangen
  • on_booking_confirmed; Buchung bestätigt
  • on_payment_received; Zahlung eingegangen
  • on_contract_signed; Vertrag unterzeichnet
  • on_event_completed; Event abgeschlossen

Retry-Strategie: bei Fehler werden 5 Versuche mit exponentiellem Backoff unternommen (1 min, 5 min, 30 min, 2 h, 12 h), danach landet die Auslieferung im Dead-Letter-Queue.

Fehler-Codes

  • 200 OK · 201 Created
  • 400 Bad Request; ungültige Parameter
  • 401 Unauthorized; API-Key fehlt oder ungültig
  • 403 Forbidden; fehlender Scope
  • 404 Not Found
  • 429 Rate Limit überschritten
  • 500 Server Error