Gå til hovedinnhold

Fra FSWS-FC til FS GraphQL API

⚠ Denne tjenesten avvikles etter 31. mars 2027. Ett av de to endepunktene er allerede deprekert: GET /fc/group/:groupid/members er merket deprekert etter 1. mars 2026 i FC sin tekniske dokumentasjon. Se Sikts avviklingspraksis og avviklingsloggen. Kilde: Teknisk dokumentasjon for FSWS-Feide-Connect

FSWS-FC (Feide Connect) tilbyr gruppemedlemskap fra FS til Feide-økosystemet: studieprogram, kull, klasse, emne og studieretning, for både studenter og fagpersoner, gjennom to endepunkter.

Denne guiden hjelper deg migrere fra FSWS-FC 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.

Før du starter​

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

Tilgang: ingen egen RAS-rolle kreves​

Denne guidens datasett har ingen egen navngitt RAS-rolle. Vanlig autentisert tilgang er nok — se Tilgangsstyring med RAS for hvordan API-brukeren din bestilles. eierOrganisasjonskode avgrenser fortsatt hvilke data du får.

Kontraktsnivå i eksemplene​

Det meste i denne guiden er stable. Ett unntak: fagperson.kullroller er selv experimental, og returtypen (Kullrolle) har felt som er beta — bruker du dette feltet trenger du headeren Feature-Flags: beta,experimental. Se merknad ved eksempelet.

Slik er modellen annerledes​

FC ga deg én flat liste med grupper per bruker. GraphQL har ingen gruppetype — du spør etter personen og navigerer til de underliggende tilknytningene, som hver har sin egen type:

Slik er modellen annerledes
I FCI FS GraphQL API
Én flat liste med fc:fs:*-grupperSeparate, typede felt under PersonProfil
basic: "member"Data under PersonProfil.student
basic: "owner"Data under PersonProfil.fagperson
Gruppe-ID fc:fs:prg:uio.no:INFOIngen tilsvarende ID — du bygger identiteten selv av kode-feltene
Domene i stien (@uio.no)Argumentet eierOrganisasjonskode (institusjonsnummeret)

Institusjonsnummer i eksemplene​

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

IDer: er de samme som i FSWS-FC?​

Nei. FS GraphQL API sine id-felt er base64-enkodede og har ingen sammenheng med FCs fc:fs:<type>:<domene>:<koder>. Du kan ikke slå opp en FC-gruppe-ID i GraphQL, og du kan ikke utlede en FC-ID fra et GraphQL-id. Trenger du å beholde FC-gruppe-ID-ene i din egen datamodell under overgangen, bygger du dem selv av kodefeltene:

IDer: er de samme som i FSWS-FC?
FC-gruppe-IDBygges av
fc:fs:prg:<domene>:<prog>studieprogram.kode
fc:fs:kull:<domene>:<prog>:<år>:<termin>studieprogram.kode + kull.terminV2.arstall + kull.terminV2.betegnelse.kode
fc:fs:klasse:<domene>:<prog>:<år>:<termin>:<klasse>samme som kull + klasse.kode
fc:fs:emne:<domene>:<emne>:<versjon>:<år>:<termin>emne.kode + emne.versjonskode + termin.arstall + termin.betegnelse.kode
fc:fs:str:<domene>:<retning>studieretning.kode

<domene> finnes ikke i GraphQL-svaret — du må selv holde rede på hvilket Feide-domene eierOrganisasjonskode svarer til.

Standardfiltrene gir deg færre grupper enn FC gjorde​

Alle rolle- og medlemskapsfeltene returnerer kun aktive rader som standard. FC returnerte også grupper med "active": false. Får du færre grupper enn før, er dette nesten alltid grunnen:

Standardfiltrene gir deg færre grupper enn FC gjorde
FeltStandardFor å få med inaktive
programStudieretterkun aktive studieretterfilter: { aktivStatus: [FREMTIDIG, AKTIV, AVSLUTTET] }
klassemedlemskapkun aktiveingen dedikert overstyring dokumentert her — kontakt fs-support@sikt.no ved behov
emneroller, studieprogramroller, klasseroller, kullrollerkun aktive rollerfilteret på hvert felt har et tilsvarende alternativ til erAktiv

Paginering: standardverdier for first​

Standard sidestørrelse per paginert felt
FeltStandard first
student.programStudieretter10
student.emneStudieretter10
programStudieretter.klassemedlemskap10
fagperson.emneroller100
fagperson.studieprogramroller100
fagperson.klasserollerikke paginert (plain liste)
fagperson.kullrollerikke paginert (plain liste)

Sett first eksplisitt til et tall som dekker ditt behov, og les Paginering hvis du har brukere med flere rader enn grensen.

Feide-brukernavn må inneholde domenet​

feideBrukere må sendes med full form, inkludert domene ("brukernavn@dittlarested.no"). Et brukernavn uten @ blir stille ignorert, og spørringen returnerer en tom liste uten feilmelding.

Oversikt​

Mapping av FSWS-FC-endepunkter til FS GraphQL API
FSWS-FC endepunktBeskrivelseFS GraphQL API
GET /fc/user/feide::brukernavn@:domene/groupsAlle grupper for en Feide-brukerpersonProfilerGittFeideBrukere
GET /fc/user/nin::personnr@:domene/groupsAlle grupper for en person gitt fødselsnummerpersonProfilerGittFodselsnumre
GET /fc/group/:groupid/members (deprekert etter 01.03.2026)Alle medlemmer i én gruppeEgen spørring per gruppetype — se Hent medlemmene i en gruppe

Hent grupper for en bruker​

Kontraktsnivå: stable, med ett unntak (kullroller, se merknad under eksempelet).

query HentGrupperForBruker {
personProfilerGittFeideBrukere(
eierOrganisasjonskode: "1234"
feideBrukere: ["ola@uio.no"]
) {
student {
programStudieretter(filter: { aktivStatus: [AKTIV] }, first: 100) {
nodes {
studieprogram {
kode
navnAlleSprak {
nb
nn
en
}
}
studentstatus {
kode
girAktivStudierett
}
studierettperiode {
fraDato
tilDato
}
studieretning {
kode
navnAlleSprak {
nb
nn
en
}
}
kull {
navnAlleSprak {
no
en
}
terminV2 {
arstall
betegnelse { kode }
}
}
klassemedlemskap(first: 100) {
nodes {
klasse {
kode
navnAlleSprak { und }
erAktiv
}
}
}
}
}
emneStudieretter(first: 100) {
nodes {
emne {
kode
versjonskode
navnAlleSprak {
nb
nn
en
}
}
termin {
arstall
betegnelse { kode }
}
}
}
}
fagperson {
# Emneroller (tilsvarer fc:fs:emne med basic=owner)
emneroller(first: 100) {
nodes {
emne {
kode
versjonskode
navnAlleSprak {
nb
nn
en
}
}
fsRolle {
kode
navnAlleSprak {
nb
nn
en
}
}
erAktiv
gyldighetsperiode {
fraDato
tilDato
}
}
}
# Studieprogramroller (tilsvarer fc:fs:prg med basic=owner) — paginert felt, må selekteres via nodes
studieprogramroller(first: 100) {
nodes {
studieprogram {
kode
navnAlleSprak {
nb
nn
en
}
}
fsRolle {
kode
navnAlleSprak {
nb
nn
en
}
}
erAktiv
gyldighetsperiode {
fraDato
tilDato
}
}
}
# Klasseroller (tilsvarer fc:fs:klasse med basic=owner) — ikke paginert
klasseroller {
klasse {
kode
navnAlleSprak { und }
}
fsRolle {
kode
navnAlleSprak {
nb
nn
en
}
}
erAktiv
}
}
}
}

Eksempel på svar:

{
"data": {
"personProfilerGittFeideBrukere": [
{
"student": {
"programStudieretter": {
"nodes": [
{
"studieprogram": {
"kode": "INFORMATIKK",
"navnAlleSprak": { "nb": "Informatikk", "nn": "Informatikk", "en": "Informatics" }
},
"studentstatus": { "kode": "AKTIV", "girAktivStudierett": true },
"studierettperiode": { "fraDato": "2023-08-01", "tilDato": null },
"studieretning": {
"kode": "DATATEKNOLOGI",
"navnAlleSprak": { "nb": "Datateknologi", "nn": "Datateknologi", "en": "Computer Science" }
},
"kull": {
"navnAlleSprak": { "no": "Kull 2023 høst", "en": "Cohort 2023 autumn" },
"terminV2": { "arstall": 2023, "betegnelse": { "kode": "HØST" } }
},
"klassemedlemskap": {
"nodes": [
{ "klasse": { "kode": "A", "navnAlleSprak": { "und": "Klasse A" }, "erAktiv": true } }
]
}
}
]
},
"emneStudieretter": {
"nodes": [
{
"emne": {
"kode": "INF1000",
"versjonskode": "1",
"navnAlleSprak": { "nb": "Grunnkurs i programmering", "nn": "Grunnkurs i programmering", "en": "Introduction to Programming" }
},
"termin": { "arstall": 2025, "betegnelse": { "kode": "VÅR" } }
}
]
}
},
"fagperson": {
"emneroller": {
"nodes": [
{
"emne": { "kode": "INF1000", "versjonskode": "1", "navnAlleSprak": { "nb": "Grunnkurs i programmering", "nn": "Grunnkurs i programmering", "en": "Introduction to Programming" } },
"fsRolle": { "kode": "FORELESER", "navnAlleSprak": { "nb": "Foreleser", "nn": "Førelesar", "en": "Lecturer" } },
"erAktiv": true,
"gyldighetsperiode": { "fraDato": "2025-01-01", "tilDato": "2025-06-30" }
}
]
},
"studieprogramroller": {
"nodes": [
{
"studieprogram": { "kode": "INFORMATIKK", "navnAlleSprak": { "nb": "Informatikk", "nn": "Informatikk", "en": "Informatics" } },
"fsRolle": { "kode": "STUDIEPROGRAMLEDER", "navnAlleSprak": { "nb": "Studieprogramleder", "nn": "Studieprogramleiar", "en": "Programme Director" } },
"erAktiv": true,
"gyldighetsperiode": { "fraDato": "2023-01-01", "tilDato": null }
}
]
},
"klasseroller": []
}
}
]
}
}

Tillegg: kullroller​

Kontraktsnivå: fagperson.kullroller er selv experimental, returtypen (Kullrolle) har felt som er beta. Krever headeren Feature-Flags: beta,experimental. Legg til i fagperson-blokken over (tilsvarer fc:fs:kull med basic=owner), ikke paginert:

kullroller {
kull {
navnAlleSprak {
no
en
}
studieprogram { kode }
terminV2 {
arstall
betegnelse { kode }
}
}
fsRolle {
kode
navnAlleSprak {
nb
nn
en
}
}
gyldighetsperiode {
fraDato
tilDato
}
}

Hent grupper for en person (fødselsnummer)​

For oppslag med fødselsnummer i stedet for Feide-brukernavn, bruk personProfilerGittFodselsnumre med samme nøsting som over:

query HentGrupperForPersonnummer {
personProfilerGittFodselsnumre(
eierOrganisasjonskode: "1234"
fodselsnumre: ["XXXXXXXXXXX"]
) {
student {
programStudieretter(filter: { aktivStatus: [AKTIV] }, first: 100) {
nodes {
studieprogram {
kode
navnAlleSprak {
nb
nn
en
}
}
}
}
}
}
}

Hent medlemmene i en gruppe​

FC hadde ett endepunkt for dette: GET /fc/group/:groupid/members. Det er deprekert etter

  1. mars 2026.

GraphQL har ingen felles gruppetype, så du velger spørring etter hvilken FC-gruppetype det gjaldt. Alle tar eierOrganisasjonskode, og alle er paginerte.

Erstatning for medlemsoppslag, per FC-gruppetype
FC-gruppetypeMedlemmer (basic: member)Rolleinnehavere (basic: owner)
fc:fs:prgQuery.programStudieretter(filter: { studieprogrammer: [...] }) — stableQuery.studieprogramroller(filter: { studieprogram: [...] }) — stable
fc:fs:kullQuery.programStudieretter(filter: { kullterminkoder: [...] }) — stableQuery.kullroller — beta
fc:fs:klasseQuery.programStudieretter → klassemedlemskapQuery.klasseroller — beta
fc:fs:emneQuery.emneStudieretter på den enkelte studentQuery.emneroller(filter: { emner: [...] }) — stable

Merk: kontraktsnivået her avviker fra de nøstede feltene under fagperson du så over — rot-spørringen Query.kullroller/Query.klasseroller er beta, mens de nøstede fagperson.kullroller er experimental og fagperson.klasseroller er stable. Samme GraphQL-type kan altså nås på to steder med to ulike kontraktsnivåer — sjekk alltid det stedet du faktisk bruker, ikke bare typenavnet.

Eksempel — alle aktive studenter på et studieprogram:

query MedlemmerIProgramgruppe {
programStudieretter(
filter: {
eierOrganisasjonskode: "1234"
studieprogrammer: ["<studieprogram-id>"]
aktivStatus: [AKTIV]
}
first: 100
) {
totalCount
pageInfo {
hasNextPage
endCursor
}
nodes {
personProfil {
feideBruker
navn {
fornavn
etternavn
}
}
studentstatus {
kode
girAktivStudierett
}
studierettperiode {
fraDato
tilDato
}
}
}
}

studieprogrammer tar GraphQL-IDer, ikke studieprogramkoder. Slå opp ID-en først med studieprogrammerGittStudieprogramkoder, eller hent den fra en tidligere spørring.

Eksempel — alle fagpersoner med rolle på et emne:

query RolleinnehavereIEmnegruppe {
emneroller(
filter: { eierOrganisasjonskode: "1234", emner: ["<emne-id>"] }
first: 100
) {
nodes {
personProfil {
feideBruker
navn {
fornavn
etternavn
}
}
fsRolle {
kode
navnAlleSprak {
nb
en
}
}
erAktiv
gyldighetsperiode {
fraDato
tilDato
}
}
}
}

Feltmapping: FSWS-FC til FS GraphQL API​

Group-objektet​

Feltmapping fra FCs Group-objekt til FS GraphQL API
FSWS-FC feltFS GraphQL API
group.id (f.eks. fc:fs:prg:uio.no:INFO)Ingen direkte motpart. Bygg identiteten selv — se IDer
group.typeImplisitt gjennom GraphQL-typen (Studieprogram, Kull, Klasse, Emne, Studieretning)
group.displayName.nb/nn/en*.navnAlleSprak { nb nn en } på den aktuelle typen
group.parentIngen direkte motpart. Hierarkiet ligger i relasjonene: Klasse.kull, Kull.studieprogram
group.membership.basic = memberData under PersonProfil.student
group.membership.basic = ownerData under PersonProfil.fagperson, roller (emneroller, studieprogramroller, kullroller, klasseroller)
group.membership.activeStudent: studentstatus.girAktivStudierett / klasse.erAktiv. Fagperson: *.erAktiv. Merk: inaktive rader er filtrert bort som standard — se Standardfiltrene
group.membership.notBefore / notAfterStudent: studierettperiode.fraDato/.tilDato. Fagperson: gyldighetsperiode.fraDato/.tilDato
group.membership.fsroles*.fsRolle.kode
group.membership.displayNamefsRolle.navnAlleSprak { nb nn en }

Gruppetyper for studenter (basic: "member")​

Gruppetyper for studenter med tilsvarende sti i FS GraphQL API
FC gruppetypeFC ID-formatGraphQL-sti fra PersonProfil
fc:fs:prgfc:fs:prg:<domene>:<programkode>student.programStudieretter.studieprogram
fc:fs:kullfc:fs:kull:<domene>:<prog>:<år>:<termin>student.programStudieretter.kull
fc:fs:klassefc:fs:klasse:<domene>:<prog>:<år>:<termin>:<klasse>student.programStudieretter.klassemedlemskap.klasse
fc:fs:emnefc:fs:emne:<domene>:<emne>:<versjon>:<år>:<termin>student.emneStudieretter.emne
fc:fs:strfc:fs:str:<domene>:<retningskode>student.programStudieretter.studieretning

Gruppetyper for fagpersoner (basic: "owner")​

Gruppetyper for fagpersoner med tilsvarende sti i FS GraphQL API
FC gruppetypeFC ID-formatGraphQL-sti fra PersonProfil
fc:fs:prgfc:fs:prg:<domene>:<programkode>fagperson.studieprogramroller.studieprogram — stable
fc:fs:kullfc:fs:kull:<domene>:<prog>:<år>:<termin>fagperson.kullroller.kull — experimental
fc:fs:klassefc:fs:klasse:<domene>:<prog>:<år>:<termin>:<klasse>fagperson.klasseroller.klasse — stable
fc:fs:emnefc:fs:emne:<domene>:<emne>:<versjon>:<år>:<termin>fagperson.emneroller.emne. ⚠️ Emnerolle har ingen termin — <år>:<termin> kan ikke gjenskapes herfra. Trenger du terminen, bruk fagperson.undervisningsenhetsroller (beta) → undervisningsenhet { termin { arstall betegnelse { kode } } emne { kode versjonskode } } — stable

Kontakt oss for hjelp ved behov​

Kontakt fs-support@sikt.no dersom du trenger hjelp til å komme i gang, eller underveis i migreringen. Generell dokumentasjon av spørringer finner du under Spørringer.