Authentifizierung

Die SalonBookIt-API verwendet zwei Authentifizierungsmethoden: API-Schlüssel zur Identifizierung Ihres Geschäfts und JWT zur Authentifizierung von Kunden.

Zusammenfassung

Öffentlich

API Key

Identifiziert Ihr Geschäft bei jeder Anfrage. Erforderlich für alle Endpoints.

  • Wird vom Dashboard bezogen
  • Wird im Header gesendet X-API-Key
  • Präfix hh_pub_ (pública) o hh_sec_ (privada)
Authentifiziert

JWT Token

Authentifiziert einen bestimmten Kunden. Erforderlich für private Endpoints.

  • Wird bezogen über /api/v1/auth/login/
  • Wird im Header gesendet Authorization
  • Läuft in 24 Stunden ab

API Keys

Ihr API-Schlüssel identifiziert Ihr Geschäft und muss in allen API-Anfragen enthalten sein.

Ihren API-Schlüssel erhalten

  1. Melden Sie sich an bei Dashboard
  2. Gehen Sie zu Konfiguration → Integrationen
  3. Klicken Sie auf Neuen API-Schlüssel generieren
  4. Asigna un nombre descriptivo (ej: "Widget Web", "App Móvil")
  5. Kopieren und sicher speichern Sie den API-Schlüssel

API-Schlüssel verwenden

Fügen Sie Ihren API-Schlüssel im Header ein X-API-Key jeder Anfrage:

cURL
curl -X GET "https://app.salonbookit.com/api/v1/negocio/" \
  -H "X-API-Key: hh_pub_live_abc123def456..."
JavaScript
const response = await fetch('https://app.salonbookit.com/api/v1/servicios/', {
    headers: {
        'X-API-Key': 'hh_pub_live_abc123def456...'
    }
});
const data = await response.json();
Python
import requests

response = requests.get(
    'https://app.salonbookit.com/api/v1/servicios/',
    headers={'X-API-Key': 'hh_pub_live_abc123def456...'}
)
data = response.json()
PHP
$ch = curl_init('https://app.salonbookit.com/api/v1/servicios/');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: hh_pub_live_abc123def456...'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);

Arten von API-Schlüsseln

Las API Keys tienen dos dimensiones: tipo (pública/privada) y entorno (producción/pruebas).

Por tipo

Präfix Typ Verwendung
hh_pub_ Pública Para widgets y frontend. Permisos limitados a lectura y crear reservas.
hh_sec_ Privada Para backend. No exponer en código cliente.

Por entorno

Sufijo Umgebung Verwendung
_live_ Produktion Echte Daten, echte Transaktionen
_test_ Test Testdaten, keine echten Gebühren

Ejemplos de formatos completos:

  • hh_pub_live_... - Pública de producción (para widgets en producción)
  • hh_pub_test_... - Pública de pruebas (para desarrollo de widgets)
  • hh_sec_live_... - Privada de producción (para tu backend)
  • hh_sec_test_... - Privada de pruebas (para desarrollo backend)
API-Schlüssel-Sicherheit

Fügen Sie Ihren API-Schlüssel niemals in clientseitigem Code ein, der öffentlich sichtbar ist. Für das Widget verwenden wir einen API-Schlüssel mit eingeschränkten Berechtigungen, der nur Lese- und Buchungserstellungsvorgänge erlaubt.

JWT-Authentifizierung

Endpoints, die Kundenauthentifizierung erfordern, verwenden JWT-Token. Diese Endpoints umfassen:

  • Kundenbuchungen anzeigen
  • Kundenprofil anzeigen/ändern
  • Treuepunkte abfragen
  • Bestellverlauf anzeigen

JWT-Token erhalten

POST /api/v1/auth/login/

Request

cURL
curl -X POST "https://app.salonbookit.com/api/v1/auth/login/" \
  -H "X-API-Key: hh_pub_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "email": "cliente@ejemplo.com",
    "password": "contraseña123"
  }'

Response (200 OK) - Kunde

JSON
{
  "success": true,
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "tipo": "cliente",
    "cliente": {
      "id": 123,
      "nombre": "Juan",
      "apellido": "García",
      "email": "cliente@ejemplo.com",
      "telefono": "+34612345678",
      "puntos": 150,
      "nivel": "gold"
    }
  }
}

Response (200 OK) - Staff

Si las credenciales corresponden a un miembro del staff:

JSON
{
  "success": true,
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "tipo": "staff",
    "staff": {
      "id": 1,
      "nombre": "María",
      "apellido": "López",
      "email": "maria@salon.com",
      "telefono": "+34612345678",
      "rol": "admin",
      "permisos": {
        "puede_ver_reservas": true,
        "puede_crear_reservas": true,
        "puede_ver_clientes": true
      }
    }
  }
}

JWT-Token verwenden

Fügen Sie das Token im Header ein Authorization mit dem Präfix Bearer:

cURL
curl -X GET "https://app.salonbookit.com/api/v1/cliente/reservas/" \
  -H "X-API-Key: hh_pub_live_abc123..." \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

Token erneuern

Token laufen nach 24 Stunden ab. Verwenden Sie den Refresh-Endpoint, um ein neues zu erhalten:

POST /api/v1/auth/refresh/
cURL
curl -X POST "https://app.salonbookit.com/api/v1/auth/refresh/" \
  -H "X-API-Key: hh_pub_live_abc123..." \
  -H "Authorization: Bearer TOKEN_ACTUAL"

Rate Limiting

Die API hat Anfragelimits, um einen stabilen Service zu gewährleisten:

Limit Zeitfenster Beschreibung
120 requests 1 Minute Allgemeines Limit pro API-Schlüssel
20 Versuche 15 Minuten Anmeldung (pro IP)
10 Versuche 1 Stunde Registrierung (pro IP)

Rate-Limit-Header

Jede Antwort enthält informative Header:

Headers
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 115
X-RateLimit-Reset: 1704067200
Header Beschreibung
X-RateLimit-Limit Maximale Anzahl erlaubter Anfragen
X-RateLimit-Remaining Verbleibende Anfragen im aktuellen Zeitfenster
X-RateLimit-Reset Unix-Zeitstempel, wenn der Zähler zurückgesetzt wird

Fehler 429: Zu viele Anfragen

Wenn Sie das Limit überschreiten, erhalten Sie einen 429-Fehler:

JSON
{
  "success": false,
  "error": "Sie haben das Anfragelimit überschritten. Versuchen Sie es in 45 Sekunden erneut.",
  "code": "RATE_LIMIT_EXCEEDED"
}

Authentifizierungsfehler

Code HTTP Status Beschreibung
MISSING_API_KEY 401 X-API-Key-Header wurde nicht eingeschlossen
INVALID_API_KEY 401 API-Schlüssel ungültig oder nicht gefunden
API_KEY_DISABLED 403 Der API-Schlüssel wurde deaktiviert
API_KEY_EXPIRED 403 Der API-Schlüssel ist abgelaufen
INVALID_TOKEN 401 Ungültiges oder fehlerhaftes JWT-Token
TOKEN_EXPIRED 401 JWT-Token abgelaufen
INVALID_CREDENTIALS 401 E-Mail oder Passwort falsch