Skip to content
Apier

Which credential do I need: virksomhetssertifikat, virksomhetsbruker, systembruker, or a Maskinporten client?

Pick by whose authority your call carries. A Maskinporten client is registered by your own organisation and acts as you. A systembruker is delegated by your customer and lets you act on that customer's behalf in Altinn 3. A virksomhetsbruker is the Altinn 2 era's enterprise user, still met in old integrations but on its way out. And the virksomhetssertifikat is not an access credential at all: it is the signing key underneath a Maskinporten client, which today can also be a directly registered JSON Web Key instead. Most integrations need the first two and neither of the last two by name.

A two-by-two map pairing situations with credentials. Calling an API your own organisation was granted points to a Maskinporten client, registered by you and acting as you. Acting for a customer company in Altinn 3 points to a systembruker, delegated by the customer. Maintaining an old Altinn 2 integration points to a virksomhetsbruker, an Altinn 2 era construct being retired. Signing the assertions underneath points to a virksomhetssertifikat or a JWK, the key with two ways to hold it. A note reads: every path signs with a key, and the constructs differ in whose authority the call carries.Calling an API your own organisation was granted?Maskinporten clientregistered by you, acts as youActing for a customer company in Altinn 3?Systembrukerdelegated by the customerMaintaining an old Altinn 2 integration?VirksomhetsbrukerAltinn 2 era, being retiredSigning the assertions underneath?Virksomhetssertifikat or JWKthe key, two ways to hold itEvery path signs with a key. The constructs differ in whose authority the call carries.
Two of the four are current building blocks, one is legacy, and one is not an access credential at all but the key the others sign with. The question that sorts them is never which is best, but whose authority the call must carry.

What does each credential actually let you do?

A Maskinporten client is your organisation's machine identity. You register it yourself, it authenticates by signing a short-lived JWT with a registered key, and the tokens it receives carry the scopes agencies have granted to your organisation. What it cannot do is act for anyone else on its own: a client alone asserts your identity, so data an agency ties to another organisation's consent stays out of reach however many scopes you hold.

The systembruker fills exactly that gap. It is created for a customer organisation and delegated by someone with authority there, and the tokens your client then requests through Maskinporten identify the system user acting for that customer. It cannot widen your own scopes, and it does not exist until the customer grants it, which is a feature: the authority on the call is the customer's, given deliberately, and revocable by them.

The virksomhetsbruker solved the same problem a platform generation earlier: an enterprise user for Altinn 2, signing in with a username and password paired with a virksomhetssertifikat. It still runs in integrations that predate Altinn 3, and that is the only situation that requires it. The certificate itself, finally, is not an access credential but the organisation-issued key that signs Maskinporten assertions, and even that role is no longer exclusive, as the next sections cover.

The decision table: the situation you are in, the credential it requires, and the limit that credential carries.
SituationCredentialThe limit to remember
Call an API your own organisation was grantedMaskinporten client, registered by you.Acts as you. It cannot represent a customer on its own.
Act on behalf of customer companies in Altinn 3Systembruker, delegated by each customer.Does not exist until the customer grants it, and the customer can revoke it.
Maintain an integration built on the Altinn 2 APIVirksomhetsbruker, with certificate-backed login.Legacy only. Plan the migration; do not build anything new on it.
Sign the assertions a Maskinporten client sendsVirksomhetssertifikat-anchored key, or a directly registered JWK.A key, not an access grant. Holding it authorises nothing by itself.
Reach Norwegian company data without any of the aboveAn Apier API key over the brokered surface.The per-customer delegation still belongs to the customer.

What is current and what is being retired?

The current model is the Maskinporten client plus, when you act for customers, the systembruker. Both are documented as the standing mechanism: the client authenticates with a signed JWT grant and nothing else, and the system user is the Altinn 3 construct for machine access under an organisation's authority. Nothing about either is transitional, and new integrations should assume them.

The virksomhetsbruker is the one to plan away from. It belongs to Altinn 2, whose shutdown has been announced, and the transition is dated where it touches rights: Skatteetaten's guidance documents Altinn 2 roles and delegation of roles being removed at the start of 2027, with old grants working through a transition window before that. An integration authenticating as an enterprise user today still works against the remaining Altinn 2 surfaces, and every one of those surfaces has a migration date somewhere on it.

The certificate's status is subtler: not retired, but no longer the only option. Maskinporten documents two ways to hold a client's signing key, anchored on a virksomhetssertifikat from Buypass or Commfides, or registered directly as your own key set, which the documentation frames as the way to avoid distributing certificates. The choice affects how you store and rotate the key, not what the client may do.

How do the pieces combine in a real integration?

They stack rather than compete. A vendor serving accounting customers ends up with one Maskinporten client, anchored on one key, requesting tokens that act through one systembruker per customer. The client is yours, the delegations are your customers', and the key is the quiet layer underneath. The confusing question “which one do I need” usually resolves to “all of the current ones, each doing its own job”.

The mechanics of each layer are owned by their own pages: the certificate, assertion and caching detail by the authentication guide, and the question of which token a given Altinn 3 surface wants, Maskinporten's own or the exchanged Altinn token, by the token exchange guide. This page stays the map; those pages are the territory.

Through a broker, the stack collapses from your side. Apier holds the client, the keys and the token loop, and brokers the systembruker flow, so your application authenticates with one Bearer key against one API. What remains yours is the decision no intermediary can make: each customer granting, and being able to withdraw, authority over its own affairs.

Make the first call

The first request needs no credential at all and lists what one Apier key unlocks. The second reads a company's registered signing authority over the brokered surface, with none of the four constructs above appearing in your stack.

# Zero-auth: what one Apier key unlocks, including the scope vocabulary.
curl -s https://www.apier.no/api/v1/capabilities
// Brokered: registered signing authority for a company, no certificate,
// no client registration and no government credential in your stack.
const res = await fetch(
  "https://www.apier.no/api/v1/company/999999999/authority",
  { headers: { Authorization: `Bearer ${process.env.APIER_API_KEY}` } },
);

if (!res.ok) {
  // Every non-2xx answers the same structured envelope.
  const { error_code, explanation } = await res.json();
  throw new Error(`${error_code}: ${explanation.summary}`);
}

const { data } = await res.json();
// "sole" | "joint" | "by_role" | "prokura_only" | "no_authority"
// | "unknown", plus the holders.
console.log(data.classification, data.signaturrett_holders);

Frequently asked questions

What is the difference between a Maskinporten client and a systembruker?
Whose authority the call carries. A Maskinporten client is registered by your own organisation and the tokens it obtains assert your identity and your granted scopes. A systembruker is created for a customer organisation and delegated by that customer, so calls made under it act on the customer's behalf. An integration serving many customers typically holds one client and acts through one systembruker per customer.
Is a virksomhetsbruker the same thing as a systembruker?
No. A virksomhetsbruker is an Altinn 2 construct: an enterprise user that authenticates with a username and password together with a virksomhetssertifikat against the Altinn 2 API. The systembruker is the Altinn 3 mechanism for machine access under an organisation's authority, with tokens requested through Maskinporten. New integrations should not be built on virksomhetsbruker.
Do I still need a virksomhetssertifikat for Maskinporten?
Not necessarily. Maskinporten documents two ways to hold the signing key: anchor it on an enterprise certificate, or register your own key set directly with the client, which the documentation describes as the way to avoid distributing certificates. Either way the client authenticates with a signed JWT; there is no client secret variant at all.
Which of these credentials is being retired?
The virksomhetsbruker, together with the platform it belongs to. Altinn 2's shutdown has been announced, and Skatteetaten's guidance documents that roles and delegation of roles in Altinn 2 are removed at the start of 2027, after a transition window. The Maskinporten client, the systembruker and the key underneath them are the current model.
What does Apier hold for me in this picture?
The whole left side of the decision. Apier holds the Maskinporten client, the certificate-anchored keys and the token lifecycle, and brokers the systembruker flow per customer. Your application authenticates with one Apier API key, and the only leg that remains yours is the one no broker can take: your customer granting authority over its own affairs.