{
"id": "trx_bC9k2QwXz7Ap",
"type": "breb_credit",
"account_id": "acc_SecondaryM01",
"amount": 500000,
"previous_balance": 0,
"current_balance": 500000,
"currency": "cop",
"credit_debit_type": "credit",
"transaction_date": "2026-08-19T14:02:10Z",
"created_at": "2026-08-19T14:02:11Z",
"metadata": {
"key_value": "@MERCHANTONE",
"sender_name": "JOHN DOE"
}
}accounts.balance.credit (secondary).{
"id": "mm_sWp84LtRq2Nx",
"external_id": "trx_bC9k2QwXz7Ap",
"geo": "col",
"status": {
"state": "completed",
"code": "",
"description": ""
},
"source_id": "acc_SecondaryM01",
"destination_id": "acc_PrimaryCOP01",
"currency": "cop",
"amount": 500000,
"created_at": "2026-08-19T14:02:12Z",
"updated_at": "2026-08-19T14:02:14Z"
}money_movements.status.completed. Its external_id carries the transaction ID of the original credit — this is the hop that ties the automatic movement back to the collection that triggered it.{
"id": "trx_sD3fGh81pQr",
"type": "col_cb_debit",
"account_id": "acc_SecondaryM01",
"amount": -500000,
"previous_balance": 500000,
"current_balance": 0,
"currency": "cop",
"credit_debit_type": "debit",
"transaction_date": "2026-08-19T14:02:13Z",
"created_at": "2026-08-19T14:02:14Z",
"metadata": {
"money_movement_id": "mm_sWp84LtRq2Nx"
}
}accounts.balance.debit (secondary).{
"id": "trx_pC7mNw92Ldz",
"type": "col_cb_credit",
"account_id": "acc_PrimaryCOP01",
"amount": 500000,
"previous_balance": 1200000,
"current_balance": 1700000,
"currency": "cop",
"credit_debit_type": "credit",
"transaction_date": "2026-08-19T14:02:14Z",
"created_at": "2026-08-19T14:02:15Z",
"metadata": {
"money_movement_id": "mm_sWp84LtRq2Nx"
}
}accounts.balance.credit (primary). This is the leg that confirms the funds are consolidated.accounts.balance.credit, you receive credits for all balances, primary and secondary alike. Distinguish them by content.account_id, not by the event key.| Object | Correlation field | Value |
|---|---|---|
| Original credit Transaction | — | its own id |
| Automatic Money Movement | external_id | the original credit Transaction's id |
| Secondary debit Transaction | metadata.money_movement_id | the automatic Money Movement's id |
| Primary credit Transaction | metadata.money_movement_id | the automatic Money Movement's id |
money_movement_id already tracks the original credit and both automatic legs — there's no separate external_id hop to resolve.metadata.money_movement_id. See Payouts Reconciliation.| Type | Meaning |
|---|---|
col_cb_debit | A Colombian Cobre Balance is debited to transfer funds to another Cobre Balance |
col_cb_credit | A Colombian Cobre Balance receives a credit from another Cobre Balance |
col_debit | Outbound transaction to a Colombian financial institution (e.g. a local payout from the primary account) |
col_credit | Inbound transaction from a Colombian financial institution (e.g. a rejected payout returning to the primary account) |
col_cb_debit and the corresponding primary credit is col_cb_credit.spei_credit on the secondary, the automatic Money Movement, spei_debit on the secondary, and spei_credit on the primary.accounts.balance.credit filtered to the secondary account_id) tells you a payment arrived for a given merchant — book the collection here.accounts.balance.credit filtered to the primary account_id) tells you the funds are consolidated.account_id.| Situation | Behavior |
|---|---|
| A credit was received on a secondary balance before linkage was configured for it | Not swept retroactively — it must be moved manually. |
| The automatic Money Movement fails | Funds stay on the secondary balance; there is no automatic retry. |
| A payout from the primary account completes and later transitions to a late rejection | Not auto-reversed. Issue a refund as a new Money Movement from the primary account — it isn't linked back to the original transaction. |
| A payout from the primary account is rejected | Funds return to the primary account as a credit Transaction, with a money_movements.status.rejected event. |
| Cobre Balance creation | No webhook exists for it — confirm via the creation response or by polling the account. |
| Distinguishing an FX leg from a local movement | An FX-related Money Movement carries fx_quote information in its metadata; local movements don't. |
POST /money_movements
{
"source_id": "acc_SecondaryM01",
"destination_id": "acc_PrimaryCOP01",
"amount": 500000,
"external_id": "manual-sweep-acc_SecondaryM01-2026-08-19",
"metadata": {
"description": "Secondary to Primary manual sweep"
},
"checker_approval": false
}external_id (automatic sweeps) or your own reference (manual sweeps), and a status.external_id on the automatic Money Movement, metadata.money_movement_id on both resulting Transactions — and confirm both are populated for your geography before relying on them.external_id and metadata.money_movement_id.