Gå til indhold

Organisationer & Workspaces

Oversigt

qr3.app bruger et hierarki i to niveauer:

Organization (Firma/Agentur)
└── Workspace 1 (Kunde A)
└── Workspace 2 (Kunde B)
└── Workspace 3 (Internes Team)
  • Organisation — øverste niveau, tilknyttet en Stripe-konto og plan
  • Workspace — isoleret område til QR-koder, scanninger og API-nøgler

Organizations API

GET /v1/organizations

Returnerer den organisation, som den aktuelle API-nøgle tilhører.

Terminal window
curl https://qr3.app/v1/organizations \
-H "Authorization: Bearer qr3_sk_..."

GET /v1/organizations/usage

Returnerer organisationens live-forbrug i forhold til planens grænser — summeret på tværs af alle workspaces og beregnet live: scans for den aktuelle afregningsmåned (mod max_scans_per_month) og dynamic_codes, antallet af aktive dynamiske koder (mod max_dynamic_codes). Ingen af dem blokeres nogensinde ved grænsen; brug dette slutpunkt til visning af forbrug og opgraderingsmeddelelser.

Terminal window
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

Opretter en ny organisation.

Terminal window
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]"
}'

Felter:

FeltTypePåkrævetBeskrivelse
namestring✅Visningsnavn (maks. 255 tegn)
slugstring✅URL-venlig, unik (min. 2, maks. 63 tegn, kun a-z0-9-)
billing_emailstring—Fakturerings-e-mail

PATCH /v1/organizations/:id

Ændrer organisationens navn, faktura-e-mail og notifikations-e-mail.

Kun en org_admin kan ændre dem, i en dashboard-session. Anmodninger med en API-nøgle afvises med 403 — også qr3_sk_- og qr3_test_sk_-nøgler — så en lækket nøgle kan ikke omdirigere faktura- eller notifikationsadressen.

DELETE /v1/organizations/:id

Soft-delete af organisationen. Alle tilhørende workspaces og QR-koder bevares, men er ikke længere tilgængelige.

Kræver rollen org_admin (dashboard-session). Anmodninger med en ren API-nøgle afvises med 403 — API-nøgler opnår aldrig en admin-rolle, så en lækket nøgle kan ikke slette organisationen.


Workspaces API

GET /v1/workspaces

Viser de workspaces, kalderen kan se: org_admin og organisationens ejer ser alle organisationens workspaces, andre medlemmer kun de workspaces, de er med i, og en API-nøgle kun sit eget workspace. Et workspace, som kalderen ikke kan se, svarer med 404 på alle /v1/workspaces/:id-ruter, præcis som et ukendt ID.

Terminal window
curl https://qr3.app/v1/workspaces \
-H "Authorization: Bearer qr3_sk_..."

POST /v1/workspaces

Opret et nyt workspace.

Terminal window
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
}'

Med en API-nøgle må kun en nøgle, som en org_admin eller organisationens ejer har oprettet, oprette et workspace; alle andre nøgler får 403, allerede før slug’en kontrolleres (svaret afslører altså ikke, hvilke slugs der er optaget). Opretterens rolle kontrolleres ved hver anmodning: bliver vedkommende nedgraderet, mister nøglen retten. En API-nøgle er bundet til sit eget workspace og ser ikke det nye bagefter: dets id står i 201-svaret; en org_admin åbner det i dashboardet og kan oprette en nøgle til det der. I dashboardet må kun en org_admin oprette workspaces.

Felter:

FeltTypeStandardBeskrivelse
namestring—Visningsnavn (påkrævet)
slugstring—URL-venlig, unik pr. org (påkrævet)
default_localestringdeStandardsprog
approval_requiredbooleanfalseReserveret til planlagt godkendelsesworkflow (ikke implementeret)
primary_colorstring—Branding-farve (#RRGGBB)

Plan-grænser:

PlanMaks. workspaces
Free1
Pro1
Business10
Agency50
Enterprise500

PATCH /v1/workspaces/:id

Terminal window
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

Arkiverer workspacet. Kan ikke anvendes på dit eget workspace.

Kræver org_admin eller ws_admin for det workspace, der skal arkiveres; andre roller får 403. Et workspace, som kalderen ikke kan se, svarer med 404 — for en API-nøgle er det alle workspaces undtagen dens eget, som den heller ikke kan arkivere.


Audit-logs

GET /v1/audit-logs

Sporbar log over alle ændringer i workspacet.

Terminal window
curl "https://qr3.app/v1/audit-logs?resource_type=codes&limit=50" \
-H "Authorization: Bearer qr3_sk_..."

Query-parametre:

ParameterTypeBeskrivelse
resource_typestringFiltrer efter ressource: codes, api_keys, webhooks, workspaces
resource_idstringFiltrer efter specifik ressource-id
actionstringFiltrer efter handling (f.eks. codes.created)
cursorstringPaginerings-cursor
limitintegerMaks. 100 (standard: 50)

Eksempel på svar:

{
"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"
}
]
}