---
title: "Push bank transactions for a customer_api account"
method: POST
path: "/public/v2/bank-connections/accounts/{financial_account_id}/transactions/"
tags: ["Bank Connections"]
---

# Push bank transactions for a customer_api account

`POST /public/v2/bank-connections/accounts/{financial_account_id}/transactions/`

## Request

- Base URL: `https://api.dualentry.com`
- URL: `https://api.dualentry.com/public/v2/bank-connections/accounts/{financial_account_id}/transactions/`
- Auth: none declared

Batch upsert bank-feed transactions for a registered `customer_api` account
identified by DualEntry financial account id.

Idempotency key is transaction `external_trx_id` (stored as source_id) scoped to
the organization with `customer_api` as `source_type`. Each item must include
`account_id` matching the registered customer account key. One bad item does
not roll back other items; the response lists per-item outcomes.

Registration must be active (not unregistered). Max batch size is 250.

**Side effects**
- If at least one transaction saves, DualEntry sets the connection `last_sync_at`, and sets `successfully_aggregated_at` when that is empty.

## Path parameters

- `financial_account_id` integer, required

## Headers

- `Idempotency-Key` string

## Request body

- PublicCustomerApiTransactionBatchIn
  - `transactions` PublicCustomerApiTransactionIn[], required: Batch of transactions to upsert. Max 250 items per request.
    - `external_trx_id` string, required: Customer idempotency key for this transaction (maps to `source_id`).
    - `account_id` string, required: Customer-supplied account key from registration; must match the path account.
    - `date` string, date-time, required: Pending/transaction date (required; used when `posted_at` is `null`).
    - `amount` union, required: Signed amount. Positive = debit (money in), negative = credit (money out).
      - number
      - string
    - `description` string, required: Transaction description. Empty string is allowed.
    - `is_posted` boolean, required: Whether the transaction is posted (true) or pending (false).
    - `posted_at` string, date-time, nullable: Posting date when known.
    - `counterparty` string, nullable: Payee/merchant name; mapped into Bank Match payee path.

## Response `200`

OK

- PublicCustomerApiTransactionBatchOut
  - `success` boolean, required
  - `results` PublicCustomerApiTransactionResultOut[], required
    - `external_trx_id` string, required
    - `status` string, required: created | updated | error
    - `id` integer, nullable
    - `error` object, nullable

## Other responses

- `404`: Not Found
- `409`: Conflict
- `422`: Unprocessable Content

## Changes

- **2026-09-29** `4b2d6ee0dff6`: 6 info
  - added the optional property `error_code` to the response with the `404` status
  - added the optional property `error_code` to the response with the `409` status
  - added the optional property `error_code` to the response with the `422` status
  - added the optional property `error_reason` to the response with the `404` status
  - …2 more
- **2026-08-19** `f338ec8b3f52`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/dualentry/apis/dualentry-public-api/changes/public/v2/bank-connections/accounts/:financial_account_id/transactions/post.md)

---

[API](https://skmtc.dev/dualentry/apis/dualentry-public-api.md) · [All operations](https://skmtc.dev/dualentry/apis/dualentry-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dualentry/apis/dualentry-public-api/revisions/410c299ab3bb?raw)
