Hoppa till innehållet
FortnoxFortnox API — autentisering

Autentisering mot Fortnox API

Fortnox API kräver OAuth 2.0 för varje anrop — det finns ingen statisk api-nyckel att klistra in och glömma. Mänskliga användaranslutningar använder authorization code-flödet som beskrivs nedan; Fortnox stöder också förhandsgodkända servicekonton genom client credentials grant. Guiden fokuserar på användarflödet, verifierade endpoints, scopes och vanliga fel.

Översikt: hur autentisering fungerar

Fortnox stöder två OAuth 2.0-grants. Mänskliga användaranslutningar använder authorization code grant och kundinloggningen som beskrivs i guiden. Förhandsgodkända servicekonton använder client credentials grant med ett tenant-id och gör ingen interaktiv inloggning för varje token.

Båda flödena börjar i Fortnox Developer Portal, där du registrerar integrationen och får ett Client ID och en Client Secret. De autentiserar anrop mot token-endpointen; den resulterande access-token är vad som auktoriserar anrop mot API-resurser.

I det mänskliga authorization code-flödet loggar kunden — Fortnox kallar dem resource owner — in och godkänner begärda scopes. Ett servicekonto måste i stället skapas och förhandsgodkännas för integrationen och tenant-kontexten innan client credentials kan skapa en access-token.

Ett lyckat mänskligt authorization code-flöde ger en access-token och en refresh-token. Client credentials-flödet ger i stället en tenant-avgränsad access-token för servicekontot. I båda fallen skickas access-token som Bearer-token vid resursanrop.

Steg för steg: OAuth-flödet

1 · Din app

Auktoriseringsurl

apps.fortnox.se/oauth-v1/auth med Client ID, scopes, redirect-URI och state

2 · Kunden i Fortnox

Loggar in och godkänner

Fortnox listar exakt vilka scopes som begärs

3–4 · Din backend

Växlar koden mot tokenpar

POST till apps.fortnox.se/oauth-v1/token med Basic auth

5–6 · Därefter

Anropa t.ex. /3/invoices med access-token som Bearer-token, och förnya med refresh-token innan den går ut.

Koden går bara åt ett håll: från Fortnox till din redirect-URI, och växlas direkt mot token.
  1. 1

    Skicka kunden till auktoriseringsurlen

    Länken pekar mot apps.fortnox.se/oauth-v1/auth och bär med sig ditt Client ID, vilka scopes integrationen begär, din redirect-URI och en slumpad state-sträng du verifierar när kunden kommer tillbaka. I praktiken öppnas länken i kundens webbläsare, men skrivet som curl -G blir parametrarna tydliga:

    curl -G "https://apps.fortnox.se/oauth-v1/auth" \
      --data-urlencode "client_id=YOUR_CLIENT_ID" \
      --data-urlencode "redirect_uri=https://your-app.example.com/callback" \
      --data-urlencode "scope=invoice customer bookkeeping" \
      --data-urlencode "state=RANDOM_STATE_STRING" \
      --data-urlencode "response_type=code" \
      --data-urlencode "access_type=offline"
  2. 2

    Kunden loggar in och godkänner scopes

    Fortnox listar exakt vilka scopes integrationen begär. Kunden loggar in med sitt eget Fortnox-konto och godkänner endast det som visas — inget scope läggs till i efterhand utan ett nytt godkännande.

  3. 3

    Fortnox skickar en auktoriseringskod till din redirect-URI

    Koden är giltig i tio minuter, så växlingen mot ett tokenpar måste ske i samma begäran-cykel. Sparar du koden för senare bruk hinner den gå ut innan du använder den.

  4. 4

    Din backend växlar koden mot ett tokenpar

    Ett POST-anrop mot token-endpointen, autentiserat med Client ID och Client Secret som Basic-auktorisering, ger tillbaka en access-token och en refresh-token:

    curl -X POST "https://apps.fortnox.se/oauth-v1/token" \
      -H "Authorization: Basic $(printf '%s' 'YOUR_CLIENT_ID:YOUR_CLIENT_SECRET' | base64)" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      --data-urlencode "grant_type=authorization_code" \
      --data-urlencode "code=AUTHORIZATION_CODE_FROM_REDIRECT" \
      --data-urlencode "redirect_uri=https://your-app.example.com/callback"
  5. 5

    Använd access-token som Bearer-token

    Varje efterföljande anrop mot en resurs, till exempel /3/invoices, skickar access-token i Authorization-headern. Fungerar anropet är integrationen igång.

  6. 6

    Förnya med refresh-token innan access-token går ut

    Samma token-endpoint, men med grant_type satt till refresh_token. En lyckad förnyelse kan ge en ny refresh-token också — spara alltid den senaste, aldrig den ursprungliga:

    curl -X POST "https://apps.fortnox.se/oauth-v1/token" \
      -H "Authorization: Basic $(printf '%s' 'YOUR_CLIENT_ID:YOUR_CLIENT_SECRET' | base64)" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      --data-urlencode "grant_type=refresh_token" \
      --data-urlencode "refresh_token=YOUR_REFRESH_TOKEN"

Scopes: vilka behörigheter finns?

Fortnox delar upp API:t i 24 scopes, och en godkänd token kommer bara åt de scopes som stod i auktoriseringslänken och som kunden faktiskt godkände vid aktivering — aldrig hela kontot. Vill du läsa löner begär du salary; nöjer du dig med kundfakturor räcker invoice. Listan nedan är hämtad direkt ur Nordsynks egen scope-konfiguration, inte ur minnet.

Principen är minsta möjliga privilegium: begär bara de scopes integrationen faktiskt behöver för uppgiften. Ett scope du aldrig begärde kan inte läcka data, och ett för brett godkännande är svårare för kunden att lita på och svårare för dig att motivera i en säkerhetsgranskning. Behöver integrationen mer längre fram måste kunden godkänna de nya scopes explicit — det sker aldrig tyst i bakgrunden.

ScopeVad den ger åtkomst till
archiveFiler och mappar i dokumentarkivet
articleArtikelregistret — produkter och tjänster
assetsAnläggningstillgångar och avskrivningar
bookkeepingVerifikationer och huvudbok
companyinformationGrundläggande företagsuppgifter
connectfileKoppla arkivfiler till fakturor och verifikat
costcenterKostnadsställen
currencyValutakurser
customerKundregistret
inboxInkorgen för inkommande leverantörsfakturor
invoiceKundfakturor
noxfinansinvoiceFakturaköp via Noxfinans
orderKundorder
paymentIn- och utbetalningar
pricePrislistor
printUtskriftsmallar och PDF-generering
profileDen inloggade användarens profil
projectProjekt
salaryLöner och löneunderlag
salesapiFortnox Sales API — order och offert mot e-handel
settingsFöretagsinställningar, till exempel räkenskapsår
supplierLeverantörsregistret
supplierinvoiceLeverantörsfakturor: attest, betalning, bokföring
timereportingTidrapportering

Vanliga fel vid autentisering

De flesta autentiseringsproblem mot Fortnox API landar i tre kategorier — och bara en av dem är faktiskt ett fel i din kod.

401 Unauthorized

Access-token saknas, är felstavad eller har gått ut — den lever bara i en timme. En integration som inte förnyar token proaktivt ser det här regelbundet, särskilt i långkörande bakgrundsjobb.

403 Forbidden

Nästan alltid ett scope-problem: token saknar behörighet för resursen eftersom scopet aldrig stod i auktoriseringslänken eller aldrig godkändes av kunden vid aktivering. Lägg till scopet och låt kunden godkänna om igen.

Saknad app-licens (error_missing_app_license)

Svarar Fortnox med error_missing_app_license eller texten Resource owner does not have enough licenses är det inte ett kodfel — det är Fortnox eget licenskrav. Företaget som kopplas saknar en aktiv licens för integrationen i sin Fortnox Marketplace, eller så saknar just den användaren en tilldelad plats. Kunden löser det i Fortnox: aktivera eller köp licensen och tilldela användaren en plats, inte genom att felsöka OAuth-flödet.

Token-hantering i praktiken

Vad som gäller hur länge

AuktoriseringskodGiltighet10 minuterGör så härVäxla i samma request cycle
Access-tokenGiltighet1 timmeGör så härFörnya proaktivt, vänta inte på 401
Refresh-tokenGiltighet—Gör så härSpara den senaste som returneras
Kortlivade nycklar förnyas proaktivt. Spara alltid den senaste refresh-token.

Förnya innan token går ut

I det mänskliga authorization code-flödet ska du inte vänta på ett 401-svar. Förnya proaktivt före access-token går ut efter en timme och spara alltid den senaste refresh-token som returneras. Servicekonton skapar i stället en ny access-token med client credentials och TenantId; de använder ingen refresh-token.

Säker lagring av Client Secret och tokens

Client Secret och refresh-token ska aldrig nå en webbläsare eller mobilapp — de hör hemma krypterade på servern, med samma skyddsnivå som ett lösenord. Läcker Client Secret roterar du det direkt i Developer Portal; läcker en kunds refresh-token måste kunden koppla bort och godkänna integrationen på nytt.

Användartokens är bundna till användare och företag

Ett tokenpar från authorization code-flödet representerar den godkännande användaren i ett Fortnox-bolag och får inte delas mellan användare eller företag. Regeln gäller mänskliga anslutningar: ett förhandsgodkänt servicekonto använder client credentials och TenantId i stället för användarens tokenpar.

Nordsynk sköter hela det här flödet åt dig

OAuth-flödet ovan, proaktiv token-förnyelse, säker lagring av Client Secret och normalisering av licens- och scope-fel är infrastruktur du annars bygger och underhåller innan du skrivit en rad affärslogik. Nordsynk sköter hela kedjan och exponerar Fortnox via en enda MCP-endpoint i Claude, ChatGPT eller Cursor — kunden loggar in en gång per företag, sedan frågar ni i klartext istället för att förnya tokens.

Fortnox MCP-server: hela API:t i en endpoint →

Vanliga frågor om Fortnox-autentisering

Har Fortnox api-nycklar eller bara OAuth?

Fortnox använder OAuth 2.0 i stället för en fristående api-nyckel vid resursanrop. Client ID och Client Secret autentiserar token-anropet för både mänskliga authorization code-anslutningar och förhandsgodkända servicekonton med client credentials; resursanrop använder den resulterande access-token.

Hur länge lever en access token?

En access-token från Fortnox är giltig i en timme (3 600 sekunder). Förnya en mänsklig authorization code-anslutning med dess refresh-token; för ett servicekonto skapar du en ny token med client credentials och TenantId.

Kan flera användare dela en token?

En mänsklig authorization code-token får inte delas: den representerar en godkännande användare i ett företag. Detta beskriver inte servicekontots token, som skapas med client credentials grant för en förhandsgodkänd tenant-kontext.