> ## Documentation Index
> Fetch the complete documentation index at: https://docs.paywise.de/llms.txt
> Use this file to discover all available pages before exploring further.

# Write off an invoice (Ausbuchung)

> Marks the claim written off and stops its dunning process. Idempotent; 409 (codes: invoice_paid, invoice_cancelled, invoice_in_inkasso -- the invoice was handed to debt collection, contact support to retract it; not_api_invoice) when the invoice is already settled otherwise, at debt collection, or belongs to a bookkeeping integration.

<Warning>
  **Draft documentation — API not yet rolled out.** This endpoint describes the preview contract and may change before release. Sandbox access is provided separately. See [access and limitations](/api-docs/mahnservice-api/introduction).
</Warning>


## OpenAPI

````yaml api-docs/mahnservice-api/openapi.json POST /mahnservice/v1/invoices/{uuid}/write-off/
openapi: 3.0.3
info:
  title: paywise Mahnservice API
  version: v1
  description: >-
    Public REST API for the paywise Mahnservice (pre-collection dunning), an
    alternative input path to the bookkeeping integrations (Lexware Office,
    sevDesk) and the CSV import.


    Authentication uses a Bearer token (the same token works for the Inkasso
    API). Each token is bound to a company and a legacy access mode: `test` or
    `production`. Access mode is a data-isolation lane, not the API environment:
    modern credentials use `production` in both production and sandbox. Read
    `/info/`'s `environment` (`production` or `sandbox`) to identify the
    environment serving your request.


    Resources: token introspection (`/info/`), debtors (create/list/get), and
    the invoice lifecycle -- submit (held), upload the invoice PDF (multipart or
    base64; scanned asynchronously, poll the document `status`), release for
    dunning, report payments, cancel / write off, and read the dunning state
    (`dunning_state`, the dunning flow and the sent dunnings with their fees),
    pause and resume the dunning, and read the dunning-flow configuration
    (`/dunning-flows/`). Webhooks notify you about `invoice.created`,
    `invoice.paid`, `invoice.cancelled`, `invoice.written_off`,
    `dunning.level_advanced` and `dunning.handed_to_collection`. Test-mode
    invoices are visible everywhere but never dunned, and their events only
    reach test-mode endpoints.


    Contract: requests are JSON only (documents may also be multipart); unknown
    or read-only body fields and unknown query parameters are rejected with
    `400`; list pages take `limit` (1-100, default 10) and `offset`. Errors are
    English and machine-readable: every error body is `{detail, code[, errors]}`
    -- branch on `code` (`validation_error` with per-field `errors`,
    `not_authenticated`, `permission_denied` -- the token lacks the scope,
    `subscription_required` -- no active Mahnservice subscription (writes other
    than payment reporting), `company_locked` -- the account is locked by
    paywise (every write), `not_found`, `unsupported_media_type`,
    `request_too_large`, `throttled`, `unexpected_body`, and the documented
    `409` codes). A repeat submission of an invoice number that was cancelled,
    written off or archived is a `409` (`invoice_cancelled` /
    `invoice_written_off` / `invoice_archived`), not a replay. `HEAD` mirrors
    `GET` and never writes. Every response carries `X-Paywise-Request-Id`,
    `X-Paywise-Environment` and `Cache-Control: private, no-store`. Token scopes
    apply: `mahnservice:debtors:read` / `:write` and `mahnservice:invoices:read`
    / `:write` (a `:write` grant includes `:read`; keys minted with the full `*`
    grant have everything). Rate limits: 600 requests per minute per key and per
    company, shared with the Case Management API, plus per-operation windows of
    600 reads or 120 writes per minute; a `429` carries `Retry-After`.
servers:
  - url: https://api.paywise.de
    description: Production environment
security: []
tags:
  - name: Info
    description: The authenticated credential and its context.
  - name: Debtors
    description: Debtors invoices are addressed to.
  - name: Invoices
    description: Held invoices, their release, payments and documents.
  - name: Dunning flows
    description: Dunning flow configurations referenced by invoices.
externalDocs:
  url: https://docs.paywise.de/api-docs/mahnservice-api/introduction
paths:
  /mahnservice/v1/invoices/{uuid}/write-off/:
    post:
      tags:
        - Invoices
      summary: Write off an invoice (Ausbuchung)
      description: >-
        Marks the claim written off and stops its dunning process. Idempotent;
        409 (codes: invoice_paid, invoice_cancelled, invoice_in_inkasso -- the
        invoice was handed to debt collection, contact support to retract it;
        not_api_invoice) when the invoice is already settled otherwise, at debt
        collection, or belongs to a bookkeeping integration.
      operationId: write-off-invoice
      parameters:
        - in: path
          name: uuid
          schema:
            type: string
            format: uuid
          required: true
          description: UUID of the invoice in this request.
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Invoice'
              examples:
                written_off:
                  value:
                    id: 71000000-0000-4000-8000-000000000001
                    invoice_number: INV-2026-1042
                    amount: '250.00'
                    currency: EUR
                    due_date: '2026-09-01'
                    document_date: '2026-08-18'
                    your_reference: CUSTOMER-1042
                    debtor: 72000000-0000-4000-8000-000000000001
                    access_mode: production
                    dunning_state: written_off
                    archived: false
                    has_document: false
                    document: null
                    balance: '0.00'
                    paid_amount: '0.00'
                    overpaid: false
                    created: '2026-09-02T08:00:00Z'
                    updated: '2026-09-03T09:00:00Z'
                  summary: Written off
          description: ''
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
        '400':
          description: Standard error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
        '401':
          description: Standard error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
        '403':
          description: Standard error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
        '404':
          description: Standard error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: ''
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
        '429':
          description: Standard error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
            Retry-After:
              description: Integer seconds to wait before retrying a throttled request.
              schema:
                type: integer
                minimum: 1
        '500':
          description: Standard error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Paywise-Request-Id:
              description: >-
                Fresh server-assigned correlation id for this response.
                Caller-provided request ids are ignored.
              schema:
                type: string
                format: uuid
            X-Paywise-Environment:
              description: Environment that produced the response.
              schema:
                enum:
                  - production
                  - sandbox
                type: string
            Cache-Control:
              description: >-
                Cacheability directive. Authenticated responses use `private,
                no-store`; the legal-form catalog may use `private,
                max-age=86400`.
              schema:
                type: string
      security:
        - tokenAuth: []
components:
  schemas:
    Invoice:
      type: object
      description: >-
        A Mahnservice invoice. Created *held*: no dunning process exists until

        `POST /invoices/{uuid}/release/` creates one. The debtor is referenced

        by UUID and must belong to the same company. Company and environment
        come

        from the token, never the payload. Submitting is idempotent on the

        invoice number.
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        invoice_number:
          type: string
          maxLength: 100
          description: >-
            Your invoice number. POST with the same number within the same
            company and access mode returns the existing API invoice without
            applying changed fields. Correct an existing held invoice with
            PATCH.
        amount:
          type: string
          format: decimal
          pattern: ^[0-9]{1,10}(?:\.[0-9]{1,2})?$
          description: >-
            Full invoice amount in the invoice currency, expressed in major
            units (for example 123.45). API submissions must be greater than
            zero. Partial reported payments reduce balance while dunning
            continues over this full amount.
        currency:
          allOf:
            - $ref: '#/components/schemas/CurrencyEnum'
          default: EUR
          description: >-
            ISO 4217 currency code for the invoice amount and reported balance
            (EUR, USD, GBP or CHF). Input is normalized to uppercase. Defaults
            to EUR when omitted during creation. Dunning fees are charged in
            EUR.
        due_date:
          type: string
          format: date
          description: >-
            Invoice payment due date (YYYY-MM-DD, between 1900-01-01 and ten
            years ahead, not before document_date). The first dunning level is
            scheduled using this date plus its configured delay; API invoices
            must still be explicitly released before dunning.
        document_date:
          type: string
          format: date
          nullable: true
          description: >-
            Issue date of the invoice (YYYY-MM-DD, between 1900-01-01 and ten
            years ahead, not after due_date), or null if not supplied.
        your_reference:
          type: string
          nullable: true
          maxLength: 255
          description: >-
            Optional reference supplied by you for the invoice; this is separate
            from invoice_number, the submission idempotency key. Blank and null
            are stored and returned as null.
        debtor:
          type: string
          format: uuid
          description: >-
            ID of a Mahnservice debtor belonging to the authenticated company
            and the token's access mode. Use the Mahnservice debtors endpoints
            to create or find it.
        access_mode:
          allOf:
            - $ref: '#/components/schemas/AccessModeEnum'
          readOnly: true
          description: >-
            Legacy data-isolation mode inherited from the token, not the API
            host environment. Modern sandbox and production credentials both use
            production.
        dunning_state:
          allOf:
            - $ref: '#/components/schemas/MahnserviceDunningStateEnum'
          readOnly: true
          nullable: true
          description: >-
            Current dunning process state. held means an API invoice awaits
            release; an invoice settled while held reports paid, cancelled, or
            written_off. Null means a bookkeeping invoice has never been
            enrolled.
        archived:
          type: boolean
          readOnly: true
          description: >-
            Whether the invoice is archived. Archived invoices are not sendable.
            A held archived invoice cannot be released or corrected; repeating
            release after a process already exists returns its current state.
        has_document:
          type: boolean
          readOnly: true
          description: >-
            Whether a usable invoice PDF is stored. A pending, rejected, or
            failed upload can have a document object while this flag is false.
        document:
          allOf:
            - $ref: '#/components/schemas/DocumentSummary'
          readOnly: true
          nullable: true
          description: >-
            Current invoice-document ingestion summary, or null when no document
            record exists. If present, it must reach ready before the invoice
            can be released.
        balance:
          type: string
          format: decimal
          pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
          readOnly: true
          description: >-
            Remaining invoice amount in the invoice currency: amount minus
            reported payments, with a minimum of zero. Paid, cancelled and
            written-off invoices report zero. Dunning fees are not included;
            partial payments do not reduce the amount used in dunning notices.
        paid_amount:
          type: string
          format: decimal
          pattern: ^-?\d{0,12}(?:\.\d{0,2})?$
          readOnly: true
          description: >-
            Sum of all reported payments in the invoice currency. Payments
            beyond the invoice amount are accepted and counted here; balance
            never goes below zero.
        overpaid:
          type: boolean
          readOnly: true
          description: >-
            True when paid_amount exceeds amount. Over-payment is recorded, not
            refused; reconcile it in your own system.
        created:
          type: string
          format: date-time
          readOnly: true
        updated:
          type: string
          format: date-time
          readOnly: true
      required:
        - access_mode
        - amount
        - archived
        - balance
        - created
        - debtor
        - document
        - due_date
        - dunning_state
        - has_document
        - id
        - invoice_number
        - overpaid
        - paid_amount
        - updated
    Error:
      type: object
      properties:
        detail:
          type: string
          description: Short human-readable summary of the error.
        code:
          type: string
          description: Machine-readable error category.
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorItem'
          description: Field-level validation errors, when applicable.
      required:
        - detail
        - code
      additionalProperties: false
    CurrencyEnum:
      enum:
        - EUR
        - USD
        - GBP
        - CHF
      type: string
      description: |-
        * `EUR` - EUR
        * `USD` - USD
        * `GBP` - GBP
        * `CHF` - CHF
    AccessModeEnum:
      enum:
        - test
        - production
      type: string
      description: |-
        * `test` - Test
        * `production` - Production
    MahnserviceDunningStateEnum:
      enum:
        - held
        - pending
        - active
        - paused
        - completed
        - paid
        - cancelled
        - written_off
        - inkasso
      type: string
      description: |-
        * `held` - Held
        * `pending` - Pending
        * `active` - Aktiv
        * `paused` - Pausiert
        * `completed` - Abgeschlossen
        * `paid` - Paid
        * `cancelled` - Storniert
        * `written_off` - Ausgebucht
        * `inkasso` - An Inkasso übergeben
    DocumentSummary:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        status:
          allOf:
            - $ref: '#/components/schemas/CaseDocumentStatusEnum'
          readOnly: true
          description: >-
            Document ingestion state: pending while processing, ready after
            acceptance, rejected when content is rejected, or failed when
            ingestion/scanning cannot complete. Replace a rejected or failed
            document while the invoice is held to try again.
        download_url:
          type: string
          format: uri
          readOnly: true
          nullable: true
          description: >-
            Authenticated API URL for downloading the invoice PDF; null unless
            the document is ready.
      required:
        - download_url
        - id
        - status
    ErrorItem:
      type: object
      properties:
        field:
          type: string
          nullable: true
          description: >-
            Path to the field that caused the error, using dots for objects and
            brackets for list indexes, for example `claims[0].amount`; null for
            an error without a field path.
        code:
          type: string
          description: Machine-readable field error code.
        message:
          type: string
          description: Human-readable explanation of the field error.
      required:
        - field
        - code
        - message
      additionalProperties: false
    CaseDocumentStatusEnum:
      enum:
        - pending
        - ready
        - rejected
        - failed
      type: string
      description: |-
        * `pending` - pending
        * `ready` - ready
        * `rejected` - rejected
        * `failed` - failed
  securitySchemes:
    tokenAuth:
      type: http
      scheme: bearer

````