Fra FSWS-Studrapp til FS GraphQL API
⚠ FSWS-Studrapp videreutvikles ikke, og tjenesten er forhåndsvarslet avviklet (31.03.2025). Det er ennå ikke satt noen End of Service-dato for tjenesten som helhet. Bygg nye integrasjoner på FS GraphQL API.
Sju operasjoner har derimot fått End of Service 31.03.2027:
Hent eksamener for en student,GET /aktiveemner,GET /endredeStudenter,GET /studentdata,GET /studieprogram,GET /undervisningogGET /undervisningsaktiviteter. End of Service betyr at Sikt slutter å gi brukerstøtte og rette feil for disse — de kan deretter slås av uten nytt varsel. Prioriter dem først. Operasjonene for Lånekassen og for synkronisering mot timeplansystemet TP har ingen dato ennå.Kilder: avviklingsloggen og Sikts avviklingspraksis.
FSWS-Studrapp er under utfasing, og deler av tjenesten er nå erstattet av FS GraphQL API. Studrapp-tjenesten består av endepunkter som er laget til litt forskjellige formål:
- Studentdata og grunnlagsdata om undervisning og vurdering
- Rapportering av godkjent utenlandsopphold til Lånekassen
- Synkronisering av data mellom FS og timeplanleggingssystemet TP
Listen med eksempler under er ikke komplett. Ta kontakt med fs-support@sikt.no dersom du trenger hjelp til å finne en spørring eller en mutasjon som passer ditt behov.
Før du starter
Disse tingene er like uansett hvilket API du migrerer fra — les dem én gang:
- Tilgang, endepunkt og kontraktsnivå (
Feature-Flags-header): Kom i gang - Paginering: Spørringer
- Feilhåndtering: Mutasjoner
- Autorisasjon (RAS): Tilgangsstyring med RAS
- Bruker du en integrasjonsplattform (Gravitee/IntArk): FS GraphQL API og IntArk
- Utforsk skjemaet selv: Introspeksjon
Kontraktsnivå i eksemplene
Eksempler som krever headeren Feature-Flags: beta,experimental er merket med kontraktsnivå rett over kodeblokken. Er et eksempel ikke merket, ligger alt det bruker på stable og virker uten header. Merk at et stable felt kan returnere en type der enkeltfelt er beta eller experimental — merkingen tar høyde for begge deler. Experimental-felt kan endres eller forsvinne uten varsel; ikke bygg produksjonsintegrasjoner på dem.
Institusjonsnummer i eksemplene
Alle eksemplene under bruker eierOrganisasjonskode: "1234". Bytt ut «1234» med institusjonsnummeret til ditt lærested.
Merk: ett eksempel (emnerGittEmnekoder, brukt til å slå opp emne-ID) bruker i stedet argumentet eierInstitusjonsnummer — feltnavnet varierer per spørring i skjemaet. Ikke en skrivefeil.
IDer: andre enn i Studrapp
FS GraphQL API bruker base64-enkodede sammensatte nøkler som IDer — Studrapp bruker sammensatte nøkler (institusjonsnr, årstall, terminkode, emnekode, versjonskode, terminnr, aktivitetkode, undplanløpenr). De to er ikke kompatible. Alle eksemplene under viser hvordan du finner riktig ID via oppslag før du bruker den i en videre spørring eller mutasjon — se særlig avsnittet "Slå opp IDer" under TP-synkroniseringen for en samlet oversikt.
Tilgang: hvilken RAS-rolle trenger du?
FS GraphQL API styrer tilgang på rad- og kolonnenivå med Oracle RAS. Datasettene i denne guiden krever forskjellige roller — du trenger ikke alle, bare de som dekker det du faktisk henter.
Mangler du en rolle, feiler ikke spørringen. Radene forsvinner, eller enkeltkolonner kommer
tilbake som null, uten varsel eller feilmelding. Får du færre treff enn ventet, eller uventet
mange null-verdier, er manglende rolle det første du bør sjekke.
Grunnlagsdata om undervisning og vurdering
Se Grunnleggende tilgang
for STUDIEELEMENTER_LES1 og STUDIEELEMENTER_LES2.
⚠️ SE_TENTATIVE_DATOER er lett å overse. Eksamensdatoer og -frister settes ofte tentativt i
FS og er skjult bak et eget kolonneprivilegium. Uten rollen kommer resten av vurderingsenheten
normalt tilbake, men disse feltene er alltid null:
vurderingsvarighet.eksamensdatoer.startDato og .sluttDato, vurderingsvarighet.startklokkeslett,
vurderingsvarighet.innleveringsfrist.dato og .klokkeslett, vurderingsvarighet.uttakstidspunkt.dato
og .klokkeslett, trekkfrist, sensurinformasjon.sensurfrist og sensurinformasjon.klagefrist.
Feltet fristOppgavetittel er ikke berørt og virker uten rollen. Full oversikt:
Dato-felter blir skjult for VURDERINGSENHET og UNDERVISNINGSENHET.
Kommer eksamensdatoene dine tilbake som null etter migrering fra studrapp, er dette nesten alltid
årsaken — be om SE_TENTATIVE_DATOER ved bestilling av tilgang.
Studentdata
Se Tilgang til studentdata og Tilgang til fagpersondata for beskrivelser og bestillingsrutine.
Studenthendelser
studenthendelser er delt opp per hendelseskategori — det finnes ingen samlerolle. Mangler du
rollen for en kategori, filtreres de hendelsene bare bort. Eksempelet under «Hent studenter med
endringer siden angitt tid» krever alle tre:
Bruker du andre hendelsestyper, finnes det tilsvarende roller per kategori — se Tilgang til studentdata.
Skriving: synkronisering mot TP
Mutasjonene under «Synkronisering av data mellom FS og timeplanleggingssystemet TP» krever skrivetilgang:
Se Tilgang til undervisning
for UNDERVISNING_SKRIV1. PERSONROLLE_SKRIV1 er ikke listet på RAS-siden ennå — oppgi behovet
«opprette og slette roller på timeplan og undervisningsaktivitet» når du bestiller tilgang.
Skriving oppfører seg litt annerledes enn lesing: et forsøk på å opprette noe du ikke har tilgang
til gir en eksplisitt databasefeil (ORA-28115), mens en oppdatering eller sletting du ikke har
tilgang til stille ender opp med å endre null rader. Kontroller responsen, ikke bare fravær av
feilmelding.
Rapportering til Lånekassen
Dette datasettet er ikke migrert til FS GraphQL API ennå. Tilgang avtales som en del av den løpende dialogen med Lånekassen — se avsnittet lenger ned.
Studentdata og grunnlagsdata om undervisning og vurdering
Disse endepunktene henter data for en bestemt student og/eller en bestemt termin. Det er som regel mulig å konstruere en GraphQL-spørring som gir omtrent samme data, selv om datatastrukturen kan være litt forskjellig. Under gir vi eksempler for hvert enkelt endepunkt. GraphQL gir imidlertid stor fleksibilitet når det gjelder hvordan du henter dataene. Vi anbefaler at du bruker tid på å sette sammen en spørring som passer ditt behov.
For eksempel, for å hente student-ID basert på Feide-brukernavn:
query HentStudentId {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["yngve@spusers.feide.no"]
) {
id
}
}
Eksempel på svar:
{
"data": {
"studenterGittFeideBrukere": [
{
"id": "OTk6MTIzNCw5MDA"
}
]
}
}
Hent data for en student
Dette endepunktet henter grunnleggende informasjon om en student identifisert med brukernavn, inkludert personalia, studieprogram, semesterregistreringer, fakturaer og vurderingsmeldinger.
For å hente samme data via FS GraphQL API kan du bruke spørringen studenterGittFeideBrukere. Du kan legge til eller fjerne nøstede felt etter behov.
query HentStudentdata {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["18628790120@spusers.feide.no"]
) {
studentnummer
personProfil {
navn {
fornavn
etternavn
}
institusjonsEpost
privatEpost
mobilTelefon {
landnummer
nummer
}
fodselsnummer
fodselsdato
postadresse {
gate
postnummerOgSted
}
}
programStudieretter {
nodes {
studieprogram {
kode
}
studentstatus {
kode
}
}
}
semesterregistreringer(
filter: {erSemesterregistrert: true}
) {
nodes {
termin {
betegnelse {
kode
}
arstall
}
erSemesterregistrert
harBetaltSemesteravgiftV2
}
}
fakturaerForInnevarendeTermin {
termin {
betegnelse {
kode
}
arstall
}
betalt
}
vurderingsmeldingerV2 {
nodes {
vurderingsenhet {
emne {
kode
}
vurderingsperiode {
gjelderTermin {
betegnelse {
kode
}
arstall
}
}
}
}
}
}
}
Kontraktsnivå: experimental (fakturaerForInnevarendeTermin), beta (vurderingsmeldingerV2). Send Feature-Flags: beta,experimental.
vurderingsmeldingerV2 erstatter det utgåtte feltet vurderingsmeldinger (fjernes etter 15.04.2026, fristen er passert).
Eksempel på svar:
{
"data": {
"studenterGittFeideBrukere": [
{
"studentnummer": "070056",
"personProfil": {
"navn": {
"fornavn": "Anders",
"etternavn": "Adelsen"
},
"institusjonsEpost": null,
"privatEpost": null,
"mobilTelefon": {
"landnummer": "+46",
"nummer": "703796001"
},
"fodselsnummer": "18628790120",
"fodselsdato": "1987-12-18",
"postadresse": {
"gate": "Forskningsveien 3 B",
"postnummerOgSted": "0260 OSLO"
}
},
"programStudieretter": {
"nodes": [
{
"studieprogram": {
"kode": "AMH-MUS1"
},
"studentstatus": {
"kode": "AKTIV"
}
},
{
"studieprogram": {
"kode": "BA-SVF"
},
"studentstatus": {
"kode": "SLUTTET"
}
}
]
},
"semesterregistreringer": {
"nodes": [
{
"termin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2018
},
"erSemesterregistrert": true,
"harBetaltSemesteravgiftV2": true
},
{
"termin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2019
},
"erSemesterregistrert": true,
"harBetaltSemesteravgiftV2": true
},
{
"termin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2020
},
"erSemesterregistrert": true,
"harBetaltSemesteravgiftV2": false
}
]
},
"fakturaerForInnevarendeTermin": [
{
"termin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2025
},
"betalt": true
},
{
"termin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2025
},
"betalt": false
}
],
"vurderingsmeldingerV2": {
"nodes": [
{
"vurderingsenhet": {
"emne": {
"kode": "AMH-EXFAC"
},
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2019
}
}
}
},
{
"vurderingsenhet": {
"emne": {
"kode": "AMH-EXFAC"
},
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2020
}
}
}
},
{
"vurderingsenhet": {
"emne": {
"kode": "AMH-MUS1006"
},
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "VÅR"
},
"arstall": 2023
}
}
}
}
]
}
}
]
}
}
Hent aktive emner
Dette endepunktet henter emner som har undervisning i en gitt termin.
For å hente samme data via FS GraphQL API kan du bruke spørringen undervisningsterminerForEmner filtrert på termin. Du må først hente termin-ID via terminerGittTerminkoder.
Steg 1: Hent termin-ID
query HentTerminId {
terminerGittTerminkoder(
eierOrganisasjonskode: "1234"
terminkoder: [{
arstall: 2023
betegnelse: "HØST"
}]
) {
id
}
}
Eksempel på svar:
{
"data": {
"terminerGittTerminkoder": [
{
"id": "MTE2OjEyMzQsMjAyMyxIw5hTVA"
}
]
}
}
Steg 2: Hent undervisningsterminer for emner i terminen
query HentAktiveEmner {
undervisningsterminerForEmner(
filter: {
eierOrganisasjonskode: "1234"
emneKanHaUndervisningITerminer: ["MTE2OjEyMzQsMjAxNSxIw5hTVA"]
}
first: 5
) {
nodes {
terminnummer
emne {
kode
versjonskode
navnAlleSprak {
nb
}
studieansvarligOrganisasjonsenhet {
navnAlleSprak {
nb
}
}
}
}
}
}
Eksempel på svar:
{
"data": {
"undervisningsterminerForEmner": {
"nodes": [
{
"terminnummer": 1,
"emne": {
"kode": "1BA-111",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Bevegelseslære bokmål"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 2,
"emne": {
"kode": "1BA-111",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Bevegelseslære bokmål"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 1,
"emne": {
"kode": "1BA-113",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Treningslære"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 1,
"emne": {
"kode": "1BA-121",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Idrett og samfunn"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
},
{
"terminnummer": 1,
"emne": {
"kode": "1BA-135",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Ballspill"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Norges idrettshøgskole"
}
}
}
}
]
}
}
}
Hent emner med eksamen
Dette endepunktet henter emner som har vurderingsenheter (eksamener eller andre vurderinger) i en gitt termin.
For å hente samme data via FS GraphQL API kan du bruke spørringen vurderingsenheter filtrert på termin. Du må først hente termin-ID via terminerGittTerminkoder (se "Hent aktive emner" over for eksempel).
Kontraktsnivå: experimental. Send Feature-Flags: experimental.
Hent vurderingsenheter for terminen
query HentEmnerMedEksamen {
vurderingsenheter(
filter: {
eierOrganisasjonskode: "1234"
terminer: ["MTE2OjEyMzQsMjAyNCxWw4VS"]
}
) {
nodes {
emne {
kode
versjonskode
navnAlleSprak {
nb
}
studieansvarligOrganisasjonsenhet {
navnAlleSprak {
nb
}
}
}
}
}
}
Eksempel på svar:
{
"data": {
"vurderingsenheter": {
"nodes": [
{
"emne": {
"kode": "SEAN1",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Sean1"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Det matematisk-naturvitenskapelige fakultet, UiO"
}
}
}
},
{
"emne": {
"kode": "SEAN2",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Sean2"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Det matematisk-naturvitenskapelige fakultet, UiO"
}
}
}
},
{
"emne": {
"kode": "SEAN2",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Sean2"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "Det matematisk-naturvitenskapelige fakultet, UiO"
}
}
}
},
{
"emne": {
"kode": "VK9C",
"versjonskode": "1",
"navnAlleSprak": {
"nb": "Vk9c"
},
"studieansvarligOrganisasjonsenhet": {
"navnAlleSprak": {
"nb": "FS9"
}
}
}
}
]
}
}
}
Du kan også filtrere på andre kriterier ved å bruke emner, vurderingsoppbygningsdeler, vurderingsperioder eller reelleVurderingsperioder i filteret.
Hent eksamener for en student
REST-endepunktet studrapp/eksamen henter eksamensinformasjon (datoer, frister, varighet, rom etc.) for en student i en gitt termin.
FS GraphQL API tilbyr to tilnærminger for å hente tilsvarende data. Velg den som passer best for ditt behov.
Viktige forskjeller fra studrapp
Datastruktur — flat liste vs. hierarki
REST-endepunktet returnerer data i et hierarki: emne → ordninger → eksamensdeler → deldager.
I GraphQL returneres en flat liste. Feltet vurderingsdeltype på vurderingsenhet klassifiserer hvert element:
vurderingsdeltype | Beskrivelse | Tilsvarer i studrapp |
|---|---|---|
HELHET | Vurderingsordning (helhet) | ordninger[].navn |
DEL | Del av en vurderingsordning | ordninger[].eksamensdeler[].navn |
DELDAG | Dagsdel av en eksamen | ordninger[].eksamensdeler[].deldager[].navn |
Konsumenter som trenger emne-gruppering (slik det gamle endepunktet returnerte) grupperer på emne.kode og vurderingsperiode på klientsiden.
Feltmapping: studrapp → GraphQL
Eksamensinformasjon som lå direkte på eksamensdel-objektet i studrapp finnes nå under vurderingsenhet:
GraphQL tilbyr også beregnetStartTidspunkt og beregnetSluttTidspunkt som ferdigberegnede tidspunkter med tidssone.
Semesterfilter — finne termin-ID
REST-endepunktet tar år og semester som path-parameter. I GraphQL filtrerer du på termin-ID, som du slår opp med terminerGittTerminkoder — se "Hent aktive emner" for spørring og eksempelsvar.
Bruk den returnerte ID-en som verdi i terminer-filteret i eksemplene under. Filteret er valgfritt, men anbefales: filtreringen skjer i databasen, så du unngår å hente og kaste bort data i klienten.
Tilnærming A: vurderingsdata
Feltet vurderingsdata på StudentVedLarested gir mest detaljert eksamensinformasjon, inkludert eksamensrom, alle frister og varighet. Dataene er satt sammen på tvers av student, vurderingsordning og vurderingsenhet, slik at du får alt for én vurderingskombinasjon i ett kall.
Når passer denne tilnærmingen?
- Du trenger detaljert eksamensinformasjon: rom, frister, varighet, uttakstidspunkt
- Du vil ha all informasjon samlet per vurderingskombinasjon
Kontraktsnivå: experimental. Send Feature-Flags: experimental.
query HentEksamenerForStudent {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["11616090366@spusers.feide.no"]
) {
vurderingsdata(
filter: { terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"] }
) {
edges {
node {
vurderingsdeltype
emne {
kode
navnAlleSprak { nb }
}
vurderingsperiode {
arstall
navnAlleSprak { nb }
}
vurderingsenhet {
trekkfrist
fristOppgavetittel
vurderingsvarighet {
eksamensdatoer {
startDato
sluttDato
}
startklokkeslett
innleveringsfrist {
dato
klokkeslett
}
uttakstidspunkt {
dato
klokkeslett
}
beregnetStartTidspunkt
beregnetSluttTidspunkt
}
merknadForStudent { nb }
sensurinformasjon {
sensurfrist
klagefrist
}
}
eksamensavvikling {
rom {
rom {
kode
bygning {
kode
}
}
}
}
}
}
}
}
}
Eksempel på svar:
{
"data": {
"studenterGittFeideBrukere": [
{
"vurderingsdata": {
"edges": [
{
"node": {
"vurderingsdeltype": "HELHET",
"emne": {
"kode": "KRH101",
"navnAlleSprak": {
"nb": "Hagearbeidets klassikere og det florale samfunn"
}
},
"vurderingsperiode": {
"arstall": 2023,
"navnAlleSprak": {
"nb": "2023 HØST"
}
},
"vurderingsenhet": {
"trekkfrist": "2023-09-01T00:00:00.000+02:00",
"fristOppgavetittel": null,
"vurderingsvarighet": {
"eksamensdatoer": {
"startDato": "2023-10-01",
"sluttDato": "2023-10-01"
},
"startklokkeslett": null,
"innleveringsfrist": null,
"uttakstidspunkt": null,
"beregnetStartTidspunkt": "2023-10-01T00:00:00.000+02:00",
"beregnetSluttTidspunkt": null
},
"merknadForStudent": null,
"sensurinformasjon": {
"sensurfrist": null,
"klagefrist": null
}
},
"eksamensavvikling": null
}
}
]
}
}
]
}
}
Tilnærming B: resultater og vurderingsmeldingerV2
Feltene resultater og vurderingsmeldingerV2 på StudentVedLarested gir resultater og meldinger separat. Begge er connections med termin-filtrering, og begge har tilgang til eksamensinformasjon via vurderingsenhet.
Når passer denne tilnærmingen?
- Du ønsker resultater og vurderingsmeldinger separat
Kontraktsnivå: experimental (resultater), beta (vurderingsmeldingerV2). Send Feature-Flags: beta,experimental.
query HentResultaterOgMeldingerForStudent {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["11616090366@spusers.feide.no"]
) {
resultater(
filter: { terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"] }
) {
nodes {
emne {
kode
navnAlleSprak { nb }
}
vurderingsenhet {
vurderingsdeltype
vurderingsperiode {
gjelderTermin {
betegnelse { kode }
arstall
}
}
}
karakter {
navnAlleSprak { nb }
tall
erBokstavkarakter
}
erOppnadd
erGyldig
}
}
vurderingsmeldingerV2(
filter: { terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"] }
) {
nodes {
emne {
kode
navnAlleSprak { nb }
}
vurderingsenhet {
vurderingsdeltype
trekkfrist
vurderingsperiode {
gjelderTermin {
betegnelse { kode }
arstall
}
}
vurderingsvarighet {
eksamensdatoer { startDato }
startklokkeslett
}
sensurinformasjon { sensurfrist }
}
}
}
}
}
Eksempel på svar:
{
"data": {
"studenterGittFeideBrukere": [
{
"resultater": {
"nodes": []
},
"vurderingsmeldingerV2": {
"nodes": [
{
"emne": {
"kode": "KRH101",
"navnAlleSprak": {
"nb": "Hagearbeidets klassikere og det florale samfunn"
}
},
"vurderingsenhet": {
"vurderingsdeltype": "HELHET",
"trekkfrist": "2023-09-01T00:00:00.000+02:00",
"vurderingsperiode": {
"gjelderTermin": {
"betegnelse": {
"kode": "HØST"
},
"arstall": 2023
}
},
"vurderingsvarighet": {
"eksamensdatoer": {
"startDato": "2023-10-01"
},
"startklokkeslett": null
},
"sensurinformasjon": {
"sensurfrist": null
}
}
}
]
}
}
]
}
}
resultater returnerer protokollførte vurderingsresultater med karakter og bestått-status. vurderingsmeldingerV2 returnerer studentens vurderingsmeldinger med tilgang til eksamensinformasjon via vurderingsenhet.
Begge feltene er connections (med nodes-paginering) som returnerer flate lister. Konsumenter som trenger emne-gruppering grupperer på emne.kode og vurderingsperiode på klientsiden.
Hent studenter med endringer siden angitt tid
I REST-APIet returnerte dette endepunktet brukernavn for studenter med endringer siden et angitt tidspunkt.
I GraphQL-APIet brukes studenthendelser for å hente hendelser relatert til studenter. Tidsfiltrering er ikke tilgjengelig, men du kan være mer spesifikk på hvilke typer hendelser du er interessert i ved å filtrere på eierOrganisasjonskode, hendelsestype og studieniva.
For å følge med på nye hendelser anbefales det å bruke paginering med edges og cursor, og lagre endCursor-verdien for å hente nye hendelser siden sist. Les mer i dokumentasjonen for hendelser.
Kontraktsnivå: studenthendelser (roten) er stable. Av hendelsestypene i eksempelet er ENDRET_NAVN og STUDENTKORT_UTGATT beta, mens SEMESTERAVGIFT_BETALT er experimental. Send Feature-Flags: beta,experimental.
query HentStudentHendelser {
studenthendelser(
filter: {
eierOrganisasjonskode: "1234"
hendelsestype: [
SEMESTERAVGIFT_BETALT
STUDENTKORT_UTGATT
ENDRET_NAVN
]
}
) {
pageInfo {
hasNextPage
endCursor
}
edges {
cursor
node {
hendelsestype
student {
personProfil {
feideBruker
}
}
}
}
}
}
Merk: Det finnes mange andre hendelsestyper tilgjengelig. Du kan filtrere på så mange hendelsestyper du er interessert i.
Eksempel på svar:
{
"data": {
"studenthendelser": {
"pageInfo": {
"hasNextPage": false,
"endCursor": "WzEyMzQsMTEyXQ"
},
"edges": [
{
"cursor": "WzEyMzQsMTNd",
"node": {
"hendelsestype": "SEMESTERAVGIFT_BETALT",
"student": {
"personProfil": {
"feideBruker": "30567990024@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsMjFd",
"node": {
"hendelsestype": "SEMESTERAVGIFT_BETALT",
"student": {
"personProfil": {
"feideBruker": "30567990024@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsNDFd",
"node": {
"hendelsestype": "SEMESTERAVGIFT_BETALT",
"student": {
"personProfil": {
"feideBruker": "30567990024@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsMTExXQ",
"node": {
"hendelsestype": "SEMESTERAVGIFT_BETALT",
"student": {
"personProfil": {
"feideBruker": "14578990047@spusers.feide.no"
}
}
}
},
{
"cursor": "WzEyMzQsMTEyXQ",
"node": {
"hendelsestype": "SEMESTERAVGIFT_BETALT",
"student": {
"personProfil": {
"feideBruker": "04577690095@spusers.feide.no"
}
}
}
}
]
}
}
}
Hent studieprogram
Dette endepunktet henter aktive studieretter for en gitt student idetifisert med brukernavn.
For å hente samme data via FS GraphQL API kan du bruke spørringen studenterGittFeideBrukere.
Du kan hente studentens aktive studieretter via feltet programStudieretter.
Eksempel:
query HentStudieprogram {
studenterGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["yngve@spusers.feide.no"]
) {
programStudieretter {
edges {
node {
studieprogram {
kode
}
}
}
}
}
}
Eksempel på svar:
{
"data": {
"studenterGittFeideBrukere": [
{
"programStudieretter": {
"edges": [
{
"node": {
"studieprogram": {
"kode": "MEDISIN"
}
}
}
]
}
}
]
}
}
Hent undervisning for en student
Dette endepunktet henter undervisningsaktiviteter for en student basert på år og termin. For å hente samme data via FS GraphQL API trenger du student-ID og termin-ID (se "Hent data for en student" og "Hent aktive emner" for hvordan du henter disse).
Du kan deretter hente studentens emnestudieretter med undervisningsaktiviteter som nøstet data:
Kontraktsnivå: experimental. Send Feature-Flags: experimental.
query HentUndervisningForStudent {
emneStudieretter(
filter: {
eierOrganisasjonskode: "1234"
studenter: ["OTk6MTIzNCwyMzY0MQ"]
terminer: ["MTE2OjEyMzQsMjAyMyxIw5hTVA"]
}
) {
nodes {
emne {
kode
versjonskode
}
terminnummer
fellesundervisning {
nodes {
kode
undervisningsform {
kode
}
}
}
undervisningspartiPlasseringer {
undervisningsaktivitet {
kode
undervisningsform {
kode
}
partinummer
}
}
}
}
}
Eksempel på svar:
{
"data": {
"emneStudieretter": {
"nodes": [
{
"emne": {
"kode": "PRA1001",
"versjonskode": "1"
},
"terminnummer": 1,
"fellesundervisning": {
"nodes": [
{
"kode": "1",
"undervisningsform": {
"kode": "FOR"
}
}
]
},
"undervisningspartiPlasseringer": [
{
"undervisningsaktivitet": {
"kode": "0-P-5",
"undervisningsform": {
"kode": "ALP-PRAKS"
},
"partinummer": "5"
}
}
]
},
{
"emne": {
"kode": "HEIS100",
"versjonskode": "1"
},
"terminnummer": 1,
"fellesundervisning": {
"nodes": [
{
"kode": "4",
"undervisningsform": {
"kode": "FOR"
}
},
{
"kode": "5",
"undervisningsform": {
"kode": "FOR"
}
}
]
},
"undervisningspartiPlasseringer": [
{
"undervisningsaktivitet": {
"kode": "1-1",
"undervisningsform": {
"kode": "LAB"
},
"partinummer": "1"
}
}
]
}
]
}
}
}
Feltet fellesundervisning returnerer undervisningsaktiviteter som er felles for alle studenter (tilsvarer "fellesundervisning" i det gamle APIet). Feltet undervisningspartiPlasseringer returnerer aktiviteter der studenten er plassert i et parti (tilsvarer "partiundervisning" i det gamle APIet).
Hent undervisningsaktiviteter for et emne
Dette endepunktet henter undervisningsaktiviteter for et gitt emne i et gitt semester.
For å hente samme data via FS GraphQL API kan du bruke spørringen undervisningsaktiviteter filtrert på emne og termin. Du må først hente emne-ID og termin-ID (se "Hent aktive emner" for hvordan du henter termin-ID).
Steg 1: Hent emne-ID
query HentEmneId {
emnerGittEmnekoder(
eierInstitusjonsnummer: "1234"
emnekoder: {
emnekode: "ECON1230"
versjonskode: "1"
}
) {
id
}
}
Eksempel på svar:
{
"data": {
"emnerGittEmnekoder": [
{
"id": "MjA6MTIzNCwxODUsRUNPTjEyMzAsMQ"
}
]
}
}
Steg 2: Hent undervisningsaktiviteter
Kontraktsnivå: spørringen undervisningsaktiviteter og feltene timeplaner, rom og bygning er stable, men filterargumentene emner og terminer samt rom.kapasitet er experimental. Send Feature-Flags: experimental.
query HentUndervisningsaktiviteter {
undervisningsaktiviteter(
filter: {
eierOrganisasjonskode: "1234"
emner: ["MjA6MTIzNCwxODUsRUNPTjEyMzAsMQ"]
terminer: ["MTE2OjEyMzQsMjAwNCxIw5hTVA"]
}
first: 5
) {
nodes {
id
kode
navnAlleSprak {
nb
}
timerPerUke
timeplaner {
nodes {
ukedag {
ukedagnummer
}
rom {
kode
bygning {
kode
}
kapasitet {
undervisning
eksamen
}
}
klokkeslett {
fra
til
}
undervisningsuker {
ukenummer
harUndervisning
arstall
}
}
}
}
}
}
Eksempel på svar:
{
"data": {
"undervisningsaktiviteter": {
"nodes": [
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDA",
"kode": "0",
"navnAlleSprak": {
"nb": "Undervisning"
},
"timerPerUke": null,
"timeplaner": {
"nodes": [
{
"ukedag": null,
"rom": [],
"klokkeslett": null,
"undervisningsuker": []
},
{
"ukedag": null,
"rom": [],
"klokkeslett": null,
"undervisningsuker": []
}
]
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDE",
"kode": "1",
"navnAlleSprak": {
"nb": "Forelesninger"
},
"timerPerUke": null,
"timeplaner": {
"nodes": []
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode": "1-1",
"navnAlleSprak": {
"nb": "Rettferdighet"
},
"timerPerUke": 2,
"timeplaner": {
"nodes": [
{
"ukedag": {
"ukedagnummer": 1
},
"rom": [
{
"kode": "300",
"bygning": {
"kode": "AB"
},
"kapasitet": {
"undervisning": 30,
"eksamen": 10
}
}
],
"klokkeslett": {
"fra": "08:15:00+01:00",
"til": "10:00:00+01:00"
},
"undervisningsuker": []
}
]
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMg",
"kode": "1-2",
"navnAlleSprak": {
"nb": "Fordeling"
},
"timerPerUke": 4,
"timeplaner": {
"nodes": [
{
"ukedag": {
"ukedagnummer": 2
},
"rom": [],
"klokkeslett": {
"fra": "10:15:00+01:00",
"til": "12:00:00+01:00"
},
"undervisningsuker": []
},
{
"ukedag": {
"ukedagnummer": 4
},
"rom": [
{
"kode": "AUDMAX",
"bygning": {
"kode": "AUDMAX"
},
"kapasitet": {
"undervisning": 500,
"eksamen": 300
}
}
],
"klokkeslett": {
"fra": "12:15:00+01:00",
"til": "14:00:00+01:00"
},
"undervisningsuker": []
}
]
}
},
{
"id": "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDI",
"kode": "2",
"navnAlleSprak": {
"nb": "Gruppeundervisning"
},
"timerPerUke": null,
"timeplaner": {
"nodes": []
}
}
]
}
}
}
Rapportering av godkjent utenlandsopphold til Lånekassen
Dette endepunktet brukes kun av Lånekassen. Migrering til GraphQL vil skje i samarbeid med dem.
Synkronisering av data mellom FS og timeplanleggingssystemet TP
Disse endepunktene brukes av timeplanleggingssystemet TP (ved UiO) for å synkronisere timeplandata tilbake til FS. Det finnes to varianter:
POST oppdater_undakt
Tar inn institusjonsnr og json (som form-parameter). JSON-objektet inneholder en undervisningsaktivitet identifisert enten med TP-id eller med parametrene årstall+termin+emnekode+versjonskode+terminnr+aktivitetkode, samt en liste med timeplanoppføringer som skal oppdateres i FS.
For hver timeplanoppføring oppdaterer endepunktet:
- Timeplan: ukedag, klokkeslett, start-/sluttdato, undervisningsuker, obligatorisk oppmøte, timeplanaktivitetsnavn
- Rom: bygningskode og romkode
- Roller: personroller knyttet til timeplanoppføringen
POST oppdater_undervisningsaktiviteter
Tar inn arstall, terminkode og emnekode som form-parametre. Endepunktet henter alle undervisningsaktiviteter for emnet fra FS, slår opp tilhørende timeplandata fra TP sitt API, og oppdaterer FS med dataene fra TP.
Migrering til FS GraphQL API
Funksjonaliteten i disse endepunktene kan erstattes med en rekke GraphQL-mutasjoner.
Slå opp IDer
Mutasjonene nedenfor krever base64-enkodede IDer som input. Her vises hvordan du finner de ulike IDene du trenger.
Kontraktsnivå: experimental for rom, fag, fagpersonerGittPersonlopenumre, undervisningsformer og undervisningsdisipliner. fsRoller er stable, men filteret gjelderUndervisning i eksempelet er experimental. Send Feature-Flags: experimental på alle oppslagene under.
Undervisningsenhet og undervisningsaktivitet — se "Hent undervisningsaktiviteter for et emne" lenger opp for hvordan du finner disse.
Rom — slå opp rom filtrert på organisasjon:
query HentRom {
rom(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
bygning {
id
kode
}
kapasitet {
undervisning
eksamen
}
}
}
}
Eksempel på svar:
{
"data" : {
"rom" : {
"nodes" : [ {
"id" : "OTI6MTIzNCxBLFNZREg",
"kode" : "A",
"bygning" : {
"id" : "NjoxMjM0LFNZREg",
"kode" : "SYDH"
},
"kapasitet" : {
"undervisning" : null,
"eksamen" : 5
}
} ]
}
}
}
Fag — slå opp fag:
query HentFag {
fag(
filter: { eierOrganisasjonskode: "1234" }
first: 10
) {
nodes {
id
kode
navnAlleSprak {
nb
}
}
}
}
Eksempel på svar:
{
"data" : {
"fag" : {
"nodes" : [ {
"id" : "MzA6MTIzNCxBS1ZBS1VMVFVS",
"kode" : "AKVAKULTUR",
"navnAlleSprak" : {
"nb" : "Akvakultur"
}
} ]
}
}
}
Roller — slå opp roller som gjelder undervisning:
query HentRoller {
fsRoller(
filter: {
eierOrganisasjonskode: "1234"
gjelderUndervisning: true
}
first: 10
) {
nodes {
id
kode
}
}
}
Eksempel på svar:
{
"data" : {
"fsRoller" : {
"nodes" : [ {
"id" : "OTE6MTIzNCxBU1NJU1RFTlQ",
"kode" : "ASSISTENT"
}, {
"id" : "OTE6MTIzNCxGQUdBTlNW",
"kode" : "FAGANSV"
}, {
"id" : "OTE6MTIzNCxGT1JMRVM",
"kode" : "FORLES"
}, {
"id" : "OTE6MTIzNCxHUlVMRUQ",
"kode" : "GRULED"
} ]
}
}
}
Personprofil (for roller) — slå opp fagperson med personløpenummer:
query HentFagperson {
fagpersonerGittPersonlopenumre(
eierOrganisasjonskode: "1234"
personlopenumre: ["883"]
) {
id
personProfil {
id
navn {
fornavn
etternavn
}
}
}
}
Eksempel på svar:
{
"data" : {
"fagpersonerGittPersonlopenumre" : [ {
"id" : "MzE6MTIzNCw4ODM",
"personProfil" : {
"id" : "NzY6MTIzNCw4ODM",
"navn" : {
"fornavn" : "Njål",
"etternavn" : "Øye"
}
}
} ]
}
}
Det er personProfil.id som brukes som personProfilId i rolle-mutasjonene.
Undervisningsform og undervisningsdisiplin:
query HentUndervisningsformerOgDisipliner {
undervisningsformer(
filter: { eierOrganisasjonskode: "1234" }
first: 5
) {
nodes {
id
kode
}
}
undervisningsdisipliner(
filter: { eierOrganisasjonskode: "1234" }
first: 5
) {
nodes {
id
kode
}
}
}
Eksempel på svar:
{
"data" : {
"undervisningsformer" : {
"nodes" : [ {
"id" : "Mjk2OjEyMzQsQURPUFI",
"kode" : "ADOPR"
}, {
"id" : "Mjk2OjEyMzQsQUxQLVBSQUtT",
"kode" : "ALP-PRAKS"
} ]
},
"undervisningsdisipliner" : {
"nodes" : [ {
"id" : "Mjk3OjEyMzQsQUxQLVBSQUtT",
"kode" : "ALP-PRAKS"
}, {
"id" : "Mjk3OjEyMzQsQkFSTkVWRVJO",
"kode" : "BARNEVERN"
} ]
}
}
}
Opprette undervisningsaktivitet
Kontraktsnivå: mutasjonen er stable, men disiplin i responsen er experimental. Send Feature-Flags: experimental — eller fjern feltet fra seleksjonen hvis du vil holde deg på stable.
mutation OpprettUndervisningsaktiviteter {
opprettUndervisningsaktiviteter(
input: {
undervisningsenhetId: "MTIxOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwx"
aktivitetskode: "X-3"
navnNb: "Forelesning"
navnNn: "Førelesning"
navnEn: "Lecture"
antallPraksisplasserOnsket: 100
parentId: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDA"
rekkefolgenummer: 10
kanPubliseres: true
underliggendeAktiviteterErEkvivalente: false
kanAvlysesVedForFaaSokere: false
tilbysSomFjernundervisning: false
skalEksporteresTilLms: true
skalEksporteresTilTimeplansystem: true
undervisningsformId: "Mjk2OjEyMzQsQURPUFI"
undervisningsdisiplinId: "Mjk3OjEyMzQsQkFSTkVWRVJO"
undervisningsparti: {
partinummer: "1"
studentKanMeldeSegPaAktivitet: true
}
}
) {
undervisningsaktiviteter {
id
kode
navnAlleSprak {
nb
nn
en
}
antallPraksisplasserOnsket
erLukket
kanPubliseres
skalEksporteresTilTimeplansystem
skalEksporteresTilLms
timerPerUke
undervisningsform {
id
kode
}
disiplin {
id
kode
}
}
errors {
__typename
... on Error {
message
}
}
}
}
Eksempel på svar:
{
"data" : {
"opprettUndervisningsaktiviteter" : {
"undervisningsaktiviteter" : [ {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLFgtMw",
"kode" : "X-3",
"navnAlleSprak" : {
"nb" : "Forelesning",
"nn" : "Førelesning",
"en" : "Lecture"
},
"antallPraksisplasserOnsket" : 100,
"erLukket" : false,
"kanPubliseres" : true,
"skalEksporteresTilTimeplansystem" : true,
"skalEksporteresTilLms" : true,
"timerPerUke" : null,
"undervisningsform" : {
"id" : "Mjk2OjEyMzQsQURPUFI",
"kode" : "ADOPR"
},
"disiplin" : {
"id" : "Mjk3OjEyMzQsQkFSTkVWRVJO",
"kode" : "BARNEVERN"
}
} ],
"errors" : null
}
}
}
Oppdatere undervisningsaktivitet
Oppdaterer flere egenskaper på en undervisningsaktivitet i én operasjon.
Merk: Bruker navnAlleSprak (med nb, nn, en) i stedet for separate navnNb/navnNn/navnEn-felt.
Kontraktsnivå: mutasjonen er stable, men disiplin i responsen er experimental. Send Feature-Flags: experimental — eller fjern feltet fra seleksjonen hvis du vil holde deg på stable.
mutation OppdaterUndervisningsaktiviteter {
oppdaterUndervisningsaktiviteter(
input: {
id: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ"
navnAlleSprak: {
nb: "Rettferdighet"
nn: "Rettferd"
en: "Justice"
}
antallPraksisplasserOnsket: 50
kanPubliseres: true
}
) {
undervisningsaktiviteter {
id
kode
navnAlleSprak {
nb
nn
en
}
antallPraksisplasserOnsket
erLukket
kanPubliseres
skalEksporteresTilTimeplansystem
skalEksporteresTilLms
timerPerUke
undervisningsform {
id
kode
}
disiplin {
id
kode
}
}
errors {
__typename
... on Error {
message
}
}
}
}
Eksempel på svar:
{
"data" : {
"oppdaterUndervisningsaktiviteter" : {
"undervisningsaktiviteter" : [ {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1",
"navnAlleSprak" : {
"nb" : "Rettferdighet",
"nn" : "Rettferd",
"en" : "Justice"
},
"antallPraksisplasserOnsket" : 50,
"erLukket" : false,
"kanPubliseres" : true,
"skalEksporteresTilTimeplansystem" : true,
"skalEksporteresTilLms" : false,
"timerPerUke" : 2,
"undervisningsform" : {
"id" : "Mjk2OjEyMzQsRk9S",
"kode" : "FOR"
},
"disiplin" : {
"id" : "Mjk3OjEyMzQsRkVMTEVT",
"kode" : "FELLES"
}
} ],
"errors" : null
}
}
}
Andre mutasjoner for undervisningsaktiviteter
Enkeltegenskaper kan også oppdateres med mer spesialiserte mutasjoner.
Kontraktsnivå: experimental — alle mutasjonene under. Send Feature-Flags: experimental når du bruker dem.
Eksempel — endre navn:
mutation EndreNavn {
endreUndervisningsaktivitetNavn(
input: [
{
id: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ"
navnAlleSprak: {
nb: "Rettferdighet"
nn: "Rettferd"
en: "Justice"
}
}
]
) {
undervisningsaktiviteter {
id
kode
navnAlleSprak {
nb
nn
en
}
antallPraksisplasserOnsket
kanPubliseres
skalEksporteresTilTimeplansystem
}
errors {
__typename
... on TerminErSperretForEndringAvUndervisningsaktiviteter {
message
path
}
... on UgyldigInput {
message
path
}
}
}
}
Eksempel på svar:
{
"data" : {
"endreUndervisningsaktivitetNavn" : {
"undervisningsaktiviteter" : [ {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1",
"navnAlleSprak" : {
"nb" : "Rettferdighet",
"nn" : "Rettferd",
"en" : "Justice"
},
"antallPraksisplasserOnsket" : 50,
"kanPubliseres" : true,
"skalEksporteresTilTimeplansystem" : true
} ],
"errors" : null
}
}
}
Opprette timeplan
Merk: Klokkeslett må angis i RFC3339-format (f.eks. 10:00:00+01:00).
mutation OpprettTimeplaner {
opprettTimeplaner(
input: {
undervisningsaktivitetsId: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDE"
timeplannummer: 1
ukedag: MANDAG
antallPlasser: 30
klokkeslettFra: "10:00:00+01:00"
klokkeslettTil: "12:00:00+01:00"
harObligatoriskOppmote: true
rom: ["OTI6MTIzNCxBLFNZREg"]
fag: ["MzA6MTIzNCxBS1ZBS1VMVFVS"]
navnAlleSprak: { und: "Forelesning i auditorium" }
}
) {
timeplaner {
id
timeplannummer
ukedag {
ukedagnummer
}
klokkeslett {
fra
til
}
harObligatoriskOppmote
navnAlleSprak {
und
}
rom {
id
kode
}
fag {
id
kode
}
undervisningsaktivitet {
id
kode
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}
Eksempel på svar:
{
"data" : {
"opprettTimeplaner" : {
"timeplaner" : [ {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1,
"ukedag" : null,
"klokkeslett" : {
"fra" : "10:00:00+01:00",
"til" : "12:00:00+01:00"
},
"harObligatoriskOppmote" : true,
"navnAlleSprak" : {
"und" : "Forelesning i auditorium"
},
"rom" : [ {
"id" : "OTI6MTIzNCxBLFNZREg",
"kode" : "A"
} ],
"fag" : [ {
"id" : "MzA6MTIzNCxBS1ZBS1VMVFVS",
"kode" : "AKVAKULTUR"
} ],
"undervisningsaktivitet" : null
} ],
"errors" : null
}
}
}
Endre timeplaner
Merk navnAlleSprak-strukturen: det indre objektet tar enten und: "<navn>" for å sette navnet, eller fjern: true for å fjerne det — derfor und to nivåer ned. Utelater du feltet helt, står navnet urørt.
mutation EndreTimeplaner {
endreTimeplaner(
input: [
{
id: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMSwx"
ukedag: MANDAG
klokkeslettFra: "08:15:00+01:00"
klokkeslettTil: "10:00:00+01:00"
harObligatoriskOppmote: false
navnAlleSprak: { und: { und: "Forelesning" } }
}
]
) {
timeplaner {
id
timeplannummer
ukedag {
ukedagnummer
}
klokkeslett {
fra
til
}
harObligatoriskOppmote
navnAlleSprak {
und
}
rom {
kode
bygning {
kode
}
}
undervisningsaktivitet {
id
kode
}
undervisningsform {
id
kode
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}
Eksempel på svar:
{
"data" : {
"endreTimeplaner" : {
"timeplaner" : [ {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMSwx",
"timeplannummer" : 1,
"ukedag" : {
"ukedagnummer" : 1
},
"klokkeslett" : {
"fra" : "08:15:00+01:00",
"til" : "10:00:00+01:00"
},
"harObligatoriskOppmote" : false,
"navnAlleSprak" : {
"und" : "Forelesning"
},
"rom" : [ ],
"undervisningsaktivitet" : {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1"
},
"undervisningsform" : null
} ],
"errors" : null
}
}
}
Slette timeplan
mutation SlettTimeplan {
slettTimeplan(
input: { id: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ" }
) {
ids
errors {
__typename
... on Error {
message
}
}
}
}
Eksempel på svar:
{
"data" : {
"slettTimeplan" : {
"ids" : [ "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ" ],
"errors" : null
}
}
}
Legge til / fjerne rom på timeplan
mutation LeggTilRom {
leggTilRomPaTimeplaner(
input: {
timeplanId: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ"
romIder: ["OTI6MTIzNCxBLFNZREg"]
}
) {
results {
timeplan {
id
timeplannummer
}
rom {
id
kode
bygning {
kode
}
kapasitet {
undervisning
eksamen
}
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}
Eksempel på svar:
{
"data" : {
"leggTilRomPaTimeplaner" : {
"results" : [ {
"timeplan" : {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1
},
"rom" : [ {
"id" : "OTI6MTIzNCxBLFNZREg",
"kode" : "A",
"bygning" : null,
"kapasitet" : {
"undervisning" : null,
"eksamen" : 5
}
} ]
} ],
"errors" : null
}
}
}
For å fjerne rom brukes slettRomFraTimeplaner med samme input-struktur (timeplanId + romIder).
Legge til / fjerne fag på timeplan
mutation LeggTilFag {
leggTilFagPaTimeplaner(
input: {
timeplanId: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ"
fagIder: ["MzA6MTIzNCxBS1ZBS1VMVFVS"]
}
) {
results {
timeplan {
id
timeplannummer
}
fag {
id
kode
navnAlleSprak {
nb
}
}
}
errors {
__typename
... on UgyldigInput {
message
path
}
}
}
}
Eksempel på svar:
{
"data" : {
"leggTilFagPaTimeplaner" : {
"results" : [ {
"timeplan" : {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1
},
"fag" : [ {
"id" : "MzA6MTIzNCxBS1ZBS1VMVFVS",
"kode" : "AKVAKULTUR",
"navnAlleSprak" : {
"nb" : "Akvakultur"
}
} ]
} ],
"errors" : null
}
}
}
For å fjerne fag brukes slettFagFraTimeplaner med samme input-struktur (timeplanId + fagIder).
Opprette / slette roller på timeplan
Kontraktsnivå: mutasjonene opprettTimeplanroller og slettTimeplanroller er stable, men feltene erAktiv og timeplan i responsen er beta, og fagperson og aktivStatus er experimental. Send Feature-Flags: beta,experimental. endreGyldighetsperiodeForTimeplanroller er i sin helhet experimental.
mutation OpprettTimeplanroller {
opprettTimeplanroller(
input: {
timeplanId: "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ"
personProfilId: "NzY6MTIzNCw4ODM"
rolleId: "OTE6MTIzNCxGT1JMRVM"
fraDato: "2026-01-01"
tilDato: "2026-06-30"
}
) {
timeplanroller {
id
fsRolle {
kode
}
fagperson {
id
}
erAktiv
aktivStatus
gyldighetsperiode {
fraDato
tilDato
}
timeplan {
id
timeplannummer
}
}
errors {
__typename
... on RolleIkkeUnikIPerioden {
message
path
}
... on UgyldigInput {
message
path
}
}
}
}
Eksempel på svar:
{
"data" : {
"opprettTimeplanroller" : {
"timeplanroller" : [ {
"id" : "Mjc2OjEyMzQsODgzLDEx",
"fsRolle" : {
"kode" : "FORLES"
},
"fagperson" : {
"id" : "MzE6MTIzNCw4ODM"
},
"erAktiv" : true,
"aktivStatus" : "AKTIV",
"gyldighetsperiode" : {
"fraDato" : "2026-01-01",
"tilDato" : "2026-06-30"
},
"timeplan" : {
"id" : "MTIzOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEsMQ",
"timeplannummer" : 1
}
} ],
"errors" : null
}
}
}
For å fjerne roller brukes slettTimeplanroller.
For å endre gyldighetsperiode brukes endreGyldighetsperiodeForTimeplanroller.
Opprette / slette roller på undervisningsaktivitet
Kontraktsnivå: experimental. Merk asymmetrien: roller på timeplan ligger på stable, mens roller på undervisningsaktivitet ennå er experimental og kan endres uten varsel. Responsfeltene er dels beta, dels experimental — send Feature-Flags: beta,experimental.
mutation OpprettUndervisningsaktivitetsroller {
opprettUndervisningsaktivitetsroller(
input: {
undervisningsaktivitetId: "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ"
personProfilId: "NzY6MTIzNCw4ODM"
rolleId: "OTE6MTIzNCxGT1JMRVM"
fraDato: "2026-01-01"
tilDato: "2026-06-30"
}
) {
undervisningsaktivitetsroller {
id
fsRolle {
kode
}
fagperson {
id
}
erAktiv
aktivStatus
gyldighetsperiode {
fraDato
tilDato
}
undervisningsaktivitet {
id
kode
}
}
errors {
__typename
... on RolleIkkeUnikIPerioden {
message
path
}
... on UgyldigInput {
message
path
}
}
}
}
Eksempel på svar:
{
"data" : {
"opprettUndervisningsaktivitetsroller" : {
"undervisningsaktivitetsroller" : [ {
"id" : "Mjc3OjEyMzQsODgzLDEy",
"fsRolle" : {
"kode" : "FAGANSV"
},
"fagperson" : {
"id" : "MzE6MTIzNCw4ODM"
},
"erAktiv" : true,
"aktivStatus" : "AKTIV",
"gyldighetsperiode" : {
"fraDato" : "2026-01-01",
"tilDato" : "2026-06-30"
},
"undervisningsaktivitet" : {
"id" : "MTIwOjEyMzQsMTg1LEVDT04xMjMwLDEsMjAwNCxIw5hTVCwxLDEtMQ",
"kode" : "1-1"
}
} ],
"errors" : null
}
}
}
For å fjerne roller brukes slettUndervisningsaktivitetsroller.
Viktige forskjeller fra studrapp
- Studrapp-endepunktene gjør alt i én operasjon (timeplan + rom + roller). I GraphQL gjøres dette med separate mutasjoner, men
opprettTimeplanerkan opprette en timeplan med rom og fag i én operasjon. - Studrapp bruker sammensatte nøkler (institusjonsnr, årstall, terminkode, emnekode, versjonskode, terminnr, aktivitetkode, undplanløpenr). GraphQL bruker base64-enkodede IDer — se "Slå opp IDer" ovenfor.
oppdater_undervisningsaktiviteterhenter data direkte fra TP sitt API. I en GraphQL-basert løsning kaller TP GraphQL-mutasjonene direkte.- GraphQL-mutasjonene dekker også oppretting og sletting av undervisningsaktiviteter og timeplaner, noe studrapp-endepunktene ikke støtter — de kun oppdaterer eksisterende data.
- For undervisningsaktiviteter kan du velge mellom
oppdaterUndervisningsaktiviteter(oppdaterer mange felt i én operasjon) og de mer spesialiserte mutasjonene (oppdaterer enkeltaspekter).