Fra FSWS-BRIS til FS GraphQL API
⚠ Denne tjenesten avvikles etter 31. mars 2027. Nye integrasjoner bør bygges direkte på FS GraphQL API. Se Sikts avviklingspraksis og avviklingsloggen. Kilde: Overføring til SiO/BRIS
FSWS-BRIS tilbyr studentdata til studentsamskipnader og andre systemer som trenger studentinformasjon, gjennom SOAP-metodene getBrisData/getBrisDataAsAttachment og REST-endepunktene under /fsrest/rest/bris/:
- Henting av alle studenter (full eksport)
- Inkrementell synkronisering basert på endringer
- Oppslag på enkeltstudenter
- Eksport til samskipnader basert på ny studierett eller betalt semesteravgift
Denne guiden hjelper deg migrere 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, 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
Hvert eksempel under er merket med kontraktsnivå rett over kodeblokken. stable virker uten videre. beta og experimental krever headeren Feature-Flags: beta,experimental, og experimental-felt kan endres eller forsvinne uten varsel.
Kjernefunksjonaliteten i denne guiden — full eksport, samskipnad-eksport og betalingsform — hviler i praksis p å beta- og experimental-felt, fordi det er der BRIS' behov ligger i dagens skjema. Det finnes ingen egen unntaksordning for BRIS-konsumenter: samme regel gjelder som for alle andre GraphQL-konsumenter. Trenger du et av feltene stabilt i en produksjonsintegrasjon, ta kontakt med fs-support@sikt.no og beskriv behovet.
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-BRIS?
Delvis. Nøkkelverdier som studentnr er uendret — StudentVedLarested.studentnummer gir nøyaktig samme verdi som BRIS sin studentnr, og kan brukes direkte som argument til studenterGittStudentnumre. GraphQL sin egen id (node-IDen) er derimot ny og har ingen motpart i BRIS — behandle den som ugjennomsiktig, ikke konstruer den selv. Trenger du id-feltet til en senere, mer avgrenset spørring, se Trenger du GraphQL-IDen for studenten? under.
Tilgang (RAS): studenthendelser krever flere roller enn ett BRIS-uttrekk
FSWS-BRIS' REST-endepunkter krever i dag én samlerolle (bris-roller), som gir tilgang til hele uttrekket. FS GraphQL API styrer i stedet tilgang på radnivå med Oracle RAS (se Tilgangsstyring med RAS) — og for studenthendelser er tilgangen delt opp per hendelseskategori, ikke én samlerolle. Dette er en bevisst, eksisterende designbeslutning i FS GraphQL API, ikke noe som er særskilt for BRIS-migreringen.
Viktig: mangler du rolle for en hendelseskategori, feiler ikke spørringen — den returnerer bare færre rader, uten varsel eller feilmelding. Dette er lik oppførsel for alle GraphQL-konsumenter, ikke noe BRIS-uttrekket får spesialbehandling for. Sjekk totalCount opp mot forventet volum hvis noe virker for lavt.
For hendelsestypene som brukes i denne guiden, trenger du disse tre rollene i tillegg til standardrollen STUDIEELEMENTER_LES1 (som alle får automatisk, men som ikke dekker persondata-hendelser):
Be om alle tre rollene når du bestiller tilgang for en BRIS-migrering. Se tilgjengelige roller for full oversikt og bestillingsrutine.
Oversikt over endepunkter og erstatninger
GET /bris/sia/student/:studentnr - Hent enkelt student
Kontraktsnivå: beta (betalingsform og harBetaltSemesteravgiftV2 — se merknad under eksempelet)
For å hente data om en enkelt student basert på studentnummer, bruk studenterGittStudentnumre.
FSWS-BRIS XML-respons:
<bris_studenter>
<student>
<studentnr>12345678</studentnr>
<navn>
<fornavn>Ola</fornavn>
<etternavn>Nordmann</etternavn>
</navn>
<adresse>
<co>c/o Hansen</co>
<gate>Storgata 1</gate>
<postnr>0150</postnr>
<sted>OSLO</sted>
<land>NO</land>
</adresse>
<telefon>
<mobil>47-91234567</mobil>
<hjem>47-22334455</hjem>
</telefon>
<epost>ola@example.com</epost>
<fodselsdato>01-01-80</fodselsdato>
<dato_fodt>01-01-1980</dato_fodt>
<semesterregistrering>
<sist_bet_semavgift>20251</sist_bet_semavgift>
<fritak_semavgift>N</fritak_semavgift>
</semesterregistrering>
</student>
</bris_studenter>
FS GraphQL API spørring:
query HentStudent {
studenterGittStudentnumre(
eierOrganisasjonskode: "1234"
studentnumre: ["12345678"]
) {
studentnummer
personProfil {
navn {
fornavn
etternavn
}
fodselsdato
folkeregistrertAdresse {
co
gate
postnummerOgSted
land
}
mobilTelefon {
landnummer
nummer
}
privatTelefon {
landnummer
nummer
}
privatEpost
}
semesterregistreringer {
nodes {
termin {
arstall
betegnelse {
kode
}
}
harBetaltSemesteravgiftV2
betalingsform {
navnAlleSprak {
und
}
}
}
}
}
}
Eksempel på respons:
{
"data": {
"studenterGittStudentnumre": [
{
"studentnummer": "12345678",
"personProfil": {
"navn": {
"fornavn": "Ola",
"etternavn": "Nordmann"
},
"fodselsdato": "1980-01-01",
"folkeregistrertAdresse": {
"co": "c/o Hansen",
"gate": "Storgata 1",
"postnummerOgSted": "0150 OSLO",
"land": "Norge"
},
"mobilTelefon": {
"landnummer": "47",
"nummer": "91234567"
},
"privatTelefon": {
"landnummer": "47",
"nummer": "22334455"
},
"privatEpost": "ola@example.com"
},
"semesterregistreringer": {
"nodes": [
{
"termin": {
"arstall": 2025,
"betegnelse": {
"kode": "VÅR"
}
},
"harBetaltSemesteravgiftV2": true,
"betalingsform": {
"navnAlleSprak": {
"und": "Ordinær"
}
}
}
]
}
}
]
}
}
Merk formatforskjeller:
lander en ISO-landkode i BRIS (NO), men fritekst landnavn i GraphQL (Norge) — ikke en direkte streng-ekvivalens.harBetaltSemesteravgiftV2erstable, menbetalingsform(erstatning forfritak_semavgift) erbeta. Trenger du kun å vite om studenten er fritatt, seerFritattForSemesteravgift(experimental) under Feltmapping.
Trenger du GraphQL-IDen for studenten?
studenterGittStudentnumre returnerer dataene direkte, men trenger du selve id-feltet for StudentVedLarested (for eksempel til en senere, mer avgrenset spørring), be om det i samme kall:
query FinnIdGittStudentnummer {
studenterGittStudentnumre(
eierOrganisasjonskode: "1234"
studentnumre: ["12345678"]
) {
id
}
}
GET /bris/sia/alle - Full eksport av alle studenter
Kontraktsnivå: experimental (Query.semesterregistreringer som rotspørring finnes kun på experimental-nivå)
For å hente alle studenter kan du bruke semesterregistreringer med paginering.
Dette gir deg tilgang til alle semesterregistrerte studenter.
Viktige forskjeller:
- GraphQL bruker cursor-basert paginering
- Du må hente data i batches ved å bruke
afterogfirstparametere - Responsen er JSON i stedet for XML-strøm
Eksempel på spørring:
query HentAlleStudenter($after: String) {
semesterregistreringer(
filter: {
eierOrganisasjonskode: "1234"
terminkoder: [{ arstall: 2025, betegnelse: VAR }]
harBetaltSemesteravgift: true
}
first: 100
after: $after
) {
pageInfo {
hasNextPage
endCursor
}
totalCount
nodes {
student {
studentnummer
personProfil {
navn {
fornavn
etternavn
}
fodselsdato
folkeregistrertAdresse {
co
gate
postnummerOgSted
land
}
mobilTelefon {
landnummer
nummer
}
privatEpost
}
semesterregistreringIInnevarendeSemester {
harBetaltSemesteravgiftV2
erSemesterregistrert
}
}
}
}
}
For å hente alle studenter, gjør gjentatte kall med after satt til endCursor fra forrige respons, inntil hasNextPage er false.
GET /bris/sia/alle/endringer/:timestamp - Inkrementell synkronisering
For å hente studenter som er endret siden et gitt tidspunkt, bruk studenthendelser. Dette gir deg et hendelsesbasert system som er mer presist enn timestamp-basert filtrering. 7 døgns hendelsesretensjon gjelder — les mer under Viktige forskjeller.
Viktige forskjeller:
- Hendelsesbasert i stedet for timestamp-basert
- Du kan filtrere på spesifikke hendelsestyper
- Gir mer presis informasjon om hva som er endret
- Hendelser lagres kun 7 døgn. Har det gått lenger siden forrige synkronisering, må du falle tilbake på en full eksport for å hente opp igjensittende endringer. Se FS GraphQL API: Hendelser
Relevante hendelsestyper for BRIS-data:
Ikke SEMESTERREGISTRERING_STATUS_BET_OK — denne hendelsestypen finnes ikke. Riktig hendelse for betalt semesteravgift er SEMESTERAVGIFT_BETALT (experimental).
Merk: hvorvidt STARTET_PA_STUDIEPROGRAM faktisk tilsvarer BRIS' begrep «studentpost opprettet» er ikke verifisert her — sjekk mot egen bruk av GET /bris/sia/alle/opprettet/:timestamp før du legger denne til grunn i produksjon.
Eksempel på spørring (Feature-Flags: beta,experimental):
query HentStudentendringer($after: String) {
studenthendelser(
filter: {
eierOrganisasjonskode: "1234"
hendelsestype: [
ENDRET_NAVN
ENDRET_FOLKEREGISTRERT_ADRESSE
ENDRET_MOBILNUMMER
ENDRET_EPOSTADRESSE
SEMESTERREGISTRERT
SEMESTERAVGIFT_BETALT
]
}
first: 100
after: $after
) {
pageInfo {
hasNextPage
endCursor
}
nodes {
hendelsestype
tidspunkt
student {
studentnummer
personProfil {
navn {
fornavn
etternavn
}
folkeregistrertAdresse {
co
gate
postnummerOgSted
land
}
mobilTelefon {
landnummer
nummer
}
privatEpost
}
semesterregistreringIInnevarendeSemester {
harBetaltSemesteravgiftV2
erSemesterregistrert
}
}
}
}
}
Eksempel på respons:
{
"data": {
"studenthendelser": {
"pageInfo": {
"hasNextPage": true,
"endCursor": "eyJjdXJzb3IiOiIxMjM0NTY3ODkwIn0="
},
"nodes": [
{
"hendelsestype": "SEMESTERREGISTRERT",
"tidspunkt": "2025-01-15T10:30:00Z",
"student": {
"studentnummer": "12345678",
"personProfil": {
"navn": {
"fornavn": "Ola",
"etternavn": "Nordmann"
},
"folkeregistrertAdresse": {
"co": null,
"gate": "Storgata 1",
"postnummerOgSted": "0150 OSLO",
"land": "Norge"
},
"mobilTelefon": {
"landnummer": "47",
"nummer": "91234567"
},
"privatEpost": "ola@example.com"
},
"semesterregistreringIInnevarendeSemester": {
"harBetaltSemesteravgiftV2": true,
"erSemesterregistrert": true
}
}
}
]
}
}
}
GET /bris/samskipnad/studenter/endringer - Samskipnad-eksport
Dette endepunktet returnerer studenter basert på to kriterier:
- Studenter med ny studierett - alle som er tildelt studierett de siste to måneder (jf. FSWS-BRIS' egen dokumentasjon)
- Studenter som har betalt semesteravgift - alle som har betalt semesteravgift i inneværende termin
studenthendelser har ikke noe datofilter i hendelsesfilteret i det hele tatt — verken for «siste 60 dager» eller «siste to måneder» kan gjenskapes direkte der. Kriterium 1 er likevel løsbart i stabil kontrakt via programStudieretter, mens kriterium 2 (betalt semesteravgift) i dag kun finnes på beta/experimental-nivå.
Studenter med ny studierett — stabil kontrakt:
Bruk rotspørringen programStudieretter (ikke StudentVedLarested.programStudieretter — den nøstede varianten har ikke dette filteret) med erAktivInnenforPeriode. Merk: filteret tester om studierettens hele aktive periode overlapper det oppgitte vinduet, ikke om den ble tildelt i vinduet — en studierett fra flere år tilbake som fortsatt er aktiv vil også være med i treffet. For å isolere kun nytildelte studieretter (BRIS-kriteriet), filtrer/sorter resultatet på studierettperiode.fraDato i klienten — det feltet er selve tildelingsdatoen (DATO_STUDIERETT_TILDELT).
query HentNyeStudieretter(
$fraDato: Date!
$tilDato: Date!
$after: String
) {
programStudieretter(
filter: {
eierOrganisasjonskode: "1234"
erAktivInnenforPeriode: { fraDato: $fraDato, tilDato: $tilDato }
}
first: 100
after: $after
) {
pageInfo {
hasNextPage
endCursor
}
nodes {
studierettperiode {
fraDato
tilDato
}
studentstatus {
kode
girAktivStudierett
}
student {
studentnummer
personProfil {
navn {
fornavn
etternavn
}
fodselsdato
}
}
}
}
}
Betalt semesteravgift (Feature-Flags: beta,experimental):
query HentBetaltSemesteravgift($after: String) {
studenthendelser(
filter: {
eierOrganisasjonskode: "1234"
hendelsestype: [SEMESTERAVGIFT_BETALT]
}
first: 100
after: $after
) {
pageInfo {
hasNextPage
endCursor
}
nodes {
hendelsestype
tidspunkt
student {
studentnummer
personProfil {
navn {
fornavn
etternavn
}
fodselsdato
}
semesterregistreringIInnevarendeSemester {
harBetaltSemesteravgiftV2
erSemesterregistrert
}
}
}
}
}
Feltmapping fra FSWS-BRIS til FS GraphQL API
Alternative oppslag
Oppslag basert på fødselsnummer
Kontraktsnivå: experimental (studenterGittFodselsnumre)
Hvis du har fødselsnummer i stedet for studentnummer:
query HentStudentMedFodselsnummer {
studenterGittFodselsnumre(
eierOrganisasjonskode: "1234"
fodselsnumre: ["01018012345"]
) {
id
studentnummer
personProfil {
navn {
fornavn
etternavn
}
fodselsdato
}
}
}
Hva om mitt behov ikke er dekket?
Vi varsler normalt ikke avvikling av hele eller deler av et API før tilsvarende funksjonalitet er på plass i FS GraphQL API. Opplever du likevel at behovet ditt ikke er dekket — eller er avhengig av funksjonalitet på experimental-nivå som du trenger stabilisert — ta kontakt med fs-support@sikt.no og beskriv behovet.