Sign in

The document

View as Markdown

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 or generate types from it. Fields and 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, so keep them right.

How values are written

ValueWritten as
Amounts and quantitiesDecimal strings as printed, such as "1270.92". Never numbers, so use a decimal type.
RatesPercent strings, such as "19" or "5.5".
Dates, currencies, countriesISO 8601 (2026-11-03), ISO 4217 (EUR), ISO 3166-1 alpha-2 (DE).
UnitsUNECE Recommendation 20 (H87 piece, HUR hour) or 21 (XCT carton).
Codes read wrongnull. A currency, country, unit, VAT category, IBAN or BIC that isn't a valid code is never passed on as printed.
Missing valuesnull, 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:

ConfidenceMeaning
checkedA check confirmed it, or it came from an e-invoice.
readNothing speaks against it.
doubtA 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.

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"]

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 holds the same.

Document

FieldTypeMeaning
schemaocost.document.v1Always this
iduuidThe document
file_iduuidThe file it is in
pageslist of integerIts pages in the file, from 1
kindenum, ValuesWhat a document is, grouped so an integrator branches on few; the exact kind is kind_detail.
kind_detailenum, ValuesThe exact kind, one of Ocost's document types, for information
directionenum, ValuesWhether the business received or issued it.
type_codestring (380) or nullBT-3, UNCL 1001
numberstring or nullBT-1
issue_datedate or nullBT-2
due_datedate or nullBT-9
delivery_datedate or nullBT-72
invoicing_period_startdate or nullBT-73
invoicing_period_enddate or nullBT-74
valid_untildate or nullA quote's
currencystring (EUR) or nullBT-5, ISO 4217
buyer_referencestring or nullBT-10
order_referencestring or nullBT-13
order_referenceslist of stringEvery order it names
preceding_invoicestring or nullBT-25
sellerParty or nullBG-4
buyerParty or nullBG-7
payeeParty or nullBG-10: when not the seller
deliver_toAddress or nullBG-15
other_partieslist of OtherPartyEvery other party named
paymentPaymentBG-16.
early_payment_discountslist of EarlyPaymentDiscountSkonto: XRechnung's #SKONTO# in BT-20.
totalsTotalsBG-22.
vat_breakdownlist of VatGroupBG-23.
lineslist of LineBG-25.
deductionslist of DeductionA final invoice's: an earlier invoice it takes off.
cardCard or nullWhat a document without fields of its own says: a title, a summary and its facts (deadlines first).
worked_outlist of WorkedOutAn amount Ocost worked out because the one read can't be it.
sourcesmap of SourcePer value, by its path
checkslist of CheckA check Ocost ran in code, and whether it passed.
tax_checkTaxCheck or nullAn incoming invoice's § 14 UStG check (Germany's rules).
attentionlist of enum, ValuesWhat a person should look at before booking it.
possible_duplicate_ofuuid or nullAn earlier document of the same kind, number and seller
read_withenum, ValuesHow Ocost read it

Party

FieldTypeMeaning
namestring or nullBT-27 (seller), BT-44 (buyer)
vat_idstring or nullBT-31, BT-48
tax_registration_idstring or nullBT-32: the tax number (Steuernummer)
legal_registration_idstring or nullBT-30, BT-47: the register entry (HRB …)
addressAddress or nullBG-5, BG-8
contactContact or nullBG-6, BG-9
websitestring or nullAs printed: a host, with or without its scheme

Address

FieldTypeMeaning
streetstring or nullBT-35 (seller), BT-50 (buyer)
postal_codestring or nullBT-38, BT-53
citystring or nullBT-37, BT-52
countrystring (DE) or nullBT-40, BT-55: ISO 3166-1 alpha-2

OtherParty

FieldTypeMeaning
namestring or nullBT-27 (seller), BT-44 (buyer)
vat_idstring or nullBT-31, BT-48
tax_registration_idstring or nullBT-32: the tax number (Steuernummer)
legal_registration_idstring or nullBT-30, BT-47: the register entry (HRB …)
addressAddress or nullBG-5, BG-8
contactContact or nullBG-6, BG-9
websitestring or nullAs printed: a host, with or without its scheme
roleenum, ValuesWhat it is to the document
printed_rolestring or nullThe words printed for its role

Payment

FieldTypeMeaning
means_codeenum, Values or nullBT-81, UNCL 4461; null when it doesn't say or it was paid already
meansenum, Values or nullThe same, as a word
ibanstring (DE02120300000000202051) or nullBT-84, without spaces
bicstring (BYLADEM1001) or nullBT-86
termsstring or nullBT-20, as printed
net_daysinteger or nullThe days the terms give to pay in full from the issue date
paid_ondate or nullThe day it says it was paid or charged, where printed

EarlyPaymentDiscount

FieldTypeMeaning
daysinteger
percentdecimal2 for 2 %
base_amountdecimal or nullWhat it is taken off, where printed; null: the amount due
due_datedate or nullThe last day for it: the issue date plus days

Totals

FieldTypeMeaning
netdecimal or nullBT-109
taxdecimal or nullBT-110
grossdecimal or nullBT-112
payabledecimal or nullBT-115: what is left to pay; null when it is the gross
prices_include_vatbooleanIts lines' prices and amounts include VAT (a receipt)

VatGroup

FieldTypeMeaning
categoryenum, Values or nullBT-118
ratedecimal or nullBT-119, percent: 19
taxable_amountdecimalBT-116
tax_amountdecimalBT-117
exemption_reasonstring or nullBT-120

Line

FieldTypeMeaning
idstringBT-126: its position
namestringBT-153
seller_item_idstring or nullBT-155: the article number
standard_item_idstring or nullBT-157: the GTIN (scheme 0160)
quantitydecimal or nullBT-129
unitstring (C62) or nullBT-130: UNECE Rec 20 (C62, HUR, KGM) or Rec 21 (XCT); null when none is printed or it is no code
pricedecimal or nullBT-146: the net price
base_quantitydecimal or nullBT-149: how many units price is for; null: one
net_amountdecimal or nullBT-131
discount_percentdecimal or nullThe line's discount: 5
vat_categoryenum, Values or nullBT-151
vat_ratedecimal or nullBT-152, percent
ordered_quantitydecimal or nullA delivery note's
backordered_quantitydecimal or nullStill to come
batchstring or nullIts batch (Charge), as printed
pznstring or nullA medicine's PZN
attributesmap of stringWhat it is, as printed: colour, size, material, brand, …

Deduction

FieldTypeMeaning
numberstring or null
issue_datedate or null
netdecimal or null
taxdecimal or null
grossdecimal or null

Card

FieldTypeMeaning
titlestring or null
summarystring or null
factslist of Fact

WorkedOut

FieldTypeMeaning
fieldenum, ValuesIts path in this document
printeddecimal or nullWhat was read
ruleenum, ValuesHow Ocost worked an amount out.

Source

FieldTypeMeaning
pageinteger or nullWhere it was read, from 1
quotestring or nullThe words it was read from
confidenceenum, ValuesHow sure Ocost is of a value, from its checks: never a model's grade.
whystring or nullFor a doubt: the failed check's name

Check

FieldTypeMeaning
nameenum, ValuesWhat it checked; sums says whether it is one of the sums
passedboolean
sumsbooleanOne of the sums (total, vat, vat_net, vat_tax, gross, payable, signs, skonto, deduction, deductions, quantity): fill a bill only when all pass
fieldslist of string (totals.gross)The paths it is about, as sources names them
atstring or nullThe rate or the line it is about

TaxCheck

FieldTypeMeaning
caseenum, ValuesWhich German rules an incoming invoice is held to.
missinglist of TaxItem

Contact

FieldTypeMeaning
emailstring or nullBT-43, BT-58: an address as printed
phonestring or nullBT-42, BT-57: as printed

Fact

FieldTypeMeaning
labelstringWhat it is, in the document's words
kindenum, ValuesWhat a fact on a document's card is.
datedate or null
amountdecimal or null
currencystring (EUR) or nullISO 4217, of amount
numberdecimal or null
textstring or null
pageinteger or null

TaxItem

FieldTypeMeaning
itemenum, ValuesWhat an invoice lacks, or has wrong, for its case.
lawstringThe paragraph that asks for it
at_stakebooleanMissing, it costs the input VAT deduction

Values

Every list of values, written from Ocost's code. The JSON Schema and the API reference 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.

ValueMeaning
invoiceAn invoice to pay: partial, final, advance, collective, recurring, self-billed (type_code says which)
credit_noteA credit note
invoice_correctionA corrected invoice
receiptA receipt: paid already
pro_formaA pro forma invoice: not to pay
delivery_noteA delivery note
orderAn order: a purchase, service, work or project order
order_confirmationAn order's or a reservation's confirmation
quoteA quote (offer)
contractA contract: agreements, leases, insurance policies, mandates
statementA factor's statement
payment_reminderA payment reminder
otherAnything 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:

kindkind_detail
invoicecollective_invoice, invoice, recurring_rental_invoice, fee_invoice, advance_payment_invoice, credit_invoice, final_invoice, partial_invoice
credit_notecredit_note
invoice_correctioninvoice_correction
receiptreceipt, payment_voucher
pro_formapro_forma_invoice
delivery_notedelivery_note
orderorder, order_form, project_order, service_order, work_order, purchase_order
order_confirmationorder_confirmation, reservation_confirmation
quoteoffer
contractagreement, contract, insurance_policy, mandate, lease_contract
statementstatement
payment_reminderpayment_reminder
otheracceptance_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.

ValueMeaning
incomingTo the business: a supplier's
outgoingThe business issued it
unsureIts parties don't say

other_parties[].role

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

ValueMeaning
sellerThe seller
buyerThe buyer
invoiceeWho it is addressed to, when not the buyer (Rechnungsempfänger)
service_recipientWho receives the service, when not the buyer (Leistungsempfänger)
payerWho pays, when not the buyer
payeeWho is paid, when not the seller
ship_toWhere the goods go (Warenempfänger)
carrierWho carries the goods
factorWho bought the receivable
debtorWhose receivable it is (a factor's debtor)
guarantorWho guarantees it (Bürge)
landlordThe landlord
tenantThe tenant
subtenantThe subtenant
contractorThe contractor
subcontractorThe subcontractor
principalWho commissions the work (Auftraggeber, Bauherr)
agentWho acts for a party: a property manager, a broker
insurerThe insurer
policyholderThe policyholder
otherAny other role: printed_role says which

payment.means_code

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

ValueMeaning
58SEPA credit transfer
59SEPA direct debit
48Bank card

payment.means

How it is paid, as a word.

ValueMeaning
transferA credit transfer (means_code 58)
direct_debitA direct debit (59)
cardA card (48)
already_paidIt 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.

ValueMeaning
SStandard rate
ZZero rated goods
EExempt from VAT
AEReverse charge: the buyer owes the VAT
KIntra-community supply, VAT exempt
GExport outside the EU, free of VAT
OOutside the scope of VAT
LCanary Islands' IGIC
MCeuta and Melilla's IPSI
BTransferred VAT (Italy's split payment)

card.facts[].kind

What a fact on a document's card is.

ValueMeaning
deadlineA date something is due by; its label says what
valid_fromThe day it is valid from
valid_untilThe day it is valid until
referenceA number naming something else
amountAn amount
partySomeone besides its issuer and recipient
dateAny other date: an inspection, an acceptance
otherAnything else

worked_out[].field

The amount worked out, by its path.

ValueMeaning
totals.netBT-109
totals.taxBT-110
totals.grossBT-112

worked_out[].rule

How Ocost worked an amount out.

ValueMeaning
groupsThe VAT groups' sum
net_taxNet plus VAT
skontoThe gross read was the amount less Skonto
payableThe gross read was what is left to pay
outsideThe 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.

ValueMeaning
checkedA check confirmed it, or it came from an e-invoice
readNothing speaks against it
doubtA 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.

ValueSumMeaning
totalyesA total was read
vatyesA VAT group's VAT is its net × rate (at the rate)
vat_netyesThe VAT groups' nets add up to the net
vat_taxyesThe VAT groups' VAT adds up to the VAT
grossyesNet plus VAT is the gross (the net, with no VAT printed)
payableyesWhat is left to pay is between nothing and the gross
signsyesNo total is negative
deductionyesA deducted invoice's net plus VAT is its gross (at which)
deductionsyesThe gross less the deductions is what is left to pay
quantityyesA delivered quantity is positive, or the line is backordered (at the line)
skontoyesA Skonto is plausible: up to 10 %, within a year
lineA line's quantity × price, less its discount, is its net (at the line)
lines_netThe lines add up to the net (the gross, priced with VAT)
lines_currencyThe lines are in another currency than the totals (at it)
vat_linesA VAT group's net is its lines' (at the rate)
ibanThe IBAN's check digits hold
vat_idA German VAT ID's check digit holds
issued_onThe issue date is neither years ago nor ahead
due_onThe due date isn't before the issue date
serviceThe service period starts before it ends
valid_untilA quote holds until after its issue date
delivery_onThe delivery date is near the issue date
statedThe amounts stated in a second currency add up
stated_rateThe amounts in both currencies agree at the rate printed, else the ECB's (at the rate)
payment_sumA contract's payment: net plus VAT is its gross (at which)
payment_vatA contract's payment: its VAT is its net × rate
payment_signA contract's payment: its amounts are positive
stepA stepped rent's step falls in the term, in order
first_paymentA contract's first payment falls in its term
depositA contract's deposit is positive

tax_check.case

Which German rules an incoming invoice is held to.

ValueMeaning
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.

ValueMeaning
supplier_nameThe supplier's full name
supplier_addressThe supplier's full address
supplier_tax_idThe supplier's tax number or VAT ID
recipient_nameThe recipient's full name
recipient_addressThe recipient's full address
recipient_not_usIt is addressed to someone else than the business
recipient_address_not_oursIt is addressed to an address that isn't the business's
issued_onThe issue date
numberThe invoice number
descriptionThe quantity and kind of the goods or services
service_dateThe day of the supply or service
netThe net per rate
tax_rateThe VAT rate
tax_amountThe VAT
exemption_noteThe note on why it is exempt
reverse_charge_noteThe note that the recipient owes the VAT (Steuerschuldnerschaft des Leistungsempfängers)
intra_eu_noteThe note that it is an intra-community supply
supplier_vat_idThe supplier's VAT ID
recipient_vat_idThe recipient's VAT ID
vat_chargedGerman 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.

ValueMeaning
sumsA check with sums: true failed
outgoingThe business issued it
possible_duplicateAn earlier document has its kind, number and seller (possible_duplicate_of)
self_billedA self-billed invoice (Gutschrift): the buyer issued it

read_with

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

ValueMeaning
e_invoiceFrom its XML, exactly
readerFrom 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:

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