Nordlet

← Grunnleggende / SDK-er

Kom i gang

API-nøkler, første kall, hele faktureringssyklusen, SDK-er og webhooks.

Nordlet er en API-først regnskapsplattform for EU/EØS-markedet, og lanseres med full etterlevelse av litauiske regelverk (Lithuanian compliance). Alt produktet kan gjøre – fakturering, hovedbok (general ledger), bankavstemming (bank reconciliation), i.SAF – er tilgjengelig via ett enkelt JSON-API.

1. Skaff deg en API-nøkkel

Hver forespørsel autentiseres med en Bearer-API-nøkkel som er knyttet til én bestemt bedrift:

Authorization: Bearer nl_...

For lokal utvikling kan du opprette en bedrift og nøkkel automatisk:

pnpm --filter @nordlet/db bootstrap:dev     # tom bedrift
pnpm --filter @nordlet/api seed:demo        # bedrift med demodata

Interaktiv API-referanse (OpenAPI-spesifikasjon på /openapi.json; en lokal instans viser den samme referansen på http://localhost:3001/docs).

Postman

Foretrekker du Postman? Importer den ferdige samlingen - alle endepunkter, gruppert etter modul, med forhåndskonfigurert Bearer-autentisering: Nordlet Postman-samling. Etter importen setter du samlingens bearerToken-variabel til din API-nøkkel, og dermed blir alle forespørsler autentiseres automatisk.

Sandkassebedrifter

For integrasjonstesting kan du opprette en bedrift med isSandbox: true (POST /v1/account/companies/create, eller ved å krysse av i sandkasseboksen under oppstart i appen). En sandkassebedrift oppfører seg nøyaktig som en ekte bedrift - de samme modulene, det samme API-et, slik at du kan kjøre realistisk transaksjonsvolum gjennom den - men den er tydelig merket som testdata, og sletting fjerner alt umiddelbart i stedet for etter oppbevaringsvinduet på 10 dager. Du kan kjøre et valgfritt antall sandkassebedrifter ved siden av din ekte bedrift under samme konto. Flagget kan ikke endres etter opprettelse, slik at ekte regnskap aldri ved en feiltakelse kan omklassifiseres som testdata. Bruk i en sandkassebedrift måles og faktureres på nøyaktig samme måte som bruk i en ekte bedrift: forespørsler, dokumentskanningssider, lagring og reaktiveringsgebyr. Offisielle rapporter (filings) og e-fakturaer fra en sandkassebedrift går alltid til administrasjonenes testendepunkter.

2. De første kallene

Hver operasjon utføres som POST /v1/{module}/{resource}/{action} med en JSON-melding i innholdet (body). Slik oppretter du en kunde:

curl -X POST https://api.nordlet.com/v1/partners/create \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: partner-create-001" \
  -d '{"name": "UAB Klientas", "code": "301111222", "vatCode": "LT100001112223"}'

Utsted en faktura (beløp oppgis som desimaltekst, aldri flyttall):

curl -X POST https://api.nordlet.com/v1/sales/invoices/create \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{
    "partnerId": "<partner id>",
    "lines": [{"description": "Konsultacijos", "quantity": 4, "unitPriceExclVat": "75.0000", "vatClassifierCode": "PVM1"}]
  }'

curl -X POST https://api.nordlet.com/v1/sales/invoices/issue \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"id": "<invoice id>", "issueDate": "2026-07-09"}'

Utstedelse tildeler et hullfritt nummer (SF-1), sjekker at regnskapsperioden er åpen, og bokfører det balanserte bilaget (D 2410 fordring / K 5001 salgsinntekt / K 4492 mva) i samme transaksjon.

3. Hele syklusen

Trinn Kall
Overfør regnskapet fra et tidligere system migration/books/validate → migration/books/import - se Migrering fra et annet system
Registrer en leverandørfaktura purchases/invoices/create → purchases/invoices/register
Importer et kontouttog bank/statements/import (camt.053 XML) eller bank/transactions/import (JSON)
Hent forslag til avstemming bank/transactions/suggest-matches
Avstem en betaling bank/transactions/match - bokfører betalingen og oppdaterer paymentStatus
Betal leverandører bank/payments/export - pain.001 SEPA-fil for banken din
Månedlige mva-registre declarations/lt/isaf/generate - i.SAF 1.2 XML for VMI
Mva-meldingstall declarations/lt/fr0600/compute - FR0600-poster avstemt mot registre
Send varer med fraktbrev transport/waybills/create → issue, deretter declarations/lt/ivaz/generate - i.VAZ XML for VMI

4. TypeScript-SDK

import { createNordletClient, idempotent } from '@nordlet/sdk'

const client = createNordletClient({
  baseUrl: 'https://api.nordlet.com',
  apiKey: process.env.NORDLET_API_KEY!,
})

const { data, error } = await client.POST('/v1/sales/invoices/create', {
  body: {
    partnerId,
    lines: [{ description: 'Konsultacijos', quantity: 4, unitPriceExclVat: '75.0000' }],
  },
  ...idempotent(`order-${orderId}`),
})

SDK-et genereres direkte fra den aktive OpenAPI-spesifikasjonen (pnpm --filter @nordlet/sdk generate), slik at alle forespørsler og svar har fullstendige typer.

5. Webhooks

Abonner på hendelser i stedet for å avspørre (polling) API-et:

curl -X POST https://api.nordlet.com/v1/webhooks/subscriptions/create \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/hooks/hyperion", "events": ["sale_invoice.issued", "sale_invoice.paid"]}'

Meldinger leveres med en tidsstempling med HMAC-signatur (x-nordlet-signature-v2: t=<unix seconds>,v1=<hex> over <timestamp>.<raw body> med abonnementshemmeligheten din) i tillegg til den opprinnelige x-nordlet-signature: sha256=<hex> for selve innholdet, og levering forsøkes på nytt i omtrent 24 timer. Se API-konvensjoner for informasjon om gjenbrukingsvinduet (replay window).

Hver leveringsmelding har formatet { id, version, companyId, eventType, createdAt, data }: version er konvoluttversjonen (for tiden 1) og companyId er bedriften som hendelsen tilhører, slik at én mottaker kan betjene flere bedrifter. Abonnement på et navn som ikke finnes i listen nedenfor, avvises med 400. Bruk "*" for å abonnere på alle hendelser. Hvis 5 hendelser på rad ikke kan leveres, settes abonnementet på pause, og eierne av bedriften mottar en e-post. Du kan aktivere det igjen under Konto → Webhooks eller ved hjelp av webhooks/subscriptions/update med isActive: true.

Hendelser: agreement.invoice_generated, bank_feed.synced, document_capture.peppol_received, filing.failed, filing.rejected, goods_receipt.posted, intercompany.invoice_mirrored, item.created, item.deleted, item.updated, lead.converted, lead.created, partner_inquiry.created, payroll_run.approved, payroll_run.reversed, pos_report.created, price_list.updated, purchase_invoice.paid, purchase_invoice.registered, purchase_order.approved, purchase_order.received, refund_liability.actual, refund_liability.trued_up, report.completed, report.failed, revenue_recognition.modified, revenue_recognition.posted, sale_invoice.einvoice_sent, sale_invoice.issued, sale_invoice.paid, sale_invoice.peppol_delivered, sale_invoice.peppol_failed, sale_invoice.peppol_rejected, sale_invoice.peppol_sent, sale_invoice.quote_sent, sale_invoice.sent, sales_order.created, sales_order.fulfilled, settlement.imported, settlement.posted, settlement.updated, stock.changed, stock.reorder_needed, vat_review.opened, vat_review.resolved. OpenAPI-dokumentet lister opp hver enkelt under x-webhooks.

Se API-konvensjoner for listeforespørsler, feilkonvolutter, idempotens og hastighetsgrenser (rate limits).