Step 1 of 11 Configuration API step

Authenticate

Exchange API credentials for a short-lived Bearer token (~20 minutes). Reuse the same token string on every later call in this flow.

POST https://api.cobre.co/v1/auth
Headers
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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.
}
Documentation for this step
AuthenticationAuthentication Guide
Step 2 of 11 Configuration API step

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.

POST https://api.cobre.co/v1/subscriptions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH
Content-Typeapplication/json
Request body
{
"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).
}
Response 201
{
"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).
}
Step 3 of 11 Customer Onboarding API step

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.

POST https://api.cobre.co/v1/accounts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Step 4 of 11 Customer Onboarding API step

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.

POST https://api.cobre.co/v1/account_references
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH
Content-Typeapplication/json
Request body
{
"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).
}
Response 200
{
"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).
}
Documentation for this step
Create an Account ReferenceTransfer-In Guide
Step 5 of 11 Balance Funding API step

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.

GET https://api.cobre.co/v1/accounts/acc_AcctCust01/transactions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH
Response 200
{
"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.credit

Fires 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.

Headers
Content-Typeapplication/json
Payload
{
"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.
}
}
Step 6 of 11 Balance Funding Reconciliation

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 & valueCustomer 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
Step 7 of 11 Invoice Payout API step

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.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH
Content-Typeapplication/json
Request body
{
"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.
}
}
Response 201
{
"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).
}
Documentation for this step
Create a CounterpartyManaging Counterparties
Step 8 of 11 Invoice Payout API step

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).

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH
Content-Typeapplication/json
idempotencyacct_inv_8842
Request body
{
"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.
}
Response 201
{
"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 outcomesMoney 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.

Event money_movements.status.completed
Headers
Content-Typeapplication/json
Example payload
{
"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:

Possible status codes
F001Payment processing failed — please try again.
F002NSF — not sufficient funds in the designated account.
F003R2P payment link expired (payins).
F004Daily transaction amount limit has been reached.
F005Amount exceeds the maximum allowed transaction limit.
F098Could not process the money movement at this time.
F099Could not process the money movement at this time.
Event money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"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:

Possible status codes
R000Transaction rejected.
R001Inactive or blocked account.
R002Account and identification provided do not coincide.
R005Account does not exist.
R006Invalid account number.
R009Exceeds maximum allowed amount.
R018Payment rejected due to invalid key (payouts).
R023Payment cancelled by the user.
R026Payment rejected due to unavailable bank services.
R034Account closed.
R085Bank processing error (payouts).
Event money_movements.status.rejected
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event accounts.balance.debit
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event accounts.balance.debit
Headers
Content-Typeapplication/json
Example payload
{
"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).

Event accounts.balance.credit
Headers
Content-Typeapplication/json
Example payload
{
"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.
}
}
}
Documentation for this step
Create a Money MovementFast Pay & ACH
Step 9 of 11 Invoice Payout Reconciliation

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 & valueCustomer 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
Step 10 of 11 Payroll API step

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).

POST https://api.cobre.co/v1/bulk_money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfYWNjdF9jbzAxIjk.Acct8xQ2pL7nV4kWd9pT4bH
Multipart upload
file@payroll_june_2026.json
File content
[
{
"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"
}
]
Response 201
{
"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 outcomesBulk 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.

Event bulk_money_movements.status.validating
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event bulk_money_movements.status.processing
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event bulk_money_movements.status.pending_approval
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event bulk_money_movements.status.completed
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event bulk_money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event bulk_money_movements.status.canceled
Headers
Content-Typeapplication/json
Example payload
{
"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).
}
}
Step 11 of 11 Payroll Reconciliation

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 & valueCustomer 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.