Invoice Example (B2B)
This example demonstrates a complete B2B invoice SDF document. The issuer is Acme Supplies GmbH (Munich, DE) billing Global Logistics AG (Zurich, CH) for industrial parts.
meta.json
{ "sdf_version": "0.1", "document_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "document_type": "invoice", "schema_id": "https://etapsky.github.io/sdf/schemas/invoice/v0.1.json", "issuer": "Acme Supplies GmbH", "issuer_id": "DE123456789", "created_at": "2026-03-15T14:30:00+01:00", "recipient": "Global Logistics AG"}Key fields:
document_idis a UUID v4 generated at production time — it is not derived from the invoice number.schema_idpoints to the embeddedschema.json(the URL is a schema identifier, not a remote reference — the schema is bundled inside the.sdfarchive).
data.json
{ "document_type": "invoice", "invoice_number": "INV-2026-00142", "issue_date": "2026-03-15", "due_date": "2026-04-15", "order_ref": "PO-2026-0042", "issuer": { "name": "Acme Supplies GmbH", "id": "DE123456789", "address": { "street": "Industriestraße 42", "city": "Munich", "postal_code": "80331", "country": "DE" } }, "recipient": { "name": "Global Logistics AG", "id": "CH-123.456.789", "address": { "street": "Logistikweg 7", "city": "Zurich", "postal_code": "8001", "country": "CH" } }, "line_items": [ { "description": "Industrial valve Type-A", "quantity": 50, "unit_price": { "amount": "24.00", "currency": "EUR" }, "vat_rate": "19.00", "line_total": { "amount": "1200.00", "currency": "EUR" } }, { "description": "Sealing kit Type-B", "quantity": 12, "unit_price": { "amount": "20.00", "currency": "EUR" }, "vat_rate": "19.00", "line_total": { "amount": "240.00", "currency": "EUR" } } ], "totals": { "net": { "amount": "1440.00", "currency": "EUR" }, "vat": { "amount": "273.60", "currency": "EUR" }, "gross": { "amount": "1713.60", "currency": "EUR" } }, "payment": { "iban": "DE89370400440532013000", "bic": "COBADEFFXXX", "due_date": "2026-04-15", "terms": "NET_30" }}Monetary amounts are always
{ "amount": "string", "currency": "ISO 4217 code" }. Floating-point numbers are never used for financial values — see FAQ.
Producer code
TypeScript
import { buildSDF } from '@etapsky/sdf-kit';import { readFileSync, writeFileSync } from 'fs';
const meta = { sdf_version: '0.1', document_id: crypto.randomUUID(), // always generate fresh UUID document_type: 'invoice', schema_id: 'invoice/v0.1', issuer: 'Acme Supplies GmbH', issuer_id: 'DE123456789', created_at: new Date().toISOString(), recipient: 'Global Logistics AG',};
const data = { document_type: 'invoice', invoice_number: 'INV-2026-00142', issue_date: '2026-03-15', due_date: '2026-04-15', order_ref: 'PO-2026-0042', issuer: { name: 'Acme Supplies GmbH', id: 'DE123456789', address: { street: 'Industriestraße 42', city: 'Munich', postal_code: '80331', country: 'DE', }, }, recipient: { name: 'Global Logistics AG', id: 'CH-123.456.789', address: { street: 'Logistikweg 7', city: 'Zurich', postal_code: '8001', country: 'CH', }, }, line_items: [ { description: 'Industrial valve Type-A', quantity: 50, unit_price: { amount: '24.00', currency: 'EUR' }, vat_rate: '19.00', line_total: { amount: '1200.00', currency: 'EUR' }, }, { description: 'Sealing kit Type-B', quantity: 12, unit_price: { amount: '20.00', currency: 'EUR' }, vat_rate: '19.00', line_total: { amount: '240.00', currency: 'EUR' }, }, ], totals: { net: { amount: '1440.00', currency: 'EUR' }, vat: { amount: '273.60', currency: 'EUR' }, gross: { amount: '1713.60', currency: 'EUR' }, }, payment: { iban: 'DE89370400440532013000', bic: 'COBADEFFXXX', due_date: '2026-04-15', terms: 'NET_30', },};
const schema = JSON.parse(readFileSync('invoice.schema.json', 'utf-8'));
const sdfBuffer = await buildSDF({ meta, data, schema });
writeFileSync('invoice.sdf', sdfBuffer);console.log('Created invoice.sdf —', sdfBuffer.byteLength, 'bytes');Python
import uuidfrom datetime import datetime, timezonefrom etapsky_sdf import build_sdfimport json
meta = { "sdf_version": "0.1", "document_id": str(uuid.uuid4()), "document_type": "invoice", "schema_id": "invoice/v0.1", "issuer": "Acme Supplies GmbH", "issuer_id": "DE123456789", "created_at": datetime.now(timezone.utc).isoformat(), "recipient": "Global Logistics AG",}
data = { "document_type": "invoice", "invoice_number": "INV-2026-00142", "issue_date": "2026-03-15", "due_date": "2026-04-15", "order_ref": "PO-2026-0042", "issuer": { "name": "Acme Supplies GmbH", "id": "DE123456789", "address": { "street": "Industriestraße 42", "city": "Munich", "postal_code": "80331", "country": "DE", }, }, "recipient": { "name": "Global Logistics AG", "id": "CH-123.456.789", "address": { "street": "Logistikweg 7", "city": "Zurich", "postal_code": "8001", "country": "CH", }, }, "line_items": [ { "description": "Industrial valve Type-A", "quantity": 50, "unit_price": {"amount": "24.00", "currency": "EUR"}, "vat_rate": "19.00", "line_total": {"amount": "1200.00", "currency": "EUR"}, }, { "description": "Sealing kit Type-B", "quantity": 12, "unit_price": {"amount": "20.00", "currency": "EUR"}, "vat_rate": "19.00", "line_total": {"amount": "240.00", "currency": "EUR"}, }, ], "totals": { "net": {"amount": "1440.00", "currency": "EUR"}, "vat": {"amount": "273.60", "currency": "EUR"}, "gross": {"amount": "1713.60", "currency": "EUR"}, }, "payment": { "iban": "DE89370400440532013000", "bic": "COBADEFFXXX", "due_date": "2026-04-15", "terms": "NET_30", },}
with open("invoice.schema.json") as f: schema = json.load(f)
sdf_bytes = build_sdf(meta=meta, data=data, schema=schema)
with open("invoice.sdf", "wb") as f: f.write(sdf_bytes)
print(f"Created invoice.sdf — {len(sdf_bytes)} bytes")Validating the output
sdf validate invoice.sdfExpected output:
✔ invoice.sdf — valid document_id: f47ac10b-58cc-4372-a567-0e02b2c3d479 document_type: invoice sdf_version: 0.1 schema_id: invoice/v0.1 signed: false