Authentification

L'API SalonBookIt utilise deux méthodes d'authentification : clés API pour identifier votre commerce et JWT pour authentifier les clients.

Résumé

Public

API Key

Identifie votre commerce à chaque requête. Requise pour tous les endpoints.

  • S'obtient depuis le tableau de bord
  • S'envoie dans le header X-API-Key
  • Préfixe hh_pub_ (pública) o hh_sec_ (privada)
Authentifié

JWT Token

Authentifie un client spécifique. Requis pour les endpoints privés.

  • S'obtient via /api/v1/auth/login/
  • S'envoie dans le header Authorization
  • Expire dans 24 heures

API Keys

Votre clé API identifie votre commerce et doit être incluse dans toutes les requêtes à l'API.

Obtenir votre clé API

  1. Connectez-vous à votre Dashboard
  2. Allez à Configuration → Intégrations
  3. Cliquez sur Générer une nouvelle clé API
  4. Asigna un nombre descriptivo (ej: "Widget Web", "App Móvil")
  5. Copiez et gardez la clé API en sécurité

Utiliser la clé API

Incluez votre clé API dans le header X-API-Key de chaque requête :

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);

Types de clé API

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

Por tipo

Préfixe Type Utilisation
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 Environnement Utilisation
_live_ Production Données réelles, transactions réelles
_test_ Tests Données de test, sans frais réels

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)
Sécurité des clés API

N'incluez jamais votre clé API dans du code côté client visible publiquement. Pour le widget, nous utilisons une clé API avec des permissions limitées qui permet uniquement les opérations de lecture et la création de réservations.

Authentification JWT

Les endpoints nécessitant une authentification client utilisent des tokens JWT. Ces endpoints incluent :

  • Voir les réservations du client
  • Voir/modifier le profil du client
  • Consulter les points de fidélité
  • Voir l'historique des commandes

Obtenir un token JWT

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) - Client

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
      }
    }
  }
}

Utiliser le token JWT

Incluez le token dans le header Authorization avec le préfixe 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..."

Renouveler le token

Les tokens expirent dans 24 heures. Utilisez l'endpoint refresh pour en obtenir un nouveau :

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

L'API a des limites de requêtes pour garantir un service stable :

Limite Fenêtre Description
120 requests 1 minute Limite générale par clé API
20 tentatives 15 minutes Connexion (par IP)
10 tentatives 1 heure Inscription (par IP)

Headers de limite de requêtes

Chaque réponse inclut des headers informatifs :

Headers
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 115
X-RateLimit-Reset: 1704067200
Header Description
X-RateLimit-Limit Nombre maximum de requêtes autorisées
X-RateLimit-Remaining Requêtes restantes dans la fenêtre actuelle
X-RateLimit-Reset Timestamp Unix lors de la réinitialisation du compteur

Erreur 429 : Too Many Requests

Si vous dépassez la limite, vous recevrez une erreur 429 :

JSON
{
  "success": false,
  "error": "Vous avez dépassé la limite de requêtes. Réessayez dans 45 secondes.",
  "code": "RATE_LIMIT_EXCEEDED"
}

Erreurs d'authentification

Code HTTP Status Description
MISSING_API_KEY 401 Le header X-API-Key n'a pas été inclus
INVALID_API_KEY 401 Clé API invalide ou non trouvée
API_KEY_DISABLED 403 La clé API a été désactivée
API_KEY_EXPIRED 403 La clé API a expiré
INVALID_TOKEN 401 Token JWT invalide ou malformé
TOKEN_EXPIRED 401 Token JWT expiré
INVALID_CREDENTIALS 401 Email ou mot de passe incorrect