Aller au contenu

Organisations & Workspaces

Aperçu

qr3.app utilise une hiérarchie à deux niveaux :

Organization (Firma/Agentur)
└── Workspace 1 (Kunde A)
└── Workspace 2 (Kunde B)
└── Workspace 3 (Internes Team)
  • Organisation — niveau supérieur, associé à un compte Stripe et à un forfait
  • Workspace — espace isolé pour les codes QR, les scans et les clés API

API Organizations

GET /v1/organizations

Retourne l’organisation à laquelle appartient la clé API actuelle.

Fenêtre de terminal
curl https://qr3.app/v1/organizations \
-H "Authorization: Bearer qr3_sk_..."

GET /v1/organizations/usage

Retourne l’utilisation en temps réel de l’organisation par rapport aux limites du forfait — cumulée sur tous les workspaces et calculée en direct : scans pour le mois de facturation en cours (par rapport à max_scans_per_month) et dynamic_codes, le nombre de codes dynamiques actifs (par rapport à max_dynamic_codes). Aucun des deux n’est jamais bloqué lorsque la limite est de dépassement ; utilisez cet endpoint pour afficher l’utilisation et les invitations à passer au forfait supérieur.

Fenêtre de terminal
curl https://qr3.app/v1/organizations/usage \
-H "Authorization: Bearer qr3_sk_..."
{
"data": {
"scans": {
"used": 4120,
"limit": 5000,
"usage_pct": 82,
"remaining": 880,
"period": "2026-06",
"period_start": "2026-06-01T00:00:00.000Z"
},
"dynamic_codes": {
"used": 142,
"limit": 500,
"usage_pct": 28,
"remaining": 358
}
}
}

POST /v1/organizations

Crée une nouvelle organisation.

Fenêtre de terminal
curl -X POST https://qr3.app/v1/organizations \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Digital Heroes GmbH",
"slug": "digital-heroes",
"billing_email": "[email protected]"
}'

Champs :

ChampTypeRequisDescription
namestring✅Nom d’affichage (max. 255 caractères)
slugstring✅Compatible URL, unique (min. 2, max. 63 caractères, uniquement a-z0-9-)
billing_emailstring—E-mail de facturation

PATCH /v1/organizations/:id

Modifie le nom, l’e-mail de facturation et l’e-mail de notification de l’organisation.

Seul un org_admin peut les modifier, dans une session du tableau de bord. Les requêtes authentifiées avec une clé API sont rejetées avec 403 — clés qr3_sk_ et qr3_test_sk_ comprises —, une clé divulguée ne peut donc pas détourner l’adresse de facturation ou de notification.

DELETE /v1/organizations/:id

Suppression réversible (soft-delete) de l’organisation. Tous les workspaces et codes QR associés sont conservés, mais ne sont plus accessibles.

Requiert le rôle org_admin (session du tableau de bord). Les requêtes authentifiées avec une simple clé API sont rejetées avec 403 — les clés API ne possèdent jamais de rôle d’administrateur, une clé divulguée ne peut donc pas supprimer l’organisation.


API Workspaces

GET /v1/workspaces

Liste les workspaces visibles pour l’appelant : org_admin et le propriétaire de l’organisation voient tous les workspaces de l’organisation, les autres membres uniquement les workspaces auxquels ils appartiennent, et une clé API uniquement son propre workspace. Un workspace que l’appelant ne peut pas voir répond 404 sur chaque route /v1/workspaces/:id, exactement comme un ID inconnu.

Fenêtre de terminal
curl https://qr3.app/v1/workspaces \
-H "Authorization: Bearer qr3_sk_..."

POST /v1/workspaces

Créer un nouveau workspace.

Fenêtre de terminal
curl -X POST https://qr3.app/v1/workspaces \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Kunde Bäckerei Schmidt",
"slug": "baeckerei-schmidt",
"default_locale": "de",
"primary_color": "#8B4513",
"approval_required": false
}'

Avec une clé API, seule une clé créée par un org_admin ou par le propriétaire de l’organisation peut créer un workspace ; toute autre clé reçoit 403, avant même la vérification du slug (la réponse ne révèle donc pas quels slugs sont pris). Le rôle de la personne qui a créé la clé est vérifié à chaque requête : si elle est rétrogradée, sa clé perd ce droit. Une clé API est liée à son propre workspace et ne voit pas le nouveau ensuite : son id figure dans la réponse 201 ; un org_admin l’ouvre dans le tableau de bord et peut y créer une clé pour lui. Dans le tableau de bord, seul un org_admin peut créer des workspaces.

Champs :

ChampTypePar défautDescription
namestring—Nom d’affichage (requis)
slugstring—Compatible URL, unique par organisation (requis)
default_localestringdeLangue par défaut
approval_requiredbooleanfalseRéservé au workflow d’approbation planifié (non implémenté)
primary_colorstring—Couleur de marque (#RRGGBB)

Limites du forfait :

ForfaitMax. Workspaces
Free1
Pro1
Business10
Agency50
Enterprise500

PATCH /v1/workspaces/:id

Fenêtre de terminal
curl -X PATCH https://qr3.app/v1/workspaces/ws_xyz789 \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Neuer Name",
"approval_required": true
}'

DELETE /v1/workspaces/:id

Archive le workspace. Ne peut pas être appliqué à votre propre workspace.

Requiert org_admin ou ws_admin du workspace à archiver ; les autres rôles reçoivent 403. Un workspace que l’appelant ne peut pas voir répond 404 — pour une clé API, c’est le cas de tout workspace sauf le sien, qu’elle ne peut pas non plus archiver.


Journaux d’audit

GET /v1/audit-logs

Historique traçable de toutes les modifications apportées au workspace.

Fenêtre de terminal
curl "https://qr3.app/v1/audit-logs?resource_type=codes&limit=50" \
-H "Authorization: Bearer qr3_sk_..."

Paramètres de requête :

ParamètreTypeDescription
resource_typestringFiltrer par ressource : codes, api_keys, webhooks, workspaces
resource_idstringFiltrer par ID de ressource spécifique
actionstringFiltrer par action (par ex. codes.created)
cursorstringCurseur de pagination
limitintegerMax. 100 (par défaut : 50)

Exemple de réponse :

{
"data": [
{
"id": "aud_a1b2c3",
"actor_type": "api",
"action": "codes.created",
"resource_type": "codes",
"resource_id": "qr_xyz123",
"changes": {},
"created_at": "2026-03-15T10:00:00.000Z"
}
]
}