Nordlet

← Dokumentation / Guides

Kom i gang

API-nøgler, første kald, hele faktureringscyklussen, SDK'er og webhooks.

Nordlet er en API-først regnskabsplatform til EU/EØS-markedet, der lanceres med fuld litauisk overensstemmelse (compliance). Alt, hvad produktet foretager sig - fakturering, finansbog (general ledger), bankafstemning, i.SAF - er tilgængeligt via et enkelt JSON-API.

1. Få en API-nøgle

Hvert enkelt kald godkendes med en Bearer API-nøgle knyttet til en enkelt virksomhed:

Authorization: Bearer nl_...

Til lokal udvikling kan du oprette en virksomhed og en nøgle:

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

Interaktiv API-reference (OpenAPI-specifikation på /openapi.json; en lokal instans stiller den samme reference til rådighed på http://localhost:3001/docs).

Postman

Foretrækker du Postman? Importer den færdige samling - alle endpoints grupperet efter modul med bearer-godkendelse forudkonfigureret: Nordlet Postman-samling. Når du har importeret den, skal du indstille samlingens bearerToken-variabel til din API-nøgle, hvorefter alle anmodninger godkendes automatisk.

Sandkassevirksomheder

Til integrationstest kan du oprette en virksomhed med isSandbox: true (POST /v1/account/companies/create eller ved at markere sandkasse-afkrydsningsfeltet under opstart (onboarding) i appen). En sandkassevirksomhed opfører sig fuldstændig som en rigtig virksomhed - de samme moduler og det samme API, så du kan sende realistiske transaktionsmængder igennem - men den er tydeligt mærket som testdata, og hvis du sletter den, slettes alt med det samme i stedet for efter 10-dages opbevaringsvinduet. Du kan køre et valgfrit antal sandkassevirksomheder sideløbende med din rigtige virksomhed under den samme konto; flaget kan ikke ændres efter oprettelse, så rigtige regnskaber kan aldrig ved et uheld blive omklassificeret til testdata. Forbruget i en sandkassevirksomhed måles og afregnes på nøjagtig samme måde som forbruget i en rigtig virksomhed: anmodninger, dokumentscanningssider, lagring og genaktiveringsgebyret. Angivelser og e-fakturaer fra en sandkassevirksomhed sendes altid til administrationernes test-endpoints.

2. Første kald

Enhver handling udføres som POST /v1/{module}/{resource}/{action} med et JSON-brødtekst (body). Opret en kunde (partner):

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

Udsted en faktura (beløb er decimale strenge, aldrig flydende tal (floats)):

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

Ved udstedelse tildeles et uafbrudt nummer (SF-1), det kontrolleres, at regnskabsperioden er åben, og den afbalancerede postering (D 2410 debitorer / K 5001 omsætning / K 4492 moms) bogføres i samme transaktion.

3. Hele cyklussen

Trin Kald
Overfør regnskabet fra et tidligere system migration/books/validate → migration/books/import - se Migrering fra et andet system
Registrer en leverandørfaktura purchases/invoices/create → purchases/invoices/register
Importer et kontoudtog bank/statements/import (camt.053 XML) eller bank/transactions/import (JSON)
Hent matchforslag bank/transactions/suggest-matches
Afstem en betaling bank/transactions/match - bogfører betalingen og opdaterer paymentStatus
Betal leverandører bank/payments/export - pain.001 SEPA-fil til din bank
Månedlige momsregistre declarations/lt/isaf/generate - i.SAF 1.2 XML til VMI
Momsangivelsestal declarations/lt/fr0600/compute - FR0600-felter afstemt mod registrene
Send varer med en fragtseddel (waybill) transport/waybills/create → issue, derefter declarations/lt/ivaz/generate - i.VAZ XML til 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 ud fra den aktuelle OpenAPI-specifikation (pnpm --filter @nordlet/sdk generate), så hver enkelt anmodning og svar er fuldt typet.

5. Webhooks

Abonner på hændelser i stedet for at foretage forespørgsler (polling):

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

Leverancer indeholder en tidsstemplingsbaseret HMAC-signatur (x-nordlet-signature-v2: t=<unix seconds>,v1=<hex> over <timestamp>.<raw body> med din abonnementshemmelighed) ved siden af den oprindelige x-nordlet-signature: sha256=<hex> af den rå brødtekst, og der forsøges igen i ca. 24 timer. Se API-konventioner for genafspilningsvinduet (replay window).

Hver leveringsbrødtekst har formlen { id, version, companyId, eventType, createdAt, data }: version er afilingsversionen (aktuelt 1) og companyId er den virksomhed, hændelsen tilhører, så en enkelt modtager kan betjene flere virksomheder. Abonnering på et navn, der ikke findes på listen nedenfor, afvises med 400; brug "*" for alle hændelser. Hvis 5 hændelser i træk ikke kan leveres, sættes abonnementet på pause, og virksomhedens ejere modtager en e-mail; genoptag det under Konto → Webhooks eller med webhooks/subscriptions/update og isActive: true.

Hændelser: 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 oplister hver enkelt under x-webhooks.

Se API-konventioner for liste-forespørgsler, fejlmeddelelser (error envelopes), idempotens-semantik og hastighedsgrænser (rate limits).