# The document

Ocost answers every document it read as `ocost.document.v1`. Ask for it with `GET /public/v1/files/{file_id}/document` or `GET /public/v1/documents/{document_id}`. The fields follow EN 16931, the norm behind XRechnung, ZUGFeRD and Peppol UBL. Each field names its business term (BT-…) or group (BG-…), so it maps to UBL or CII.

Validate against the [JSON Schema](https://docs.ocost.io/schemas/ocost.document.v1.json) or generate types from it. [Fields](#fields) and [Values](#values) below list everything it holds.

## An example

An incoming invoice with two lines at 19 % and 2 % Skonto within 14 days:

```json
{
  "schema": "ocost.document.v1",
  "id": "01a1b08c-7aa1-7b52-9d4e-2f1f1c0c4f11",
  "file_id": "01a1b08c-6e3a-7562-8f4a-7924722667b1",
  "pages": [1],
  "kind": "invoice",
  "kind_detail": "invoice",
  "direction": "incoming",
  "type_code": "380",
  "number": "RE-2026-1187",
  "issue_date": "2026-11-03",
  "due_date": "2026-12-03",
  "delivery_date": "2026-10-30",
  "invoicing_period_start": null,
  "invoicing_period_end": null,
  "valid_until": null,
  "currency": "EUR",
  "buyer_reference": null,
  "order_reference": "PO-2316",
  "order_references": ["PO-2316"],
  "preceding_invoice": null,
  "seller": {
    "name": "Musterbüro Lieferant GmbH",
    "vat_id": "DE123456789",
    "tax_registration_id": null,
    "legal_registration_id": "HRB 12345",
    "address": { "street": "Beispielweg 4", "postal_code": "50667", "city": "Köln", "country": "DE" },
    "contact": { "email": "rechnung@lieferant.example", "phone": null },
    "website": null
  },
  "buyer": {
    "name": "Beispiel Handel GmbH",
    "vat_id": "DE987654321",
    "tax_registration_id": null,
    "legal_registration_id": null,
    "address": { "street": "Hauptstraße 1", "postal_code": "40213", "city": "Düsseldorf", "country": "DE" },
    "contact": null,
    "website": null
  },
  "payee": null,
  "deliver_to": null,
  "other_parties": [],
  "payment": {
    "means_code": "58",
    "means": "transfer",
    "iban": "DE02120300000000202051",
    "bic": null,
    "terms": "14 Tage 2 % Skonto, 30 Tage netto",
    "net_days": 30,
    "paid_on": null
  },
  "early_payment_discounts": [
    { "days": 14, "percent": "2", "base_amount": null, "due_date": "2026-11-17" }
  ],
  "totals": { "net": "1068.00", "tax": "202.92", "gross": "1270.92", "payable": null, "prices_include_vat": false },
  "vat_breakdown": [
    { "category": "S", "rate": "19", "taxable_amount": "1068.00", "tax_amount": "202.92", "exemption_reason": null }
  ],
  "lines": [
    {
      "id": "1", "name": "Bürostuhl ErgoPlus schwarz", "seller_item_id": "ES-200", "standard_item_id": null,
      "quantity": "4", "unit": "H87", "price": "189.00", "base_quantity": null, "net_amount": "756.00",
      "discount_percent": null, "vat_category": "S", "vat_rate": "19",
      "ordered_quantity": null, "backordered_quantity": null, "batch": null, "pzn": null,
      "attributes": { "colour": "schwarz" }
    },
    {
      "id": "2", "name": "Montage", "seller_item_id": null, "standard_item_id": null,
      "quantity": "4", "unit": "HUR", "price": "78.00", "base_quantity": null, "net_amount": "312.00",
      "discount_percent": null, "vat_category": "S", "vat_rate": "19",
      "ordered_quantity": null, "backordered_quantity": null, "batch": null, "pzn": null,
      "attributes": {}
    }
  ],
  "deductions": [],
  "card": null,
  "worked_out": [],
  "sources": {
    "number": { "page": 1, "quote": "RE-2026-1187", "confidence": "read", "why": null },
    "totals.gross": { "page": 1, "quote": "1.270,92 €", "confidence": "checked", "why": null },
    "seller.vat_id": { "page": 1, "quote": "DE123456789", "confidence": "checked", "why": null }
  },
  "checks": [
    { "name": "vat", "passed": true, "sums": true, "fields": ["totals.net", "totals.tax"], "at": "19" },
    { "name": "gross", "passed": true, "sums": true, "fields": ["totals.net", "totals.tax", "totals.gross"], "at": null }
  ],
  "tax_check": { "case": "standard", "missing": [] },
  "attention": [],
  "possible_duplicate_of": null,
  "read_with": "reader"
}
```

## Kind and direction

Branch on `kind`. It groups Ocost's many document types into a few, such as `invoice`, `credit_note`, `delivery_note` and `contract`. `kind_detail` names the exact type, for information. `type_code` gives the invoice's UNCL 1001 code, such as `380` for an invoice or `381` for a credit note.

`direction` says whether the document is `incoming` from a supplier, `outgoing` from your business, or `unsure`. Ocost works it out from the VAT ID, tax number and name in [Settings › Company](https://app.ocost.io/settings/company), so keep them right.

## How values are written

| Value | Written as |
| --- | --- |
| Amounts and quantities | Decimal strings as printed, such as `"1270.92"`. Never numbers, so use a decimal type. |
| Rates | Percent strings, such as `"19"` or `"5.5"`. |
| Dates, currencies, countries | ISO 8601 (`2026-11-03`), ISO 4217 (`EUR`), ISO 3166-1 alpha-2 (`DE`). |
| Units | UNECE Recommendation 20 (`H87` piece, `HUR` hour) or 21 (`XCT` carton). |
| Codes read wrong | `null`. A currency, country, unit, VAT category, IBAN or BIC that isn't a valid code is never passed on as printed. |
| Missing values | `null`, when not printed or when Ocost wasn't sure. Ocost never guesses. Over MCP, such a field is left out instead. |

## How sure Ocost is

`sources` says, for each value by its path, where it was read: its `page` and its `quote`. Its `confidence` is one of three:

| Confidence | Meaning |
| --- | --- |
| `checked` | A check confirmed it, or it came from an e-invoice. |
| `read` | Nothing speaks against it. |
| `doubt` | A check failed, and `why` names it. Or its words weren't found on its page. |

`checks` lists every check Ocost ran in code, with `passed`. The checks marked `sums: true` add up the amounts. Fill a bill without a person's look only when every one of them passed.

`attention` lists what a person should look at before booking, such as a possible duplicate. `tax_check` holds an incoming invoice's check against § 14 UStG.

```python
from decimal import Decimal

document = session.get(f"{API}/files/{file_id}/document", timeout=15).json()
sums_hold = all(c["passed"] for c in document["checks"] if c["sums"])
gross = Decimal(document["totals"]["gross"]) if document["totals"]["gross"] else None
doubts = [path for path, s in document["sources"].items() if s["confidence"] == "doubt"]
```

```javascript
const document = await fetch(`${API}/documents/${documentId}`, { headers: auth }).then((r) => r.json());
const sumsHold = document.checks.filter((c) => c.sums).every((c) => c.passed);
// Amounts are strings: keep them as strings, or use a decimal library.
console.log(document.number, document.totals.gross, sumsHold);
```

## Versions

The shape is stable. Within v1, Ocost may add a value to a list, but never renames or removes a field or a value. Treat a `kind` you don't know as `other`, and never fail on an unknown value. A breaking change comes as `ocost.document.v2` under `/public/v2`, and v1 stays for 12 more months.

## Fields

Every field, written from Ocost's code. The [JSON Schema](https://docs.ocost.io/schemas/ocost.document.v1.json) holds the same.

### `Document`

| Field | Type | Meaning |
| --- | --- | --- |
| `schema` | `ocost.document.v1` | Always this |
| `id` | uuid | The document |
| `file_id` | uuid | The file it is in |
| `pages` | list of integer | Its pages in the file, from 1 |
| `kind` | enum, [Values](#values) | What a document is, grouped so an integrator branches on few; the exact kind is `kind_detail`. |
| `kind_detail` | enum, [Values](#values) | The exact kind, one of Ocost's document types, for information |
| `direction` | enum, [Values](#values) | Whether the business received or issued it. |
| `type_code` | string (`380`) or null | BT-3, UNCL 1001 |
| `number` | string or null | BT-1 |
| `issue_date` | date or null | BT-2 |
| `due_date` | date or null | BT-9 |
| `delivery_date` | date or null | BT-72 |
| `invoicing_period_start` | date or null | BT-73 |
| `invoicing_period_end` | date or null | BT-74 |
| `valid_until` | date or null | A quote's |
| `currency` | string (`EUR`) or null | BT-5, ISO 4217 |
| `buyer_reference` | string or null | BT-10 |
| `order_reference` | string or null | BT-13 |
| `order_references` | list of string | Every order it names |
| `preceding_invoice` | string or null | BT-25 |
| `seller` | `Party` or null | BG-4 |
| `buyer` | `Party` or null | BG-7 |
| `payee` | `Party` or null | BG-10: when not the seller |
| `deliver_to` | `Address` or null | BG-15 |
| `other_parties` | list of `OtherParty` | Every other party named |
| `payment` | `Payment` | BG-16. |
| `early_payment_discounts` | list of `EarlyPaymentDiscount` | Skonto: XRechnung's #SKONTO# in BT-20. |
| `totals` | `Totals` | BG-22. |
| `vat_breakdown` | list of `VatGroup` | BG-23. |
| `lines` | list of `Line` | BG-25. |
| `deductions` | list of `Deduction` | A final invoice's: an earlier invoice it takes off. |
| `card` | `Card` or null | What a document without fields of its own says: a title, a summary and its facts (deadlines first). |
| `worked_out` | list of `WorkedOut` | An amount Ocost worked out because the one read can't be it. |
| `sources` | map of `Source` | Per value, by its path |
| `checks` | list of `Check` | A check Ocost ran in code, and whether it passed. |
| `tax_check` | `TaxCheck` or null | An incoming invoice's § 14 UStG check (Germany's rules). |
| `attention` | list of enum, [Values](#values) | What a person should look at before booking it. |
| `possible_duplicate_of` | uuid or null | An earlier document of the same kind, number and seller |
| `read_with` | enum, [Values](#values) | How Ocost read it |

### `Party`

| Field | Type | Meaning |
| --- | --- | --- |
| `name` | string or null | BT-27 (seller), BT-44 (buyer) |
| `vat_id` | string or null | BT-31, BT-48 |
| `tax_registration_id` | string or null | BT-32: the tax number (Steuernummer) |
| `legal_registration_id` | string or null | BT-30, BT-47: the register entry (HRB …) |
| `address` | `Address` or null | BG-5, BG-8 |
| `contact` | `Contact` or null | BG-6, BG-9 |
| `website` | string or null | As printed: a host, with or without its scheme |

### `Address`

| Field | Type | Meaning |
| --- | --- | --- |
| `street` | string or null | BT-35 (seller), BT-50 (buyer) |
| `postal_code` | string or null | BT-38, BT-53 |
| `city` | string or null | BT-37, BT-52 |
| `country` | string (`DE`) or null | BT-40, BT-55: ISO 3166-1 alpha-2 |

### `OtherParty`

| Field | Type | Meaning |
| --- | --- | --- |
| `name` | string or null | BT-27 (seller), BT-44 (buyer) |
| `vat_id` | string or null | BT-31, BT-48 |
| `tax_registration_id` | string or null | BT-32: the tax number (Steuernummer) |
| `legal_registration_id` | string or null | BT-30, BT-47: the register entry (HRB …) |
| `address` | `Address` or null | BG-5, BG-8 |
| `contact` | `Contact` or null | BG-6, BG-9 |
| `website` | string or null | As printed: a host, with or without its scheme |
| `role` | enum, [Values](#values) | What it is to the document |
| `printed_role` | string or null | The words printed for its role |

### `Payment`

| Field | Type | Meaning |
| --- | --- | --- |
| `means_code` | enum, [Values](#values) or null | BT-81, UNCL 4461; null when it doesn't say or it was paid already |
| `means` | enum, [Values](#values) or null | The same, as a word |
| `iban` | string (`DE02120300000000202051`) or null | BT-84, without spaces |
| `bic` | string (`BYLADEM1001`) or null | BT-86 |
| `terms` | string or null | BT-20, as printed |
| `net_days` | integer or null | The days the terms give to pay in full from the issue date |
| `paid_on` | date or null | The day it says it was paid or charged, where printed |

### `EarlyPaymentDiscount`

| Field | Type | Meaning |
| --- | --- | --- |
| `days` | integer |  |
| `percent` | decimal | 2 for 2 % |
| `base_amount` | decimal or null | What it is taken off, where printed; null: the amount due |
| `due_date` | date or null | The last day for it: the issue date plus `days` |

### `Totals`

| Field | Type | Meaning |
| --- | --- | --- |
| `net` | decimal or null | BT-109 |
| `tax` | decimal or null | BT-110 |
| `gross` | decimal or null | BT-112 |
| `payable` | decimal or null | BT-115: what is left to pay; null when it is the gross |
| `prices_include_vat` | boolean | Its lines' prices and amounts include VAT (a receipt) |

### `VatGroup`

| Field | Type | Meaning |
| --- | --- | --- |
| `category` | enum, [Values](#values) or null | BT-118 |
| `rate` | decimal or null | BT-119, percent: 19 |
| `taxable_amount` | decimal | BT-116 |
| `tax_amount` | decimal | BT-117 |
| `exemption_reason` | string or null | BT-120 |

### `Line`

| Field | Type | Meaning |
| --- | --- | --- |
| `id` | string | BT-126: its position |
| `name` | string | BT-153 |
| `seller_item_id` | string or null | BT-155: the article number |
| `standard_item_id` | string or null | BT-157: the GTIN (scheme 0160) |
| `quantity` | decimal or null | BT-129 |
| `unit` | string (`C62`) or null | BT-130: UNECE Rec 20 (C62, HUR, KGM) or Rec 21 (XCT); null when none is printed or it is no code |
| `price` | decimal or null | BT-146: the net price |
| `base_quantity` | decimal or null | BT-149: how many units `price` is for; null: one |
| `net_amount` | decimal or null | BT-131 |
| `discount_percent` | decimal or null | The line's discount: 5 |
| `vat_category` | enum, [Values](#values) or null | BT-151 |
| `vat_rate` | decimal or null | BT-152, percent |
| `ordered_quantity` | decimal or null | A delivery note's |
| `backordered_quantity` | decimal or null | Still to come |
| `batch` | string or null | Its batch (Charge), as printed |
| `pzn` | string or null | A medicine's PZN |
| `attributes` | map of string | What it is, as printed: colour, size, material, brand, … |

### `Deduction`

| Field | Type | Meaning |
| --- | --- | --- |
| `number` | string or null |  |
| `issue_date` | date or null |  |
| `net` | decimal or null |  |
| `tax` | decimal or null |  |
| `gross` | decimal or null |  |

### `Card`

| Field | Type | Meaning |
| --- | --- | --- |
| `title` | string or null |  |
| `summary` | string or null |  |
| `facts` | list of `Fact` |  |

### `WorkedOut`

| Field | Type | Meaning |
| --- | --- | --- |
| `field` | enum, [Values](#values) | Its path in this document |
| `printed` | decimal or null | What was read |
| `rule` | enum, [Values](#values) | How Ocost worked an amount out. |

### `Source`

| Field | Type | Meaning |
| --- | --- | --- |
| `page` | integer or null | Where it was read, from 1 |
| `quote` | string or null | The words it was read from |
| `confidence` | enum, [Values](#values) | How sure Ocost is of a value, from its checks: never a model's grade. |
| `why` | string or null | For a doubt: the failed check's `name` |

### `Check`

| Field | Type | Meaning |
| --- | --- | --- |
| `name` | enum, [Values](#values) | What it checked; `sums` says whether it is one of the sums |
| `passed` | boolean |  |
| `sums` | boolean | One of the sums (total, vat, vat_net, vat_tax, gross, payable, signs, skonto, deduction, deductions, quantity): fill a bill only when all pass |
| `fields` | list of string (`totals.gross`) | The paths it is about, as `sources` names them |
| `at` | string or null | The rate or the line it is about |

### `TaxCheck`

| Field | Type | Meaning |
| --- | --- | --- |
| `case` | enum, [Values](#values) | Which German rules an incoming invoice is held to. |
| `missing` | list of `TaxItem` |  |

### `Contact`

| Field | Type | Meaning |
| --- | --- | --- |
| `email` | string or null | BT-43, BT-58: an address as printed |
| `phone` | string or null | BT-42, BT-57: as printed |

### `Fact`

| Field | Type | Meaning |
| --- | --- | --- |
| `label` | string | What it is, in the document's words |
| `kind` | enum, [Values](#values) | What a fact on a document's card is. |
| `date` | date or null |  |
| `amount` | decimal or null |  |
| `currency` | string (`EUR`) or null | ISO 4217, of `amount` |
| `number` | decimal or null |  |
| `text` | string or null |  |
| `page` | integer or null |  |

### `TaxItem`

| Field | Type | Meaning |
| --- | --- | --- |
| `item` | enum, [Values](#values) | What an invoice lacks, or has wrong, for its case. |
| `law` | string | The paragraph that asks for it |
| `at_stake` | boolean | Missing, it costs the input VAT deduction |

## Values

Every list of values, written from Ocost's code. The [JSON Schema](https://docs.ocost.io/schemas/ocost.document.v1.json) and the [API reference](https://docs.ocost.io/openapi.json) hold the same. A later Ocost may add a value within v1. Treat a `kind` you don't know as `other`, and leave any other unknown value aside. No value is renamed or removed in v1.

### `kind`

What a document is, grouped so an integrator branches on few; the exact kind is `kind_detail`.

| Value | Meaning |
| --- | --- |
| `invoice` | An invoice to pay: partial, final, advance, collective, recurring, self-billed (`type_code` says which) |
| `credit_note` | A credit note |
| `invoice_correction` | A corrected invoice |
| `receipt` | A receipt: paid already |
| `pro_forma` | A pro forma invoice: not to pay |
| `delivery_note` | A delivery note |
| `order` | An order: a purchase, service, work or project order |
| `order_confirmation` | An order's or a reservation's confirmation |
| `quote` | A quote (offer) |
| `contract` | A contract: agreements, leases, insurance policies, mandates |
| `statement` | A factor's statement |
| `payment_reminder` | A payment reminder |
| `other` | Anything else: `kind_detail` and `card` say what |

### `kind_detail`

The exact kind, one of Ocost's document types, for information: branch on `kind`, which groups them (the guide's reference lists which).

Each `kind_detail`, by the `kind` it is:

| kind | kind_detail |
| --- | --- |
| `invoice` | `collective_invoice`, `invoice`, `recurring_rental_invoice`, `fee_invoice`, `advance_payment_invoice`, `credit_invoice`, `final_invoice`, `partial_invoice` |
| `credit_note` | `credit_note` |
| `invoice_correction` | `invoice_correction` |
| `receipt` | `receipt`, `payment_voucher` |
| `pro_forma` | `pro_forma_invoice` |
| `delivery_note` | `delivery_note` |
| `order` | `order`, `order_form`, `project_order`, `service_order`, `work_order`, `purchase_order` |
| `order_confirmation` | `order_confirmation`, `reservation_confirmation` |
| `quote` | `offer` |
| `contract` | `agreement`, `contract`, `insurance_policy`, `mandate`, `lease_contract` |
| `statement` | `statement` |
| `payment_reminder` | `payment_reminder` |
| `other` | `acceptance_protocol`, `bonus_payment_notification`, `certificate`, `certificate_of_destruction`, `cost_statement`, `court_order`, `reimbursement`, `customer_statistics`, `decision`, `final_report`, `lump_sum_overview`, `test_report`, `laboratory_report`, `logistics_appendix`, `maintenance_log`, `maintenance_report`, `request_for_medical_consultation`, `notification`, `payroll`, `pay_slip`, `prescription`, `work_record`, `recommendation`, `report`, `inquiry`, `requirement`, `separator_sheet`, `service_report`, `service_documentation`, `declaration`, `time_sheet`, `work_report`, `settlement_amount`, `electronic_summary`, `administrative_fee`, `copy_of_invoice`, `bailiff`, `membership_fee`, `enforcement_case`, `information`, `cost_calculation`, `fee_notice`, `invoice_audit`, `annex`, `direct_debit_advice`, `process_history`, `internal_project_information`, `bank_transaction_report`, `request_for_quotation`, `rejection`, `form` |

### `direction`

Whether the business received or issued it.

| Value | Meaning |
| --- | --- |
| `incoming` | To the business: a supplier's |
| `outgoing` | The business issued it |
| `unsure` | Its parties don't say |

### `other_parties[].role`

What another party is to the document; `printed_role` is its words.

| Value | Meaning |
| --- | --- |
| `seller` | The seller |
| `buyer` | The buyer |
| `invoicee` | Who it is addressed to, when not the buyer (Rechnungsempfänger) |
| `service_recipient` | Who receives the service, when not the buyer (Leistungsempfänger) |
| `payer` | Who pays, when not the buyer |
| `payee` | Who is paid, when not the seller |
| `ship_to` | Where the goods go (Warenempfänger) |
| `carrier` | Who carries the goods |
| `factor` | Who bought the receivable |
| `debtor` | Whose receivable it is (a factor's debtor) |
| `guarantor` | Who guarantees it (Bürge) |
| `landlord` | The landlord |
| `tenant` | The tenant |
| `subtenant` | The subtenant |
| `contractor` | The contractor |
| `subcontractor` | The subcontractor |
| `principal` | Who commissions the work (Auftraggeber, Bauherr) |
| `agent` | Who acts for a party: a property manager, a broker |
| `insurer` | The insurer |
| `policyholder` | The policyholder |
| `other` | Any other role: `printed_role` says which |

### `payment.means_code`

BT-81: how it is paid, UNCL 4461.

| Value | Meaning |
| --- | --- |
| `58` | SEPA credit transfer |
| `59` | SEPA direct debit |
| `48` | Bank card |

### `payment.means`

How it is paid, as a word.

| Value | Meaning |
| --- | --- |
| `transfer` | A credit transfer (`means_code` 58) |
| `direct_debit` | A direct debit (59) |
| `card` | A card (48) |
| `already_paid` | It says it is paid already (no code) |

### `vat_breakdown[].category`, `lines[].vat_category`

BT-118, BT-151: the VAT category, UNCL 5305 as EN 16931 uses it.

| Value | Meaning |
| --- | --- |
| `S` | Standard rate |
| `Z` | Zero rated goods |
| `E` | Exempt from VAT |
| `AE` | Reverse charge: the buyer owes the VAT |
| `K` | Intra-community supply, VAT exempt |
| `G` | Export outside the EU, free of VAT |
| `O` | Outside the scope of VAT |
| `L` | Canary Islands' IGIC |
| `M` | Ceuta and Melilla's IPSI |
| `B` | Transferred VAT (Italy's split payment) |

### `card.facts[].kind`

What a fact on a document's card is.

| Value | Meaning |
| --- | --- |
| `deadline` | A date something is due by; its label says what |
| `valid_from` | The day it is valid from |
| `valid_until` | The day it is valid until |
| `reference` | A number naming something else |
| `amount` | An amount |
| `party` | Someone besides its issuer and recipient |
| `date` | Any other date: an inspection, an acceptance |
| `other` | Anything else |

### `worked_out[].field`

The amount worked out, by its path.

| Value | Meaning |
| --- | --- |
| `totals.net` | BT-109 |
| `totals.tax` | BT-110 |
| `totals.gross` | BT-112 |

### `worked_out[].rule`

How Ocost worked an amount out.

| Value | Meaning |
| --- | --- |
| `groups` | The VAT groups' sum |
| `net_tax` | Net plus VAT |
| `skonto` | The gross read was the amount less Skonto |
| `payable` | The gross read was what is left to pay |
| `outside` | The net with an amount outside the VAT groups: a deposit, a tip |

### `sources.*.confidence`

How sure Ocost is of a value, from its checks: never a model's grade.

| Value | Meaning |
| --- | --- |
| `checked` | A check confirmed it, or it came from an e-invoice |
| `read` | Nothing speaks against it |
| `doubt` | A check failed (`why` names it), or its words weren't on its page |

### `checks[].name`

A check Ocost ran in code on what it read.

| Value | Sum | Meaning |
| --- | --- | --- |
| `total` | yes | A total was read |
| `vat` | yes | A VAT group's VAT is its net × rate (`at` the rate) |
| `vat_net` | yes | The VAT groups' nets add up to the net |
| `vat_tax` | yes | The VAT groups' VAT adds up to the VAT |
| `gross` | yes | Net plus VAT is the gross (the net, with no VAT printed) |
| `payable` | yes | What is left to pay is between nothing and the gross |
| `signs` | yes | No total is negative |
| `deduction` | yes | A deducted invoice's net plus VAT is its gross (`at` which) |
| `deductions` | yes | The gross less the deductions is what is left to pay |
| `quantity` | yes | A delivered quantity is positive, or the line is backordered (`at` the line) |
| `skonto` | yes | A Skonto is plausible: up to 10 %, within a year |
| `line` |  | A line's quantity × price, less its discount, is its net (`at` the line) |
| `lines_net` |  | The lines add up to the net (the gross, priced with VAT) |
| `lines_currency` |  | The lines are in another currency than the totals (`at` it) |
| `vat_lines` |  | A VAT group's net is its lines' (`at` the rate) |
| `iban` |  | The IBAN's check digits hold |
| `vat_id` |  | A German VAT ID's check digit holds |
| `issued_on` |  | The issue date is neither years ago nor ahead |
| `due_on` |  | The due date isn't before the issue date |
| `service` |  | The service period starts before it ends |
| `valid_until` |  | A quote holds until after its issue date |
| `delivery_on` |  | The delivery date is near the issue date |
| `stated` |  | The amounts stated in a second currency add up |
| `stated_rate` |  | The amounts in both currencies agree at the rate printed, else the ECB's (`at` the rate) |
| `payment_sum` |  | A contract's payment: net plus VAT is its gross (`at` which) |
| `payment_vat` |  | A contract's payment: its VAT is its net × rate |
| `payment_sign` |  | A contract's payment: its amounts are positive |
| `step` |  | A stepped rent's step falls in the term, in order |
| `first_payment` |  | A contract's first payment falls in its term |
| `deposit` |  | A contract's deposit is positive |

### `tax_check.case`

Which German rules an incoming invoice is held to.

| Value | Meaning |
| --- | --- |
| `standard` | § 14 Abs. 4 UStG: an invoice with VAT |
| `small` | § 33 UStDV: a small amount, up to 250 € |
| `reverse_charge` | § 13b, § 14a Abs. 5 UStG: the business owes the VAT |
| `intra_eu` | § 14a Abs. 3 UStG: an intra-community supply |
| `exempt` | § 14 Abs. 4 Satz 1 Nr. 8 UStG: an exempt supply |

### `tax_check.missing[].item`

What an invoice lacks, or has wrong, for its case.

| Value | Meaning |
| --- | --- |
| `supplier_name` | The supplier's full name |
| `supplier_address` | The supplier's full address |
| `supplier_tax_id` | The supplier's tax number or VAT ID |
| `recipient_name` | The recipient's full name |
| `recipient_address` | The recipient's full address |
| `recipient_not_us` | It is addressed to someone else than the business |
| `recipient_address_not_ours` | It is addressed to an address that isn't the business's |
| `issued_on` | The issue date |
| `number` | The invoice number |
| `description` | The quantity and kind of the goods or services |
| `service_date` | The day of the supply or service |
| `net` | The net per rate |
| `tax_rate` | The VAT rate |
| `tax_amount` | The VAT |
| `exemption_note` | The note on why it is exempt |
| `reverse_charge_note` | The note that the recipient owes the VAT (Steuerschuldnerschaft des Leistungsempfängers) |
| `intra_eu_note` | The note that it is an intra-community supply |
| `supplier_vat_id` | The supplier's VAT ID |
| `recipient_vat_id` | The recipient's VAT ID |
| `vat_charged` | German VAT charged where the business owes it itself (§ 13b): not deductible, and paying it pays VAT twice |

### `attention[]`

What a person should look at before booking it.

| Value | Meaning |
| --- | --- |
| `sums` | A check with `sums: true` failed |
| `outgoing` | The business issued it |
| `possible_duplicate` | An earlier document has its kind, number and seller (`possible_duplicate_of`) |
| `self_billed` | A self-billed invoice (Gutschrift): the buyer issued it |

### `read_with`

How Ocost read it: never a model's or provider's name.

| Value | Meaning |
| --- | --- |
| `e_invoice` | From its XML, exactly |
| `reader` | From its pages |

### `type_code`

UNCL 1001, one to three digits. An e-invoice may carry a code not listed here. Where the document prints none, Ocost writes its kind's:

| Value | Meaning |
| --- | --- |
| `380` | Commercial invoice |
| `381` | Credit note |
| `384` | Corrected invoice |
| `389` | Self-billed invoice |
| `326` | Partial invoice |
| `386` | Prepayment invoice |
| `325` | Pro forma invoice |
| `875` | Partial construction invoice |
| `876` | Partial final construction invoice |
| `877` | Final construction invoice |
| `383` | Debit note |
| `393` | Factored invoice |
| `751` | Invoice information for accounting purposes |
| `81` | Credit note related to goods or services |
| `83` | Credit note related to financial adjustments |
| `261` | Self-billed credit note |
| `262` | Consolidated credit note, goods and services |
| `396` | Factored credit note |
| `532` | Forwarder's credit note |

### `sources`

The paths that `sources`, `checks[].fields` and `worked_out[].field` name, `n` from 0. A later Ocost may add paths:

`number`, `issue_date`, `due_date`, `delivery_date`, `valid_until`, `currency`, `order_reference`, `seller.name`, `buyer.name`, `seller.vat_id`, `buyer.vat_id`, `seller.contact.email`, `buyer.contact.email`, `seller.contact.phone`, `buyer.contact.phone`, `seller.website`, `buyer.website`, `seller.legal_registration_id`, `buyer.legal_registration_id`, `totals.net`, `totals.tax`, `totals.gross`, `totals.payable`, `payment.iban`, `payment.means_code`, `payment.paid_on`, `lines`, `other_parties[n].name`, `deductions[n].gross`
