API reference
Rowvert REST API
One endpoint. Send a PDF, get back structured transactions, a reconciliation summary and download links. Available on the Business plan; keys are generated in Dashboard → API.
Authentication
Pass your key as a Bearer token. Keys start with rvt_live_. Keep them server-side.
POST /api/v1/convert
Multipart form with one field, file (PDF, ≤ 25 MB, ≤ 100 pages). Synchronous; allow up to 5 minutes for long scanned files.
curl -X POST https://rowvert.com/api/v1/convert \ -H "Authorization: Bearer rvt_live_..." \ -F "file=@statement.pdf"
Response 200
{
"id": "clx…",
"pages": 3,
"rows": 41,
"reconciled": true,
"pagesLeft": 4997,
"summary": {
"bank": "Chase", "currency": "USD", "accountNumber": "****8814",
"periodStart": "2026-08-01", "periodEnd": "2026-08-31",
"openingBalance": 4812.40, "closingBalance": 8113.21,
"totalDebits": 2139.19, "totalCredits": 5440.00,
"reconciled": true, "mismatches": 0, "notes": []
},
"transactions": [
{ "date": "2026-08-02", "dateRaw": "08/02", "description": "CARD PURCHASE 08/01 STARBUCKS #2231",
"debit": 6.85, "credit": null, "balance": 4805.55, "page": 1 }
],
"authenticity": { "score": 100, "level": "clear", "headline": "No signs of tampering", "checks": [ … ] },
"downloads": { "xlsx": "…", "csv": "…", "quickbooks": "…", "xero": "…", "qbo": "…", "ofx": "…", "qfx": "…", "qif": "…" }
}Response fields
- reconciled
- True when opening balance + credits − debits equals the closing balance and every row follows the running balance. Check this before posting the data anywhere.
- summary
- Bank (detected from the statement), masked account number, currency, statement period, opening and closing balance, totals, number of mismatching rows and human-readable notes (for example “newest transactions first”).
- transactions[]
- One object per row: ISO date plus the raw date as printed, description, debit or credit (never both), running balance when the statement prints one, source page, and
flagged: trueon rows that break the running balance. - authenticity
- The same 0–100 score shown on the result page, with every check (arithmetic, dates, round numbers, Benford, generated-content and PDF forensics) as
{ id, label, status, detail }. Status ispass,warn,failorinfo. Indicators, not proof. - downloads
- Authenticated links to the Excel file and every export format: standard CSV, QuickBooks CSV, Xero CSV, QuickBooks Web Connect (.qbo), OFX, Quicken (.qfx) and QIF. Links work for the conversion's retention period.
- pagesLeft
- Pages remaining in the current billing period after this conversion.
Examples
Node.js (18+)
import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("file", new Blob([await readFile("statement.pdf")], { type: "application/pdf" }), "statement.pdf");
const res = await fetch("https://rowvert.com/api/v1/convert", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.ROWVERT_API_KEY}` },
body: form,
});
const data = await res.json();
if (!data.reconciled) console.warn("Check flagged rows:", data.summary.mismatches);Python
import os, requests
with open("statement.pdf", "rb") as f:
r = requests.post("https://rowvert.com/api/v1/convert",
headers={"Authorization": f"Bearer {os.environ['ROWVERT_API_KEY']}"},
files={"file": ("statement.pdf", f, "application/pdf")}, timeout=300)
r.raise_for_status()
data = r.json()
print(data["summary"]["bank"], data["rows"], "rows, reconciled:", data["reconciled"])Good practice
- Send one statement per request. Merged PDFs of several accounts or months reconcile less reliably.
- Treat
reconciled: falseas “needs review”, not as an error: the rows are usually right and the flagged ones tell you where to look. - Pages are only charged for successful conversions; a
502refunds the pages automatically. - The PDF itself is never stored. Extracted data follows your plan's retention and can be deleted from the dashboard.
Errors
401missing or invalid key ·403plan without API access402not enough pages left (code: quota_*)415not a PDF ·422password-protected or over 100 pages502extraction failed — pages are not charged