gnubok

Errors

Every error returned by the gnubok REST API uses a stable code from this catalogue. Codes never change once shipped — agents can pattern-match on them safely. The docs_url field on every error envelope points at the anchor for that specific code.

Envelope shape

{
  "error": {
    "code": "PERIOD_LOCKED",
    "message": "Den valda perioden är låst.",
    "message_en": "The selected period is locked.",
    "remediation": {
      "description": "Unlock via /fiscal-periods/{id}/unlock or pick an open period.",
      "tool": "fiscal_periods.unlock"
    },
    "details": { "fiscal_period_id": "..." },
    "docs_url": "https://gnubok.app/docs/api/errors#period_locked"
  },
  "meta": { "request_id": "req_...", "api_version": "..." }
}

The message field is Swedish (matches the dashboard); message_en is English (for agent and developer logs); remediation (when present) hints at the canonical fix and may include a tool reference into the MCP surface.

Generic

Cross-cutting codes returned by any endpoint.

COMPANY_CONTEXT_MISSING

HTTP 400 — Bad request

No active company context resolved for the request.

Swedish: Ingen aktiv företagskontext. Välj ett företag och försök igen.

CONFLICT

HTTP 409 — Conflict

Conflict.

Swedish: En konflikt uppstod. Ladda om sidan och försök igen.

FORBIDDEN

HTTP 403 — Forbidden

Insufficient permissions.

Swedish: Du har inte behörighet att utföra denna åtgärd.

IDEMPOTENCY_KEY_REUSE

HTTP 409 — Conflict

Idempotency key was previously used with a different request body.

Swedish: Idempotensnyckeln har redan använts med en annan begäran.

Remediation: Use a fresh UUID for a new operation, or send the original request body to replay.

INSUFFICIENT_SCOPE

HTTP 403 — Forbidden

The current API key does not have the required scope.

Swedish: API-nyckeln saknar behörighet för denna åtgärd.

Remediation: Mint a new key with the missing scope or grant it through the API key settings. Related resource: gnubok://capabilities

INTERNAL_ERROR

HTTP 500 — Server error

Internal server error.

Swedish: Ett oväntat serverfel uppstod. Försök igen senare.

MFA_REQUIRED

HTTP 403 — Forbidden

MFA verification required.

Swedish: Tvåstegsverifiering krävs för att utföra åtgärden.

NOT_FOUND

HTTP 404 — Not found

Resource not found.

Swedish: Resursen kunde inte hittas.

NOT_IMPLEMENTED

HTTP 501 — Not implemented

This feature is accepted by the schema but not yet implemented.

Swedish: Funktionen är inte implementerad ännu.

RATE_LIMITED

HTTP 429 — Rate limited

Rate limit exceeded.

Swedish: För många förfrågningar. Vänta en stund och försök igen.

UNAUTHORIZED

HTTP 401 — Unauthorized

Authentication required.

Swedish: Din session har gått ut. Logga in igen.

UNKNOWN_ERROR

HTTP 500 — Server error

An unexpected error occurred.

Swedish: Något gick fel. Försök igen.

VALIDATION_ERROR

HTTP 400 — Bad request

Validation error.

Swedish: Förfrågan innehåller ogiltiga uppgifter.

Bookkeeping engine

Errors from the journal-entry lifecycle (create, commit, reverse, correct).

BOOKKEEPING_DATABASE_ERROR

HTTP 500 — Server error

Bookkeeping database operation failed.

Swedish: Verifikationen kunde inte sparas. Försök igen.

JOURNAL_ENTRY_NOT_BALANCED

HTTP 400 — Bad request

Debits and credits do not match.

Swedish: Verifikationen balanserar inte.

Remediation: Recalculate the lines so totals are equal before retrying.

JOURNAL_ENTRY_NOT_FOUND

HTTP 404 — Not found

Journal entry not found.

Swedish: Verifikationen kunde inte hittas.

Periods + year-end

Fiscal period locking, year-end closing, opening balances, FX revaluation.

FX_FAILED

HTTP 400 — Bad request

Currency revaluation failed.

Swedish: Valutaomvärderingen misslyckades.

FX_PERIOD_CLOSED

HTTP 400 — Bad request

Period is already closed; currency revaluation cannot be run.

Swedish: Perioden är redan stängd. Valutaomvärdering kan inte köras.

FX_PERIOD_NOT_FOUND

HTTP 404 — Not found

Fiscal period not found.

Swedish: Räkenskapsperioden kunde inte hittas.

PERIOD_HAS_UNBOOKED_TRANSACTIONS

HTTP 400 — Bad request

The period contains uncategorized business transactions.

Swedish: Perioden innehåller okategoriserade affärstransaktioner. Bokför eller markera dem som privata innan låsning.

Remediation: Categorize or mark uncategorized transactions before locking. Related tool: gnubok_list_uncategorized_transactions

PERIOD_LOCKED

HTTP 400 — Bad request

Period is locked or closed; entries cannot be added.

Swedish: Bokföringen är låst för denna period.

PERIOD_LOCK_ALREADY_LOCKED

HTTP 409 — Conflict

Period is already locked.

Swedish: Perioden är redan låst.

PERIOD_LOCK_FAILED

HTTP 400 — Bad request

Failed to lock period.

Swedish: Perioden kunde inte låsas.

PERIOD_LOCK_HAS_DRAFTS

HTTP 400 — Bad request

Period contains draft journal entries.

Swedish: Perioden innehåller verifikationsutkast som måste bokföras eller raderas innan låsning.

PERIOD_NOT_FOUND

HTTP 404 — Not found

Fiscal period not found.

Swedish: Räkenskapsperioden kunde inte hittas.

PERIOD_NOT_LOCKED

HTTP 400 — Bad request

Period must be locked before it can be closed.

Swedish: Perioden måste först låsas innan den kan stängas.

Remediation: Call gnubok_lock_period before closing. Related tool: gnubok_lock_period

YEAR_END_FAILED

HTTP 400 — Bad request

Failed to execute year-end closing.

Swedish: Bokslutet kunde inte verkställas.

YEAR_END_NOT_RUN

HTTP 400 — Bad request

Year-end closing must be executed before the period can be closed.

Swedish: Bokslutsåtgärder måste utföras innan perioden kan stängas.

YEAR_END_PREVIEW_FAILED

HTTP 400 — Bad request

Failed to preview year-end closing.

Swedish: Bokslutsförhandsgranskningen misslyckades.

YEAR_END_PRIOR_PERIOD_OPEN

HTTP 400 — Bad request

A prior fiscal period is still open.

Swedish: En tidigare period är fortfarande öppen. Stäng den först.

YEAR_END_UNBALANCED_TRIAL

HTTP 400 — Bad request

Trial balance does not balance.

Swedish: Resultaträkningens debet och kredit balanserar inte. Granska verifikationerna innan bokslut.

Invoices

Customer invoice lifecycle: draft, send, mark paid, credit.

CUSTOMER_CREATE_FAILED

HTTP 500 — Server error

Failed to create customer.

Swedish: Kunden kunde inte skapas.

CUSTOMER_DELETE_FAILED

HTTP 500 — Server error

Failed to delete customer.

Swedish: Kunden kunde inte tas bort.

CUSTOMER_DUPLICATE_ORG_NUMBER

HTTP 409 — Conflict

A customer with that organisation number already exists.

Swedish: En kund med samma organisationsnummer finns redan.

CUSTOMER_HAS_INVOICES

HTTP 409 — Conflict

Customer cannot be deleted while invoices reference it.

Swedish: Kunden har fakturor och kan inte tas bort.

CUSTOMER_NOT_FOUND

HTTP 404 — Not found

Customer not found.

Swedish: Kunden kunde inte hittas.

CUSTOMER_UPDATE_FAILED

HTTP 500 — Server error

Failed to update customer.

Swedish: Kunden kunde inte uppdateras.

INVOICE_ALREADY_SENT

HTTP 409 — Conflict

The invoice is already sent or paid.

Swedish: Fakturan har redan skickats eller betalats.

INVOICE_CANCEL_RACE

HTTP 409 — Conflict

Invoice was modified concurrently and could not be cancelled. Reload and retry.

Swedish: Fakturan ändrades samtidigt och kunde inte makuleras. Ladda om och försök igen.

INVOICE_CREATE_INSERT_FAILED

HTTP 500 — Server error

Invoice insert failed.

Swedish: Fakturan kunde inte sparas.

INVOICE_CREATE_ITEMS_FAILED

HTTP 500 — Server error

Invoice items insert failed.

Swedish: Fakturaraderna kunde inte sparas.

INVOICE_CREATE_NUMBER_ASSIGN_FAILED

HTTP 500 — Server error

Failed to assign invoice number on create.

Swedish: Kunde inte tilldela fakturanummer vid skapande.

INVOICE_CREATE_VAT_RULE_VIOLATION

HTTP 400 — Bad request

The VAT rate is not allowed for this customer type.

Swedish: Momssatsen är inte tillåten för denna kundtyp.

INVOICE_CREDIT_ALREADY_CREDITED

HTTP 400 — Bad request

Invoice has already been credited.

Swedish: Fakturan har redan krediterats.

INVOICE_CREDIT_NOT_INVOICE

HTTP 400 — Bad request

Credit notes can only be created from standard invoices.

Swedish: Kreditfakturor kan endast skapas från riktiga fakturor.

INVOICE_CREDIT_NOT_SENT

HTTP 400 — Bad request

Only sent, paid, or overdue invoices can be credited.

Swedish: Endast skickade, betalda eller förfallna fakturor kan krediteras.

INVOICE_CREDIT_ORIGINAL_NOT_FOUND

HTTP 404 — Not found

Original invoice not found.

Swedish: Ursprungsfakturan kunde inte hittas.

INVOICE_CUSTOMER_NOT_FOUND

HTTP 404 — Not found

Customer not found.

Swedish: Kunden kunde inte hittas.

INVOICE_DELETE_NOT_DRAFT

HTTP 400 — Bad request

Only draft invoices can be deleted; non-drafts must be credited.

Swedish: Endast utkast kan tas bort. Bokförda fakturor måste krediteras istället.

Remediation: Issue a credit note instead of deleting a posted invoice.

INVOICE_PAID_BOOK_FAILED

HTTP 500 — Server error

Failed to create payment journal entry.

Swedish: Kunde inte bokföra betalningen.

INVOICE_PAID_LIKELY_DUPLICATE

HTTP 409 — Conflict

A likely-matching unlinked inbound bank transaction was found for this customer. Suggest linking it instead of creating a new payment entry.

Swedish: Det finns redan en obokförd inkommande banktransaktion som kan vara denna betalning. Länka den istället, eller markera som betald ändå om du är säker.

Remediation: Match the candidate transaction via POST /api/transactions/{id}/match-invoice, or resend mark-paid with force: true to create the payment entry anyway. When using the v1 endpoint, the force retry requires a fresh Idempotency-Key (the original key is bound to the body hash).

INVOICE_PAID_LINES_UNBALANCED

HTTP 400 — Bad request

Custom journal lines do not balance.

Swedish: Verifikationsraderna är inte balanserade (debet ≠ kredit).

INVOICE_PAID_NOT_FOUND

HTTP 404 — Not found

Invoice not found.

Swedish: Fakturan kunde inte hittas.

INVOICE_PAID_NOT_PAYABLE

HTTP 400 — Bad request

Invoice is not in a payable status.

Swedish: Fakturan kan inte markeras som betald i nuvarande status.

INVOICE_PAID_NO_FISCAL_PERIOD

HTTP 400 — Bad request

No open fiscal period covers the payment date.

Swedish: Ingen öppen räkenskapsperiod för betalningsdatumet.

INVOICE_PAID_RACE

HTTP 409 — Conflict

Invoice was already paid by another request.

Swedish: Fakturan har redan betalats av en annan förfrågan.

INVOICE_PDF_RENDER_FAILED

HTTP 500 — Server error

Invoice PDF rendering failed.

Swedish: Fakturans PDF kunde inte skapas.

INVOICE_SEND_CANCELLED

HTTP 400 — Bad request

Cancelled invoices cannot be sent; create a new invoice instead.

Swedish: Makulerade fakturor kan inte skickas. Skapa en ny faktura istället.

INVOICE_SEND_COMPANY_SETTINGS_MISSING

HTTP 404 — Not found

Company settings are missing.

Swedish: Företagsinställningar saknas.

INVOICE_SEND_EMAIL_NOT_CONFIGURED

HTTP 503

Email service is not configured.

Swedish: E-posttjänsten är inte konfigurerad. Kontrollera att RESEND_API_KEY och RESEND_FROM_EMAIL är satta.

Remediation: Set RESEND_API_KEY and RESEND_FROM_EMAIL in the deployment environment.

INVOICE_SEND_NO_CUSTOMER_EMAIL

HTTP 400 — Bad request

Customer has no email address.

Swedish: Kunden saknar e-postadress. Uppdatera kunduppgifterna först.

Remediation: Add an email address on the customer record before sending.

INVOICE_SEND_NUMBER_ASSIGN_FAILED

HTTP 500 — Server error

Failed to assign invoice number on send.

Swedish: Kunde inte tilldela fakturanummer.

INVOICE_SEND_PARTIAL

HTTP 200

Invoice was sent but a follow-up step (journal entry or PDF) failed.

Swedish: Fakturan skickades men en efterföljande åtgärd misslyckades (verifikation eller PDF-bilaga).

INVOICE_SEND_PDF_RENDER_FAILED

HTTP 500 — Server error

Failed to render invoice PDF before send; no invoice number was consumed.

Swedish: Fakturans PDF kunde inte skapas. Kontrollera fakturarader och kunduppgifter och försök igen.

INVOICE_SEND_PROVIDER_FAILED

HTTP 502

The email provider could not deliver the message.

Swedish: E-postleverantören kunde inte skicka meddelandet.

INVOICE_UPDATE_NOT_DRAFT

HTTP 409 — Conflict

Only draft invoices can be updated. Issued invoices are immutable — issue a credit note instead.

Swedish: Endast utkast kan ändras. Bokförda fakturor är oföränderliga — utfärda en kreditfaktura istället.

Remediation: Issue a credit note via POST /invoices/{id}:credit and create a fresh invoice with the corrected details.

Supplier invoices

AP lifecycle: register, approve, mark paid, credit.

SUPPLIER_CREATE_FAILED

HTTP 500 — Server error

Failed to create supplier.

Swedish: Leverantören kunde inte skapas.

SUPPLIER_DELETE_FAILED

HTTP 500 — Server error

Failed to delete supplier.

Swedish: Leverantören kunde inte tas bort.

SUPPLIER_DUPLICATE_ORG_NUMBER

HTTP 409 — Conflict

A supplier with that organisation number already exists.

Swedish: En leverantör med samma organisationsnummer finns redan.

SUPPLIER_HAS_INVOICES

HTTP 409 — Conflict

Supplier cannot be archived while open supplier invoices reference it.

Swedish: Leverantören kan inte arkiveras eftersom det finns öppna leverantörsfakturor som refererar till den.

Remediation: Close (credit / mark paid) every open supplier invoice before archiving the supplier. The dashboard exposes the same blocker.

SUPPLIER_NOT_FOUND

HTTP 404 — Not found

Supplier not found.

Swedish: Leverantören kunde inte hittas.

SUPPLIER_UPDATE_FAILED

HTTP 500 — Server error

Failed to update supplier.

Swedish: Leverantören kunde inte uppdateras.

Transactions

Bank transaction ingest, categorisation, matching.

MATCH_INVOICE_ALREADY_PAID

HTTP 409 — Conflict

Invoice has already been fully paid or is no longer matchable.

Swedish: Fakturan har redan slutbetalats av en annan förfrågan.

MATCH_INVOICE_DUPLICATE_PAYMENT

HTTP 409 — Conflict

This transaction is already matched to this invoice.

Swedish: Den här transaktionen är redan matchad mot fakturan.

HTTP 500 — Server error

Failed to link transaction to invoice.

Swedish: Kunde inte koppla transaktionen till fakturan.

MATCH_INVOICE_NOT_FOUND

HTTP 404 — Not found

Invoice not found.

Swedish: Fakturan kunde inte hittas.

MATCH_INVOICE_NOT_INCOME

HTTP 400 — Bad request

Only income transactions can be matched to customer invoices.

Swedish: Endast intäktstransaktioner kan matchas mot kundfakturor.

MATCH_INVOICE_NOT_INVOICE_TYPE

HTTP 400 — Bad request

Only invoices may be matched to a transaction; proforma and delivery notes have no VAT obligation.

Swedish: Endast fakturor kan matchas mot en transaktion. Proforma och följesedel saknar momsskyldighet.

MATCH_INVOICE_NOT_OPEN

HTTP 400 — Bad request

Invoice is not in an unpaid state.

Swedish: Fakturan är inte i ett obetalt läge och kan inte matchas.

MATCH_INVOICE_PARTIAL

HTTP 200

Match recorded but the journal entry could not be created.

Swedish: Matchningen registrerades men verifikationen kunde inte skapas.

MATCH_INVOICE_RECORD_PAYMENT_FAILED

HTTP 500 — Server error

Failed to record invoice payment.

Swedish: Kunde inte registrera fakturabetalningen.

MATCH_INVOICE_TX_ALREADY_LINKED

HTTP 400 — Bad request

Transaction is already linked to an invoice.

Swedish: Transaktionen är redan kopplad till en faktura.

MATCH_SI_ALREADY_PAID

HTTP 400 — Bad request

Supplier invoice is already paid or credited.

Swedish: Leverantörsfakturan är redan betald eller krediterad.

MATCH_SI_CASH_FX_UNSUPPORTED

HTTP 400 — Bad request

Cash accounting does not support exchange-rate differences. Switch to accrual or book the FX difference manually.

Swedish: Kontantmetoden stödjer inte valutakursdifferenser. Byt till löpande bokföring eller bokför valutakursdifferensen manuellt.

MATCH_SI_DUPLICATE_PAYMENT

HTTP 409 — Conflict

This transaction is already matched to this supplier invoice.

Swedish: Den här transaktionen är redan matchad mot leverantörsfakturan.

HTTP 500 — Server error

Failed to link transaction to supplier invoice.

Swedish: Kunde inte koppla transaktionen till leverantörsfakturan.

MATCH_SI_NOT_EXPENSE

HTTP 400 — Bad request

Only expense transactions can be matched to supplier invoices.

Swedish: Endast utgiftstransaktioner kan matchas mot leverantörsfakturor.

MATCH_SI_NOT_FOUND

HTTP 404 — Not found

Supplier invoice not found.

Swedish: Leverantörsfakturan kunde inte hittas.

MATCH_SI_NOT_OPEN

HTTP 409 — Conflict

Supplier invoice has already been fully paid or is no longer matchable.

Swedish: Leverantörsfakturan har redan slutbetalats av en annan förfrågan.

MATCH_SI_RECORD_PAYMENT_FAILED

HTTP 500 — Server error

Failed to record supplier invoice payment.

Swedish: Kunde inte registrera leverantörsfakturabetalningen.

MATCH_SI_TX_ALREADY_LINKED

HTTP 400 — Bad request

Transaction is already linked to a supplier invoice.

Swedish: Transaktionen är redan kopplad till en leverantörsfaktura.

TRANSACTION_ALREADY_CATEGORIZED

HTTP 409 — Conflict

The transaction already has a journal entry.

Swedish: Transaktionen är redan bokförd. Ångra kategoriseringen om du vill ändra den.

Remediation: Use gnubok_uncategorize_transaction first if you need to recategorize. Related tool: gnubok_uncategorize_transaction

Reports

Report generation: VAT declaration, periodisk sammanställning, SIE export, INK2.

PS_REPORT_CSV_BLOCKED_BY_ERRORS

HTTP 400 — Bad request

CSV download blocked by validation errors. Fix them first.

Swedish: CSV kan inte laddas ner. Åtgärda blockerande fel först.

PS_REPORT_GENERATION_FAILED

HTTP 500 — Server error

Failed to generate periodisk sammanställning.

Swedish: Periodisk sammanställning kunde inte beräknas.

PS_REPORT_INVALID_PERIOD

HTTP 400 — Bad request

period is invalid for the chosen period type.

Swedish: period är ogiltig för vald periodtyp.

PS_REPORT_INVALID_PERIOD_TYPE

HTTP 400 — Bad request

periodType must be monthly or quarterly.

Swedish: periodType måste vara monthly eller quarterly.

PS_REPORT_INVALID_YEAR

HTTP 400 — Bad request

year must be a number between 2000 and 2100.

Swedish: year måste vara ett giltigt årtal mellan 2000 och 2100.

PS_REPORT_MISSING_FILER_INFO

HTTP 400 — Bad request

Tax contact information is missing on company_settings.

Swedish: Kontaktuppgifter saknas. Fyll i namn, telefon och e-post under Inställningar.

PS_REPORT_MISSING_PARAMS

HTTP 400 — Bad request

periodType, year and period query parameters are required.

Swedish: periodType, year och period krävs.

REPORT_GENERATION_FAILED

HTTP 500 — Server error

Failed to generate the report.

Swedish: Rapporten kunde inte genereras.

REPORT_PERIOD_REQUIRED

HTTP 400 — Bad request

period_id query parameter is required.

Swedish: period_id krävs.

SIE_EXPORT_COMPANY_NOT_FOUND

HTTP 404 — Not found

Company settings missing; SIE export cannot be generated.

Swedish: Företagsinställningar saknas — SIE-exporten kan inte skapas.

SIE_EXPORT_FAILED

HTTP 500 — Server error

Failed to generate SIE export.

Swedish: SIE-exporten misslyckades.

TAX_DECL_GENERATION_FAILED

HTTP 500 — Server error

Failed to generate tax declaration.

Swedish: Skattedeklarationen kunde inte genereras.

VAT_REPORT_GENERATION_FAILED

HTTP 500 — Server error

Failed to calculate VAT declaration.

Swedish: Momsdeklarationen kunde inte beräknas.

VAT_REPORT_INVALID_PERIOD

HTTP 400 — Bad request

period is invalid for the chosen period type.

Swedish: period är ogiltig för vald periodtyp.

VAT_REPORT_INVALID_PERIOD_TYPE

HTTP 400 — Bad request

periodType must be one of monthly, quarterly, yearly.

Swedish: periodType måste vara monthly, quarterly eller yearly.

VAT_REPORT_INVALID_YEAR

HTTP 400 — Bad request

year must be a number between 2000 and 2100.

Swedish: year måste vara ett giltigt årtal mellan 2000 och 2100.

VAT_REPORT_MISSING_PARAMS

HTTP 400 — Bad request

periodType, year and period query parameters are required.

Swedish: periodType, year och period krävs.

Imports

SIE import, bank file import, opening-balance import, provider migration.

BANK_FILE_DUPLICATE

HTTP 409 — Conflict

Bank file has already been imported.

Swedish: Den här filen har redan importerats.

BANK_FILE_EXECUTE_FAILED

HTTP 500 — Server error

Bank file import failed.

Swedish: Bankfilsimporten misslyckades.

BANK_FILE_FORMAT_UNKNOWN

HTTP 400 — Bad request

Bank file format could not be identified.

Swedish: Bankfilens format kunde inte identifieras.

BANK_FILE_IMPORT_RECORD_FAILED

HTTP 500 — Server error

Failed to create the bank file import record.

Swedish: Kunde inte skapa importpost.

BANK_FILE_NO_FILE

HTTP 400 — Bad request

No file attached to the request.

Swedish: Ingen fil bifogad i förfrågan.

BANK_FILE_NO_TRANSACTIONS

HTTP 400 — Bad request

No transactions to import.

Swedish: Bankfilen innehåller inga transaktioner att importera.

BANK_FILE_PARSE_FAILED

HTTP 500 — Server error

Failed to parse the bank file.

Swedish: Kunde inte tolka bankfilen.

BANK_FILE_TOO_LARGE

HTTP 400 — Bad request

File exceeds the 10 MB size limit.

Swedish: Filen är för stor. Maxstorlek är 10 MB.

SIE_IMPORT_ACCOUNT_ACTIVATION_FAILED

HTTP 500 — Server error

Failed to activate mapped accounts in the chart of accounts.

Swedish: Kunde inte aktivera konton i kontoplanen. Kontrollera att kontona inte redan finns med andra inställningar.

SIE_IMPORT_DUPLICATE

HTTP 409 — Conflict

This SIE file has already been imported.

Swedish: Den här SIE-filen har redan importerats.

SIE_IMPORT_FAILED

HTTP 400 — Bad request

SIE import completed with errors.

Swedish: Importen slutfördes med fel. Se detaljerna nedan.

SIE_IMPORT_UNEXPECTED

HTTP 500 — Server error

Unexpected error during SIE import; no data was committed.

Swedish: Importen avbröts oväntat. Ingen data har sparats.

SIE_IMPORT_UNMAPPED_ACCOUNTS

HTTP 400 — Bad request

One or more accounts have no mapping target.

Swedish: Vissa konton saknar mappning. Gå tillbaka till kontomappningssteget och koppla alla konton.

Remediation: Map every source account to a BAS account before importing.

Salary + AGI

Payroll lifecycle, AGI generation, KU declarations.

AGI_FSKATT_VERIFICATION_FAILED

HTTP 400 — Bad request

F-skatt verification failed.

Swedish: F-skattekontrollen misslyckades. Kontrollera leverantörens F-skatt.

AGI_GENERATE_NOT_BOOKABLE

HTTP 400 — Bad request

AGI can only be generated for salary runs in review, approved, paid, booked, or corrected status.

Swedish: AGI kan endast genereras för lönekörningar i status review, approved, paid, booked eller corrected.

AGI_GENERATION_FAILED

HTTP 500 — Server error

Failed to generate AGI declaration.

Swedish: AGI-deklarationen kunde inte genereras.

AGI_INCOMPLETE_DATA

HTTP 400 — Bad request

AGI data is incomplete — verify the company has org number, contact name, phone, and email.

Swedish: AGI-data ofullständig — kontrollera att företaget har organisationsnummer, kontaktnamn, telefon och e-post.

AGI_NO_SALARY_RUN

HTTP 400 — Bad request

No salary run exists for the period.

Swedish: Det finns ingen lönekörning för perioden.

EMPLOYEE_DUPLICATE_PERSONNUMMER

HTTP 409 — Conflict

An employee with that personnummer already exists.

Swedish: En anställd med samma personnummer finns redan.

EMPLOYEE_NOT_FOUND

HTTP 404 — Not found

Employee not found.

Swedish: Den anställda kunde inte hittas.

SALARY_RUN_APPROVE_NOT_REVIEW

HTTP 400 — Bad request

Salary run must be in review status to approve.

Swedish: Lönekörningen måste vara i status review för godkännande.

SALARY_RUN_APPROVE_VALIDATION_FAILED

HTTP 400 — Bad request

Validation failed — fix issues before approving.

Swedish: Valideringsfel — korrigera innan godkännande.

SALARY_RUN_BOOK_FAILED

HTTP 500 — Server error

Failed to book salary run.

Swedish: Lönekörningen kunde inte bokföras.

SALARY_RUN_BOOK_NOT_PAID

HTTP 400 — Bad request

Salary run must be marked paid before booking.

Swedish: Lönekörningen måste vara markerad som betald för bokföring.

SALARY_RUN_CALCULATE_FAILED

HTTP 500 — Server error

Failed to calculate salary run.

Swedish: Lönekörningen kunde inte beräknas.

SALARY_RUN_CALCULATE_NOT_DRAFT

HTTP 400 — Bad request

Salary run must be in draft status to calculate.

Swedish: Lönekörningen måste vara i status draft för beräkning.

SALARY_RUN_CREATE_FAILED

HTTP 500 — Server error

Failed to create salary run.

Swedish: Lönekörningen kunde inte skapas.

SALARY_RUN_DELETE_HAS_JOURNAL_ENTRY

HTTP 400 — Bad request

Salary run is linked to a journal entry and cannot be deleted (BFL 5 kap räkenskapsinformation).

Swedish: Lönekörningen är kopplad till en verifikation och kan inte raderas (BFL 5 kap räkenskapsinformation).

SALARY_RUN_DELETE_NOT_DRAFT

HTTP 400 — Bad request

Only draft salary runs can be deleted.

Swedish: Endast utkast (draft) kan raderas.

SALARY_RUN_DUPLICATE_PERIOD

HTTP 409 — Conflict

A salary run for that period already exists.

Swedish: En lönekörning för perioden finns redan.

SALARY_RUN_MARK_PAID_NOT_APPROVED

HTTP 400 — Bad request

Salary run must be approved before it can be marked paid.

Swedish: Lönekörningen måste vara godkänd för att markeras som betald.

SALARY_RUN_NOT_CALCULATED

HTTP 400 — Bad request

Salary run must be calculated before booking.

Swedish: Lönekörningen måste beräknas innan bokföring.

SALARY_RUN_NOT_FOUND

HTTP 404 — Not found

Salary run not found.

Swedish: Lönekörningen kunde inte hittas.

SALARY_RUN_NO_EMPLOYEES

HTTP 400 — Bad request

No active employees in the company.

Swedish: Inga aktiva anställda finns i företaget.

SALARY_RUN_PATCH_NOT_DRAFT

HTTP 400 — Bad request

Only draft salary runs can be patched.

Swedish: Endast utkast (draft) kan uppdateras.

SALARY_RUN_PERIOD_LOCKED

HTTP 400 — Bad request

Salary run cannot be processed in a locked period.

Swedish: Lönekörningen kan inte göras i en låst period.

SALARY_RUN_TAX_TABLE_MISSING

HTTP 400 — Bad request

Tax table is missing for the period.

Swedish: Skattetabellen saknas för perioden. Importera skattetabellen först.

Company + API keys

Multi-tenant + auth lifecycle.

API_KEY_CREATE_FAILED

HTTP 500 — Server error

Failed to create API key.

Swedish: API-nyckeln kunde inte skapas.

API_KEY_NOT_FOUND

HTTP 404 — Not found

API key not found.

Swedish: API-nyckeln kunde inte hittas.

API_KEY_QUOTA_EXCEEDED

HTTP 429 — Rate limited

API key quota exceeded.

Swedish: Du har nått maxgränsen för antal API-nycklar.

API_KEY_REVOKE_FAILED

HTTP 500 — Server error

Failed to revoke API key.

Swedish: API-nyckeln kunde inte återkallas.

API_KEY_SCOPE_INVALID

HTTP 400 — Bad request

One or more requested scopes are invalid.

Swedish: En eller flera scopes är ogiltiga.

COMPANY_CREATE_BAS_SEED_FAILED

HTTP 500 — Server error

Failed to seed the chart of accounts.

Swedish: Kontoplanen kunde inte skapas. Försök igen.

COMPANY_CREATE_DUPLICATE_ORG_NUMBER

HTTP 409 — Conflict

A company with that organisation number already exists.

Swedish: Ett företag med samma organisationsnummer finns redan.

COMPANY_CREATE_FAILED

HTTP 500 — Server error

Failed to create company.

Swedish: Företaget kunde inte skapas.

COMPANY_NOT_FOUND

HTTP 404 — Not found

Company not found.

Swedish: Företaget kunde inte hittas.

Provider connections

External provider OAuth, sync, consent.

PROVIDER_ACCEPT_FAILED

HTTP 500 — Server error

Failed to accept consent.

Swedish: Kunde inte slutföra anslutningen.

PROVIDER_AUTH_EXPIRED

HTTP 401 — Unauthorized

Provider authentication expired or refresh failed.

Swedish: Anslutningen till leverantören har gått ut. Återanslut för att fortsätta.

PROVIDER_COMPANY_ID_REQUIRED

HTTP 400 — Bad request

companyId is required for this provider.

Swedish: companyId krävs för den här leverantören.

PROVIDER_CONNECT_FAILED

HTTP 500 — Server error

Failed to start provider connection flow.

Swedish: Kunde inte starta anslutningen till leverantören.

HTTP 404 — Not found

Provider consent not found.

Swedish: Anslutningen kunde inte hittas.

HTTP 400 — Bad request

Provider consent is not ready; finish authentication first.

Swedish: Anslutningen är inte klar. Slutför inloggningen först.

PROVIDER_DISCONNECT_FAILED

HTTP 500 — Server error

Provider disconnect failed.

Swedish: Frånkoppling från leverantören misslyckades.

PROVIDER_INVALID

HTTP 400 — Bad request

Unknown provider.

Swedish: Okänd leverantör.

PROVIDER_MIGRATE_FAILED

HTTP 500 — Server error

Provider migration failed.

Swedish: Migrationen från leverantören misslyckades.

PROVIDER_PREVIEW_FAILED

HTTP 500 — Server error

Provider preview failed.

Swedish: Förhandsgranskningen från leverantören misslyckades.

PROVIDER_RATE_LIMITED

HTTP 429 — Rate limited

Provider rate limit exceeded.

Swedish: Leverantören begränsar antalet anrop just nu. Vänta en stund och försök igen.

PROVIDER_SIE_FETCH_FAILED

HTTP 502

Failed to fetch SIE data from the provider.

Swedish: Kunde inte hämta SIE-data från leverantören.

PROVIDER_SIE_NO_YEARS

HTTP 404 — Not found

No fiscal years available for 2024–2026.

Swedish: Inga räkenskapsår 2024–2026 hittades hos leverantören.

PROVIDER_SIE_ONLY_FORTNOX

HTTP 400 — Bad request

SIE export is currently only supported for Fortnox.

Swedish: SIE-export stöds för närvarande endast för Fortnox.

PROVIDER_STATUS_FAILED

HTTP 500 — Server error

Failed to fetch provider status.

Swedish: Kunde inte hämta status från leverantören.

PROVIDER_TOKEN_REQUIRED

HTTP 400 — Bad request

apiToken is required for this provider.

Swedish: API-token krävs för den här leverantören.

PROVIDER_TOKEN_SUBMIT_FAILED

HTTP 500 — Server error

Failed to submit provider token.

Swedish: Tokensubmissionen misslyckades.

PROVIDER_UNREACHABLE

HTTP 502

Provider service is unreachable (network/DNS error).

Swedish: Leverantörens tjänst är inte tillgänglig just nu. Försök igen om en stund.

PROVIDER_UPSTREAM_ERROR

HTTP 502

Provider returned an upstream 5xx error.

Swedish: Leverantören svarade med ett fel. Försök igen om en stund.

Other

ACCOUNTS_NOT_IN_CHART

HTTP 400 — Bad request

One or more BAS accounts are not active in the chart of accounts.

Swedish: Konton saknas i kontoplanen.

Remediation: Activate the missing accounts via bookkeeping settings, or use a different category. Related resource: gnubok://chart-of-accounts

BANK_IMPORT_DUPLICATE_OTHER_COMPANY

HTTP 409 — Conflict

This file has already been imported into another company by this user.

Swedish: Den här filen har redan importerats för ett annat företag av samma användare.

BANK_IMPORT_FAILED

HTTP 500 — Server error

Bank file import failed.

Swedish: Bankfilsimporten misslyckades.

CANNOT_CORRECT_NON_POSTED

HTTP 400 — Bad request

Only posted entries can be corrected.

Swedish: Endast bokförda verifikationer kan rättas.

CANNOT_REVERSE_NON_POSTED

HTTP 400 — Bad request

Only posted entries can be reversed.

Swedish: Endast bokförda verifikationer kan stornas.

CURRENCY_REVALUATION_ALREADY_EXISTS

HTTP 409 — Conflict

Currency revaluation already exists for this period.

Swedish: En valutaomvärdering finns redan för denna period.

DOC_DOWNLOAD_FAILED

HTTP 500 — Server error

Failed to create signed download URL.

Swedish: Det gick inte att skapa nedladdningslänken.

HTTP 409 — Conflict

Document is already linked to a journal entry.

Swedish: Dokumentet är redan kopplat till en verifikation.

DOC_LINK_ENTRY_NOT_FOUND

HTTP 404 — Not found

Journal entry not found.

Swedish: Verifikationen kunde inte hittas.

HTTP 500 — Server error

Failed to link document to journal entry.

Swedish: Kopplingen misslyckades.

DOC_NOT_FOUND

HTTP 404 — Not found

Document not found.

Swedish: Dokumentet kunde inte hittas.

DOC_UPLOAD_NO_FILE

HTTP 400 — Bad request

No file attached.

Swedish: Ingen fil bifogad.

DOC_UPLOAD_STORAGE_FAILED

HTTP 500 — Server error

Document storage failed.

Swedish: Filen kunde inte sparas.

DOC_UPLOAD_TOO_LARGE

HTTP 400 — Bad request

Uploaded file exceeds the size limit.

Swedish: Filen är för stor.

DOC_UPLOAD_UNSUPPORTED_TYPE

HTTP 400 — Bad request

Unsupported file type.

Swedish: Filtypen stöds inte.

ENTRY_ALREADY_REVERSED

HTTP 409 — Conflict

Entry was already reversed by a concurrent operation.

Swedish: Verifikationen har redan stornats av en annan användare. Ladda om sidan och försök igen.

ENTRY_DATE_OUTSIDE_FISCAL_PERIOD

HTTP 400 — Bad request

Entry date is outside the active fiscal period.

Swedish: Datumet ligger utanför det valda räkenskapsåret.

Remediation: Use a date inside an open period or create one that covers it. Related resource: gnubok://period/active

FISCAL_PERIOD_NOT_FOUND

HTTP 404 — Not found

No fiscal period covers the entry date.

Swedish: Räkenskapsperioden kunde inte hittas.

Remediation: Create or extend the relevant fiscal period before retrying. Related resource: gnubok://period/active

INVALID_MAPPING_RESULT

HTTP 400 — Bad request

Mapping rules produced an invalid debit/credit account pair.

Swedish: Kontering saknas för transaktionen. Kontrollera bokföringsreglerna.

OB_ACCOUNT_ACTIVATION_FAILED

HTTP 500 — Server error

Failed to activate accounts in the chart of accounts.

Swedish: Kunde inte aktivera konton i kontoplanen.

OB_EXECUTE_FAILED

HTTP 500 — Server error

Opening balance import failed.

Swedish: Importen misslyckades.

OB_FILE_TOO_LARGE

HTTP 400 — Bad request

File exceeds the 10 MB size limit.

Swedish: Filen är för stor. Maxstorlek är 10 MB.

OB_INVALID_COLUMN_OVERRIDES

HTTP 400 — Bad request

Invalid column overrides JSON.

Swedish: Ogiltig kolumnmappning.

OB_INVALID_FORMAT

HTTP 400 — Bad request

Unsupported file format.

Swedish: Filformatet stöds inte. Tillåtna format: .xlsx, .xls, .csv, .ods.

OB_NO_FILE

HTTP 400 — Bad request

No file attached.

Swedish: Ingen fil bifogad.

OB_PARSE_FAILED

HTTP 500 — Server error

Failed to parse the opening balance file.

Swedish: Kunde inte tolka filen.

OB_PERIOD_ALREADY_HAS_BALANCES

HTTP 409 — Conflict

Fiscal period already has opening balances set.

Swedish: Räkenskapsperioden har redan ingående balanser.

OB_PERIOD_CLOSED

HTTP 400 — Bad request

Fiscal period is closed.

Swedish: Räkenskapsperioden är stängd.

OB_PERIOD_LOCKED

HTTP 400 — Bad request

Fiscal period is locked.

Swedish: Räkenskapsperioden är låst.

OB_PERIOD_NOT_FOUND

HTTP 404 — Not found

Fiscal period not found.

Swedish: Räkenskapsperioden hittades inte.

OB_PNL_ACCOUNT

HTTP 400 — Bad request

Profit & loss accounts (class 3-8) are not allowed in opening balances.

Swedish: Resultatkonton (klass 3-8) kan inte användas i ingående balanser.

OB_TOO_FEW_LINES

HTTP 400 — Bad request

At least two lines with amounts are required.

Swedish: Minst två rader med belopp krävs.

OB_UNBALANCED

HTTP 400 — Bad request

Opening balance debits and credits do not match.

Swedish: Debet och kredit balanserar inte.

OPENING_BAL_PERIOD_NOT_FOUND

HTTP 404 — Not found

Fiscal period not found.

Swedish: Räkenskapsperioden kunde inte hittas.

REG_IMPORT_EXECUTE_FAILED

HTTP 500 — Server error

Register import failed.

Swedish: Importen misslyckades.

REG_IMPORT_FILE_TOO_LARGE

HTTP 400 — Bad request

File exceeds the 10 MB size limit.

Swedish: Filen är för stor. Maxstorlek är 10 MB.

REG_IMPORT_INVALID_COLUMN_OVERRIDES

HTTP 400 — Bad request

Invalid column overrides JSON.

Swedish: Ogiltig kolumnmappning.

REG_IMPORT_INVALID_FORMAT

HTTP 400 — Bad request

Unsupported file format.

Swedish: Filformatet stöds inte. Tillåtna format: .xlsx, .xls, .csv, .ods.

REG_IMPORT_NO_FILE

HTTP 400 — Bad request

No file attached.

Swedish: Ingen fil bifogad.

REG_IMPORT_NO_ROWS

HTTP 400 — Bad request

No valid rows found in the file.

Swedish: Inga giltiga rader hittades i filen.

REG_IMPORT_PARSE_FAILED

HTTP 500 — Server error

Failed to parse the register file.

Swedish: Kunde inte tolka filen.

SIE_DUPLICATE_FILE

HTTP 409 — Conflict

File has already been imported.

Swedish: Den här filen har redan importerats.

SIE_DUPLICATE_PERIOD

HTTP 409 — Conflict

An SIE import for an overlapping fiscal period already exists.

Swedish: En SIE-import för ett överlappande räkenskapsår finns redan.

SIE_PARSE_EMPTY

HTTP 400 — Bad request

File is empty.

Swedish: Filen är tom (0 bytes). Kontrollera exporten från bokföringsprogrammet.

SIE_PARSE_FAILED

HTTP 500 — Server error

Failed to parse the SIE file.

Swedish: Kunde inte tolka SIE-filen. Filen kan vara skadad eller i ett format som inte stöds.

SIE_PARSE_FILE_TOO_LARGE

HTTP 400 — Bad request

File exceeds the 50 MB size limit.

Swedish: Filen är för stor. Maxstorlek är 50 MB.

SIE_PARSE_INVALID_TYPE

HTTP 400 — Bad request

Unsupported file type; upload a .sie or .se file.

Swedish: Filtypen stöds inte. Ladda upp en fil med ändelsen .sie eller .se.

SIE_PARSE_NO_FILE

HTTP 400 — Bad request

No file attached to the request.

Swedish: Ingen fil bifogad i förfrågan.

SIE_PARSE_VALIDATION_FAILED

HTTP 400 — Bad request

SIE file failed validation.

Swedish: SIE-filen innehåller valideringsfel som måste åtgärdas innan import.

SIE_REPLACE_FAILED

HTTP 400 — Bad request

Failed to replace SIE import.

Swedish: SIE-importen kunde inte ersättas.

SI_APPROVE_NOT_REGISTERED

HTTP 400 — Bad request

Only invoices in registered status can be approved.

Swedish: Endast registrerade fakturor kan godkännas.

SI_APPROVE_UPDATE_FAILED

HTTP 500 — Server error

Failed to update supplier invoice status to approved.

Swedish: Kunde inte godkänna leverantörsfakturan.

SI_CREATE_DUPLICATE_INVOICE_NUMBER

HTTP 409 — Conflict

A supplier invoice with that number already exists.

Swedish: En leverantörsfaktura med samma nummer finns redan.

SI_CREATE_FAILED

HTTP 500 — Server error

Failed to create supplier invoice.

Swedish: Leverantörsfakturan kunde inte skapas.

SI_CREATE_INVALID_INPUT

HTTP 400 — Bad request

Invalid combination of supplier invoice fields.

Swedish: Ogiltig kombination av fakturafält. Kontrollera formuläret och försök igen.

SI_CREDIT_ALREADY_CREDITED

HTTP 409 — Conflict

Supplier invoice has already been credited.

Swedish: Leverantörsfakturan har redan krediterats.

SI_CREDIT_FAILED

HTTP 500 — Server error

Failed to credit supplier invoice.

Swedish: Kunde inte kreditera leverantörsfakturan.

SI_CREDIT_PERIOD_LOCKED

HTTP 400 — Bad request

Bookkeeping is locked; credit note cannot be created.

Swedish: Bokföringen är låst. Krediteringen kan inte skapas.

SI_NOT_DRAFT

HTTP 400 — Bad request

Supplier invoice is not in registered status and cannot be updated or deleted.

Swedish: Leverantörsfakturan är inte längre i status "registrerad" och kan därför inte uppdateras eller tas bort.

SI_NOT_FOUND

HTTP 404 — Not found

Supplier invoice not found.

Swedish: Leverantörsfakturan kunde inte hittas.

SI_PAID_ALREADY

HTTP 409 — Conflict

Supplier invoice is already paid or credited.

Swedish: Leverantörsfakturan är redan betald eller krediterad.

SI_PAID_FAILED

HTTP 500 — Server error

Failed to record supplier invoice payment.

Swedish: Kunde inte registrera betalningen.

SI_PAID_LIKELY_DUPLICATE

HTTP 409 — Conflict

A likely-matching unlinked bank transaction was found for this supplier. Suggest linking it instead of creating a new payment entry.

Swedish: Det finns redan en obokförd banktransaktion som kan vara denna betalning. Länka den istället, eller markera som betald ändå om du är säker.

Remediation: Match the candidate transaction via POST /api/transactions/{id}/match-supplier-invoice, or resend mark-paid with force: true to create the payment entry anyway.

SI_PAID_NOT_PAYABLE

HTTP 400 — Bad request

Supplier invoice is not in a payable state.

Swedish: Leverantörsfakturan kan inte markeras som betald i nuvarande status.

SI_PAID_PERIOD_LOCKED

HTTP 400 — Bad request

Bookkeeping is locked; payment cannot be recorded.

Swedish: Bokföringen är låst. Betalningen kan inte registreras.

TX_BATCH_CATEGORIZE_EMPTY

HTTP 400 — Bad request

Batch is empty — pass at least one item.

Swedish: Batchen är tom.

TX_CATEGORIZE_INVALID_ACCOUNT

HTTP 400 — Bad request

The supplied account does not exist in the chart of accounts.

Swedish: Det valda kontot finns inte i kontoplanen.

Remediation: Activate the account in the chart of accounts or pick a different one. Related resource: gnubok://chart-of-accounts

TX_CATEGORIZE_INVALID_MAPPING

HTTP 400 — Bad request

Mapping result is missing a debit or credit account.

Swedish: Konteringen saknar debet- eller kreditkonto.

TX_CATEGORIZE_INVALID_TEMPLATE

HTTP 400 — Bad request

The supplied booking template is invalid or does not match the entity type.

Swedish: Bokföringsmallen är ogiltig eller passar inte din bolagsform.

TX_CATEGORIZE_RACE

HTTP 409 — Conflict

Transaction was already categorized by another request.

Swedish: Transaktionen kategoriserades av en annan förfrågan. Ladda om och försök igen.

TX_CATEGORIZE_SUGGEST_CI_MATCH

HTTP 409 — Conflict

An unpaid customer invoice from the same customer matches this amount. Suggest matching to the invoice instead of a plain 151x categorization to avoid producing a duplicate verifikation (BFL 5 kap 5 §).

Swedish: Det finns en obetald kundfaktura från samma kund med samma belopp. Matcha mot fakturan istället för att bokföra direkt mot kundfordringskontot — annars skapas en dubblerad verifikation som måste stornas (BFL 5 kap 5 §).

Remediation: Match the transaction via POST /api/transactions/{id}/match-invoice, or resend with confirm_no_match: true to keep the plain 151x categorization.

TX_CATEGORIZE_SUGGEST_SI_MATCH

HTTP 409 — Conflict

An open supplier invoice from the same supplier matches this amount. Suggest matching to the invoice instead of a plain 244x categorization to avoid producing a duplicate verifikation (BFL 5 kap 5 §).

Swedish: Det finns en öppen leverantörsfaktura från samma leverantör med samma belopp. Matcha mot fakturan istället för att bokföra direkt på leverantörsskuldskontot — annars skapas en dubblerad verifikation som måste stornas (BFL 5 kap 5 §).

Remediation: Match the transaction via POST /api/transactions/{id}/match-supplier-invoice, or resend with confirm_no_match: true to keep the plain 244x categorization.

TX_CATEGORIZE_TX_NOT_FOUND

HTTP 404 — Not found

Transaction not found.

Swedish: Transaktionen kunde inte hittas.

TX_EXCHANGE_RATE_UNAVAILABLE

HTTP 502

Could not fetch the exchange rate from Riksbanken. The verifikation must be posted in SEK.

Swedish: Kunde inte hämta växelkursen från Riksbanken. Försök igen om en stund — verifikationen måste bokföras i SEK.

TX_INGEST_INSERT_FAILED

HTTP 500 — Server error

Transaction ingest failed.

Swedish: Transaktionerna kunde inte importeras.

TX_UNCATEGORIZE_JE_NOT_POSTED

HTTP 400 — Bad request

Journal entry is not in posted status; reversal is not possible.

Swedish: Verifikationen är inte bokförd. Reversal kan inte utföras.

TX_UNCATEGORIZE_NOT_BOOKED

HTTP 400 — Bad request

Transaction has no journal entry — nothing to uncategorize.

Swedish: Transaktionen är inte bokförd. Det finns inget att av-kategorisera.

TX_UNCATEGORIZE_NO_LINKED_ENTRY

HTTP 400 — Bad request

Transaction has no linked journal entry to reverse.

Swedish: Transaktionen har ingen kopplad verifikation att stornera.