{"openapi":"3.1.0","info":{"title":"E-Invoice API","description":"\nGenerate, validate, convert and render **standards compliant electronic\ninvoices** from simple JSON.\n\nThe API speaks one canonical invoice model and emits XRechnung, ZUGFeRD /\nFactur-X, EN 16931, UBL 2.1, UN/CEFACT CII and Peppol BIS Billing 3.0.\n\n### Validation is real\n\nValidation runs the *official* rule sets — the KoSIT Validator with the\nXRechnung validator configuration, the CEN EN 16931 Schematron and the\nOpenPeppol BIS Billing rules. When no rule set can be executed the response\nsays so (`status: \"unsupported_validation\"`, `valid: null`) instead of\nreporting an unverified document as valid.\n\nTechnical conformance with these rule sets is not by itself a statement about\ntax or legal acceptance in any jurisdiction.\n\n### Authentication\n\nThe compute endpoints require an API key, sent as `Authorization: Bearer\ninv_…` or `X-API-Key`. Create one in the dashboard under *API keys*; it is\nshown once and stored only as a hash. The browser tools additionally accept a\nsession cookie, and allow a small anonymous budget so the generator can be\ntried without an account.\n\n### Calling this API from a browser\n\n**You cannot, and that is deliberate.** No `Access-Control-Allow-Origin` header\nis sent to arbitrary origins, so a `fetch` from a web page will fail on CORS.\n\nThe reason is the API key: anything a browser can send, a visitor can read out\nof the page source. Call this API from your server, and let your own frontend\ntalk to your server. The two hosts that do get CORS headers are this service's\nown web application — it holds no key of yours.\n\n### Content types\n\n`POST /api/v1/validate`, `/detect`, `/parse` and `/convert` accept a document\nin several ways: a `multipart/form-data` upload, a raw body with\n`application/xml`, `application/pdf` or `text/plain`, or a JSON object carrying\n`xml`, `content_base64` or `invoice`. `text/plain` is accepted for XML as a\nconvenience — many HTTP clients default to it.\n\nA body sent with **no** `Content-Type` is refused with `415`, because the\nrequest cannot be read at all in that case.\n\n### Rate limits\n\nEvery response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and\n`X-RateLimit-Reset` (the window length in seconds), so a client can pace itself\nbefore hitting `429`.\n\n### `ubl` and `cii` are syntaxes, not separate standards\n\nGenerating with `format: \"ubl\"` or `\"cii\"` produces a document whose\n`CustomizationID` (BT-24) is `urn:cen.eu:en16931:2017` — the EN 16931\nidentifier, because that is what such a document conforms to. `detect` and\n`validate` therefore report it as `en16931`. This is not a round-trip failure:\n`ubl` and `cii` select the XML grammar, `en16931` is the business standard the\nresult satisfies.\n\n### What is stored, and what is not\n\nAccounts, API keys, usage counters and the audit trail are held in PostgreSQL.\n\n**Invoice content is not.** Documents are produced, returned and forgotten\nwithin the request: nothing you send is written to disk or kept after the\nresponse, and the usage record carries the shape of the work — operation,\nformat, duration — with no party names, amounts or XML.\n\n### What counts against your plan\n\nA plan is quoted in **invoices**. One is spent by *producing* a document and\none by *running the rule sets* — nothing else is metered:\n\n| Endpoint | Counts as |\n| --- | --- |\n| `POST /api/v1/generate` | generation |\n| `POST /api/v1/render` | generation |\n| `POST /api/v1/convert` (to `xml`, `pdf`, `html`) | generation |\n| `POST /api/v1/validate` | validation |\n| `POST /api/v1/convert` (to `json`) | free |\n| `POST /api/v1/parse`, `/detect`, `/calculate` | free |\n| Everything under *Account* | free |\n\nA request that fails is not charged: a `4xx` produced no document and a `5xx`\nwas our fault. `GET /api/v1/organizations/{organization_id}/usage` returns the\ncurrent period, what has been spent and how it splits between the two.\n\nThere is no checkout in this release — allowances are counted and reported,\nand no card is charged.\n","termsOfService":"https://invoapi.de/agb","contact":{"name":"Invoapi Support","url":"https://invoapi.de/kontakt","email":"app@invoapi.de"},"version":"0.1.0"},"paths":{"/api/v1/altcha/challenge":{"get":{"tags":["Service"],"summary":"A proof of work for use without an account","description":"Mint one challenge for an anonymous caller.\n\nPublic and unmetered on purpose: refusing to hand out challenges would be a\nway to lock out the very visitors this is meant to serve, and a challenge\ncosts one HMAC to produce. What it buys is spent in\n`auth_deps._require_altcha`, once, on the request that presents it.\n\nAnswers 404 where no signing key is configured, because on such a\ndeployment there is nothing to prove and no header to send.","operationId":"altcha_challenge_api_v1_altcha_challenge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Altcha Challenge Api V1 Altcha Challenge Get"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/health":{"get":{"tags":["Service"],"summary":"Service health","description":"Report service and validation-engine availability.\n\nThe status is ``degraded`` — not ``ok`` — when the validator cannot be\nreached, because validation requests will then report\n``unsupported_validation`` instead of a verdict.","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/formats":{"get":{"tags":["Formats"],"summary":"List supported formats","description":"Enumerate every supported format with its versions and capabilities.","operationId":"list_formats_api_v1_formats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormatListResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/formats/{format_id}":{"get":{"tags":["Formats"],"summary":"Describe one format","description":"Describe a format, including exactly which rule sets validate it.","operationId":"get_format_api_v1_formats__format_id__get","parameters":[{"name":"format_id","in":"path","required":true,"schema":{"type":"string","title":"Format Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormatDetailResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/generate":{"post":{"tags":["Invoicing"],"summary":"Generate an e-invoice","description":"Turn a canonical invoice into a standards compliant document.\n\nTotals and the VAT breakdown are always recalculated server-side, so the\ngenerated document is arithmetically consistent by construction.\n\nFor XRechnung (and the ZUGFeRD XRECHNUNG profile), a missing buyer reference\n(BT-10) falls back to the invoice number so the mandatory rule BR-DE-15 is\nmet rather than failing an otherwise complete document; the substitution is\nreported in ``warnings``. Supply ``buyer_reference`` (the Leitweg-ID) for\npublic-sector buyers, where that fallback would not route correctly.","operationId":"generate_api_v1_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"500":{"description":"The generated document failed its own XML Schema — a defect in this service, reported rather than returned as a valid invoice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]},{"SessionCookie":[]},{}]}},"/api/v1/validate":{"post":{"tags":["Invoicing"],"summary":"Validate an e-invoice","description":"Validate an uploaded or posted document against its real rule set.\n\nAccepts ``multipart/form-data`` with a ``file`` field, a raw\n``application/xml`` body, or a JSON wrapper containing ``xml``,\n``content_base64`` or a canonical ``invoice``.\n\nWhen no rule set can be executed the response reports\n``status: \"unsupported_validation\"`` with ``valid: null``. A document is\nnever reported valid without having been checked.","operationId":"validate_document_api_v1_validate_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The document in a JSON wrapper: `xml` for text, `content_base64` for bytes.","properties":{"xml":{"type":"string","description":"The complete XML document."},"content_base64":{"type":"string","description":"XML or a hybrid PDF, base64 encoded."},"invoice":{"$ref":"#/components/schemas/CanonicalInvoice-Input","description":"A canonical invoice, generated and then validated."}}},"example":{"xml":"<?xml version='1.0' encoding='UTF-8'?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\">\n  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>\n  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>\n  <cbc:ID>RE-2026-0001</cbc:ID>\n  <cbc:IssueDate>2026-08-20</cbc:IssueDate>\n  <cbc:DueDate>2026-09-19</cbc:DueDate>\n  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>\n  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>\n  <cbc:BuyerReference>04011000-12345-34</cbc:BuyerReference>\n  <cac:AccountingSupplierParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"9930\">DE123456789</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Musterstraße 1</cbc:StreetName>\n        <cbc:CityName>Berlin</cbc:CityName>\n        <cbc:PostalZone>10115</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE123456789</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n      <cac:Contact>\n        <cbc:Name>Buchhaltung</cbc:Name>\n        <cbc:Telephone>+49 30 1234567</cbc:Telephone>\n        <cbc:ElectronicMail>rechnung@muster.de</cbc:ElectronicMail>\n      </cac:Contact>\n    </cac:Party>\n  </cac:AccountingSupplierParty>\n  <cac:AccountingCustomerParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"0204\">04011000-12345-34</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Teststraße 10</cbc:StreetName>\n        <cbc:CityName>Hamburg</cbc:CityName>\n        <cbc:PostalZone>20095</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE987654321</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Beispiel GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n    </cac:Party>\n  </cac:AccountingCustomerParty>\n  <cac:Delivery>\n    <cbc:ActualDeliveryDate>2026-08-18</cbc:ActualDeliveryDate>\n  </cac:Delivery>\n  <cac:PaymentMeans>\n    <cbc:PaymentMeansCode name=\"SEPA credit transfer\">58</cbc:PaymentMeansCode>\n    <cac:PayeeFinancialAccount>\n      <cbc:ID>DE02120300000000202051</cbc:ID>\n    </cac:PayeeFinancialAccount>\n  </cac:PaymentMeans>\n  <cac:PaymentTerms>\n    <cbc:Note>Zahlbar innerhalb von 30 Tagen ohne Abzug.</cbc:Note>\n  </cac:PaymentTerms>\n  <cac:TaxTotal>\n    <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n    <cac:TaxSubtotal>\n      <cbc:TaxableAmount currencyID=\"EUR\">1000.00</cbc:TaxableAmount>\n      <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n      <cac:TaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:TaxCategory>\n    </cac:TaxSubtotal>\n  </cac:TaxTotal>\n  <cac:LegalMonetaryTotal>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cbc:TaxExclusiveAmount currencyID=\"EUR\">1000.00</cbc:TaxExclusiveAmount>\n    <cbc:TaxInclusiveAmount currencyID=\"EUR\">1190.00</cbc:TaxInclusiveAmount>\n    <cbc:PayableAmount currencyID=\"EUR\">1190.00</cbc:PayableAmount>\n  </cac:LegalMonetaryTotal>\n  <cac:InvoiceLine>\n    <cbc:ID>1</cbc:ID>\n    <cbc:InvoicedQuantity unitCode=\"HUR\">10</cbc:InvoicedQuantity>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cac:Item>\n      <cbc:Name>Softwareentwicklung</cbc:Name>\n      <cac:ClassifiedTaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:ClassifiedTaxCategory>\n    </cac:Item>\n    <cac:Price>\n      <cbc:PriceAmount currencyID=\"EUR\">100</cbc:PriceAmount>\n    </cac:Price>\n  </cac:InvoiceLine>\n</Invoice>\n"}},"application/xml":{"schema":{"type":"string","description":"The document, posted raw."},"example":"<?xml version='1.0' encoding='UTF-8'?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\">\n  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>\n  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>\n  <cbc:ID>RE-2026-0001</cbc:ID>\n  <cbc:IssueDate>2026-08-20</cbc:IssueDate>\n  <cbc:DueDate>2026-09-19</cbc:DueDate>\n  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>\n  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>\n  <cbc:BuyerReference>04011000-12345-34</cbc:BuyerReference>\n  <cac:AccountingSupplierParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"9930\">DE123456789</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Musterstraße 1</cbc:StreetName>\n        <cbc:CityName>Berlin</cbc:CityName>\n        <cbc:PostalZone>10115</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE123456789</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n      <cac:Contact>\n        <cbc:Name>Buchhaltung</cbc:Name>\n        <cbc:Telephone>+49 30 1234567</cbc:Telephone>\n        <cbc:ElectronicMail>rechnung@muster.de</cbc:ElectronicMail>\n      </cac:Contact>\n    </cac:Party>\n  </cac:AccountingSupplierParty>\n  <cac:AccountingCustomerParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"0204\">04011000-12345-34</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Teststraße 10</cbc:StreetName>\n        <cbc:CityName>Hamburg</cbc:CityName>\n        <cbc:PostalZone>20095</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE987654321</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Beispiel GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n    </cac:Party>\n  </cac:AccountingCustomerParty>\n  <cac:Delivery>\n    <cbc:ActualDeliveryDate>2026-08-18</cbc:ActualDeliveryDate>\n  </cac:Delivery>\n  <cac:PaymentMeans>\n    <cbc:PaymentMeansCode name=\"SEPA credit transfer\">58</cbc:PaymentMeansCode>\n    <cac:PayeeFinancialAccount>\n      <cbc:ID>DE02120300000000202051</cbc:ID>\n    </cac:PayeeFinancialAccount>\n  </cac:PaymentMeans>\n  <cac:PaymentTerms>\n    <cbc:Note>Zahlbar innerhalb von 30 Tagen ohne Abzug.</cbc:Note>\n  </cac:PaymentTerms>\n  <cac:TaxTotal>\n    <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n    <cac:TaxSubtotal>\n      <cbc:TaxableAmount currencyID=\"EUR\">1000.00</cbc:TaxableAmount>\n      <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n      <cac:TaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:TaxCategory>\n    </cac:TaxSubtotal>\n  </cac:TaxTotal>\n  <cac:LegalMonetaryTotal>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cbc:TaxExclusiveAmount currencyID=\"EUR\">1000.00</cbc:TaxExclusiveAmount>\n    <cbc:TaxInclusiveAmount currencyID=\"EUR\">1190.00</cbc:TaxInclusiveAmount>\n    <cbc:PayableAmount currencyID=\"EUR\">1190.00</cbc:PayableAmount>\n  </cac:LegalMonetaryTotal>\n  <cac:InvoiceLine>\n    <cbc:ID>1</cbc:ID>\n    <cbc:InvoicedQuantity unitCode=\"HUR\">10</cbc:InvoicedQuantity>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cac:Item>\n      <cbc:Name>Softwareentwicklung</cbc:Name>\n      <cac:ClassifiedTaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:ClassifiedTaxCategory>\n    </cac:Item>\n    <cac:Price>\n      <cbc:PriceAmount currencyID=\"EUR\">100</cbc:PriceAmount>\n    </cac:Price>\n  </cac:InvoiceLine>\n</Invoice>\n"},"application/pdf":{"schema":{"type":"string","format":"binary","description":"A hybrid PDF, posted raw."}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_validate_document_api_v1_validate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]},{"SessionCookie":[]},{}]}},"/api/v1/detect":{"post":{"tags":["Invoicing"],"summary":"Detect the format of a document","description":"Identify an XML or PDF document without validating it.","operationId":"detect_api_v1_detect_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The document in a JSON wrapper: `xml` for text, `content_base64` for bytes.","properties":{"xml":{"type":"string","description":"The complete XML document."},"content_base64":{"type":"string","description":"XML or a hybrid PDF, base64 encoded."}}},"example":{"xml":"<?xml version='1.0' encoding='UTF-8'?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\">\n  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>\n  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>\n  <cbc:ID>RE-2026-0001</cbc:ID>\n  <cbc:IssueDate>2026-08-20</cbc:IssueDate>\n  <cbc:DueDate>2026-09-19</cbc:DueDate>\n  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>\n  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>\n  <cbc:BuyerReference>04011000-12345-34</cbc:BuyerReference>\n  <cac:AccountingSupplierParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"9930\">DE123456789</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Musterstraße 1</cbc:StreetName>\n        <cbc:CityName>Berlin</cbc:CityName>\n        <cbc:PostalZone>10115</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE123456789</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n      <cac:Contact>\n        <cbc:Name>Buchhaltung</cbc:Name>\n        <cbc:Telephone>+49 30 1234567</cbc:Telephone>\n        <cbc:ElectronicMail>rechnung@muster.de</cbc:ElectronicMail>\n      </cac:Contact>\n    </cac:Party>\n  </cac:AccountingSupplierParty>\n  <cac:AccountingCustomerParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"0204\">04011000-12345-34</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Teststraße 10</cbc:StreetName>\n        <cbc:CityName>Hamburg</cbc:CityName>\n        <cbc:PostalZone>20095</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE987654321</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Beispiel GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n    </cac:Party>\n  </cac:AccountingCustomerParty>\n  <cac:Delivery>\n    <cbc:ActualDeliveryDate>2026-08-18</cbc:ActualDeliveryDate>\n  </cac:Delivery>\n  <cac:PaymentMeans>\n    <cbc:PaymentMeansCode name=\"SEPA credit transfer\">58</cbc:PaymentMeansCode>\n    <cac:PayeeFinancialAccount>\n      <cbc:ID>DE02120300000000202051</cbc:ID>\n    </cac:PayeeFinancialAccount>\n  </cac:PaymentMeans>\n  <cac:PaymentTerms>\n    <cbc:Note>Zahlbar innerhalb von 30 Tagen ohne Abzug.</cbc:Note>\n  </cac:PaymentTerms>\n  <cac:TaxTotal>\n    <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n    <cac:TaxSubtotal>\n      <cbc:TaxableAmount currencyID=\"EUR\">1000.00</cbc:TaxableAmount>\n      <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n      <cac:TaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:TaxCategory>\n    </cac:TaxSubtotal>\n  </cac:TaxTotal>\n  <cac:LegalMonetaryTotal>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cbc:TaxExclusiveAmount currencyID=\"EUR\">1000.00</cbc:TaxExclusiveAmount>\n    <cbc:TaxInclusiveAmount currencyID=\"EUR\">1190.00</cbc:TaxInclusiveAmount>\n    <cbc:PayableAmount currencyID=\"EUR\">1190.00</cbc:PayableAmount>\n  </cac:LegalMonetaryTotal>\n  <cac:InvoiceLine>\n    <cbc:ID>1</cbc:ID>\n    <cbc:InvoicedQuantity unitCode=\"HUR\">10</cbc:InvoicedQuantity>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cac:Item>\n      <cbc:Name>Softwareentwicklung</cbc:Name>\n      <cac:ClassifiedTaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:ClassifiedTaxCategory>\n    </cac:Item>\n    <cac:Price>\n      <cbc:PriceAmount currencyID=\"EUR\">100</cbc:PriceAmount>\n    </cac:Price>\n  </cac:InvoiceLine>\n</Invoice>\n"}},"application/xml":{"schema":{"type":"string","description":"The document, posted raw."},"example":"<?xml version='1.0' encoding='UTF-8'?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\">\n  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>\n  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>\n  <cbc:ID>RE-2026-0001</cbc:ID>\n  <cbc:IssueDate>2026-08-20</cbc:IssueDate>\n  <cbc:DueDate>2026-09-19</cbc:DueDate>\n  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>\n  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>\n  <cbc:BuyerReference>04011000-12345-34</cbc:BuyerReference>\n  <cac:AccountingSupplierParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"9930\">DE123456789</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Musterstraße 1</cbc:StreetName>\n        <cbc:CityName>Berlin</cbc:CityName>\n        <cbc:PostalZone>10115</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE123456789</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n      <cac:Contact>\n        <cbc:Name>Buchhaltung</cbc:Name>\n        <cbc:Telephone>+49 30 1234567</cbc:Telephone>\n        <cbc:ElectronicMail>rechnung@muster.de</cbc:ElectronicMail>\n      </cac:Contact>\n    </cac:Party>\n  </cac:AccountingSupplierParty>\n  <cac:AccountingCustomerParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"0204\">04011000-12345-34</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Teststraße 10</cbc:StreetName>\n        <cbc:CityName>Hamburg</cbc:CityName>\n        <cbc:PostalZone>20095</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE987654321</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Beispiel GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n    </cac:Party>\n  </cac:AccountingCustomerParty>\n  <cac:Delivery>\n    <cbc:ActualDeliveryDate>2026-08-18</cbc:ActualDeliveryDate>\n  </cac:Delivery>\n  <cac:PaymentMeans>\n    <cbc:PaymentMeansCode name=\"SEPA credit transfer\">58</cbc:PaymentMeansCode>\n    <cac:PayeeFinancialAccount>\n      <cbc:ID>DE02120300000000202051</cbc:ID>\n    </cac:PayeeFinancialAccount>\n  </cac:PaymentMeans>\n  <cac:PaymentTerms>\n    <cbc:Note>Zahlbar innerhalb von 30 Tagen ohne Abzug.</cbc:Note>\n  </cac:PaymentTerms>\n  <cac:TaxTotal>\n    <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n    <cac:TaxSubtotal>\n      <cbc:TaxableAmount currencyID=\"EUR\">1000.00</cbc:TaxableAmount>\n      <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n      <cac:TaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:TaxCategory>\n    </cac:TaxSubtotal>\n  </cac:TaxTotal>\n  <cac:LegalMonetaryTotal>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cbc:TaxExclusiveAmount currencyID=\"EUR\">1000.00</cbc:TaxExclusiveAmount>\n    <cbc:TaxInclusiveAmount currencyID=\"EUR\">1190.00</cbc:TaxInclusiveAmount>\n    <cbc:PayableAmount currencyID=\"EUR\">1190.00</cbc:PayableAmount>\n  </cac:LegalMonetaryTotal>\n  <cac:InvoiceLine>\n    <cbc:ID>1</cbc:ID>\n    <cbc:InvoicedQuantity unitCode=\"HUR\">10</cbc:InvoicedQuantity>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cac:Item>\n      <cbc:Name>Softwareentwicklung</cbc:Name>\n      <cac:ClassifiedTaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:ClassifiedTaxCategory>\n    </cac:Item>\n    <cac:Price>\n      <cbc:PriceAmount currencyID=\"EUR\">100</cbc:PriceAmount>\n    </cac:Price>\n  </cac:InvoiceLine>\n</Invoice>\n"},"application/pdf":{"schema":{"type":"string","format":"binary","description":"A hybrid PDF, posted raw."}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_detect_api_v1_detect_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]},{"SessionCookie":[]},{}]}},"/api/v1/convert":{"post":{"tags":["Invoicing"],"summary":"Convert between formats","description":"Convert between canonical JSON, UBL, CII, HTML and PDF.\n\nInformation the target representation cannot express is reported in\n``warnings`` rather than dropped silently.","operationId":"convert_api_v1_convert_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]},{"SessionCookie":[]},{}]}},"/api/v1/render":{"post":{"tags":["Invoicing"],"summary":"Render an invoice as a readable document","description":"Render XML or a canonical invoice as human readable HTML or PDF.\n\nReturns the document itself with the matching content type, not a JSON\nenvelope, so the result can be dropped straight into an iframe or saved.\n\nThe output format comes from the JSON body, the ``output`` form field or the\n``?output=`` query parameter, whichever the caller used.","operationId":"render_api_v1_render_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"One source — `invoice`, `xml` or `content_base64` — and the output you want.","properties":{"invoice":{"$ref":"#/components/schemas/CanonicalInvoice-Input"},"xml":{"type":"string","description":"The document, as XML."},"content_base64":{"type":"string","description":"XML or a hybrid PDF, base64 encoded."},"output":{"type":"string","enum":["html","pdf"],"default":"html"}}},"example":{"invoice":{"invoice_number":"RE-2026-0001","issue_date":"2026-08-20","due_date":"2026-09-19","currency":"EUR","buyer_reference":"04011000-12345-34","seller":{"name":"Muster GmbH","street":"Musterstraße 1","postal_code":"10115","city":"Berlin","country_code":"DE","vat_id":"DE123456789","email":"rechnung@muster.de","phone":"+49 30 1234567"},"buyer":{"name":"Beispiel GmbH","street":"Teststraße 10","postal_code":"20095","city":"Hamburg","country_code":"DE","vat_id":"DE987654321","email":"kreditoren@beispiel.de"},"items":[{"name":"Softwareentwicklung","quantity":10,"unit":"HUR","unit_price":100,"vat_rate":19}],"payment":{"means_code":"58","iban":"DE02120300000000202051","terms":"Zahlbar innerhalb von 30 Tagen ohne Abzug."}},"output":"pdf"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_render_api_v1_render_post"}}}},"responses":{"200":{"description":"The rendered document","content":{"text/html":{"schema":{"type":"string","description":"The invoice as an HTML document."}},"application/pdf":{"schema":{"type":"string","format":"binary","description":"The invoice as a PDF."}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]},{"SessionCookie":[]},{}]}},"/api/v1/parse":{"post":{"tags":["Invoicing"],"summary":"Parse a document into canonical JSON","description":"Read any supported document into the canonical invoice model.","operationId":"parse_api_v1_parse_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The document in a JSON wrapper: `xml` for text, `content_base64` for bytes.","properties":{"xml":{"type":"string","description":"The complete XML document."},"content_base64":{"type":"string","description":"XML or a hybrid PDF, base64 encoded."}}},"example":{"xml":"<?xml version='1.0' encoding='UTF-8'?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\">\n  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>\n  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>\n  <cbc:ID>RE-2026-0001</cbc:ID>\n  <cbc:IssueDate>2026-08-20</cbc:IssueDate>\n  <cbc:DueDate>2026-09-19</cbc:DueDate>\n  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>\n  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>\n  <cbc:BuyerReference>04011000-12345-34</cbc:BuyerReference>\n  <cac:AccountingSupplierParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"9930\">DE123456789</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Musterstraße 1</cbc:StreetName>\n        <cbc:CityName>Berlin</cbc:CityName>\n        <cbc:PostalZone>10115</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE123456789</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n      <cac:Contact>\n        <cbc:Name>Buchhaltung</cbc:Name>\n        <cbc:Telephone>+49 30 1234567</cbc:Telephone>\n        <cbc:ElectronicMail>rechnung@muster.de</cbc:ElectronicMail>\n      </cac:Contact>\n    </cac:Party>\n  </cac:AccountingSupplierParty>\n  <cac:AccountingCustomerParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"0204\">04011000-12345-34</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Teststraße 10</cbc:StreetName>\n        <cbc:CityName>Hamburg</cbc:CityName>\n        <cbc:PostalZone>20095</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE987654321</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Beispiel GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n    </cac:Party>\n  </cac:AccountingCustomerParty>\n  <cac:Delivery>\n    <cbc:ActualDeliveryDate>2026-08-18</cbc:ActualDeliveryDate>\n  </cac:Delivery>\n  <cac:PaymentMeans>\n    <cbc:PaymentMeansCode name=\"SEPA credit transfer\">58</cbc:PaymentMeansCode>\n    <cac:PayeeFinancialAccount>\n      <cbc:ID>DE02120300000000202051</cbc:ID>\n    </cac:PayeeFinancialAccount>\n  </cac:PaymentMeans>\n  <cac:PaymentTerms>\n    <cbc:Note>Zahlbar innerhalb von 30 Tagen ohne Abzug.</cbc:Note>\n  </cac:PaymentTerms>\n  <cac:TaxTotal>\n    <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n    <cac:TaxSubtotal>\n      <cbc:TaxableAmount currencyID=\"EUR\">1000.00</cbc:TaxableAmount>\n      <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n      <cac:TaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:TaxCategory>\n    </cac:TaxSubtotal>\n  </cac:TaxTotal>\n  <cac:LegalMonetaryTotal>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cbc:TaxExclusiveAmount currencyID=\"EUR\">1000.00</cbc:TaxExclusiveAmount>\n    <cbc:TaxInclusiveAmount currencyID=\"EUR\">1190.00</cbc:TaxInclusiveAmount>\n    <cbc:PayableAmount currencyID=\"EUR\">1190.00</cbc:PayableAmount>\n  </cac:LegalMonetaryTotal>\n  <cac:InvoiceLine>\n    <cbc:ID>1</cbc:ID>\n    <cbc:InvoicedQuantity unitCode=\"HUR\">10</cbc:InvoicedQuantity>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cac:Item>\n      <cbc:Name>Softwareentwicklung</cbc:Name>\n      <cac:ClassifiedTaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:ClassifiedTaxCategory>\n    </cac:Item>\n    <cac:Price>\n      <cbc:PriceAmount currencyID=\"EUR\">100</cbc:PriceAmount>\n    </cac:Price>\n  </cac:InvoiceLine>\n</Invoice>\n"}},"application/xml":{"schema":{"type":"string","description":"The document, posted raw."},"example":"<?xml version='1.0' encoding='UTF-8'?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\">\n  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>\n  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>\n  <cbc:ID>RE-2026-0001</cbc:ID>\n  <cbc:IssueDate>2026-08-20</cbc:IssueDate>\n  <cbc:DueDate>2026-09-19</cbc:DueDate>\n  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>\n  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>\n  <cbc:BuyerReference>04011000-12345-34</cbc:BuyerReference>\n  <cac:AccountingSupplierParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"9930\">DE123456789</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Musterstraße 1</cbc:StreetName>\n        <cbc:CityName>Berlin</cbc:CityName>\n        <cbc:PostalZone>10115</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE123456789</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n      <cac:Contact>\n        <cbc:Name>Buchhaltung</cbc:Name>\n        <cbc:Telephone>+49 30 1234567</cbc:Telephone>\n        <cbc:ElectronicMail>rechnung@muster.de</cbc:ElectronicMail>\n      </cac:Contact>\n    </cac:Party>\n  </cac:AccountingSupplierParty>\n  <cac:AccountingCustomerParty>\n    <cac:Party>\n      <cbc:EndpointID schemeID=\"0204\">04011000-12345-34</cbc:EndpointID>\n      <cac:PostalAddress>\n        <cbc:StreetName>Teststraße 10</cbc:StreetName>\n        <cbc:CityName>Hamburg</cbc:CityName>\n        <cbc:PostalZone>20095</cbc:PostalZone>\n        <cac:Country>\n          <cbc:IdentificationCode>DE</cbc:IdentificationCode>\n        </cac:Country>\n      </cac:PostalAddress>\n      <cac:PartyTaxScheme>\n        <cbc:CompanyID>DE987654321</cbc:CompanyID>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:PartyTaxScheme>\n      <cac:PartyLegalEntity>\n        <cbc:RegistrationName>Beispiel GmbH</cbc:RegistrationName>\n      </cac:PartyLegalEntity>\n    </cac:Party>\n  </cac:AccountingCustomerParty>\n  <cac:Delivery>\n    <cbc:ActualDeliveryDate>2026-08-18</cbc:ActualDeliveryDate>\n  </cac:Delivery>\n  <cac:PaymentMeans>\n    <cbc:PaymentMeansCode name=\"SEPA credit transfer\">58</cbc:PaymentMeansCode>\n    <cac:PayeeFinancialAccount>\n      <cbc:ID>DE02120300000000202051</cbc:ID>\n    </cac:PayeeFinancialAccount>\n  </cac:PaymentMeans>\n  <cac:PaymentTerms>\n    <cbc:Note>Zahlbar innerhalb von 30 Tagen ohne Abzug.</cbc:Note>\n  </cac:PaymentTerms>\n  <cac:TaxTotal>\n    <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n    <cac:TaxSubtotal>\n      <cbc:TaxableAmount currencyID=\"EUR\">1000.00</cbc:TaxableAmount>\n      <cbc:TaxAmount currencyID=\"EUR\">190.00</cbc:TaxAmount>\n      <cac:TaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:TaxCategory>\n    </cac:TaxSubtotal>\n  </cac:TaxTotal>\n  <cac:LegalMonetaryTotal>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cbc:TaxExclusiveAmount currencyID=\"EUR\">1000.00</cbc:TaxExclusiveAmount>\n    <cbc:TaxInclusiveAmount currencyID=\"EUR\">1190.00</cbc:TaxInclusiveAmount>\n    <cbc:PayableAmount currencyID=\"EUR\">1190.00</cbc:PayableAmount>\n  </cac:LegalMonetaryTotal>\n  <cac:InvoiceLine>\n    <cbc:ID>1</cbc:ID>\n    <cbc:InvoicedQuantity unitCode=\"HUR\">10</cbc:InvoicedQuantity>\n    <cbc:LineExtensionAmount currencyID=\"EUR\">1000.00</cbc:LineExtensionAmount>\n    <cac:Item>\n      <cbc:Name>Softwareentwicklung</cbc:Name>\n      <cac:ClassifiedTaxCategory>\n        <cbc:ID>S</cbc:ID>\n        <cbc:Percent>19.00</cbc:Percent>\n        <cac:TaxScheme>\n          <cbc:ID>VAT</cbc:ID>\n        </cac:TaxScheme>\n      </cac:ClassifiedTaxCategory>\n    </cac:Item>\n    <cac:Price>\n      <cbc:PriceAmount currencyID=\"EUR\">100</cbc:PriceAmount>\n    </cac:Price>\n  </cac:InvoiceLine>\n</Invoice>\n"},"application/pdf":{"schema":{"type":"string","format":"binary","description":"A hybrid PDF, posted raw."}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_parse_api_v1_parse_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]},{"SessionCookie":[]},{}]}},"/api/v1/calculate":{"post":{"tags":["Invoicing"],"summary":"Calculate totals and VAT","description":"Run the VAT engine without producing a document.\n\nThe backend is the single source of truth for invoice money; this endpoint\nexposes it so a client never has to reimplement the arithmetic.","operationId":"calculate_api_v1_calculate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculateResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"400":{"description":"Malformed or unsupported request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"415":{"description":"Unsupported media type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"The document could not be processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"503":{"description":"The validation engine is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]},{"SessionCookie":[]},{}]}},"/api/v1/auth/signup":{"post":{"tags":["Account"],"summary":"Create an account","description":"Create the user, their organization and an owner membership, then sign in.","operationId":"sign_up_api_v1_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignUpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/einvoice__api__v1__account_routes__SessionView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Account"],"summary":"Sign in","operationId":"log_in_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogInRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/einvoice__api__v1__account_routes__SessionView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["Account"],"summary":"Sign out","operationId":"log_out_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Log Out Api V1 Auth Logout Post"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/account/sessions":{"get":{"tags":["Account"],"summary":"Where you are signed in","operationId":"list_sessions_api_v1_account_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionSummaryView"},"type":"array","title":"Response List Sessions Api V1 Account Sessions Get"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/account/sessions/{session_id}":{"delete":{"tags":["Account"],"summary":"End one session","operationId":"end_session_api_v1_account_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"204":{"description":"Successful Response","headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/account/sessions/revoke-others":{"post":{"tags":["Account"],"summary":"Sign out everywhere else","description":"Keeps the browser making the request signed in and ends the rest.","operationId":"revoke_other_sessions_api_v1_account_sessions_revoke_others_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"integer"},"type":"object","title":"Response Revoke Other Sessions Api V1 Account Sessions Revoke Others Post"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/auth/session/organization":{"post":{"tags":["Account"],"summary":"Switch the active organization","description":"Point this session at another organization the same user belongs to.\n\nWithout it, somebody in two organizations can only ever see the first one —\nthe session picks one at sign-in and nothing can move it.","operationId":"switch_organization_api_v1_auth_session_organization_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchOrganizationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/einvoice__api__v1__account_routes__SessionView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/auth/session":{"get":{"tags":["Account"],"summary":"Current session","description":"Who is signed in, or ``null``. Used by the dashboard to gate its routes.","operationId":"current_session_api_v1_auth_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/einvoice__api__v1__account_routes__SessionView"},{"type":"null"}],"title":"Response Current Session Api V1 Auth Session Get"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/account/password":{"post":{"tags":["Account"],"summary":"Change your password","description":"Requires the current password even though a session is already proven — a session can be stolen, the password is what identifies the owner. Every other session is ended; the one making the request survives.","operationId":"change_password_api_v1_account_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/account/delete":{"post":{"tags":["Account"],"summary":"Delete your account and its data","description":"Erases the account, its sessions and every organization it alone owns — API keys, usage history and audit trail included. There is no undo and no soft delete. Refused with 409 while the account still owns an organization that has other members.\n\nA POST rather than a DELETE: this needs a body — the password and a typed confirmation — and a DELETE carrying one is unevenly supported by HTTP clients and proxies.","operationId":"delete_account_api_v1_account_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response","headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/account":{"patch":{"tags":["Account"],"summary":"Update your account","operationId":"update_account_api_v1_account_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}":{"get":{"tags":["Account"],"summary":"One organization","operationId":"get_organization_api_v1_organizations__organization_id__get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]},"patch":{"tags":["Account"],"summary":"Rename an organization","operationId":"update_organization_api_v1_organizations__organization_id__patch","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrganizationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/members":{"get":{"tags":["Account"],"summary":"Organization members","operationId":"list_members_api_v1_organizations__organization_id__members_get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberView"},"title":"Response List Members Api V1 Organizations  Organization Id  Members Get"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/api-keys":{"get":{"tags":["Account"],"summary":"List API keys","operationId":"list_api_keys_api_v1_organizations__organization_id__api_keys_get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyView"},"title":"Response List Api Keys Api V1 Organizations  Organization Id  Api Keys Get"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]},"post":{"tags":["Account"],"summary":"Create an API key","description":"Mint a key and return it once.\n\nThe plaintext appears in this response and nowhere else — not in the\ndatabase, not in the log, not in any later listing.","operationId":"create_api_key_api_v1_organizations__organization_id__api_keys_post","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKeyView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/api-keys/{key_id}":{"delete":{"tags":["Account"],"summary":"Revoke an API key","operationId":"revoke_api_key_api_v1_organizations__organization_id__api_keys__key_id__delete","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/api-keys/{key_id}/record":{"delete":{"tags":["Account"],"summary":"Remove a revoked API key from the list","description":"Deletes the record of a key that has already been revoked, so it stops appearing in the dashboard. Revoking is what stops a key working; this only tidies the list afterwards. An active key is refused with 409 — revoke it first. The audit trail keeps the record that the key existed.","operationId":"delete_api_key_api_v1_organizations__organization_id__api_keys__key_id__record_delete","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response","headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/usage":{"get":{"tags":["Account"],"summary":"Usage for an organization","operationId":"get_usage_api_v1_organizations__organization_id__usage_get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummaryView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/usage/events":{"get":{"tags":["Account"],"summary":"Request history, newest first","operationId":"get_usage_events_api_v1_organizations__organization_id__usage_events_get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"operation","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation"}},{"name":"api_key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}},{"name":"request_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsagePageView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/activity":{"get":{"tags":["Account"],"summary":"Audit events, newest first","operationId":"get_activity_api_v1_organizations__organization_id__activity_get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditPageView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/billing":{"get":{"tags":["Account"],"summary":"The current subscription","operationId":"current_subscription_api_v1_billing_get","parameters":[{"name":"organization_id","in":"query","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/billing/checkout":{"post":{"tags":["Account"],"summary":"Start a subscription","description":"A Stripe-hosted checkout page for one plan.\n\nNothing about the organization's entitlement is written here. The plan moves\nwhen the webhook says the subscription exists — see the module docstring.","operationId":"create_checkout_api_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/einvoice__api__v1__billing_routes__SessionView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/billing/portal":{"post":{"tags":["Account"],"summary":"Manage the subscription","description":"The Stripe customer portal: payment method, invoices, plan, cancellation.\n\nBuilt rather than reimplemented. Everything in it — proration on an upgrade,\nthe invoice PDFs, cancelling at period end — is work Stripe has already done\ncorrectly, and a home-made version of it is a year of edge cases.","operationId":"create_portal_api_v1_billing_portal_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/einvoice__api__v1__billing_routes__SessionView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/contact":{"post":{"tags":["Service"],"summary":"Send a contact enquiry","operationId":"contact_api_v1_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/oauth/authorization-request":{"get":{"tags":["Account"],"summary":"Describe a pending authorization","operationId":"describe_authorization_api_v1_oauth_authorization_request_get","parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizationRequestView"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/oauth/approve":{"post":{"tags":["Account"],"summary":"Approve a pending authorization","description":"Issue the code and hand back the URL the browser should go to.\n\nThe redirect is built here rather than in the page so the code never has to\nbe handled by JavaScript that could log it.","operationId":"approve_authorization_api_v1_oauth_approve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Approve Authorization Api V1 Oauth Approve Post"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/connections":{"get":{"tags":["Account"],"summary":"Programs connected through the browser flow","operationId":"list_connections_api_v1_organizations__organization_id__connections_get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectionView"},"title":"Response List Connections Api V1 Organizations  Organization Id  Connections Get"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/organizations/{organization_id}/connections/{connection_id}":{"delete":{"tags":["Account"],"summary":"Disconnect a program","operationId":"revoke_connection_api_v1_organizations__organization_id__connections__connection_id__delete","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"204":{"description":"Successful Response","headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/auth/password-reset":{"post":{"tags":["Account"],"summary":"Request a password reset link","description":"Always answers the same way, whether or not an account exists for the address. The mail is sent after the response, so the timing does not differ either.","operationId":"request_password_reset_api_v1_auth_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeutralResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/auth/password-reset/confirm":{"post":{"tags":["Account"],"summary":"Set a new password with a reset link","operationId":"confirm_password_reset_api_v1_auth_password_reset_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeutralResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/account/email":{"post":{"tags":["Account"],"summary":"Request an e-mail address change","description":"Requires the current password. The new address gets a confirmation link and the old one gets a warning — so a change made from a stolen session is visible to the real owner before it takes effect. Nothing changes until the link is used.","operationId":"request_email_change_api_v1_account_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChange"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeutralResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"401":{"description":"Missing, malformed, revoked or unknown credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}},"429":{"description":"Rate limit exceeded; see the `Retry-After` header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in it.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Length of the window in seconds. The limiter counts over a rolling window, so there is no single moment the count returns to zero.","schema":{"type":"integer"}}}}},"security":[{"SessionCookie":[]}]}},"/api/v1/auth/verify-email":{"post":{"tags":["Account"],"summary":"Confirm the address an account was opened with","description":"Redeem the link from the welcome mail.\n\nPublic: the point is that somebody holding the mailbox can act, and\nrequiring a session first would lock out anybody who opened the link on\ntheir phone.","operationId":"verify_email_api_v1_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmail"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifiedResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/auth/verify-email/resend":{"post":{"tags":["Account"],"summary":"Send the confirmation link again","description":"A fresh link for the signed-in account, if it still needs one.\n\nAnswers the same either way. An account that is already confirmed and one\nthat is not are not worth telling apart from outside, and the throttle is\nthe same for both — otherwise this is a way to hammer somebody's inbox.","operationId":"resend_verification_api_v1_auth_verify_email_resend_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeutralResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}},"/api/v1/account/email/confirm":{"post":{"tags":["Account"],"summary":"Confirm a new e-mail address","operationId":"confirm_email_change_api_v1_account_email_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeutralResponse"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-Request-ID":{"description":"Correlation id for this request.","schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Address":{"properties":{"street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street","description":"BT-35 — address line 1"},"additional_street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Street","description":"BT-36 — address line 2"},"address_line3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line3","description":"BT-162 — address line 3"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"BT-37 — city"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code","description":"BT-38 — post code"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"BT-39 — country subdivision"},"country_code":{"type":"string","title":"Country Code","description":"BT-40 — ISO 3166-1 alpha-2 country code","default":"DE"}},"additionalProperties":false,"type":"object","title":"Address","description":"Postal address (BG-5 seller / BG-8 buyer)."},"AllowanceCharge-Input":{"properties":{"is_charge":{"type":"boolean","title":"Is Charge","description":"True for a charge (BG-21), false for an allowance (BG-20)","default":false},"amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount","description":"BT-92 / BT-99 — allowance or charge amount"},"base_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Base Amount","description":"BT-93 / BT-100 — base amount"},"percentage":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Percentage","description":"BT-94 / BT-101 — percentage"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"BT-97 / BT-104 — reason text"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code","description":"BT-98 / BT-105 — reason code"},"vat_category":{"$ref":"#/components/schemas/VatCategory","description":"BT-95 / BT-102 — VAT category code","default":"S"},"vat_rate":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Vat Rate","description":"BT-96 / BT-103 — VAT rate","default":"0"}},"additionalProperties":false,"type":"object","required":["amount"],"title":"AllowanceCharge","description":"A document level allowance (BG-20) or charge (BG-21)."},"AllowanceCharge-Output":{"properties":{"is_charge":{"type":"boolean","title":"Is Charge","description":"True for a charge (BG-21), false for an allowance (BG-20)","default":false},"amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount","description":"BT-92 / BT-99 — allowance or charge amount"},"base_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Base Amount","description":"BT-93 / BT-100 — base amount"},"percentage":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Percentage","description":"BT-94 / BT-101 — percentage"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"BT-97 / BT-104 — reason text"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code","description":"BT-98 / BT-105 — reason code"},"vat_category":{"$ref":"#/components/schemas/VatCategory","description":"BT-95 / BT-102 — VAT category code","default":"S"},"vat_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Vat Rate","description":"BT-96 / BT-103 — VAT rate","default":"0"}},"additionalProperties":false,"type":"object","required":["amount"],"title":"AllowanceCharge","description":"A document level allowance (BG-20) or charge (BG-21)."},"ApiKeyView":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"last_four":{"type":"string","title":"Last Four"},"masked":{"type":"string","title":"Masked"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"active":{"type":"boolean","title":"Active"}},"type":"object","required":["id","name","prefix","last_four","masked","created_at","last_used_at","revoked_at","active"],"title":"ApiKeyView","description":"A stored key. Never carries the secret — that is shown once, on creation."},"ApproveRequest":{"properties":{"client_id":{"type":"string","title":"Client Id"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"code_challenge":{"type":"string","title":"Code Challenge"},"code_challenge_method":{"type":"string","title":"Code Challenge Method","default":"S256"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"},"organization_id":{"type":"string","title":"Organization Id"}},"type":"object","required":["client_id","redirect_uri","code_challenge","organization_id"],"title":"ApproveRequest"},"AuditPageView":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AuditView"},"type":"array","title":"Items"},"next_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Before"}},"type":"object","required":["items","next_before"],"title":"AuditPageView","description":"One page of the audit trail.\n\nSame cursor shape as the request history, so a client that can page one can\npage the other."},"AuditView":{"properties":{"id":{"type":"string","title":"Id"},"action":{"type":"string","title":"Action"},"actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"},"actor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Name"},"detail":{"additionalProperties":{"type":"string"},"type":"object","title":"Detail"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","action","actor_id","detail","created_at"],"title":"AuditView"},"AuthorizationRequestView":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_name":{"type":"string","title":"Client Name"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"scope":{"type":"string","title":"Scope"}},"type":"object","required":["client_id","client_name","redirect_uri","scope"],"title":"AuthorizationRequestView","description":"What the consent page needs to describe the decision being made."},"Body_detect_api_v1_detect_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_detect_api_v1_detect_post"},"Body_parse_api_v1_parse_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_parse_api_v1_parse_post"},"Body_render_api_v1_render_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"output":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output","description":"html or pdf"}},"type":"object","title":"Body_render_api_v1_render_post"},"Body_validate_document_api_v1_validate_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File","description":"XML or hybrid PDF upload"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},"type":"object","title":"Body_validate_document_api_v1_validate_post"},"CalculateRequest":{"properties":{"invoice":{"$ref":"#/components/schemas/CanonicalInvoice-Input"}},"additionalProperties":false,"type":"object","required":["invoice"],"title":"CalculateRequest","example":{"invoice":{"buyer":{"city":"Hamburg","country_code":"DE","email":"kreditoren@beispiel.de","name":"Beispiel GmbH","postal_code":"20095","street":"Teststraße 10","vat_id":"DE987654321"},"buyer_reference":"04011000-12345-34","currency":"EUR","due_date":"2026-09-19","invoice_number":"RE-2026-0001","issue_date":"2026-08-20","items":[{"name":"Softwareentwicklung","quantity":10,"unit":"HUR","unit_price":100,"vat_rate":19}],"payment":{"iban":"DE02120300000000202051","means_code":"58","terms":"Zahlbar innerhalb von 30 Tagen ohne Abzug."},"seller":{"city":"Berlin","country_code":"DE","email":"rechnung@muster.de","name":"Muster GmbH","phone":"+49 30 1234567","postal_code":"10115","street":"Musterstraße 1","vat_id":"DE123456789"}}}},"CalculateResponse":{"properties":{"totals":{"$ref":"#/components/schemas/TotalsSummary"},"breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Breakdown","description":"VAT breakdown per category and rate (BG-23)"},"line_amounts":{"additionalProperties":{"type":"string"},"type":"object","title":"Line Amounts","description":"Computed net amount per line (BT-131)"},"warnings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Warnings"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["totals","breakdown","line_amounts"],"title":"CalculateResponse"},"CanonicalInvoice-Input":{"properties":{"invoice_number":{"type":"string","minLength":1,"title":"Invoice Number","description":"BT-1 — invoice number"},"type":{"$ref":"#/components/schemas/DocumentType","description":"Invoice or credit note","default":"invoice"},"invoice_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Type Code","description":"BT-3 — UNTDID 1001 document type code. Derived from `type` when omitted."},"issue_date":{"type":"string","format":"date","title":"Issue Date","description":"BT-2 — invoice issue date"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date","description":"BT-9 — payment due date"},"tax_point_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Tax Point Date","description":"BT-7 — value added tax point date"},"currency":{"type":"string","title":"Currency","description":"BT-5 — invoice currency code","default":"EUR"},"tax_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Currency","description":"BT-6 — VAT accounting currency code"},"buyer_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Reference","description":"BT-10 — buyer reference (the Leitweg-ID for German public buyers). XRechnung requires it (BR-DE-15); if omitted, generation falls back to the invoice number and reports a warning. Pass the Leitweg-ID explicitly for public-sector buyers."},"purchase_order_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purchase Order Reference","description":"BT-13 — purchase order reference"},"sales_order_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sales Order Reference","description":"BT-14 — sales order reference"},"contract_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Reference","description":"BT-12 — contract reference"},"project_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Reference","description":"BT-11 — project reference"},"despatch_advice_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Despatch Advice Reference","description":"BT-16 — despatch advice reference"},"receiving_advice_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receiving Advice Reference","description":"BT-15 — receiving advice reference"},"accounting_cost":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accounting Cost","description":"BT-19 — buyer accounting reference"},"preceding_invoice_references":{"items":{"$ref":"#/components/schemas/DocumentReference"},"type":"array","maxItems":1000,"title":"Preceding Invoice References","description":"BG-3 — preceding invoice references (required for credit notes)"},"additional_document_references":{"items":{"$ref":"#/components/schemas/DocumentReference"},"type":"array","maxItems":1000,"title":"Additional Document References","description":"BG-24 — additional supporting documents"},"invoice_period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Period Start","description":"BT-73 — invoicing period start"},"invoice_period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Period End","description":"BT-74 — invoicing period end"},"seller":{"$ref":"#/components/schemas/Party","description":"BG-4 — seller"},"buyer":{"$ref":"#/components/schemas/Party","description":"BG-7 — buyer"},"payee":{"anyOf":[{"$ref":"#/components/schemas/Party"},{"type":"null"}],"description":"BG-10 — payee"},"tax_representative":{"anyOf":[{"$ref":"#/components/schemas/Party"},{"type":"null"}],"description":"BG-11 — seller tax representative"},"delivery":{"anyOf":[{"$ref":"#/components/schemas/Delivery"},{"type":"null"}],"description":"BG-13 — delivery information"},"line_items":{"items":{"$ref":"#/components/schemas/LineItem-Input"},"type":"array","maxItems":5000,"title":"Line Items","description":"BG-25 — invoice lines"},"allowances":{"items":{"$ref":"#/components/schemas/AllowanceCharge-Input"},"type":"array","maxItems":1000,"title":"Allowances","description":"BG-20 — document level allowances"},"charges":{"items":{"$ref":"#/components/schemas/AllowanceCharge-Input"},"type":"array","maxItems":1000,"title":"Charges","description":"BG-21 — document level charges"},"payment":{"$ref":"#/components/schemas/Payment","description":"BG-16 — payment instructions"},"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","maxItems":200,"title":"Notes","description":"BG-1 — invoice notes"},"taxes":{"items":{"$ref":"#/components/schemas/TaxBreakdownEntry-Input"},"type":"array","maxItems":1000,"title":"Taxes","description":"BG-23 — VAT breakdown. Recomputed by the VAT engine unless the document was parsed from XML."},"totals":{"$ref":"#/components/schemas/Totals-Input","description":"BG-22 — document totals. Recomputed by the VAT engine."},"prepaid_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Prepaid Amount","description":"BT-113 — amount already paid"},"rounding_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Rounding Amount","description":"BT-114 — rounding amount"}},"additionalProperties":false,"type":"object","required":["invoice_number","issue_date","seller","buyer"],"title":"CanonicalInvoice","description":"A complete, format-neutral electronic invoice.\n\nAlongside the canonical field names shown here, a compact shorthand is\naccepted on input: ``items`` (or ``lines``) for ``line_items``; ``unit``,\n``price`` and ``vat`` on a line for ``unit_code``, ``unit_price`` and\n``vat_rate``; and flat address keys (``street``, ``city``, ``postal_code``,\n``country_code`` …) on a party, lifted into its ``address``. camelCase keys\nwork too. Unknown keys are rejected, so a typo fails loudly."},"CanonicalInvoice-Output":{"properties":{"invoice_number":{"type":"string","minLength":1,"title":"Invoice Number","description":"BT-1 — invoice number"},"type":{"$ref":"#/components/schemas/DocumentType","description":"Invoice or credit note","default":"invoice"},"invoice_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Type Code","description":"BT-3 — UNTDID 1001 document type code. Derived from `type` when omitted."},"issue_date":{"type":"string","format":"date","title":"Issue Date","description":"BT-2 — invoice issue date"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date","description":"BT-9 — payment due date"},"tax_point_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Tax Point Date","description":"BT-7 — value added tax point date"},"currency":{"type":"string","title":"Currency","description":"BT-5 — invoice currency code","default":"EUR"},"tax_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Currency","description":"BT-6 — VAT accounting currency code"},"buyer_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Reference","description":"BT-10 — buyer reference (the Leitweg-ID for German public buyers). XRechnung requires it (BR-DE-15); if omitted, generation falls back to the invoice number and reports a warning. Pass the Leitweg-ID explicitly for public-sector buyers."},"purchase_order_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purchase Order Reference","description":"BT-13 — purchase order reference"},"sales_order_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sales Order Reference","description":"BT-14 — sales order reference"},"contract_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Reference","description":"BT-12 — contract reference"},"project_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Reference","description":"BT-11 — project reference"},"despatch_advice_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Despatch Advice Reference","description":"BT-16 — despatch advice reference"},"receiving_advice_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receiving Advice Reference","description":"BT-15 — receiving advice reference"},"accounting_cost":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accounting Cost","description":"BT-19 — buyer accounting reference"},"preceding_invoice_references":{"items":{"$ref":"#/components/schemas/DocumentReference"},"type":"array","maxItems":1000,"title":"Preceding Invoice References","description":"BG-3 — preceding invoice references (required for credit notes)"},"additional_document_references":{"items":{"$ref":"#/components/schemas/DocumentReference"},"type":"array","maxItems":1000,"title":"Additional Document References","description":"BG-24 — additional supporting documents"},"invoice_period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Period Start","description":"BT-73 — invoicing period start"},"invoice_period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Invoice Period End","description":"BT-74 — invoicing period end"},"seller":{"$ref":"#/components/schemas/Party","description":"BG-4 — seller"},"buyer":{"$ref":"#/components/schemas/Party","description":"BG-7 — buyer"},"payee":{"anyOf":[{"$ref":"#/components/schemas/Party"},{"type":"null"}],"description":"BG-10 — payee"},"tax_representative":{"anyOf":[{"$ref":"#/components/schemas/Party"},{"type":"null"}],"description":"BG-11 — seller tax representative"},"delivery":{"anyOf":[{"$ref":"#/components/schemas/Delivery"},{"type":"null"}],"description":"BG-13 — delivery information"},"line_items":{"items":{"$ref":"#/components/schemas/LineItem-Output"},"type":"array","maxItems":5000,"title":"Line Items","description":"BG-25 — invoice lines"},"allowances":{"items":{"$ref":"#/components/schemas/AllowanceCharge-Output"},"type":"array","maxItems":1000,"title":"Allowances","description":"BG-20 — document level allowances"},"charges":{"items":{"$ref":"#/components/schemas/AllowanceCharge-Output"},"type":"array","maxItems":1000,"title":"Charges","description":"BG-21 — document level charges"},"payment":{"$ref":"#/components/schemas/Payment","description":"BG-16 — payment instructions"},"notes":{"items":{"$ref":"#/components/schemas/Note"},"type":"array","maxItems":200,"title":"Notes","description":"BG-1 — invoice notes"},"taxes":{"items":{"$ref":"#/components/schemas/TaxBreakdownEntry-Output"},"type":"array","maxItems":1000,"title":"Taxes","description":"BG-23 — VAT breakdown. Recomputed by the VAT engine unless the document was parsed from XML."},"totals":{"$ref":"#/components/schemas/Totals-Output","description":"BG-22 — document totals. Recomputed by the VAT engine."},"prepaid_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Prepaid Amount","description":"BT-113 — amount already paid"},"rounding_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Rounding Amount","description":"BT-114 — rounding amount"}},"additionalProperties":false,"type":"object","required":["invoice_number","issue_date","seller","buyer"],"title":"CanonicalInvoice","description":"A complete, format-neutral electronic invoice.\n\nAlongside the canonical field names shown here, a compact shorthand is\naccepted on input: ``items`` (or ``lines``) for ``line_items``; ``unit``,\n``price`` and ``vat`` on a line for ``unit_code``, ``unit_price`` and\n``vat_rate``; and flat address keys (``street``, ``city``, ``postal_code``,\n``country_code`` …) on a party, lifted into its ``address``. camelCase keys\nwork too. Unknown keys are rejected, so a typo fails loudly."},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password","description":"Proves the person at the keyboard owns the account, not just the session"},"new_password":{"type":"string","minLength":1,"title":"New Password"}},"additionalProperties":false,"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ChangePasswordResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"sessions_ended":{"type":"integer","title":"Sessions Ended"}},"type":"object","required":["success","sessions_ended"],"title":"ChangePasswordResponse"},"CheckoutRequest":{"properties":{"organization_id":{"type":"string","title":"Organization Id"},"plan":{"$ref":"#/components/schemas/PlanId"}},"additionalProperties":false,"type":"object","required":["organization_id","plan"],"title":"CheckoutRequest"},"ConnectionView":{"properties":{"id":{"type":"string","title":"Id"},"client_name":{"type":"string","title":"Client Name"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","client_name","created_at","last_used_at"],"title":"ConnectionView"},"Contact":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"BT-41 / BT-56 — contact point"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"BT-42 / BT-57 — telephone number"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"BT-43 / BT-58 — e-mail address"}},"additionalProperties":false,"type":"object","title":"Contact","description":"Contact point (BG-6 seller contact / BG-9 buyer contact)."},"ContactRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"company":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Company"},"plan":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Plan"},"message":{"type":"string","maxLength":5000,"minLength":10,"title":"Message"},"privacy_consent":{"type":"boolean","title":"Privacy Consent","default":false},"website":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Website"}},"additionalProperties":false,"type":"object","required":["name","email","message"],"title":"ContactRequest"},"ContactResponse":{"properties":{"sent":{"type":"boolean","title":"Sent"},"message":{"type":"string","title":"Message"}},"type":"object","required":["sent","message"],"title":"ContactResponse"},"ConvertRequest":{"properties":{"invoice":{"anyOf":[{"$ref":"#/components/schemas/CanonicalInvoice-Input"},{"type":"null"}]},"xml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Xml"},"content_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Base64"},"target":{"type":"string","enum":["json","xml","html","pdf"],"title":"Target","description":"What to produce","default":"xml"},"format":{"anyOf":[{"$ref":"#/components/schemas/FormatId"},{"type":"null"}],"description":"Target business standard for XML and PDF output"},"syntax":{"anyOf":[{"$ref":"#/components/schemas/SyntaxKind"},{"type":"null"}]},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"}},"additionalProperties":false,"type":"object","title":"ConvertRequest","description":"Convert between any two supported representations.\n\nSupply exactly one source: ``invoice`` (canonical JSON), ``xml``, or\n``content_base64`` (XML or a hybrid PDF).","example":{"format":"zugferd","invoice":{"buyer":{"city":"Hamburg","country_code":"DE","email":"kreditoren@beispiel.de","name":"Beispiel GmbH","postal_code":"20095","street":"Teststraße 10","vat_id":"DE987654321"},"buyer_reference":"04011000-12345-34","currency":"EUR","due_date":"2026-09-19","invoice_number":"RE-2026-0001","issue_date":"2026-08-20","items":[{"name":"Softwareentwicklung","quantity":10,"unit":"HUR","unit_price":100,"vat_rate":19}],"payment":{"iban":"DE02120300000000202051","means_code":"58","terms":"Zahlbar innerhalb von 30 Tagen ohne Abzug."},"seller":{"city":"Berlin","country_code":"DE","email":"rechnung@muster.de","name":"Muster GmbH","phone":"+49 30 1234567","postal_code":"10115","street":"Musterstraße 1","vat_id":"DE123456789"}},"target":"xml"}},"ConvertResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"source":{"anyOf":[{"$ref":"#/components/schemas/DetectResponse"},{"type":"null"}],"description":"What the input was detected as"},"target":{"type":"string","title":"Target"},"format":{"anyOf":[{"$ref":"#/components/schemas/FormatId"},{"type":"null"}]},"syntax":{"anyOf":[{"$ref":"#/components/schemas/SyntaxKind"},{"type":"null"}]},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"},"invoice":{"anyOf":[{"$ref":"#/components/schemas/CanonicalInvoice-Output"},{"type":"null"}],"description":"Present when the target is 'json'"},"document":{"anyOf":[{"$ref":"#/components/schemas/DocumentPayload"},{"type":"null"}]},"totals":{"anyOf":[{"$ref":"#/components/schemas/TotalsSummary"},{"type":"null"}]},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"Semantic information that could not be carried across"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["success","target"],"title":"ConvertResponse"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"}},"additionalProperties":false,"type":"object","required":["name"],"title":"CreateApiKeyRequest"},"CreatedApiKeyView":{"properties":{"key":{"$ref":"#/components/schemas/ApiKeyView"},"plaintext":{"type":"string","title":"Plaintext"},"warning":{"type":"string","title":"Warning","default":"Kopieren Sie den Schlüssel jetzt — er wird nur als Hash gespeichert und kann nicht erneut angezeigt werden."}},"type":"object","required":["key","plaintext"],"title":"CreatedApiKeyView"},"DailyPointView":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"},"failed":{"type":"integer","title":"Failed","default":0},"generations":{"type":"integer","title":"Generations","default":0},"validations":{"type":"integer","title":"Validations","default":0}},"type":"object","required":["date","count"],"title":"DailyPointView","description":"One day of the chart.\n\n``failed`` is separate rather than subtracted, so a bar can show both what\nran and what was refused. A spike of rejections is invisible in a total.\n\nThe two allowances are broken out per day as well, because \"how fast am I\nspending it\" is a different question from \"how many calls did I make\" —\nand with most operations free, the second one no longer answers the first."},"DeleteAccountRequest":{"properties":{"current_password":{"type":"string","minLength":1,"title":"Current Password"},"confirm":{"type":"string","minLength":1,"title":"Confirm"}},"additionalProperties":false,"type":"object","required":["current_password","confirm"],"title":"DeleteAccountRequest"},"Delivery":{"properties":{"delivery_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Date","description":"BT-72 — actual delivery date"},"party_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Party Name","description":"BT-70 — deliver to party name"},"location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id","description":"BT-71 — deliver to location identifier"},"location_id_scheme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id Scheme","description":"BT-71-1 — scheme identifier"},"address":{"anyOf":[{"$ref":"#/components/schemas/Address"},{"type":"null"}],"description":"BG-15 — deliver to address"}},"additionalProperties":false,"type":"object","title":"Delivery","description":"Delivery information (BG-13)."},"DetectResponse":{"properties":{"format":{"$ref":"#/components/schemas/FormatId"},"syntax":{"anyOf":[{"$ref":"#/components/schemas/SyntaxKind"},{"type":"null"}]},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"document_type":{"anyOf":[{"$ref":"#/components/schemas/DocumentType"},{"type":"null"}]},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"},"container":{"type":"string","title":"Container","description":"'xml' or 'pdf'"},"embedded_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embedded Filename"},"evidence":{"items":{"type":"string"},"type":"array","title":"Evidence","description":"Why the detector reached this conclusion"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["format","syntax","version","confidence","container"],"title":"DetectResponse"},"DocumentPayload":{"properties":{"mime_type":{"type":"string","title":"Mime Type"},"filename":{"type":"string","title":"Filename"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Text content for XML and HTML documents"},"content_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Base64","description":"Base64 content, used only for binary output such as PDF"},"encoding":{"type":"string","title":"Encoding","default":"utf-8"}},"type":"object","required":["mime_type","filename"],"title":"DocumentPayload","description":"A produced document returned inline."},"DocumentReference":{"properties":{"id":{"type":"string","title":"Id","description":"Reference identifier"},"issue_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Issue Date","description":"Issue date of the referenced document"},"document_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type Code","description":"Type code of the referenced document"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"BT-123 — description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"BT-124 — external document location"}},"additionalProperties":false,"type":"object","required":["id"],"title":"DocumentReference","description":"A referenced document (BG-3 preceding invoice, BG-24 attachment, …)."},"DocumentType":{"type":"string","enum":["invoice","credit_note"],"title":"DocumentType","description":"EN 16931 document kind. Maps to BT-3 (invoice type code)."},"EmailChange":{"properties":{"new_email":{"type":"string","format":"email","title":"New Email"},"current_password":{"type":"string","minLength":1,"title":"Current Password"}},"additionalProperties":false,"type":"object","required":["new_email","current_password"],"title":"EmailChange"},"EmailChangeConfirm":{"properties":{"token":{"type":"string","minLength":1,"title":"Token"}},"additionalProperties":false,"type":"object","required":["token"],"title":"EmailChangeConfirm"},"ErrorBody":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine readable error code"},"message":{"type":"string","title":"Message","description":"Human readable summary"},"details":{"items":{"$ref":"#/components/schemas/ErrorDetailSchema"},"type":"array","title":"Details"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Correlates with X-Request-ID"}},"type":"object","required":["code","message"],"title":"ErrorBody"},"ErrorDetailSchema":{"properties":{"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field","description":"Which input field is at fault"},"rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule","description":"Business rule identifier, if any"},"message":{"type":"string","title":"Message","description":"What is wrong with this particular field"}},"type":"object","required":["message"],"title":"ErrorDetailSchema"},"ErrorReasonView":{"properties":{"code":{"type":"string","title":"Code"},"count":{"type":"integer","title":"Count"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"last_seen":{"type":"string","format":"date-time","title":"Last Seen"}},"type":"object","required":["code","count","last_seen"],"title":"ErrorReasonView","description":"Why requests were refused, most frequent first.\n\n\"Something is failing\" is a support ticket; `BR-DE-15, 42 times, last on\nTuesday` is something a customer can fix without writing to anyone."},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"type":"object","required":["error"],"title":"ErrorResponse","description":"The single error envelope used by every endpoint.","example":{"error":{"code":"INVALID_INVOICE","details":[{"field":"buyer_reference","message":"Buyer reference is required.","rule":"BR-DE-15"}],"message":"The invoice contains validation errors.","request_id":"req_2f1c8a94b0d3e5f6a7b8c9d0"}}},"FormatDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"long_name":{"type":"string","title":"Long Name"},"default_version":{"type":"string","title":"Default Version"},"versions":{"items":{"type":"string"},"type":"array","title":"Versions"},"syntaxes":{"items":{"type":"string"},"type":"array","title":"Syntaxes"},"document_types":{"items":{"type":"string"},"type":"array","title":"Document Types"},"capabilities":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Capabilities"},"profiles":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Profiles"},"source":{"type":"string","title":"Source","description":"Where the specification is published"},"specification":{"type":"string","title":"Specification"},"validation_implementation":{"type":"string","title":"Validation Implementation","description":"Exactly which rule sets this service runs for the format"},"validation_coverage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Coverage"},"customization_ids":{"additionalProperties":{"type":"string"},"type":"object","title":"Customization Ids"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["id","name","long_name","default_version","versions","syntaxes","document_types","capabilities","source","specification","validation_implementation"],"title":"FormatDetailResponse"},"FormatId":{"type":"string","enum":["xrechnung","zugferd","en16931","ubl","cii","peppol","unknown"],"title":"FormatId","description":"A target *format* — a business standard, not an XML grammar."},"FormatListResponse":{"properties":{"formats":{"items":{"$ref":"#/components/schemas/FormatSummary"},"type":"array","title":"Formats"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["formats"],"title":"FormatListResponse"},"FormatSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"long_name":{"type":"string","title":"Long Name"},"default_version":{"type":"string","title":"Default Version"},"versions":{"items":{"type":"string"},"type":"array","title":"Versions"},"syntaxes":{"items":{"type":"string"},"type":"array","title":"Syntaxes"},"document_types":{"items":{"type":"string"},"type":"array","title":"Document Types"},"capabilities":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Capabilities"},"profiles":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Profiles"}},"type":"object","required":["id","name","long_name","default_version","versions","syntaxes","document_types","capabilities"],"title":"FormatSummary"},"FormatUsageView":{"properties":{"format":{"type":"string","title":"Format"},"syntax":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Syntax"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["format","count"],"title":"FormatUsageView"},"GenerateRequest":{"properties":{"format":{"$ref":"#/components/schemas/FormatId","description":"Target business standard","default":"xrechnung"},"syntax":{"anyOf":[{"$ref":"#/components/schemas/SyntaxKind"},{"type":"null"}],"description":"XML syntax; defaults to the format's primary syntax"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Standard version; defaults to the registry default"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile","description":"ZUGFeRD conformance level, e.g. 'en16931'"},"output":{"type":"string","enum":["xml","pdf"],"title":"Output","description":"'pdf' produces a hybrid PDF/A-3 for formats that support it","default":"xml"},"validate_result":{"type":"boolean","title":"Validate Result","description":"Run the generated document through the real validator","default":true},"invoice":{"$ref":"#/components/schemas/CanonicalInvoice-Input"}},"additionalProperties":false,"type":"object","required":["invoice"],"title":"GenerateRequest","example":{"format":"xrechnung","invoice":{"buyer":{"city":"Hamburg","country_code":"DE","email":"kreditoren@beispiel.de","name":"Beispiel GmbH","postal_code":"20095","street":"Teststraße 10","vat_id":"DE987654321"},"buyer_reference":"04011000-12345-34","currency":"EUR","due_date":"2026-09-19","invoice_number":"RE-2026-0001","issue_date":"2026-08-20","items":[{"name":"Softwareentwicklung","quantity":10,"unit":"HUR","unit_price":100,"vat_rate":19}],"payment":{"iban":"DE02120300000000202051","means_code":"58","terms":"Zahlbar innerhalb von 30 Tagen ohne Abzug."},"seller":{"city":"Berlin","country_code":"DE","email":"rechnung@muster.de","name":"Muster GmbH","phone":"+49 30 1234567","postal_code":"10115","street":"Musterstraße 1","vat_id":"DE123456789"}},"syntax":"ubl","version":"3.0.2"}},"GenerateResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"format":{"$ref":"#/components/schemas/FormatId"},"syntax":{"anyOf":[{"$ref":"#/components/schemas/SyntaxKind"},{"type":"null"}]},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"},"invoice_id":{"type":"string","title":"Invoice Id","description":"BT-1 of the generated document"},"document_type":{"$ref":"#/components/schemas/DocumentType"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid","description":"Validation verdict; null when validation could not be performed"},"validation":{"anyOf":[{"$ref":"#/components/schemas/ValidationResult"},{"type":"null"}],"description":"The full validation report — same shape as the `result` field of POST /validate. Null when validation could not be performed."},"totals":{"$ref":"#/components/schemas/TotalsSummary"},"document":{"$ref":"#/components/schemas/DocumentPayload"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["success","format","syntax","version","invoice_id","document_type","valid","totals","document"],"title":"GenerateResponse","description":"The generated document plus, when it was validated, its verdict.\n\nThe full validation report is carried under ``validation`` (the same\n``ValidationResult`` shape that ``POST /validate`` returns under ``result``).\n``valid`` repeats only the verdict at the top level for a quick check. This\nendpoint leads with the document it produced; ``/validate`` leads with the\nverdict, which is why the report sits under a different key on each."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","enum":["ok","degraded"],"title":"Status","description":"'degraded' when validation is unavailable; generation still works"},"version":{"type":"string","title":"Version"},"formats":{"items":{"type":"string"},"type":"array","title":"Formats"},"validator":{"$ref":"#/components/schemas/ValidatorHealth"},"zugferd_validator":{"anyOf":[{"$ref":"#/components/schemas/ValidatorHealth"},{"type":"null"}]},"signup_enabled":{"type":"boolean","title":"Signup Enabled","default":true},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["status","version","formats","validator"],"title":"HealthResponse"},"KeyUsageView":{"properties":{"api_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id"},"name":{"type":"string","title":"Name"},"count":{"type":"integer","title":"Count"},"billed":{"type":"integer","title":"Billed","default":0}},"type":"object","required":["api_key_id","name","count"],"title":"KeyUsageView","description":"Per key: how much it called, and how much of that was charged.\n\nBoth, because they answer different questions. `count` says which\nintegration is busy; `billed` says which one is spending the allowance —\nand with most operations free the two are no longer the same number."},"LineItem-Input":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"BT-126 — line identifier"},"name":{"type":"string","title":"Name","description":"BT-153 — item name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"BT-154 — item description"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"BT-127 — invoice line note"},"quantity":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Quantity","description":"BT-129 — invoiced quantity","default":"1"},"unit_code":{"type":"string","title":"Unit Code","description":"BT-130 — UN/ECE Rec 20 unit of measure code","default":"C62"},"unit_price":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Unit Price","description":"BT-146 — item net price","default":"0"},"base_quantity":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Base Quantity","description":"BT-149 — item price base quantity"},"gross_unit_price":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Gross Unit Price","description":"BT-148 — item gross price before the item price discount"},"price_discount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Discount","description":"BT-147 — item price discount"},"discount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount","description":"BG-27 — line level allowance amount"},"discount_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Reason","description":"BT-139 — allowance reason"},"charge":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Charge","description":"BG-28 — line level charge amount"},"charge_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Reason","description":"BT-144 — charge reason"},"vat_category":{"$ref":"#/components/schemas/VatCategory","description":"BT-151 — invoiced item VAT category code","default":"S"},"vat_rate":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Vat Rate","description":"BT-152 — invoiced item VAT rate","default":"0"},"seller_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Item Id","description":"BT-155 — seller item identifier"},"buyer_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Item Id","description":"BT-156 — buyer item identifier"},"standard_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Standard Item Id","description":"BT-157 — standard item identifier"},"standard_item_id_scheme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Standard Item Id Scheme","description":"BT-157-1 — scheme of the standard item identifier","default":"0160"},"order_line_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Line Reference","description":"BT-132 — referenced purchase order line"},"accounting_cost":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accounting Cost","description":"BT-133 — buyer accounting reference"},"period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period Start","description":"BT-134 — invoice line period start"},"period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End","description":"BT-135 — invoice line period end"},"line_net_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Line Net Amount","description":"BT-131 — invoice line net amount. Computed when omitted."}},"additionalProperties":false,"type":"object","required":["name"],"title":"LineItem","description":"One invoice line (BG-25)."},"LineItem-Output":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"BT-126 — line identifier"},"name":{"type":"string","title":"Name","description":"BT-153 — item name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"BT-154 — item description"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"BT-127 — invoice line note"},"quantity":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Quantity","description":"BT-129 — invoiced quantity","default":"1"},"unit_code":{"type":"string","title":"Unit Code","description":"BT-130 — UN/ECE Rec 20 unit of measure code","default":"C62"},"unit_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Unit Price","description":"BT-146 — item net price","default":"0"},"base_quantity":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Base Quantity","description":"BT-149 — item price base quantity"},"gross_unit_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Gross Unit Price","description":"BT-148 — item gross price before the item price discount"},"price_discount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Discount","description":"BT-147 — item price discount"},"discount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Discount","description":"BG-27 — line level allowance amount"},"discount_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discount Reason","description":"BT-139 — allowance reason"},"charge":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Charge","description":"BG-28 — line level charge amount"},"charge_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charge Reason","description":"BT-144 — charge reason"},"vat_category":{"$ref":"#/components/schemas/VatCategory","description":"BT-151 — invoiced item VAT category code","default":"S"},"vat_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Vat Rate","description":"BT-152 — invoiced item VAT rate","default":"0"},"seller_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Item Id","description":"BT-155 — seller item identifier"},"buyer_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Item Id","description":"BT-156 — buyer item identifier"},"standard_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Standard Item Id","description":"BT-157 — standard item identifier"},"standard_item_id_scheme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Standard Item Id Scheme","description":"BT-157-1 — scheme of the standard item identifier","default":"0160"},"order_line_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Line Reference","description":"BT-132 — referenced purchase order line"},"accounting_cost":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accounting Cost","description":"BT-133 — buyer accounting reference"},"period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period Start","description":"BT-134 — invoice line period start"},"period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End","description":"BT-135 — invoice line period end"},"line_net_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Line Net Amount","description":"BT-131 — invoice line net amount. Computed when omitted."}},"additionalProperties":false,"type":"object","required":["name"],"title":"LineItem","description":"One invoice line (BG-25)."},"LogInRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":200,"minLength":1,"title":"Password"}},"additionalProperties":false,"type":"object","required":["email","password"],"title":"LogInRequest"},"MemberView":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"}},"type":"object","required":["id","name","email","role"],"title":"MemberView"},"NeutralResponse":{"properties":{"message":{"type":"string","title":"Message","default":"Wenn zu dieser Adresse ein Konto besteht, haben wir eine E-Mail mit einem Link geschickt. Bitte sehen Sie auch im Spam-Ordner nach."}},"type":"object","title":"NeutralResponse","description":"One shape for every outcome, so the response body reveals nothing."},"Note":{"properties":{"text":{"type":"string","title":"Text","description":"BT-22 — invoice note"},"subject_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Code","description":"BT-21 — invoice note subject code"}},"additionalProperties":false,"type":"object","required":["text"],"title":"Note","description":"A free text note on the invoice (BG-1)."},"OperationPerformanceView":{"properties":{"operation":{"type":"string","title":"Operation"},"count":{"type":"integer","title":"Count"},"median_ms":{"type":"integer","title":"Median Ms"},"p95_ms":{"type":"integer","title":"P95 Ms"}},"type":"object","required":["operation","count","median_ms","p95_ms"],"title":"OperationPerformanceView","description":"How long an operation takes, from the rows already recorded.\n\nMedian and 95th percentile rather than a mean: one 30-second validation of\na huge document drags a mean somewhere no request actually was."},"OrganizationView":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"role":{"type":"string","title":"Role"},"plan":{"type":"string","title":"Plan"},"plan_name":{"type":"string","title":"Plan Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","slug","role","plan","plan_name","created_at"],"title":"OrganizationView"},"ParseResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"source":{"$ref":"#/components/schemas/DetectResponse"},"invoice":{"$ref":"#/components/schemas/CanonicalInvoice-Output"},"totals":{"$ref":"#/components/schemas/TotalsSummary"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["success","source","invoice","totals"],"title":"ParseResponse"},"Party":{"properties":{"name":{"type":"string","title":"Name","description":"BT-27 / BT-44 — legal registered name"},"trading_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trading Name","description":"BT-28 / BT-45 — trading name"},"registration_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Name","description":"Legal registration name if it differs from `name`"},"company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id","description":"BT-30 / BT-47 — legal registration identifier"},"company_id_scheme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id Scheme","description":"BT-30-1 — scheme of the registration id"},"vat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Id","description":"BT-31 / BT-48 — VAT identifier"},"tax_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Number","description":"BT-32 — seller tax registration identifier (German Steuernummer)"},"additional_legal_information":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Legal Information","description":"BT-33 — additional legal information"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Party level e-mail address"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"Party level telephone number"},"electronic_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Electronic Address","description":"BT-34 / BT-49 — electronic address"},"electronic_address_scheme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Electronic Address Scheme","description":"BT-34-1 / BT-49-1 — EAS scheme identifier"},"address":{"$ref":"#/components/schemas/Address","description":"BG-5 / BG-8 postal address"},"contact":{"anyOf":[{"$ref":"#/components/schemas/Contact"},{"type":"null"}],"description":"BG-6 / BG-9 contact"}},"additionalProperties":false,"type":"object","required":["name"],"title":"Party","description":"A seller, buyer, payee or tax representative (BG-4 / BG-7 / BG-10 / BG-11)."},"Payment":{"properties":{"means_code":{"type":"string","title":"Means Code","description":"BT-81 — UNTDID 4461 payment means code","default":"58"},"means_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Means Text","description":"BT-82 — payment means text"},"iban":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iban","description":"BT-84 — payment account identifier"},"bic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bic","description":"BT-86 — payment service provider id"},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name","description":"BT-85 — payment account name"},"payment_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Reference","description":"BT-83 — remittance information"},"terms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms","description":"BT-20 — payment terms"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date","description":"BT-9 — payment due date"},"mandate_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mandate Reference","description":"BT-89 — mandate reference"},"debited_account":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debited Account","description":"BT-91 — debited account identifier"},"card_pan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Pan","description":"BT-87 — payment card primary account number (last digits only)"},"card_holder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Holder","description":"BT-88 — payment card holder name"}},"additionalProperties":false,"type":"object","title":"Payment","description":"Payment instructions (BG-16) and terms (BT-20)."},"PlanId":{"type":"string","enum":["free","starter","business","scale","enterprise"],"title":"PlanId"},"QuotaBucketView":{"properties":{"used":{"type":"integer","title":"Used"},"included":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Included"},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"running_low":{"type":"boolean","title":"Running Low","default":false},"exhausted":{"type":"boolean","title":"Exhausted","default":false}},"type":"object","required":["used","included","remaining"],"title":"QuotaBucketView","description":"The allowance. ``included`` is null when the plan does not meter it."},"QuotaView":{"properties":{"plan":{"type":"string","title":"Plan"},"plan_name":{"type":"string","title":"Plan Name"},"period":{"type":"string","title":"Period"},"invoices":{"$ref":"#/components/schemas/QuotaBucketView"},"generated":{"type":"integer","title":"Generated"},"validated":{"type":"integer","title":"Validated"},"by_operation":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Operation"},"rate_per_minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Per Minute"},"since":{"type":"string","format":"date-time","title":"Since"},"resets_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resets At"}},"type":"object","required":["plan","plan_name","period","invoices","generated","validated","by_operation","rate_per_minute","since","resets_at"],"title":"QuotaView"},"ResetConfirm":{"properties":{"token":{"type":"string","minLength":1,"title":"Token"},"new_password":{"type":"string","minLength":1,"title":"New Password"}},"additionalProperties":false,"type":"object","required":["token","new_password"],"title":"ResetConfirm"},"ResetRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"additionalProperties":false,"type":"object","required":["email"],"title":"ResetRequest"},"RuleSetInfo":{"properties":{"name":{"type":"string","title":"Name","description":"Human readable rule set name"},"kind":{"type":"string","title":"Kind","description":"'xml-schema', 'schematron' or 'pdf-a' (container conformance)"},"passed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Passed","description":"Outcome of this individual step"}},"type":"object","required":["name","kind"],"title":"RuleSetInfo","description":"Which rule set actually ran, so coverage is never overstated."},"SessionSummaryView":{"properties":{"id":{"type":"string","title":"Id"},"current":{"type":"boolean","title":"Current"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["id","current","user_agent","created_at","last_seen_at","expires_at"],"title":"SessionSummaryView","description":"One signed-in browser.\n\nNo address and no location: the question this answers is \"is one of these\nnot mine?\", and a device description answers it without recording where its\nowner was sitting."},"Severity":{"type":"string","enum":["error","warning","info"],"title":"Severity","description":"Severity of a single validation finding."},"SignUpRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"password":{"type":"string","maxLength":200,"minLength":10,"title":"Password"},"organization_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Organization Name"}},"additionalProperties":false,"type":"object","required":["email","name","password"],"title":"SignUpRequest"},"SubscriptionView":{"properties":{"plan":{"type":"string","title":"Plan"},"plan_name":{"type":"string","title":"Plan Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"has_customer":{"type":"boolean","title":"Has Customer"},"billing_enabled":{"type":"boolean","title":"Billing Enabled"}},"type":"object","required":["plan","plan_name","status","period_end","has_customer","billing_enabled"],"title":"SubscriptionView"},"SwitchOrganizationRequest":{"properties":{"organization_id":{"type":"string","title":"Organization Id"}},"additionalProperties":false,"type":"object","required":["organization_id"],"title":"SwitchOrganizationRequest"},"SyntaxKind":{"type":"string","enum":["ubl","cii"],"title":"SyntaxKind","description":"The XML grammar carrying the business standard."},"TaxBreakdownEntry-Input":{"properties":{"category":{"$ref":"#/components/schemas/VatCategory","description":"BT-118 — VAT category code"},"rate":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Rate","description":"BT-119 — VAT category rate","default":"0"},"taxable_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Taxable Amount","description":"BT-116 — VAT category taxable amount","default":"0"},"tax_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Tax Amount","description":"BT-117 — VAT category tax amount","default":"0"},"exemption_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exemption Reason","description":"BT-120 — VAT exemption reason text"},"exemption_reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exemption Reason Code","description":"BT-121 — VAT exemption reason code"}},"additionalProperties":false,"type":"object","required":["category"],"title":"TaxBreakdownEntry","description":"One VAT breakdown group (BG-23). Normally computed by the VAT engine."},"TaxBreakdownEntry-Output":{"properties":{"category":{"$ref":"#/components/schemas/VatCategory","description":"BT-118 — VAT category code"},"rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Rate","description":"BT-119 — VAT category rate","default":"0"},"taxable_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Taxable Amount","description":"BT-116 — VAT category taxable amount","default":"0"},"tax_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Tax Amount","description":"BT-117 — VAT category tax amount","default":"0"},"exemption_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exemption Reason","description":"BT-120 — VAT exemption reason text"},"exemption_reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exemption Reason Code","description":"BT-121 — VAT exemption reason code"}},"additionalProperties":false,"type":"object","required":["category"],"title":"TaxBreakdownEntry","description":"One VAT breakdown group (BG-23). Normally computed by the VAT engine."},"Totals-Input":{"properties":{"line_total":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Line Total","description":"BT-106 — sum of invoice line net amounts","default":"0"},"allowance_total":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Allowance Total","description":"BT-107 — sum of allowances on document level","default":"0"},"charge_total":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Charge Total","description":"BT-108 — sum of charges on document level","default":"0"},"tax_exclusive_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Tax Exclusive Amount","description":"BT-109 — invoice total amount without VAT","default":"0"},"tax_total":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Tax Total","description":"BT-110 — invoice total VAT amount","default":"0"},"tax_inclusive_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Tax Inclusive Amount","description":"BT-112 — invoice total amount with VAT","default":"0"},"prepaid_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Prepaid Amount","description":"BT-113 — paid amount","default":"0"},"rounding_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Rounding Amount","description":"BT-114 — rounding amount","default":"0"},"payable_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Payable Amount","description":"BT-115 — amount due for payment","default":"0"}},"additionalProperties":false,"type":"object","title":"Totals","description":"Document level totals (BG-22). Always produced by the VAT engine."},"Totals-Output":{"properties":{"line_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Line Total","description":"BT-106 — sum of invoice line net amounts","default":"0"},"allowance_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Allowance Total","description":"BT-107 — sum of allowances on document level","default":"0"},"charge_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Charge Total","description":"BT-108 — sum of charges on document level","default":"0"},"tax_exclusive_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Tax Exclusive Amount","description":"BT-109 — invoice total amount without VAT","default":"0"},"tax_total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Tax Total","description":"BT-110 — invoice total VAT amount","default":"0"},"tax_inclusive_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Tax Inclusive Amount","description":"BT-112 — invoice total amount with VAT","default":"0"},"prepaid_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Prepaid Amount","description":"BT-113 — paid amount","default":"0"},"rounding_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Rounding Amount","description":"BT-114 — rounding amount","default":"0"},"payable_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Payable Amount","description":"BT-115 — amount due for payment","default":"0"}},"additionalProperties":false,"type":"object","title":"Totals","description":"Document level totals (BG-22). Always produced by the VAT engine."},"TotalsSummary":{"properties":{"net":{"type":"string","title":"Net","description":"Total without VAT (BT-109)"},"tax":{"type":"string","title":"Tax","description":"Total VAT (BT-110)"},"gross":{"type":"string","title":"Gross","description":"Total with VAT (BT-112)"},"payable":{"type":"string","title":"Payable","description":"Amount due for payment (BT-115)"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["net","tax","gross","payable","currency"],"title":"TotalsSummary","description":"The compact totals view used in responses."},"UpdateAccountRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"additionalProperties":false,"type":"object","required":["name"],"title":"UpdateAccountRequest"},"UpdateOrganizationRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"slug":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Slug"}},"additionalProperties":false,"type":"object","required":["name"],"title":"UpdateOrganizationRequest"},"UsageEntryView":{"properties":{"id":{"type":"string","title":"Id"},"operation":{"type":"string","title":"Operation"},"outcome":{"type":"string","title":"Outcome"},"success":{"type":"boolean","title":"Success"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"syntax":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Syntax"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"api_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id"},"api_key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Name"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"duration_ms":{"type":"integer","title":"Duration Ms","default":0}},"type":"object","required":["id","operation","outcome","success","format","syntax","created_at"],"title":"UsageEntryView"},"UsagePageView":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UsageEntryView"},"type":"array","title":"Items"},"next_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Before"}},"type":"object","required":["items","next_before"],"title":"UsagePageView","description":"One page of request history.\n\n``next_before`` is a cursor rather than an offset: rows keep arriving while\nsomeone is paging, and an offset would silently repeat or skip one. It is\n``null`` when the last page has been reached."},"UsageSummaryView":{"properties":{"total":{"type":"integer","title":"Total"},"last_7_days":{"type":"integer","title":"Last 7 Days"},"last_30_days":{"type":"integer","title":"Last 30 Days"},"previous_30_days":{"type":"integer","title":"Previous 30 Days","default":0},"by_operation":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Operation"},"daily":{"items":{"$ref":"#/components/schemas/DailyPointView"},"type":"array","title":"Daily"},"recent":{"items":{"$ref":"#/components/schemas/UsageEntryView"},"type":"array","title":"Recent"},"quota":{"$ref":"#/components/schemas/QuotaView"},"performance":{"items":{"$ref":"#/components/schemas/OperationPerformanceView"},"type":"array","title":"Performance"},"errors":{"items":{"$ref":"#/components/schemas/ErrorReasonView"},"type":"array","title":"Errors"},"by_key":{"items":{"$ref":"#/components/schemas/KeyUsageView"},"type":"array","title":"By Key"},"by_format":{"items":{"$ref":"#/components/schemas/FormatUsageView"},"type":"array","title":"By Format"}},"type":"object","required":["total","last_7_days","last_30_days","by_operation","daily","recent","quota"],"title":"UsageSummaryView"},"UserView":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"email_confirmed":{"type":"boolean","title":"Email Confirmed"}},"type":"object","required":["id","email","name","created_at","email_confirmed"],"title":"UserView"},"ValidateResponse":{"properties":{"status":{"$ref":"#/components/schemas/ValidationStatus"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid"},"detected_format":{"anyOf":[{"$ref":"#/components/schemas/FormatId"},{"type":"null"}]},"syntax":{"anyOf":[{"$ref":"#/components/schemas/SyntaxKind"},{"type":"null"}]},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"result":{"$ref":"#/components/schemas/ValidationResult","description":"The full validation report — same shape as the `validation` field of POST /generate."},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["status","valid","result"],"title":"ValidateResponse","description":"A validation verdict, with the full report under ``result``.\n\n``status``, ``valid`` and ``detected_format`` are hoisted to the top level\nbecause the verdict is the point of this endpoint. The full report sits\nunder ``result`` — the same ``ValidationResult`` shape that ``POST /generate``\nreturns under ``validation``. So the report is the same object on both\nendpoints; only the wrapping key differs (``result`` here, ``validation``\nthere)."},"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"},"ValidationIssue":{"properties":{"severity":{"$ref":"#/components/schemas/Severity","description":"error, warning or info"},"rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule","description":"Original rule identifier, e.g. 'BR-DE-15' or 'BR-CO-10'"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"XPath location inside the document"},"message":{"type":"string","title":"Message","description":"Original message as emitted by the rule set"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Plain-language explanation of what the rule means"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion","description":"Concrete next step to make the document pass"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field","description":"Canonical model field this issue maps to, when known"},"business_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Term","description":"EN 16931 business term the rule is about, e.g. 'BT-10'"},"expected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected","description":"Value the rule expected, when known"},"actual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual","description":"Value found in the document, when known"},"rule_set":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Set","description":"Which rule set produced this finding"},"documentation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documentation Url","description":"Where the rule is specified"}},"type":"object","required":["severity","message"],"title":"ValidationIssue","description":"A single finding, keeping both the raw and the human readable view."},"ValidationResult":{"properties":{"status":{"$ref":"#/components/schemas/ValidationStatus","description":"valid | invalid | unsupported_validation"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid","description":"True or False when a real rule set ran, null when validation could not be performed. Never optimistically true."},"detected_format":{"anyOf":[{"$ref":"#/components/schemas/FormatId"},{"type":"null"}]},"syntax":{"anyOf":[{"$ref":"#/components/schemas/SyntaxKind"},{"type":"null"}]},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile","description":"ZUGFeRD conformance level, when applicable"},"document_type":{"anyOf":[{"$ref":"#/components/schemas/DocumentType"},{"type":"null"}]},"summary":{"$ref":"#/components/schemas/ValidationSummary"},"issues":{"items":{"$ref":"#/components/schemas/ValidationIssue"},"type":"array","title":"Issues"},"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine","description":"Validation engine that produced this result"},"scenario":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scenario","description":"Engine scenario that matched the document"},"rule_sets":{"items":{"$ref":"#/components/schemas/RuleSetInfo"},"type":"array","title":"Rule Sets"},"steps":{"items":{"$ref":"#/components/schemas/ValidationStep"},"type":"array","title":"Steps"},"coverage_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Note","description":"Explicit statement of what was and was not checked, so technical conformance is never mistaken for a legal guarantee."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Why validation could not be performed, when status is unsupported_validation"},"validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Validated At"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"}},"type":"object","required":["status"],"title":"ValidationResult","description":"The complete outcome of one validation run."},"ValidationStatus":{"type":"string","enum":["valid","invalid","unsupported_validation"],"title":"ValidationStatus","description":"Outcome of a validation run.\n\n``UNSUPPORTED_VALIDATION`` exists so the API never has to lie: if no real\nrule set could be executed the result is explicitly *unknown*\n(``valid: null``) instead of an optimistic ``valid: true``."},"ValidationStep":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid"}},"type":"object","required":["id","name"],"title":"ValidationStep","description":"One executed validation step, mirroring the engine's own report."},"ValidationSummary":{"properties":{"errors":{"type":"integer","title":"Errors","default":0},"warnings":{"type":"integer","title":"Warnings","default":0},"infos":{"type":"integer","title":"Infos","default":0},"rules_checked":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rules Checked","description":"Number of individual rules executed, when the engine reports one. The KoSIT validator does not, so this is null for XML-only validations and populated for hybrid PDFs."}},"type":"object","title":"ValidationSummary","description":"Counts at a glance."},"ValidatorHealth":{"properties":{"configured":{"type":"boolean","title":"Configured","description":"Whether a validation engine is configured"},"reachable":{"type":"boolean","title":"Reachable","description":"Whether that engine currently answers"},"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint","description":"Configured engine URL"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"What happens to validation requests in the current state"}},"type":"object","required":["configured","reachable"],"title":"ValidatorHealth"},"VatCategory":{"type":"string","enum":["S","Z","E","AE","K","G","O","L","M"],"title":"VatCategory","description":"UNTDID 5305 VAT category codes used by EN 16931 (BT-118/BT-151)."},"VerifiedResponse":{"properties":{"confirmed":{"type":"boolean","title":"Confirmed","default":true},"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"VerifiedResponse"},"VerifyEmail":{"properties":{"token":{"type":"string","minLength":1,"title":"Token"}},"additionalProperties":false,"type":"object","required":["token"],"title":"VerifyEmail"},"einvoice__api__v1__account_routes__SessionView":{"properties":{"user":{"$ref":"#/components/schemas/UserView"},"organizations":{"items":{"$ref":"#/components/schemas/OrganizationView"},"type":"array","title":"Organizations"},"active_organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Organization Id"}},"type":"object","required":["user","organizations","active_organization_id"],"title":"SessionView","description":"Everything the dashboard needs to render its shell."},"einvoice__api__v1__billing_routes__SessionView":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"SessionView","description":"A Stripe-hosted page to send the browser to."}},"securitySchemes":{"ApiKeyBearer":{"type":"http","scheme":"bearer","description":"An API key issued from the dashboard, sent as `Authorization: Bearer inv_test_...`."},"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"The same API key, sent as a dedicated header instead."},"SessionCookie":{"type":"apiKey","in":"cookie","name":"invapi_session","description":"The session cookie set by `/auth/login` and `/auth/signup`."}}},"tags":[{"name":"Service","description":"Health and service discovery."},{"name":"Formats","description":"Which standards, versions and capabilities are available."},{"name":"Invoicing","description":"Generate, validate, detect, convert, parse and render invoices."},{"name":"Account","description":"Sign-in, organizations, API keys, usage and the audit trail — what the dashboard is built on. None of it counts against your plan."}],"servers":[{"url":"https://api.invoapi.de","description":"This instance"}]}