201Successful Response
Schema: SuccessEnvelope_BulkTransactionUploadResponse_
successbooleanmessagestringcodestringdataBulkTransactionUploadResponse
/api/v1/transactions/bulk-uploadUpload historical transactions from a CSV/Excel file to a new source account.
Workflow (via Temporal for durability):
Supported File Formats: .csv, .xlsx, .xls
CSV/Excel Columns (flexible naming):
VALIDATION_570, nothing
imported) unless allow_unmatched_categories is true, which imports those
rows to Uncategorized. Rows are never dropped.Returns: Workflow ID and status. The upload runs in the background via Temporal. If interrupted, the workflow will resume from where it left off.
Bearer token authentication. Pass your DayZero API token in the Authorization header and the target business UUID in x-business-id.
Schema: BulkTransactionUploadRequest
ledger_idstringOptional: UUID of existing ledger to use. If provided, ledger creation is skipped and ledger_name/ledger fields are ignored.
ledger_namestringDisplay name for the new ledger (required if ledger_id not provided, e.g., 'My Old Credit Card XXXX')
source_account_namestringOptional: Display name for the source account. Defaults to ledger name if not provided.
business_personalstringWhether the source account is a business or personal account. 'business' (default) for company transactions, 'personal' for owner draws/contributions.
invert_transaction_amountsbooleanIf true, transaction amounts are inverted during import. Useful when CSV has opposite sign convention.
s3_keystringrequiredS3 key of the CSV file containing transactions
start_datestring · dateOptional: Only upload transactions on or after this date (YYYY-MM-DD). Filters transactions before upload.
end_datestring · dateOptional: Only upload transactions on or before this date (YYYY-MM-DD). Filters transactions before upload.
check_duplicatesbooleanIf true, checks for duplicate transactions before uploading. Duplicates are skipped.
duplicate_match_fieldsarray · stringFields to use for duplicate detection: 'amount', 'date', 'description'. Defaults to all three.
skip_categorizationbooleanIf true, skip post-upload bank rules and AI categorization. Journal entries still post during import — to the mapped category column when provided, otherwise to Uncategorized Expense/Income. Only honored on the local accounting engine.
generate_bank_rulesbooleanIf true (default), learn bank rules from the categorized transactions so future transactions auto-categorize. Ignored when skip_categorization is true.
currencystringCurrency for this account (USD, CAD, AUD, EUR, or GBP). Defaults to business default.
editablebooleanIf true, journal entries can be manually posted to this account.
typestringAccount type: asset, liability, equity, revenue, expense. Required in Custom Mode.
descriptionstringOptional description of the account's purpose.
statusstringAccount status: 'active' or 'inactive'. Inactive accounts hidden from dropdowns.
debit_creditstringNormal balance: 'debit' (assets/expenses) or 'credit' (liabilities/equity/revenue). Required in Custom Mode.
sort_codestringSort code for chart ordering (e.g., '1000' for assets, '4000' for revenue). Required in Custom Mode.
sub_typestringSub-classification (current_assets, operating_expenses, etc.). Required in Custom Mode.
report_cash_flowbooleanInclude in cash flow statement. Required in Custom Mode.
financial_account_typestringTemplated Mode: bank_account, credit_card, payments, payroll, loan, prepaid_card, accounts_receivable, accounts_payable.
parent_idstringUUID of parent ledger for sub-accounts (e.g., 'Operating Expenses' → 'Office Supplies').
column_mappingobjectUser-supplied mapping from DayZero field names to CSV column names. Keys: 'date', 'amount', 'description', and optional 'category' (aliases: ledger, ledger_name, account, account_name, category_name). Values: the CSV header to use. When provided, auto-detection is skipped.
only_missing_from_diffbooleanIf true, compare the file with ledger_id first (the same diff as POST /transactions/bulk-upload/diff, re-run now) and import only the rows missing from the ledger. Ambiguous rows (same amount, nothing else agrees) are NOT imported — list them in include_row_numbers instead. Requires ledger_id; the exact-match duplicate check is skipped because the diff already did it.
include_row_numbersarray · integerImport only these spreadsheet rows (header = row 1, first data row = 2), e.g. the diff's missing_row_numbers plus any ambiguous rows you checked. The exact-match duplicate check is skipped.
date_tolerance_daysintegeronly_missing_from_diff: days a ledger date may differ from the file's (default 3).
status_columnstringonly_missing_from_diff: header of the file's settled/pending status column (auto-detected from status/transaction_status/state when omitted).
exclude_statusesarray · stringSkip file rows whose status is one of these, case-insensitive (e.g. ['Pending']). Applies to only_missing_from_diff.
allow_unmatched_categoriesbooleanRows whose category names no ledger are refused by default (400 VALIDATION_570, nothing imported, every row listed with the nearest ledger names). Set true to import them to Uncategorized instead. A blank category is not affected.
Schema: SuccessEnvelope_BulkTransactionUploadResponse_
successbooleanmessagestringcodestringdataBulkTransactionUploadResponseSchema: ErrorResponse
errorstringrequiredError category: validation_error, unauthorized, forbidden, not_found, conflict, rate_limited, server_error, or service_unavailable.
messagestringrequiredHuman-readable explanation, safe to show to end users.
codestringrequiredStable machine-readable code in CATEGORY_NNN form (e.g. NOT_FOUND_006, AUTH_010, GEN_002).
request_idstringCorrelation id for support requests. Echoes the x-request-id request header when one was supplied.
errorsobjectField-level validation messages keyed by field name. Present on 400/422 validation failures only.
Schema: ErrorResponse
errorstringrequiredError category: validation_error, unauthorized, forbidden, not_found, conflict, rate_limited, server_error, or service_unavailable.
messagestringrequiredHuman-readable explanation, safe to show to end users.
codestringrequiredStable machine-readable code in CATEGORY_NNN form (e.g. NOT_FOUND_006, AUTH_010, GEN_002).
request_idstringCorrelation id for support requests. Echoes the x-request-id request header when one was supplied.
errorsobjectField-level validation messages keyed by field name. Present on 400/422 validation failures only.
Schema: ErrorResponse
errorstringrequiredError category: validation_error, unauthorized, forbidden, not_found, conflict, rate_limited, server_error, or service_unavailable.
messagestringrequiredHuman-readable explanation, safe to show to end users.
codestringrequiredStable machine-readable code in CATEGORY_NNN form (e.g. NOT_FOUND_006, AUTH_010, GEN_002).
request_idstringCorrelation id for support requests. Echoes the x-request-id request header when one was supplied.
errorsobjectField-level validation messages keyed by field name. Present on 400/422 validation failures only.
Schema: ErrorResponse
errorstringrequiredError category: validation_error, unauthorized, forbidden, not_found, conflict, rate_limited, server_error, or service_unavailable.
messagestringrequiredHuman-readable explanation, safe to show to end users.
codestringrequiredStable machine-readable code in CATEGORY_NNN form (e.g. NOT_FOUND_006, AUTH_010, GEN_002).
request_idstringCorrelation id for support requests. Echoes the x-request-id request header when one was supplied.
errorsobjectField-level validation messages keyed by field name. Present on 400/422 validation failures only.