REST API Reference
Convert OFX, QFX, QBO and PDF bank statements to JSON, Excel or CSV programmatically.
Overview
The OFXConverter REST API lets you convert bank statement files from your own applications. Send a file and receive the extracted transactions as structured JSON, or as a Base64-encoded Excel or CSV file. The API is available to accounts on a paid plan.
The API requires an active premium plan. Generate your API key from the profile page in your dashboard.
Base URL
All endpoints are relative to the following base URL. All requests must be made over HTTPS.
https://www.ofxconverter.com/api/v1
Authentication
Authenticate every request by sending your API key in the Authorization header. Use the raw key value with no Bearer prefix or scheme.
Authorization: YOUR_API_KEY
A request with a missing key returns NO_API_KEY; an invalid key, or a key that belongs to a non-premium account, returns UNAUTHORISED. Both are sent with HTTP 401.
Rate limits & quotas
Usage is bounded by your plan's monthly conversion quota: Start 500, Pro 1,500, Enterprise 5,000 conversions per month. The maximum file size is 10 MB. Uploaded and generated files are automatically deleted after about 30 minutes.
| Plan | Monthly conversions | Max file size |
|---|---|---|
| Start | 500 | 10 MB |
| Pro | 1,500 | 10 MB |
| Enterprise | 5,000 | 10 MB |
Endpoints
Requests that send a file use multipart/form-data. The optional output field selects the response format: csv or excel return the converted file as a Base64 string, while any other value (or omitting it) returns the extracted transactions as JSON.
post /api/v1/conversion
Convert an OFX, QFX or QBO file in a single request.
Request parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization | header | string | Yes | Your API key. |
file | form-data | file | Yes | .ofx, .qfx or .qbo, up to 10 MB. |
output | form-data | string | No | csv, excel, or omit for JSON. |
Example request
curl -X POST "https://www.ofxconverter.com/api/v1/conversion" \
-H "Authorization: YOUR_API_KEY" \
-F "file=@statement.ofx" \
-F "output=excel"
Example response (excel / csv)
{
"error": false,
"message": "SUCCESS",
"fileID": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"extension": "ofx",
"filename": "statement.ofx",
"convertedFile": "UEsDBBQABgAIAAAAIQ...=="
}
Example response (json)
{
"error": false,
"message": "SUCCESS",
"fileID": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"extension": "ofx",
"filename": "statement.ofx",
"convertedFile": {
"header": {
"status": "OK",
"language": "ENG",
"serverDate": "2024-01-31T00:00:00",
"bankName": "Bank of Example",
"currency": "USD",
"hasInvestiment": false
},
"bankAccount": {
"type": "CHECKING",
"agencyCode": "0001",
"bank": { "code": 1, "name": "Bank of Example" },
"accountCode": "1234567"
},
"status": "OK",
"initialDate": "2024-01-01T00:00:00",
"finalDate": "2024-01-31T00:00:00",
"transactions": [
{
"type": "DEBIT",
"date": "2024-01-05T00:00:00",
"value": -42.5,
"id": "202401050001",
"uniqueID": "202401050001",
"description": "Coffee Shop",
"checksum": 849302145,
"units": null,
"price": null,
"comission": null,
"secName": null,
"ticker": null
}
]
}
}
post /api/v1/upload
Store a file for later conversion. Returns a fileID you can pass to GET /api/v1/download. No conversion is performed at this step.
Request parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization | header | string | Yes | Your API key. |
file | form-data | file | Yes | .ofx, .qfx or .qbo, up to 10 MB. |
Example request
curl -X POST "https://www.ofxconverter.com/api/v1/upload" \
-H "Authorization: YOUR_API_KEY" \
-F "file=@statement.ofx"
Example response
{
"error": false,
"message": "SUCCESS",
"fileID": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"extension": "ofx",
"filename": "statement"
}
get /api/v1/download
Convert a file previously stored with POST /api/v1/upload. The file must belong to the authenticated account.
Request parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization | header | string | Yes | Your API key. |
fileID | query | string (GUID) | Yes | ID returned by /upload. |
output | query | string | No | csv, excel, or omit for JSON. |
Example request
curl "https://www.ofxconverter.com/api/v1/download?fileID=3f2504e0-4f89-41d3-9a0c-0305e82c3301&output=csv" \
-H "Authorization: YOUR_API_KEY"
Example response
The response body has the same shape as POST /api/v1/conversion. In addition to the authentication errors, download returns NO_FILE_ID when fileID is missing and FILE_NOT_FOUND when no matching file exists for your account (both with HTTP 401).
post /api/v1/pdf/conversion beta
Convert a PDF bank statement. Statements from supported banks are parsed directly; others fall back to OCR and AI extraction, so results may vary. This endpoint is experimental and may change.
Request parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Authorization | header | string | Yes | Your API key. |
file | form-data | file | Yes | .pdf, up to 10 MB. |
output | form-data | string | No | csv, excel, or omit for JSON. |
Example request
curl -X POST "https://www.ofxconverter.com/api/v1/pdf/conversion" \
-H "Authorization: YOUR_API_KEY" \
-F "file=@statement.pdf"
Example response (json)
{
"error": false,
"message": "SUCCESS",
"fileID": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"extension": "pdf",
"filename": "statement.pdf",
"convertedFile": {
"transactions": [
{
"date": "2024-01-05T00:00:00",
"value": -42.5,
"description": "Coffee Shop",
"type": "DEBIT"
}
]
}
}
Response schema
For JSON output, the OFX conversion and download endpoints return the extracted statement in convertedFile with the following structure.
| Field | Type | Description |
|---|---|---|
header.bankName | string | Bank name from the statement. |
header.currency | string | Statement currency (e.g. USD). |
header.serverDate | datetime | Date reported by the bank server. |
header.hasInvestiment | boolean | true when the statement contains investment transactions. |
bankAccount.type | string | Account type (e.g. CHECKING). |
bankAccount.bank.code | integer | Bank code. |
bankAccount.accountCode | string | Account number. |
initialDate / finalDate | datetime | Statement period. |
transactions[] | array | List of transactions (see below). |
transactions[].date | datetime | Transaction date. |
transactions[].value | number | Amount (negative for debits). |
transactions[].type | string | Transaction type. |
transactions[].description | string | Transaction description. |
transactions[].id | string | Transaction identifier from the file. |
transactions[].checksum | integer | Checksum used to detect duplicates. |
transactions[].units / price / comission | number | Investment fields; null for regular transactions. |
transactions[].secName / ticker | string | Security name and ticker for investment transactions. |
The PDF endpoint returns a simpler shape: convertedFile.transactions[] with date, value, description and type.
Error responses
Errors return a JSON body with "error": true and a message code. File-related errors also echo fileID, extension and filename.
{
"error": true,
"message": "FILE_NOT_SUPPORTED",
"fileID": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"extension": "txt",
"filename": "statement.txt"
}
| Message | HTTP status | Meaning |
|---|---|---|
NO_API_KEY | 401 | The Authorization header is missing. |
UNAUTHORISED | 401 | Invalid key, or the account is not premium. |
NO_FILE_ID | 401 | download was called without a fileID. |
FILE_NOT_FOUND | 401 | No file with that fileID exists for your account. |
FILE_NOT_UPLOADED | 400 | No file was included in the request. |
FILE_NOT_SUPPORTED | 400 | The file extension is not accepted by this endpoint. |
FILE_TOO_BIG | 400 | The file exceeds the 10 MB limit. |
BAD_FILE_FORMAT | 400 | The file could not be parsed (e.g. an invalid OFX file). |
SERVER_ERROR | 400 | An unexpected error occurred while processing the file. |