Step 1 of 12 Configuration API step

Authenticate

Every Cobre API call carries a short-lived Bearer token (valid ~20 minutes). Your backend exchanges its API user credentials for a token, then attaches it to every later request.

POST https://api.cobre.co/v1/auth
Headers
Content-Typeapplication/json
Request body
{
"user_id": "cli_lender_co_01",User IDiYour API user identifier, issued by Cobre when the API key was created. Format: cli_xxxx.
"secret": "sk_live_4Tg9aQ2pL7"SecretiThe secret obtained when creating the API key. Treat it like a password — never log it or expose it client-side.
}
Response 201
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ",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 12 Configuration API step

Subscribe to Webhook Events

Tell Cobre where to send real-time notifications and which events you care about. For lending you want the money-movement lifecycle so your system learns when a disbursement or repayment settles — no polling required.

POST https://api.cobre.co/v1/subscriptions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"url": "https://creditoagil.co/webhooks/cobre",Notification URLiThe HTTPS endpoint on your side that will receive webhook POSTs from Cobre.
"description": "Lending lifecycle",DescriptioniA label to identify this subscription later.
"events": [EventsiList of webhook event types this subscription listens to.
"money_movements.status.initiated",
"money_movements.status.pending_approval",
"money_movements.status.processing",
"money_movements.status.completed",
"money_movements.status.canceled",
"money_movements.status.rejected",
"money_movements.status.failed",
"accounts.balance.debit",
"accounts.balance.credit"
],
"event_signature_key": "WH5gT2kP9xZ"Signature KeyiA secret you provide; Cobre uses it to HMAC-sign each notification so you can verify it genuinely came from Cobre.
}
Response 201
{
"id": "sub_zod5IW",IdiUnique Cobre identifier for this resource.
"url": "https://creditoagil.co/webhooks/cobre",Notification URLiThe HTTPS endpoint on your side that will receive webhook POSTs from Cobre.
"description": "Lending lifecycle",DescriptioniA label to identify this subscription later.
"events": [EventsiList of webhook event types this subscription listens to.
"money_movements.status.initiated",
"money_movements.status.pending_approval",
"money_movements.status.processing",
"money_movements.status.completed",
"money_movements.status.canceled",
"money_movements.status.rejected",
"money_movements.status.failed",
"accounts.balance.debit",
"accounts.balance.credit"
],
"event_signature_key": "******9xZ",Signature KeyiA secret you provide; Cobre uses it to HMAC-sign each notification so you can verify it genuinely came from Cobre.
"created_at": "2026-06-20T13:40:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).
}
Step 3 of 12 Loan Disbursement API step

Verify the Borrower's Bre-B Account

In the Crédito Ágil app, the borrower enters the Bre-B key where they want to receive the loan. Behind the scenes this runs the col_key_ownership_1 verification so funds only ever go to a key the borrower actually owns.

POST https://api.cobre.co/v1/account_verifications
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
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": "@JAR1234",Your Bre-B keyiThe Bre-B key (alias) you receive money with — for example an @-handle, phone, or document-based key.
"account_holder_id_number": "5334623427"Your ID numberiYour identification number — it must match the registered owner of the Bre-B key.
},
"external_id": "loan-CO-88231-verify"External IdiYour own reference echoed by Cobre for reconciliation.
}
Response 201
{
"id": "av_134trewqe2",IdiUnique Cobre identifier for this resource.
"creator_id": "cli_lender_co_01",Creator IdiCobre field at "creator_id" in this payload.
"model": "col_key_ownership_1",ModeliVerification model identifier (region- and rail-specific).
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"verification_request": {Verification RequestiInput fields sent to the verification model.
"key_value": "@JAR1234",Your Bre-B keyiThe Bre-B key (alias) you receive money with — for example an @-handle, phone, or document-based key.
"account_holder_id_number": "5334623427"Your ID numberiYour identification number — it must match the registered owner of the Bre-B key.
},
"verification_response": {Verification ResponseiResult returned by the verification model.
"verification_result": "matched"Verification ResultiCobre field at "verification_response.verification_result" in this payload.
},
"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 detail for the current status.
},
"external_id": "loan-CO-88231-verify",External IdiYour own reference echoed by Cobre for reconciliation.
"created_at": "2026-06-20T13:45:07Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T13:45:09Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 4 of 12 Loan Disbursement API step

Register the Borrower as a Counterparty

A counterparty is a reusable record of who you pay. Operations registers the borrower's verified Bre-B key once; the returned ID is what you reference on every future payout to them.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"geo": "col",GeographyiCountry domain of the counterparty. col = Colombia.
"type": "breb_key",TypeiThe payment rail. breb_key routes funds to a Bre-B key.
"alias": "Borrower - loan CO-88231",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"key_value": "@JAR1234",Bre-B KeyiThe borrower's Bre-B key — the same one just verified.
"counterparty_phone": "+18800347411",PhoneiBorrower phone, including country code.
"counterparty_email": "borrower@example.co"EmailiBorrower email address.
}
}
Response 201
{
"id": "cp_AWgvElV9js",IdiUnique Cobre identifier for this resource.
"geo": "col",GeographyiCountry domain of the counterparty. col = Colombia.
"type": "breb_key",TypeiThe payment rail. breb_key routes funds to a Bre-B key.
"alias": "Borrower - loan CO-88231",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"key_value": "@JAR1234",Bre-B KeyiThe borrower's Bre-B key — the same one just verified.
"key_type": "alphanumeric",Key TypeiCobre field at "metadata.key_type" in this payload.
"counterparty_phone": "+18800347411",PhoneiBorrower phone, including country code.
"counterparty_email": "borrower@example.co"EmailiBorrower email address.
},
"created_at": "2026-06-20T13:50:22Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T13:50:22Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Documentation for this step
Create a CounterpartyManaging Counterparties
Step 5 of 12 Loan Disbursement API step

Disburse the Loan (Maker)

The maker creates the disbursement with checker_approval set to true in the request body. Cobre sets the Money Movement to pending_approval, locks funds on the source Cobre Balance with a debit transaction, and returns mm_approval_id linking to the approval object. Your maker–checker rules run outside Cobre — once the checker decides, send approved or denied via the Money Movement Approvals API (next steps).

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
idempotencyloan-CO-88231-disb-001
Request body
{
"source_id": "acc_LenderCOP01",Source AccountiYour Cobre COP funding account that money leaves from.
"destination_id": "cp_AWgvElV9js",Destination (Counterparty)iThe counterparty ID from the previous step — the borrower's Bre-B key.
"amount": 50000000,Amount (cents)iAmount in cents — the last two digits are decimals. 50000000 = $500,000.00 COP.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_disbursement"PurposeiFree-form metadata you attach for your own tracking.
},
"external_id": "loan-CO-88231-disb",External IDiYour loan reference, echoed back in responses and webhooks for reconciliation.
"checker_approval": trueChecker approvaliWhen true, Cobre pauses at pending_approval and locks funds on the source account until you submit an approval or denial decision. The response includes mm_approval_id — store it for the decision call.
}
Response 201
{
"id": "mm_xK9mP3q7TZ",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "pending_approval",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "Awaiting checker approval before processing."DescriptioniHuman-readable detail for the current status.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_disbursement"PurposeiFree-form metadata you attach for your own tracking.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-disb",External IDiYour loan reference, echoed back in responses and webhooks for reconciliation.
"checker_approval": true,Checker approvaliWhen true, Cobre pauses at pending_approval and locks funds on the source account until you submit an approval or denial decision. The response includes mm_approval_id — store it for the decision call.
"mm_approval_id": "mma_dnQOheIG9J",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"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_LenderCOP01",Source AccountiYour Cobre COP funding account that money leaves from.
"destination_id": "cp_AWgvElV9js",Destination (Counterparty)iThe counterparty ID from the previous step — the borrower's Bre-B key.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,Amount (cents)iAmount in cents — the last two digits are decimals. 50000000 = $500,000.00 COP.
"created_at": "2026-06-20T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T14:00:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesMoney movement

After your checker approves via the Approvals API and the disbursement clears the rail, Cobre POSTs this to your subscription URL. Mark the loan as funded here. Funds were locked at pending_approval and again during processing — 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_LenderDisbCmp",IdiUnique Cobre identifier for this resource.
"event_key": "money_movements.status.completed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-20T14:32:11Z",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_xK9mP3q7TZ",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "completed",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": ""DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_disbursement",PurposeiMetadata field "purpose" attached to the resource.
"tracking_key": "88231432001"Tracking KeyiBre-B tracking key for the payment.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-disb",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": true,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": "mma_dnQOheIG9J",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"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_LenderCOP01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_AWgvElV9js",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-06-20T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T14:32:11Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
}

Cobre or the rail could not process the movement. Inspect status.code and status.description — common failed codes include:

Possible status codes
F001Payment processing failed — please try again.
F002NSF — not sufficient funds in the designated account.
F003R2P payment link expired (payins).
F004Daily transaction amount limit has been reached.
F005Amount exceeds the maximum allowed transaction limit.
F098Could not process the money movement at this time.
F099Could not process the money movement at this time.
Event money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_LenderDisbCmp",IdiUnique Cobre identifier for this resource.
"event_key": "money_movements.status.failed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-20T14:32:11Z",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_xK9mP3q7TZ",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "failed",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "F002",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "NSF — not sufficient funds in the designated account."DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_disbursement",PurposeiMetadata field "purpose" attached to the resource.
"tracking_key": "88231432001"Tracking KeyiBre-B tracking key for the payment.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-disb",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": true,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": "mma_dnQOheIG9J",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"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_LenderCOP01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_AWgvElV9js",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-06-20T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T14:32:11Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
}

The bank or payment network rejected the transaction. Inspect status.code — common rejected codes include:

Possible status codes
R000Transaction rejected.
R001Inactive or blocked account.
R002Account and identification provided do not coincide.
R005Account does not exist.
R006Invalid account number.
R009Exceeds maximum allowed amount.
R018Payment rejected due to invalid key (payouts).
R023Payment cancelled by the user.
R026Payment rejected due to unavailable bank services.
R034Account closed.
R085Bank processing error (payouts).
Event money_movements.status.rejected
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_LenderDisbCmp",IdiUnique Cobre identifier for this resource.
"event_key": "money_movements.status.rejected",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-20T14:32:11Z",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_xK9mP3q7TZ",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "rejected",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "R001",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "Inactive or blocked account."DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_disbursement",PurposeiMetadata field "purpose" attached to the resource.
"tracking_key": "88231432001"Tracking KeyiBre-B tracking key for the payment.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-disb",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": true,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": "mma_dnQOheIG9J",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"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_LenderCOP01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_AWgvElV9js",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-06-20T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T14:32:11Z"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_xK9mP3q7TZLk",IdiUnique Cobre identifier for this resource.
"event_key": "accounts.balance.debit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-20T14:00: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_xK9mP3q7TZLk",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_LenderCOP01",Account IdiCobre Balance account id affected by the event.
"amount": -50000000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 55000000,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 5000000,Current BalanceiCobre field at "content.current_balance" in this payload.
"currency": "COP",CurrencyiISO currency code (e.g. cop, mxn).
"credit_debit_type": "debit",Credit Debit Typeicredit = funds in; debit = funds out.
"transaction_date": "2026-06-20T14:00:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-06-20T14:00: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_xK9mP3q7TZ",Money Movement IdiMoney Movement that generated this balance transaction.
"tracking_key": "88231432001"Tracking KeyiBre-B tracking key for the payment.
}
}
}

On completion the locked funds are sent to the beneficiary. The processing debit remains on the ledger — no compensation credit is posted.

Event accounts.balance.debit
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_xK9mP3q7TZLk",IdiUnique Cobre identifier for this resource.
"event_key": "accounts.balance.debit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-20T14:00: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_xK9mP3q7TZLk",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_LenderCOP01",Account IdiCobre Balance account id affected by the event.
"amount": -50000000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 55000000,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 5000000,Current BalanceiCobre field at "content.current_balance" in this payload.
"currency": "COP",CurrencyiISO currency code (e.g. cop, mxn).
"credit_debit_type": "debit",Credit Debit Typeicredit = funds in; debit = funds out.
"transaction_date": "2026-06-20T14:00:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-06-20T14:00: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_xK9mP3q7TZ",Money Movement IdiMoney Movement that generated this balance transaction.
"tracking_key": "88231432001"Tracking KeyiBre-B tracking key for the payment.
}
}
}

If the movement reaches a terminal failed, rejected, or canceled state, Cobre credits the source Cobre Balance to release the lock (breb_credit for Bre-B, col_cb_credit for bank rails).

Event accounts.balance.credit
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_xK9mP3q7TZCp",IdiUnique Cobre identifier for this resource.
"event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-20T14:32:11Z",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_xK9mP3q7TZCp",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_LenderCOP01",Account IdiCobre Balance account id affected by the event.
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 50000000,Current BalanceiCobre field at "content.current_balance" in this payload.
"currency": "COP",CurrencyiISO currency code (e.g. cop, mxn).
"credit_debit_type": "credit",Credit Debit Typeicredit = funds in; debit = funds out.
"transaction_date": "2026-06-20T14:32:11Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-06-20T14:32:11Z",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_xK9mP3q7TZ",Money Movement IdiMoney Movement that generated this balance transaction.
"tracking_key": "88231432001"Tracking KeyiBre-B tracking key for the payment.
}
}
}
Step 6 of 12 Loan Disbursement API step

Find the Pending Approval

Your external approval workflow (ERP, treasury tool, or internal checker UI) decides whether to release the disbursement. Cobre holds the payment in pending_approval — use this call to retrieve the Money Movement Approval object and its mma_… ID before submitting the decision.

GET https://api.cobre.co/v1/money_movement_approvals
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
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": "mma_dnQOheIG9J",Approval IDiThe money-movement-approval ID (mma_...) the checker will approve.
"mm_id": "mm_xK9mP3q7TZ",Money Movement IDiThe disbursement this approval gates — matches the money movement just created.
"status": {StatusiLifecycle status object for the resource or movement.
"decision": "pending",Current DecisioniPending until a checker approves or denies.
"description": "",DescriptioniHuman-readable label or note.
"approvers": []ApproversiCobre field at "contents.0.status.approvers" in this payload.
},
"created_at": "2026-06-20T14:00:01Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T14:00:01Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
]
}
Step 7 of 12 Loan Disbursement API step

Approve the Disbursement (Checker)

Submit the checker's decision to Cobre after your external approval workflow completes. Include approvers for auditability — each approval can only be decided once. If approved, the Money Movement continues processing; if denied, Cobre cancels it and releases the hold.

POST https://api.cobre.co/v1/money_movement_approvals/mma_dnQOheIG9J/decision
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"decision": "approved",Decisioniapproved releases the funds; denied cancels the disbursement.
"description": "Approved by Credit Committee.",DescriptioniA note recorded with the decision for your audit trail.
"approvers": [ApproversiCobre field at "approvers" in this payload.
"ceo@lender.co"
]
}
Response 201
{
"id": "mma_dnQOheIG9J",IdiUnique Cobre identifier for this resource.
"mm_id": "mm_xK9mP3q7TZ",Mm IdiMoney Movement id linked to an approval object.
"status": {StatusiLifecycle status object for the resource or movement.
"decision": "approved",DecisioniMoney Movement Approval decision: pending, approved, or denied.
"description": "Approved by Credit Committee.",DescriptioniHuman-readable detail for the current status.
"approvers": [ApproversiCobre field at "status.approvers" in this payload.
"ceo@lender.co"
]
},
"created_at": "2026-06-20T14:00:01Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-20T14:05:33Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 8 of 12 Loan Disbursement Reconciliation

Update the Loan from the Disbursement Webhook

After checker_approval, external decision, and rail settlement, Cobre delivers the money_movements.status.completed webhook from the disbursement step. No API call is needed — read the payload and update your loan-management system in real time.

Mapping the webhook payload from an earlier step onto Loan Management System. No API call is made — this step closes the loop in your own system.

Cobre field & valueLoan Management System field
content.external_id
loan-CO-88231-disb
loan_disbursement_ref
Your own reference — use it to locate the loan record.
content.id
mm_xK9mP3q7TZ
cobre_payment_id
Store as the canonical Cobre payment id for audit.
content.status.state
completed
loan_status
Map completed -> FUNDED; rejected/failed -> DISBURSEMENT_FAILED.
content.amount
50000000
disbursed_amount_cents
content.updated_at
2026-06-20T14:32:11Z
funded_at
Step 9 of 12 Repayment API step

Set Up the Borrower for Bre-B Collection

To collect a repayment you register the borrower as an r2p_breb counterparty. This lets you send them a Bre-B request-to-pay; the returned ID is referenced as the source of the collection.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"geo": "col",GeographyiCountry domain. col = Colombia.
"type": "r2p_breb",Typeir2p_breb = Bre-B request-to-pay collection.
"alias": "Repayment - loan CO-88231",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_fullname": "Juliana Restrepo",Full NameiThe borrower's full name.
"counterparty_id_type": "cc",ID TypeiIdentification type of the borrower.
"counterparty_id_number": "5334623427",ID NumberiThe borrower's identification number.
"counterparty_email": "borrower@example.co"EmailiBorrower email — used for PSE/Bre-B updates; must be valid or the movement fails.
}
}
Response 201
{
"id": "cp_R2pBrwr88231",IdiUnique Cobre identifier for this resource.
"geo": "col",GeographyiCountry domain. col = Colombia.
"type": "r2p_breb",Typeir2p_breb = Bre-B request-to-pay collection.
"alias": "Repayment - loan CO-88231",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_fullname": "Juliana Restrepo",Full NameiThe borrower's full name.
"counterparty_id_type": "cc",ID TypeiIdentification type of the borrower.
"counterparty_id_number": "5334623427",ID NumberiThe borrower's identification number.
"counterparty_email": "borrower@example.co"EmailiBorrower email — used for PSE/Bre-B updates; must be valid or the movement fails.
},
"created_at": "2026-07-20T09:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-20T09:00:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Documentation for this step
Create a CounterpartyManaging Counterparties
Step 10 of 12 Repayment API step

Request Repayment via Bre-B

The borrower receives a Bre-B request-to-pay in the Crédito Ágil app and confirms it. On your side this is a money movement payin: the source is the borrower's r2p_breb counterparty and the destination is your funding account.

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
idempotencyloan-CO-88231-repay-001
Request body
{
"source_id": "cp_R2pBrwr88231",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_LenderCOP01",Destination IdiCobre id of the destination account or counterparty.
"amount": 50000000,Amount to pay (cents)iAmount in cents — last two digits are decimals. 50000000 = $500,000.00 COP.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_repayment"PurposeiCobre field at "metadata.purpose" in this payload.
},
"external_id": "loan-CO-88231-repay"ReferenceiYour repayment reference, echoed in responses and webhooks for reconciliation.
}
Response 201
{
"id": "mm_RepayQ7x2Lc",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": "Request to pay sent to the borrower; awaiting authorization."DescriptioniHuman-readable detail for the current status.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_repayment",PurposeiCobre field at "metadata.purpose" in this payload.
"r2p_rail": "breb_key",R2p RailiCobre field at "metadata.r2p_rail" in this payload.
"description_to_payer": "Loan repayment CO-88231",Description To PayeriCobre field at "metadata.description_to_payer" in this payload.
"description_to_payee": "Loan repayment CO-88231"Description To PayeeiCobre field at "metadata.description_to_payee" in this payload.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-repay",ReferenceiYour repayment reference, echoed in responses and webhooks for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "r2p_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": "cp_R2pBrwr88231",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_LenderCOP01",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,Amount to pay (cents)iAmount in cents — last two digits are decimals. 50000000 = $500,000.00 COP.
"created_at": "2026-07-20T09:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-20T09:05:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesMoney movement

When the borrower authorizes the Bre-B request-to-pay and the funds settle into your account, Cobre delivers this. Mark the installment as paid on receipt. Cobre also credits your funding balance (r2p_breb_credit) — 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_LenderRepayCmp",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-20T09:07:48Z",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_RepayQ7x2Lc",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "completed",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": ""DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_repayment",PurposeiMetadata field "purpose" attached to the resource.
"r2p_rail": "breb_key",R2p RailiMetadata field "r2p_rail" attached to the resource.
"description_to_payer": "Loan repayment CO-88231",Description To PayeriMetadata field "description_to_payer" attached to the resource.
"description_to_payee": "Loan repayment CO-88231",Description To PayeeiMetadata field "description_to_payee" attached to the resource.
"tracking_key": "88231074801",Tracking KeyiBre-B tracking key for the payment.
"key_value": "@BorrowerKey88231",Key ValueiBre-B key value (e.g. @merchant123).
"sender_name": "Juliana Restrepo",Sender NameiMetadata field "sender_name" attached to the resource.
"sender_id": "5334623427",Sender IdiMetadata field "sender_id" attached to the resource.
"sender_id_type": "cc",Sender Id TypeiMetadata field "sender_id_type" attached to the resource.
"sender_bank_code": "1007"Sender Bank CodeiMetadata field "sender_bank_code" attached to the resource.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-repay",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "r2p_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": "cp_R2pBrwr88231",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_LenderCOP01",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-07-20T09:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-20T09:07:48Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
}

Cobre or the rail could not process the movement. Inspect status.code and status.description — common failed codes include:

Possible status codes
F001Payment processing failed — please try again.
F002NSF — not sufficient funds in the designated account.
F003R2P payment link expired (payins).
F004Daily transaction amount limit has been reached.
F005Amount exceeds the maximum allowed transaction limit.
F098Could not process the money movement at this time.
F099Could not process the money movement at this time.
Event money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_LenderRepayCmp",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-20T09:07:48Z",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_RepayQ7x2Lc",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "failed",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "F002",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "NSF — not sufficient funds in the designated account."DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_repayment",PurposeiMetadata field "purpose" attached to the resource.
"r2p_rail": "breb_key",R2p RailiMetadata field "r2p_rail" attached to the resource.
"description_to_payer": "Loan repayment CO-88231",Description To PayeriMetadata field "description_to_payer" attached to the resource.
"description_to_payee": "Loan repayment CO-88231",Description To PayeeiMetadata field "description_to_payee" attached to the resource.
"tracking_key": "88231074801",Tracking KeyiBre-B tracking key for the payment.
"key_value": "@BorrowerKey88231",Key ValueiBre-B key value (e.g. @merchant123).
"sender_name": "Juliana Restrepo",Sender NameiMetadata field "sender_name" attached to the resource.
"sender_id": "5334623427",Sender IdiMetadata field "sender_id" attached to the resource.
"sender_id_type": "cc",Sender Id TypeiMetadata field "sender_id_type" attached to the resource.
"sender_bank_code": "1007"Sender Bank CodeiMetadata field "sender_bank_code" attached to the resource.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-repay",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "r2p_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": "cp_R2pBrwr88231",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_LenderCOP01",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-07-20T09:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-20T09:07:48Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
}

The bank or payment network rejected the transaction. Inspect status.code — common rejected codes include:

Possible status codes
R000Transaction rejected.
R001Inactive or blocked account.
R002Account and identification provided do not coincide.
R005Account does not exist.
R006Invalid account number.
R009Exceeds maximum allowed amount.
R018Payment rejected due to invalid key (payouts).
R023Payment cancelled by the user.
R026Payment rejected due to unavailable bank services.
R034Account closed.
R085Bank processing error (payouts).
Event money_movements.status.rejected
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_LenderRepayCmp",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-20T09:07:48Z",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_RepayQ7x2Lc",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "rejected",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "R001",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "Inactive or blocked account."DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"purpose": "loan_repayment",PurposeiMetadata field "purpose" attached to the resource.
"r2p_rail": "breb_key",R2p RailiMetadata field "r2p_rail" attached to the resource.
"description_to_payer": "Loan repayment CO-88231",Description To PayeriMetadata field "description_to_payer" attached to the resource.
"description_to_payee": "Loan repayment CO-88231",Description To PayeeiMetadata field "description_to_payee" attached to the resource.
"tracking_key": "88231074801",Tracking KeyiBre-B tracking key for the payment.
"key_value": "@BorrowerKey88231",Key ValueiBre-B key value (e.g. @merchant123).
"sender_name": "Juliana Restrepo",Sender NameiMetadata field "sender_name" attached to the resource.
"sender_id": "5334623427",Sender IdiMetadata field "sender_id" attached to the resource.
"sender_id_type": "cc",Sender Id TypeiMetadata field "sender_id_type" attached to the resource.
"sender_bank_code": "1007"Sender Bank CodeiMetadata field "sender_bank_code" attached to the resource.
},
"creator": "cli_lender_co_01",CreatoriAPI client id that created this resource.
"external_id": "loan-CO-88231-repay",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "r2p_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": "cp_R2pBrwr88231",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_LenderCOP01",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-07-20T09:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-20T09:07:48Z"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_RepayQ7x2LCr",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-20T09:07:48Z",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_RepayQ7x2LcCr",IdiUnique Cobre identifier for this resource.
"type": "r2p_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_LenderCOP01",Account IdiCobre Balance account id affected by the event.
"amount": 50000000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 50000000,Current BalanceiCobre field at "content.current_balance" in this payload.
"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-20T09:07:48Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-07-20T09:07:48Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"sender_account_number": "",Sender Account NumberiMetadata field "sender_account_number" attached to the resource.
"sender_account_type": "ch",Sender Account TypeiMetadata field "sender_account_type" attached to the resource.
"sender_bank_code": "1007",Sender Bank CodeiMetadata field "sender_bank_code" attached to the resource.
"sender_id": "5334623427",Sender IdiMetadata field "sender_id" attached to the resource.
"sender_id_type": "cc",Sender Id TypeiMetadata field "sender_id_type" attached to the resource.
"key_value": "@BorrowerKey88231",Key ValueiBre-B key value (e.g. @merchant123).
"sender_name": "Juliana Restrepo",Sender NameiMetadata field "sender_name" attached to the resource.
"description": "Loan repayment CO-88231",DescriptioniHuman-readable label or note.
"money_movement_id": "mm_RepayQ7x2Lc"Money Movement IdiMoney Movement that generated this balance transaction.
}
}
}
Step 11 of 12 Reconciliation API step

Generate the D+1 Cobre Balance Statement

At end-of-day or D+1, generate an account statement to reconcile every disbursement and repayment against your ledger in bulk. You ask for the statement; Cobre produces a downloadable file.

POST https://api.cobre.co/v1/reports
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfbGVuZGVyX2NvXzAxIn0.s7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"resource": "accounts",ResourceiWhat the report covers. accounts = account statements.
"layout": "cobre_balance_statements_v1",LayoutiThe report layout / format template.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"account_id": "acc_LenderCOP01",AccountiWhich account to produce the statement for — your COP funding account.
"statement_date": "2026-07"Statement PeriodiThe period to report on (YYYY-MM).
}
}
Response 201
{
"id": "repo_kJs8GO03vC",IdiUnique Cobre identifier for this resource.
"resource": "accounts",ResourceiWhat the report covers. accounts = account statements.
"start_date": "2026-07-01T00:00:00Z",Start DateiCobre field at "start_date" in this payload.
"end_date": "2026-07-31T23:59:59Z",End DateiCobre field at "end_date" in this payload.
"file_name": "2026-07_accounts_repo_kJs8GO03vC_acc_LenderCOP01",File NameiCobre field at "file_name" in this payload.
"file_format": "pdf",File FormatiCobre field at "file_format" in this payload.
"file_layout": "cobre_balance_statements_v1",File LayoutiCobre field at "file_layout" in this payload.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"account_id": "acc_LenderCOP01",AccountiWhich account to produce the statement for — your COP funding account.
"statement_date": "2026-07"Statement PeriodiThe period to report on (YYYY-MM).
},
"sensitive_data": false,Sensitive DataiCobre field at "sensitive_data" in this payload.
"requested_at": "2026-08-01T00:00:01Z",Requested AtiCobre field at "requested_at" in this payload.
"created_at": "2026-08-01T00:01:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).
}
Documentation for this step
Create a Cobre Balance StatementReports Guide
Step 12 of 12 Reconciliation Reconciliation

Reconcile the Statement to Your Ledger

The final close: map the generated statement onto your accounting ledger. This is the batch counterpart to the real-time webhooks — once these fields line up, the lending cycle is provably closed.

Mapping the Cobre report from an earlier step onto Accounting Ledger. No API call is made — this step closes the loop in your own system.

Cobre field & valueAccounting Ledger field
id
repo_kJs8GO03vC
statement_reference
The report id, stored against the reconciliation batch.
file_name
2026-07_accounts_repo_kJs8GO03vC_acc_LenderCOP01
statement_file
metadata.account_id
acc_LenderCOP01
gl_account
end_date
2026-07-31T23:59:59Z
period_close_date