REST API · v1

ParseFlow AI API

Validate and export financial data programmatically — Excel, CSV, XML and direct mappings for QuickBooks, Xero, DATEV and 1С. The same engine that powers the app, behind a simple REST API.

Get your API key
Base URL https://flowparse.io/api/v1

Introduction

The ParseFlow AI API lets you run the platform's deterministic validation engine and export enginefrom your own code. Send extracted invoice or bank-statement data as JSON; get back a validated quality score or a ready-to-import file. Everything you can do in the app — Excel/CSV/XML export and QuickBooks, Xero, DATEV & 1С mappings — is available here.

Validate

Quality Score + every check

Export

Excel · CSV · XML

Accounting

QuickBooks · Xero · DATEV · 1С

Authentication

All requests require an API key sent as a Bearer token. Get a key in one click, or manage existing keys in your dashboard → API tab. The full key (pf_live_…) is shown only once at creation — store it securely. You can also pass it as X-API-Key.

Authorization header
Authorization: Bearer pf_live_xxxxxxxxxxxxxxxxxxxx

Keys are stored as SHA-256 hashes — ParseFlow never stores your plaintext key. Revoke a compromised key instantly from the dashboard.

Pricing & billing

Your balance is shown and topped up in US dollars. API usage draws from the same balance as the app, billed at 2.5× the standard per-page rate to cover automated, high-volume throughput. Previews and validation are free; file exports are billed per page.

Standard rate

$0.02 / page

API rate (2.5×)

$0.050 / page

Add funds to your balance

Bonus pages never expire and are used after your monthly budget.

Add funds

Price per single PDF page: $0.02 at the standard rate, $0.050 via the API.

Data model

Every request describes a document via type plus its data.

Request body shapes
// Invoice
{ "type": "invoice", "data": { /* invoice fields */ } }

// Bank statement
{ "type": "bank_statement", "data": { /* statement fields */ } }

// Mixed (both on one document)
{ "type": "mixed", "invoice": { ... }, "bank_statement": { ... } }
Invoice fields
{
  "supplier_name": "string",   "supplier_address": "string",
  "customer_name": "string",   "customer_address": "string",
  "invoice_number": "string",  "invoice_date": "YYYY-MM-DD",
  "due_date": "YYYY-MM-DD",    "vat_number": "string",
  "currency": "EUR",
  "subtotal": 100.0, "tax_amount": 19.0, "total": 119.0,
  "line_items": [
    { "description": "string", "quantity": 1, "unit_price": 0,
      "tax_rate": 19, "amount": 0 }
  ]
}
Bank statement fields
{
  "bank_name": "string", "account_holder": "string",
  "account_number_masked": "string", "statement_period": "string",
  "currency": "EUR", "opening_balance": 0.0, "closing_balance": 0.0,
  "transactions": [
    { "date": "YYYY-MM-DD", "description": "string",
      "category": "string", "amount": -12.50, "balance": 0.0 }
  ]
}

POST /validate

Runs the deterministic validation engine (12 invoice + 8 bank checks). Returns a 0–100 Quality Score, grade (green/yellow/red), every check and a summary.

curl
curl -X POST https://flowparse.io/api/v1/validate \
  -H "Authorization: Bearer pf_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "invoice",
    "data": {
      "supplier_name": "Acme Ltd",
      "invoice_number": "INV-1024",
      "invoice_date": "2026-05-01",
      "currency": "EUR",
      "subtotal": 100.00,
      "tax_amount": 19.00,
      "total": 119.00,
      "line_items": [
        { "description": "Widget", "quantity": 2, "unit_price": 50, "tax_rate": 19, "amount": 100 }
      ]
    }
  }'
Response
{
  "validations": [
    {
      "documentType": "invoice",
      "score": { "value": 98, "grade": "green" },
      "summary": { "passed": 11, "warnings": 1, "errors": 0 },
      "issues": [ { "severity": "pass", "title": "Totals reconcile", ... } ]
    }
  ]
}

POST /export

Generates a file in the requested format. Spreadsheet formats return text (CSV/XML) or base64 (XLSX); accounting formats also include a preview of the mapped columns and rows.

formatTargetOutput
xlsxExcelStyled multi-sheet workbook (base64)
csvCSVUTF-8, 1:1 source columns + line items
xmlXMLStructured invoice / statement XML
quickbooksQuickBooksImport-ready CSV
xeroXeroAP/AR invoice + bank import
datevDATEVNEWEXTF Buchungsstapel
onecNEW1CClientBankExchange / CSV
curl — Excel (base64)
curl -X POST https://flowparse.io/api/v1/export \
  -H "Authorization: Bearer pf_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "format": "xlsx", "type": "invoice", "data": { ... } }'
# → { "format":"xlsx", "filename":"...", "encoding":"base64", "content":"UEsDBB..." }

Accounting exports

Set format to quickbooks, xero, datev or onec. Each returns the import file plus a preview. Pass options to override account codes / tax keys, and onecLanguage for 1С.

curl — QuickBooks
curl -X POST https://flowparse.io/api/v1/export \
  -H "Authorization: Bearer pf_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "format": "quickbooks", "type": "invoice", "data": { ... } }'

1С / accounting preview

Add "preview": true to any accounting export to get back just the mapped table (columns, first rows, total count and mapping notes) without generating the file — ideal for showing a confirmation screen before import.

curl — 1С export preview
curl -X POST https://flowparse.io/api/v1/export \
  -H "Authorization: Bearer pf_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "format": "onec", "preview": true, "onecLanguage": "ru", "type": "invoice", "data": { ... } }'
# → { "format":"onec", "preview": { "columns":[...], "rows":[...], "totalRows": 1, "notes":[...] } }

The preview mirrors the app's in-product preview exactly, so what you show your users is what imports.

Code examples

Node.js

JavaScript (fetch)
const res = await fetch("https://flowparse.io/api/v1/export", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.PARSEFLOW_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ format: "xero", type: "invoice", data: invoice }),
})
const { content, filename } = await res.json()
require("fs").writeFileSync(filename, content, "utf8")

Python

Python (requests)
import os, base64, requests

r = requests.post(
    "https://flowparse.io/api/v1/export",
    headers={"Authorization": f"Bearer {os.environ['PARSEFLOW_API_KEY']}"},
    json={"format": "xlsx", "type": "bank_statement", "data": statement},
)
out = r.json()
with open(out["filename"], "wb") as f:
    f.write(base64.b64decode(out["content"]))  # xlsx is base64

Errors

Errors return a JSON body { "error": "message" } with a standard HTTP status.

400

Bad Request

Malformed body, missing data, or unsupported format.

401

Unauthorized

Missing, invalid or revoked API key.

429

Too Many Requests

Page budget exhausted — top up or upgrade.

500

Server Error

Unexpected error generating the export.

Rate limits

Throughput is governed by your page balance rather than a fixed request cap. If your monthly budget and bonus pages are exhausted, requests that consume pages return 429 until you top up or upgrade. Validation of already-extracted JSON is free.

Ready to build? Generate your first key in one click.

Get API key