stacken.docs

Styrning för en växande portfölj av AI-tjänster

stacken.ai ↗

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

SvarBeskrivningKropp
200Successful Response{ [nyckel]: string } application/json

GET /readyz

Readyz

SvarBeskrivningKropp
200Successful 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).

ParameterITypKrävs
assistant_idpathstring (uuid)ja
authorizationheaderstring | nullnej

Kropp (valfri): ActivationRequest | null application/json

SvarBeskrivningKropp
200Successful Response{ [nyckel]: string } application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/tenants

List Tenants

ParameterITypKrävs
limitqueryintegernej
offsetqueryintegernej
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseTenantListResponse application/json
422Validation ErrorHTTPValidationError 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.

ParameterITypKrävs
authorizationheaderstring | nullnej

Kropp: CreateTenantRequest application/json

SvarBeskrivningKropp
201Successful ResponseCreatedTenantResponse application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/tenants/{tenant_id}

Get Tenant

ParameterITypKrävs
tenant_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseTenantResponse application/json
422Validation ErrorHTTPValidationError 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).

ParameterITypKrävs
tenant_idpathstring (uuid)ja
authorizationheaderstring | nullnej
Idempotency-Keyheaderstring | nullnej
SvarBeskrivningKropp
202Successful ResponseExportJobResponse application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/tenants/{tenant_id}/exports/{export_id}

Get Export Status

ParameterITypKrävs
tenant_idpathstring (uuid)ja
export_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseExportStatusResponse application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/tenants/{tenant_id}/exports/{export_id}/download

Download Export

ParameterITypKrävs
tenant_idpathstring (uuid)ja
export_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful Responseany application/json
422Validation ErrorHTTPValidationError 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.

ParameterITypKrävs
tenant_idpathstring (uuid)ja
actionpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseTenantResponse application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/webhooks/events

Receive Event

ParameterITypKrävs
Idempotency-Keyheaderstring | nullnej
authorizationheaderstring | nullnej

Kropp: WebhookPayload application/json

SvarBeskrivningKropp
200Successful Responseany application/json
422Validation ErrorHTTPValidationError application/json

Scheman

ActivationRequest

FältTypKrävs
eval_dispensationEvalDispensation | nullnej

CreatedTenantResponse

FältTypKrävs
created_atstring (date-time)ja
database_namestring | nullja
idstring (uuid)ja
namestringja
slugstringja
statusstringja

CreateTenantRequest

FältTypKrävs
namestringja
slugstringja

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ältTypKrävs
expires_atstring (date-time)ja
reasonstringja

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ältTypKrävs
coveredstring[]ja
not_coveredStoredCoverageGap[]ja

ExportJobResponse

FältTypKrävs
expires_atstring (date-time)ja
export_idstring (uuid)ja
statusstringja
tenant_idstring (uuid)ja

ExportStatusResponse

FältTypKrävs
artifact_sha256string | nullja
artifact_size_bytesinteger | nullja
coverageExportCoverage | nullja
errorstring | nullja
expires_atstring (date-time)ja
export_idstring (uuid)ja
statusstringja
tenant_idstring (uuid)ja

HTTPValidationError

FältTypKrävs
detailValidationError[]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ältTypKrävs
reasonstringja
storestringja

TenantListResponse

FältTypKrävs
itemsTenantResponse[]ja
limitintegerja
offsetintegerja

TenantResponse

FältTypKrävs
created_atstring (date-time)ja
database_namestring | nullja
idstring (uuid)ja
namestringja
slugstringja
statusstringja

ValidationError

FältTypKrävs
ctxobjectnej
inputanynej
locstring | integer[]ja
msgstringja
typestringja

WebhookPayload

FältTypKrävs
dataobjectja
event_typestringja
sourcestringja