Integrator onboarding API

Endret Tue, 28 Jul ved 1:13 PM

Systima onboarding API for integration partners

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.

Base URLs

EnvironmentBase URL
Test (staging)https://api-stage-systima.azurewebsites.net
Productionhttps://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.

Authentication

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.


1. GET /api-external/subscription-plans

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 }] } ]
FieldDescription
codePass this value as plan when registering a company.
nameHuman-readable plan name.
prices[].periodMONTHLY or YEARLY.
prices[].pricePrice 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 smallmedium and large.


2. POST /api-external/onboarding

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"
  }'

Body

user - the person who becomes the owner of the company.

FieldRequiredNotes
firstNameyes
lastNameyes
emailyesValid address, not a disposable domain, not already registered in Systima. Login name and destination of the "set your password" e-mail.
phoneno

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

FieldRequiredNotes
organizationNumberyesNorwegian organisation number. Must not already exist in Systima.
nameyes
phoneyes
emailyesGeneral company e-mail.
billingEmailyesWhere invoices from Systima are sent. May differ from email.
typeyesCompany form: ASANSASADAENKFLIKSNUFSASBSTIUBUTLAKBOKTRFSAMIKSPRIVATPERSONANNAOTHER.
addressLine1yes
addressLine2no
postalCodeyes
cityyes
countryyes
vatPaymentFrequencyyesNONEMONTHLYBIMONTHLY or ANNUALLY.
registeredAtnoYYYY-MM-DD.
sicCodeno
accountingStartDatenoYYYY-MM-DD.

Plan selection

FieldRequiredNotes
plannocode 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.
periodnoMONTHLY (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.


3. Redirecting the user

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.

4. Errors

Errors are returned as JSON: { "code": "...", "message": "...", "status": ... }.

StatusWhen
401Missing or invalid Authorization Bearer token.
403Missing, wrong or deactivated X-Provisioning-Client-IdX-Provisioning-Key.
422Validation 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.
429Too 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.


5. Integration checklist

  1. Fetch /api-external/subscription-plans and render the plan choice (prices in øre).
  2. Collect user and company details; validate the organisation number and e-mail on your side to avoid predictable 422s.
  3. Call /api-external/onboarding server-side with the three auth headers.
  4. Redirect the browser to redirectUrl right away.
  5. 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

Fortell oss hvordan vi kan forbedre denne artikkelen.

Velg minst én av grunnene

Tilbakemeldingen er sendt inn

Vi setter pris på tilbakemeldingen din og vil prøve å rette på artikkelen