API · 11 operationer
provisioning-api
Genererad ur services/provisioning-api/openapi.json, kontraktsversion 0.1.0. Auth-modell och anropare står i atlasen.
GET /healthz
Healthz
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | { [nyckel]: string } application/json |
GET /readyz
Readyz
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | { [nyckel]: string } application/json |
POST /v1/assistants/{assistant_id}/activate
Activate Assistant
Activate an assistant after lifecycle-api confirms it is ready. Idempotent by construction (uppföljning till Task 14, D-67-mönstret men utan Idempotency-Key-header): assistenten är sin egen naturliga nyckel. Om assistant_id redan har en assistant_activated-rad i public.audit_events (provisioning_events.v1) är anropet en omkörning — samma 200-svar returneras utan att skriva en andra hash-kedjad rad, och UTAN att fråga lifecycle-api igen. Kontrollen görs alltså FÖRE dossier-checken: den lokala WORM-kedjan är sanningen om aktiveringen redan skett, oberoende av vad lifecycle-api för tillfället svarar (en omkörning ska ge samma resultat, inte bli gisslan hos ett flackande nedströms-tillstånd). En assistent som ännu inte aktiverats passerar fortfarande dossier-checken precis som förut. Requires tenant_admin role (enforced by upstream llm-gateway / platform-JWT in production; provisioning-api itself is an internal service in v1 with service-token auth, so role enforcement is noted as a comment for the v2 platform-JWT upgrade).
| Parameter | I | Typ | Krävs |
|---|---|---|---|
assistant_id | path | string (uuid) | ja |
authorization | header | string | null | nej |
Kropp (valfri): ActivationRequest | null application/json
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | { [nyckel]: string } application/json |
422 | Validation Error | HTTPValidationError application/json |
GET /v1/tenants
List Tenants
| Parameter | I | Typ | Krävs |
|---|---|---|---|
limit | query | integer | nej |
offset | query | integer | nej |
authorization | header | string | null | nej |
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | TenantListResponse application/json |
422 | Validation Error | HTTPValidationError application/json |
POST /v1/tenants
Create Tenant
Create a tenant. Idempotent by construction (spec §7): unik slug ⇒ 409 vid omkörning. Ingen Idempotency-Key behövs. Se D-67.
| Parameter | I | Typ | Krävs |
|---|---|---|---|
authorization | header | string | null | nej |
Kropp: CreateTenantRequest application/json
| Svar | Beskrivning | Kropp |
|---|---|---|
201 | Successful Response | CreatedTenantResponse application/json |
422 | Validation Error | HTTPValidationError application/json |
GET /v1/tenants/{tenant_id}
Get Tenant
| Parameter | I | Typ | Krävs |
|---|---|---|---|
tenant_id | path | string (uuid) | ja |
authorization | header | string | null | nej |
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | TenantResponse application/json |
422 | Validation Error | HTTPValidationError application/json |
POST /v1/tenants/{tenant_id}/exports
Trigger Export
Trigger a tenant-exit export (spec §5): fan-out to 5 platform-DB services, assemble + encrypt an artifact, WORM-audit every transition. Idempotens (spec §7, D-67): `Idempotency-Key` är FRIVILLIG men rekommenderad för maskinella anropare. Samma nyckel för samma tenant returnerar det befintliga jobbet (202, samma export_id) utan att starta en andra fan-out. Nyckeln är avsiktligt inte obligatorisk — till skillnad från webhook-ytan, som är en främmande avsändare (app/api/webhooks.py:44-45).
| Parameter | I | Typ | Krävs |
|---|---|---|---|
tenant_id | path | string (uuid) | ja |
authorization | header | string | null | nej |
Idempotency-Key | header | string | null | nej |
| Svar | Beskrivning | Kropp |
|---|---|---|
202 | Successful Response | ExportJobResponse application/json |
422 | Validation Error | HTTPValidationError application/json |
GET /v1/tenants/{tenant_id}/exports/{export_id}
Get Export Status
| Parameter | I | Typ | Krävs |
|---|---|---|---|
tenant_id | path | string (uuid) | ja |
export_id | path | string (uuid) | ja |
authorization | header | string | null | nej |
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | ExportStatusResponse application/json |
422 | Validation Error | HTTPValidationError application/json |
GET /v1/tenants/{tenant_id}/exports/{export_id}/download
Download Export
| Parameter | I | Typ | Krävs |
|---|---|---|---|
tenant_id | path | string (uuid) | ja |
export_id | path | string (uuid) | ja |
authorization | header | string | null | nej |
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | any application/json |
422 | Validation Error | HTTPValidationError application/json |
POST /v1/tenants/{tenant_id}/transitions/{action}
Transition Tenant
Transition a tenant's status. Idempotent by construction (spec §7): tillståndsmaskinen avvisar en upprepad övergång med InvalidTransitionError. Se D-67.
| Parameter | I | Typ | Krävs |
|---|---|---|---|
tenant_id | path | string (uuid) | ja |
action | path | string | ja |
authorization | header | string | null | nej |
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | TenantResponse application/json |
422 | Validation Error | HTTPValidationError application/json |
POST /v1/webhooks/events
Receive Event
| Parameter | I | Typ | Krävs |
|---|---|---|---|
Idempotency-Key | header | string | null | nej |
authorization | header | string | null | nej |
Kropp: WebhookPayload application/json
| Svar | Beskrivning | Kropp |
|---|---|---|
200 | Successful Response | any application/json |
422 | Validation Error | HTTPValidationError application/json |
Scheman
ActivationRequest
| Fält | Typ | Krävs |
|---|---|---|
eval_dispensation | EvalDispensation | null | nej |
CreatedTenantResponse
| Fält | Typ | Krävs |
|---|---|---|
created_at | string (date-time) | ja |
database_name | string | null | ja |
id | string (uuid) | ja |
name | string | ja |
slug | string | ja |
status | string | ja |
CreateTenantRequest
| Fält | Typ | Krävs |
|---|---|---|
name | string | ja |
slug | string | ja |
EvalDispensation
Dispens för eval-kravet vid aktivering (plattformen#207 A7, D-152). En kunskapsbunden assistent kan inte passera eval: körningen frågar modellen utan kunskapssök, och källtvånget nekar det ogrundade svaret. Dispensen är ett uttryckligt, kedjeloggat undantag från just eval-blockeraren — aldrig från dossiern eller blockerande uppgifter — med skäl och slutdatum.
| Fält | Typ | Krävs |
|---|---|---|
expires_at | string (date-time) | ja |
reason | string | ja |
ExportCoverage
KONSUMENT-/statuskuvertet — medvetet skilt från libs/tenant_export. Den här modellen läser HISTORISKA JSONB-rader (app/api/exports.py:227) och måste därför tolerera framtida fält: med extra="forbid" hade varje nyckel som läggs i coverage-manifestet gjort alla redan existerande tenant_exports-rader till en 500 på statusrutten. Producentmodellen (libs/tenant_export.TenantExportCoverage) är strikt av motsatt skäl — den ska fånga drift. Två krav, två modeller, inget arv.
| Fält | Typ | Krävs |
|---|---|---|
covered | string[] | ja |
not_covered | StoredCoverageGap[] | ja |
ExportJobResponse
| Fält | Typ | Krävs |
|---|---|---|
expires_at | string (date-time) | ja |
export_id | string (uuid) | ja |
status | string | ja |
tenant_id | string (uuid) | ja |
ExportStatusResponse
| Fält | Typ | Krävs |
|---|---|---|
artifact_sha256 | string | null | ja |
artifact_size_bytes | integer | null | ja |
coverage | ExportCoverage | null | ja |
error | string | null | ja |
expires_at | string (date-time) | ja |
export_id | string (uuid) | ja |
status | string | ja |
tenant_id | string (uuid) | ja |
HTTPValidationError
| Fält | Typ | Krävs |
|---|---|---|
detail | ValidationError[] | nej |
StoredCoverageGap
Gap-formen som den LÄSES ur historisk JSONB — tolerant av samma skäl som ExportCoverage själv: en gammal rad får aldrig 500:a för att manifestet sedan dess fått ett fält till. Producentsidans CoverageGap (libs/tenant_export) är strikt, för där ska drift fälla högt. Två motsatta krav, två modeller — de ärver medvetet inte av varandra.
| Fält | Typ | Krävs |
|---|---|---|
reason | string | ja |
store | string | ja |
TenantListResponse
| Fält | Typ | Krävs |
|---|---|---|
items | TenantResponse[] | ja |
limit | integer | ja |
offset | integer | ja |
TenantResponse
| Fält | Typ | Krävs |
|---|---|---|
created_at | string (date-time) | ja |
database_name | string | null | ja |
id | string (uuid) | ja |
name | string | ja |
slug | string | ja |
status | string | ja |
ValidationError
| Fält | Typ | Krävs |
|---|---|---|
ctx | object | nej |
input | any | nej |
loc | string | integer[] | ja |
msg | string | ja |
type | string | ja |
WebhookPayload
| Fält | Typ | Krävs |
|---|---|---|
data | object | ja |
event_type | string | ja |
source | string | ja |