> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trycherry.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Push your own transactions

> Create bank accounts and push transactions without connecting Plaid.

If you don't want to connect a bank feed — or your bank isn't supported — you can create accounts and push transactions yourself. They flow through the same pipeline as connected accounts: Cherry categorizes them, books journal entries, and includes them in your statements.

Both endpoints require a `write` key.

## 1. Create the accounts

One call per institution, up to 20 accounts at a time. Re-posting the same institution updates it in place — this call is safe to repeat.

```bash theme={null}
curl -X POST https://api.trycherry.ai/v1/bank-accounts \
  -H "Authorization: Bearer ck_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "institutionName": "Chase",
    "accounts": [
      {
        "externalId": "chk-1",
        "name": "Business Checking",
        "kind": "checking",
        "currency": "USD",
        "openingBalance": 12500.00,
        "openingBalanceDate": "2026-01-01"
      }
    ]
  }'
```

`externalId` is your identifier for the account — you'll reference it when pushing transactions. The opening balance is posted to the ledger at its declared date, once.

## 2. Push transactions

Up to 1,000 per request, 5 MB max body.

```bash theme={null}
curl -X POST https://api.trycherry.ai/v1/transactions \
  -H "Authorization: Bearer ck_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "institutionName": "Chase",
    "transactions": [
      {
        "accountExternalId": "chk-1",
        "id": "txn-001",
        "date": "2026-08-15",
        "amount": 49.99,
        "description": "Figma subscription",
        "merchant": "Figma"
      }
    ]
  }'
```

```json theme={null}
{ "data": { "received": 1, "imported": 1, "deduplicated": 0 } }
```

<Note>
  **Sign convention:** positive is money out, negative is money in. A \$2,000 customer payment received is `-2000.00`.
</Note>

### Idempotency

Give each transaction a stable `id` from your system and re-sends become no-ops. If you omit `id`, Cherry derives one from date, amount, and description — identical rows still dedupe, but two genuinely distinct transactions with identical date, amount, and description would collapse, so supplying your own `id` is better.

## 3. Cherry does the accounting

Categorization and journal-entry booking run asynchronously, usually within minutes. You'll see results appear on the pushed rows:

```bash theme={null}
curl "https://api.trycherry.ai/v1/transactions?from=2026-08-01" \
  -H "Authorization: Bearer ck_live_…"
```

If a categorization is wrong, correct it — Cherry remembers the correction for future transactions from the same merchant:

```bash theme={null}
curl -X PATCH https://api.trycherry.ai/v1/transactions/{id} \
  -H "Authorization: Bearer ck_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "category": "6110" }'
```

Valid category values are the account numbers from `GET /v1/accounts` (see the API Reference tab), plus `"transfer"` for internal transfers between your own accounts.
