Nordlet

← Dokumentation / Guider

Kom igång

API-nycklar, första anropen, hela faktureringscykeln, SDK:er och webhooks.

Nordlet är en API-förstoring (API-first) bokföringsplattform för EU/EES-marknaden som lanseras med fullständig anpassning till litauiska regelverk. Allt som produkten gör - fakturering, huvudbok, bankavstämning och i.SAF - är tillgängligt via ett enda JSON-API.

1. Skaffa en API-nyckel

Varje anrop autentiseras med en Bearer-API-nyckel som är kopplad till ett företag:

Authorization: Bearer nl_...

För lokal utveckling kan du starta upp ett företag och en nyckel med:

pnpm --filter @nordlet/db bootstrap:dev     # tomt företag
pnpm --filter @nordlet/api seed:demo        # företag med demodata

Interaktiv API-referens (OpenAPI-specifikation på /openapi.json; en lokal instans nås på http://localhost:3001/docs).

Postman

Föredrar du Postman? Importera den färdiga samlingen - varje ände, grupperad efter modul, med förkonfigurerad bearer-autentisering: Nordlet Postman-samling. Efter importen sätter du samlingens variabel bearerToken till din API-nyckel och därefter är varje anrop autentiserat.

Sandlådeföretag

För integrationstester skapar du ett företag med isSandbox: true (POST /v1/account/companies/create, eller genom att kryssa i sandlåderutan under onboarding i appen). Ett sandlådeföretag fungerar exakt som ett riktigt företag - samma moduler, samma API, så att du kan köra igenom realistiska transaktionsvolymer - men det är tydligt märkt som testdata och raderas omedelbart i stället för efter 10-dagarslagringen när det tas bort. Du kan köra ett valfritt antal sandlådeföretag bredvid ditt riktiga företag under samma konto; flaggan går inte att ändra efter skapandet, vilket säkerställer att riktiga räkenskaper aldrig av misstag omklassificeras som testdata. Användningen i ett sandlådeföretag mäts och faktureras på exakt samma sätt som i ett riktigt företag: anrop, dokumentskanningssidor, lagring och reaktiveringsavgift. Skattedeklarationer och e-fakturor från ett sandlådeföretag går alltid till myndigheternas testmiljöer.

2. Första anropen

Varje åtgärd görs via POST /v1/{module}/{resource}/{action} med en JSON-brödtext (body). Skapa en kund:

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

Utfärda en faktura (belopp anges som decimalsträngar, aldrig flyttal):

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

När fakturan utfärdas tilldelas ett löpande nummer utan luckor (SF-1), systemet kontrollerar att redovisningsperioden är öppen och bokför den balanserade verifikationen (D 2410 kundfordringar / K 5001 försäljningsintäkter / K 4492 utgående moms) i samma transaktion.

3. Hela cykeln

Steg Anrop
Flytta över bokföringen från ett tidigare system migration/books/validate → migration/books/import - se Migrera från ett annat system
Registrera en leverantörsfaktura purchases/invoices/create → purchases/invoices/register
Importera ett kontoutdrag bank/statements/import (camt.053 XML) eller bank/transactions/import (JSON)
Hämta matchningsförslag bank/transactions/suggest-matches
Avstäm en betalning bank/transactions/match - bokför betalningen och uppdaterar paymentStatus
Betala leverantörer bank/payments/export - pain.001 SEPA-fil för din bank
Månatliga momsdeklarationer declarations/lt/isaf/generate - i.SAF 1.2 XML för VMI
Uppgifter för momsredovisning declarations/lt/fr0600/compute - FR0600-fält avstämda mot registren
Leverera varor med fraktsedel transport/waybills/create → issue, följt av declarations/lt/ivaz/generate - i.VAZ XML för 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:n genereras direkt från den aktuella OpenAPI-specifikationen (pnpm --filter @nordlet/sdk generate), vilket innebär att varje anrop och svar har fullständiga typdefinitioner.

5. Webhooks

Prenumerera på händelser i stället för att polla:

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

Meddelanden levereras med en tidsstämplad HMAC-signatur (x-nordlet-signature-v2: t=<unix seconds>,v1=<hex> beräknad på <timestamp>.<raw body> med din prenumerationshemlighet) vid sidan av den ursprungliga x-nordlet-signature: sha256=<hex> för rådata, och leveransen görs om vid misslyckande i upp till cirka 24 timmar. Se API-konventioner för information om omspelsfönstret (replay window).

Varje levererad meddelandekropp har formatet { id, version, companyId, eventType, createdAt, data }: version är kuvertversionen (för närvarande 1) och companyId är det företag som händelsen tillhör, vilket gör att en enda mottagare kan hantera flera företag. Om du prenumererar på ett namn som inte finns med i listan nedan avvisas förfrågan med 400; använd "*" för att prenumerera på alla händelser. Om 5 händelser i rad inte kan levereras pausas prenumerationen och företagsägarna meddelas via e-post. Du kan återuppta prenumerationen under Account → Webhooks eller genom att anropa webhooks/subscriptions/update med 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 förtecknar var och en av dem under x-webhooks.

Se API-konventioner för listfrågor, felkuvert, semantik för idempotens och hastighetsbegränsningar (rate limits).