Connecter Beds24

1. Obtenir un token API

Beds24 API v2 fonctionne avec un token d'accès de courte durée, obtenu en échangeant un refresh token longue durée. Le refresh token se génère dans le back-office Beds24, sous Settings > Apps > API. L'échange se fait ensuite via POST /authentication/token pour obtenir le token d'accès à utiliser sur les autres appels.

Le client actuel (backend/internal/beds24/beds24.go) ne fait pas encore ce rafraîchissement automatiquement — c'est une TODO connue du code. Pour l'instant, il faut fournir directement un token d'accès valide via BEDS24_API_TOKEN.

2. Variable d'environnement BEDS24_API_TOKEN

Le client Beds24 est construit par beds24.NewFromEnv() (backend/internal/beds24/beds24.go), lu depuis DATABASE_URL-style env vars au démarrage de l'app. Si BEDS24_API_TOKEN est vide, tout appel (PushRoomCalendar) tourne en mode simulation (dry-run) : rien n'est envoyé à Beds24, la requête qui aurait été faite est journalisée et un enregistrement est quand même créé dans sync_runs pour que le tableau de bord reflète ce qui se serait passé.

Pour activer les appels réels, définissez le token dans docker-compose.yml (variable BEDS24_API_TOKEN du service app, déjà câblée) ou dans l'environnement au démarrage du conteneur — ne le committez jamais en clair dans le dépôt.

2bis. Gestion des secrets (refresh token, API keys, etc.)

Le refresh token Beds24, la clé Stripe et tout autre secret suivent le même principe : ils vivent uniquement dans l'environnement du conteneur, jamais dans le code ni dans docker-compose.yml committé — ce fichier ne référence que le nom de la variable (ex. BEDS24_API_TOKEN: ${BEDS24_API_TOKEN:-}), pas sa valeur.

En développement : créez un docker-compose.override.yml local (non commité, déjà ignoré par convention Docker Compose qui le charge automatiquement en plus de docker-compose.yml) contenant les vraies valeurs :

services:
  app:
    environment:
      BEDS24_API_TOKEN: "le-vrai-refresh-token"
      STRIPE_SECRET_KEY: "sk_test_..."

docker compose up fusionne automatiquement ce fichier avec docker-compose.yml — aucune commande spéciale à retenir, il suffit qu'il existe à côté. Ajoutez-le à .gitignore pour éviter tout commit accidentel.

En production : les secrets ne passent plus par un fichier local mais par le gestionnaire de secrets managé de Scaleway (Scaleway Secret Manager) — le secret y est stocké chiffré, versionné, et injecté dans le conteneur au déploiement (variable d'environnement ou montage, selon le mode de déploiement Scaleway Serverless Containers/Instances retenu), sans jamais transiter par un fichier sur disque ni par les logs de build. C'est la même logique qu'en dev — le code ne change pas, seule la source de la variable d'environnement change.

3. Limite de débit (crédits)

Beds24 applique une limite basée sur des crédits, sur une fenêtre glissante de 5 minutes au niveau du compte. Chaque réponse HTTP inclut des en-têtes x-five-min-limit-remaining, x-five-min-limit-resets-in et x-request-cost (voir docs/beds24-api-notes.md section 4). Le client actuel ne lit pas encore ces en-têtes ni ne fait de backoff — TODO signalée dans le code : lire ces en-têtes et alimenter sync_runs.credits_used pour éviter qu'une synchro en masse sur ~17-25 propriétés ne se fasse throttler silencieusement.

4. Étapes pour connecter une propriété

  1. Obtenir le token API (étape 1) et le déployer via BEDS24_API_TOKEN (étape 2).
  2. Sur la fiche Propriétés de chaque bien, ouvrir « Mapper les canaux » et renseigner :
    • le Beds24 Property ID (identifiant de la propriété côté Beds24, properties.beds24_property_id) ;
    • pour chaque canal (Airbnb, Booking.com, Abritel, direct) : le Beds24 Room ID (l'identifiant du roomType Beds24 — pour nos biens, location de maison entière, il n'y a en général qu'un seul roomType par propriété) et, si disponible, l'identifiant externe du listing OTA.
  3. Renseigner les tarifs de la propriété sur sa fiche Tarifs.
  4. Utiliser « Pousser les tarifs vers Beds24 » (sur la fiche propriété, le récap tarifs, ou par groupe) pour synchroniser. Tant que BEDS24_API_TOKEN n'est pas configuré, cela reste une simulation sans appel réseau réel, mais un enregistrement de synchro est quand même créé pour prévisualiser ce qui serait envoyé.