Gå til hovedinnhold

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:

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):

RAS-roller for hendelsestypene brukt i denne guiden
RolleDekker hendelsestyper
STUDENTDATA_HENDELSER_LES1ENDRET_NAVN, ENDRET_FOLKEREGISTRERT_ADRESSE, ENDRET_POSTADRESSE, ENDRET_MOBILNUMMER, ENDRET_EPOSTADRESSE
STUDENT_SEMESTERREGISTRERING_HENDELSER_LES1SEMESTERREGISTRERT, SEMESTERREGISTRERING_UGYLDIGGJORT, SEMESTERAVGIFT_BETALT, STUDENT_FRITATT_FRA_SEMESTERAVGIFT
STUDENT_STUDIERETT_HENDELSER_LES1STARTET_PA_STUDIEPROGRAM, SLUTTET_PA_STUDIEPROGRAM, PROGRAM_STUDIERETT_OPPRETTET

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​

Mapping av FSWS-BRIS-endepunkter til FS GraphQL API
FSWS-BRIS endepunktFS GraphQL API erstatning
GET /bris/sia/alleQuery.semesterregistreringer
GET /bris/sia/alle/endringer/:timestampQuery.studenthendelser
GET /bris/sia/alle/opprettet/:timestampQuery.studenthendelser med hendelsestype STARTET_PA_STUDIEPROGRAM
GET /bris/sia/student/:studentnrQuery.studenterGittStudentnumre
GET /bris/samskipnad/studenter/endringerQuery.studenthendelser
getBrisData / getBrisDataAsAttachment (SOAP)Query.semesterregistreringer

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:

  • land er en ISO-landkode i BRIS (NO), men fritekst landnavn i GraphQL (Norge) — ikke en direkte streng-ekvivalens.
  • harBetaltSemesteravgiftV2 er stable, men betalingsform (erstatning for fritak_semavgift) er beta. Trenger du kun å vite om studenten er fritatt, se erFritattForSemesteravgift (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 after og first parametere
  • 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:

Hendelsestyper brukt i denne guiden, med kontraktsnivå og RAS-rolle
HendelsestypeBetydningKontraktsnivåRAS-rolle
ENDRET_NAVNNavneendringbetaSTUDENTDATA_HENDELSER_LES1
ENDRET_FOLKEREGISTRERT_ADRESSEFolkeregistrert adresse endret (tilsvarer hjemstedsadresse i BRIS)betaSTUDENTDATA_HENDELSER_LES1
ENDRET_POSTADRESSEPostadresse endretbetaSTUDENTDATA_HENDELSER_LES1
ENDRET_MOBILNUMMERMobilnummer endretbetaSTUDENTDATA_HENDELSER_LES1
ENDRET_EPOSTADRESSEE-post endretbetaSTUDENTDATA_HENDELSER_LES1
SEMESTERREGISTRERTStudent har semesterregistrert segbetaSTUDENT_SEMESTERREGISTRERING_HENDELSER_LES1
SEMESTERREGISTRERING_UGYLDIGGJORTSemesterregistrering ugyldiggjortexperimentalSTUDENT_SEMESTERREGISTRERING_HENDELSER_LES1
SEMESTERAVGIFT_BETALTSemesteravgift betaltexperimentalSTUDENT_SEMESTERREGISTRERING_HENDELSER_LES1
STARTET_PA_STUDIEPROGRAMStudent startet på studieprogrambetaSTUDENT_STUDIERETT_HENDELSER_LES1
SLUTTET_PA_STUDIEPROGRAMStudent sluttet på studieprogramstableSTUDENT_STUDIERETT_HENDELSER_LES1

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:

  1. Studenter med ny studierett - alle som er tildelt studierett de siste to måneder (jf. FSWS-BRIS' egen dokumentasjon)
  2. 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​

Feltmapping fra FSWS-BRIS til FS GraphQL API
FSWS-BRIS feltFS-database (kilde)FS GraphQL API felt
studentnrStudent.Studentnr_TildeltStudentVedLarested.studentnummer
navn/fornavnPerson.FornavnPersonProfil.navn.fornavn
navn/etternavnPerson.EtternavnPersonProfil.navn.etternavn
adresse/coPerson.Adrlin1_HjemstedPersonProfil.folkeregistrertAdresse.co
adresse/gatePerson.Adrlin2_HjemstedPersonProfil.folkeregistrertAdresse.gate
adresse/postnrPerson.Postnr_HjemstedPersonProfil.folkeregistrertAdresse.postnummerOgSted (inneholder postnr + sted)
adresse/stedPerson.Adrlin3_Hjemsted (sted ekstrahert)PersonProfil.folkeregistrertAdresse.postnummerOgSted (inneholder postnr + sted)
adresse/landPerson.Adresseland_HjemstedPersonProfil.folkeregistrertAdresse.land — format endres: ISO-landkode (NO) blir fritekst landnavn (Norge)
telefon/mobilPersonTelefon (MOBIL)PersonProfil.mobilTelefon.nummer + landnummer
telefon/hjemPersonTelefon (HJEM)PersonProfil.privatTelefon.nummer + landnummer
epostPerson.EmailadressePersonProfil.privatEpost
fodselsdatoPerson.Dato_Fodt (format: DD-MM-YY)PersonProfil.fodselsdato (ISO 8601: YYYY-MM-DD)
dato_fodtPerson.Dato_Fodt (format: DD-MM-YYYY)PersonProfil.fodselsdato (ISO 8601: YYYY-MM-DD)
semesterregistrering/sist_bet_semavgiftRegisterkort.Arstall + TerminkodeSemesterregistrering.termin.arstall + termin.betegnelse.kode
semesterregistrering/fritak_semavgiftRegisterkort.Betformkode = 'FRITATT'Semesterregistrering.erFritattForSemesteravgift (experimental) — dekker feltet direkte, se merknad om betalingsform (beta) over

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.