In English →

Altinn 3, Maskinporten og systembruker — slik fungerer maskinell innsending

Slik sender et fagsystem skattekort, MVA-melding, a-melding, skattemelding og årsregnskap maskinelt på vegne av kundene sine — forklart steg for steg. Hver seksjon starter med en kort oppsummering i hverdagsspråk; detaljene (scopes, tokens, API-kall) kommer etterpå for deg som skal bygge det samme. Fallgruvene på slutten er ting vi selv har gått i, så du slipper.

Hva integrasjonen gjør

Ikke teknisk? Hopp rett til «I klartekst — forklart uten sjargong» lenger ned, så slipper du fagspråket og får hele bildet med hverdagsord.

Macct sender inn til det offentlige på vegne av kunden, uten at kunden deler passord eller logger inn manuelt. Følgende går maskinelt:

  • Skattekort til arbeidsgiver — henter fra Skatteetaten hvor mye skatt som skal trekkes av de ansattes lønn.
  • MVA-melding — momsoppgaven; leveres via en Altinn 3-app hos Skatteetaten.
  • Næringsspesifikasjon + skattemelding (AS) — tallgrunnlaget (tidligere kalt RF-1167) og selve skattemeldingen for aksjeselskapet.
  • Årsregnskap — sendes som skjema RR0002 til Regnskapsregisteret i Brønnøysund via Altinn.
  • A-melding — den månedlige lønns- og skatterapporten; leveres som JSON direkte til Skatteetatens innrapporterings-API (den gamle Altinn 2-kanalen stengte 15. juni 2026).
  • Aksjonærregisteroppgave — oversikten over hvem som eier aksjene i selskapet. RF-1086 bygges i Skatteetatens offisielle skjemaformat og sendes til det nye aksjonærregister-API-et i en 3-stegs flyt (hovedskjema → ett underskjema per aksjonær → bekreft).

Tre byggeklosser gjør dette mulig: Maskinporten (et slags ID-kort som lar én datamaskin bevise hvem den er overfor en annen — driftet av staten ved Digdir), en systembruker (fullmakten du gir Macct, godkjent med BankID i Altinn), og Altinn / Skatteetaten (der innsendingen faktisk leveres). Organisasjonsregisteret hos Brønnøysundregistrene brukes til å sjekke organisasjonsnummeret, rollen din og at selskapet er i orden når du registrerer deg. Alle tre er forklart nærmere rett under.

Macctfagsystemet
MaskinportenID-kort for maskinen
Altinn Authenticationtoken-utveksling
Systembrukerdin fullmakt
Altinn-app / Skatteetaten APIinnsending
Kvitteringtilbake til Macct
Forenklet flyt: Macct beviser hvem maskinen er (Maskinporten), knytter det til din fullmakt (systembruker), leverer via Altinn / Skatteetaten og får en kvittering tilbake.

I klartekst — forklart uten sjargong

Det meste av siden er teknisk. Her er det samme forklart på vanlig norsk, med et bilde du kjenner igjen fra hverdagen.

Tenk på det offentlige — Skatteetaten, Brønnøysund — som en samling låste kontorer der du leverer papirer. Til vanlig går du dit selv, logger inn med BankID og leverer. Macct gjør den jobben for deg. Men for at en datamaskin skal få slippe inn og levere på dine vegne, må tre ting være på plass:

  • 1. Et legitimasjonskort for maskiner (Maskinporten). Akkurat som du viser BankID, må Macct-maskinen bevise hvem den er. Maskinporten — en statlig tjeneste fra Digdir — gir Macct et digitalt «ID-kort» som fornyes automatisk. Ingen mennesker logger inn; det er maskin-snakker-med-maskin.
  • 2. En fullmakt fra deg (systembruker). ID-kortet sier bare «dette er Macct». Det sier ikke at Macct får handle for nettopp ditt selskap. Derfor signerer du én gang med BankID en fullmakt: «Macct får levere MVA, årsregnskap og lignende for selskapet mitt.» Denne fullmakten kalles en systembruker. Den er avgrenset til akkurat det som står i den, den er sporbar, og du kan trekke den tilbake når som helst.
  • 3. Selve leveringsluka (Altinn / Skatteetatens API-er). Med ID-kort og fullmakt i hånd går Macct til riktig «luke» hos det offentlige, leverer dokumentet og får en kvittering tilbake.

Kort oppsummert: Maskinporten = hvem maskinen er. Systembruker = hva den får lov til, og for hvem. Altinn = hvor den leverer. Resten av siden er detaljene bak hver av disse tre.

Hva merker du som kunde? Nesten ingenting. Du godkjenner én lenke med BankID den aller første gangen. Etterpå fører Macct regnskapet og forbereder innsendingene, og du trykker «send» når du selv er klar. Ingenting går automatisk — verken til Skatteetaten eller Brønnøysund — uten at du har godkjent det.

Liten ordliste

Resten av siden bruker disse ordene om og om igjen. Har du dem, leser du alt annet uten å stoppe opp.

OrdBetyr
TokenEt tidsbegrenset digitalt adgangskort. Maskinen viser det i hvert API-kall i stedet for brukernavn og passord.
ScopeHva et token gir lov til — f.eks. «hente skattekort» eller «skrive til Altinn-instanser». Et token har bare de scopene klienten har fått tildelt på forhånd.
SystembrukerFullmakten et selskap gir et fagsystem i Altinn, godkjent med BankID. Den sier hvem systemet får handle for.
TilgangspakkeEn rollebasert «bunt» av tilganger i Altinn (f.eks. «merverdiavgift») som enkelte apper krever i tillegg til konkrete rettigheter.
InstansÉn konkret innsending i en Altinn 3-app — en «mappe» som får opplastede dokumenter og drives gjennom prosess-steg til kvittering.
KonvoluttXML-innpakningen rundt selve skattemeldingen ved innsending: hvem den gjelder, hvilket år, og referansen til Skatteetatens eget utkast.
PartsnummerSkatteetatens interne nummer på en skattepliktig part. Ligner et organisasjonsnummer, men er det ikke — det hentes fra API-et deres.

Digdir / Maskinporten: klient, JWT-grant og scopes

Kort fortalt: Macct ber staten om et midlertidig adgangskort ved å vise et signert digitalt «stempel». Kortet gjelder bare de oppgavene Macct har fått godkjent på forhånd — kalt scopes — for eksempel å hente skattekort eller levere MVA.

Tre ting å vite om Maskinporten:

  • Én klient per miljø. Test og produksjon er helt adskilte verdener med hver sin klient, hver sin nøkkel og hver sin scope-tildeling.
  • Autentisering med signert nøkkel. Klienten beviser hvem den er med en nøkkel registrert i Digdirs Samarbeidsportal — ingen passord noe sted.
  • Token per behov. Klienten signerer en kort JWT («her er jeg, og jeg vil ha disse scopene») og bytter den mot et access token som varer i noen minutter.
POST https://maskinporten.no/token
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&
assertion=<signert JWT: iss=clientId, aud=maskinporten, scope=...>

Scopene vi bruker

ScopeTil hva
skatteetaten:skattekorttilarbeidsgiverHente elektronisk skattekort
skatteetaten:mvameldingvalideringForhåndsvalidering av MVA-melding (se fallgruve)
skatteetaten:mvameldinginnsendingInnsending av MVA-melding (Skatteetatens scope-krav, i tillegg til Altinn-appen)
skatteetaten:innrapporteringameldingSende a-melding og hente tilbakemelding (Skatteetatens innrapporterings-API)
skatteetaten:innrapporteringaksjonaerregisteroppgaveSende aksjonærregisteroppgaven (RF-1086, 3-stegs flyt)
skatteetaten:formueinntekt/skattemeldingHente gjeldende skattemelding/utkast — kreves for konvolutt-referansen ved innsending av skattemeldingen (se per tjeneste-seksjonen)
altinn:instances.writeOpprette/skrive Altinn 3-app-instanser (MVA, skattemelding, årsregnskap)
altinn:authentication/systemregister.writeRegistrere/oppdatere systemet i System Register
altinn:authentication/systemuser.request.read / .writeOpprette og lese systembruker-forespørsler
Greit å vite: scope-navnene er bokstavelige. Det riktige er skatteetaten:skattekorttilarbeidsgiver — et lite avvik gir invalid_scope og null forklaring. Maskinporten avviser dessuten hele token-forespørselen hvis bare ett scope i settet mangler tildeling, så test- og prod-klienten bør ha hvert sitt scope-sett (prod-klienten har f.eks. innsendings-scopene for MVA og a-melding som test-klienten ennå ikke har fått delegert).
Ikke alle scopes er selvbetjente. Flere av Skatteetaten-scopene — deriblant skatteetaten:formueinntekt/skattemelding og altinn:instances.read i produksjon — kan ikke legges til selv i Samarbeidsportalen; de må tildeles av scope-eieren (Skatteetaten/Digdir) etter forespørsel. Frem til tildelingen er på plass svarer Maskinporten invalid_scope på token-forespørselen. Planlegg dette tidlig: selve tildelingen er rask, men den skjer per miljø — og det er lett å tro at «begge er satt» når bare det ene miljøet faktisk fikk den.

Systembruker: System Register, request og BankID-godkjenning

Kort fortalt: Dette er selve fullmakten din, og den settes opp i tre steg: Macct registrerer seg som «system» hos Altinn (gjøres bare én gang), lager så en forespørsel for ditt selskap, og til slutt godkjenner du den med BankID. Først da kan Macct levere på vegne av deg.

En systembruker er kundens fullmakt til fagsystemet i Altinn. Flyten er tre steg:

1. Registrer systemet (én gang per miljø)

Fagsystemet registreres i Altinns System Register med en systID på formen <leverandør-orgnr>_macct, klient-ID-en(e) fra Maskinporten, og hvilke rettigheter og tilgangspakker systemet forvalter.

POST {altinn}/authentication/api/v1/systemregister/vendor
{ "id": "<orgnr>_macct", "vendor": { "ID": "0192:<orgnr>" },
  "clientId": ["..."], "rights": [...], "accessPackages": [...],
  "allowedRedirectUrls": ["https://macct.no/altinn/callback"] }

2. Opprett en systembruker-forespørsel per kunde

POST {altinn}/authentication/api/v1/systemuser/request/vendor
{ "systemId": "<orgnr>_macct",
  "partyOrgNo": "<kundens orgnr>",
  "externalRef": "selskap-123",
  "rights": [ { "resource": [ { "id": "urn:altinn:resource", "value": "app_skd_formueinntekt-skattemelding-v2" } ] }, ... ],
  "accessPackages": [ { "urn": "urn:altinn:accesspackage:merverdiavgift" }, ... ],
  "redirectUrl": "https://macct.no/altinn/callback" }
→ svar inneholder en confirmUrl (am.ui.altinn.no/.../systemuser/request?id=...)

3. Kunden godkjenner med BankID

Kunden åpner confirmUrl og godkjenner i Altinn. Etter godkjenning slås den faktiske systembrukeren opp («bysystem»-listen), og en systemUserId lagres på kunden. Den brukes ikke direkte i tokenet — selve fullmakten bæres av externalRef + kundens orgnr (under).

Greit å vite: externalRef må være unik per systembruker. Skal en kunde få en ny systembruker (f.eks. ved utvidet tilgang) uten å miste den gamle, må den nye opprettes med en annen externalRef — ellers svarer Altinn at det allerede finnes en systembruker for system-ID-en. En ryddig konvensjon (selskap-123, selskap-123-mva) holder dette oversiktlig.

Tilgangspakker vs. rettigheter (rights)

Kort fortalt: Altinn krever to slags tilgang samtidig — en bred «rolle-pakke» (at Macct får jobbe med regnskap og MVA i det hele tatt) og en konkret «nøkkel» til hver enkelt tjeneste. Mangler én av de to, blir leveringen avvist. Macct setter opp begge for deg.

Altinn 3 skiller mellom to fullmaktstyper, og innsending krever ofte begge:

  • Rettigheter (rights) — peker på en konkret ressurs/app, f.eks. app_skd_formueinntekt-skattemelding-v2 (skattemelding), app_brg_aarsregnskap-vanlig-202406 (årsregnskap), ske-innrapportering-amelding (a-melding).
  • Tilgangspakker (access packages) — rollebaserte «bunter» som Altinns policy-motor (PDP) krever for å instansiere enkelte apper. Vi bruker urn:altinn:accesspackage:regnskap-okonomi-rapport og urn:altinn:accesspackage:merverdiavgift.
Greit å vite: en tilgangspakke må ligge på systemet i samme miljø (test vs. prod) før en systembruker-forespørsel kan be om den — ellers svarer Altinn AUTH-00063 «accesspackage is not found in the referenced system». System Register er miljødelt, så pakker lagt i test må også legges i prod. Bare rettigheter (uten tilgangspakke) gir gjerne 403 fra PDP-en når appen skal instansieres.

Tokens: Maskinporten-token og Altinn-token-utveksling

Kort fortalt: Adgangskortet fra Maskinporten byttes inn i et «hus-spesifikt» kort hos Altinn, og knyttes til fullmakten din slik at leveringen havner på riktig selskap. Test-selskap og ekte selskap bruker hvert sitt system — de må aldri blandes, ellers finner ikke Altinn fullmakten.

For å handle på vegne av en annen virksomhet enn klient-eieren binder vi tokenet til systembrukeren via authorization_details (RAR-typen urn:altinn:systemuser):

authorization_details = [{
  "type": "urn:altinn:systemuser",
  "systemuser_org": { "authority": "iso6523-actorid-upis", "ID": "0192:<kundens orgnr>" },
  "externalRef": "selskap-123"
}]

Maskinporten-tokenet byttes deretter mot et Altinn-token for å nå Storage/App-API-ene:

GET {altinn}/authentication/api/v1/exchange/maskinporten
Authorization: Bearer <maskinporten-token med altinn:instances.write>
→ Altinn-JWT brukt mot app-instanser

Hvilket token mot hvilket API?

Den vanligste feilkilden i praksis er å bruke feil type token mot feil API. Regelen er enkel når man først ser den:

APIRiktig token
Altinn 3-app-instanser (MVA-melding, skattemelding, årsregnskap)Altinn-token — Maskinporten-tokenet vekslet hos Altinn (kallet over)
Skatteetatens direkte API-er (skattekort, a-melding, aksjonærregister, hentSkattemelding)Rått Maskinporten-token, systembruker-bundet — uten Altinn-veksling
Symptomet når det byttes om: et Altinn-vekslet token mot et av Skatteetatens direkte API-er gir 401 med «None of the configured JWK keys match the received JWT token» — Skatteetaten validerer mot Maskinportens nøkler og kjenner ikke Altinns signatur. Og motsatt: et rått Maskinporten-token når ikke Altinns app-API-er. Tokenet er aldri «litt riktig» — det er riktig utsteder for riktig mottaker.
Greit å vite: prod- og test-selskap rutes til hvert sitt miljø — prod-kunder mot maskinporten.no + platform.altinn.no, test/demo mot test.maskinporten.no + platform.tt02.altinn.no. Blandes miljøene, resolver ikke systembrukeren (404 / MP-303). Vi velger miljø per selskap, ikke globalt.

Per tjeneste: API-kall og parametere

Skattekort til arbeidsgiver

Direkte mot Skatteetatens «Skattekort for arbeidsgivere» (v3, forskudd-API) med et systembruker-bundet Maskinporten-token og scope skatteetaten:skattekorttilarbeidsgiver. Vert: api.skatteetaten.no (prod) / api-test.sits.no (test). Parametere: inntektsår, arbeidsgivers orgnr og den ansattes fødselsnummer. Svar: trekktype (tabell/prosent), tabellnummer og trekkprosent — som skrives på den ansatte og brukes i lønnskjøringen.

MVA-melding

Leveres via Altinn 3-appen mva-melding-innsending-v1 (instances.write + systembruker), ikke det avviklede direkte-API-et. To XML-dokumenter bygges: selve meldingen (mvamelding, namespace skattemeldingformerverdiavgift) og en innsendings-wrapper (mvameldinginnsending). Flyt:

1) POST .../instances              (opprett instans, instanceOwner = kundens orgnr)
2) PUT/POST data: mvamelding + wrapper  (erstatt auto-opprettet element)
3) PUT .../process/next            (data → confirmation → feedback)
→ kvittering: instanceOwnerPartyId/instanceGuid

Meldingen inneholder bl.a. skattleggingsperiode (to-måneders termin + år), fastsattMerverdiavgift, mvaSpesifikasjonslinje[], meldingskategori=alminnelig og skattepliktig>organisasjonsnummer. Valgfri forhåndsvalidering finnes på /api/mva/grensesnittstoette/mva-melding/valider.

A-melding

Leveres som JSON direkte til Skatteetatens innrapporterings-API — den gamle Altinn 2-kanalen (A02) stengte 15. juni 2026. Macct bygger det offisielle Leveranse-objektet fra lønnskjøringen: inntekter per mottaker, forskuddstrekk og utleggstrekk (negative per mottaker, positive summer i betalingsinformasjon) og arbeidsgiveravgift per sone — med OTP-premien som egen grunnlagslinje (tilskuddOgPremieTilPensjon), slik kodeverket krever. Tokenet er systembruker-bundet med scope skatteetaten:innrapporteringamelding.

POST /v1/innsending/{periode}/{opplysningspliktig}   (Leveranse-JSON + idempotencyKey-header)
GET  /v1/forsendelser/{forsendelseId}                (tilbakemelding når den er klar)

Tilbakemeldingen brukes til avstemming: Skatteetatens beregnede forskuddstrekk og arbeidsgiveravgift, KID/kontonummer og forfallsdato, pluss eventuelle avvik med alvorlighetsgrad. Som alt annet sendes a-meldingen aldri automatisk — den valideres først, og et menneske trykker «send».

Aksjonærregisteroppgave (RF-1086)

Leveres til Skatteetatens aksjonærregister-API i en 3-stegs flyt, i det offisielle skjemaformatet (hovedskjema 890/RF-1086 + ett underskjema 923/RF-1086-U per aksjonær, validert mot Skatteetatens XSD-er). Tokenet er systembruker-bundet med scope skatteetaten:innrapporteringaksjonaerregisteroppgave; hvert kall har påkrevd idempotencyKey.

1) POST /{aar}/1086H                          → hovedskjemaid
2) POST /{aar}/{hovedskjemaid}/1086U          (ett kall per aksjonær)
3) POST /{aar}/{hovedskjemaid}/bekreft?antall_underskjema=N → forsendelseId

Oppgaven følger samme godkjenningsløp som skattemeldingen (utkast → gjennomgang → godkjenn → send, med SHA-256-integritetskontroll) og sendes aldri automatisk. VPS-registrerte selskap blokkeres (VPS rapporterer for dem); selskap med flere aksjeklasser eller hendelser som fusjon/fisjon/ spleis henvises inntil videre til skatteetaten.no.

Årsregnskap (RR0002)

Leveres til Regnskapsregisteret via Altinn-appen app_brg_aarsregnskap-vanlig-202406:

  • To dokumenter lastes opp: Hovedskjema (RR0002H_M — metadata) og Underskjema (RR0002U_M — resultat/balanse med detaljlinjer).
  • Signeringen krever en person. Systemet fører prosessen frem til signeringssteget, men selve signeringen kan ikke utføres av en systembruker — Regnskapsregisteret krever av juridiske hensyn at en person signerer med ID-porten i Altinn (systembruker-signering avvises med 403). Fagsystemet klargjør og låser alt, personen signerer, og systemet fanger opp fullført prosess ved å polle instansen etterpå.
  • Om app-navnet: suffikset -202406 er en versjonsdato Brønnøysund kan rullere ved nye årganger — navnet er derfor konfigurerbart hos oss, ikke fastspikret.

Næringsspesifikasjon og skattemelding (AS)

Skattemeldingen for AS er den mest sammensatte flyten. Den har tre deler:

  • Bygg og godkjenn. Næringsspesifikasjonen (RF-1167-grunnlaget) bygges og godkjennes først; deretter genereres selve skattemeldingen (v2-format, pakket i skattemeldingOgNaeringsspesifikasjonRequest med base64-kodede deldokumenter). Innsending er aldri automatisk — status-løpet er DRAFT → READY_FOR_REVIEW → APPROVED → SUBMITTED, med SHA-256-integritetskontroll mellom stegene (en Macct-kontroll, ikke et offentlig krav) og en obligatorisk preflight-sjekk før noe sendes.
  • Lever via Altinn-appen. Dokumentene lastes opp på en instans i app_skd_formueinntekt-skattemelding-v2 og prosessen drives frem til bekreftelses-steget.
  • Personen bekrefter. Bekreftelses-steget (Task_2) må utføres av en person med ID-porten — se personkravet under. SUBMITTED settes først når Skatteetatens tilbakemelding faktisk sier validertOK, aldri bare fordi prosess-steget er passert.

Konvolutten må referere Skatteetatens eget utkast

Dette er lett å gå glipp av, og feilen viser seg først etter at personen har bekreftet: Skatteetaten har allerede et utkast til skattemelding for selskapet liggende, og innsendings-konvolutten må inneholde en referanse til akkurat det dokumentet (dokumentreferanseTilGjeldendeDokument) pluss Skatteetatens eget partsnummer for selskapet. Begge hentes fra hentSkattemelding-API-et rett før innsending:

GET https://api.skatteetaten.no/api/skattemelding/v2/{inntektsår}/{orgnr}
Authorization: Bearer <systembruker-bundet Maskinporten-token,
                       scope skatteetaten:formueinntekt/skattemelding>
Accept: application/xml

→ svar: dokumentid (f.eks. SKI:755:14847), dokumenttype
  (skattemeldingUpersonligUtkast) og partsnummer (10 sifre — IKKE orgnr)
→ begge legges inn i konvolutten før opplasting

Tre detaljer som må være riktige samtidig:

  • Uten referansen avvises innsendingen med konvoluttIkkeRiktigFormatert i tilbakemeldingen. Kravet står i Skatteetatens API-dokumentasjon, men håndheves ikke av XSD-ene — XML-en kan altså validere grønt lokalt og likevel bli avvist. Det samme gjelder hvis organisasjonsnummeret brukes der partsnummeret skulle stått.
  • Systembruker-bindingen er selve representasjonen. Et token med riktig scope, men uten systembruker i authorization_details, avvises med «Pålogget bruker har ikke nødvendige rettigheter i Altinn til å representere skattepliktig».
  • Hent referansen ferskt per innsending. Utkastet hos Skatteetaten kan erstattes; en gammel dokumentid peker da på feil versjon.

Personkravet i siste ledd

Som for årsregnskapet krever Skatteetaten spor til en person bak innsendingen: fullføres bekreftelses-steget maskinelt med systembruker, leverer prosessen tilsynelatende — men tilbakemeldingen blir validertMedFeil / innkommendeForespoerselManglerSporTilUtfoerende. Riktig design er derfor at fagsystemet klargjør og låser innsendingen og stopper ved bekreftelsen, og at personen fullfører med ID-porten — i Altinn-portalen eller direkte i fagsystemet (sluttbruker-flyten under).

Personlig bekreftelse fra eget system (ID-porten sluttbruker-flyt)

Personen trenger ikke sendes til Altinn-portalen for bekreftelses-steget: et sluttbrukersystem kan la personen logge inn med ID-porten i systemets egen flyt og utføre bekreftelsen via API — samme mønster som Altinn dokumenterer for sluttbrukersystemer, og slik de store fagsystemene leverer. Registrer en «API-klient» i Digdirs Samarbeidsportal (grant authorization_code + PKCE S256; klientautentisering client_secret_post eller private_key_jwt), be om scope openid altinn:instances.write, og veksle personens access-token til et personlig Altinn-token:

GET {altinn}/authentication/api/v1/exchange/id-porten             (prod)
GET {altinn}/authentication/api/v1/exchange/id-porten?test=true   (TT02)
Authorization: Bearer <idporten-access-token>

→ PUT {app}/instances/{instans}/process/next    body: {"action":"confirm"}
  Authorization: Bearer <personlig-altinn-token>

Detaljer som er greie å vite om på forhånd:

  • Samtykkesiden: ID-porten viser en «Godta / Avvis»-side for datadelings-scopene. Velger brukeren «Avvis», utstedes tokenet med kun openid/profile — og vekslingen svarer 403 uten body, fordi den krever minst ett altinn:-scope i tokenet. Samtykket huskes etter første «Godta».
  • Lese-scopet er ikke selvbetjent i prod: altinn:instances.read lar seg ikke legge til selv i Samarbeidsportalens produksjonsmiljø. Be kun om altinn:instances.write — bekreftelsen er en skriveoperasjon, og vekslingen trenger bare ett altinn:-scope.
  • ?test=true: TT02-vekslingen krever parameteren for tokens fra test.idporten.no (403 uten); i produksjon skal den ikke med.
  • private_key_jwt: velges nøkkel i stedet for client secret, skal aud i client_assertion være ID-portens issuer (ikke token-endepunktet), og kid-en fra Samarbeidsportalen er påkrevd i JWT-headeren.
  • Rask sanity-test: et token-kall med en dummy-kode skiller klientoppsettet fra resten av flyten — invalid_client betyr feil klientautentisering, invalid_grant betyr at klienten er riktig satt opp (koden var jo ugyldig med vilje).

Bekreftelsen bærer da spor til personen (kravet over), brukeren er aldri innom Skatteetatens visningsklient (se SMEVB-005 under fallgruvene), og statusregelen er uendret: «innsendt» settes først ved validertOK i tilbakemeldingen.

Felles for alle: hovedboken føres i NOK, beløp i BigDecimal med to desimaler, og fremmedvaluta omregnes med Norges Banks kurs på transaksjonsdato. Ingen innsending skjer uten at den er trigget og godkjent — systemet er bygd for å aldri sende noe «av seg selv».
Om app-navnene: som med årsregnskapets -202406 bærer flere av navnene en versjons- eller datomarkør — -v2 for skattemeldingen, -v1 for MVA-appen, v3 for skattekort-API-et — som Skatteetaten og Brønnøysund kan oppgradere over tid. Alle er konfigurerbare i Macct, så den faktiske integrasjonen følger gjeldende versjon selv om navnene i teksten her skulle henge etter.

Fallgruver verdt å unngå

Punktene under er de som typisk koster mest tid. Macct er bygd for å håndtere disse situasjonene automatisk der det er mulig, slik at de i praksis sjelden er noe du trenger å tenke på.

Riktig vert for M2M. Skattekort-, MVA- og hentSkattemelding-API-ene nås på api.skatteetaten.no. Verten idporten.api.skatteetaten.no validerer ID-porten-nøkler og svarer 401 på et Maskinporten-token — riktig vert er avgjørende.
hentSkattemelding er kresen på detaljene. Tre ting som hver for seg gir en intetsigende feil, og som alle må være riktige samtidig:
  • Ingen avsluttende skråstrek i URL-en…/v2/2025/<orgnr>/ gir 404 uten forklaring; …/v2/2025/<orgnr> treffer.
  • Accept må være nøyaktig application/xml — API-et leverer kun application/xml;charset=UTF-8 og svarer 406 på alt annet (også text/xml). Sjekk spesielt at HTTP-klienten din ikke har en interceptor som overskriver Accept-headeren globalt — en JSON-default et helt annet sted i koden kan være hele feilen.
  • Riktig scope, systembruker-bundet — uten scopet stopper det allerede hos Maskinporten (invalid_scope); med scope men uten systembruker svarer API-et «ikke nødvendige rettigheter … til å representere skattepliktig».
En feilsøkings-matrise som prøver kombinasjonene systematisk (token-variant × vert) og logger status per kombinasjon er gull verdt her — det var slik hver av disse ble isolert.
konvoluttIkkeRiktigFormatert — kravet står ikke i XSD-en. Innsendings-konvolutten må referere Skatteetatens gjeldende utkast (dokumentreferanseTilGjeldendeDokument) og bruke deres partsnummer — ikke organisasjonsnummeret. XSD-ene har begge feltene som valgfrie, så lokal skjemavalidering blir grønn uansett; avvisningen kommer først i tilbakemeldingen etter at personen har bekreftet. Kravet står kun i API-dokumentasjonens fritekst. Hent referansen fra hentSkattemelding-API-et rett før hver innsending (se per tjeneste-seksjonen).
MVA-validering vs. -innsending. Forhåndsvaliderings-API-et («grensesnittstøtte») ser per i dag ut til å kreve et ID-porten-token (interaktiv pålogging) og svarer 403 på et maskin-token. Selve innsendingen går derimot helmaskinelt via Altinn 3-appen og er uavhengig av valideringen — så validering er en valgfri for-sjekk, ikke et hinder for å levere. Skulle Skatteetaten endre praksis her, følger Macct den gjeldende ordningen.
Verifiser app-navn og dataType. Altinn 3-appenes navn og dataTypes må stemme med applicationmetadata — f.eks. årsregnskapets hoveddokument heter Hovedskjema (ikke «Skjema»), og MVA- appen heter mva-melding-innsending-v1.
Choice-typer i XML. Skatteetatens skjemaer bruker «choice»-elementer: norskIdentifikator skal pakke en <organisasjonsnummer>, ikke ren tekst. Manglende obligatoriske felt (som skattepliktig>organisasjonsnummer) gir interne app-feil i prosess-steget snarere enn en tydelig valideringsfeil.
Tilgangspakke per miljø. Se over: pakker må ligge på System Register i samme miljø som forespørselen (AUTH-00063 ellers).
Unik externalRef. Gjenbruk gir AUTH-00004; bruk en distinkt referanse for nye/utvidede systembrukere.
Bekreftelses- og signeringssteg krever en person. I app_skd_formueinntekt-skattemelding-v2 kan bekreftelses-steget (Task_2) ikke fullføres av en systembruker: prosessen leverer tilsynelatende, men tilbakemeldingen blir validertMedFeil med årsak innkommendeForespoerselManglerSporTilUtfoerende — Skatteetaten krever spor til en person bak innsendingen. Tilsvarende svarer Altinn 403 når en systembruker forsøker å signere årsregnskapet. Design flyten slik at systemet klargjør og stopper, og personen bekrefter/signerer med ID-porten — og sett aldri «innsendt»-status uten å ha lest tilbakemeldingen (validertOK).
SMEVB-005 i skattemelding-visning. Skatteetatens visningsklient (skatt.skatteetaten.no/web/skattemelding-visning), som personen sendes til for «Se opplysninger og send inn», kan feile med «Det skjedde en teknisk feil … SMEVB-005» — observert i både testmiljøet og produksjon (per juli 2026), og rammer flere sluttbrukersystemer. Systematisk testing viser at klientens eneste datakall (GET /api/skattemelding-visning/skattemelding-altinn3) svarer HTTP 500 med koden for alt gyldig upersonlig SBS-innhold — også en minimal konvolutt — uavhengig av prosess-steg, mens tomme/ødelagte instanser gir SMEVB-002. Feilen ligger altså server-side hos Skatteetaten og er meldt dem (ta vare på korrelasjonsid-headeren fra feilsvaret til supportsaken). Instansen med den opplastede skattemeldingen ligger trygt låst i Altinn imens — det er et blokkert siste klikk, ikke tapte data. Den robuste veien utenom er ID-porten sluttbruker-flyten beskrevet over: personen bekrefter da i fagsystemet og er aldri innom visningsklienten.

Vanlige spørsmål (FAQ)

Hva er en systembruker?

En systembruker er en fullmakt et selskap gir til et fagsystem (som Macct) i Altinn, slik at systemet kan rapportere til det offentlige på selskapets vegne. Den godkjennes med BankID, er avgrenset til bestemte tjenester, er sporbar og kan trekkes tilbake når som helst.

Hva er Maskinporten?

Maskinporten er en statlig OAuth2-tjeneste fra Digdir for maskin-til-maskin- kommunikasjon. Den gir et fagsystem et tidsbegrenset «ID-kort» (access token) som beviser hvilken virksomhet systemet opptrer som, uten at et menneske logger inn.

Hva er forskjellen på Maskinporten og ID-porten?

ID-porten brukes når en person logger inn (for eksempel med BankID) for å bruke en offentlig tjeneste. Maskinporten brukes når en datamaskin / et system autentiserer seg uten en person til stede. Noen API-er (som MVA-forhåndsvalidering) ser ut til å kreve ID-porten; selve innsendingen går via Maskinporten og Altinn.

Hva er forskjellen på systembruker og Maskinporten?

Maskinporten beviser hvem maskinen er. En systembruker sier hva maskinen har lov til, og for hvem — altså fullmakten fra et bestemt selskap. Begge trengs: Maskinporten-tokenet bindes til systembrukeren for å rapportere på vegne av selskapet.

Hvordan fungerer Altinn 3 for regnskapssystemer?

Altinn 3 tilbyr «apper» (for eksempel for MVA-melding og årsregnskap) som et fagsystem oppretter instanser i via API. Systemet bytter Maskinporten-token mot et Altinn-token, oppretter en instans for kundens organisasjonsnummer, laster opp dataene og fører prosessen frem til kvittering.

Hvordan sender et regnskapssystem MVA-melding?

Via Altinn 3-appen for MVA-melding: systemet bygger XML-meldingen, oppretter en instans hos Altinn med kundens organisasjonsnummer som eier, laster opp meldingen og en innsendings-wrapper, og fører prosessen frem til kvittering. Innsending skjer aldri uten at brukeren har godkjent.

Hvordan fungerer skattekort-API-et?

Macct henter elektronisk skattekort direkte fra Skatteetatens API «Skattekort for arbeidsgivere» med et systembruker-bundet Maskinporten-token. Svaret (trekktype, tabellnummer og trekkprosent) skrives på den ansatte og brukes i lønnskjøringen.

Hvorfor avvises skattemeldingen med «konvoluttIkkeRiktigFormatert»?

Innsendings-konvolutten mangler referansen til Skatteetatens gjeldende skattemelding (dokumentreferanseTilGjeldendeDokument), eller bruker organisasjonsnummer der Skatteetatens partsnummer skulle stått. Begge hentes fra hentSkattemelding-API-et rett før innsending. Kravet står i Skatteetatens API-dokumentasjon, men håndheves ikke av XSD-ene — XML-en kan derfor validere grønt lokalt og likevel bli avvist.

Hva en Macct-kunde må gjøre

For at Macct skal kunne sende inn MVA-melding, årsregnskap, skattemelding m.m. på vegne av selskapet ditt, trenger vi én engangsgodkjenning fra deg:

  1. Du får en lenke til Altinn (am.ui.altinn.no) fra Macct.
  2. Du logger inn med BankID og godkjenner systembruker-forespørselen — du må ha en rolle på selskapet (typisk daglig leder eller styreleder, eller en delegert rolle) i Brønnøysund/Altinn.
  3. Godkjenningen gir Macct en systembruker med nøyaktig de tilgangspakkene og rettighetene som står i forespørselen — verken mer eller mindre.

Du deler aldri passord, BankID-koder eller API-nøkler. Fullmakten er avgrenset, sporbar, og du kan når som helst trekke den tilbake i Altinn under Tilgangsstyring → Systemtilgang. Og selv med fullmakt på plass sender Macct aldri noe inn uten at det er utløst og godkjent — innsending krever alltid et eksplisitt menneskelig «send».

Vil du se hvordan det ser ut i praksis?

Macct fører regnskapet og forbereder innsendingene — du godkjenner én gang og trykker «send» når du er klar.

Prøv gratis i 30 dager Se Altinn-statusen