Aller au contenu
Sursa Developers

Authentification

Chaque requête adressée à l’API Sursa porte une clé API, ou un jeton d’accès OAuth d’une application, dans l’en-tête Authorization :

Authorization: Bearer kb_3f9c…

La clé identifie l’organisation et détermine ce que la requête peut voir et modifier : son rôle, ses portées, son profil de données et ses collections. L’adresse de l’API ne connaît ni sessions ni cookies. Chaque requête est authentifiée indépendamment : vous pouvez donc envoyer des requêtes en parallèle et depuis plusieurs serveurs avec la même clé.

curl https://api.sursa.com/v1/me \
  -H "Authorization: Bearer $SURSA_API_KEY"

Les intégrations plus anciennes envoient parfois la clé dans un en-tête X-API-Key. Il est toujours accepté, mais le nouveau code doit utiliser Authorization: Bearer.

Types d’identifiants

IdentifiantFormeOù il fonctionne
Clé API de l’organisationkb_…Tous les points de terminaison de l’API, dans les limites de son rôle, de ses portées, de son profil de données et de ses collections.
Clé de source personnaliséekbsrc_…Uniquement les points de terminaison d’envoi (push) de sa propre source personnalisée (/v1/push/sources/{source_id}/…).
Jeton d’accès OAuthkbat_…Les points de terminaison de la référence de l’API, dans les limites des portées du jeton. Un jeton obtenu par POST /oauth/token avec un code d’autorisation agit au nom du salarié qui a donné son consentement ; un jeton client_credentials agit pour l’organisation, comme une clé API. Il est valable 1 heure.

Tous s’envoient de la même façon. Une clé de source personnalisée ne peut rien lire, rechercher ni modifier en dehors de sa source : utilisez-la là où la clé est conservée par un tiers, par exemple une plateforme d’intégration.

Erreurs d’authentification

Statut et codeSignificationQue faire
401 auth.not_authenticatedClé absente, mal saisie ou révoquée.Vérifiez l’en-tête et la valeur de la clé.
401 api_keys.expiredLa clé a dépassé sa date d’expiration.Créez une nouvelle clé et remplacez l’ancienne.
401 sources.push_key_invalidUne clé de source personnalisée est erronée, révoquée ou appartient à une autre source.Vérifiez la clé et l’identifiant de la source dans le chemin.
401 oauth.token_expiredLe jeton d’accès OAuth a expiré.Obtenez-en un nouveau avec le jeton d’actualisation.
403 api_keys.scopeLa clé n’a pas de portée pour cette opération.Ajoutez la portée ou utilisez une clé qui la possède.
403 api_keys.feature_disabledL’offre de l’organisation n’inclut pas les clés API.Contactez l’administrateur de l’organisation.
403 api_keys.ip_not_allowedLa requête provient d’une adresse en dehors des adresses autorisées de la clé.Appelez depuis un réseau autorisé ou modifiez les adresses de la clé.
403 api_keys.mcp_onlyUne clé MCP personnelle a été utilisée en dehors du point de terminaison /mcp.Utilisez une clé API de l’organisation pour l’API.
403 oauth.operation_not_allowedL’opération ne fait pas partie de l’API publique : un jeton OAuth ne peut donc pas l’appeler.Utilisez une opération de la référence de l’API.
403 org.suspendedL’organisation est suspendue. Ses données sont conservées.Contactez l’administrateur de l’organisation.

403 signifie que la requête a été authentifiée, mais n’est pas autorisée. Un objet que la clé n’a pas le droit de voir répond 404, comme un objet qui n’existe pas : une clé ne peut donc pas découvrir ce qui se trouve hors de son accès.

Agir avec un profil de données

Une clé dotée du rôle admin peut vérifier ce que verrait un autre groupe de personnes : l’en-tête X-View-As exécute une requête avec un profil de données et, éventuellement, un rôle.

curl "https://api.sursa.com/v1/cards?limit=20" \
  -H "Authorization: Bearer $SURSA_ADMIN_KEY" \
  -H "X-View-As: employee:viewer"

Dans ce mode, les requêtes ne font que lire : toute modification renvoie 403 avec le code view_as.read_only. Un jeton OAuth, ou une clé sans le rôle admin, ne peut pas utiliser X-View-As : la requête répond 403 avec le code view_as.admin_key_required. Un en-tête qui ne désigne aucun profil existant répond 400 avec le code view_as.invalid_header.

Applications dans le navigateur

L’API accepte les requêtes de n’importe quelle origine web (Access-Control-Allow-Origin: *) et n’utilise jamais de cookies : une page peut donc l’appeler avec fetch. La clé se trouve alors dans la page et elle est visible de toute personne qui l’utilise. N’appelez l’API depuis le navigateur qu’avec une clé que vous acceptez de montrer à ces utilisateurs, par exemple une clé viewer limitée aux collections publiques, ou placez votre propre serveur entre le navigateur et Sursa.

Ce que seul un salarié peut faire

Une clé API de l’organisation agit pour l’organisation, pas pour une personne. Deux parties de l’API appartiennent à des personnes : elles ne fonctionnent donc qu’avec un jeton qui agit au nom d’un salarié, c’est-à-dire une session dans Sursa ou un jeton d’accès OAuth émis avec le consentement du salarié.

Les conversations appartiennent à une personne. Dans GET /v1/conversations, une clé API de l’organisation ne voit que les conversations qu’elle a elle-même commencées. L’API publique n’a aucune opération qui commence une conversation : pour une clé, la liste est donc normalement vide, et les conversations des salariés ne lui sont jamais montrées. Les questions sans conversation, avec POST /v1/ask ou POST /v1/chat, fonctionnent avec toute clé qui a la portée ask. Pour lister les conversations d’un salarié et lire l’historique de l’une d’elles avec GET /v1/conversations/{conv_id}, appelez l’API avec un jeton OAuth au nom de ce salarié. Le jeton ne voit que les conversations de ce salarié ; toute autre conversation répond 404 avec le code conversations.not_found.

Seul un salarié valide une fiche. La validation confirme qu’une personne a vérifié le contenu : POST /v1/cards/{card_id}/verification/verify et POST /v1/cards/{card_id}/verify exigent donc une session ou un jeton OAuth au nom d’un salarié autorisé à valider la fiche. Avec une clé API de l’organisation, ou un jeton client_credentials, ils répondent 400 avec le code cards.verify_user_account_required. Les contrôles habituels passent en premier : une fiche que la clé ne peut pas voir répond 404, et une clé qui n’a pas le droit de la valider reçoit 403.