VYBOX — Reconnaissance de divertissement par IA
VYBOX

Documentation

API REST & Realtime

Intégrez VYBOX dans vos applications : interrogez les scans, favoris et profils via REST, et recevez les mises à jour en direct grâce aux abonnements Realtime.

Base URL

https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1

L'API est exposée via PostgREST. Toutes les ressources publiques sont sous le schéma public.

Authentification

Chaque requête nécessite deux en-têtes : la clé publique du projet et un jeton d'accès utilisateur (JWT) obtenu après connexion.

Headers
apikey: <SUPABASE_ANON_KEY>
Authorization: Bearer <USER_ACCESS_TOKEN>

Les politiques RLS garantissent que chaque utilisateur n'accède qu'à ses propres données (scans, favoris, profil).

Endpoints REST

GET/scans?select=*&order=created_at.desc&limit=20Auth requise

Lister mes scans

Retourne les scans de l'utilisateur authentifié (RLS appliqué automatiquement).

Exemple curl
curl 'https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1/scans?select=*&order=created_at.desc&limit=20' \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H "Authorization: Bearer $USER_ACCESS_TOKEN"
Réponse
[
  {
    "id": "0c9b4a7e-9c5f-4f9e-9a3a-1d2b3c4d5e6f",
    "user_id": "8b1f...",
    "title": "La Femme de ménage",
    "media_type": "movie",
    "platform": "Netflix",
    "season": null,
    "episode": null,
    "image_url": "https://...",
    "description": "Thriller psychologique.",
    "scan_method": "image",
    "confidence": 0.92,
    "created_at": "2026-06-05T10:14:22.000Z"
  }
]
POST/scansAuth requise

Créer un scan

Ajoute un nouveau scan dans l'historique de l'utilisateur.

Exemple curl
curl -X POST 'https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1/scans' \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H "Authorization: Bearer $USER_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Prefer: return=representation" \
  -d '{"title":"Stranger Things","media_type":"series","platform":"Netflix","season":4,"episode":1,"scan_method":"audio","confidence":0.87}'
Corps de requête
{
  "title": "Stranger Things",
  "media_type": "series",
  "platform": "Netflix",
  "season": 4,
  "episode": 1,
  "scan_method": "audio",
  "confidence": 0.87
}
Réponse
{
  "id": "f2c1...",
  "user_id": "8b1f...",
  "title": "Stranger Things",
  "media_type": "series",
  "platform": "Netflix",
  "season": 4,
  "episode": 1,
  "scan_method": "audio",
  "confidence": 0.87,
  "created_at": "2026-06-05T10:20:00.000Z"
}
GET/favorites?select=*,scans(*)Auth requise

Lister mes favoris

Retourne les favoris joints aux scans correspondants.

Exemple curl
curl 'https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1/favorites?select=*,scans(*)' \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H "Authorization: Bearer $USER_ACCESS_TOKEN"
Réponse
[
  {
    "id": "aa11...",
    "user_id": "8b1f...",
    "scan_id": "0c9b...",
    "created_at": "2026-06-04T18:02:11.000Z",
    "scans": {
      "title": "La Femme de ménage",
      "media_type": "movie",
      "platform": "Netflix"
    }
  }
]
POST/favoritesAuth requise

Ajouter un favori

Marque un scan comme favori.

Exemple curl
curl -X POST 'https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1/favorites' \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H "Authorization: Bearer $USER_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Prefer: return=representation" \
  -d '{"scan_id":"0c9b4a7e-9c5f-4f9e-9a3a-1d2b3c4d5e6f"}'
Corps de requête
{ "scan_id": "0c9b4a7e-9c5f-4f9e-9a3a-1d2b3c4d5e6f" }
Réponse
{
  "id": "bb22...",
  "user_id": "8b1f...",
  "scan_id": "0c9b4a7e-9c5f-4f9e-9a3a-1d2b3c4d5e6f",
  "created_at": "2026-06-05T10:25:00.000Z"
}
DELETE/favorites?id=eq.{favoriteId}Auth requise

Retirer un favori

Supprime un favori par son identifiant.

Exemple curl
curl -X DELETE 'https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1/favorites?id=eq.bb22...' \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H "Authorization: Bearer $USER_ACCESS_TOKEN"
Réponse
HTTP/1.1 204 No Content
GET/profiles?id=eq.{userId}&select=*Auth requise

Mon profil

Retourne le profil de l'utilisateur courant.

Exemple curl
curl 'https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1/profiles?id=eq.$USER_ID&select=*' \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H "Authorization: Bearer $USER_ACCESS_TOKEN"
Réponse
[
  {
    "id": "8b1f...",
    "email": "vybox@example.com",
    "display_name": "Vybox User",
    "avatar_url": null,
    "premium": false,
    "created_at": "2026-05-12T09:00:00.000Z",
    "updated_at": "2026-06-01T12:00:00.000Z"
  }
]
PATCH/profiles?id=eq.{userId}Auth requise

Mettre à jour mon profil

Modifie le nom affiché ou l'avatar.

Exemple curl
curl -X PATCH 'https://txbkjhepczsdnwbfrtes.supabase.co/rest/v1/profiles?id=eq.$USER_ID' \
  -H "apikey: $SUPABASE_ANON_KEY" \
  -H "Authorization: Bearer $USER_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Prefer: return=representation" \
  -d '{"display_name":"Nouveau nom"}'
Corps de requête
{ "display_name": "Nouveau nom" }
Réponse
{
  "id": "8b1f...",
  "display_name": "Nouveau nom",
  "updated_at": "2026-06-05T10:30:00.000Z"
}

Realtime

Abonnez-vous aux changements de la base de données pour recevoir les insertions, modifications et suppressions en temps réel via WebSocket.

Abonnement aux nouveaux scans

JavaScript
import { createClient } from "@supabase/supabase-js";

const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);

const channel = supabase
  .channel("scans-feed")
  .on(
    "postgres_changes",
    { event: "INSERT", schema: "public", table: "scans" },
    (payload) => {
      console.log("Nouveau scan:", payload.new);
    }
  )
  .subscribe();

// Pour se désabonner
// supabase.removeChannel(channel);

Exemple de payload reçu

{
  "schema": "public",
  "table": "scans",
  "commit_timestamp": "2026-06-05T10:35:12.000Z",
  "eventType": "INSERT",
  "new": {
    "id": "9f8e...",
    "user_id": "8b1f...",
    "title": "Inception",
    "media_type": "movie",
    "platform": "Netflix",
    "scan_method": "image",
    "confidence": 0.95,
    "created_at": "2026-06-05T10:35:12.000Z"
  },
  "old": {}
}

Filtrer par utilisateur

JavaScript
supabase
  .channel("user-favorites")
  .on(
    "postgres_changes",
    {
      event: "*",
      schema: "public",
      table: "favorites",
      filter: `user_id=eq.${userId}`,
    },
    (payload) => console.log(payload)
  )
  .subscribe();

Les politiques RLS s'appliquent également au canal Realtime : l'utilisateur ne reçoit que les événements qu'il est autorisé à lire.

Codes de statut

CodeSignification
200Requête réussie
201Ressource créée
204Suppression réussie
401Jeton manquant ou invalide
403Accès refusé par RLS
404Ressource introuvable
409Conflit (contrainte unique)