xlsRowvert
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: true on 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 is pass, warn, fail or info. 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

Errors