Fra FSWS-Institusjonsregisteret (fskode) til FS GraphQL API
⚠ Denne tjenesten avvikles etter 31. mars 2027. Nye integrasjoner bør bygges direkte på FS GraphQL API. Se Sikts avviklingspraksis og avviklingsloggen. Kilde: Teknisk dokumentasjon for FSWS-Institusjonsregisteret
FSWS-Institusjonsregisteret (også kalt FSWS-fskode) tilbyr oppslag av institusjonsdata gjennom to REST-endepunkter:
- Henting av én institusjon gitt institusjonsnummer
- Henting av en liste over institusjoner, med valgfri filtrering
Begge er erstattet av FS GraphQL API. Denne guiden viser hvert endepunkt side om side med spørringen som erstatter det. GraphQL lar deg selv velge hvilke felt du henter — bruk gjerne eksemplene som utgangspunkt og trim dem til ditt behov.
Finner du ikke det du trenger, kontakt fs-support@sikt.no.
Før du starter
Sett deg inn i disse tingene før du går videre:
- Tilgang, endepunkt og kontraktsnivå (
Feature-Flags-header): Kom i gang - Paginering: Spørringer
- Autorisasjon (RAS): Tilgangsstyring med RAS
- Bruker du en integrasjonsplattform (Gravitee/IntArk): FS GraphQL API og IntArk
- Utforsk skjemaet selv: Introspeksjon
Tilgang: ingen egen RAS-rolle kreves
FSWS-Institusjonsregisteret var åpent uten autentisering. FS GraphQL API krever at kallet er autentisert som en API-bruker, men datasettet i denne guiden har ingen egen navngitt RAS-rolle — det er ikke institusjonsspesifikt, så vanlig autentisert tilgang er nok. Se Hvordan får jeg tilgang? for å bestille en API-bruker.
Alle spørringene i denne guiden ligger på eksperimentell kontrakt
organisasjoner, organisasjonerGittOrganisasjonskoder, organisasjonstyper og
organisasjonstyperGittOrganisasjonstypekoder er i dag kun tilgjengelige på experimental
kontraktsnivå. Du må sende headeren
{ "Feature-Flags": "experimental" }
for at de i det hele tatt skal finnes i skjemaet du spør mot. Uten headeren får du feilen
FieldUndefined.
API-kontrakten sier at experimental-nivå kan endres eller fjernes uten forvarsel. Skal du bygge en produksjonsintegrasjon på disse spørringene, kontakt fs-support@sikt.no og be om at kontraktsnivået heves.
Av feltene i eksemplene under er kun disse stable: organisasjonskode, forkortelse,
navnAlleSprak med underfeltene nb, nn, en og se, samt Land-feltene landnummer,
landkodeAlfa3 og navnAlleSprak. Alt annet — url, erasmusInstitusjonskode,
organisasjonstype, schacHomeOrganization, besoksadresse, kanMottaSemesteravgift,
navnAlleSprakHistorikk, fskodeAkkreditering og selve land-feltet — er experimental. Merk
at land er experimental selv om feltene inne i Land er stable: headeren må uansett settes.
Ikke forveksle Organisasjon med URegOrganisasjon
Skjemaet har også en type URegOrganisasjon og spørringen uRegOrganisasjoner, fra
Utdanningsregisteret. Den dekker et bredere organisasjonsbegrep (også forvaltningsorganer og
leverandører), og id-verdiene der er ikke de samme som for Organisasjon, selv for samme
institusjon. Det er Organisasjon som erstatter FSWS-Institusjonsregisteret.
IDer: institusjonsnr virker videre, men id er noe nytt
institusjonsnr fra FSWS er den samme verdien som organisasjonskode i FS GraphQL API. Du
kan bruke institusjonsnumrene du allerede har lagret, direkte som argument til
organisasjonerGittOrganisasjonskoder og som organisasjonskode i responsen. Eneste forskjell er
typen: FSWS returnerte institusjonsnr som tall (185), GraphQL bruker streng ("185").
id er derimot en ny identifikator uten motstykke i FSWS. Det er en base64-enkodet node-ID,
for eksempel T3JnYW5pc2Fzam9uc3R5cGU6VU5JVg for organisasjonstypen UNIV. Behandle den som
ugjennomsiktig: ikke konstruer den selv, og ikke parse den for å hente ut koden. Trenger du
organisasjonskoden, spør etter organisasjonskode-feltet direkte i stedet.
Du trenger likevel node-IDer ett sted: filteret på organisasjoner tar node-IDer for
Organisasjonstype, ikke rå typekoder — se Filtrer på organisasjonstype
under.
Hent én institusjon
FSWS-Institusjonsregisteret tillot oppslag av en institusjon gitt institusjonsnummer. I FS
GraphQL API bruker du spørringen organisasjonerGittOrganisasjonskoder.
FSWS-Institusjonsregisteret:
GET /fskoder/institusjon/185
Eksempel på svar:
{
"institusjonsnr": 185,
"akronym": "UIO",
"navnNb": "Universitetet i Oslo",
"navnEn": "University of Oslo",
"navnNn": "Universitetet i Oslo",
"landNr": 0,
"typeKode": "UNIV",
"url": "http://www.uio.no",
"erasmusInstKode": "N OSLO01",
"schacHomeOrganization": "uio.no",
"navnHistList": []
}
FS GraphQL API:
query {
organisasjonerGittOrganisasjonskoder(
organisasjonskoder: ["185"]
) {
organisasjonskode
forkortelse
navnAlleSprak {
nb
nn
en
se
}
url
erasmusInstitusjonskode
organisasjonstype {
kode
beskrivelseAlleSprak {
nb
}
}
land {
landnummer
landkodeAlfa3
navnAlleSprak {
nb
}
}
schacHomeOrganization
}
}
Eksempel på svar:
{
"data": {
"organisasjonerGittOrganisasjonskoder": [
{
"organisasjonskode": "185",
"forkortelse": "UIO",
"navnAlleSprak": {
"nb": "Universitetet i Oslo",
"nn": "Universitetet i Oslo",
"en": "University of Oslo",
"se": null
},
"url": "https://www.uio.no/",
"erasmusInstitusjonskode": "N OSLO01",
"organisasjonstype": {
"kode": "UNIV",
"beskrivelseAlleSprak": {
"nb": "Universitet som mottar statstilskudd"
}
},
"land": {
"landnummer": "0",
"landkodeAlfa3": "NOR",
"navnAlleSprak": {
"nb": "Norge"
}
},
"schacHomeOrganization": "uio.no"
}
]
}
}
Ukjent organisasjonskode gir ingen feil. FSWS-Institusjonsregisteret svarte 404 når
institusjonsnummeret ikke fantes. organisasjonerGittOrganisasjonskoder returnerer i stedet en
kortere liste — koden faller bare ut av resultatet, uten feilmelding. Sender du inn fem koder og
får fire objekter tilbake, må du selv sammenligne organisasjonskode i svaret mot det du spurte
om for å finne hvilken som manglet.
Nytt i FS GraphQL API
Disse feltene fantes ikke i FSWS-Institusjonsregisteret:
| FS GraphQL API-felt | Hva det er |
|---|---|
navnAlleSprak { se } | Nord-samisk navn |
organisasjonstype { beskrivelseAlleSprak { nb nn en } } | Beskrivelse av organisasjonstypen, ikke bare koden |
besoksadresse { co gate postnummerOgSted land } | Organisasjonens fysiske besøksadresse |
kanMottaSemesteravgift | Om organisasjonen er godkjent betalingsmottaker for semesteravgift. Finnes også som filter på organisasjoner |
fskodeAkkreditering { erAkkreditert periode { fraArstall tilArstall } kilde } | Akkrediteringsstatus og -periode. Ikke bekreftet at dette fantes i FSWS sin faktiske respons — verifiser med tjenesteeier før du forutsetter at dette er nytt data, ikke en migrert verdi |
land { landkodeAlfa3 navnAlleSprak { nb nn en } } | Landet som eget objekt, ikke bare landnummer |
navnAlleSprakHistorikk er paginert
FSWS returnerte navnHistList som én flat liste med alle historiske navn. I GraphQL er dette en
Connection med first: Int = 100 som standard. For organisasjoner med mange navneendringer må du
sjekke pageInfo.hasNextPage og hente flere sider:
query {
organisasjonerGittOrganisasjonskoder(organisasjonskoder: ["185"]) {
navnAlleSprakHistorikk(first: 100) {
nodes {
und
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
Hent liste over institusjoner
FSWS-Institusjonsregisteret tillot filtrering av institusjoner på type (institusjonstypekode)
og endringerSiden (timestamp). I FS GraphQL API bruker du spørringen organisasjoner.
Viktige forskjeller:
- FS GraphQL API bruker cursor-basert paginering i stedet for å returnere alle resultater i én liste
- Filteret
typeerstattes avorganisasjonstyper, som tar en liste av node-IDer, ikke rå typekoder - Filteret
endringerSidenerstattes avendretEtter— se merknaden under - Standard sidestørrelse er 100 elementer per side
- Resultatet er sortert stigende på organisasjonskode (keyset-paginering) — du kan trygt bla gjennom alle sidene uten å hoppe over eller gjenta rader
FSWS-Institusjonsregisteret (alle institusjoner):
GET /fskoder/institusjoner
FS GraphQL API (alle organisasjoner med paginering):
query {
organisasjoner(first: 100) {
nodes {
organisasjonskode
forkortelse
navnAlleSprak {
nb
en
}
url
organisasjonstype {
kode
}
}
pageInfo {
hasNextPage
endCursor
}
totalCount
}
}
Eksempel på svar:
{
"data": {
"organisasjoner": {
"nodes": [
{
"organisasjonskode": "184",
"forkortelse": "UIB",
"navnAlleSprak": {
"nb": "Universitetet i Bergen",
"en": "University of Bergen"
},
"url": "https://www.uib.no/",
"organisasjonstype": { "kode": "UNIV" }
},
{
"organisasjonskode": "185",
"forkortelse": "UIO",
"navnAlleSprak": {
"nb": "Universitetet i Oslo",
"en": "University of Oslo"
},
"url": "https://www.uio.no/",
"organisasjonstype": { "kode": "UNIV" }
}
],
"pageInfo": {
"hasNextPage": true,
"endCursor": "WzE4NV0"
},
"totalCount": 28833
}
}
}
Registeret inneholder også utenlandske institusjoner, så det totale antallet er langt høyere enn
antallet norske læresteder. Filtrer på organisasjonstyper eller endretEtter der du kan, i
stedet for å hente alt.
For å hente neste side, bruk after-parameteren med endCursor-verdien:
query {
organisasjoner(first: 100, after: "WzE4NV0") {
nodes {
organisasjonskode
forkortelse
}
pageInfo {
hasNextPage
endCursor
}
}
}
Filtrer på organisasjonstype
Filteret organisasjonstyper tar node-IDer for Organisasjonstype, ikke rå typekoder som
"UNIV". Slå opp node-IDen for en gitt typekode med organisasjonstyperGittOrganisasjonstypekoder:
query {
organisasjonstyperGittOrganisasjonstypekoder(
organisasjonstypekoder: ["UNIV"]
) {
id
kode
beskrivelseAlleSprak {
nb
}
}
}
Eksempel på svar:
{
"data": {
"organisasjonstyperGittOrganisasjonstypekoder": [
{
"id": "T3JnYW5pc2Fzam9uc3R5cGU6VU5JVg",
"kode": "UNIV",
"beskrivelseAlleSprak": {
"nb": "Universitet som mottar statstilskudd"
}
}
]
}
}
Bruk deretter den returnerte id-verdien som filter:
query {
organisasjoner(
first: 100,
filter: {
organisasjonstyper: ["T3JnYW5pc2Fzam9uc3R5cGU6VU5JVg"]
}
) {
nodes {
organisasjonskode
forkortelse
organisasjonstype {
kode
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
Du kan også liste alle tilgjengelige organisasjonstyper med organisasjonstyper:
query {
organisasjonstyper(first: 100) {
nodes {
id
kode
beskrivelseAlleSprak {
nb
}
}
}
}
endretEtter oppfører seg ikke som endringerSiden
FSWS-Institusjonsregisteret (endringer siden timestamp):
GET /fskoder/institusjoner?endringerSiden=1709913600000
FS GraphQL API (endringer etter tidspunkt):
query {
organisasjoner(
first: 100,
filter: {
endretEtter: "2024-03-08T16:00:00Z"
}
) {
nodes {
organisasjonskode
forkortelse
}
}
}
Det er tre forskjeller, og den siste kan gi deg duplikater hvis du ikke tar høyde for den:
- Verdien er en
DateTimei ISO 8601-format, ikke millisekunder siden epoke. - Klokkeslettet forkastes. Filteret sammenligner mot endringsdato, ikke tidspunkt —
2024-03-08T16:00:00Zog2024-03-08T00:00:00Zgir nøyaktig samme resultat. - Sammenligningen er «på eller etter», ikke «etter», til tross for navnet. Sender du inn datoen for forrige synkronisering, får du hele det døgnets endringer på nytt. Kjører du inkrementell synkronisering, må klienten enten deduplisere mot det den allerede har, eller spørre fra dagen etter forrige kjøring og akseptere at endringer samme dag kommer med først neste gang.
Filteret skal på sikt erstattes med mer finkornede hendelsesspørringer som gir bedre kontroll på hva som faktisk er endret.
Feltmapping
| FSWS-Institusjonsregisteret (JSON-felt) | FS GraphQL API (felt) | Kontraktsnivå | Merknad |
|---|---|---|---|
institusjonsnr | organisasjonskode | stable | Samme verdi, streng i stedet for tall |
akronym | forkortelse | stable | |
navnNb | navnAlleSprak { nb } | stable | |
navnEn | navnAlleSprak { en } | stable | |
navnNn | navnAlleSprak { nn } | stable | |
typeKode | organisasjonstype { kode } | experimental | |
url | url | experimental | |
erasmusInstKode | erasmusInstitusjonskode | experimental | |
landNr | land { landnummer } | experimental (feltet), stable (underfeltene) | |
schacHomeOrganization | schacHomeOrganization | experimental | |
navnHistList | navnAlleSprakHistorikk { nodes { und } } | experimental | Nå paginert, se over |
Kontakt oss for hjelp ved behov
Kontakt fs-support@sikt.no dersom du trenger hjelp til å komme i gang, eller underveis i migreringen. Beskriv gjerne hvilket FSWS-endepunkt du erstatter og hvilke felt du er avhengig av.