Fortnox API — autentiseringAutentisering 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.
- 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
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
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
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
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
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.
| Scope | Vad den ger åtkomst till |
|---|---|
| archive | Filer och mappar i dokumentarkivet |
| article | Artikelregistret — produkter och tjänster |
| assets | Anläggningstillgångar och avskrivningar |
| bookkeeping | Verifikationer och huvudbok |
| companyinformation | Grundläggande företagsuppgifter |
| connectfile | Koppla arkivfiler till fakturor och verifikat |
| costcenter | Kostnadsställen |
| currency | Valutakurser |
| customer | Kundregistret |
| inbox | Inkorgen för inkommande leverantörsfakturor |
| invoice | Kundfakturor |
| noxfinansinvoice | Fakturaköp via Noxfinans |
| order | Kundorder |
| payment | In- och utbetalningar |
| price | Prislistor |
| Utskriftsmallar och PDF-generering | |
| profile | Den inloggade användarens profil |
| project | Projekt |
| salary | Löner och löneunderlag |
| salesapi | Fortnox Sales API — order och offert mot e-handel |
| settings | Företagsinställningar, till exempel räkenskapsår |
| supplier | Leverantörsregistret |
| supplierinvoice | Leverantörsfakturor: attest, betalning, bokföring |
| timereporting | Tidrapportering |
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
| Nyckel | Giltighet | Gör så här |
|---|---|---|
| Auktoriseringskod | Giltighet10 minuter | Gör så härVäxla i samma request cycle |
| Access-token | Giltighet1 timme | Gör så härFörnya proaktivt, vänta inte på 401 |
| Refresh-token | Giltighet— | Gör så härSpara den senaste som returneras |
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.