Step 1 of 17 Configuration API step

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.

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

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.

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

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

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

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.

POST https://api.cobre.co/v1/accounts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Documentation for this step
Create or Connect an AccountCobre for Lenders
Step 5 of 17 Borrower Onboarding API step

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.

POST https://api.cobre.co/v1/accounts/acc_Borrower88231Borrower balanceRequiredi/keys
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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.registered

Bre-B registration completed — persist key_value and share it with the borrower as their always-open payin destination.

Headers
Content-Typeapplication/json
Payload
{
"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).
}
}
Step 6 of 17 Loan Disbursement API step

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.

POST https://api.cobre.co/v1/account_verifications
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Step 7 of 17 Loan Disbursement API step

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.

GET https://api.cobre.co/v1/account_verifications/av_Hyb88231v
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Response 200
{
"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.
}
}
Step 8 of 17 Loan Disbursement API step

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.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"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).
}
}
Response 201
{
"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).
}
Documentation for this step
Create a CounterpartyManaging Counterparties
Step 9 of 17 Loan Disbursement API step

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.

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
idempotencyloan-CO-88231-disb-001
Request body
{
"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.
}
Response 201
{
"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 outcomesMoney 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.

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

Possible status codes
CodeDescriptionApplies to
F001Payment processing failed please try again.Payin and payout
F002NSF - Not Sufficient Funds in the designated account.Payin and payout
F004Daily transaction amount limit has been reached.Payin and payout
F005Amount exceeds the maximum allowed transaction limit.Payin and payout
F098Could not process the money movement at this time.Payin and payout
F099Could not process the money movement at this time.Payin and payout
Event money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"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):

Possible status codes
CodeDescriptionApplies to
R000Transaction rejected.Payin and payout
R001Inactive or blocked account.Payin and payout
R002Account and identification provided do not coincide.Payin and payout
R004ID not valid.Payout
R005Account does not exist.Payin and payout
R006Invalid account number.Payin and payout
R009Exceeds maximum allowed amount.Payin and payout
R010Account not authorized to debit.Payin and payout
R011Invalid Account type.Payout
R015Account not authorized to be credited.Payout
R018Payment rejected due invalid key.Payout
R023Payment cancelled by the user.Payin and payout
R024Exceeds maximum allowed number of transactions.Payout
R025Required information missing.Payout
R026Payment rejected due to unavailable bank services.Payin and payout
R027Account exceeds the maximum allowed transaction limit.Payin and payout
R034Account closed.Payin and payout
R085Bank processing error.Payout
Event money_movements.status.rejected
Headers
Content-Typeapplication/json
Example payload
{
"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.

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

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

Event accounts.balance.credit
Headers
Content-Typeapplication/json
Example payload
{
"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).
}
}
}
Step 10 of 17 Loan Disbursement Reconciliation

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 & valueLending 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.
Step 11 of 17 Repayment API step

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.

POST https://api.cobre.co/v1/checkouts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Documentation for this step
Create a CheckoutCheckout Guide
Step 12 of 17 Repayment API step

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.

GET https://api.cobre.co/v1/money_movements/mm_ChkRepay88231Money Movement IDRequiredi
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Response 200
{
"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 outcomesMoney 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.

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

Possible status codes
CodeDescriptionApplies to
F001Payment processing failed please try again.Payin and payout
F002NSF - Not Sufficient Funds in the designated account.Payin and payout
F003R2P Payment link expired.Payin
F004Daily transaction amount limit has been reached.Payin and payout
F005Amount exceeds the maximum allowed transaction limit.Payin and payout
F098Could not process the money movement at this time.Payin and payout
F099Could not process the money movement at this time.Payin and payout
Event money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"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):

Possible status codes
CodeDescriptionApplies to
R000Transaction rejected.Payin and payout
R001Inactive or blocked account.Payin and payout
R002Account and identification provided do not coincide.Payin and payout
R005Account does not exist.Payin and payout
R006Invalid account number.Payin and payout
R009Exceeds maximum allowed amount.Payin and payout
R010Account not authorized to debit.Payin and payout
R012The user has abandoned the transaction.Payin
R016Payment rejected due to timeout.Payin
R017Payment rejected due to expired money movement.Payin
R019Payment rejected due to incorrect amount.Payin
R020Payment rejected due to user authentication failure.Payin
R021Insufficient funds in payer account.Payin
R023Payment cancelled by the user.Payin and payout
R026Payment rejected due to unavailable bank services.Payin and payout
R027Account exceeds the maximum allowed transaction limit.Payin and payout
R034Account closed.Payin and payout
R081The counterparty registration has expired.Payin
R082The counterparty registration has been canceled.Payin
R084The counterparty registration has been rejected.Payin
Event money_movements.status.rejected
Headers
Content-Typeapplication/json
Example payload
{
"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.

Event accounts.balance.credit
Headers
Content-Typeapplication/json
Example payload
{
"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.
}
}
}
Documentation for this step
Obtain one Money MovementCheckout Guide
Step 13 of 17 Repayment Reconciliation

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 & valueLending 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.
Step 14 of 17 Repayment API step

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.

GET https://api.cobre.co/v1/accounts/acc_Borrower88231/transactions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
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_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.credit

Primary real-time signal for static Bre-B payins — no mm_id exists. Apply the credited amount against the borrower's current ledger balance.

Headers
Content-Typeapplication/json
Payload
{
"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.
}
}
Step 15 of 17 Repayment Reconciliation

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 & valueLending 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.
Step 16 of 17 Reconciliation API step

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.

POST https://api.cobre.co/v1/reports
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2h5YmlkXzAxIn0.HybR9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Step 17 of 17 Reconciliation Reconciliation

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 & valueFinance / ERP field
id
repo_LenderHyb2407
report_batch_id
file_name
2026-07-24_money_movement_repo_LenderHyb2407
report_file