This document is for developers integrating with Systima. It describes how to register a new customer - user and company in a single call - and how to land that user in Systima already signed in.
You need credentials from Systima before you start; see Authentication.
| Environment | Base URL |
|---|---|
| Test (staging) | https://api-stage-systima.azurewebsites.net |
| Production | https://api.systima.no |
All endpoints below are relative to the base URL. Test your integration against staging first; staging credentials do not work in production.
Every request must carry three headers:
Authorization: Bearer <integrator token> X-Provisioning-Client-Id: <your client id> X-Provisioning-Key: <your provisioning key>
Systima issues all three to you. The provisioning key is a secret: keep it server-side, never ship it in a browser or mobile app, and never log it. If it leaks, contact Systima - a new key can be issued and the old one deactivated immediately.
Returns the subscription plans that can be activated for a new company. Use it to render a plan picker. Optional, but recommended over hardcoding plans, because prices change over time.
Request
curl 'https://api.systima.no/api-external/subscription-plans' \ -H 'Authorization: Bearer <integrator token>' \ -H 'X-Provisioning-Client-Id: <your client id>' \ -H 'X-Provisioning-Key: <your provisioning key>'Response 200
[ { "code": "small", "name": "Invoicing", "prices": [{ "period": "MONTHLY", "price": 0 }, { "period": "YEARLY", "price": 0 }] }, { "code": "medium", "name": "Invoicing and accounting", "prices": [{ "period": "MONTHLY", "price": 19900 }, { "period": "YEARLY", "price": 214800 }] }, { "code": "large", "name": "Invoicing, accounting and salary", "prices": [{ "period": "MONTHLY", "price": 24900 }, { "period": "YEARLY", "price": 268800 }] } ]| Field | Description |
|---|---|
code | Pass this value as plan when registering a company. |
name | Human-readable plan name. |
prices[].period | MONTHLY or YEARLY. |
prices[].price | Price in øre for that period - 19900 = 199 NOK per month, 214800 = 2 148 NOK per year. |
A company has exactly one plan at a time. The response may also contain medium_sb and salary; a plan picker should normally show only small, medium and large.
Creates the user and the company, optionally activates a subscription plan, and returns a one-time URL that logs the user in.
Request
curl -X POST 'https://api.systima.no/api-external/onboarding' \ -H 'Authorization: Bearer <integrator token>' \ -H 'X-Provisioning-Client-Id: <your client id>' \ -H 'X-Provisioning-Key: <your provisioning key>' \ -H 'Content-Type: application/json' \ -d '{
"user": {
"firstName": "Edvard",
"lastName": "Munch",
"email": "edvard@example.no",
"phone": "+4721422121"
},
"company": {
"organizationNumber": "999999999",
"name": "Operahuset AS",
"phone": "+4721422121",
"email": "post@example.no",
"billingEmail": "faktura@example.no",
"type": "AS",
"addressLine1": "Kirsten Flagstads Plass 1",
"addressLine2": null,
"postalCode": "0150",
"city": "Oslo",
"country": "Norway",
"vatPaymentFrequency": "BIMONTHLY",
"registeredAt": "1996-10-15",
"sicCode": "12.99",
"accountingStartDate": "2026-01-01"
},
"plan": "medium",
"period": "MONTHLY"
}'user - the person who becomes the owner of the company.
| Field | Required | Notes |
|---|---|---|
firstName | yes | |
lastName | yes | |
email | yes | Valid address, not a disposable domain, not already registered in Systima. Login name and destination of the "set your password" e-mail. |
phone | no |
There is no password field. Systima creates the account with a random password and e-mails the user a link to set their own.
company
| Field | Required | Notes |
|---|---|---|
organizationNumber | yes | Norwegian organisation number. Must not already exist in Systima. |
name | yes | |
phone | yes | |
email | yes | General company e-mail. |
billingEmail | yes | Where invoices from Systima are sent. May differ from email. |
type | yes | Company form: AS, ANS, ASA, DA, ENK, FLI, KS, NUF, SA, SB, STI, UB, UTLA, KBO, KTRF, SAM, IKS, PRIVATPERSON, ANNA, OTHER. |
addressLine1 | yes | |
addressLine2 | no | |
postalCode | yes | |
city | yes | |
country | yes | |
vatPaymentFrequency | yes | NONE, MONTHLY, BIMONTHLY or ANNUALLY. |
registeredAt | no | YYYY-MM-DD. |
sicCode | no | |
accountingStartDate | no | YYYY-MM-DD. |
Plan selection
| Field | Required | Notes |
|---|---|---|
plan | no | A code from the plan catalog. When set, the company is created with that subscription already active and the user goes straight to work. When omitted, the user is asked to choose a plan on first login. |
period | no | MONTHLY (default) or YEARLY. Only used together with plan. |
Response 200
{ "userId": "6d91d632-2174-4717-97fb-0e3bc11c620d", "companyId": "fd036958-0872-4dba-b777-0a52442e3131", "redirectUrl": "https://app.systima.no/integrator-login#ticket=4ca77872fbe74fe3aa3860c5df3e543a"
}Store userId and companyId if you need to reference the customer later.
Send the user to redirectUrl immediately after the call - a browser redirect, not a link saved for later.
- The ticket in the URL fragment (
#ticket=...) is single-use and expires after 60 seconds. - Systima's web app exchanges it for a real session; the user lands inside their new company, signed in, with no password step.
- Never store, log, e-mail or forward the ticket. If it expires, the user can still sign in normally via the "set your password" e-mail.
Errors are returned as JSON: { "code": "...", "message": "...", "status": ... }.
| Status | When |
|---|---|
| 401 | Missing or invalid Authorization Bearer token. |
| 403 | Missing, wrong or deactivated X-Provisioning-Client-Id / X-Provisioning-Key. |
| 422 | Validation failed, e.g. a required field is missing, plan is not a known plan code, the e-mail is already registered, or the organisation number already exists. |
| 429 | Too many requests. /onboarding is rate limited to 100 requests per 15 minutes per calling IP address. Retry with backoff. |
The whole registration runs in a single database transaction: if the call does not return 200, nothing was created - no user, no company, no subscription. It is safe to fix the payload and retry.
- Fetch
/api-external/subscription-plansand render the plan choice (prices in øre). - Collect user and company details; validate the organisation number and e-mail on your side to avoid predictable 422s.
- Call
/api-external/onboardingserver-side with the three auth headers. - Redirect the browser to
redirectUrlright away. - Handle 422 by showing the message to the end user, and 401/403 as a configuration error on your side - contact Systima.
Var denne artikkelen nyttig?
Så bra!
Takk for din tilbakemelding
Beklager at vi ikke kunne være mer til hjelp
Takk for din tilbakemelding
Tilbakemeldingen er sendt inn
Vi setter pris på tilbakemeldingen din og vil prøve å rette på artikkelen