Authenticate
Exchange API credentials for a short-lived Bearer token (~20 minutes). Reuse the same token string on every later call in this flow.
| Content-Type | application/json |
{ "user_id": "cli_acct_co01",User IDiAPI client user id used to obtain the access token. "secret": "sk_live_Acct9pQ2rL"SecretiAPI client secret paired with user_id for authentication.}{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH",Access TokeniShort-lived bearer token. Attach as Authorization: Bearer on later calls. "type": "Bearer",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "expiration_time": 1200Expiration TimeiToken lifetime in seconds.}Subscribe to Platform Events
Register webhooks for balance credits/debits (Transfer-In funding and AR collections), Money Movement status, and Bulk Money Movement progress. Verify each delivery with HMAC-SHA256.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH |
| Content-Type | application/json |
{ "url": "https://accounting.example.co/webhooks/cobre",Notification URLiHTTPS URL used by this resource (e.g. webhook endpoint). "description": "Embedded finance lifecycle",DescriptioniHuman-readable label or note. "events": [EventsiList of webhook event types this subscription listens to. "accounts.balance.credit", "accounts.balance.debit", "money_movements.status.initiated", "money_movements.status.processing", "money_movements.status.completed", "money_movements.status.failed", "money_movements.status.rejected", "bulk_money_movements.status.validating", "bulk_money_movements.status.processing", "bulk_money_movements.status.completed", "bulk_money_movements.status.failed" ], "event_signature_key": "WHacct9xZ"Signature keyiSecret you set on the subscription; Cobre uses it to HMAC-SHA256-sign deliveries (verify via event-signature + event-timestamp headers).}{ "id": "sub_AcctFin01",IdiUnique Cobre identifier for this resource. "url": "https://accounting.example.co/webhooks/cobre",Notification URLiHTTPS URL used by this resource (e.g. webhook endpoint). "description": "Embedded finance lifecycle",DescriptioniHuman-readable label or note. "events": [EventsiList of webhook event types this subscription listens to. "accounts.balance.credit", "accounts.balance.debit", "money_movements.status.initiated", "money_movements.status.processing", "money_movements.status.completed", "money_movements.status.failed", "money_movements.status.rejected", "bulk_money_movements.status.validating", "bulk_money_movements.status.processing", "bulk_money_movements.status.completed", "bulk_money_movements.status.failed" ], "event_signature_key": "******9xZ",Signature keyiSecret you set on the subscription; Cobre uses it to HMAC-SHA256-sign deliveries (verify via event-signature + event-timestamp headers). "created_at": "2026-06-10T09:00:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).}Create Customer Cobre Balance
When a new customer is onboarded on your platform, provision a dedicated Colombia Cobre Balance — the funding source for their invoice and payroll payouts.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH |
| Content-Type | application/json |
{ "provider_id": "pr_col_cobre",ProvideriCobre field at "provider_id" in this payload. "action": "create",ActioniCobre field at "action" in this payload. "alias": "Customer Acme Contadores"AliasiDisplay name that helps identify it and clarify its purpose.}{ "id": "acc_AcctCust01",IdiUnique Cobre identifier for this resource. "provider_id": "pr_col_cobre",ProvideriCobre field at "provider_id" in this payload. "provider_name": "Cobre Balance Colombia",Provider NameiCobre field at "provider_name" in this payload. "connectivity": {ConnectivityiConnection/registration status for keys or accounts. "status": "connected",StatusiLifecycle status object for the resource or movement. "description": ""DescriptioniHuman-readable label or note. }, "alias": "Customer Acme Contadores",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "available_services": [Available ServicesiCobre field at "metadata.available_services" in this payload. "mm_push_from_account" ] }, "account_number": "",Account NumberiBank account or CLABE number for the counterparty. "account_type": "Cobre Balance",Account TypeiCobre field at "account_type" in this payload. "obtained_balance": 0,Obtained BalanceiCobre field at "obtained_balance" in this payload. "obtained_balance_at": "2026-06-10T09:10:00Z",Obtained Balance AtiCobre field at "obtained_balance_at" in this payload. "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "tags": [],TagsiCobre field at "tags" in this payload. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "created_at": "2026-06-10T09:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-06-10T09:10:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Create Transfer-In Account Reference
Create a Transfer-In account reference linked to the customer's Cobre Balance. Share the collection account details with the customer (and their debtors for AR) so inbound bank transfers credit the balance automatically.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH |
| Content-Type | application/json |
{ "source_id": "acc_AcctCust01",Cobre BalanceiCobre id of the source account or counterparty. "type": "transfer_acc",Reference typeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "alias": "Acme Contadores Transfer-In",AliasiDisplay name that helps identify it and clarify its purpose. "provider_id": "pr_col_1066"Collection bank provideriColombian bank provider for the Transfer Account (e.g. pr_col_1066).}{ "id": "ref_TransferIn01",IdiUnique Cobre identifier for this resource. "alias": "Acme Contadores Transfer-In",AliasiDisplay name that helps identify it and clarify its purpose. "type": "transfer_acc",Reference typeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "value": "291000123",ValueiCobre field at "value" in this payload. "source_id": "acc_AcctCust01",Cobre BalanceiCobre id of the source account or counterparty. "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "connectivity": {ConnectivityiConnection/registration status for keys or accounts. "status": "enabled",StatusiLifecycle status object for the resource or movement. "description": ""DescriptioniHuman-readable label or note. }, "metadata": {MetadataiCustom key-value metadata attached to the resource. "account_type": "cc",Account TypeiCobre field at "metadata.account_type" in this payload. "account_holder_id": "901549492",Account Holder IdiCobre field at "metadata.account_holder_id" in this payload. "account_holder_id_type": "NIT",Account Holder Id TypeiCobre field at "metadata.account_holder_id_type" in this payload. "provider_id": "pr_col_1066"Provider IdiCobre field at "metadata.provider_id" in this payload. }, "created_at": "2026-06-10T09:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-06-10T09:15:05Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Fund via Transfer-In
The customer transfers from any bank to their Transfer-In collection account. Cobre credits the Cobre Balance with a transfer_credit transaction — no Money Movement. The same account reference supports accounts-receivable collections from debtors.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH |
{ "total_items": 1,Total ItemsiTotal items matching the query across all pages. "total_pages": 1,Total PagesiNumber of pages in this result set. "is_last_page": true,Is Last PageiTrue when this is the final page of results. "page_items": 1,Page ItemsiNumber of items returned on this page. "contents": [ContentsiArray of result objects for this page. { "id": "trx_TopUp77012",Transaction IDiUnique Cobre identifier for this resource. "type": "transfer_credit",Transaction typeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "account_id": "acc_AcctCust01",Account IdiCobre Balance account id affected by the event. "amount": 50000000,Amount creditedi50000000 cents = $500,000.00 COP. "previous_balance": 0,Previous BalanceiCobre field at "contents.0.previous_balance" in this payload. "current_balance": 50000000,Current BalanceiCobre field at "contents.0.current_balance" in this payload. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "credit_debit_type": "credit",Credit Debit Typeicredit = funds in; debit = funds out. "transaction_date": "2026-06-10T11:20:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-06-10T11:20:01Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "reference": "0038212345",ReferenceiPayment reference echoed in metadata for reconciliation. "sender_name": "Acme Contadores SAS",Sender NameiMetadata field "sender_name" attached to the resource. "sender_id": "901549492",Sender IdiMetadata field "sender_id" attached to the resource. "sender_bank_code": "1066",Sender Bank CodeiMetadata field "sender_bank_code" attached to the resource. "tracking_key": "291000003C6051234567",Tracking KeyiBre-B tracking key for the payment. "description": "Transfer-In top up",DescriptioniHuman-readable label or note. "account_reference": "291000123"Account referenceiTransfer-In reference value — primary reconciliation key for payins. } } ]}Webhook delivered
accounts.balance.creditFires when a Transfer-In transfer credits the customer's Cobre Balance. Update available balance and reconcile using metadata.account_reference (and amount/date). Same event applies when a debtor pays an accounts-receivable invoice to the Transfer-In account.
| Content-Type | application/json |
{ "id": "ev_AcctTopUp01",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T11:20:01Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "trx_TopUp77012",IdiUnique Cobre identifier for this resource. "type": "transfer_credit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "amount": 50000000,AmountiAmount in cents — the last two digits are decimals. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "date": "2026-06-10T11:20:00Z",DateiTimestamp when the balance transaction was posted (ISO 8601, UTC) — used in accounts.balance.* webhook notifications. "metadata": {MetadataiCustom key-value metadata attached to the resource. "reference": "0038212345",ReferenceiPayment reference echoed in metadata for reconciliation. "sender_name": "Acme Contadores SAS",Sender NameiMetadata field "sender_name" attached to the resource. "sender_id": "901549492",Sender IdiMetadata field "sender_id" attached to the resource. "sender_bank_code": "1066",Sender Bank CodeiMetadata field "sender_bank_code" attached to the resource. "tracking_key": "291000003C6051234567",Tracking KeyiBre-B tracking key for the payment. "description": "Transfer-In top up",DescriptioniHuman-readable label or note. "account_reference": "291000123"Account ReferenceiTransfer-In reference number used to reconcile incoming deposits. }, "account_id": "acc_AcctCust01",Account IdiCobre Balance account id affected by the event. "previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 50000000,Current BalanceiCobre field at "content.current_balance" in this payload. "credit_debit_type": "credit"Credit Debit Typeicredit = funds in; debit = funds out. }}Reconcile the Transfer-In Credit
Match the balance credit to your customer's ledger using account_reference and transaction id. No Money Movement exists — reconciliation is transaction-level.
Mapping the webhook payload from an earlier step onto Customer ledger. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Customer ledger field | |
content.metadata.account_reference 291000123 |
→ | transfer_in_reference Primary join key for Transfer-In payins and AR collections. |
content.id trx_TopUp77012 |
→ | cobre_transaction_id |
content.amount 50000000 |
→ | credited_amount_cents |
content.account_id acc_AcctCust01 |
→ | customer_balance_id |
Create Vendor Counterparty
Register the invoice vendor as a bank-account counterparty (cc/ch/dp) before paying. Optionally run Account Verification to confirm ownership on first payout.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH |
| Content-Type | application/json |
{ "geo": "col",GeographyiGeography code (e.g. col = Colombia, mex = Mexico). "type": "cc",Account typeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "alias": "Papeleria Central - vendor",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "counterparty_fullname": "Papeleria Central SAS",Vendor nameiLegal or display name of the counterparty beneficiary. "beneficiary_institution": "1007",Bank codeiBank or institution code for the destination account. "account_number": "1013559999",Account numberiBank account or CLABE number for the counterparty. "counterparty_id_type": "nit",ID typeiType of identification document for the counterparty (e.g. nit, cc, rfc). "counterparty_id_number": "9004455667"ID numberiIdentification number for the counterparty. }}{ "id": "cp_VendorInv01",IdiUnique Cobre identifier for this resource. "geo": "col",GeographyiGeography code (e.g. col = Colombia, mex = Mexico). "type": "cc",Account typeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "alias": "Papeleria Central - vendor",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "counterparty_fullname": "Papeleria Central SAS",Vendor nameiLegal or display name of the counterparty beneficiary. "beneficiary_institution": "1007",Bank codeiBank or institution code for the destination account. "account_number": "1013559999",Account numberiBank account or CLABE number for the counterparty. "counterparty_id_type": "nit",ID typeiType of identification document for the counterparty (e.g. nit, cc, rfc). "counterparty_id_number": "9004455667",ID numberiIdentification number for the counterparty. "registered_account": falseRegistered AccountiCobre field at "metadata.registered_account" in this payload. }, "created_at": "2026-06-10T12:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-06-10T12:00:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Pay the Invoice
Pay a caused invoice from the customer's Cobre Balance. Cobre routes over Fast Pay when supported, otherwise ACH. Set external_id to the invoice id and reuse the idempotency header on retries (valid 24h).
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH |
| Content-Type | application/json |
| idempotency | acct_inv_8842 |
{ "source_id": "acc_AcctCust01",Customer balanceiCobre id of the source account or counterparty. "destination_id": "cp_VendorInv01",Vendor counterpartyiCobre id of the destination account or counterparty. "amount": 2000000,Amount (cents)i2000000 cents = $20,000.00 COP. "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Invoice 8842 payment"DescriptioniHuman-readable label or note. }, "external_id": "invoice_8842"External ID (invoice)iYour own reference echoed by Cobre for reconciliation.}{ "id": "mm_InvoicePay01",IdiUnique Cobre identifier for this resource. "status": {StatusiLifecycle status object for the resource or movement. "state": "initiated",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable detail for the current status. }, "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Invoice 8842 payment"DescriptioniHuman-readable label or note. }, "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "external_id": "invoice_8842",External ID (invoice)iYour own reference echoed by Cobre for reconciliation. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint. "type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_AcctCust01",Customer balanceiCobre id of the source account or counterparty. "destination_id": "cp_VendorInv01",Vendor counterpartyiCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 2000000,Amount (cents)i2000000 cents = $20,000.00 COP. "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-06-10T12:05:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Webhook outcomes — Money movement
Invoice payout completed — mark the invoice as paid in your ledger using external_id. On failed/rejected, leave the invoice unpaid and allow manual retry with a new idempotency value.
Handle each terminal state in your webhook listener. Status codes reference the <a href="https://docs.cobre.com/money-movement-statuses-2032280m0" target="_blank" rel="noopener">Money Movement Statuses</a> guide. Cobre Balance transactions are covered in the <b>Transaction</b> tab.
Funds settled successfully. No error code is set (NA in the status guide). Use this webhook to mark the payment as paid in your system.
money_movements.status.completed| Content-Type | application/json |
{ "id": "ev_InvPay01Cmp",IdiUnique Cobre identifier for this resource. "event_key": "money_movements.status.completed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T12:06:30Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "mm_InvoicePay01",IdiUnique Cobre identifier for this resource. "status": {StatusiLifecycle status object for the resource or movement. "state": "completed",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable label or note. }, "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Invoice 8842 payment",DescriptioniHuman-readable label or note. "tracking_key": "20260610mmInv8842"Tracking KeyiBre-B tracking key for the payment. }, "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "external_id": "invoice_8842",External IdiYour own reference echoed by Cobre for reconciliation. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint. "type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_AcctCust01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_VendorInv01",Destination IdiCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 2000000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-06-10T12:06:30Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Cobre or the rail could not process the movement. Inspect status.code and status.description — common failed codes include:
F001 | Payment processing failed — please try again. |
F002 | NSF — not sufficient funds in the designated account. |
F003 | R2P payment link expired (payins). |
F004 | Daily transaction amount limit has been reached. |
F005 | Amount exceeds the maximum allowed transaction limit. |
F098 | Could not process the money movement at this time. |
F099 | Could not process the money movement at this time. |
money_movements.status.failed| Content-Type | application/json |
{ "id": "ev_InvPay01Cmp",IdiUnique Cobre identifier for this resource. "event_key": "money_movements.status.failed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T12:06:30Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "mm_InvoicePay01",IdiUnique Cobre identifier for this resource. "status": {StatusiLifecycle status object for the resource or movement. "state": "failed",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "F002",CodeiProvider or Cobre status code when the state is failed or rejected. "description": "NSF — not sufficient funds in the designated account."DescriptioniHuman-readable label or note. }, "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Invoice 8842 payment",DescriptioniHuman-readable label or note. "tracking_key": "20260610mmInv8842"Tracking KeyiBre-B tracking key for the payment. }, "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "external_id": "invoice_8842",External IdiYour own reference echoed by Cobre for reconciliation. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint. "type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_AcctCust01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_VendorInv01",Destination IdiCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 2000000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-06-10T12:06:30Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}The bank or payment network rejected the transaction. Inspect status.code — common rejected codes include:
R000 | Transaction rejected. |
R001 | Inactive or blocked account. |
R002 | Account and identification provided do not coincide. |
R005 | Account does not exist. |
R006 | Invalid account number. |
R009 | Exceeds maximum allowed amount. |
R018 | Payment rejected due to invalid key (payouts). |
R023 | Payment cancelled by the user. |
R026 | Payment rejected due to unavailable bank services. |
R034 | Account closed. |
R085 | Bank processing error (payouts). |
money_movements.status.rejected| Content-Type | application/json |
{ "id": "ev_InvPay01Cmp",IdiUnique Cobre identifier for this resource. "event_key": "money_movements.status.rejected",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T12:06:30Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "mm_InvoicePay01",IdiUnique Cobre identifier for this resource. "status": {StatusiLifecycle status object for the resource or movement. "state": "rejected",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "R001",CodeiProvider or Cobre status code when the state is failed or rejected. "description": "Inactive or blocked account."DescriptioniHuman-readable label or note. }, "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Invoice 8842 payment",DescriptioniHuman-readable label or note. "tracking_key": "20260610mmInv8842"Tracking KeyiBre-B tracking key for the payment. }, "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "external_id": "invoice_8842",External IdiYour own reference echoed by Cobre for reconciliation. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint. "type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_AcctCust01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_VendorInv01",Destination IdiCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 2000000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-06-10T12:06:30Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Payouts debit the source Cobre Balance while the movement is processing to lock funds. If the movement ends in failed, rejected, or canceled, Cobre posts a compensation credit (breb_credit or col_cb_credit). Payins credit the destination on completion only.
While the movement is in processing, Cobre debits the source Cobre Balance to lock the payout amount. Subscribe to accounts.balance.debit and money_movements.status.processing.
accounts.balance.debit| Content-Type | application/json |
{ "id": "ev_InvoicePayLk",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.debit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "trx_InvoicePay01Lk",IdiUnique Cobre identifier for this resource. "type": "col_cb_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "account_id": "acc_AcctCust01",Account IdiCobre Balance account id affected by the event. "amount": -2000000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 7000000,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 5000000,Current BalanceiCobre field at "content.current_balance" in this payload. "currency": "COP",CurrencyiISO currency code (e.g. cop, mxn). "credit_debit_type": "debit",Credit Debit Typeicredit = funds in; debit = funds out. "transaction_date": "2026-06-10T12:05:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "money_movement_id": "mm_InvoicePay01",Money Movement IdiMoney Movement that generated this balance transaction. "description": "Invoice 8842 payment",DescriptioniHuman-readable label or note. "beneficiary_account_number": "",Beneficiary Account NumberiMetadata field "beneficiary_account_number" attached to the resource. "tracking_key": "20260610mmInv8842"Tracking KeyiBre-B tracking key for the payment. } }}On completion the locked funds are sent to the beneficiary. The processing debit remains on the ledger — no compensation credit is posted.
accounts.balance.debit| Content-Type | application/json |
{ "id": "ev_InvoicePayLk",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.debit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "trx_InvoicePay01Lk",IdiUnique Cobre identifier for this resource. "type": "col_cb_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "account_id": "acc_AcctCust01",Account IdiCobre Balance account id affected by the event. "amount": -2000000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 7000000,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 5000000,Current BalanceiCobre field at "content.current_balance" in this payload. "currency": "COP",CurrencyiISO currency code (e.g. cop, mxn). "credit_debit_type": "debit",Credit Debit Typeicredit = funds in; debit = funds out. "transaction_date": "2026-06-10T12:05:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-06-10T12:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "money_movement_id": "mm_InvoicePay01",Money Movement IdiMoney Movement that generated this balance transaction. "description": "Invoice 8842 payment",DescriptioniHuman-readable label or note. "beneficiary_account_number": "",Beneficiary Account NumberiMetadata field "beneficiary_account_number" attached to the resource. "tracking_key": "20260610mmInv8842"Tracking KeyiBre-B tracking key for the payment. } }}If the movement reaches a terminal failed, rejected, or canceled state, Cobre credits the source Cobre Balance to release the lock (breb_credit for Bre-B, col_cb_credit for bank rails).
accounts.balance.credit| Content-Type | application/json |
{ "id": "ev_InvoicePayCp",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T12:06:30Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "trx_InvoicePay01Cp",IdiUnique Cobre identifier for this resource. "type": "col_cb_credit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "account_id": "acc_AcctCust01",Account IdiCobre Balance account id affected by the event. "amount": 2000000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 2000000,Current BalanceiCobre field at "content.current_balance" in this payload. "currency": "COP",CurrencyiISO currency code (e.g. cop, mxn). "credit_debit_type": "credit",Credit Debit Typeicredit = funds in; debit = funds out. "transaction_date": "2026-06-10T12:06:30Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-06-10T12:06:30Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "money_movement_id": "mm_InvoicePay01",Money Movement IdiMoney Movement that generated this balance transaction. "description": "Invoice 8842 payment",DescriptioniHuman-readable label or note. "tracking_key": "20260610mmInv8842",Tracking KeyiBre-B tracking key for the payment. "sender_name": "",Sender NameiMetadata field "sender_name" attached to the resource. "sender_id": "",Sender IdiMetadata field "sender_id" attached to the resource. "sender_account_number": ""Sender Account NumberiMetadata field "sender_account_number" attached to the resource. } }}Reconcile the Invoice Payout
Match the completion webhook to the invoice record on external_id and mm_id. Cross-check the balance debit via accounts.balance.debit.
Mapping the webhook payload from an earlier step onto Customer ledger. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Customer ledger field | |
content.external_id invoice_8842 |
→ | invoice_id |
content.id mm_InvoicePay01 |
→ | cobre_mm_id |
content.amount 2000000 |
→ | paid_amount_cents |
content.status.state completed |
→ | invoice_payment_status |
Submit Payroll Bulk Payout
Upload a JSON file (multipart/form-data) with a two-line payroll sample: one payout to an existing counterparty (destination_id) and one with an inline destination object (Create Counterparty body). Optional header checker_approval sends the batch for approval. The response id (bat_…) is stamped as batch_id on every Money Movement created from the file. Listen for bulk status webhooks; bulk completed means every line reached a terminal MM state (completed, failed, canceled, or rejected).
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH |
| file | @payroll_june_2026.json |
[ { "amount": 85000000, "source_id": "acc_AcctCust01", "destination_id": "cp_PayrollEmp01", "metadata": { "description": "Payroll - Maria Gomez", "reference": "pay_2026_06_001" }, "external_id": "payroll_2026_06_emp_001" }, { "amount": 72000000, "source_id": "acc_AcctCust01", "destination": { "geo": "col", "type": "ch", "alias": "Carlos Ramirez - payroll", "metadata": { "account_number": "1013661234", "beneficiary_institution": "1007", "counterparty_fullname": "Carlos Ramirez", "counterparty_id_type": "cc", "counterparty_id_number": "1023456789" } }, "metadata": { "description": "Payroll - Carlos Ramirez", "reference": "pay_2026_06_002" }, "external_id": "payroll_2026_06_emp_002" }]{ "id": "bat_PayrollJun26",IdiUnique Cobre identifier for this resource. "input_filename": "payroll_june_2026.json",Input FilenameiOriginal filename of the uploaded bulk JSON file. "status": {StatusiLifecycle status object for the resource or movement. "state": "validating",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable detail for the current status. }, "total_money_movements": 2,Total Money MovementsiNumber of Money Movement entries in the bulk file. "total_amount": "157000000",Total AmountiSum of all amounts in the bulk file, in cents. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "created_at": "2026-06-10T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "executed_at": "",Executed AtiTimestamp when bulk processing started executing movements (ISO 8601, UTC). "processed_at": ""Processed AtiTimestamp when bulk processing finished (ISO 8601, UTC).}Webhook outcomes — Bulk money movement
Bulk payroll batch finished — every line reached a terminal Money Movement state. Reconcile each employee payment on money_movements.status.* webhooks using external_id; each child MM includes batch_id = bat_PayrollJun26. Use GET /bulk_money_movements/{id} for batch-level audit.
Bulk statuses are validating, processing, pending_approval, completed, failed, and canceled — <b>rejected</b> is not a bulk status. The bulk completes when every Money Movement in the file reaches a terminal MM state (completed, failed, canceled, or rejected). See the <a href="https://docs.cobre.com/bulk-money-movements-1886564m0" target="_blank" rel="noopener">Bulk Money Movements</a> guide.
Initial bulk status while Cobre validates the uploaded JSON file format.
bulk_money_movements.status.validating| Content-Type | application/json |
{ "id": "ev_BulkPayJunCmp",IdiUnique Cobre identifier for this resource. "event_key": "bulk_money_movements.status.validating",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T14:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "bat_PayrollJun26",IdiUnique Cobre identifier for this resource. "input_filename": "payroll_june_2026.json",Input FilenameiOriginal filename of the uploaded bulk JSON file. "status": {StatusiLifecycle status object for the resource or movement. "state": "validating",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable label or note. }, "total_money_movements": 2,Total Money MovementsiNumber of Money Movement entries in the bulk file. "total_amount": "157000000",Total AmountiSum of all amounts in the bulk file, in cents. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "created_at": "2026-06-10T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "executed_at": "2026-06-10T14:10:00Z",Executed AtiTimestamp when bulk processing started executing movements (ISO 8601, UTC). "processed_at": "2026-06-10T14:15:00Z"Processed AtiTimestamp when bulk processing finished (ISO 8601, UTC). }}File validated — each Money Movement in the batch is being created and executed.
bulk_money_movements.status.processing| Content-Type | application/json |
{ "id": "ev_BulkPayJunCmp",IdiUnique Cobre identifier for this resource. "event_key": "bulk_money_movements.status.processing",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T14:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "bat_PayrollJun26",IdiUnique Cobre identifier for this resource. "input_filename": "payroll_june_2026.json",Input FilenameiOriginal filename of the uploaded bulk JSON file. "status": {StatusiLifecycle status object for the resource or movement. "state": "processing",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable label or note. }, "total_money_movements": 2,Total Money MovementsiNumber of Money Movement entries in the bulk file. "total_amount": "157000000",Total AmountiSum of all amounts in the bulk file, in cents. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "created_at": "2026-06-10T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "executed_at": "2026-06-10T14:10:00Z",Executed AtiTimestamp when bulk processing started executing movements (ISO 8601, UTC). "processed_at": "2026-06-10T14:15:00Z"Processed AtiTimestamp when bulk processing finished (ISO 8601, UTC). }}Bulk submitted with checker_approval; awaiting an approver decision before processing.
bulk_money_movements.status.pending_approval| Content-Type | application/json |
{ "id": "ev_BulkPayJunCmp",IdiUnique Cobre identifier for this resource. "event_key": "bulk_money_movements.status.pending_approval",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T14:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "bat_PayrollJun26",IdiUnique Cobre identifier for this resource. "input_filename": "payroll_june_2026.json",Input FilenameiOriginal filename of the uploaded bulk JSON file. "status": {StatusiLifecycle status object for the resource or movement. "state": "pending_approval",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable label or note. }, "total_money_movements": 2,Total Money MovementsiNumber of Money Movement entries in the bulk file. "total_amount": "157000000",Total AmountiSum of all amounts in the bulk file, in cents. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "created_at": "2026-06-10T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "executed_at": "2026-06-10T14:10:00Z",Executed AtiTimestamp when bulk processing started executing movements (ISO 8601, UTC). "processed_at": "2026-06-10T14:15:00Z"Processed AtiTimestamp when bulk processing finished (ISO 8601, UTC). }}Every Money Movement in the file reached a terminal state. Reconcile each line via its MM webhooks using external_id; child movements include batch_id matching the bulk id.
bulk_money_movements.status.completed| Content-Type | application/json |
{ "id": "ev_BulkPayJunCmp",IdiUnique Cobre identifier for this resource. "event_key": "bulk_money_movements.status.completed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T14:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "bat_PayrollJun26",IdiUnique Cobre identifier for this resource. "input_filename": "payroll_june_2026.json",Input FilenameiOriginal filename of the uploaded bulk JSON file. "status": {StatusiLifecycle status object for the resource or movement. "state": "completed",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable label or note. }, "total_money_movements": 2,Total Money MovementsiNumber of Money Movement entries in the bulk file. "total_amount": "157000000",Total AmountiSum of all amounts in the bulk file, in cents. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "created_at": "2026-06-10T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "executed_at": "2026-06-10T14:10:00Z",Executed AtiTimestamp when bulk processing started executing movements (ISO 8601, UTC). "processed_at": "2026-06-10T14:15:00Z"Processed AtiTimestamp when bulk processing finished (ISO 8601, UTC). }}Bulk validation failed — the file format could not be processed. Fix the JSON and re-upload.
bulk_money_movements.status.failed| Content-Type | application/json |
{ "id": "ev_BulkPayJunCmp",IdiUnique Cobre identifier for this resource. "event_key": "bulk_money_movements.status.failed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T14:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "bat_PayrollJun26",IdiUnique Cobre identifier for this resource. "input_filename": "payroll_june_2026.json",Input FilenameiOriginal filename of the uploaded bulk JSON file. "status": {StatusiLifecycle status object for the resource or movement. "state": "failed",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable label or note. }, "total_money_movements": 2,Total Money MovementsiNumber of Money Movement entries in the bulk file. "total_amount": "157000000",Total AmountiSum of all amounts in the bulk file, in cents. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "created_at": "2026-06-10T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "executed_at": "2026-06-10T14:10:00Z",Executed AtiTimestamp when bulk processing started executing movements (ISO 8601, UTC). "processed_at": "2026-06-10T14:15:00Z"Processed AtiTimestamp when bulk processing finished (ISO 8601, UTC). }}Bulk process was canceled before completion.
bulk_money_movements.status.canceled| Content-Type | application/json |
{ "id": "ev_BulkPayJunCmp",IdiUnique Cobre identifier for this resource. "event_key": "bulk_money_movements.status.canceled",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-06-10T14:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "content": {ContentiEvent-specific payload — same layout as the GET response for that resource. "id": "bat_PayrollJun26",IdiUnique Cobre identifier for this resource. "input_filename": "payroll_june_2026.json",Input FilenameiOriginal filename of the uploaded bulk JSON file. "status": {StatusiLifecycle status object for the resource or movement. "state": "canceled",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable label or note. }, "total_money_movements": 2,Total Money MovementsiNumber of Money Movement entries in the bulk file. "total_amount": "157000000",Total AmountiSum of all amounts in the bulk file, in cents. "checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API. "creator": "cli_acct_co01",CreatoriAPI client id that created this resource. "created_at": "2026-06-10T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "executed_at": "2026-06-10T14:10:00Z",Executed AtiTimestamp when bulk processing started executing movements (ISO 8601, UTC). "processed_at": "2026-06-10T14:15:00Z"Processed AtiTimestamp when bulk processing finished (ISO 8601, UTC). }}Reconcile the Payroll Batch
Match the bulk completion webhook to the payroll run. The bulk id (bat_PayrollJun26) is the batch_id on every Money Movement created from the file. Drill into individual employee payments via GET /money_movements?external_id=... for each payroll line.
Mapping the webhook payload from an earlier step onto Customer ledger. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Customer ledger field | |
content.id bat_PayrollJun26 |
→ | payroll_batch_id |
content.total_money_movements 2 |
→ | employee_payment_count |
content.total_amount 157000000 |
→ | payroll_total_cents |
content.status.state completed |
→ | payroll_batch_status Bulk completed when every MM line is terminal (completed, failed, canceled, or rejected). Map completed → payroll run APPLIED; use per-line MM webhooks for exceptions. |