Submission Service API
Oversikt
Submission-tjenesten for digital bevaring tilbyr et REST-basert API for å håndtere digitale leveranser og tilhørende filer. Tjenesten lar klienter opprette leveranser, registrere filer, laste opp innhold og spore statusen gjennom hele bevaringsprosessen.
Denne dokumentasjonen kompletterer den detaljerte API-spesifikasjonen som er tilgjengelig via Swagger på https://digitalpreservation.no/swagger/.
Autentisering og autorisasjon
API-et bruker OAuth 2.0 med JWT-token for autentisering, og implementerer spesifikt OAuth 2.0 Client Credentials-flyten. Submission-tjenesten er designet for system-til-system-kommunikasjon og støtter ikke autentiseringsflyter basert på sluttbrukere (f.eks. Authorization Code-flyt).
OAuth 2.0 Client Credentials-flyt
- Klientapplikasjonen din autentiserer seg mot autorisasjonsserveren ved å bruke client ID og client secret
- Autorisasjonsserveren validerer disse legitimasjonene og returnerer et access token
- Applikasjonen inkluderer dette tokenet i Authorization-headeren i alle API-kall
All API-kommunikasjon skjer via https://api.nb.no, mens autentiseringsforespørsler sendes til https://www.nb.no/authn/realms/dps/protocol/openid-connect/token.
Eksempel på token-forespørsel:
POST /authn/realms/dps/protocol/openid-connect/token HTTP/1.1
Host: www.nb.no
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id={your_client_id}
&client_secret={your_client_secret}
Eksempel på API-kall med token:
GET /dps-submission/v1/contracts/{your_contract_id}/submissions/{your_submission_id} HTTP/1.1
Host: api.nb.no
Authorization: Bearer {access_token}
Rollebasert tilgangsstyring
Tilgang til endepunkter styres gjennom roller:
- Kontraktsspesifikke roller (
{contractId}_R
,{contractId}_W
) gir lese- og skrivetilgang til ressurser under en spesifikk kontrakt - Rollen
DPS_SUBMISSION_HANDLER
kreves for interne statusoperasjoner
Klientapplikasjonen må hente access token, og den utstedte JWT-en vil inneholde tildelte roller.
Ressursmodeller
Submission
En submission representerer en pakke med filer og metadata som skal bevares.
Viktige egenskaper:
contractId
: Kontrakts-ID i Base16 (heksadesimalt) format (4 tegn, [0-9A-F])submissionId
: Unik ID i Base62-format (22 tegn, [A-Za-z0-9]). ID-en er case-sensitivclientId
: ID for klienten som laster opp, hentet fra JWT-tokenobjectId
: Klientdefinert ID for objektetstatus
: Gjeldende status for submissionenpriority
: Prioritet for submissionen, brukt for behandlingsrekkefølge i DPSmetadata
: Dublin Core-basert metadata for submissionensumSizeInBytes
: Total filstørrelse i bytes
File
En fil representerer en individuell digital ressurs i en submission.
Viktige egenskaper:
contractId
: Kontrakts-ID i Base16 (4 tegn, [0-9A-F])submissionId
: Unik ID i Base62-format (22 tegn). Case-sensitivfileId
: Unik ID i Base62-format (22 tegn). Case-sensitivfilePath
: Relativ filsti innen submissionens3ObjectKey
: Intern S3-nøkkel hvor filen er lagretchecksum
: MD5-sjekksum av filinnholdetisPackaged
: Angir om filen er pakket (f.eks. ZIP eller TAR) og skal pakkes ut under behandling. Hvistrue
, vil innholdet pakkes ut og behandles individuelt.uploadUrl
: Pre-signert URL for direkte opplasting til vår S3-kompatible lagring
Filstørrelsesbegrensning:
- Maks filstørrelse: 5 GB per fil
- Begrensningen skyldes restriksjoner i pre-signerte S3-URL-er
Leveringsflyt
Hele prosessen for å levere innhold ser slik ut:
- Opprett en submission med metadata
- Registrer filer for å få pre-signerte opplastingslenker
- Last opp filer via disse lenkene
- Fullfør submissionen for å starte bevaringsbehandling
- Spor submission-status etter hvert som den behandles (statusoppdatering kommer i senere versjon)
Eksempel: registrer ny submission
Forespørsel
POST /dps-submission/v1/contracts/1234/submissions HTTP/1.1
Host: api.nb.no
Content-Type: application/json
Authorization: Bearer eyJhbGciOxxxxxxx
{
"objectId": "digavis_aabcc",
"priority": 50,
"metadata": {
"type": "Artikkel",
"identifier": [
{
"type": "URN",
"value": "URN:NBN:no-nb_plfut_00001"
}
],
"title": {
"value": "My Book Title",
"lang": "eng"
},
"alternative": [
{
"type": "Original title",
"value": "My Alternative Book Title",
"lang": "eng"
}
],
"creator": [
{
"name": "Marek, Václav",
"type": "Person",
"role": "Fotograf",
"authority": {
"source": "Example authority",
"code": "198097",
"uri": "https://example.com/198097"
}
}
],
"contributor": [
{
"name": "Nordmann, Ola",
"type": "Person",
"role": "Avbildet",
"authority": {
"source": "Example authority",
"code": "198097",
"uri": "https://example.com/198097"
}
}
],
"publisher": [
{
"name": "Gyldendal",
"type": "Organization",
"authority": {
"source": "Example authority",
"code": "198097",
"uri": "https://example.com/198097"
}
}
],
"spatial": [
{
"name": "Mo i Rana",
"type": "Place",
"authority": {
"source": "Example authority",
"code": "198097",
"uri": "https://example.com/198097"
},
"coordinateReferenceSystem": "EPSG:4326",
"latitude": 67.2968,
"longitude": 14.3974
}
],
"date": [
{
"type": "created",
"value": "2023-10-27"
}
],
"language": [
{
"type": "Subtitles",
"value": "Swedish",
"lang": "eng"
}
],
"isPartOf": [
{
"value": "Chronicles of Narnia",
"lang": "eng"
}
],
"provenance": [
{
"value": "The collection was donated to the National Library by Václav Marek 1979-05-12",
"lang": "eng"
}
],
"subject": [
{
"lang": "nob",
"value": "Norge"
}
],
"description": [
{
"lang": "nob",
"value": "Norge"
}
]
}
}
Respons
{
"contractId": "1234",
"submissionId": "8Z7x1T9rN0Xc2B5Yq4L3zP",
"objectId": "digavis_aabcc",
"clientId": "myClientId",
"status": "REGISTERED",
"priority": 50
}
Eksempel: registrer fil for opplasting
Forespørsel
POST /dps-submission/v1/contracts/1234/submissions/8Z7x1T9rN0Xc2B5Yq4L3zP/files HTTP/1.1
Host: api.nb.no
Content-Type: application/json
Authorization: Bearer eyJhbGciOxxxxxxx
{
"filePath": "representations/primary_20250217/data/ranablad_20250215.pdf",
"checksum": "d41d8cd98f00b204e9800998ecf8427e",
"isPackaged": false
}
Respons
{
"fileId": "1M0x4T9rN8Xc7B2Yq5L3zK",
"filePath": "representations/primary_20250217/data/ranablad_20250215.pdf",
"checksum": "d41d8cd98f00b204e9800998ecf8427e",
"isPackaged": false,
"uploadUrl": "https://s3.nb.no/examplebucket/...&X-Amz-Signature=..."
}
Eksempel: fullfør submission
Forespørsel
POST /dps-submission/v1/contracts/1234/submissions/8Z7x1T9rN0Xc2B5Yq4L3zP/finalize HTTP/1.1
Host: api.nb.no
Authorization: Bearer eyJhbGciOxxxxxxx
Respons
{
"contractId": "1234",
"submissionId": "8Z7x1T9rN0Xc2B5Yq4L3zP",
"objectId": "digavis_aabcc",
"clientId": "myClientId",
"status": "UPLOAD_COMPLETED",
"priority": 50,
"sumSizeInBytes": 12345678,
"files": [
{
"fileId": "1M0x4T9rN8Xc7B2Yq5L3zK",
"filePath": "representations/primary_20250217/data/ranablad_20250215.pdf",
"s3ObjectKey": "myClientId/1234/8Z7x1T9rN0Xc2B5Yq4L3zP/representations/primary_20250217/data/ranablad_20250215.pdf",
"checksum": "d41d8cd98f00b204e9800998ecf8427e",
"isPackaged": false,
"uploadUrl": "https://s3.nb.no/examplebucket/...&X-Amz-Signature=..."
}
]
}
Filopplasting
Opplastingsprosessen følger disse stegene:
- Registrer en fil ved å sende POST til
/contracts/{contractId}/submissions/{submissionId}/files
- Få en pre-signert URL i responsen (gyldig i ca. 1 time)
- Last opp filinnholdet direkte til S3 ved å bruke HTTP PUT til den angitte URL-en
Bruk av pre-signert URL
PUT {pre-signed-url} HTTP/1.1
Content-Length: {file-size}
[FILE CONTENT]
Krav til opplasting
- Filen må lastes opp via oppgitt pre-signert URL
- Filinnholdet må ha samme MD5-sjekksum som oppgitt ved registrering
Håndtering av feil
- Hvis opplasting feiler eller går ut på tid, kan du prøve på nytt med samme URL (hvis gyldig)
- Hvis URL-en er utløpt, slett filregistreringen og registrer på nytt for å få en ny URL
Statusflyt
En submission går gjennom følgende statuser:
REGISTERED
– OpprettetUPLOAD_COMPLETED
– Alle filer er lastet opp og submission er fullførtTRANSFERRING
– Innhold overføres til bevaringssystemetVALIDATING
– Innholdet valideresARCHIVING
– Innholdet arkiveresPRESERVED
– Innholdet er bevartREJECTED
– Submission er avvist pga. feil
Feilhåndtering
API-et bruker vanlige HTTP-statuskoder:
200 OK
– Vellykket201 Created
– Ressurs opprettet400 Bad Request
– Feil i forespørselen401 Unauthorized
– Manglende eller ugyldig token403 Forbidden
– Token gyldig, men mangler rettigheter404 Not Found
– Ressurs ikke funnet409 Conflict
– Duplikat500 Internal Server Error
– Uventet feil
Ved feil returneres et JSON-objekt med error
:
{
"error": {
"code": "ERROR_CODE",
"message": "A descriptive error message",
"details": "Additional details about the error"
}
}
Beste praksis
- Verifiser alltid sjekksum før opplasting
- Bruk unike
objectId
per kontrakt - Legg ved rik metadata for bedre søk og bevaring
- Håndter feil korrekt i klientapplikasjonen
Støtte
Trenger du hjelp eller har spørsmål, kontakt teamet for digital bevaring ved Nasjonalbiblioteket.
API-referanse
For fullstendig informasjon om endepunkter, parametere, skjema og statuser, se Swagger-dokumentasjonen.