Authentification
Authentification
Une clé secrète dans l'en-tête Authorization est la voie d'accès à vos propres données. Il n'existe aucune autre voie d'entrée, et aucune requête n'est jamais authentifiée par un cookie de session. Les points de terminaison de catégorie font exception : ils décrivent les champs que nous demandons, et non les données de qui que ce soit, et ils répondent sans clé.
Clés
Une clé ne s'affiche qu'une seule fois, au moment de sa création. Conservez-la là où vos serveurs peuvent la lire et où un navigateur ne le peut pas.
- pc_sk_live_…
- pc_sk_test_…
Le test et le direct restent séparés
Le mode est inscrit dans la clé elle-même plutôt que passé en paramètre : une clé de test ne peut donc ni lire ni modifier vos passeports réels. Une requête mal aiguillée échoue au lieu d'atteindre le mauvais catalogue. Les passeports de test sont supprimés 90 jours après la dernière modification du passeport lui-même.
Envoyer la clé
Authentification Bearer sur HTTPS. Rien d'autre n'est accepté, et une requête sans l'en-tête est refusée avant d'atteindre le moindre de vos enregistrements.
curl "https://passportcraft.com/api/v1/whoami" \
-H "Authorization: Bearer pc_sk_live_…"Les identifiants côté navigateur ne sont volontairement pas pris en charge. Une clé se place sur un serveur ; une clé dans du code front-end est une clé publiée.
Portées
Une clé porte un ensemble fixe de portées, choisi à sa création. Une requête dépourvue de la portée exigée par son point de terminaison est refusée, et le refus nomme la permission manquante.
documents:read
documents:write
keys:admin
passports:read
- get
/organizations/{organization}/capabilitiesDécrire ce que cette clé peut faire pour cette organisation. - get
/organizations/{organization}/passportsLister les passeports. - get
/organizations/{organization}/publish-approvals/{id}Lire une approbation de publication. - get
/organizations/{organization}/passports/{id}Récupérer un passeport. - post
/organizations/{organization}/passports/{id}/validateVérifier un passeport au regard de son schéma de catégorie, sans enregistrer. - get
/organizations/{organization}/passports/{id}/linksRécupérer les URL publiques et les GS1 Digital Links. gs1_digital_links contient toutes les variantes avec variant_id, size et colour. L’URI du GTIN principal apparaît une seule fois avec les données de sa variante ; une URI principale avec numéro de série reste distincte. - get
/organizations/{organization}/passports/{id}/affichageLire l’état de l’affichage environnemental français. - get
/organizations/{organization}/passports/{id}/variantsLister les variantes de taille et de couleur. - get
/organizations/{organization}/passports/{id}/variants/reviewLit les tailles et couleurs qu’une personne vérifie avant la publication, avec leur empreinte. - get
/organizations/{organization}/importsLister les tâches d’import. - get
/organizations/{organization}/imports/{id}Récupérer une tâche d’import et son avancement.
passports:write
- post
/organizations/{organization}/passportsCréer un passeport. - patch
/organizations/{organization}/passports/{id}Appliquer un JSON Merge Patch à un passeport. - post
/organizations/{organization}/passports/{id}/publishPublier un passeport. - post
/organizations/{organization}/passports/{id}/unpublishDépublier un passeport. - post
/organizations/{organization}/passports/{id}/trashMettre un passeport à la corbeille. - post
/organizations/{organization}/passports/{id}/restoreRestaurer un passeport depuis la corbeille. - post
/organizations/{organization}/passports/{id}/variantsCréer des variantes de taille et de couleur. - delete
/organizations/{organization}/passports/{id}/variants/{variantId}Supprimer une variante. Les identifiants du connecteur ne permettent pas de supprimer des variantes. - post
/organizations/{organization}/passports/{id}/variants/removeSupprimer des variantes par GTIN. - post
/organizations/{organization}/importsLancer un import en masse asynchrone.
units:read
units:write
Aucune portée requise
Une clé valide suffit. Ces points de terminaison ne renvoient rien qui appartienne à une organisation en particulier.
Aucune clé requise
Lisible sans clé. Ces points de terminaison décrivent le produit lui-même — quelles catégories existent, et quels champs chacune demande — la réponse est donc la même pour tout lecteur. Une clé reste acceptée, et une clé révoquée ou expirée reste refusée. Sans clé, vous êtes mesuré sur le compteur anonyme de 60 requêtes par minute et par adresse client.
Une seule clé pour plusieurs organisations
Une clé appartient à une organisation, et elle ne peut agir pour une autre organisation que là où elle détient une autorisation. Une organisation qui gère des clients peut accorder à ses clés l'accès à chaque client, avec des permissions choisies pour chacun. Chaque requête nomme une organisation dans son chemin et n'agit que sur cette organisation.
Donner à une clé l'accès à un client
Appelez POST /organizations/{organization}/grants avec l'identifiant du client dans le chemin, et le key_id de la clé ainsi que les portées à accorder dans le corps. La clé appelante doit disposer de keys:admin sur sa propre organisation. Un client ne peut recevoir que des portées que la clé détient déjà sur sa propre organisation, et filings:write exige en outre que l'autorisation écrite du client soit d'abord confirmée.
curl "https://passportcraft.com/api/v1/organizations/{client}/grants" \
-X POST \
-H "Authorization: Bearer $PASSPORTCRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"key_id": "K3n9Qw2P", "scopes": ["passports:read", "passports:write"]}'Quand l'accès prend fin
DELETE /organizations/{organization}/grants/{keyId} met fin à une autorisation ; la clé continue de fonctionner sur toute autre organisation où elle détient une autorisation. Un client peut aussi retirer l'accès d'une clé depuis ses propres paramètres. Mettre fin à la collaboration entre un client et votre organisation met fin d'un coup à toutes les autorisations sur ce client. Ensuite, chaque requête pour ce client reçoit la réponse 404 organization_not_found_or_not_granted, la même réponse que pour une organisation qui n'existe pas. Pour distinguer les deux cas, appelez GET /organizations : une organisation à laquelle vous avez perdu l'accès n'apparaît plus dans la liste.
Chaque entrée de GET /organizations comporte display_name, le nom de l'organisation, et link_status, qui vaut "accepted" pour un client géré par votre organisation, et null pour votre propre organisation.
Clés live pour une organisation qui gère des clients
Une organisation qui gère des clients peut créer une clé live quand sa propre offre, ou l'offre d'au moins un de ses clients, est une offre Pro ou Scale payante. Une offre en période d'essai, ou avec un paiement en retard, ne compte pas. Chaque requête reste vérifiée par rapport à l'offre de l'organisation nommée dans son chemin.
Exemple : un planificateur, dix clients
Une tâche nocturne appelle GET /organizations pour lister les organisations sur lesquelles sa clé peut agir, puis synchronise chaque client séparément. Un client qui part disparaît de la liste, si bien que la tâche cesse de l'appeler au lieu de journaliser un 404 chaque nuit.
const base = 'https://passportcraft.com/api/v1'
const headers = { 'Authorization': 'Bearer ' + process.env.PASSPORTCRAFT_API_KEY }
const { data } = await (await fetch(base + '/organizations', { headers })).json()
const clients = data.filter((connection) => connection.link_status === 'accepted')
for (const client of clients) {
// One organization per request, always named in the path.
await syncCatalogue(client.organization_id, client.display_name)
}