API v1

Server-till-server-API för granskarmotorn

Skapa en upload-url, ladda upp PDF:en, köa analysen med jobId, och hämta status eller ta emot webhook när jobbet är klart.

Autentisering

Alla anrop använder en MANI-nyckel i Authorization-headern. Rånyckeln visas bara en gång i admin-UI:t när den skapas eller roteras.

Authorization: Bearer mani_live_...

Minsta körbara flöde

API="https://europe-west1-<firebase-project>.cloudfunctions.net/apiV1"
KEY="mani_live_..."

curl -s -X POST "$API/v1/upload-url" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json"

# Svaret innehåller jobId och uploadUrl. Ladda upp PDF:en direkt till uploadUrl.
curl -X PUT "<uploadUrl från svaret>" \
  -H "Content-Type: application/pdf" \
  --upload-file ./dokument.pdf

curl -X POST "$API/v1/analyze" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"<jobId från upload-url-svaret>"}'

curl -s "$API/v1/usage" \
  -H "Authorization: Bearer $KEY"

curl -s "$API/v1/jobs/<jobId>" \
  -H "Authorization: Bearer $KEY"

Rutter

GET/v1/mescope: inget scope-krav

Body: -. Svar: tenant, nyckel, scopes, kvot, engineConfigured.

GET/v1/usagescope: inget scope-krav

Body: -. Svar: aktuell kvot + dygnsaggregat för nyckeln.

POST/v1/upload-urlscope: analyze

Body: -. Svar: jobId + signerad uploadUrl för PDF-upload.

POST/v1/analyzescope: analyze

Body: jobId, offeringKey?, includeDiagnostics?, webhookUrl?, webhookSecret?. Svar: 202 med jobId, status, engineConfigured och återstående kvot.

GET/v1/jobs/:idscope: jobs

Body: -. Svar: status, steg, resultat eller motorfel.

DELETE/v1/jobs/:idscope: jobs

Body: -. Svar: raderar jobb och payload efter läsning.

Analyze-body

{
  "jobId": "job_123",
  "offeringKey": "nis2-basic",
  "includeDiagnostics": false,
  "webhookUrl": "https://partner.example/webhooks/granska",
  "webhookSecret": "minst-16-tecken-hemlighet"
}

webhookUrl är valfri men måste vara HTTPS utan inbäddade credentials. Anges webhook krävs webhookSecret på 16-512 tecken.

Kvot och STUB-läge

POST /v1/analyze reserverar en kvotenhet innan jobbet köas. Om motorn svarar med engine_unavailable, engine_auth eller engine_invalid släpps reservationen igen.

engineConfigured:false betyder att backend kör STUB-motorn. Flödet är körbart, men resultaten är syntetiska tills motorns credentials är konfigurerade.

GET /v1/usage returnerar aktuell kvot, återstående anrop och dygnsaggregat för innevarande och föregående period. total är alla autentiserade API-anrop; quotaDebited är anrop som drog analysekvot.

Read-and-burn

Jobbresultat är kortlivade i motorn. Hämta status tätt eller använd webhook. När partnern inte längre behöver resultatet kan DELETE /v1/jobs/:id radera jobb och payload direkt.

Felkoder

missing_key

Authorization-header saknas.

invalid_key

Nyckeln har fel format eller matchar ingen aktiv hash.

revoked

Nyckeln är återkallad.

tenant_inactive

Organisationen finns inte längre.

tenant_suspended

Organisationen är pausad.

no_api_access

Organisationens nivå saknar API-åtkomst.

scope_denied

Nyckeln saknar scope för rutten.

quota_exceeded

Månadskvoten är förbrukad.

missing_job_id

Analyze saknar jobId från upload-url-steget.

unknown_offering

offeringKey finns inte för tenanten eller SYSTEM.

invalid_webhook_url

webhookUrl är ogiltig.

missing_webhook_secret

webhookUrl kräver webhookSecret.

invalid_webhook_secret

webhookSecret är för kort eller för långt.

engine_*

Motorn avvisade, saknade auth eller var otillgänglig.

Intern teknisk referens finns även i API-nyckelsidan för inloggade tenant-administratörer.