Gå til hovedinnhold

Fra FSWS-Studinfo2 (REST) til FS GraphQL API

⚠ Denne tjenesten har passert Sikts støttefrist (End of Service) 31.03.2026. Vi gir ikke lenger brukerstøtte eller retter feil i FSWS-Studinfo2 (REST), og tjenesten kan slås av uten varsel. Bruk FS GraphQL API i stedet. Se Sikts avviklingspraksis og avviklingsloggen. Kilde: fellesstudentsystem.no/.../rest/studinfo.html

Denne guiden gjelder REST-varianten. SOAP-varianten av FSWS-Studinfo2 er allerede avviklet (24.04.2025) og svarer ikke lenger.

Denne guiden hjelper deg migrere fra FSWS-Studinfo2 (REST) til FS GraphQL API. Listen med eksempler under er ikke komplett. Ta kontakt med fs-support@sikt.no dersom du trenger hjelp til å finne en spørring som passer ditt behov.

Forskjeller og likheter

FSWS-Studinfo2 tilbyr ti separate GET-tjenester (emne, eksamen, kurs, undervisning, studieprogram, studieretning, sted, kode, fagperson, utveksling), hver med sin egen URL og eget XML-svar. FS GraphQL API samler alt dette bak ett endepunkt: du velger selv hvilke data du vil ha, og kan hente flere av tjenestene over i én spørring ved å følge relasjoner (nøstede spørringer) i stedet for å gjøre ti separate kall.

I tillegg til de ti leseoperasjonene har Studinfo2 to skriveoperasjoner, Emne/Info og Studieprogram/Info, som oppdaterer infotekster — se Skrive infotekster.

Sted-parametrene har som regel ingen direkte parallell. De fleste Studinfo2-tjenestene tar institusjonsnr, faknr, instituttnr og gruppenr, og har typisk to varianter: én enkeltforekomst og «alle ved Sted». I FS GraphQL API angir du alltid eierOrganisasjonskode (institusjonsnummeret), mens avgrensning til fakultet eller institutt gjøres med egne filterfelt der de finnes — fakulteter og instituttkodeorganisasjonsenheter (begge experimental). For emnerV2 finnes i tillegg underOrganisasjonsenhet (experimental) — merk at den tar en organisasjonsenhet-ID, ikke stedkodenumre, og at underenheter kun inkluderes hvis du eksplisitt setter inkluderUnderenheter: true (standardverdi false). Filteret gjelder kun administrativt ansvarlig enhet; for studieansvarlig enhet finnes organisasjonenheterMedStudieansvar. Flere spørringer har ikke noe sted-filter i dag; da må du hente organisasjonsenhetene først og filtrere på ID-ene du får.

«kanPubliseres» er et navn, ikke ett begrep. Denne guiden bruker kanPubliseres i flere seksjoner, men navnet dekker minst fire forskjellige kolonner avhengig av hvilken entitet det står på — emnets/studieprogrammets InfoTermin-publisering, en vurderingsenhets publiseringsstatus, en undervisningsaktivitets publiseringsstatus og en studieoppbygningskoblings publiseringsstatus er alle separate, urelaterte innstillinger i FS. Anta aldri at kanPubliseres på ett sted sier noe om et annet.

Språk velges ikke lenger i forespørselen. Studinfo2 tok sprak=B|N|E og returnerte ett språk per kall. FS GraphQL API returnerer i stedet et navnAlleSprak-objekt der du selv velger hvilke språk du vil ha med: navnAlleSprak { nb nn en } (bokmål, nynorsk, engelsk). Er en oversettelse ikke registrert, er feltet null — Studinfo2 falt i praksis tilbake til bokmål. Unntak: Utvekslingsavtale har bare ett navnefelt, und, se Hent utvekslingsavtaler. Merk at dette kun gjelder navn — enkelte filtre (som sprak i Infotekster) bruker fortsatt et kodeverk, men et annet enn Studinfo2 sitt.

Oversikt over Studinfo2-tjenester og GraphQL-erstatning

Oversikt over Studinfo2-tjenester og deres GraphQL-erstatning
Studinfo2-tjenesteGammelt kall (eksempel)GraphQL-erstatning
emneGET /fsrest/rest/studinfo/emne?institusjonsnr=1234&faknr=-1&instituttnr=-1&gruppenr=-1&arstall=2026&terminkode=HØST&sprak=BemnerV2 / publiseringsklareEmner
eksamenGET /fsrest/rest/studinfo/eksamen?institusjonsnr=1234&faknr=-1&instituttnr=-1&gruppenr=-1&arstall=2026&terminkode=HØST&sprak=Bvurderingsenheter
kursGET /fsrest/rest/studinfo/kurs?institusjonsnr=1234&faknr=-1&instituttnr=-1&gruppenr=-1evuKurs
undervisningGET /fsrest/rest/studinfo/undervisning?institusjonsnr=1234&emnekode=INF1000&arstall=2026&terminkode=HØSTundervisningsenheter / undervisningsaktiviteter
studieprogramGET /fsrest/rest/studinfo/studieprogram?institusjonsnr=1234&arstall=2026&terminkode=HØST&medUPinfo=1studieprogramV2 / studieoppbygninger
studieretningGET /fsrest/rest/studinfo/studieretning?institusjonsnr=1234&faknr=-1&instituttnr=-1&gruppenr=-1studieretninger
stedGET /fsrest/rest/studinfo/sted?institusjonsnr=1234&faknr=-1&instituttnr=-1&gruppenr=-1organisasjonsenheter
kodeGET /fsrest/rest/studinfo/kode?arstall=2026&terminkode=HØSTfag / studieretninger / tekstkategorier
fagpersonGET /fsrest/rest/studinfo/fagperson?institusjonsnr=1234&faknr=-1&instituttnr=-1&gruppenr=-1fagpersoner
utvekslingGET /fsrest/rest/studinfo/utveksling?institusjonsnr=1234&faknr=-1&instituttnr=-1&gruppenr=-1utvekslingsavtaler
Emne/Info, Emne/InfoTermin, Studieprogram/Info, Studieprogram/InfoTerminGET/POST /fsrest/rest/studinfo/emne/info, .../studieprogram/infoLese infotekster / Skrive infotekster

Før du starter

Sett deg inn i disse tingene før du går videre:

Kontraktsnivå i eksemplene

Hver seksjon under er merket med kontraktsnivå. stable virker uten videre. experimental krever headeren Feature-Flags: experimental, og experimental-felt kan endres eller forsvinne uten varsel — ikke bygg produksjonsintegrasjoner på dem. Ingen av eksemplene i denne guiden bruker beta-felt, så du trenger ikke beta i headeren noe sted.

Disse Studinfo2-tjenestene har foreløpig kun et eksperimentelt motstykke: eksamen (vurderingsenheter), studieretning (studieretninger), utveksling (utvekslingsavtaler), alle fire kodetabellene under kode (fag, studieretninger, tekstkategorier, nusklassifikasjoner) og begge skriveoperasjonene. Trenger du en av dem i en produksjonsintegrasjon, ta kontakt med fs-support@sikt.no og be om at den løftes til beta eller stable.

Institusjonsnummer i eksemplene

De fleste eksemplene under bruker eierOrganisasjonskode: "1234". Bytt ut «1234» med institusjonsnummeret til ditt lærested.

Unntak: emnerGittEmnekoder og filtrene til publiseringsklareEmner/publiseringsklareStudieprogram bruker i stedet eierInstitusjonsnummer. Verdien er den samme — institusjonsnummeret — bare navnet er forskjellig.

Tilgang (RAS): hvilke roller trenger du?

FS GraphQL API styrer tilgang med Oracle RAS (se Tilgangsstyring med RAS). Studinfo2 hadde ingen tilsvarende oppdeling — der ga én tilgang hele uttrekket.

De fleste Studinfo2-tjenestene krever ingen egen rolle: dataene ligger bak STUDIEELEMENTER_LES1, som alle brukere får automatisk. Noen unntak krever at du ber om noe ekstra:

Roller per Studinfo2-tjeneste
Studinfo2-tjenesteRolleMerknad
emne, kurs, studieprogram, studieretning, sted, kode, utvekslingSTUDIEELEMENTER_LES1Automatisk for alle
undervisning — undervisningsenheterSTUDIEELEMENTER_LES1Automatisk for alle
undervisning — undervisningsaktiviteterSTUDIEELEMENTER_LES2Egen rolle, ikke automatisk
eksamen — eksamensdatoerSE_TENTATIVE_DATOERSe advarselen under eksamen
undervisning — frist-/oppmeldingsdatoer på undervisningsenhetenSE_TENTATIVE_DATOERSe advarselen under undervisning
fagpersonFAGPERSONDATA_LES1Egen rolle
Skriveoperasjoner (infotekster)STUDIEELEMENTER_BESKRIVELSE_SKRIV1Egen rolle

⚠ For lesing: manglende rolle gir tomt svar, ikke feilmelding. Dette er den viktigste forskjellen fra Studinfo2. Uten FAGPERSONDATA_LES1 returnerer fagpersoner null rader — spørringen er gyldig, HTTP-statusen er 200, errors er tom. Uten SE_TENTATIVE_DATOER får du vurderingsenhetene, men alle eksamensdatoer er null. Får du uventet tomme resultater eller tomme datofelt, sjekk rollene dine før du feilsøker spørringen.

For skriving er det annerledes — se advarselen under Skrive infotekster.

FAGPERSONDATA_LES1 maskerer dessuten fødselsnummer. fagpersonerGittFodselsnumre krever derfor utvidet tilgang — kontakt fs-support@sikt.no.

SE_TENTATIVE_DATOER er ikke en egen rad i rolleoversikten på RAS-siden — den er dokumentert i tilgangskontrolloggen sammen med hvilke datofelt den styrer.

Mangler du en rolle, kontakt fs-support@sikt.no.

IDer: er de samme som i FSWS-Studinfo2?

Nei. FSWS-Studinfo2 identifiserer rader med sammensatte nøkler fra Oracle-kolonner (institusjonsnr+emnekode+versjonskode for et emne, fødselsdato+personnr for en person). FS GraphQL API bruker i stedet én ID-verdi per objekt.

Behandle disse ID-ene som ugjennomsiktige. Du kan riktignok base64-dekode dem, men innholdet og formatet er en intern implementasjonsdetalj som kan endres uten varsel — ikke konstruer dem selv, og ikke parse dem for å hente ut de gamle nøklene. Bruk dem kun slik du fikk dem.

Har du en gammel nøkkel og trenger tilsvarende GraphQL-ID, bruker du en oppslagsspørring:

Oppslagsspørringer for gamle nøkler
Gammel nøkkelOppslagsspørringKontraktsnivå
emnekode + versjonskodeemnerGittEmnekoderstable
studieprogramkodestudieprogramGittStudieprogramkoderV2stable
studieretningkodestudieretningerGittStudieretningskoderstable
stedkode (institusjonsnr+faknr+instituttnr+gruppenr)organisasjonsenheterGittOrganisasjonsenhetskoderstable
årstall + terminbetegnelseterminerGittTerminkoderstable
fødselsnummer (fagperson)fagpersonerGittFodselsnumreexperimental

studieprogramGittStudieprogramkoder (uten V2) er @deprecated, og fjerningsfristen (31. mars 2026) er allerede passert — feltet kan forsvinne når som helst. Bruk alltid V2-varianten.

Hent emner

Kontraktsnivå: stable

emne tilsvarer rot-spørringen emnerV2:

query Emner {
emnerV2(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
navnAlleSprak {
nb
nn
en
}
}
}
}
{
"data": {
"emnerV2": {
"nodes": [
{
"id": "MjA6MTIzNCwxNTAsMUJBLTExMSwx",
"kode": "1BA-111",
"navnAlleSprak": {
"nb": "Bevegelseslære bokmål",
"nn": "Bevegingslære",
"en": "The Science of Movement"
}
}
]
}
}
}

Filtrering: Bruk introspeksjon for å se alle filterfeltene på emnerV2. For direkte oppslag på emnekode finnes emnerGittEmnekoder (stable).

emnerV2 gir deg alle emner — Studinfo2 sitt emne-uttrekk var allerede avgrenset til emner som var klarert for intern publisering i den angitte terminen. Skal du gjenskape den avgrensningen, bruk publiseringsklareEmner (stable) — dette er samme rot-spørring CDM-uttrekket bygger på. Merk at spørringen ikke gjør avgrensningen av seg selv: uten filter får du alle emner som har en InfoTermin-rad, uansett publiseringsstatus. Du må be om det eksplisitt:

query PubliseringsklareEmner {
publiseringsklareEmner(
filter: { eierInstitusjonsnummer: "1234", kanPubliseres: true }
first: 10
) { nodes { emne { kode versjonskode } } }
}

kanPubliseres tilsvarer «Publisér Internt» i FS-klienten. Vil du i stedet gjenskape Emne/InfoTermin sin bredere «intern eller ekstern»-regel, må du i tillegg sjekke kanPubliseresTilEksterneRegistre (experimental) og ta med raden hvis minst ett av de to feltene er sant — det lar seg ikke uttrykke i ett enkelt filter.

Studinfo2 sitt emne-uttrekk er det mest komplekse av de ti — det inkluderer blant annet forkunnskapskrav, hjelpemidler til vurdering, timetallsopplysninger og vekting. vekting og forkunnskapskrav-feltene er stable, nøstet direkte på Emne. Hjelpemidler ligger på Vurderingsoppbygningsdel.hjelpemidler (experimental). Se etter dem med introspeksjon, og ta kontakt med fs-support@sikt.no om du ikke finner igjen et konkret felt du er avhengig av.

Infotekster (Studinfo2 sine Emne/Info- og Emne/InfoTermin-underuttrekk) dekkes ikke av emnerV2/publiseringsklareEmner alene — se egen seksjon: Lese infotekster (/Info og /InfoTermin).

Spør du på et helt studieår (terminkode=STÅR i Studinfo2 — en parameterverdi, ikke en emnetype), brukte Studinfo2 VÅR-terminens InfoTermin og ga én rad. publiseringsklareEmner gir én node per termin — dedupliser på emnekode i klienten hvis du filtrerer på flere terminer samtidig.

Hent eksamensinformasjon

Kontraktsnivå: experimental

Studinfo2 sin eksamen-tjeneste beskriver vurderingsavvikling (når og hvordan en eksamen gjennomføres) — ikke selve resultatet. Dette tilsvarer rot-spørringen vurderingsenheter:

query Vurderingsenheter {
vurderingsenheter(
filter: {
eierOrganisasjonskode: "1234"
emner: ["<emneId>"]
}
first: 10
) {
nodes {
id
vurderingsavviklingstype {
kode
}
kanPubliseres
vurderingsvarighet {
beregnetStartTidspunkt
beregnetSluttTidspunkt
startklokkeslett
}
emne {
kode
versjonskode
}
}
}
}
{
"data": {
"vurderingsenheter": {
"nodes": [
{
"id": "MTM5OjEyMzQsUywxNTAsMUJBLTExMSwxLDIwMDYsMTI",
"vurderingsavviklingstype": { "kode": "ORD" },
"kanPubliseres": true,
"vurderingsvarighet": {
"beregnetStartTidspunkt": null,
"beregnetSluttTidspunkt": null,
"startklokkeslett": null
},
"emne": { "kode": "1BA-111", "versjonskode": "1" }
}
]
}
}
}

De tre datofeltene er null her fordi spørringen ble kjørt uten SE_TENTATIVE_DATOER — se punkt 3 under.

Skal du i stedet hente eksamensresultater (karakterer), se resultater under Fra FSWS-CRUD til FS GraphQL API — SELECTMANY Studentvurdkombprotokoll — samme rot-spørring dekker begge behov.

Filtrering: vurderingsenheter støtter terminer, emner, vurderingsoppbygningsdeler, vurderingsperioder og reelleVurderingsperioder.

Tre forskjeller fra Studinfo2 sitt eksamen-uttrekk:

  1. Studinfo2 returnerte kun vurderingsenheter merket klare for publisering. Det finnes ikke noe tilsvarende filter her — du får alle, og må filtrere klientside på feltet kanPubliseres.
  2. Studinfo2 filtrerte i tillegg på om vurderingsordningen var satt («gir treff kun der feltet er blankt hvis det ikke finnes med feltet satt»). Det finnes ikke noe motstykke til dette filteret i dag.
  3. Eksamensdatoene krever RAS-rollen SE_TENTATIVE_DATOER. Uten den er beregnetStartTidspunkt, beregnetSluttTidspunkt og de øvrige datofeltene alle null, uten feilmelding. Se Tilgang (RAS).

Hent EVU-kurs

Kontraktsnivå: stable

Studinfo2 sin kurs-tjeneste dekker etter- og videreutdanningskurs (EVU-kurs), og tilsvarer rot-spørringen evuKurs:

query EvuKurs {
evuKurs(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
erAktiv
navnAlleSprak {
nb
}
kursperiode {
fraDato
tilDato
}
administrativtAnsvarligOrganisasjonsEnhet {
navnAlleSprak {
nb
}
}
}
}
}
{
"data": {
"evuKurs": {
"nodes": [
{
"id": "Mjg6MTIzNCwwMDAwMCwyMDE5",
"kode": "00000",
"erAktiv": true,
"navnAlleSprak": { "nb": "Språkutvikling og lek" },
"kursperiode": { "fraDato": "2029-01-01", "tilDato": "2030-12-21" },
"administrativtAnsvarligOrganisasjonsEnhet": {
"navnAlleSprak": { "nb": "Universitetet i Oslo" }
}
}
]
}
}
}

Filtrering: For direkte oppslag på kurskode finnes evuKursGittEvuKurskoder (experimental).

To forskjeller fra Studinfo2 sitt kurs-uttrekk. Studinfo2 returnerte kun aktive kurs som dessuten var innenfor sin publiseringsperiode. evuKurs har ingen slike standardverdier — du får alle kurs. Filteret erAktiv finnes, men er beta (krever Feature-Flags: beta); alternativt kan du filtrere klientside på utdatafeltet erAktiv, som er stable. Publiseringsperioden har ingen tilsvarende filter i dag.

Hent undervisning

Kontraktsnivå: stable

Studinfo2 sin undervisning-tjeneste tilsvarer to rot-spørringer i FS GraphQL API: undervisningsenheter (undervisning på et emne i en termin) og undervisningsaktiviteter (de enkelte forelesningene/øvingene/kollokviene under en undervisningsenhet):

query Undervisningsenheter {
undervisningsenheter(
filter: {
eierOrganisasjonskode: "1234"
terminer: ["<terminId>"]
}
first: 10
) {
nodes {
id
emne {
kode
versjonskode
}
}
}
}
{
"data": {
"undervisningsenheter": {
"nodes": [
{
"id": "MTIxOjEyMzQsMTUwLDFCQS0xMTEsMSwyMDA2LEjDmFNULDE",
"emne": { "kode": "1BA-111", "versjonskode": "1" }
}
]
}
}
}
query Undervisningsaktiviteter {
undervisningsaktiviteter(
filter: {
eierOrganisasjonskode: "1234"
undervisningsenheter: ["<undervisningsenhetId>"]
}
first: 10
) {
nodes {
id
kode
timerPerUke
}
}
}
{
"data": {
"undervisningsaktiviteter": {
"nodes": [
{
"id": "MTIwOjEyMzQsMTUwLDFCQS0xMTMsMSwyMDA2LEjDmFNULDEsMA",
"kode": "0",
"timerPerUke": null
}
]
}
}
}

Filtrering: undervisningsenheter støtter blant annet terminer, terminnumre, emner, harLedigPlass og tilbysSomEnkeltemne. undervisningsaktiviteter filtrerer på undervisningsenheter, og har i tillegg terminer, emner, terminnumre, terminkoder og freeText (alle experimental).

Studinfo2 returnerte kun undervisningsaktiviteter merket «Publiseres». Det finnes ikke noe tilsvarende filter, og utdatafeltet kanPubliseresUndervisningsaktivitet er experimental — du trenger Feature-Flags: experimental for å filtrere klientside på det, selv om resten av denne seksjonen er stable.

⚠ Fristdatoene på undervisningsenheten er beskyttet av samme RAS-rolle som eksamensdatoer, og rollen påvirker også filtrering — ikke bare utdata. SE_TENTATIVE_DATOER skjuler oppmeldings- og ettermeldingsfristene på undervisningsenheter på samme måte som eksamensdatoer. Uten rollen er oppmeldingsperiode.fraTidspunkt, oppmeldingsperiode.tilDato og startForEnkeltemneopptak alle nullog filtrene undervisningsmeldingsfristErUtgatt/etteranmeldingsfristErUtgatt bygger på de samme, nå usynlige kolonnene: satt til true gir null treff uten rollen, satt til false slipper gjennom alt. Dette er bekreftet, ikke en antakelse.

Slik gjenskaper du Studinfo2 sin «und.enh. (3) Ledig kapasitet»-variant

Krever SE_TENTATIVE_DATOER (se over) — uten den gir spørringen under null rader.

query LedigKapasitet {
undervisningsenheter(
filter: {
eierOrganisasjonskode: "1234"
harLedigPlass: true
undervisningsmeldingsfristErUtgatt: true # oppmeldingsfrist i fortid
etteranmeldingsfristErUtgatt: false # ettermeldingsfrist i fremtid
}
first: 10
) {
nodes {
id
emne {
kode
etteranmeldingsform
studieniva {
kode
}
}
}
}
}
{
"data": {
"undervisningsenheter": {
"nodes": [
{
"id": "MTIxOjEyMzQsMTUwLDFCQS0xMTMsMSwyMDA2LEjDmFNULDE",
"emne": {
"kode": "1BA-113",
"etteranmeldingsform": null,
"studieniva": { "kode": "100" }
}
}
]
}
}
}

Studinfo2-varianten tok i tillegg to betingelser som ikke har filter-motstykke i dag:

  • Etteranmelding DIREKTE — behold kun rader der emne.etteranmeldingsform (stable, enum-verdiene er DIREKTE, MANUELL og SOKNAD) er DIREKTE, klientside.
  • Et studienivå-intervall (fraStudieNiva/tilStudieNiva) — behold kun rader innenfor ønsket intervall basert på emne.studieniva.kode, klientside. undervisningsenheter har ikke noe server-side filter for dette i dag.

⚠ To kjente avvik i harLedigPlass selv, uavhengig av RAS:

  1. Filteret sammenligner kapasitet mot antall studenter som er tatt opp til undervisningen (Opptatt = J), ikke antall oppmeldte. Før undervisningsopptaket er kjørt for terminen, kan et emne dermed vises som ledig selv om det i praksis er fulltegnet.
  2. Er kapasitet ikke satt i det hele tatt, regnes enheten som å ha ledig plass.

Bygger du en produksjonsintegrasjon som erstatter «Ledig kapasitet», verifiser begge punktene mot ditt eget datasett først. harLedigPlassPaUndervisningsaktivitet gir fortsatt undervisningsenheter, bare avgrenset til enheter som har minst én undervisningsaktivitet med ledig plass — det gir ikke aktiviteter i retur, til tross for navnet.

Hent studieprogram

Kontraktsnivå: stable

studieprogram tilsvarer rot-spørringen studieprogramV2. Merk at filteret har en skjult standardverdi erAktiv: [Boolean!] = [true] — du får altså kun aktive studieprogrammer med mindre du eksplisitt ber om noe annet:

query Studieprogrammer {
studieprogramV2(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
navnAlleSprak {
nb
nn
en
}
}
}
}
{
"data": {
"studieprogramV2": {
"nodes": [
{
"id": "MTA2OjEyMzQsMktSTEIy",
"kode": "2KRLB2",
"navnAlleSprak": {
"nb": "KRISTENDOMS- RELIGIONS- OG LIVSSYNSKUNNSKAP",
"nn": null,
"en": null
}
}
]
}
}
}

Filtrering: For direkte oppslag på studieprogramkode finnes studieprogramGittStudieprogramkoderV2 (stable).

studieprogramV2 gir deg alle studieprogrammer — vil du gjenskape Studinfo2 sitt publiseringsfilter, bruk publiseringsklareStudieprogram (stable, samme rot-spørring CDM-uttrekket bygger på) med filteret kanPubliseres: true — spørringen filtrerer ikke på dette automatisk, se tilsvarende forklaring under Hent emner.

Utdanningsplan/studieoppbygning (Studinfo2 sitt studieprogram-uttrekk med parameteren medUPinfo=1) hentes ikke fra studieprogramV2, men fra en egen rot-spørring studieoppbygninger (stable), filtrert på kull: {arstall, betegnelse, studieprogramkode}. For å bygge hele hierarkiet må du hente både toppStudieoppbygningsdel (rotnoden) og alleOppbygningskoblinger (kantene mellom nodene) — henter du kun koblingene, har du kanter uten noe å feste dem i. Legg også merke til at alleOppbygningskoblinger(first: Int = 10) har standardverdi 10, som stille kutter en hel utdanningsplan hvis du ikke selv setter first høyere.

Studinfo2 hadde et eget publiseringsfilter for utdanningsplanen (koblingen mellom studieprogram og emnekombinasjon). Motstykket er studieoppbygninger(filter: { kanPubliseres: true, ... }) (stable) — samme mønster som kanPubliseres ellers i denne guiden, men enda en egen kolonne bak navnet.

kull: {arstall, betegnelse} må oppgis sammen — betegnelse alene gir alltid tomt resultat, uten feilmelding.

Infotekstene fra /Info- og /InfoTermin-underuttrekkene er noe annet enn utdanningsplanen — se Lese infotekster (/Info og /InfoTermin).

Hent studieretninger

Kontraktsnivå: experimental

studieretning tilsvarer rot-spørringen studieretninger:

query Studieretninger {
studieretninger(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
tilbys
navnAlleSprak {
nb
}
}
}
}
{
"data": {
"studieretninger": {
"nodes": [
{
"id": "MTEwOjEyMzQsQUw",
"kode": "AL",
"tilbys": true,
"navnAlleSprak": { "nb": "Almenlærer" }
},
{
"id": "MTEwOjEyMzQsQUxS",
"kode": "ALR",
"tilbys": true,
"navnAlleSprak": { "nb": "Almenlærer - realfag" }
}
]
}
}
}

Filtrering: studieretninger filtrerer i dag kun på eierOrganisasjonskode — det finnes ingen aktiv-/sted-filtrering slik Studinfo2 hadde. Bruk feltet tilbys for å filtrere klientside på aktive studieretninger. For direkte oppslag på studieretningskode finnes studieretningerGittStudieretningskoder (stable).

Koblingen mellom studieprogram og studieretning (som Studinfo2 også leverte) hentes med den separate rot-spørringen studieprogramStudieretninger (experimental). Studinfo2 hadde et eget aktiv-filter for selve koblingen, i tillegg til aktiv-filteret på studieretningen — sjekk om studieprogramStudieretninger dekker begge deler før du legger dette i produksjon.

Hent organisasjonsenheter (sted)

Kontraktsnivå: stable

Studinfo2 sin sted-tjeneste tilsvarer «Organisasjonsenhet» i FS GraphQL API — begrepet dekker institusjon, fakultet, institutt og gruppe i samme hierarki. Rot-spørringen er organisasjonsenheter:

query Organisasjonsenheter {
organisasjonsenheter(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
navnAlleSprak {
nb
}
parent {
id
}
}
}
}
{
"data": {
"organisasjonsenheter": {
"nodes": [
{
"id": "Nzk6MTIzNCwxNTAsMCwwLDA",
"navnAlleSprak": { "nb": "Norges idrettshøgskole" },
"parent": null
},
{
"id": "Nzk6MTIzNCwxNzgsMSwwLDA",
"navnAlleSprak": { "nb": "Norges musikkhøgskole" },
"parent": { "id": "Nzk6MTIzNCwxNzgsMCwwLDA" }
}
]
}
}
}

Filtrering: organisasjonsenheter har en skjult standardverdi erAktiv: [Boolean!] = [true] — du får altså kun aktive organisasjonsenheter med mindre du eksplisitt ber om noe annet. For direkte oppslag på den sammensatte stedkoden (institusjonsnr+fakultetsnr+instituttnr+gruppenr) finnes organisasjonsenheterGittOrganisasjonsenhetskoder (stable).

erAktiv er «aktiv nå», ikke «aktiv i den angitte terminen». Studinfo2 filtrerte mot den angitte årstermin, ikke mot dagens dato. Skal du gjenskape historisk aktiv-status for en gitt termin, er ikke erAktiv nødvendigvis riktig verktøy — verifiser mot ditt eget behov.

Hent kodetabeller (kode)

Kontraktsnivå: hovedsakelig experimental — se tabellen under

FSWS-Studinfo2 sin kode-tjeneste er et enkelt oppslag i fire kodetabeller: Fag, Studieretning, Infotype og NUS_Enkeltutdanning (Infotype dekker samtidig underuttrekket Kode/InfoTyper, som brukes til Emne/Info og Studieprogram/Info). FS GraphQL API har ikke noe tilsvarende generisk kodeoppslag — hver kodetype eksponeres i stedet som sin egen rot-spørring, nær det feltet den brukes på. Du må altså erstatte ett Studinfo2-kall med flere GraphQL-spørringer:

query FagOgTekstkategorier {
fag(filter: { eierOrganisasjonskode: "1234" }, first: 10) {
nodes {
id
kode
navnAlleSprak {
nb
}
}
}
tekstkategorier(filter: { eierOrganisasjonskode: "1234" }, first: 10) {
nodes {
id
kode
}
}
}
{
"data": {
"fag": {
"nodes": [
{
"id": "MzA6MTIzNCww",
"kode": "0",
"navnAlleSprak": { "nb": "HUMANIORA (010-199)" }
}
]
},
"tekstkategorier": {
"nodes": [
{ "id": "NDU6MTIzNCxFLUVLU0JFU0tS", "kode": "E-EKSBESKR" },
{ "id": "NDU6MTIzNCxFLUVNTkVOSVbDhQ", "kode": "E-EMNENIVÅ" }
]
}
}
}
Kodetabeller fra Studinfo2 og deres GraphQL-motstykke
Studinfo2 kode-uttrekkRot-spørring i FS GraphQL APIKontraktsnivå
Fagfagexperimental
Studieretningstudieretninger (liste) eller studieretningerGittStudieretningskoder (oppslag)experimental / stable
Infotype (Kode/InfoTyper)tekstkategorierexperimental
NUS_Enkeltutdanningnusklassifikasjoner (i fskode-subgrafen, samme supergraf)experimental

NUS-koder krever trolig mer enn STUDIEELEMENTER_LES1. I motsetning til de tre andre kodetabellene har ikke NUS-kodeverket noen grant til STUDIEELEMENTER_LES1 i dagens tilgangsoppsett — kontakt fs-support@sikt.no hvis nusklassifikasjoner eller det nøstede nusklassifikasjon-feltet (se under) gir tomt/null resultat for deg. Merk også at det nøstede feltet Emne.nusklassifikasjon/Studieprogram.nusklassifikasjon kun gir koden for det konkrete emnet/programmet (SIS sin del av en federert type) — det er ikke det samme som å slå opp kodeverket. Skal du enumerere alle gyldige NUS-koder med navn, bruk nusklassifikasjoner.

Trenger du en kodetabell som ikke står her, kontakt fs-support@sikt.no og oppgi hvilken kodetabell fra Studinfo2 det gjelder.

Hent fagpersoner

Kontraktsnivå: stable

fagperson tilsvarer rot-spørringen fagpersoner:

query Fagpersoner {
fagpersoner(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
navn {
fornavn
etternavn
}
erAktiv
ansattVed {
navnAlleSprak {
nb
}
}
}
}
}
{
"data": {
"fagpersoner": {
"nodes": [
{
"id": "MzE6MTIzNCw4ODM",
"navn": { "fornavn": "Njål", "etternavn": "Øye" },
"erAktiv": true,
"ansattVed": { "navnAlleSprak": { "nb": "Det medisinske fakultet, UiB" } }
},
{
"id": "MzE6MTIzNCw4ODQ",
"navn": { "fornavn": "Kristian", "etternavn": "Vennemo" },
"erAktiv": true,
"ansattVed": { "navnAlleSprak": { "nb": "Det medisinske fakultet, UiB" } }
},
{
"id": "MzE6MTIzNCw4ODU",
"navn": { "fornavn": "Monica Blide", "etternavn": "Blidensol" },
"erAktiv": true,
"ansattVed": { "navnAlleSprak": { "nb": "Det medisinske fakultet, UiB" } }
}
]
}
}
}

Filtrering: fagpersoner støtter filtrering på erAktiv, erIPermisjon, campuser, fagpersonkategorier, inkluderAvdode og fodselsnumre. For direkte oppslag kan du bruke fagpersonerGittFodselsnumre eller fagpersonerGittPersonlopenumre (begge experimental).

Bruk navn direkte på fagpersonen, ikke personProfil.navn. FAGPERSONDATA_LES1 gir tilgang til grunnleggende fagpersonopplysninger, men ikke nødvendigvis til hele PersonProfil (som ligger bak andre roller). navn (stable) ligger direkte på FagpersonVedLarested og krever ikke mer enn den samme rollen resten av seksjonen bruker.

Tre stille standardverdier i filteret. Uten at du oppgir noe, utelater fagpersoner fagpersoner som er inaktive (erAktiv: [true]) og i permisjon (erIPermisjon: [false]). Studinfo2 hadde ingen tilsvarende permisjonsavgrensning — oppgi erIPermisjon: [true, false] hvis du trenger samme resultatsett. Merk at erAktiv og erIPermisjon er lister, ikke enkeltverdier.

Filteret har i tillegg inkluderAvdode: false som standardverdi, men vi har ikke fått bekreftet at denne avgrensningen faktisk virker for alle roller/tilgangsoppsett — verifiser mot ditt eget datasett om du er avhengig av at avdøde faktisk utelates.

Publiseringsfilteret er borte. Studinfo2 returnerte kun fagpersoner merket «Publiseres». fagpersoner har verken et tilsvarende filter eller et tilsvarende utdatafelt — du får alle aktive fagpersoner. Trenger du avgrensningen, kontakt fs-support@sikt.no.

Oppslag på Feide-brukernavn finnes ikke som filter. Studinfo2 støttet brukernavn som alternativ til fødselsnummer. personProfil.feideBruker finnes som utdatafelt (feltet feideBruker direkte på fagpersonen er @deprecated og fjernes etter 31.03.2027), men det er ikke noe tilsvarende filterfelt i dag. Kontakt fs-support@sikt.no hvis du trenger det.

Hent utvekslingsavtaler

Kontraktsnivå: experimental

Studinfo2 sin utveksling-tjeneste henter informasjon om utvekslingsavtaler — ikke studenters utvekslingsopphold eller forhåndsgodkjenninger. Den tilsvarer rot-spørringen utvekslingsavtaler:

query Utvekslingsavtaler {
utvekslingsavtaler(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
avtaleId
navnAlleSprak {
und
}
publiser
gyldighetsperiode {
fraDato
tilDato
}
}
}
}
{
"data": {
"utvekslingsavtaler": {
"nodes": [
{
"id": "MTMyOjEyMzQsMTAz",
"avtaleId": "103",
"navnAlleSprak": { "und": "Utvekslingsavtale informatikk" },
"publiser": true,
"gyldighetsperiode": { "fraDato": "2006-01-01", "tilDato": null }
}
]
}
}
}

Filtrering: utvekslingsavtaler støtter aktiv (standardverdi [true] — du får altså kun aktive avtaler med mindre du eksplisitt ber om noe annet).

Én semantisk forskjell: Studinfo2 returnerte kun avtaler merket for publisering. Det finnes ikke noe tilsvarende filter i utvekslingsavtaler-spørringen, men typen har feltet publiser — filtrer klientside på det for samme resultat som Studinfo2 ga.

Navnet er ikke oppdelt på språk. I motsetning til de fleste andre typene i denne guiden har Utvekslingsavtale bare ett navnefelt, navnAlleSprak.und («udefinert språk») — ikke nb/nn/en.

Lese infotekster (/Info og /InfoTermin)

Kontraktsnivå: stable for emne. For studieprogram er selve filterargumentet på beskrivelsesavsnitt experimental — feltet er stable, men du trenger Feature-Flags: experimental for å filtrere det.

Studinfo2 leverte infotekster som egne underuttrekk: Emne/Info, Studieprogram/Info (selve tekstene) og Emne/InfoTermin, Studieprogram/InfoTermin (hvilke terminer tekstene er klarert for). I FS GraphQL API er begge deler nøstet under publiseringsklareEmner og publiseringsklareStudieprogram — én node per emne/studieprogram per termin, med tekstene under beskrivelsesavsnitt:

query Emneinfotekster {
publiseringsklareEmner(
filter: { eierInstitusjonsnummer: "1234", kanPubliseres: true }
first: 10
) {
nodes {
termin {
arstall
}
emne {
kode
versjonskode
}
beskrivelsesavsnitt(filter: {
tekstkategorikoder: ["INNHOLD"]
sprak: "NOB"
}) {
innhold
originalinnhold
tekstkategori {
kode
}
}
}
}
}

tekstkategorikoder tilsvarer Studinfo2 sin infotypekode — bruk rot-spørringen tekstkategorier (experimental) for å utforske gyldige koder. innhold tilsvarer Studinfo2 sin InfoTekst (uten formatering); originalinnhold tilsvarer InfoTekst_Original, som Studinfo2 sin originalinfo-parameter styrte.

{
"data": {
"publiseringsklareEmner": {
"nodes": [
{
"termin": { "arstall": 2007 },
"emne": { "kode": "AD02A", "versjonskode": "1" },
"beskrivelsesavsnitt": [
{
"innhold": null,
"originalinnhold": null,
"tekstkategori": { "kode": "INNHOLD" }
}
]
}
]
}
}
}

sprak-filteret bruker et annet kodeverk enn utdataene. Filteret sammenlignes mot ISO 639-2-koder (NOB/NNO/ENG), ikke FS sine egne språkkoder (BOKMÅL/NYNORSK/ENGELSK) som du ellers ser i FS-klienten. sprak: "BOKMÅL" er ugyldig og gir stille tomt resultat, ikke feilmelding. Bruk alltid NOB/NNO/ENG.

Husk kanPubliseres: true her også. Som for emne- og studieprogram-seksjonene filtrerer ikke publiseringsklareEmner automatisk på publiseringsstatus — se forklaringen under Hent emner.

Trenger du tekstene uten publiseringsavgrensningen, ligger de samme avsnittene som beskrivelsesavsnitt direkte på Emne og Studieprogram — men med andre feltnavn og en annen form:

Forskjeller på beskrivelsesavsnitt avhengig av hvor det hentes fra
Under publiseringsklareEmner/-StudieprogramDirekte på Emne/Studieprogram
FormVanlig liste, med filter-argumentPaginert liste (first/nodes), standard first er 10 (emne) / 100 (studieprogram)
Språkfilterspraksprakkode6392
TerminfiltergjelderForTerminergjelderFraTerminer

Sjekk skjemaet med introspeksjon før du gjenbruker et filter fra én variant på den andre — feltnavnene er ikke de samme.

Skrive infotekster (Emne/Info og Studieprogram/Info)

Kontraktsnivå: experimental

Studinfo2 sine to skriveoperasjoner oppdaterer infotekster (beskrivelsesavsnitt) på emner og studieprogrammer. Den generelle HTML-siden for tjenesten beskriver bare GET-grensesnittet — den tekniske PDF-dokumentasjonen dokumenterer i tillegg disse to skriveoperasjonene (POST med JSON-payload), og begge er aktive.

  • Emne/Info tilsvarer mutasjonen angiEmnebeskrivelse
  • Studieprogram/Info tilsvarer mutasjonen angiStudieprogrambeskrivelse

Krever RAS-rollen STUDIEELEMENTER_BESKRIVELSE_SKRIV1 — se Tilgang (RAS).

Studinfo2 identifiserte emnet med institusjonsnr+emnekode+versjonskode. angiEmnebeskrivelse krever i stedet emneId — slå den opp først med emnerGittEmnekoder (se IDer).

Eksempel på å sette en emnebeskrivelse:

mutation AngiEmnebeskrivelse {
angiEmnebeskrivelse(
input: [{
emneId: "<emneId>"
tekstkategoriId: "<tekstkategoriId>"
sprak: NB
termin: { arstall: 2026, termintype: HOST }
tekstTilKonvertering: "Ny beskrivelsestekst"
}]
) {
emnebeskrivelsesavsnitt {
id
innhold
}
errors {
... on Error {
__typename
message
path
}
}
}
}
{
"data": {
"angiEmnebeskrivelse": {
"emnebeskrivelsesavsnitt": [
{
"id": "MjY6MTIzNCwxNTAsMUJBLTExMSwxLEUtRUtTQkVTS1IsQk9LTcOFTCwyMDI2LEjDmFNU",
"innhold": null
}
],
"errors": null
}
}
}

Merk at innhold er null rett etter skriving. Du skrev til tekstTilKonvertering (originalinnhold), men innhold (den formateringsfrie versjonen) fylles ut av en separat, periodisk jobb — ikke synkront av mutasjonen. Skal du lese teksten du nettopp skrev tilbake med det samme, spør heller om originalinnhold.

tekstkategoriId tilsvarer Studinfo2 sin «Tagkode»/infotype — bruk rot-spørringen tekstkategorier (experimental) for å finne riktig ID.

Merk feltet termin. Det er typen FraTerminInput (årstall + terminkode) — semantisk en fra-og-med-termin. Studinfo2 sin arstall/terminkode pekte på én konkret InfoTermin-rad. Vi har ikke verifisert at de to oppfører seg identisk — test mot din egen termin-logikk før du legger dette i produksjon.

Feilhåndtering er annerledes enn i Studinfo2. Studinfo2 svarte med HTTP 500 og en feilbeskrivelse. GraphQL svarer med HTTP 200, og feil kommer i errors-feltet i payloaden (se errors-eksempelet over). I tillegg til generelle valideringsfeil (UgyldigInput) finnes feilen EmnebeskrivelseSperretForOppdatering/StudieprogrambeskrivelseSperretForOppdatering, som gis når beskrivelser er sperret for oppdatering for terminen.

⚠ Manglende STUDIEELEMENTER_BESKRIVELSE_SKRIV1 gir her en databasefeil, ikke et stille tomt svar. Oppdaterer du et avsnitt som allerede finnes, feiler det stille (ingen rader endres, ingen feilmelding) — men skal et nytt avsnitt opprettes, får du en reell feil fra databasen i stedet for en tydelig, dokumentert GraphQL-feil. Sjekk rollen din først hvis du får en uventet, uforklart feil her.

Finner du ikke det du trenger?

Kontakt fs-support@sikt.no. Beskriv gjerne hvilken Studinfo2-tjeneste du erstatter og hvilke felt du er avhengig av — da finner vi raskere ut om funksjonaliteten finnes under et annet navn, om den ligger på et lavere kontraktsnivå, eller om vi må bygge den.