Zum Inhalt springen

Errors

Errors always use the same format: a machine-readable code in error, a human-readable message in message and, where needed, details.
Example
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Language: en

{
  "error": "validation_error",
  "message": "The request is invalid. See details for the affected fields.",
  "details": [
    { "path": "lines.0.quantity", "message": "Too small: expected number to be >0" }
  ]
}
  • Evaluate error, not message – the code is part of the stable API contract, the text may change.
  • message is written in English or German depending on the Accept-Language request header (en or de). Without a supported language, the API v1 responds in English.
  • For validation_error, details contains a list with path (dot notation) and message per field.
  • Retrying is worthwhile for 429, 409 idempotency_in_progress and 5xx – after a pause and with the same Idempotency-Key. Other 4xx errors will not change if you retry.

HTTP status codes

StatusMeaning
400invalid request
401not authenticated, or key/token invalid
402quota used up or feature not included in the subscription plan (e.g. letters)
403no permission
404not found
409current state does not allow the action (conflict)
410resource no longer exists (e.g. import file)
413 / 415file too large, or file type not allowed
422cannot be processed for business reasons (e.g. required details missing)
429too many requests
500error at DebtFlow
501not available
502an external service (email, Stripe, letter dispatch) reported an error
503temporarily unavailable

General error codes

StatuserrorMeaning
400validation_errorpath, query or body parameters invalid; details lists the fields
401unauthorizedno Bearer token, or token cannot be read
401invalid_api_keyAPI key unknown, revoked or expired
401invalid_tokenOAuth access token unknown, expired or connection removed
403forbiddenaction not allowed for this account
403insufficient_scopekey or app lacks the required permission; see details.missing
403session_requiredonly possible in the dashboard (account management)
403account_not_approvedaccount has not been approved yet
403account_disabledaccount is blocked
403mfa_requireddashboard session without a completed second factor
403demo_unavailableblocked in the public demo account (sending, costs, AI, uploads, credentials)
403plan_limit_reachedsubscription plan limit reached (e.g. number of contacts)
404not_foundresource does not exist or belongs to another account
409conflictcurrent state does not allow the action
409idempotency_in_progressa request with the same Idempotency-Key is still running
409, 422idempotency_conflictIdempotency-Key was already used for a different request
409limit_reachedmaximum reached (e.g. webhook endpoints, API keys)
413payload_too_largefile or request too large
415unsupported_media_typefile type not allowed
429rate_limitedtoo many requests; respect the Retry-After header
500internal_errorerror at DebtFlow; try again later
501not_implementedfeature is not available (yet)
503not_readyservice is starting or temporarily not ready; try again later

Domain-specific error codes

This list is checked against the source code (automated test). If in doubt, react to the HTTP status: new, more specific codes may be added without the status changing.

Invoices, credit notes, quotes

StatuserrorMeaning
409document_lockeddocument is finalised and immutable (GoBD, German bookkeeping rules); correct it with a cancellation invoice or credit note
409number_conflictdocument number already assigned – check the pattern of the number range
409number_range_in_usenumbers have already been assigned in this period; the start number can no longer be changed
409invoice_not_finalizedaction only possible for finalised invoices
409offer_not_finalizedaction only possible for finalised quotes
409has_credit_notescancellation not possible because credit notes exist – correct the remainder with a credit note
409already_deductedprogress invoice has already been deducted in a final invoice
409already_handed_overinvoice has already been handed over to dunning
409already_paidalready paid in full
409not_payabledocument can no longer be paid
409einvoice_not_availableno e-invoice exists for this document
422invoice_incompletemandatory invoice details (§ 14 UStG, German VAT Act) missing; details lists them
422overpaymentpayment exceeds the outstanding amount
422einvoice_invalide-invoice violates rules (XRechnung/ZUGFeRD); details lists them
422einvoice_unreadablefile is not a readable e-invoice
422einvoice_not_foundPDF contains no embedded e-invoice (ZUGFeRD/Factur-X)
500pdf_fonts_missingPDF could not be generated (fonts missing on the server)
502email_failedsending the email failed

Debts, payments, letters

StatuserrorMeaning
402quota_exceededquota (e.g. letters per month) used up
402letters_not_availableletter dispatch not included in the plan or not set up
409target_not_openitem is no longer open
409amount_exceeds_openamount exceeds the outstanding amount
409payment_processingpayment is currently being processed
409payment_unavailableonline payment not possible for this item
502provider_failedexternal service (e.g. letter provider) reported an error
400invalid_tokenBriefdiener token rejected (only /integrations/briefdiener)
503unreachableBriefdiener is temporarily unreachable

Research and creditor AI

StatuserrorMeaning
409inquiry_in_progressa residents’ registration office request is already running for this contact (no double charges)
422missing_contact_datadate of birth or known address of the contact is missing
429ai_rate_limitedtoo many AI requests in a short time; respect details.retryAfter
429ai_quota_exhausteddaily AI quota used up
502ai_failedAI service did not return usable text; try again later
503ai_unavailablecreditor AI is not set up

Bank

StatuserrorMeaning
400invalid_ibanIBAN invalid
409duplicate_ibana bank account with this IBAN already exists
409iban_mismatchimport belongs to a different account
409account_archivedbank account is archived
409account_has_transactionsbank account has transactions and cannot be deleted
409already_matchedtransaction is already matched
409not_matchedtransaction is not matched to any item
409transaction_matcheda matched transaction cannot be changed
409transaction_ignoredtransaction is marked as ignored
409direction_mismatchmatch incoming payments only to open items and outgoing payments only to receipts
409amount_exceeds_transactionmatches exceed the transaction amount
409possible_duplicateimport probably contains transactions that were already imported
409import_completedimport has already been completed
409import_has_matchesimport contains matched transactions and cannot be reverted
409already_revertedimport has already been reverted
410import_file_missingimport file no longer exists – upload it again
422mapping_requiredcolumn mapping for the CSV file is missing
422unprocessable_filefile could not be processed

Receipts and imports

StatuserrorMeaning
409already_assignedreceipt is already assigned
409in_useentry is still in use
422file_missingfile missing
422ocr_unreadableOCR could not read the file
422ocr_unsupportedfile type not supported by OCR
422ocr_file_too_largefile is too large for OCR
400invalid_payloadincoming data (e.g. inbound email) invalid
400invalid_signaturesignature of an incoming call invalid

Accounting

StatuserrorMeaning
409period_closedperiod is closed (locked)
409invalid_periodperiod invalid or overlapping
409open_issuesopen issues prevent closing; details lists them
409closing_in_progressclosing is already in progress
409chart_lockedchart of accounts can no longer be changed after the first journal entries
409generated_entryautomatically generated journal entry – change the source instead of the entry
409datev_numbers_missingDATEV consultant/client number missing for the DATEV export

Projects and time tracking

StatuserrorMeaning
409project_has_entriesproject has time entries
409task_has_entriestask has time entries
409time_entry_invoicedtime entry has already been invoiced
409time_entries_not_billableselected time entries are not billable
409timer_not_runningno timer is running
409invoice_activetime entries belong to an invoice that has not been cancelled and cannot be released
422nothing_to_invoiceno billable time entries in the period

Stripe Connect and online payments

StatuserrorMeaning
400stripe_oauth_failedconnecting to Stripe failed
400invalid_statecallback does not match the connection that was started
409stripe_not_connectedno Stripe account connected
409stripe_account_in_useStripe account is connected to another DebtFlow account
409already_connectedalready connected
409not_connectednot connected
409managed_in_stripesetting is managed in Stripe
502stripe_checkout_failedStripe did not create the payment page
503online_payments_unavailableonline payments are not configured

Security (dashboard)

StatuserrorMeaning
400challenge_expiredpasskey request expired – start again
400passkey_invalidpasskey response invalid
400invalid_second_factorcode or passkey incorrect
400setup_expiredsetup expired – start again
409passkey_existspasskey is already registered
409no_factorno second factor set up
409no_passkeyno passkey set up
409last_factorthe last second factor cannot be removed
403reauthentication_requiredplease sign in again to complete the setup
429mfa_lockedtoo many failed attempts – temporarily locked

The OAuth token endpoint deviates from this and responds in OAuth format with error_description; see Authentication.