FinBaze for Platforms

Concepts

Reports#

platformReport(company, input) for profit_loss, balance_sheet, trial_balance, vat_position (needs a taxFilingId), cashflow, aged_receivables, aged_payables, kpis, general_ledger and forecast. Amounts are in minor units. profit_loss and balance_sheet return lines (amountMinor in the normal sign, signedMinor debit-positive) and totals; compare: previous_period | previous_year adds compareMinor. general_ledger is paged with offset and limit. platformReportDocument renders a report as XLSX or PDF (profit and loss, balance sheet, cash flow, forecast, aged reports). PDFs use the company's report document layout (your preset or the company's own), like payslips and annual accounts.

Documents#

companyDocument(company, kind, object, params) renders on demand. The answer has a downloadUrl that works for 15 minutes without a token (GET /v2/platform/files/<token>), and files are kept 24 hours.

KindobjectparamsModule
sales_invoice_pdf, sales_invoice_ubl, credit_note_pdfinvoice (id or externalId)sales_invoices
quote_pdf, reminder_pdfquote / reminderquotes / reminders
purchase_invoice_originalpurchase invoicedocumentId (optional)purchase_invoices
receipt_originalbank transaction (id or externalId)documentId (one of booking.receipt.documentIds)banking
tax_filing_pdffiling (id)tax_filings
tax_filing_receiptsubmitted filing (id); JSON with the reference and the authority's status messagestax_filings
annual_accounts_pdffinancial year (id), or nonefinancialYearannual_accounts
payslip_pdf, year_document_pdfpayslip / year document (id)payroll
report_pdf, report_xlsxthe PlatformReportInput fieldsthe report's
xaffinancialYear or from/to, version (4.0 default, 3.2)

Every kind also needs data_export. A transaction without a receipt answers NOT_ATTACHED; a draft filing has no receipt (UNSUPPORTED_OPERATION). audit_log is not a company document: use requestAuditLogExport.

The audit file#

requestXafExport(company, financialYear, version) writes an Auditfile Financieel in the background: XAF 4.0 by default (the only version the Belastingdienst accepts from 1 January 2027), version: "3.2" for receivers that still need it. The run's document carries the link when it is ready, and export.ready is sent. Invoice lines carry their VAT (vat: code, percentage, amount) and the relation (custSupID, the relation id without hyphens); the VAT codes used are listed in vatCodes. The 4.0 output is validated against the official XSD; 3.2 follows the official field order but is not validated.

Scheduled exports#

  1. createPlatformExportDestination with an S3 (or S3-compatible endpoint, such as GCS interoperability, OVH or MinIO) bucket and keys, or an Azure container SAS URL. FinBaze writes _finbaze_check/<time>.txt to prove it can; credentials are encrypted and never returned.
  2. createPlatformExportSchedule with datasets, format (parquet, csv, ndjson), a cron (at most once an hour) and timezone.
  3. runPlatformExportNow(key, companies) queues a run, optionally for some of the schedule's companies only (companies; the manifest lists them in companyFilter, and the other companies' next run still carries their changes); platformExportRun shows it.

Datasets: journal_lines, trial_balance (snapshots), and bank_transactions, sales_invoices, sales_invoice_lines, purchase_invoices, purchase_invoice_lines, relations, custom_records, record_effects, vat_returns (only what changed since the last run, with op = upsert or delete). vat_returns holds the NL and UK VAT returns: period, status, reference, amount_due_minor and the boxes as computed or filed. Every row has company_id, company_external_id and exported_at. A run writes the data files first, then _manifest.json, then an empty _SUCCESS: a folder without _SUCCESS is incomplete.

What happened to a bank transaction#

bankTransactionBookings(company, externalIds) (at most 100) returns the status (unbooked, suggested, booked, needs_review), the counterpart, the ledger legs, the VAT code, the invoice's VAT (vatAmountMinor), the receipt status and its documents, what FinBaze proposes for an unbooked transaction (suggestion: counterpart, ledger, confidence) and why it needs a person (reviewReason: policy_review_required, awaiting_document, amount_difference, low_confidence). The same object is booking on MonetaryAccountPayment. The events bank_transaction.booked, .unbooked, .needs_receipt and .needs_review tell you when one changes.