Transaction Object
A Transaction represents a single financial movement in an account, such as a purchase, transfer, payment, or deposit. Transactions include amount, description, category, and settlement status.
Attributes
| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier for the transaction. Format: txn_ULID |
| accountId | string | ID of the parent account |
| amount | number | Transaction amount in the smallest currency unit. Negative for debits (purchases, payments, withdrawals), positive for credits (deposits, refunds, incoming transfers) |
| currency | string | ISO 4217 currency code (e.g., CLP, USD) |
| description | string | Transaction description as provided by the bank. May include merchant name, reference numbers, or transfer details |
| category | string | null | Transaction category. Possible values: groceries, utilities, transport, entertainment, health, transfer, payment, income, other |
| details | object | null | The extra detail the institution itself reports for this movement — typically what it shows on the transaction receipt. See Transaction details below |
| transactionDate | string | Date when the transaction occurred, in ISO 8601 format. Time component is typically 00:00:00.000Z as banks usually provide date-only precision |
| status | string | Settlement status: pending (not yet settled, may change or be reversed) or posted (settled and finalized) |
| createdAt | string | ISO 8601 timestamp when the transaction was first synced to Araucaria |
| previousTransactionId | string | undefined | Id of the transaction this one replaced. Present only when a pending transaction on a Plaid-linked connection posted — see Plaid Pending → Posted Transactions |
Amount Sign Convention
Transaction amounts follow standard accounting conventions:
- Negative amounts (-) represent money leaving the account: purchases, bill payments, outgoing transfers, fees
- Positive amounts (+) represent money entering the account: deposits, refunds, incoming transfers, interest
Transaction Status
pending- Transaction is authorized but not yet settled. Amount may change (e.g., tip added) or transaction may be reversedposted- Transaction has been settled and is final. Will not change unless a separate reversal transaction occurs
previousTransactionId on the new row is your only link back to
it. See Plaid Pending → Posted Transactions for the
recommended way to handle this.
Example
{
"id": "txn_01HQ3K5J7X8Y9Z0A1B2C3D4E5F",
"accountId": "acc_01HQ3K5J7X8Y9Z0A1B2C3D4E5F",
"amount": -137900,
"currency": "CLP",
"description": "Enel",
"category": "utilities",
"transactionDate": "2024-01-15T00:00:00.000Z",
"status": "posted",
"createdAt": "2024-01-15T10:30:00Z"
}
Example: Plaid Pending → Posted
A posted transaction that promoted a Plaid pending transaction carries
previousTransactionId:
{
"id": "txn_01HQ3K5J7X8Y9Z0A1B2C3D4E7H",
"accountId": "acc_01HQ3K5J7X8Y9Z0A1B2C3D4E5F",
"amount": -450,
"currency": "USD",
"description": "Coffee Shop",
"transactionDate": "2024-01-16",
"status": "posted",
"createdAt": "2024-01-16T09:15:00Z",
"previousTransactionId": "txn_01HQ3K5J7X8Y9Z0A1B2C3D4E5G"
}
Transaction details
Institutions report more about a movement than an amount and a description.
details carries that extra reporting through unchanged — for many
institutions it is the same set of fields shown on the transaction receipt,
such as who the counterparty was, which institution and account the funds came
from, and the time of day the movement was made.
{
"id": "txn_01HQ3K5J7X8Y9Z0A1B2C3D4E5F",
"amount": 250000,
"description": "Transferencia recibida de Comercial Ejemplo SpA",
"transactionDate": "2024-01-15",
"details": {
"v": 1,
"source": "cl_banco_bci_pyme",
"fields": [
{ "key": "fecha_de_transferencia", "label": "Fecha de transferencia", "value": "14/01/2024" },
{ "key": "hora_de_transferencia", "label": "Hora de transferencia", "value": "18:42" },
{ "key": "fecha_contable", "label": "Fecha contable", "value": "15/01/2024" },
{ "key": "rut_origen", "label": "Rut Origen", "value": "76123456-7" },
{ "key": "razon_social", "label": "Razon Social", "value": "COMERCIAL EJEMPLO SPA" },
{ "key": "banco_origen", "label": "Banco Origen", "value": "Banco de Chile" }
]
}
}
The envelope
| Field | Type | Description |
|---|---|---|
| v | number | Envelope version. Incremented only for a breaking change to this shape |
| source | string | The institution whose vocabulary fields uses. Lets you branch on the institution without looking up the connection |
| fields | array | The detail fields, ordered as the institution returned them — so rendering them in order mirrors how the institution presents the receipt |
| fields[].key | string | Stable key to match on, derived from the institution's own label |
| fields[].label | string | The institution's own label, suitable for display |
| fields[].value | string | number | boolean | The value exactly as the institution reported it |
Four things to code for
-
Every field is optional, and
detailsitself may be null. What appears depends on the movement, not just the institution: a transfer carries counterparty fields that a fee or interest row does not. Never assume a key is present. - Values are passed through verbatim. We do not reformat them, so formats follow whatever the institution reports and can differ between two keys on the same transaction. Check each key's documented format in the per-institution reference before parsing.
- Keys derive from the institution's own labels. They are stable in practice but best-effort by contract — if an institution renames a label, its key changes with it. Some institutions use different labels for the same idea depending on the movement type, so you may need to check more than one key.
-
There is no backfill. Transactions synced before this field existed have
details: nullpermanently. A connection starts populating it on its next sync.