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
Body: -. Svar: tenant, nyckel, scopes, kvot, engineConfigured.
Body: -. Svar: aktuell kvot + dygnsaggregat för nyckeln.
Body: -. Svar: jobId + signerad uploadUrl för PDF-upload.
Body: jobId, offeringKey?, includeDiagnostics?, webhookUrl?, webhookSecret?. Svar: 202 med jobId, status, engineConfigured och återstående kvot.
Body: -. Svar: status, steg, resultat eller motorfel.
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.