# Bank CSV & Excel to QBO, QFX, OFX Converter (Rowbridge) (`oqen/rowbridge-csv-to-qbo`) Actor

Convert bank or credit-card CSV/Excel statements into QuickBooks Web Connect (.qbo), Quicken (.qfx) or OFX files. Auto-detects columns, dates, decimals and debit/credit splits.

- **URL**: https://apify.com/oqen/rowbridge-csv-to-qbo.md
- **Developed by:** [oqen](https://apify.com/oqen) (community)
- **Categories:** Automation, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 file converteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bank CSV & Excel to QBO, QFX and OFX Converter

Convert **bank and credit-card statements exported as CSV or Excel** into files that accounting software imports directly:

- **QBO**: QuickBooks Web Connect (QuickBooks Desktop and QuickBooks Online "Upload from file")
- **QFX**: Quicken (Windows and Mac)
- **OFX** (1.x SGML or 2.x XML): Xero, GnuCash, Moneydance, MoneyMoney, Banktivity, YNAB-compatible tools, and most other personal-finance apps

The Actor uses the same conversion engine as the free [Rowbridge web converter](https://andrenunesjob.github.io/rowbridge/). It is built for **bulk and automated** work: point it at many statements at once, or call it from Make, Zapier, n8n, the Apify API, or an AI agent over MCP.

### Why use this CSV to QBO converter?

- **Detects columns automatically.** Finds the date, payee, memo, amount, split debit/credit columns, Dr/Cr flag columns, check numbers and running balance in English, German, Spanish, French, Dutch, Italian and Portuguese headers.
- **Handles real bank exports.** Covers preamble rows above the header; `,` `;` tab and `|` delimiters; `1.234,56` European decimals; `(123.45)` negatives; DD/MM vs MM/DD detection; Excel serial dates (including 1904 workbooks); and Windows-1252 encoding.
- **Produces stable FITIDs.** Re-importing an overlapping statement does not create duplicates in QuickBooks or Quicken.
- **Fixes Quicken error CC-885.** QBO/QFX files carry a configurable `INTU.BID` (3000 by default).
- **Takes the ledger balance** from the balance column when there is one, from your input, or from the net of the transactions.
- **Has no row limit.** Each input file produces one output file.

### Input

| Field | What it does |
|---|---|
| `files` | List of URLs to CSV/TSV/XLSX/XLS files (Dropbox/Drive direct links, S3 or any HTTPS URL) |
| `csvText` | Pasted CSV text instead of a URL |
| `format` | `qbo` (default), `qfx` or `ofx` |
| `ofxSyntax` | `sgml` (default) or `xml`, for OFX only |
| `accountType` | CHECKING, SAVINGS, CREDITCARD, MONEYMRKT, CREDITLINE |
| `accountId`, `bankId`, `currency`, `intuBid` | Header values the accounting app uses to match the account |
| `dateOrder`, `decimal` | `auto` by default; force them when a file is ambiguous |
| `flipSigns` | For card exports that list charges as positive numbers |
| `endingBalance` | Overrides the ledger balance |
| `includeFileContent` | Returns the QBO/OFX text inside the dataset item (useful for API and agent callers) |

Example:

```json
{
  "files": [{ "url": "https://example.com/statements/chase-september.csv" }],
  "format": "qbo",
  "accountType": "CHECKING",
  "accountId": "4321"
}
```

### Output

Each converted file is saved to the run's **key-value store** (for example `001-chase-september.qbo`). One **dataset item** per input file includes a download link and a reconciliation summary:

```json
{
  "source": "us-signed-amount.csv", "status": "ok", "format": "qbo",
  "outputKey": "001-us-signed-amount.qbo", "outputUrl": "https://api.apify.com/v2/key-value-stores/…/records/001-us-signed-amount.qbo",
  "transactions": 45, "dateFrom": "2026-01-02", "dateTo": "2026-03-12", "netAmount": -44009.59,
  "ledgerBalance": -44009.59, "ledgerSource": "net of transactions", "rowErrors": 0,
  "dateOrder": "MDY", "dateOrderAmbiguous": false, "decimalSeparator": ".",
  "columnMapping": { "date": "Date", "payee": "Description", "amount": "Amount" }
}
```

A file that cannot be downloaded or parsed returns `status: "error"` with a message, and the run moves on to the next file.

### Pricing

Pay per event. You are charged **$0.05 per converted file** (`file-converted`), and only after the output file is saved. Files that fail are not charged. A 500-row statement costs the same as a 5-row one.

### Privacy

Files are processed in memory inside your own Apify run. Nothing is sent to third parties. Outputs stay in your run's storage under your account's data-retention settings.

### FAQ

**Will QuickBooks Online accept the QBO?** Yes, through Banking → Upload transactions → "Upload from file".
**Can I convert PDF statements?** No. This Actor takes CSV and Excel files only. Export CSV from your online banking first.
**Can I import Excel files with several sheets?** Yes. Set `sheetName`; the first sheet is used by default.

*QuickBooks and Quicken are trademarks of their owners. This Actor is not affiliated with Intuit or Quicken Inc.*

# Actor input Schema

## `files` (type: `array`):

Direct links to CSV, TSV, XLSX or XLS bank/credit-card exports. One output file per input file.

## `csvText` (type: `string`):

Paste a CSV export directly instead of (or in addition to) URLs.

## `format` (type: `string`):

Output format.

## `ofxSyntax` (type: `string`):

Only used when format is OFX.

## `accountType` (type: `string`):

Account type.

## `accountId` (type: `string`):

Used so QuickBooks/Quicken match the file to the right account.

## `bankId` (type: `string`):

Routing / bank ID.

## `currency` (type: `string`):

Currency (ISO code).

## `intuBid` (type: `string`):

QBO/QFX only. 3000 works for most QuickBooks Desktop imports.

## `dateOrder` (type: `string`):

Date order.

## `decimal` (type: `string`):

Decimal separator.

## `flipSigns` (type: `boolean`):

Turn on if charges show as positive (common in credit-card exports).

## `endingBalance` (type: `string`):

Overrides the ledger balance; otherwise taken from a balance column or the net of transactions.

## `sheetName` (type: `string`):

Defaults to the first sheet.

## `includeFileContent` (type: `boolean`):

Handy for API/MCP callers who want the QBO/OFX text inline.

## Actor input object example

```json
{
  "files": [
    {
      "url": "https://andrenunesjob.github.io/rowbridge/samples/sample-bank-statement.csv"
    }
  ],
  "format": "qbo",
  "ofxSyntax": "sgml",
  "accountType": "CHECKING",
  "currency": "USD",
  "intuBid": "3000",
  "dateOrder": "auto",
  "decimal": "auto",
  "flipSigns": false,
  "includeFileContent": false
}
```

# Actor output Schema

## `results` (type: `string`):

One item per input file: source, status, outputKey, outputUrl (direct link to the converted file) and conversion summary (transaction count, dates, totals); error items have status=error and error.

## `files` (type: `string`):

Key-value store listing of the converted .qbo/.qfx/.ofx files (keys like 000-<name>.qbo); download each via the store records/<key> endpoint or the outputUrl in the dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "files": [
        {
            "url": "https://andrenunesjob.github.io/rowbridge/samples/sample-bank-statement.csv"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("oqen/rowbridge-csv-to-qbo").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "files": [{ "url": "https://andrenunesjob.github.io/rowbridge/samples/sample-bank-statement.csv" }] }

# Run the Actor and wait for it to finish
run = client.actor("oqen/rowbridge-csv-to-qbo").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "files": [
    {
      "url": "https://andrenunesjob.github.io/rowbridge/samples/sample-bank-statement.csv"
    }
  ]
}' |
apify call oqen/rowbridge-csv-to-qbo --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oqen/rowbridge-csv-to-qbo"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/YwX1pj4n1Ss8TrhHk/builds/UajePcAHmqyeJx9jc/openapi.json
