> ## Documentation Index
> Fetch the complete documentation index at: https://api-doc.fidly.be/llms.txt
> Use this file to discover all available pages before exploring further.

# Update Document

> Correct a document the company issued, as long as it has **gone nowhere yet**.

Once a document has left — by mail or over Peppol — it is issued, and correcting it is no
longer allowed: issue a credit note instead. The two channels are independent, so both are
checked. Once it has been handed to the accounting (`accounting_status` beyond `waiting` and
`export_error`), it lives in the accountant's system too, and changing it here would leave
the two disagreeing. Either gives `409 document_not_editable`, saying which one blocks. A
document the company *received* cannot be modified either. What has been paid, on the other
hand, never blocks: that belongs to the bank reconciliation.

Only the fields present in the body are applied. `type` and `journal_id` are read-only —
the document's number was drawn from that journal's sequence for that type. `due_date` and
`relation_type` are accepted but ignored, like at creation, so a document that was read can
be sent back unchanged.

`paid_amount` records a payment Fidly cannot see for itself — cash, or a transfer on an
account it does not follow. It may not exceed the document's total, and `payment_status`
follows it; the payments Fidly does see are written by its bank reconciliation instead.

`lines` and `allowance_charges` **replace** the whole list rather than merging into it: a
line has no identity of its own, so there is nothing a partial update could address, and
adding, removing or reordering would not be expressible. Send them and every amount is
recomputed — the VAT of each rate, the document's discounts spread over those rates, the
totals and the euro conversion. Omit them and the stored lines are not even re-read.

`issue_date` must stay inside the window its number was drawn in: free when the journal's
counter never restarts, the same month or the same year otherwise. Changing it, or the
`payment_terms`, re-derives the due date.

The PDF and the Peppol XML are regenerated asynchronously and replace the previous ones;
until they do, downloading the file still returns the version before this change. A
request that breaks a rule is refused **as a whole**: the document is left untouched.



## OpenAPI

````yaml /openapi.json patch /documents/{document_uuid}
openapi: 3.1.0
info:
  title: Fidly API
  version: 1.0.0
servers:
  - url: https://api.fidly.be
    description: Production
security: []
paths:
  /documents/{document_uuid}:
    patch:
      tags:
        - documents
      summary: Update Document
      description: >-
        Correct a document the company issued, as long as it has **gone nowhere
        yet**.


        Once a document has left — by mail or over Peppol — it is issued, and
        correcting it is no

        longer allowed: issue a credit note instead. The two channels are
        independent, so both are

        checked. Once it has been handed to the accounting (`accounting_status`
        beyond `waiting` and

        `export_error`), it lives in the accountant's system too, and changing
        it here would leave

        the two disagreeing. Either gives `409 document_not_editable`, saying
        which one blocks. A

        document the company *received* cannot be modified either. What has been
        paid, on the other

        hand, never blocks: that belongs to the bank reconciliation.


        Only the fields present in the body are applied. `type` and `journal_id`
        are read-only —

        the document's number was drawn from that journal's sequence for that
        type. `due_date` and

        `relation_type` are accepted but ignored, like at creation, so a
        document that was read can

        be sent back unchanged.


        `paid_amount` records a payment Fidly cannot see for itself — cash, or a
        transfer on an

        account it does not follow. It may not exceed the document's total, and
        `payment_status`

        follows it; the payments Fidly does see are written by its bank
        reconciliation instead.


        `lines` and `allowance_charges` **replace** the whole list rather than
        merging into it: a

        line has no identity of its own, so there is nothing a partial update
        could address, and

        adding, removing or reordering would not be expressible. Send them and
        every amount is

        recomputed — the VAT of each rate, the document's discounts spread over
        those rates, the

        totals and the euro conversion. Omit them and the stored lines are not
        even re-read.


        `issue_date` must stay inside the window its number was drawn in: free
        when the journal's

        counter never restarts, the same month or the same year otherwise.
        Changing it, or the

        `payment_terms`, re-derives the due date.


        The PDF and the Peppol XML are regenerated asynchronously and replace
        the previous ones;

        until they do, downloading the file still returns the version before
        this change. A

        request that breaks a rule is refused **as a whole**: the document is
        left untouched.
      operationId: update_document_documents__document_uuid__patch
      parameters:
        - name: document_uuid
          in: path
          required: true
          schema:
            type: string
            title: Document Uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DocumentOut'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
components:
  schemas:
    DocumentUpdate:
      properties:
        type:
          anyOf:
            - type: string
            - type: 'null'
          title: Type
          description: Read-only after creation.
        journal_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Journal Id
          description: Read-only after creation.
        paid_amount:
          anyOf:
            - type: number
              maximum: 999999999
              minimum: 0
            - type: 'null'
          title: Paid Amount
          description: >-
            Amount already paid, tax included, for a payment that reached the
            company through a channel Fidly does not read — cash, or a transfer
            on an account it does not follow. Drives `payment_status`, and may
            not exceed the document's total. Payments Fidly does see are written
            by its bank reconciliation, not here.
        relation_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Relation Id
          description: >-
            Opaque identifier of the third party the document is issued to. It
            says by itself whether it is a company or a contact.
        relation_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Relation Type
          description: 'Ignored: read from `relation_id`, like at creation.'
        attachments:
          anyOf:
            - items: {}
              type: array
            - type: 'null'
          title: Attachments
          description: >-
            Ignored: files are attached with `POST /documents/{id}/attachments`,
            never through this body. Accepted so a document that was read can be
            sent back unchanged.
        issue_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Issue Date
          description: >-
            Date the document is issued. Never in the future, and it must stay
            in the window the document's number was drawn in — free in the past
            when the journal's counter never restarts, the same month or the
            same year otherwise.
        due_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Due Date
          description: 'Ignored: always derived from `payment_terms`, as at creation.'
        payment_terms:
          anyOf:
            - type: string
              pattern: ^\d{1,4}-(df|fm|mf)$
            - type: 'null'
          title: Payment Terms
          description: >-
            Payment terms, as `<days>-<basis>` (`df`, `fm`, `mf`). Changing them
            re-derives the due date.
        delivery_location_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Delivery Location Id
          description: >-
            One of the third party's saved delivery addresses, or `null` to
            detach the one currently set.
        tax_point_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Tax Point Date
          description: Date the VAT becomes chargeable.
        delivery_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Delivery Date
          description: >-
            Date of the **actual** delivery — today or earlier, never a future
            date.
        period_start:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Period Start
          description: First day of the billed period.
        period_end:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Period End
          description: Last day of the billed period.
        order_number:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Order Number
          description: Order number.
        despatch_reference:
          anyOf:
            - type: string
              maxLength: 50
            - type: 'null'
          title: Despatch Reference
          description: Reference of the despatch advice.
        buyer_reference:
          anyOf:
            - type: string
              maxLength: 50
            - type: 'null'
          title: Buyer Reference
          description: Reference given by the buyer.
        legal_notice:
          anyOf:
            - type: string
              maxLength: 10000
            - type: 'null'
          title: Legal Notice
          description: >-
            Legal mention printed at the bottom of the document. `null` clears
            it.
        currency:
          anyOf:
            - type: string
              maxLength: 20
            - type: 'null'
          title: Currency
          description: ISO 4217 currency code of every amount.
        lines:
          anyOf:
            - items:
                $ref: '#/components/schemas/LineIn'
              type: array
              maxItems: 500
              minItems: 1
            - type: 'null'
          title: Lines
          description: >-
            Replaces **all** the lines of the document. At least one is required
            — a document without lines is not representable — and 500 at most.
        allowance_charges:
          anyOf:
            - items:
                $ref: '#/components/schemas/AllowanceChargeIn'
              type: array
              maxItems: 50
            - type: 'null'
          title: Allowance Charges
          description: >-
            Replaces **all** the discounts/surcharges of the document. An empty
            list removes them.
      additionalProperties: false
      type: object
      title: DocumentUpdate
      description: >-
        The editable part of a document it issued. Every field is optional: only
        the ones actually

        present in the request body are applied, so omitting a field leaves it
        untouched.


        `lines` and `allowance_charges` are **replacements**, not merges:
        sending them replaces the

        whole list. A document line has no identity of its own — its `sequence`
        is its position, and

        is reassigned on every write — so there is nothing to address a partial
        line update to, and

        adding, removing or reordering would not be expressible.
    DocumentOut:
      properties:
        id:
          type: string
          title: Id
          description: Opaque unique identifier of the document.
        type:
          type: string
          title: Type
          description: >-
            Document type. One of: `sale_invoice`, `sale_credit_note`,
            `purchase_invoice`, `purchase_credit_note`, `other_document`,
            `unknown`.
        origin:
          type: string
          title: Origin
          description: >-
            Channel the document came in through. One of: `fidly` (generated in
            Fidly), `manual`, `peppol`, `mail`, `odoo`, `billit`, `api` (or
            `unknown`).
        relation_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Relation Type
          description: >-
            Nature of `relation_id`: `company` (a registered business relation)
            or `contact` (an individual contact). `null` when there is no linked
            third party.
        relation_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Relation Id
          description: >-
            Opaque identifier of the third party the document is linked to
            (resolvable via `GET /relations/{id}`). Its nature is given by
            `relation_type`. `null` when the document has no linked third party.
        journal_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Journal Id
          description: >-
            Opaque identifier of the journal the document is booked in
            (resolvable via `GET /journals/{id}`). `null` when the document has
            no linked journal.
        delivery_location_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Delivery Location Id
          description: >-
            Opaque identifier of the saved delivery address the document is
            delivered to (resolvable via `GET /delivery-locations/{id}`). `null`
            when none is set.
        document_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Document Number
          description: The document's own number (e.g. invoice number).
        order_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Order Number
          description: Purchase/sales order number referenced by the document.
        despatch_reference:
          anyOf:
            - type: string
            - type: 'null'
          title: Despatch Reference
          description: >-
            Reference of the despatch advice (delivery note) related to the
            document.
        buyer_reference:
          anyOf:
            - type: string
            - type: 'null'
          title: Buyer Reference
          description: >-
            Reference given by the buyer, to be quoted back on the document
            (e.g. a cost centre).
        issue_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Issue Date
          description: Date the document was issued (ISO `YYYY-MM-DD`).
        due_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Due Date
          description: Payment due date (ISO `YYYY-MM-DD`).
        payment_terms:
          anyOf:
            - type: string
            - type: 'null'
          title: Payment Terms
          description: >-
            Payment terms the `due_date` follows from, as `<days>-<basis>` (e.g.
            `30-df`). Always `null` on a received document: only documents Fidly
            issues carry them.
        tax_point_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Tax Point Date
          description: >-
            Date the VAT becomes chargeable, when it differs from the issue date
            (ISO `YYYY-MM-DD`).
        delivery_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Delivery Date
          description: Date the goods/services were actually delivered (ISO `YYYY-MM-DD`).
        period_start:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Period Start
          description: First day of the period the document bills (ISO `YYYY-MM-DD`).
        period_end:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Period End
          description: Last day of the period the document bills (ISO `YYYY-MM-DD`).
        legal_notice:
          anyOf:
            - type: string
            - type: 'null'
          title: Legal Notice
          description: >-
            Legal mention printed at the bottom of the document (e.g. a VAT
            exemption wording). Always `null` on received documents.
        payment_remittance:
          anyOf:
            - type: string
            - type: 'null'
          title: Payment Remittance
          description: >-
            Communication to quote when paying the document. `null` when the
            document carries none.
        is_remittance_structured:
          type: boolean
          title: Is Remittance Structured
          description: >-
            `true` when `payment_remittance` is a structured communication (a
            bank-checked reference such as a Belgian OGM/VCS) rather than free
            text. Always `true` for documents issued by Fidly.
        create_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Create Date
          description: >-
            Timestamp the document was created in Fidly (ISO 8601). May be
            `null` on rare legacy rows where it was never set.
        currency:
          anyOf:
            - type: string
            - type: 'null'
          title: Currency
          description: ISO 4217 currency code of all amounts (e.g. `EUR`).
        tax_exclusive_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Tax Exclusive Amount
          description: Total amount excluding tax.
        tax_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Tax Amount
          description: Total tax (VAT) amount.
        total_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Total Amount
          description: Total amount payable, tax included.
        paid_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Paid Amount
          description: Amount already paid.
        remaining_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Remaining Amount
          description: Amount still to be paid (`total_amount` minus `paid_amount`).
        payment_status:
          type: string
          title: Payment Status
          description: 'Payment state. One of: `unpaid`, `partial`, `paid` (or `unknown`).'
        accounting_status:
          type: string
          title: Accounting Status
          description: >-
            Accounting workflow state. One of: `waiting`, `accepted`,
            `transfered`, `exported`, `export_error`, `imported`, `validated`,
            `hidden`, `exporting`, `posting`, `posting_error`, `deleted` (or
            `unknown`).
        pdf_available:
          type: boolean
          title: Pdf Available
          description: >-
            `true` if a PDF is stored for this document (retrievable via the
            file endpoint).
        xml_available:
          type: boolean
          title: Xml Available
          description: >-
            `true` if a structured XML version (e.g. Peppol/UBL) is stored for
            this document.
        peppol_status:
          anyOf:
            - type: string
            - type: 'null'
          title: Peppol Status
          description: >-
            Peppol send state of an issued document. One of: `not_sent`,
            `sending`, `sent` (delivered to the network), `accepted`
            (acknowledged by the recipient), `rejected` (refused by the
            recipient), `failed` (or `unknown`). `rejected` and `failed` can be
            sent again. Always `null` on a received document.
        mail_status:
          anyOf:
            - type: string
            - type: 'null'
          title: Mail Status
          description: >-
            E-mail send state of an issued document. One of: `not_sent`, `sent`,
            `failed` (or `unknown`). Always `null` on a received document.
        attachments:
          items:
            $ref: '#/components/schemas/AttachmentOut'
          type: array
          title: Attachments
          description: >-
            Files attached to the document, in the order they were added. Attach
            one with `POST /documents/{id}/attachments`; the API offers no way
            to remove one. A received document never carries any.
        allowance_charges:
          items:
            $ref: '#/components/schemas/AllowanceChargeOut'
          type: array
          title: Allowance Charges
          description: >-
            Discounts/surcharges applied to the document as a whole, after the
            lines and their own. `tax_exclusive_amount` is already net of them.
        lines:
          items:
            $ref: '#/components/schemas/LineOut'
          type: array
          title: Lines
          description: >-
            Detailed lines of the document (invoiced items/services). Empty when
            none are stored.
      additionalProperties: true
      type: object
      required:
        - id
        - type
        - origin
        - document_number
        - order_number
        - despatch_reference
        - buyer_reference
        - issue_date
        - due_date
        - tax_point_date
        - delivery_date
        - period_start
        - period_end
        - payment_remittance
        - is_remittance_structured
        - create_date
        - currency
        - tax_exclusive_amount
        - tax_amount
        - total_amount
        - paid_amount
        - remaining_amount
        - payment_status
        - accounting_status
        - pdf_available
        - xml_available
      title: DocumentOut
      description: >-
        A document of the company: an invoice/credit note it issued or a
        document it

        received (purchase invoice, credit note, other). The source table is
        hidden — the

        client sees a single unified document identified by an opaque `id`.


        Monetary amounts are decimal numbers in the document's `currency`. They
        may be `null`

        when the document could not be parsed automatically, or for
        `other_document` types

        that have no financial breakdown.


        Both sources are normalised to this shape by the repository adapters;
        the validators

        below map the internal codes to their public values.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    LineIn:
      properties:
        item_name:
          type: string
          maxLength: 255
          minLength: 1
          title: Item Name
          description: Name of the item/service.
        quantity:
          type: number
          maximum: 999999999
          minimum: -999999999
          title: Quantity
          description: >-
            Quantity of the item. May be negative: that is how a line subtracts,
            the unit price never being negative.
        unit_price:
          type: number
          maximum: 999999999
          minimum: 0
          title: Unit Price
          description: >-
            Price for one unit, before tax. Never negative (Peppol BR-27): a
            line that subtracts is written with a negative `quantity`.
        vat_code:
          type: string
          title: Vat Code
          description: >-
            VAT regime of the line, one of ['standard', 'exempted',
            'zero_rated', 'reverse_charge', 'intra_community', 'export',
            'not_subject'] (the UNCL5305 categories by name): `standard` is the
            only rated one, the others are 0% regimes — `exempted` (art. 44),
            `zero_rated`, `reverse_charge` (cocontractant), `intra_community`
            (EU supply), `export` (outside the EU), `not_subject`.
            Case-insensitive. `standard`, `exempted`, `zero_rated` and
            `reverse_charge` may be mixed on one document; ['intra_community',
            'export', 'not_subject'] are exclusive — a document carrying one of
            them must carry it on every line.
        vat_rate:
          anyOf:
            - type: number
              maximum: 100
              minimum: 0
            - type: 'null'
          title: Vat Rate
          description: >-
            VAT rate applied to the line, in percent. Required above 0 with the
            `standard` code (6, 12 or 21 in Belgium); refused with
            `not_subject`, which carries no rate at all (Peppol BR-O-05); every
            other code is a 0% regime, so it may be omitted — sent along, it
            must be 0.
        sequence:
          anyOf:
            - type: integer
            - type: 'null'
          title: Sequence
          description: >-
            Ignored: lines are numbered by their position in `lines`, starting
            at 1. Accepted rather than refused so a line copied from a document
            that was read still passes.
        subtotal:
          anyOf:
            - type: number
            - type: 'null'
          title: Subtotal
          description: >-
            Ignored: derived from `quantity`, `unit_price`, `vat_rate` and the
            line's allowances/charges. Accepted so a line read from a document
            can be sent back unchanged.
        total:
          anyOf:
            - type: number
            - type: 'null'
          title: Total
          description: >-
            Ignored: derived from `quantity`, `unit_price`, `vat_rate` and the
            line's allowances/charges. Accepted so a line read from a document
            can be sent back unchanged.
        tax_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Tax Amount
          description: >-
            Ignored: derived from `quantity`, `unit_price`, `vat_rate` and the
            line's allowances/charges. Accepted so a line read from a document
            can be sent back unchanged.
        item_description:
          anyOf:
            - type: string
              maxLength: 1000
            - type: 'null'
          title: Item Description
          description: Longer description of the item/service.
        section_name:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Section Name
          description: Title of the section this line belongs to, if any.
        unit_code:
          type: string
          maxLength: 20
          title: Unit Code
          description: >-
            Unit of measure the quantity is expressed in: a UN/ECE
            Recommendation 20 code among those Fidly supports (`C62`, `HUR`,
            `KGM`, `LTR`…). Defaults to `C62` (one unit).
          default: C62
        item_properties:
          anyOf:
            - additionalProperties:
                type: string
              type: object
            - type: 'null'
          title: Item Properties
          description: >-
            Free item properties, as a flat object of string values (no
            nesting).
        item_identification:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Item Identification
          description: Standard item identifier (e.g. GTIN).
        product_code:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Product Code
          description: Seller's own product code.
        allowance_charges:
          items:
            $ref: '#/components/schemas/LineAllowanceChargeIn'
          type: array
          title: Allowance Charges
          description: >-
            Discounts and surcharges applied to this line, before tax. The line
            total is `subtotal + charges - allowances`, and the VAT is computed
            on it. Unlike a document-level one, naming the reason is optional:
            without `code` nor `reason`, the catch-all code of the kind is
            applied (`95` for an allowance, `ZZZ` for a charge) and returned in
            the response.
      additionalProperties: false
      type: object
      required:
        - item_name
        - quantity
        - unit_price
        - vat_code
      title: LineIn
      description: >-
        A line to invoice. `subtotal`, `total` and `tax_amount` are derived from
        `quantity`,

        `unit_price`, `vat_rate` and the line's allowances/charges — they are
        outputs, not inputs,

        and are ignored if sent.
    AllowanceChargeIn:
      properties:
        type:
          type: string
          title: Type
          description: >-
            `allowance` (discount) or `charge` (surcharge). One of ['allowance',
            'charge'].
        amount:
          anyOf:
            - type: number
              maximum: 999999999
              exclusiveMinimum: 0
            - type: 'null'
          title: Amount
          description: Fixed amount, before tax. Ignored when `rate` is also given.
        rate:
          anyOf:
            - type: number
              maximum: 100
              exclusiveMinimum: 0
            - type: 'null'
          title: Rate
          description: >-
            Percentage from which the amount is computed: of the line's subtotal
            on a line, of the document's line total on the document.
        code:
          anyOf:
            - type: string
              maxLength: 25
            - type: 'null'
          title: Code
          description: >-
            Reason code — UNCL5189 for an allowance (`95` = discount), UNCL7161
            for a charge (`AAA` = telecommunication). Required unless `reason`
            is given.
        reason:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Reason
          description: Free-text reason. Required unless `code` is given.
      additionalProperties: false
      type: object
      required:
        - type
      title: AllowanceChargeIn
      description: >-
        A discount or a surcharge, on a line or on the document as a whole.


        Either a fixed `amount` or a `rate` of what it applies to — the line's
        subtotal on a

        line, the document's line total on the document. Both may be sent — that
        is what reading

        a document gives back, since the stored percentage is returned next to
        the amount it

        produced — and `rate` then wins, because that is how the rest of the
        platform resolves

        the pair (the amount is recomputed from the base and the percentage).
    AttachmentOut:
      properties:
        filename:
          anyOf:
            - type: string
            - type: 'null'
          title: Filename
          description: Name of the attached file.
        mimetype:
          anyOf:
            - type: string
            - type: 'null'
          title: Mimetype
          description: Media type of the attached file.
      type: object
      title: AttachmentOut
      description: >-
        A file attached to a document. Where it is stored (bucket and key) stays
        internal.
    AllowanceChargeOut:
      properties:
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
          description: Reason code for the allowance/charge.
        type:
          anyOf:
            - type: string
            - type: 'null'
          title: Type
          description: '`allowance` (discount) or `charge` (surcharge).'
        amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Amount
          description: Monetary amount of the allowance/charge.
        reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Reason
          description: Free-text reason.
        rate:
          anyOf:
            - type: number
            - type: 'null'
          title: Rate
          description: Percentage rate, when expressed as a percentage.
      type: object
      title: AllowanceChargeOut
      description: A discount (allowance) or surcharge (charge) applied to a document line.
    LineOut:
      properties:
        sequence:
          anyOf:
            - type: integer
            - type: 'null'
          title: Sequence
          description: Position of the line within the document.
        quantity:
          anyOf:
            - type: number
            - type: 'null'
          title: Quantity
          description: Quantity of the item.
        vat_rate:
          anyOf:
            - type: number
            - type: 'null'
          title: Vat Rate
          description: >-
            VAT rate applied to the line, in percent. Always `null` on a
            `not_subject` line: outside the scope of VAT there is no rate at all
            (Peppol BR-O-05).
        item_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Item Name
          description: Name of the item/service.
        item_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Item Description
          description: Longer description of the item/service.
        unit_price:
          anyOf:
            - type: number
            - type: 'null'
          title: Unit Price
          description: Price for one unit, before tax.
        unit_code:
          anyOf:
            - type: string
            - type: 'null'
          title: Unit Code
          description: Unit of measure code (e.g. `C62` for unit).
        vat_code:
          anyOf:
            - type: string
            - type: 'null'
          title: Vat Code
          description: >-
            VAT regime of the line: `standard`, `exempted`, `zero_rated`,
            `reverse_charge`, `intra_community`, `export` or `not_subject`.
            Legacy documents may carry the reserved `transferred_vat`,
            `canary_islands` or `ceuta_melilla`.
        subtotal:
          anyOf:
            - type: number
            - type: 'null'
          title: Subtotal
          description: Line amount before discounts, excluding tax.
        total:
          anyOf:
            - type: number
            - type: 'null'
          title: Total
          description: Line amount after discounts, excluding tax.
        tax_amount:
          anyOf:
            - type: number
            - type: 'null'
          title: Tax Amount
          description: Tax (VAT) amount of the line.
        section_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Section Name
          description: Title of the section this line belongs to, if any.
        item_properties:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Item Properties
          description: Free key/value item properties, kept as-is.
        item_identification:
          anyOf:
            - type: string
            - type: 'null'
          title: Item Identification
          description: Standard item identifier (e.g. GTIN).
        product_code:
          anyOf:
            - type: string
            - type: 'null'
          title: Product Code
          description: Seller's own product code.
        allowance_charges:
          items:
            $ref: '#/components/schemas/AllowanceChargeOut'
          type: array
          title: Allowance Charges
          description: Discounts/surcharges applied to this line.
      type: object
      title: LineOut
      description: A single line of a document (one invoiced item/service).
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    LineAllowanceChargeIn:
      properties:
        type:
          type: string
          title: Type
          description: >-
            `allowance` (discount) or `charge` (surcharge). One of ['allowance',
            'charge'].
        amount:
          anyOf:
            - type: number
              maximum: 999999999
              exclusiveMinimum: 0
            - type: 'null'
          title: Amount
          description: Fixed amount, before tax. Ignored when `rate` is also given.
        rate:
          anyOf:
            - type: number
              maximum: 100
              exclusiveMinimum: 0
            - type: 'null'
          title: Rate
          description: >-
            Percentage from which the amount is computed: of the line's subtotal
            on a line, of the document's line total on the document.
        code:
          anyOf:
            - type: string
              maxLength: 25
            - type: 'null'
          title: Code
          description: >-
            Reason code — UNCL5189 for an allowance (`95` = discount), UNCL7161
            for a charge (`AAA` = telecommunication). Required unless `reason`
            is given.
        reason:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Reason
          description: Free-text reason. Required unless `code` is given.
      additionalProperties: false
      type: object
      required:
        - type
      title: LineAllowanceChargeIn
      description: >-
        A line allowance/charge, where naming the reason is optional.


        Peppol asks for a reason or a reason code here too (BR-CO-23/24), and
        nothing downstream

        supplies one: `_allowance_charge_to_details` stores what it is given,
        and

        `FidlyCreateInvoice` hands it straight to `LineAllowanceCharge`, which
        raises when both are

        empty — after the 201. So the code is filled in here rather than
        demanded, and the response

        reads it back, so the caller sees what was assumed.
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````