Authenticate
Every Cobre API call carries a short-lived Bearer token (~20 minutes). Your lending platform exchanges API credentials once and attaches the token to every subsequent request.
| Content-Type | application/json |
{ "user_id": "cli_lender_hybrid_co01",User IDRequirediAPI user id issued by Cobre (cli_…). "secret": "sk_live_9Km2pL7xQ4"SecretRequirediAPI secret from key creation — treat like a password.}{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ",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 Webhook Events
There is no checkout.* event — subscribe to Money Movement lifecycle events, cobre_keys.status.registered, and accounts.balance.credit/debit. Checkout creates a Money Movement once the payer selects a rail (track via MM webhooks + external_id). Static Bre-B payins credit the balance as breb_credit with no Money Movement — track via accounts.balance.credit.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "url": "https://microcredito.example.co/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications. "description": "Lending disbursement, Checkout repayment, static Bre-B payin",DescriptioniHuman-readable label or note. "events": [EventsiList of webhook event types this subscription listens to. "money_movements.status.initiated", "money_movements.status.processing", "money_movements.status.completed", "money_movements.status.canceled", "money_movements.status.rejected", "money_movements.status.failed", "cobre_keys.status.registered", "cobre_keys.status.failed", "accounts.balance.credit", "accounts.balance.debit" ], "event_signature_key": "WHhybCo9xZ"Signature keyRequirediSecret for HMAC-SHA256 verification (event-timestamp + '.' + compact JSON body).}{ "id": "sub_LenderHyb01",IdiUnique Cobre identifier for this resource. "url": "https://microcredito.example.co/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications. "description": "Lending disbursement, Checkout repayment, static Bre-B payin",DescriptioniHuman-readable label or note. "events": [EventsiList of webhook event types this subscription listens to. "money_movements.status.initiated", "money_movements.status.processing", "money_movements.status.completed", "money_movements.status.canceled", "money_movements.status.rejected", "money_movements.status.failed", "cobre_keys.status.registered", "cobre_keys.status.failed", "accounts.balance.credit", "accounts.balance.debit" ], "event_signature_key": "******9xZ",Signature keyRequirediSecret for HMAC-SHA256 verification (event-timestamp + '.' + compact JSON body). "created_at": "2026-07-24T10:00:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).}Create the Master Cobre Balance
One master/omnibus Cobre Balance funds all loan disbursements. Create it once at integration setup (skip on later runs if it already exists).
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "provider_id": "pr_col_cobre",ProviderRequirediCobre field at "provider_id" in this payload. "action": "create",ActionRequirediCobre field at "action" in this payload. "alias": "Master disbursement pool"AliasiDisplay name that helps identify it and clarify its purpose.}{ "id": "acc_MasterLenderCO01",IdiUnique Cobre identifier for this resource. "provider_id": "pr_col_cobre",ProviderRequirediCobre field at "provider_id" in this payload. "provider_name": "Cobre Balance Colombia",Provider NameiCobre field at "provider_name" in this payload. "alias": "Master disbursement pool",AliasiDisplay name that helps identify it and clarify its purpose. "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "obtained_balance": 0,Obtained BalanceiCobre field at "obtained_balance" in this payload. "account_type": "cobre_balance",Account TypeiCobre field at "account_type" 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. }, "created_at": "2026-07-24T10:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:05:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Create the Borrower's Cobre Balance
At loan origination, create one Cobre Balance per borrower. Checkout repayments and static Bre-B payins both credit this balance, giving per-borrower visibility in Cobre for collections.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "provider_id": "pr_col_cobre",ProviderRequirediCobre field at "provider_id" in this payload. "action": "create",ActionRequirediCobre field at "action" in this payload. "alias": "Borrower loan CO-88231"AliasiDisplay name that helps identify it and clarify its purpose.}{ "id": "acc_Borrower88231",IdiUnique Cobre identifier for this resource. "provider_id": "pr_col_cobre",ProviderRequirediCobre field at "provider_id" in this payload. "alias": "Borrower loan CO-88231",AliasiDisplay name that helps identify it and clarify its purpose. "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "obtained_balance": 0,Obtained BalanceiCobre field at "obtained_balance" in this payload. "account_type": "cobre_balance",Account TypeiCobre field at "account_type" 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. }, "created_at": "2026-07-24T10:06:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:06:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Create Static Bre-B Cobre Key
Register a persistent Bre-B payin key on the borrower's Cobre Balance — always available without generating a new link per installment. Creation is asynchronous: do not share the key until cobre_keys.status.registered arrives.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "alias": "Payin key loan CO-88231",Key aliasiDisplay name that helps identify it and clarify its purpose. "key_config": "open_input",Key configRequirediCobre field at "key_config" in this payload. "open_input": "xfin88231"Custom key valueRequirediCobre field at "open_input" in this payload.}{ "id": "key_Borrower88231",IdiUnique Cobre identifier for this resource. "key_value": "",Key ValueiBre-B key value (e.g. @merchant123). "source_id": "acc_Borrower88231",Source IdiCobre id of the source account or counterparty. "alias": "Payin key loan CO-88231",Key aliasiDisplay name that helps identify it and clarify its purpose. "connectivity": {ConnectivityiConnection/registration status for keys or accounts. "status": "processing",StatusiLifecycle status object for the resource or movement. "description": ""DescriptioniHuman-readable label or note. }, "previous_action": {Previous ActioniCobre field at "previous_action" in this payload. "action_requested": "create",Action RequestediCobre field at "previous_action.action_requested" in this payload. "action_code": "",Action CodeiCobre field at "previous_action.action_code" in this payload. "action_description": ""Action DescriptioniCobre field at "previous_action.action_description" in this payload. }, "created_at": "2026-07-24T10:07:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:07:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Webhook delivered
cobre_keys.status.registeredBre-B registration completed — persist key_value and share it with the borrower as their always-open payin destination.
| Content-Type | application/json |
{ "id": "ev_KeyBorrower88231",IdiUnique Cobre identifier for this resource. "event_key": "cobre_keys.status.registered",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-07-24T10:08: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": "key_Borrower88231",IdiUnique Cobre identifier for this resource. "key_value": "@xfin88231",Key ValueiBre-B key value (e.g. @merchant123). "source_id": "acc_Borrower88231",Source IdiCobre id of the source account or counterparty. "alias": "Payin key loan CO-88231",AliasiDisplay name that helps identify it and clarify its purpose. "connectivity": {ConnectivityiConnection/registration status for keys or accounts. "status": "registered",StatusiLifecycle status object for the resource or movement. "description": ""DescriptioniHuman-readable label or note. }, "previous_action": {Previous ActioniCobre field at "content.previous_action" in this payload. "action_requested": "create",Action RequestediCobre field at "content.previous_action.action_requested" in this payload. "action_code": "",Action CodeiCobre field at "content.previous_action.action_code" in this payload. "action_description": ""Action DescriptioniCobre field at "content.previous_action.action_description" in this payload. }, "created_at": "2026-07-24T10:07:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:08:30Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Verify the Borrower's Bre-B Key (Required)
Before the first Bre-B disbursement to a new borrower, run col_key_ownership_1 and block the payout until verification_result is matched. This replaces manual/OCR-based key validation on the lending platform.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "model": "col_key_ownership_1",ModeliVerification model identifier (region- and rail-specific). "verification_request": {Verification RequestiInput fields sent to the verification model. "key_value": "@BOR88231",Bre-B keyRequirediBre-B key value (e.g. @merchant123). "account_holder_id_number": "5334623427"ID numberRequirediCobre field at "verification_request.account_holder_id_number" in this payload. }, "external_id": "loan-CO-88231-verify"External IdiYour own reference echoed by Cobre for reconciliation.}{ "id": "av_Hyb88231v",IdiUnique Cobre identifier for this resource. "model": "col_key_ownership_1",ModeliVerification model identifier (region- and rail-specific). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "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 detail for the current status. }, "external_id": "loan-CO-88231-verify",External IdiYour own reference echoed by Cobre for reconciliation. "created_at": "2026-07-24T10:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:10:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Retrieve Borrower Key Verification Result
Poll the Account Verification by id until status.state is completed. Continue with the payout only when verification_response.verification_result is matched; route unmatched or failed results to manual review.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
{ "id": "av_Hyb88231v",Verification IDRequirediThe av_… identifier returned by the create response. "model": "col_key_ownership_1",ModeliVerification model identifier (region- and rail-specific). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "status": {StatusiLifecycle status object for the resource or movement. "state": "completed",StatusRequirediMust be completed before creating the counterparty or Money Movement. "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable detail for the current status. }, "external_id": "loan-CO-88231-verify",External IdiYour own reference echoed by Cobre for reconciliation. "created_at": "2026-07-24T10:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:10:00Z",Updated AtiTimestamp of the last update (ISO 8601, UTC). "verification_response": {Verification ResponseiResult returned by the verification model. "verification_result": "matched"Ownership resultRequiredimatched confirms the key ownership check; unmatched or failed blocks the payout. }}Register the Borrower for Disbursement
Create a reusable counterparty for the borrower's Bre-B payout destination. Run only after Bre-B key Account Verification has returned matched.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "type": "breb_key",TypeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "alias": "Borrower payout CO-88231",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "key_value": "@BOR88231"Bre-B keyRequirediCobre Key that received the Bre-B deposit (breb_credit notifications). }}{ "id": "cp_BorrowerDisb88231",IdiUnique Cobre identifier for this resource. "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "type": "breb_key",TypeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "alias": "Borrower payout CO-88231",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "key_value": "@BOR88231",Bre-B keyRequirediCobre Key that received the Bre-B deposit (breb_credit notifications). "key_type": "alphanumeric"Key TypeiCobre field at "metadata.key_type" in this payload. }, "created_at": "2026-07-24T10:12:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:12:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Disburse the Loan
Send approved loan principal from the master Cobre Balance to the borrower's verified Bre-B counterparty. Proceed only if the Account Verification step returned matched. Include a unique idempotency header (min. 9 chars, valid 24h) tied to the loan event.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
| idempotency | loan-CO-88231-disb-001 |
{ "source_id": "acc_MasterLenderCO01",Source (master balance)RequirediCobre id of the source account or counterparty. "destination_id": "cp_BorrowerDisb88231",Destination (counterparty)RequirediCobre id of the destination account or counterparty. "amount": 5000000,Amount (cents)Requiredi5000000 cents = COP 50,000.00. "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Loan disbursement CO-88231"DescriptionRequirediHuman-readable label or note. }, "external_id": "loan-CO-88231-disb"External IDiYour own reference echoed by Cobre for reconciliation.}{ "id": "mm_Disburse88231",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. }, "type": "breb",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_MasterLenderCO01",Source (master balance)RequirediCobre id of the source account or counterparty. "destination_id": "cp_BorrowerDisb88231",Destination (counterparty)RequirediCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 5000000,Amount (cents)Requiredi5000000 cents = COP 50,000.00. "external_id": "loan-CO-88231-disb",External IDiYour own reference echoed by Cobre for reconciliation. "created_at": "2026-07-24T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:15:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Webhook outcomes — Money movement
When the disbursement settles, Cobre POSTs money_movements.status.completed. Mark the loan as funded using external_id.
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_DisburseCmp88231",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-07-24T10:18: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": "mm_Disburse88231",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. }, "external_id": "loan-CO-88231-disb",External IdiYour own reference echoed by Cobre for reconciliation. "source_id": "acc_MasterLenderCO01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_BorrowerDisb88231",Destination IdiCobre id of the destination account or counterparty. "amount": 5000000,AmountiAmount in cents — the last two digits are decimals. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "type": "breb",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). "created_at": "2026-07-24T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:18:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Cobre or the rail could not process the movement. Inspect status.code and status.description. The list below is filtered to this Money Movement’s direction (payin, payout, or both):
| Code | Description | Applies to |
|---|---|---|
F001 | Payment processing failed please try again. | Payin and payout |
F002 | NSF - Not Sufficient Funds in the designated account. | Payin and payout |
F004 | Daily transaction amount limit has been reached. | Payin and payout |
F005 | Amount exceeds the maximum allowed transaction limit. | Payin and payout |
F098 | Could not process the money movement at this time. | Payin and payout |
F099 | Could not process the money movement at this time. | Payin and payout |
money_movements.status.failed| Content-Type | application/json |
{ "id": "ev_DisburseCmp88231",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-07-24T10:18: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": "mm_Disburse88231",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. }, "external_id": "loan-CO-88231-disb",External IdiYour own reference echoed by Cobre for reconciliation. "source_id": "acc_MasterLenderCO01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_BorrowerDisb88231",Destination IdiCobre id of the destination account or counterparty. "amount": 5000000,AmountiAmount in cents — the last two digits are decimals. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "type": "breb",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). "created_at": "2026-07-24T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:18:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}The bank or payment network rejected the transaction. Inspect status.code. The list below is filtered to this Money Movement’s direction (payin, payout, or both):
| Code | Description | Applies to |
|---|---|---|
R000 | Transaction rejected. | Payin and payout |
R001 | Inactive or blocked account. | Payin and payout |
R002 | Account and identification provided do not coincide. | Payin and payout |
R004 | ID not valid. | Payout |
R005 | Account does not exist. | Payin and payout |
R006 | Invalid account number. | Payin and payout |
R009 | Exceeds maximum allowed amount. | Payin and payout |
R010 | Account not authorized to debit. | Payin and payout |
R011 | Invalid Account type. | Payout |
R015 | Account not authorized to be credited. | Payout |
R018 | Payment rejected due invalid key. | Payout |
R023 | Payment cancelled by the user. | Payin and payout |
R024 | Exceeds maximum allowed number of transactions. | Payout |
R025 | Required information missing. | Payout |
R026 | Payment rejected due to unavailable bank services. | Payin and payout |
R027 | Account exceeds the maximum allowed transaction limit. | Payin and payout |
R034 | Account closed. | Payin and payout |
R085 | Bank processing error. | Payout |
money_movements.status.rejected| Content-Type | application/json |
{ "id": "ev_DisburseCmp88231",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-07-24T10:18: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": "mm_Disburse88231",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": "R018",CodeiProvider or Cobre status code when the state is failed or rejected. "description": "Payment rejected due invalid key."DescriptioniHuman-readable label or note. }, "external_id": "loan-CO-88231-disb",External IdiYour own reference echoed by Cobre for reconciliation. "source_id": "acc_MasterLenderCO01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_BorrowerDisb88231",Destination IdiCobre id of the destination account or counterparty. "amount": 5000000,AmountiAmount in cents — the last two digits are decimals. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "type": "breb",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). "created_at": "2026-07-24T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T10:18:00Z"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_Disburse88Lk",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.debit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-07-24T10: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": "trx_Disburse8823Lk",IdiUnique Cobre identifier for this resource. "type": "breb_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_MasterLenderCO01",Account IdiCobre Balance account id affected by the event. "amount": -5000000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 10000000,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-07-24T10:15:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-07-24T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "beneficiary_account_number": "",Beneficiary Account NumberiMetadata field "beneficiary_account_number" attached to the resource. "beneficiary_account_type": "ch",Beneficiary Account TypeiMetadata field "beneficiary_account_type" attached to the resource. "beneficiary_name": "",Beneficiary NameiMetadata field "beneficiary_name" attached to the resource. "beneficiary_id": "",Beneficiary IdiMetadata field "beneficiary_id" attached to the resource. "description": "",DescriptioniHuman-readable label or note. "money_movement_id": "mm_Disburse88231",Money Movement IdiMoney Movement that generated this balance transaction. "tracking_key": ""Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). } }}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_Disburse88Lk",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.debit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-07-24T10: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": "trx_Disburse8823Lk",IdiUnique Cobre identifier for this resource. "type": "breb_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_MasterLenderCO01",Account IdiCobre Balance account id affected by the event. "amount": -5000000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 10000000,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-07-24T10:15:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-07-24T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "beneficiary_account_number": "",Beneficiary Account NumberiMetadata field "beneficiary_account_number" attached to the resource. "beneficiary_account_type": "ch",Beneficiary Account TypeiMetadata field "beneficiary_account_type" attached to the resource. "beneficiary_name": "",Beneficiary NameiMetadata field "beneficiary_name" attached to the resource. "beneficiary_id": "",Beneficiary IdiMetadata field "beneficiary_id" attached to the resource. "description": "",DescriptioniHuman-readable label or note. "money_movement_id": "mm_Disburse88231",Money Movement IdiMoney Movement that generated this balance transaction. "tracking_key": ""Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). } }}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_Disburse88Cp",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-07-24T10:18: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_Disburse8823Cp",IdiUnique Cobre identifier for this resource. "type": "breb_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_MasterLenderCO01",Account IdiCobre Balance account id affected by the event. "amount": 5000000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 0,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": "credit",Credit Debit Typeicredit = funds in; debit = funds out. "transaction_date": "2026-07-24T10:18:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-07-24T10:18:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "",DescriptioniHuman-readable label or note. "money_movement_id": "mm_Disburse88231",Money Movement IdiMoney Movement that generated this balance transaction. "tracking_key": ""Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). } }}Update the Loan from the Disbursement Webhook
Map money_movements.status.completed to your loan record via external_id. No API call — process the webhook payload in real time.
Mapping the webhook payload from an earlier step onto Lending platform. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Lending platform field | |
content.external_id loan-CO-88231-disb |
→ | loan_disbursement_ref |
content.id mm_Disburse88231 |
→ | cobre_mm_id |
content.status.state completed |
→ | loan_status Map completed → FUNDED. |
Create Checkout for Installment Repayment
When an installment is due, calculate the exact amount owed and create a Checkout for PSE, Bancolombia, or Nequi — credited to the borrower's individual Cobre Balance. Bre-B repayments use the static Cobre Key instead (see next steps). Set valid_until to the last day before overdue; once overdue, regenerate via your portal.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "amount": 5500000,Amount (cents)Requiredi5500000 cents = COP 55,000.00 (principal + accrued interest). Fixed integer — regenerate if overdue. "destination_id": "acc_Borrower88231",Borrower balanceRequirediCobre id of the destination account or counterparty. "external_id": "loan-CO-88231-inst1",Installment referenceiYour own reference echoed by Cobre for reconciliation. "checkout_rails": [Checkout RailsiCobre field at "checkout_rails" in this payload. "pse", "bancolombia", "nequi" ], "checkout_header": "Your Lender",Checkout headerRequirediCobre field at "checkout_header" in this payload. "checkout_item": "Installment 1 - loan CO-88231",Item descriptionRequirediCobre field at "checkout_item" in this payload. "valid_until": "2026-07-30T23:59:59Z",Valid untilRequirediSet to the last moment before overdue so the fixed amount stays valid. "money_movement_intent_limit": 1,Payment limitRequirediCobre field at "money_movement_intent_limit" in this payload. "redirect_url": "https://microcredito.example.co/portal/repayment/return"Return URLRequirediOn a Checkout-created Money Movement this is the hosted checkout_url (links.cobre.co), not the merchant return URL from POST /checkouts.}{ "id": "chk_Inst188231",IdiUnique Cobre identifier for this resource. "amount": 5500000,Amount (cents)Requiredi5500000 cents = COP 55,000.00 (principal + accrued interest). Fixed integer — regenerate if overdue. "destination_id": "acc_Borrower88231",Borrower balanceRequirediCobre id of the destination account or counterparty. "external_id": "loan-CO-88231-inst1",Installment referenceiYour own reference echoed by Cobre for reconciliation. "checkout_rails": [Checkout RailsiCobre field at "checkout_rails" in this payload. "pse", "bancolombia", "nequi" ], "checkout_header": "Your Lender",Checkout headerRequirediCobre field at "checkout_header" in this payload. "checkout_item": "Installment 1 - loan CO-88231",Item descriptionRequirediCobre field at "checkout_item" in this payload. "checkout_url": "https://links.cobre.co/ChkInst88231",Checkout UrliCobre field at "checkout_url" in this payload. "valid_until": "2026-07-30T23:59:59Z",Valid untilRequirediSet to the last moment before overdue so the fixed amount stays valid. "money_movement_intent_limit": 1,Payment limitRequirediCobre field at "money_movement_intent_limit" in this payload. "money_movement_created": 0,Money Movement CreatediCobre field at "money_movement_created" in this payload. "redirect_url": "https://microcredito.example.co/portal/repayment/return",Return URLRequirediOn a Checkout-created Money Movement this is the hosted checkout_url (links.cobre.co), not the merchant return URL from POST /checkouts. "active": true,ActiveiCobre field at "active" in this payload. "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "created_at": "2026-07-24T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T14:00:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Repayment Completed (Webhook)
POST /checkouts does not return a Money Movement. When the borrower selects a rail on the hosted page, Cobre creates an R2P MM (initiated → completed) and sends money_movements.status.*. There is no checkout.* event — match by external_id; batch_id equals the Checkout chk_…. creator and source_id are the r2p counterparty Cobre created on the hosted page (this Checkout omitted source_id). GET defaults to nested=false — source and destination are null.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
{ "id": "mm_ChkRepay88231",IdiUnique Cobre identifier for this resource. "batch_id": "chk_Inst188231",Checkout IDRequirediCheckout id (chk_…) when the Money Movement was created from a Checkout; otherwise the bulk batch id (bat_…). "external_id": "loan-CO-88231-inst1",External IDRequirediYour own reference echoed by Cobre for reconciliation. "creator": "cp_ChkPayer88231",CreatorRequirediActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "type": "r2p_pse",Rail typeRequirediResource 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). "status": {StatusiLifecycle status object for the resource or movement. "state": "completed",StatusRequirediCurrent 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. }, "source_id": "cp_ChkPayer88231",Source IdiCobre id of the source account or counterparty. "source": null,SourceiCobre field at "source" in this payload. "destination_id": "acc_Borrower88231",Destination IdiCobre id of the destination account or counterparty. "destination": null,DestinationiInline Create Counterparty body when destination_id is not used (supported in bulk uploads). "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 5500000,AmountiAmount in cents — the last two digits are decimals. "metadata": {MetadataiCustom key-value metadata attached to the resource. "r2p_rail": "pse",R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb). "tracking_key": "558741231",Tracking keyRequirediNetwork tracking key for the payment (PSE ticket or Bre-B key). "payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkinst88231",Payment LinkiRail-hosted URL the payer used to complete the payment (e.g. PSE). "description_to_payer": "Installment 1 - loan CO-88231",Description To PayeriPayer-facing description. On Checkout this is checkout_item. "description_to_payee": "",Description To PayeeiDescription that appears on the credit in your Cobre Balance. "redirect_url": "https://links.cobre.co/ChkInst88231",Checkout URLRequirediOn a Checkout-created Money Movement this is the hosted checkout_url (links.cobre.co), not the merchant return URL from POST /checkouts. "financial_institution_code": "1002",Financial Institution CodeiBank code the payer selected (PSE). See Colombian bank codes. "ticket_id": "178648058366088231"Ticket IdiTicket id the payment network assigned to this transaction. }, "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. "created_at": "2026-07-24T14:20:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T14:25:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Webhook outcomes — Money movement
Cobre delivers this when the Checkout payment reaches completed. creator and source_id are the r2p counterparty created on the hosted page. Credit lands on the borrower's individual Cobre Balance — see the Transaction tab.
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_ChkRepayCmp88231",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-07-24T14:25: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": "mm_ChkRepay88231",IdiUnique Cobre identifier for this resource. "batch_id": "chk_Inst188231",Batch IdiCheckout id (chk_…) when the Money Movement was created from a Checkout; otherwise the bulk batch id (bat_…). "external_id": "loan-CO-88231-inst1",External IdiYour own reference echoed by Cobre for reconciliation. "creator": "cp_ChkPayer88231",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "type": "r2p_pse",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). "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. }, "source_id": "cp_ChkPayer88231",Source IdiCobre id of the source account or counterparty. "source": null,SourceiCobre field at "content.source" in this payload. "destination_id": "acc_Borrower88231",Destination IdiCobre id of the destination account or counterparty. "destination": null,DestinationiInline Create Counterparty body when destination_id is not used (supported in bulk uploads). "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 5500000,AmountiAmount in cents — the last two digits are decimals. "metadata": {MetadataiCustom key-value metadata attached to the resource. "r2p_rail": "pse",R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb). "tracking_key": "558741231",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkinst88231",Payment LinkiRail-hosted URL the payer used to complete the payment (e.g. PSE). "description_to_payer": "Installment 1 - loan CO-88231",Description To PayeriPayer-facing description. On Checkout this is checkout_item. "description_to_payee": "",Description To PayeeiDescription that appears on the credit in your Cobre Balance. "redirect_url": "https://links.cobre.co/ChkInst88231",Redirect UrliOn a Checkout-created Money Movement this is the hosted checkout_url (links.cobre.co), not the merchant return URL from POST /checkouts. "financial_institution_code": "1002",Financial Institution CodeiBank code the payer selected (PSE). See Colombian bank codes. "ticket_id": "178648058366088231"Ticket IdiTicket id the payment network assigned to this transaction. }, "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. "created_at": "2026-07-24T14:20:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T14:25:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Cobre or the rail could not process the movement. Inspect status.code and status.description. The list below is filtered to this Money Movement’s direction (payin, payout, or both):
| Code | Description | Applies to |
|---|---|---|
F001 | Payment processing failed please try again. | Payin and payout |
F002 | NSF - Not Sufficient Funds in the designated account. | Payin and payout |
F003 | R2P Payment link expired. | Payin |
F004 | Daily transaction amount limit has been reached. | Payin and payout |
F005 | Amount exceeds the maximum allowed transaction limit. | Payin and payout |
F098 | Could not process the money movement at this time. | Payin and payout |
F099 | Could not process the money movement at this time. | Payin and payout |
money_movements.status.failed| Content-Type | application/json |
{ "id": "ev_ChkRepayCmp88231",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-07-24T14:25: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": "mm_ChkRepay88231",IdiUnique Cobre identifier for this resource. "batch_id": "chk_Inst188231",Batch IdiCheckout id (chk_…) when the Money Movement was created from a Checkout; otherwise the bulk batch id (bat_…). "external_id": "loan-CO-88231-inst1",External IdiYour own reference echoed by Cobre for reconciliation. "creator": "cp_ChkPayer88231",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "type": "r2p_pse",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). "status": {StatusiLifecycle status object for the resource or movement. "state": "failed",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "F003",CodeiProvider or Cobre status code when the state is failed or rejected. "description": "R2P Payment link expired."DescriptioniHuman-readable label or note. }, "source_id": "cp_ChkPayer88231",Source IdiCobre id of the source account or counterparty. "source": null,SourceiCobre field at "content.source" in this payload. "destination_id": "acc_Borrower88231",Destination IdiCobre id of the destination account or counterparty. "destination": null,DestinationiInline Create Counterparty body when destination_id is not used (supported in bulk uploads). "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 5500000,AmountiAmount in cents — the last two digits are decimals. "metadata": {MetadataiCustom key-value metadata attached to the resource. "r2p_rail": "pse",R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb). "tracking_key": "558741231",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkinst88231",Payment LinkiRail-hosted URL the payer used to complete the payment (e.g. PSE). "description_to_payer": "Installment 1 - loan CO-88231",Description To PayeriPayer-facing description. On Checkout this is checkout_item. "description_to_payee": "",Description To PayeeiDescription that appears on the credit in your Cobre Balance. "redirect_url": "https://links.cobre.co/ChkInst88231",Redirect UrliOn a Checkout-created Money Movement this is the hosted checkout_url (links.cobre.co), not the merchant return URL from POST /checkouts. "financial_institution_code": "1002",Financial Institution CodeiBank code the payer selected (PSE). See Colombian bank codes. "ticket_id": "178648058366088231"Ticket IdiTicket id the payment network assigned to this transaction. }, "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. "created_at": "2026-07-24T14:20:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T14:25:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}The bank or payment network rejected the transaction. Inspect status.code. The list below is filtered to this Money Movement’s direction (payin, payout, or both):
| Code | Description | Applies to |
|---|---|---|
R000 | Transaction rejected. | Payin and payout |
R001 | Inactive or blocked account. | Payin and payout |
R002 | Account and identification provided do not coincide. | Payin and payout |
R005 | Account does not exist. | Payin and payout |
R006 | Invalid account number. | Payin and payout |
R009 | Exceeds maximum allowed amount. | Payin and payout |
R010 | Account not authorized to debit. | Payin and payout |
R012 | The user has abandoned the transaction. | Payin |
R016 | Payment rejected due to timeout. | Payin |
R017 | Payment rejected due to expired money movement. | Payin |
R019 | Payment rejected due to incorrect amount. | Payin |
R020 | Payment rejected due to user authentication failure. | Payin |
R021 | Insufficient funds in payer account. | Payin |
R023 | Payment cancelled by the user. | Payin and payout |
R026 | Payment rejected due to unavailable bank services. | Payin and payout |
R027 | Account exceeds the maximum allowed transaction limit. | Payin and payout |
R034 | Account closed. | Payin and payout |
R081 | The counterparty registration has expired. | Payin |
R082 | The counterparty registration has been canceled. | Payin |
R084 | The counterparty registration has been rejected. | Payin |
money_movements.status.rejected| Content-Type | application/json |
{ "id": "ev_ChkRepayCmp88231",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-07-24T14:25: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": "mm_ChkRepay88231",IdiUnique Cobre identifier for this resource. "batch_id": "chk_Inst188231",Batch IdiCheckout id (chk_…) when the Money Movement was created from a Checkout; otherwise the bulk batch id (bat_…). "external_id": "loan-CO-88231-inst1",External IdiYour own reference echoed by Cobre for reconciliation. "creator": "cp_ChkPayer88231",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "type": "r2p_pse",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). "status": {StatusiLifecycle status object for the resource or movement. "state": "rejected",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "R016",CodeiProvider or Cobre status code when the state is failed or rejected. "description": "Payment rejected due to timeout."DescriptioniHuman-readable label or note. }, "source_id": "cp_ChkPayer88231",Source IdiCobre id of the source account or counterparty. "source": null,SourceiCobre field at "content.source" in this payload. "destination_id": "acc_Borrower88231",Destination IdiCobre id of the destination account or counterparty. "destination": null,DestinationiInline Create Counterparty body when destination_id is not used (supported in bulk uploads). "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 5500000,AmountiAmount in cents — the last two digits are decimals. "metadata": {MetadataiCustom key-value metadata attached to the resource. "r2p_rail": "pse",R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb). "tracking_key": "558741231",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkinst88231",Payment LinkiRail-hosted URL the payer used to complete the payment (e.g. PSE). "description_to_payer": "Installment 1 - loan CO-88231",Description To PayeriPayer-facing description. On Checkout this is checkout_item. "description_to_payee": "",Description To PayeeiDescription that appears on the credit in your Cobre Balance. "redirect_url": "https://links.cobre.co/ChkInst88231",Redirect UrliOn a Checkout-created Money Movement this is the hosted checkout_url (links.cobre.co), not the merchant return URL from POST /checkouts. "financial_institution_code": "1002",Financial Institution CodeiBank code the payer selected (PSE). See Colombian bank codes. "ticket_id": "178648058366088231"Ticket IdiTicket id the payment network assigned to this transaction. }, "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. "created_at": "2026-07-24T14:20:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-07-24T14:25:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}When a payin Money Movement completes, Cobre credits the destination Cobre Balance and delivers accounts.balance.credit. Transaction type matches the movement type — see GET /accounts/{id}/transactions OAS examples.
When the payin settles, Cobre credits the destination Cobre Balance.
accounts.balance.credit| Content-Type | application/json |
{ "id": "ev_ChkRepay88Cr",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-07-24T14:25: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_ChkRepay8823Cr",IdiUnique Cobre identifier for this resource. "type": "r2p_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_Borrower88231",Account IdiCobre Balance account id affected by the event. "amount": 5500000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 5500000,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-07-24T14:25:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-07-24T14:25:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "sender_bank_code": "1002",Sender Bank CodeiMetadata field "sender_bank_code" attached to the resource. "money_movement_id": "mm_ChkRepay88231",Money Movement IdiMoney Movement that generated this balance transaction. "description": "",DescriptioniHuman-readable label or note. "sender_name": "",Sender NameiMetadata field "sender_name" attached to the resource. "r2p_method": "pse",R2p MethodiR2P channel for r2p_credit transactions (e.g. pse). "tracking_key": "558741231",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "sender_id": ""Sender IdiMetadata field "sender_id" attached to the resource. } }}Mark the Installment Paid from the Webhook
On money_movements.status.completed for the Checkout-triggered MM, update your ledger using external_id (= installment id). Cross-check accounts.balance.credit on the borrower's Cobre Balance.
Mapping the webhook payload from an earlier step onto Lending platform. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Lending platform field | |
content.external_id loan-CO-88231-inst1 |
→ | installment_ref |
content.batch_id chk_Inst188231 |
→ | checkout_id |
content.status.state completed |
→ | installment_status Map completed → PAID. |
Repay via Static Bre-B Cobre Key
The borrower sends any amount from any Bre-B-enabled bank app to their static Cobre Key @xfin88231. Bre-B settles in real time and Cobre credits their Cobre Balance with a breb_credit transaction — there is no Money Movement. Match the credit to the loan in your ledger by borrower + amount + timestamp.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
{ "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_BrebRepay88231",IdiUnique Cobre identifier for this resource. "type": "breb_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_Borrower88231",Account IdiCobre Balance account id affected by the event. "amount": 5500000,Amount creditediAmount in cents — the last two digits are decimals. "previous_balance": 0,Previous BalanceiCobre field at "contents.0.previous_balance" in this payload. "current_balance": 5500000,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-07-24T15:30:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-07-24T15:30:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "key_value": "@xfin88231",Cobre KeyiBre-B key value (e.g. @merchant123). "description": "Bre-B repayment",DescriptioniHuman-readable label or note. "mm_external_id": ""Mm External IdiMetadata field "mm_external_id" attached to the resource. } } ]}Webhook delivered
accounts.balance.creditPrimary real-time signal for static Bre-B payins — no mm_id exists. Apply the credited amount against the borrower's current ledger balance.
| Content-Type | application/json |
{ "id": "ev_BrebCredit88231",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-07-24T15:30: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_BrebRepay88231",IdiUnique Cobre identifier for this resource. "type": "breb_credit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "amount": 5500000,AmountiAmount in cents — the last two digits are decimals. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "date": "2026-07-24T15:30: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. "key_value": "@xfin88231",Key ValueiBre-B key value (e.g. @merchant123). "description": "Bre-B repayment",DescriptioniHuman-readable label or note. "mm_external_id": ""Mm External IdiMetadata field "mm_external_id" attached to the resource. }, "account_id": "acc_Borrower88231",Account IdiCobre Balance account id affected by the event. "previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 5500000,Current BalanceiCobre field at "content.current_balance" in this payload. "credit_debit_type": "credit"Credit Debit Typeicredit = funds in; debit = funds out. }}Apply Bre-B Credit to the Loan Ledger
On accounts.balance.credit with a breb_credit transaction, match borrower balance + amount + timestamp to the open installment or apply against total owed. No external_id on the credit — your platform owns the allocation logic.
Mapping the webhook payload from an earlier step onto Lending platform. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Lending platform field | |
content.account_id acc_Borrower88231 |
→ | borrower_balance_id |
content.amount 5500000 |
→ | payment_amount_cents |
content.id trx_BrebRepay88231 |
→ | cobre_transaction_id Idempotency key — no mm_id for static Bre-B payins. |
Generate a Money Movement Report
At end-of-day, request Money Movement reports for disbursements and Checkout repayments, and Account Transaction reports for static Bre-B breb_credit payins over a date range.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "resource": "money_movement",ResourceRequirediCobre field at "resource" in this payload. "layout": "money_movement_v1",LayoutRequirediCobre field at "layout" in this payload. "start_date": "2026-07-24T00:00:00Z",Start (UTC)RequirediCobre field at "start_date" in this payload. "end_date": "2026-07-24T23:59:59Z"End (UTC)RequirediCobre field at "end_date" in this payload.}{ "id": "repo_LenderHyb2407",IdiUnique Cobre identifier for this resource. "resource": "money_movement",ResourceRequirediCobre field at "resource" in this payload. "file_layout": "money_movement_v1",File LayoutiCobre field at "file_layout" in this payload. "file_format": "json",File FormatiCobre field at "file_format" in this payload. "start_date": "2026-07-24T00:00:00Z",Start (UTC)RequirediCobre field at "start_date" in this payload. "end_date": "2026-07-24T23:59:59Z",End (UTC)RequirediCobre field at "end_date" in this payload. "file_name": "2026-07-24_money_movement_repo_LenderHyb2407",File NameiCobre field at "file_name" in this payload. "requested_at": "2026-07-25T00:00:01Z",Requested AtiCobre field at "requested_at" in this payload. "created_at": "2026-07-25T00:01:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).}Reconcile the Report to Your Ledger
Match report rows to loan/disbursement/installment records using external_id, mm_id, amount, and status.state. Use GET /money_movements as a fallback when webhooks were missed.
Mapping the Cobre report from an earlier step onto Finance / ERP. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Finance / ERP field | |
id repo_LenderHyb2407 |
→ | report_batch_id |
file_name 2026-07-24_money_movement_repo_LenderHyb2407 |
→ | report_file |