Step 1 of 29 Configuration API step

Authenticate

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

POST https://api.cobre.co/v1/auth
Headers
Content-Typeapplication/json
Request body
{
"user_id": "cli_psp_latam01",User IDRequirediAPI user id issued by Cobre (cli_…).
"secret": "sk_live_PspLat9xK2v"SecretRequirediAPI secret from key creation — treat like a password.
}
Response 201
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ",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 29 Configuration API step

Subscribe to PSP Events

Subscribe to Money Movement, Cross-Border, balance credit/debit, and self_custodian_wallet status events for the full omnibus treasury lifecycle.

POST https://api.cobre.co/v1/subscriptions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"url": "https://gaming.example.co/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications.
"description": "LATAM gaming PSP omnibus lifecycle",DescriptioniLabel for this subscription in the Cobre portal.
"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.failed",
"money_movements.status.rejected",
"money_movements.status.returned",
"cross_border_money_movements.status.initiated",
"cross_border_money_movements.status.processing",
"cross_border_money_movements.status.completed",
"cross_border_money_movements.status.rejected",
"accounts.balance.credit",
"accounts.balance.debit",
"self_custodian_wallet.status.enabled",
"self_custodian_wallet.status.processing",
"self_custodian_wallet.status.failed",
"self_custodian_wallet.status.blocked",
"self_custodian_wallet.status.disabled"
],
"event_signature_key": "WHchkCo9xZ"Signature keyRequirediSecret you provide; Cobre HMAC-signs each delivery.
}
Response 201
{
"id": "sub_PspLatam01",IdiUnique Cobre identifier for this resource.
"url": "https://gaming.example.co/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications.
"description": "LATAM gaming PSP omnibus lifecycle",DescriptioniLabel for this subscription in the Cobre portal.
"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.failed",
"money_movements.status.rejected",
"money_movements.status.returned",
"cross_border_money_movements.status.initiated",
"cross_border_money_movements.status.processing",
"cross_border_money_movements.status.completed",
"cross_border_money_movements.status.rejected",
"accounts.balance.credit",
"accounts.balance.debit",
"self_custodian_wallet.status.enabled",
"self_custodian_wallet.status.processing",
"self_custodian_wallet.status.failed",
"self_custodian_wallet.status.blocked",
"self_custodian_wallet.status.disabled"
],
"event_signature_key": "******9xZ",Signature keyRequirediSecret you provide; Cobre HMAC-signs each delivery.
"created_at": "2026-07-03T10:00:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).
}
Step 3 of 29 Configuration API step

Create COP Omnibus Cobre Balance

Provision the COP Cobre Balance that receives converted funds (Cross-Border destination_id) and funds every local payout (source_id).

POST https://api.cobre.co/v1/accounts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
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": "Gaming PSP COP Omnibus"AliasiDisplay name that helps identify it and clarify its purpose.
}
Response 201
{
"id": "acc_PspColOmnibus01",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.
"connectivity": {ConnectivityiConnection/registration status for keys or accounts.
"status": "connected",StatusiLifecycle status object for the resource or movement.
"description": ""DescriptioniHuman-readable label or note.
},
"alias": "Gaming PSP COP Omnibus",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"available_services": [Available ServicesiCobre field at "metadata.available_services" in this payload.
"mm_push_from_account"
]
},
"account_number": "",Account NumberiBank account or CLABE number for the counterparty.
"account_type": "Cobre Balance",Account TypeiCobre field at "account_type" in this payload.
"obtained_balance": 0,Obtained BalanceiCobre field at "obtained_balance" in this payload.
"obtained_balance_at": "2026-06-03T09:05:00Z",Obtained Balance AtiCobre field at "obtained_balance_at" in this payload.
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"tags": [],TagsiCobre field at "tags" in this payload.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"created_at": "2026-06-03T09:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-03T09:05:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 4 of 29 Configuration API step

Create MXN Omnibus Cobre Balance

Create the Mexican MXN Payout balance first (primary account). It must exist before the Payin balance — Payin accounts reference it via metadata.primary_account for automatic sweeps. Also the source for local payouts and Cross-Border FX.

POST https://api.cobre.co/v1/accounts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"provider_id": "pr_mex_cobre3",ProviderRequirediCobre field at "provider_id" in this payload.
"action": "create",ActionRequirediCobre field at "action" in this payload.
"alias": "Gaming PSP MXN Omnibus"AliasiDisplay name that helps identify it and clarify its purpose.
}
Response 201
{
"id": "acc_PspMexOmnibus01",IdiUnique Cobre identifier for this resource.
"provider_id": "pr_mex_cobre3",ProviderRequirediCobre field at "provider_id" in this payload.
"provider_name": "Cobre Balance Mexico",Provider NameiCobre field at "provider_name" in this payload.
"connectivity": {ConnectivityiConnection/registration status for keys or accounts.
"status": "connected",StatusiLifecycle status object for the resource or movement.
"description": ""DescriptioniHuman-readable label or note.
},
"alias": "Gaming PSP MXN Omnibus",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"available_services": [Available ServicesiCobre field at "metadata.available_services" in this payload.
"mm_push_from_account",
"account_transactions"
]
},
"account_number": "",Account NumberiBank account or CLABE number for the counterparty.
"account_type": "clabe",Account TypeiCobre field at "account_type" in this payload.
"obtained_balance": 0,Obtained BalanceiCobre field at "obtained_balance" in this payload.
"geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"tags": [],TagsiCobre field at "tags" in this payload.
"currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn).
"created_at": "2026-07-06T10:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-06T10:05:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 5 of 29 Configuration API step

Create USD Global Omnibus Cobre Balance

Provision the USD Global Cobre Balance that holds treasury funding (SWIFT / local USD transfer) and is the source_id of every Cross-Border Money Movement. Request US funding instructions from your KAM after creation.

POST https://api.cobre.co/v1/accounts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"provider_id": "pr_global_cobre",ProviderRequirediCobre field at "provider_id" in this payload.
"action": "create",ActionRequirediCobre field at "action" in this payload.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"currency": "usd"CurrencyRequirediISO currency code (e.g. cop, mxn).
},
"alias": "Gaming PSP USD Global"AliasiDisplay name that helps identify it and clarify its purpose.
}
Response 201
{
"id": "acc_PspGlobalUsd01",IdiUnique Cobre identifier for this resource.
"provider_id": "pr_global_cobre",ProviderRequirediCobre field at "provider_id" in this payload.
"provider_name": "Cobre Balance Global",Provider NameiCobre field at "provider_name" in this payload.
"connectivity": {ConnectivityiConnection/registration status for keys or accounts.
"status": "connected",StatusiLifecycle status object for the resource or movement.
"description": ""DescriptioniHuman-readable label or note.
},
"alias": "Gaming PSP USD Global",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"available_services": [Available ServicesiCobre field at "metadata.available_services" in this payload.
"mm_push_from_account"
],
"cobre_tag": "@remit00001"Cobre TagiCobre Balance tag identifying the destination account.
},
"account_number": "",Account NumberiBank account or CLABE number for the counterparty.
"account_type": "cobre_balance",Account TypeiCobre field at "account_type" in this payload.
"obtained_balance": 0,Obtained BalanceiCobre field at "obtained_balance" in this payload.
"obtained_balance_at": "2026-06-03T09:00:00Z",Obtained Balance AtiCobre field at "obtained_balance_at" in this payload.
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"tags": [],TagsiCobre field at "tags" in this payload.
"currency": "usd",CurrencyiISO currency code (e.g. cop, mxn).
"created_at": "2026-06-03T09:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-03T09:00:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 6 of 29 Colombia Checkout Payin API step

Register the Payer (r2p Counterparty)

Pre-register the payer as an r2p counterparty and pass source_id when creating the Checkout. Email is used for PSE authentication; phone for Nequi push. Cobre can collect payer data on the hosted page if you skip this step — this flow shows explicit counterparty creation for faster checkout and pre-filled payer details.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"geo": "col",GeographyRequiredicol = Colombia.
"type": "r2p",TypeRequiredir2p supports all Checkout rails (PSE, Bancolombia, Nequi, Bre-B).
"alias": "Checkout payer - payin_ref_gaming002",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_fullname": "Juliana Restrepo",Full nameRequirediPayer's full legal name.
"counterparty_email": "payer@example.co",EmailRequirediRequired for PSE bank authentication on Checkout.
"counterparty_id_type": "cc",ID typeRequirediColombian identification type.
"counterparty_id_number": "5334623427",ID numberRequirediPayer identification number.
"counterparty_phone": "+573123927834"PhoneRequirediUsed for Nequi push notifications on Checkout.
}
}
Response 201
{
"id": "cp_PayerGaming01",IdiUnique Cobre identifier for this resource.
"geo": "col",GeographyRequiredicol = Colombia.
"type": "r2p",TypeRequiredir2p supports all Checkout rails (PSE, Bancolombia, Nequi, Bre-B).
"alias": "Checkout payer - payin_ref_gaming002",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_email": "payer@example.co",EmailRequirediRequired for PSE bank authentication on Checkout.
"counterparty_fullname": "Juliana Restrepo",Full nameRequirediPayer's full legal name.
"counterparty_id_number": "5334623427",ID numberRequirediPayer identification number.
"counterparty_id_type": "cc",ID typeRequirediColombian identification type.
"counterparty_phone": "+573123927834"PhoneRequirediUsed for Nequi push notifications on Checkout.
},
"created_at": "2026-07-03T10:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-03T10:05:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 7 of 29 Colombia Checkout Payin API step

Create Checkout (All Rails)

Create a hosted Checkout link credited to your COP Cobre Balance. Set checkout_rails to all four Colombia options: pse, bancolombia, nequi, breb — the payer chooses the method on Cobre's hosted page. Pass source_id from the registered counterparty. Amount is integer cents (500000 = COP 5,000.00). Share checkout_url with the customer or redirect them there.

POST https://api.cobre.co/v1/checkouts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"alias": "Order payin_ref_gaming002",AliasiDisplay name that helps identify it and clarify its purpose.
"amount": 500000,Amount (cents)Requiredi500000 cents = COP 5,000.00. Use -1 for open amount.
"external_id": "payin_ref_gaming002",External IDiYour order reference — copied to the Money Movement for reconciliation.
"source_id": "cp_PayerGaming01",Payer counterpartyRequiredicp_… from the registered r2p payer.
"destination_id": "acc_PspColOmnibus01",Destination balanceRequirediYour COP Cobre Balance that receives the payin.
"checkout_rails": [Checkout RailsiCobre field at "checkout_rails" in this payload.
"pse",
"bancolombia",
"nequi",
"breb"
],
"checkout_header": "Your Platform",Checkout headerRequirediTitle shown on the hosted Checkout page.
"checkout_item": "Order #002",Item descriptionRequirediProduct or service label on Checkout (max 40 chars).
"description_to_payee": "Checkout payment",Balance descriptioniDescription on the credit transaction in your Cobre Balance.
"valid_until": "2050-12-31T23:59:00Z",Valid untilRequirediISO 8601 expiry. Use -1 for no expiration.
"money_movement_intent_limit": 1,Payment limitRequiredi1 = single-use link. Use -1 for unlimited reusable link.
"redirect_url": "https://gaming.example.co/checkout/return"Return URLRequirediWhere Cobre redirects the payer after the confirmation screen.
}
Response 201
{
"id": "chk_GamingDemo01",IdiUnique Cobre identifier for this resource.
"alias": "Order payin_ref_gaming002",AliasiDisplay name that helps identify it and clarify its purpose.
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"amount": 500000,Amount (cents)Requiredi500000 cents = COP 5,000.00. Use -1 for open amount.
"external_id": "payin_ref_gaming002",External IDiYour order reference — copied to the Money Movement for reconciliation.
"source_id": "cp_PayerGaming01",Payer counterpartyRequiredicp_… from the registered r2p payer.
"destination_id": "acc_PspColOmnibus01",Destination balanceRequirediYour COP Cobre Balance that receives the payin.
"checkout_rails": [Checkout RailsiCobre field at "checkout_rails" in this payload.
"pse",
"bancolombia",
"nequi",
"breb"
],
"checkout_header": "Your Platform",Checkout headerRequirediTitle shown on the hosted Checkout page.
"checkout_item": "Order #002",Item descriptionRequirediProduct or service label on Checkout (max 40 chars).
"valid_until": "2050-12-31T23:59:00Z",Valid untilRequirediISO 8601 expiry. Use -1 for no expiration.
"money_movement_intent_limit": 1,Payment limitRequiredi1 = single-use link. Use -1 for unlimited reusable link.
"money_movement_created": 0,Money Movement CreatediCobre field at "money_movement_created" in this payload.
"redirect_url": "https://gaming.example.co/checkout/return",Return URLRequirediWhere Cobre redirects the payer after the confirmation screen.
"checkout_url": "https://links.cobre.co/ChkDemo01",Checkout UrliCobre field at "checkout_url" in this payload.
"description_to_payee": "Checkout payment",Balance descriptioniDescription on the credit transaction in your Cobre Balance.
"active": true,ActiveiCobre field at "active" in this payload.
"created_at": "2026-07-03T10:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-03T10:10:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Documentation for this step
Create a CheckoutCheckout Guide
Step 8 of 29 Colombia Checkout Payin API step

Payment Completed (Webhook)

POST /checkouts does not return a Money Movement. When the payer finishes on the hosted page, Cobre creates an R2P MM and sends money_movements.status.*. Poll GET /money_movements/{mm_id} if needed (nested defaults to false — source and destination are null). batch_id equals the Checkout chk_…; creator is the r2p source counterparty. This demo is a completed PSE payment; other rails produce r2p_nequi, r2p_bancolombia, or r2p_breb.

GET https://api.cobre.co/v1/money_movements/mm_ChkGaming001
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Response 200
{
"id": "mm_ChkGaming001",Money Movement IDRequiredimm_… created by Checkout when payment completes.
"batch_id": "chk_GamingDemo01",Checkout IDRequirediEquals the Checkout chk_… that initiated this payment.
"external_id": "payin_ref_gaming002",External IDRequirediYour order reference from the Checkout request.
"creator": "cp_PayerGaming01",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 typeRequirediMM type reflects the rail the payer chose (e.g. r2p_pse).
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"status": {StatusiLifecycle status object for the resource or movement.
"state": "completed",StatusRequiredicompleted when funds have settled to your Cobre Balance.
"code": "",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": ""DescriptioniHuman-readable detail for the current status.
},
"source_id": "cp_PayerGaming01",Source counterpartyRequirediCobre id of the source account or counterparty.
"source": null,SourceiCobre field at "source" in this payload.
"destination_id": "acc_PspColOmnibus01",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": 500000,AmountiAmount in cents — the last two digits are decimals.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"r2p_rail": "pse",R2P railRequirediRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb).
"tracking_key": "558741001",Tracking keyRequirediNetwork tracking key for the payment (PSE ticket or Bre-B key).
"payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkdemo001",Payment linkRequirediRail-hosted URL the payer used to complete the payment (e.g. PSE).
"description_to_payer": "Order #002",Description To PayeriPayer-facing description. On Checkout this is checkout_item.
"description_to_payee": "Checkout payment",Description To PayeeiDescription that appears on the credit in your Cobre Balance.
"redirect_url": "https://links.cobre.co/ChkDemo01",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",Bank codeRequirediBank code the payer selected (PSE). See Colombian bank codes.
"ticket_id": "178648058366091001"Ticket IDRequirediTicket 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-03T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-03T10:20:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesMoney movement

Cobre delivers this when the Checkout payment reaches completed. Use external_id to mark your order paid and batch_id to tie back to the Checkout link. creator and source_id are the r2p counterparty. Cobre credits your Cobre Balance (r2p_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_ChkPayin001Cmp",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-03T10:20: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_ChkGaming001",IdiUnique Cobre identifier for this resource.
"batch_id": "chk_GamingDemo01",Batch IdiCheckout id (chk_…) when the Money Movement was created from a Checkout; otherwise the bulk batch id (bat_…).
"external_id": "payin_ref_gaming002",External IdiYour own reference echoed by Cobre for reconciliation.
"creator": "cp_PayerGaming01",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_PayerGaming01",Source IdiCobre id of the source account or counterparty.
"source": null,SourceiCobre field at "content.source" in this payload.
"destination_id": "acc_PspColOmnibus01",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": 500000,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": "558741001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkdemo001",Payment LinkiRail-hosted URL the payer used to complete the payment (e.g. PSE).
"description_to_payer": "Order #002",Description To PayeriPayer-facing description. On Checkout this is checkout_item.
"description_to_payee": "Checkout payment",Description To PayeeiDescription that appears on the credit in your Cobre Balance.
"redirect_url": "https://links.cobre.co/ChkDemo01",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": "178648058366091001"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-03T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-03T10:20: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_ChkPayin001Cmp",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-03T10:20: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_ChkGaming001",IdiUnique Cobre identifier for this resource.
"batch_id": "chk_GamingDemo01",Batch IdiCheckout id (chk_…) when the Money Movement was created from a Checkout; otherwise the bulk batch id (bat_…).
"external_id": "payin_ref_gaming002",External IdiYour own reference echoed by Cobre for reconciliation.
"creator": "cp_PayerGaming01",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_PayerGaming01",Source IdiCobre id of the source account or counterparty.
"source": null,SourceiCobre field at "content.source" in this payload.
"destination_id": "acc_PspColOmnibus01",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": 500000,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": "558741001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkdemo001",Payment LinkiRail-hosted URL the payer used to complete the payment (e.g. PSE).
"description_to_payer": "Order #002",Description To PayeriPayer-facing description. On Checkout this is checkout_item.
"description_to_payee": "Checkout payment",Description To PayeeiDescription that appears on the credit in your Cobre Balance.
"redirect_url": "https://links.cobre.co/ChkDemo01",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": "178648058366091001"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-03T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-03T10:20: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_ChkPayin001Cmp",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-03T10:20: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_ChkGaming001",IdiUnique Cobre identifier for this resource.
"batch_id": "chk_GamingDemo01",Batch IdiCheckout id (chk_…) when the Money Movement was created from a Checkout; otherwise the bulk batch id (bat_…).
"external_id": "payin_ref_gaming002",External IdiYour own reference echoed by Cobre for reconciliation.
"creator": "cp_PayerGaming01",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_PayerGaming01",Source IdiCobre id of the source account or counterparty.
"source": null,SourceiCobre field at "content.source" in this payload.
"destination_id": "acc_PspColOmnibus01",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": 500000,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": "558741001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"payment_link": "https://registro.pse.com.co/PSENF/index.html?enc=_chkdemo001",Payment LinkiRail-hosted URL the payer used to complete the payment (e.g. PSE).
"description_to_payer": "Order #002",Description To PayeriPayer-facing description. On Checkout this is checkout_item.
"description_to_payee": "Checkout payment",Description To PayeeiDescription that appears on the credit in your Cobre Balance.
"redirect_url": "https://links.cobre.co/ChkDemo01",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": "178648058366091001"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-03T10:15:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-03T10:20: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_ChkGaming0Cr",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-03T10:20: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_ChkGaming001Cr",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_PspColOmnibus01",Account IdiCobre Balance account id affected by the event.
"amount": 500000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 500000,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-03T10:20:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-07-03T10:20: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_ChkGaming001",Money Movement IdiMoney Movement that generated this balance transaction.
"description": "Checkout payment",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": "558741001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"sender_id": ""Sender IdiMetadata field "sender_id" attached to the resource.
}
}
}
Step 9 of 29 Colombia Checkout Payin Reconciliation

Reconcile the Checkout Payin

Match the MM completion webhook to your platform ledger on external_id. Use content.batch_id to tie the payment back to the Checkout (chk_…). Cross-check the COP balance credit via GET /accounts/{acct_id}/transactions. For D+1 close, export payins with POST /reports.

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

Cobre field & valuePlatform ledger field
content.external_id
payin_ref_gaming002
order_reference
Primary join key — your order or payin id.
content.id
mm_ChkGaming001
cobre_mm_id
content.batch_id
chk_GamingDemo01
checkout_id
Checkout id — correlates the MM to the hosted link that initiated payment.
content.amount
500000
received_amount_cents
content.status.state
completed
payin_status
Map completed → PAID; failed/rejected → review or re-issue Checkout.
content.type
r2p_pse
payin_rail
Rail the payer chose on Checkout (r2p_pse, r2p_nequi, r2p_bancolombia, r2p_breb, …).
Step 10 of 29 Colombia Fast Pay Payout API step

Create Merchant Beneficiary

Register the Colombia merchant beneficiary for Fast Pay / ACH payout from the COP omnibus balance.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"geo": "col",GeographyRequiredicol = Colombia.
"type": "cc",Account TypeRequiredicc = Cuenta Corriente (checking), ch = Ahorros (savings), dp = Depósito.
"alias": "Merchant payout beneficiary",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_fullname": "Acme Vendor SAS",Beneficiary NameRequirediLegal name of the account holder.
"beneficiary_institution": "1007",Bank CodeRequirediBeneficiary institution code from Cobre's platform catalog (e.g. 1007 = Bancolombia).
"account_number": "1013555555",Account NumberRequirediThe destination bank account number.
"counterparty_id_type": "nit",ID TypeRequirediIdentification type of the beneficiary.
"counterparty_id_number": "9001234567"ID NumberRequirediThe beneficiary's identification number.
}
}
Response 201
{
"id": "cp_MerchantCol01",IdiUnique Cobre identifier for this resource.
"geo": "col",GeographyRequiredicol = Colombia.
"type": "cc",Account TypeRequiredicc = Cuenta Corriente (checking), ch = Ahorros (savings), dp = Depósito.
"alias": "Merchant payout beneficiary",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_fullname": "Acme Vendor SAS",Beneficiary NameRequirediLegal name of the account holder.
"beneficiary_institution": "1007",Bank CodeRequirediBeneficiary institution code from Cobre's platform catalog (e.g. 1007 = Bancolombia).
"account_number": "1013555555",Account NumberRequirediThe destination bank account number.
"counterparty_id_type": "nit",ID TypeRequirediIdentification type of the beneficiary.
"counterparty_id_number": "9001234567",ID NumberRequirediThe beneficiary's identification number.
"registered_account": falseRegistered AccountiCobre field at "metadata.registered_account" in this payload.
},
"created_at": "2026-06-26T12:30:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-26T12:30:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Documentation for this step
Create a CounterpartyManaging Counterparties
Step 11 of 29 Colombia Fast Pay Payout API step

Send the Fast Pay Payout

Create a Money Movement to the bank counterparty. Cobre routes it over Fast Pay (near real-time) when the destination bank supports it, automatically falling back to ACH (batch) otherwise — the response type tells you which rail was used ('fast_pay' here). checker_approval is false for immediate payout; set true for maker–checker (Money Movements Approval guide).

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
idempotencypayout_merchant001-001
Request body
{
"amount": 3000000,Amount (cents)RequirediAmount in cents. 3000000 = $30,000.00 COP.
"source_id": "acc_PspColOmnibus01",Source (funding balance)RequirediYour funding Cobre Balance.
"destination_id": "cp_MerchantCol01",Destination (counterparty)RequirediThe bank-account counterparty from the previous step.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"description": "Supplier payout FastPay"DescriptionRequirediInformative description (max 40 chars).
},
"external_id": "payout_merchant001"External IDiYour payout reference, echoed in the response and webhook.
}
Response 201
{
"id": "mm_FastPayGaming01",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "initiated",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": ""DescriptioniHuman-readable detail for the current status.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"description": "Supplier payout FastPay"DescriptionRequirediInformative description (max 40 chars).
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payout_merchant001",External IDiYour payout reference, echoed in the response and webhook.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspColOmnibus01",Source (funding balance)RequirediYour funding Cobre Balance.
"destination_id": "cp_MerchantCol01",Destination (counterparty)RequirediThe bank-account counterparty from the previous step.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 3000000,Amount (cents)RequirediAmount in cents. 3000000 = $30,000.00 COP.
"created_at": "2026-06-26T12:35:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-26T12:35:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesMoney movement

Fires when the Fast Pay payout settles. If the bank had not supported Fast Pay, type would be 'ach' and settlement D+0/D+1 — but your reconciliation logic is identical. Funds were locked with a col_cb_debit 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_FastPay5568Cmp",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-26T12:35:21Z",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_FastPayGaming01",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "completed",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": ""DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"description": "Supplier payout FastPay"DescriptioniHuman-readable label or note.
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payout_merchant001",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspColOmnibus01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_MerchantCol01",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 3000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-06-26T12:35:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-26T12:35:21Z"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_FastPay5568Cmp",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-26T12:35:21Z",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_FastPayGaming01",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "failed",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "F002",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "NSF - Not Sufficient Funds in the designated account."DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"description": "Supplier payout FastPay"DescriptioniHuman-readable label or note.
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payout_merchant001",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspColOmnibus01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_MerchantCol01",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 3000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-06-26T12:35:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-26T12:35:21Z"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_FastPay5568Cmp",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-26T12:35:21Z",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_FastPayGaming01",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.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"description": "Supplier payout FastPay"DescriptioniHuman-readable label or note.
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payout_merchant001",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "fast_pay",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspColOmnibus01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_MerchantCol01",Destination IdiCobre id of the destination account or counterparty.
"currency": "cop",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 3000000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-06-26T12:35:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-26T12:35:21Z"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_FastPayGamLk",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-26T12:35: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_FastPayGaminLk",IdiUnique Cobre identifier for this resource.
"type": "col_cb_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"account_id": "acc_PspColOmnibus01",Account IdiCobre Balance account id affected by the event.
"amount": -3000000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 8000000,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-26T12:35:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-06-26T12:35:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"money_movement_id": "mm_FastPayGaming01",Money Movement IdiMoney Movement that generated this balance transaction.
"description": "Supplier payout FastPay",DescriptioniHuman-readable label or note.
"beneficiary_account_number": "",Beneficiary Account NumberiMetadata field "beneficiary_account_number" attached to the resource.
"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_FastPayGamLk",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-26T12:35: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_FastPayGaminLk",IdiUnique Cobre identifier for this resource.
"type": "col_cb_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"account_id": "acc_PspColOmnibus01",Account IdiCobre Balance account id affected by the event.
"amount": -3000000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 8000000,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-26T12:35:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-06-26T12:35:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"money_movement_id": "mm_FastPayGaming01",Money Movement IdiMoney Movement that generated this balance transaction.
"description": "Supplier payout FastPay",DescriptioniHuman-readable label or note.
"beneficiary_account_number": "",Beneficiary Account NumberiMetadata field "beneficiary_account_number" attached to the resource.
"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_FastPayGamCp",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-26T12:35:21Z",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_FastPayGaminCp",IdiUnique Cobre identifier for this resource.
"type": "col_cb_credit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"account_id": "acc_PspColOmnibus01",Account IdiCobre Balance account id affected by the event.
"amount": 3000000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 3000000,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-26T12:35:21Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-06-26T12:35:21Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"money_movement_id": "mm_FastPayGaming01",Money Movement IdiMoney Movement that generated this balance transaction.
"description": "Supplier payout FastPay",DescriptioniHuman-readable label or note.
"tracking_key": "",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"sender_name": "",Sender NameiMetadata field "sender_name" attached to the resource.
"sender_id": "",Sender IdiMetadata field "sender_id" attached to the resource.
"sender_account_number": ""Sender Account NumberiMetadata field "sender_account_number" attached to the resource.
}
}
}
Step 12 of 29 Colombia Fast Pay Payout Reconciliation

Reconcile the Fast Pay Payout

Identical reconciliation to Bre-B: key on mm_id + external_id from the completion webhook. The response/webhook 'type' field (fast_pay vs ach) is the only thing that differs between the two bank rails.

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

Cobre field & valueYour Ledger field
content.external_id
payout_merchant001
payout_reference
content.id
mm_FastPayGaming01
cobre_mm_id
content.type
fast_pay
rail_used
fast_pay or ach — the rail Cobre selected.
content.status.state
completed
payout_status
content.amount
3000000
paid_amount_cents
Step 13 of 29 Mexico Virtual CLABE Payin API step

Create Virtual CLABE Account Reference

Provision a Virtual CLABE linked to your MXN Cobre Balance for one end user or order. Share the returned value (18-digit CLABE) with the payer — inbound SPEI transfers credit your balance automatically. Create one reference per end-user sub-account or per payment intent.

POST https://api.cobre.co/v1/account_references
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"source_id": "acc_PspMexOmnibus01",MXN Cobre BalanceRequirediCobre Balance that receives Virtual CLABE SPEI credits.
"type": "virtual_clabe_accounts",Reference typeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"alias": "End user payin - payin_ref_mx001"AliasiDisplay name that helps identify it and clarify its purpose.
}
Response 200
{
"id": "ref_MerchantMx01",IdiUnique Cobre identifier for this resource.
"alias": "End user payin - payin_ref_mx001",AliasiDisplay name that helps identify it and clarify its purpose.
"type": "virtual_clabe_accounts",Reference typeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"value": "703013052111000099",ValueiCobre field at "value" in this payload.
"source_id": "acc_PspMexOmnibus01",MXN Cobre BalanceRequirediCobre Balance that receives Virtual CLABE SPEI credits.
"geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"connectivity": {ConnectivityiConnection/registration status for keys or accounts.
"status": "enabled",StatusiLifecycle status object for the resource or movement.
"description": ""DescriptioniHuman-readable label or note.
},
"metadata": {},MetadataiCustom key-value metadata attached to the resource.
"created_at": "2026-07-19T11:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-19T11:00:05Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 14 of 29 Mexico Virtual CLABE Payin API step

Virtual CLABE SPEI Credit

The payer sends MXN via SPEI to the Virtual CLABE (703013052111000099). Cobre credits acc_PspMexOmnibus01 with spei_credit — reconcile using metadata.account_reference matching ref_MerchantMx01. No Money Movement is created.

GET https://api.cobre.co/v1/accounts/acc_PspMexOmnibus01MXN Cobre BalanceRequirediPath parameter — Cobre Balance where Virtual CLABE SPEI credits post./transactions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
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_MxClabe001",Transaction IDiUnique Cobre identifier for this resource.
"type": "spei_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_PspMexOmnibus01",Account IdiCobre Balance account id affected by the event.
"amount": 1500000,Amount creditediAmount in cents — the last two digits are decimals.
"previous_balance": 5000000,Previous BalanceiCobre field at "contents.0.previous_balance" in this payload.
"current_balance": 6500000,Current BalanceiCobre field at "contents.0.current_balance" in this payload.
"currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn).
"credit_debit_type": "credit",Credit Debit Typeicredit = funds in; debit = funds out.
"transaction_date": "2026-07-19T14:30:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-07-19T14:30:01Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"reference": "91025",ReferenceiPayment reference echoed in metadata for reconciliation.
"sender_name": "JUAN,PEREZ/GARCIA",Sender NameiMetadata field "sender_name" attached to the resource.
"sender_clabe": "012180001234567890",Sender ClabeiMetadata field "sender_clabe" attached to the resource.
"tracking_key": "20260719143000001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description": "SPEI payin via Virtual CLABE",DescriptioniHuman-readable label or note.
"account_reference": "703013052111000099"Account referenceiVirtual CLABE value — primary join key to attribute the credit to your end user or order.
}
}
]
}

Webhook delivered

accounts.balance.credit

Fires when the Virtual CLABE credit posts on acc_PspMexOmnibus01. Map metadata.account_reference to your end user or order (payin_ref_mx001).

Headers
Content-Typeapplication/json
Payload
{
"id": "ev_VcPayin001",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-19T14: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_MxClabe001",IdiUnique Cobre identifier for this resource.
"type": "spei_credit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"amount": 1500000,AmountiAmount in cents — the last two digits are decimals.
"currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn).
"date": "2026-07-19T14: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.
"reference": "91025",ReferenceiPayment reference echoed in metadata for reconciliation.
"sender_name": "JUAN,PEREZ/GARCIA",Sender NameiMetadata field "sender_name" attached to the resource.
"sender_clabe": "012180001234567890",Sender ClabeiMetadata field "sender_clabe" attached to the resource.
"tracking_key": "20260719143000001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description": "SPEI payin via Virtual CLABE",DescriptioniHuman-readable label or note.
"account_reference": "703013052111000099"Account ReferenceiTransfer-In reference number used to reconcile incoming deposits.
},
"account_id": "acc_PspMexOmnibus01",Account IdiCobre Balance account id affected by the event.
"previous_balance": 5000000,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 6500000,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 29 Mexico Virtual CLABE Payin Reconciliation

Reconcile Virtual CLABE Payin

Match the accounts.balance.credit webhook to your platform ledger using metadata.account_reference for end-user or order attribution. No Money Movement exists — reconciliation is transaction-level on acc_PspMexOmnibus01.

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

Cobre field & valuePlatform ledger field
content.metadata.account_reference
703013052111000099
virtual_clabe_reference
Primary join key — maps ref_MerchantMx01 (703013052111000099) to payin_ref_mx001 on your ledger.
content.id
trx_MxClabe001
cobre_transaction_id
content.amount
1500000
credited_amount_cents
MXN credited to acc_PspMexOmnibus01 (1500000 = $15,000.00 MXN).
content.account_id
acc_PspMexOmnibus01
mxn_balance_id
content.metadata.tracking_key
20260719143000001
spei_tracking_key
Banxico tracking key — useful for support and bank traceability.
Step 16 of 29 Stablecoin Payin API step

Create self_custodian_wallet Reference

Provision a receiving wallet on the Global omnibus balance. Share value once connectivity.status is enabled.

POST https://api.cobre.co/v1/account_references
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"source_id": "acc_PspGlobalUsd01",Global balanceRequirediCobre id of the source account or counterparty.
"type": "self_custodian_wallet",TypeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"chain": "evm_compatible"ChainRequirediCobre field at "metadata.chain" in this payload.
},
"alias": "Stablecoin payin wallet"AliasiDisplay name that helps identify it and clarify its purpose.
}
Response 200
{
"id": "ref_StableWallet01",IdiUnique Cobre identifier for this resource.
"alias": "Stablecoin payin wallet",AliasiDisplay name that helps identify it and clarify its purpose.
"type": "self_custodian_wallet",TypeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"value": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",ValueiCobre field at "value" in this payload.
"source_id": "acc_PspGlobalUsd01",Global balanceRequirediCobre id of the source account or counterparty.
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"connectivity": {ConnectivityiConnection/registration status for keys or accounts.
"status": "processing",StatusiLifecycle status object for the resource or movement.
"description": ""DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"chain": "evm_compatible",ChainRequirediCobre field at "metadata.chain" in this payload.
"chain_assets": [Chain AssetsiCobre field at "metadata.chain_assets" in this payload.
"usdt",
"usdc"
]
},
"created_at": "2026-07-24T10:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-24T10:00:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Documentation for this step
Create an Account ReferenceStablecoin Payins
Step 17 of 29 Stablecoin Payin API step

Wallet Enabled (Webhook)

When self_custodian_wallet.status.enabled fires, read value and share the on-chain address with the sender.

GET https://api.cobre.co/v1/account_references/ref_StableWallet01
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Response 200
{
"id": "ref_StableWallet01",Reference IDRequirediUnique Cobre identifier for this resource.
"alias": "Stablecoin payin wallet",AliasiDisplay name that helps identify it and clarify its purpose.
"type": "self_custodian_wallet",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"value": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",Wallet addressRequirediCobre field at "value" in this payload.
"source_id": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"connectivity": {ConnectivityiConnection/registration status for keys or accounts.
"status": "enabled",StatusRequirediLifecycle status object for the resource or movement.
"description": ""DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"chain": "evm_compatible",ChainiCobre field at "metadata.chain" in this payload.
"chain_assets": [Chain AssetsiCobre field at "metadata.chain_assets" in this payload.
"usdt",
"usdc"
]
},
"created_at": "2026-07-24T10:00: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).
}

Webhook delivered

self_custodian_wallet.status.enabled

Wallet is ready — share value with the USDT/USDC sender.

Headers
Content-Typeapplication/json
Payload
{
"id": "ev_WalletEnabled01",IdiUnique Cobre identifier for this resource.
"event_key": "self_custodian_wallet.status.enabled",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-07-24T10:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"content": {ContentiEvent-specific payload — same layout as the GET response for that resource.
"id": "ref_StableWallet01",IdiUnique Cobre identifier for this resource.
"alias": "Stablecoin payin wallet",AliasiDisplay name that helps identify it and clarify its purpose.
"type": "self_custodian_wallet",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"value": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",ValueiCobre field at "content.value" in this payload.
"source_id": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"connectivity": {ConnectivityiConnection/registration status for keys or accounts.
"status": "enabled",StatusiLifecycle status object for the resource or movement.
"description": ""DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"chain": "evm_compatible",ChainiMetadata field "chain" attached to the resource.
"chain_assets": [Chain AssetsiMetadata field "chain_assets" attached to the resource.
"usdt",
"usdc"
]
},
"created_at": "2026-07-24T10:00: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 18 of 29 Stablecoin Payin API step

Stablecoin Credited as USD

On-chain deposit approved — Global balance receives global_credit (USD). Confirm via accounts.balance.credit or GET /accounts/{acct_id}/transactions.

GET https://api.cobre.co/v1/accounts/acc_PspGlobalUsd01Global balanceRequiredi/transactions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
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_GlobalCredit01",Transaction IDiUnique Cobre identifier for this resource.
"type": "global_credit",Transaction typeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"account_id": "acc_PspGlobalUsd01",Account IdiCobre Balance account id affected by the event.
"amount": 100000,Amount creditedRequirediAmount in cents — the last two digits are decimals.
"previous_balance": 30000,Previous BalanceiCobre field at "contents.0.previous_balance" in this payload.
"current_balance": 130000,Current BalanceiCobre field at "contents.0.current_balance" in this payload.
"currency": "usd",CurrencyiISO currency code (e.g. cop, mxn).
"credit_debit_type": "credit",Credit Debit Typeicredit = funds in; debit = funds out.
"transaction_date": "2026-07-24T11:00:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-07-24T11:00:01Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"tracking_key": "0xabc123def456789stablecoinpayin",On-chain hashiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description": "USDT payin credited as USD"DescriptioniHuman-readable label or note.
}
}
]
}

Webhook delivered

accounts.balance.credit

Global balance credited after stablecoin screening approval.

Headers
Content-Typeapplication/json
Payload
{
"id": "ev_GlobalCredit01",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-24T11:00: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_GlobalCredit01",IdiUnique Cobre identifier for this resource.
"type": "global_credit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"amount": 100000,AmountiAmount in cents — the last two digits are decimals.
"currency": "usd",CurrencyiISO currency code (e.g. cop, mxn).
"date": "2026-07-24T11:00: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.
"tracking_key": "0xabc123def456789stablecoinpayin",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description": "USDT payin credited as USD"DescriptioniHuman-readable label or note.
},
"account_id": "acc_PspGlobalUsd01",Account IdiCobre Balance account id affected by the event.
"previous_balance": 30000,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 130000,Current BalanceiCobre field at "content.current_balance" in this payload.
"credit_debit_type": "credit"Credit Debit Typeicredit = funds in; debit = funds out.
}
}
Step 19 of 29 Stablecoin Payin Reconciliation

Reconcile Stablecoin Payin

Match global_credit to your platform ledger using tracking_key and amount. No Money Movement is created for the payin leg.

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

Cobre field & valuePlatform ledger field
content.metadata.tracking_key
0xabc123def456789stablecoinpayin
on_chain_tx_hash
content.id
trx_GlobalCredit01
cobre_transaction_id
content.amount
100000
usd_credited_cents
content.account_id
acc_PspGlobalUsd01
global_balance_id
Step 20 of 29 Cross-Border FX API step

Request MXN/USD Quote

Lock a short-lived MXN/USD static quote before converting merchant treasury MXN to USD. Confirm corridor availability and quote direction with your KAM — quotes expire in ~1 minute.

POST https://api.cobre.co/v1/fx_quotes
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"currency_pair": "mxn/usd",Currency pairRequirediCobre field at "currency_pair" in this payload.
"source_amount": 120000000,Source amount (MXN cents)RequirediCobre field at "source_amount" in this payload.
"type": "static_quote"Quote typeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
}
Response 201
{
"id": "fxq_LatamMxnUsd01",IdiUnique Cobre identifier for this resource.
"type": "static_quote",Quote typeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "mxn/usd",Currency pairRequirediCobre field at "currency_pair" in this payload.
"source_amount": 120000000,Source amount (MXN cents)RequirediCobre field at "source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "fees_breakdown.spread" in this payload.
},
"fx_rate": 40,Fx RateiCobre field at "fx_rate" in this payload.
"destination_amount": 30000,Destination AmountiCobre field at "destination_amount" in this payload.
"quota_limit": 1000000000,Quota LimitiCobre field at "quota_limit" in this payload.
"remaining_quota": 999625000,Remaining QuotaiCobre field at "remaining_quota" in this payload.
"created_at": "2026-07-06T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-07-06T14:01:00Z",Valid UntiliCobre field at "valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "off_market" in this payload.
}
Step 21 of 29 Cross-Border FX API step

Execute MXN→USD Cross-Border

Convert merchant treasury MXN from acc_PspMexOmnibus01 to USD on acc_PspGlobalUsd01 using the locked quote. Reuse the idempotency header on retries (valid 24h).

POST https://api.cobre.co/v1/cross_border_money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
idempotencypsp_cbmm_cn001
Request body
{
"source_id": "acc_PspMexOmnibus01",MXN Payout balanceRequirediCobre id of the source account or counterparty.
"destination_id": "acc_PspGlobalUsd01",USD GlobalRequirediCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamMxnUsd01",FX Quote IDRequirediCobre field at "forex_quote_id" in this payload.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Merchant CN01 treasury FX"DescriptioniCobre field at "metadata.destination_description" in this payload.
},
"external_id": "psp_fx_mxnusd001"External IDiYour own reference echoed by Cobre for reconciliation.
}
Response 201
{
"id": "mm_CbmmMxnUsd01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_mxnusd001",External IDiYour own reference echoed by Cobre for reconciliation.
"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.
},
"source_id": "acc_PspMexOmnibus01",MXN Payout balanceRequirediCobre id of the source account or counterparty.
"destination_id": "acc_PspGlobalUsd01",USD GlobalRequirediCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamMxnUsd01",FX Quote IDRequirediCobre field at "forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "mxn/usd",Currency PairiCobre field at "forex_quote.currency_pair" in this payload.
"source_amount": 120000000,Source AmountiCobre field at "forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 40,Fx RateiCobre field at "forex_quote.fx_rate" in this payload.
"destination_amount": 30000,Destination AmountiCobre field at "forex_quote.destination_amount" in this payload.
"quota_limit": 1000000000,Quota LimitiCobre field at "forex_quote.quota_limit" in this payload.
"remaining_quota": 999625000,Remaining QuotaiCobre field at "forex_quote.remaining_quota" in this payload.
"created_at": "2026-07-06T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-07-06T14:01:00Z",Valid UntiliCobre field at "forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "forex_quote.off_market" in this payload.
},
"geo": "mex/usa",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Merchant CN01 treasury FX"DescriptioniCobre field at "metadata.destination_description" in this payload.
},
"created_at": "2026-07-06T14:01:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-06T14:01:10Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesCross-border money movement

MXN→USD conversion completed — USD is now on acc_PspGlobalUsd01. Reconcile this FX leg on your treasury ledger.

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.

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 cross_border_money_movements.status.completed
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_CbmmPspMx001Cmp",IdiUnique Cobre identifier for this resource.
"event_key": "cross_border_money_movements.status.completed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-07-06T14:01:45Z",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_CbmmMxnUsd01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_mxnusd001",External IdiYour own reference echoed by Cobre for reconciliation.
"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": "acc_PspMexOmnibus01",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_PspGlobalUsd01",Destination IdiCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamMxnUsd01",Forex Quote IdiCobre field at "content.forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "content.forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "mxn/usd",Currency PairiCobre field at "content.forex_quote.currency_pair" in this payload.
"source_amount": 120000000,Source AmountiCobre field at "content.forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "content.forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "content.forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 40,Fx RateiCobre field at "content.forex_quote.fx_rate" in this payload.
"destination_amount": 30000,Destination AmountiCobre field at "content.forex_quote.destination_amount" in this payload.
"quota_limit": 1000000000,Quota LimitiCobre field at "content.forex_quote.quota_limit" in this payload.
"remaining_quota": 999625000,Remaining QuotaiCobre field at "content.forex_quote.remaining_quota" in this payload.
"created_at": "2026-07-06T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-07-06T14:01:00Z",Valid UntiliCobre field at "content.forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "content.forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "content.forex_quote.off_market" in this payload.
},
"geo": "mex/usa",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Merchant CN01 treasury FX"Destination DescriptioniMetadata field "destination_description" attached to the resource.
},
"created_at": "2026-07-06T14:01:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-06T14:01:45Z"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 cross_border_money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_CbmmPspMx001Cmp",IdiUnique Cobre identifier for this resource.
"event_key": "cross_border_money_movements.status.failed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-07-06T14:01:45Z",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_CbmmMxnUsd01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_mxnusd001",External IdiYour own reference echoed by Cobre for reconciliation.
"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.
},
"source_id": "acc_PspMexOmnibus01",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_PspGlobalUsd01",Destination IdiCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamMxnUsd01",Forex Quote IdiCobre field at "content.forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "content.forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "mxn/usd",Currency PairiCobre field at "content.forex_quote.currency_pair" in this payload.
"source_amount": 120000000,Source AmountiCobre field at "content.forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "content.forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "content.forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 40,Fx RateiCobre field at "content.forex_quote.fx_rate" in this payload.
"destination_amount": 30000,Destination AmountiCobre field at "content.forex_quote.destination_amount" in this payload.
"quota_limit": 1000000000,Quota LimitiCobre field at "content.forex_quote.quota_limit" in this payload.
"remaining_quota": 999625000,Remaining QuotaiCobre field at "content.forex_quote.remaining_quota" in this payload.
"created_at": "2026-07-06T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-07-06T14:01:00Z",Valid UntiliCobre field at "content.forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "content.forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "content.forex_quote.off_market" in this payload.
},
"geo": "mex/usa",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Merchant CN01 treasury FX"Destination DescriptioniMetadata field "destination_description" attached to the resource.
},
"created_at": "2026-07-06T14:01:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-06T14:01:45Z"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
R012The user has abandoned the transaction.Payin
R015Account not authorized to be credited.Payout
R016Payment rejected due to timeout.Payin
R017Payment rejected due to expired money movement.Payin
R018Payment rejected due invalid key.Payout
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
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
R081The counterparty registration has expired.Payin
R082The counterparty registration has been canceled.Payin
R084The counterparty registration has been rejected.Payin
R085Bank processing error.Payout
Event cross_border_money_movements.status.rejected
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_CbmmPspMx001Cmp",IdiUnique Cobre identifier for this resource.
"event_key": "cross_border_money_movements.status.rejected",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-07-06T14:01:45Z",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_CbmmMxnUsd01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_mxnusd001",External IdiYour own reference echoed by Cobre for reconciliation.
"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.
},
"source_id": "acc_PspMexOmnibus01",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_PspGlobalUsd01",Destination IdiCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamMxnUsd01",Forex Quote IdiCobre field at "content.forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "content.forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "mxn/usd",Currency PairiCobre field at "content.forex_quote.currency_pair" in this payload.
"source_amount": 120000000,Source AmountiCobre field at "content.forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "content.forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "content.forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 40,Fx RateiCobre field at "content.forex_quote.fx_rate" in this payload.
"destination_amount": 30000,Destination AmountiCobre field at "content.forex_quote.destination_amount" in this payload.
"quota_limit": 1000000000,Quota LimitiCobre field at "content.forex_quote.quota_limit" in this payload.
"remaining_quota": 999625000,Remaining QuotaiCobre field at "content.forex_quote.remaining_quota" in this payload.
"created_at": "2026-07-06T14:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-07-06T14:01:00Z",Valid UntiliCobre field at "content.forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "content.forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "content.forex_quote.off_market" in this payload.
},
"geo": "mex/usa",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Merchant CN01 treasury FX"Destination DescriptioniMetadata field "destination_description" attached to the resource.
},
"created_at": "2026-07-06T14:01:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-06T14:01:45Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
}
Step 22 of 29 Cross-Border FX Reconciliation

Reconcile Cross-Border FX

Match the Cross-Border completion webhook to your treasury ledger on external_id psp_fx_mxnusd001. Cross-check MXN debit on acc_PspMexOmnibus01 and USD credit on acc_PspGlobalUsd01.

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

Cobre field & valueTreasury ledger field
content.external_id
psp_fx_mxnusd001
fx_external_id
content.id
mm_CbmmMxnUsd01
cobre_cbmm_id
content.forex_quote_id
fxq_LatamMxnUsd01
fxq_id
content.forex_quote.source_amount
120000000
mxn_debited_cents
MXN source amount debited from acc_PspMexOmnibus01 (120000000 = $1,200,000.00 MXN).
content.forex_quote.destination_amount
30000
usd_credited_cents
USD credited to acc_PspGlobalUsd01 (30000 = $300.00 USD).
content.status.state
completed
fx_status
Step 23 of 29 Cross-Border FX API step

Request USD/COP Quote

Cobre quotes USD/COP only — sender-currency-to-USD conversion is handled on your platform. For a static quote, USD must already sit in the Global Balance before execution. Quotes expire in ~1 minute; persist fxq_id against the remittance.

POST https://api.cobre.co/v1/fx_quotes
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"currency_pair": "usd/cop",Currency pairRequirediCobre field at "currency_pair" in this payload.
"destination_amount": 200000000,Destination amount (COP, no decimals)Requiredi200000000 = COP $2,000,000.00 (amounts have no decimal point — last two digits are cents).
"type": "static_quote"Quote typeRequiredistatic_quote requires pre-funded USD; rolling_quote locks a rate tier before wiring USD.
}
Response 201
{
"id": "fxq_LatamUsdCop01",IdiUnique Cobre identifier for this resource.
"type": "static_quote",Quote typeRequiredistatic_quote requires pre-funded USD; rolling_quote locks a rate tier before wiring USD.
"currency_pair": "usd/cop",Currency pairRequirediCobre field at "currency_pair" in this payload.
"source_amount": 50000,Source AmountiCobre field at "source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "fees_breakdown.spread" in this payload.
},
"fx_rate": 4000,Fx RateiCobre field at "fx_rate" in this payload.
"destination_amount": 200000000,Destination amount (COP, no decimals)Requiredi200000000 = COP $2,000,000.00 (amounts have no decimal point — last two digits are cents).
"quota_limit": 100000000,Quota LimitiCobre field at "quota_limit" in this payload.
"remaining_quota": 95000000,Remaining QuotaiCobre field at "remaining_quota" in this payload.
"created_at": "2026-06-03T10:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-06-03T10:01:00Z",Valid UntiliCobre field at "valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "off_market" in this payload.
}
Step 24 of 29 Cross-Border FX API step

Execute Cross-Border Conversion

After the end user confirms, convert USD to COP by debiting the USD Global Balance and crediting the COP Balance. Reuse the same idempotency header on retries (valid 24h). Only the most recent fxq_id for the pair may be used.

POST https://api.cobre.co/v1/cross_border_money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
idempotencyremit_cbmm_000456
Request body
{
"source_id": "acc_PspGlobalUsd01",USD Global BalanceRequirediCobre id of the source account or counterparty.
"destination_id": "acc_PspColOmnibus01",COP BalanceRequirediCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamUsdCop01",FX Quote IDRequirediCobre field at "forex_quote_id" in this payload.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Remittance remit_000456"DescriptioniCobre field at "metadata.destination_description" in this payload.
},
"external_id": "psp_fx_usdcop001"External ID (FX leg)iRecommended remit_fx_<remittance_id> — pairs with remit_payout_<remittance_id> on the local leg.
}
Response 201
{
"id": "mm_CbmmUsdCop01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_usdcop001",External ID (FX leg)iRecommended remit_fx_<remittance_id> — pairs with remit_payout_<remittance_id> on the local leg.
"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.
},
"source_id": "acc_PspGlobalUsd01",USD Global BalanceRequirediCobre id of the source account or counterparty.
"destination_id": "acc_PspColOmnibus01",COP BalanceRequirediCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamUsdCop01",FX Quote IDRequirediCobre field at "forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "usd/cop",Currency PairiCobre field at "forex_quote.currency_pair" in this payload.
"source_amount": 50000,Source AmountiCobre field at "forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 4000,Fx RateiCobre field at "forex_quote.fx_rate" in this payload.
"destination_amount": 200000000,Destination AmountiCobre field at "forex_quote.destination_amount" in this payload.
"quota_limit": 100000000,Quota LimitiCobre field at "forex_quote.quota_limit" in this payload.
"remaining_quota": 95000000,Remaining QuotaiCobre field at "forex_quote.remaining_quota" in this payload.
"created_at": "2026-06-03T10:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-06-03T10:01:00Z",Valid UntiliCobre field at "forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "forex_quote.off_market" in this payload.
},
"geo": "usa/col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Remittance remit_000456"DescriptioniCobre field at "metadata.destination_description" in this payload.
},
"created_at": "2026-06-03T10:00:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-03T10:00:10Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesCross-border money movement

USD→COP conversion completed — COP is now available on the COP Balance. Proceed to local delivery; treasury can reconcile USD debit and COP credit via accounts.balance.debit / credit events.

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.

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 cross_border_money_movements.status.completed
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_CbmmRem456Cmp",IdiUnique Cobre identifier for this resource.
"event_key": "cross_border_money_movements.status.completed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-03T10:00:45Z",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_CbmmUsdCop01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_usdcop001",External IdiYour own reference echoed by Cobre for reconciliation.
"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": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_PspColOmnibus01",Destination IdiCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamUsdCop01",Forex Quote IdiCobre field at "content.forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "content.forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "usd/cop",Currency PairiCobre field at "content.forex_quote.currency_pair" in this payload.
"source_amount": 50000,Source AmountiCobre field at "content.forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "content.forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "content.forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 4000,Fx RateiCobre field at "content.forex_quote.fx_rate" in this payload.
"destination_amount": 200000000,Destination AmountiCobre field at "content.forex_quote.destination_amount" in this payload.
"quota_limit": 100000000,Quota LimitiCobre field at "content.forex_quote.quota_limit" in this payload.
"remaining_quota": 95000000,Remaining QuotaiCobre field at "content.forex_quote.remaining_quota" in this payload.
"created_at": "2026-06-03T10:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-06-03T10:01:00Z",Valid UntiliCobre field at "content.forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "content.forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "content.forex_quote.off_market" in this payload.
},
"geo": "usa/col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Remittance remit_000456"Destination DescriptioniMetadata field "destination_description" attached to the resource.
},
"created_at": "2026-06-03T10:00:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-03T10:00:45Z"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 cross_border_money_movements.status.failed
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_CbmmRem456Cmp",IdiUnique Cobre identifier for this resource.
"event_key": "cross_border_money_movements.status.failed",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-03T10:00:45Z",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_CbmmUsdCop01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_usdcop001",External IdiYour own reference echoed by Cobre for reconciliation.
"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.
},
"source_id": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_PspColOmnibus01",Destination IdiCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamUsdCop01",Forex Quote IdiCobre field at "content.forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "content.forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "usd/cop",Currency PairiCobre field at "content.forex_quote.currency_pair" in this payload.
"source_amount": 50000,Source AmountiCobre field at "content.forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "content.forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "content.forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 4000,Fx RateiCobre field at "content.forex_quote.fx_rate" in this payload.
"destination_amount": 200000000,Destination AmountiCobre field at "content.forex_quote.destination_amount" in this payload.
"quota_limit": 100000000,Quota LimitiCobre field at "content.forex_quote.quota_limit" in this payload.
"remaining_quota": 95000000,Remaining QuotaiCobre field at "content.forex_quote.remaining_quota" in this payload.
"created_at": "2026-06-03T10:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-06-03T10:01:00Z",Valid UntiliCobre field at "content.forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "content.forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "content.forex_quote.off_market" in this payload.
},
"geo": "usa/col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Remittance remit_000456"Destination DescriptioniMetadata field "destination_description" attached to the resource.
},
"created_at": "2026-06-03T10:00:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-03T10:00:45Z"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
R012The user has abandoned the transaction.Payin
R015Account not authorized to be credited.Payout
R016Payment rejected due to timeout.Payin
R017Payment rejected due to expired money movement.Payin
R018Payment rejected due invalid key.Payout
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
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
R081The counterparty registration has expired.Payin
R082The counterparty registration has been canceled.Payin
R084The counterparty registration has been rejected.Payin
R085Bank processing error.Payout
Event cross_border_money_movements.status.rejected
Headers
Content-Typeapplication/json
Example payload
{
"id": "ev_CbmmRem456Cmp",IdiUnique Cobre identifier for this resource.
"event_key": "cross_border_money_movements.status.rejected",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-06-03T10:00:45Z",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_CbmmUsdCop01",IdiUnique Cobre identifier for this resource.
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"type": "cross_border",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"external_id": "psp_fx_usdcop001",External IdiYour own reference echoed by Cobre for reconciliation.
"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.
},
"source_id": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_PspColOmnibus01",Destination IdiCobre id of the destination account or counterparty.
"forex_quote_id": "fxq_LatamUsdCop01",Forex Quote IdiCobre field at "content.forex_quote_id" in this payload.
"forex_quote": {Forex QuoteiCobre field at "content.forex_quote" in this payload.
"type": "static_quote",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"currency_pair": "usd/cop",Currency PairiCobre field at "content.forex_quote.currency_pair" in this payload.
"source_amount": 50000,Source AmountiCobre field at "content.forex_quote.source_amount" in this payload.
"fees_breakdown": {Fees BreakdowniCobre field at "content.forex_quote.fees_breakdown" in this payload.
"spread": 1.2SpreadiCobre field at "content.forex_quote.fees_breakdown.spread" in this payload.
},
"fx_rate": 4000,Fx RateiCobre field at "content.forex_quote.fx_rate" in this payload.
"destination_amount": 200000000,Destination AmountiCobre field at "content.forex_quote.destination_amount" in this payload.
"quota_limit": 100000000,Quota LimitiCobre field at "content.forex_quote.quota_limit" in this payload.
"remaining_quota": 95000000,Remaining QuotaiCobre field at "content.forex_quote.remaining_quota" in this payload.
"created_at": "2026-06-03T10:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"valid_until": "2026-06-03T10:01:00Z",Valid UntiliCobre field at "content.forex_quote.valid_until" in this payload.
"last_quote": true,Last QuoteiCobre field at "content.forex_quote.last_quote" in this payload.
"off_market": falseOff MarketiCobre field at "content.forex_quote.off_market" in this payload.
},
"geo": "usa/col",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"destination_description": "Remittance remit_000456"Destination DescriptioniMetadata field "destination_description" attached to the resource.
},
"created_at": "2026-06-03T10:00:10Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-06-03T10:00:45Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
}
Step 25 of 29 Cross-Border FX Reconciliation

Reconcile the Cross-Border Conversion

Match the Cross-Border completion webhook to your remittance ledger on external_id and cbmm_id. Cross-check USD debit and COP credit on the respective Cobre Balances via accounts.balance.debit / credit events or GET /accounts/{acct_id}/transactions.

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

Cobre field & valueRemittance ledger field
content.external_id
psp_fx_usdcop001
fx_external_id
FX leg reference — shared remittance_id suffix pairs with remit_payout_* on local delivery.
content.id
mm_CbmmUsdCop01
cobre_cbmm_id
Cross-Border Money Movement id (cbmm_id) from Cobre.
content.forex_quote_id
fxq_LatamUsdCop01
fxq_id
content.forex_quote.source_amount
50000
usd_debited_cents
USD source amount debited from the Global Balance (50000 = $500.00 USD).
content.forex_quote.destination_amount
200000000
cop_credited_cents
COP credited to the COP Balance (200000000 = $2,000,000.00 COP).
content.status.state
completed
fx_status
Map completed → proceed to local delivery; failed/rejected → re-quote or re-fund.
Step 26 of 29 Global USDT Payout API step

Create Global Counterparty

Register the USDT beneficiary as global_deposit_np. Payout requires counterparty_verification_status verified.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
Request body
{
"geo": "usa",GeographyRequirediGeography code (e.g. col = Colombia, mex = Mexico).
"type": "global_deposit_np",TypeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"alias": "USDT beneficiary",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_firstname": "Alex",First nameRequirediCobre field at "metadata.counterparty_firstname" in this payload.
"counterparty_lastname": "Rivera",Last nameRequirediCobre field at "metadata.counterparty_lastname" in this payload.
"counterparty_date_of_birth": "1990-05-15",Date of birthRequirediCobre field at "metadata.counterparty_date_of_birth" in this payload.
"counterparty_id_nationality": "USA",NationalityRequirediCobre field at "metadata.counterparty_id_nationality" in this payload.
"counterparty_chain": "tron",ChainRequirediCobre field at "metadata.counterparty_chain" in this payload.
"counterparty_wallet_address": "TXyz1234567890abcdefStablePayout",Wallet addressRequirediCobre field at "metadata.counterparty_wallet_address" in this payload.
"counterparty_address": {Counterparty AddressiCobre field at "metadata.counterparty_address" in this payload.
"street_line1": "100 Demo St",Street Line1iCobre field at "metadata.counterparty_address.street_line1" in this payload.
"city": "Miami",CityiCobre field at "metadata.counterparty_address.city" in this payload.
"state": "FL",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"postal_code": "33101",Postal CodeiCobre field at "metadata.counterparty_address.postal_code" in this payload.
"country": "USA"CountryRequirediCobre field at "metadata.counterparty_address.country" in this payload.
}
}
}
Response 201
{
"id": "cp_GlobalUsdt01",IdiUnique Cobre identifier for this resource.
"geo": "global",GeographyRequirediGeography code (e.g. col = Colombia, mex = Mexico).
"type": "global_deposit_np",TypeRequirediResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"alias": "USDT beneficiary",AliasiDisplay name that helps identify it and clarify its purpose.
"counterparty_firstname": "Alex",First nameRequirediCobre field at "counterparty_firstname" in this payload.
"counterparty_lastname": "Rivera",Last nameRequirediCobre field at "counterparty_lastname" in this payload.
"counterparty_date_of_birth": "1990-05-15",Date of birthRequirediCobre field at "counterparty_date_of_birth" in this payload.
"counterparty_id_nationality": "USA",NationalityRequirediCobre field at "counterparty_id_nationality" in this payload.
"counterparty_chain": "tron",ChainRequirediCobre field at "counterparty_chain" in this payload.
"counterparty_wallet_address": "TXyz1234567890abcdefStablePayout",Wallet addressRequirediCobre field at "counterparty_wallet_address" in this payload.
"counterparty_address": {Counterparty AddressiCobre field at "counterparty_address" in this payload.
"street_line1": "100 Demo St",Street Line1iCobre field at "counterparty_address.street_line1" in this payload.
"city": "Miami",CityiCobre field at "counterparty_address.city" in this payload.
"state": "FL",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"postal_code": "33101",Postal CodeiCobre field at "counterparty_address.postal_code" in this payload.
"country": "USA"CountryiCobre field at "counterparty_address.country" in this payload.
},
"counterparty_verification_status": "processing",Counterparty Verification StatusiCobre field at "counterparty_verification_status" in this payload.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_firstname": "Alex",First nameRequirediCobre field at "metadata.counterparty_firstname" in this payload.
"counterparty_lastname": "Rivera",Last nameRequirediCobre field at "metadata.counterparty_lastname" in this payload.
"counterparty_date_of_birth": "1990-05-15",Date of birthRequirediCobre field at "metadata.counterparty_date_of_birth" in this payload.
"counterparty_id_nationality": "USA",NationalityRequirediCobre field at "metadata.counterparty_id_nationality" in this payload.
"counterparty_chain": "tron",ChainRequirediCobre field at "metadata.counterparty_chain" in this payload.
"counterparty_wallet_address": "TXyz1234567890abcdefStablePayout"Wallet addressRequirediCobre field at "metadata.counterparty_wallet_address" in this payload.
},
"created_at": "2026-07-24T12:00:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-24T12:00:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 27 of 29 Global USDT Payout API step

Send USDT Payout

Pay from the Global USD omnibus to the verified Global Counterparty. metadata.token=usdt triggers fiat→stablecoin settlement on-chain.

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfcHNwX2xhdGFtMDEifQ.LatPsp9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ
Content-Typeapplication/json
idempotencyusdt_payout_001
Request body
{
"source_id": "acc_PspGlobalUsd01",Global balanceRequirediCobre id of the source account or counterparty.
"destination_id": "cp_GlobalUsdt01",Global counterpartyRequirediCobre id of the destination account or counterparty.
"amount": 50000,Amount (USD cents)RequirediAmount in cents — the last two digits are decimals.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"token": "usdt",TokenRequirediCobre field at "metadata.token" in this payload.
"description": "Merchant USDT settlement"DescriptioniHuman-readable label or note.
},
"external_id": "usdt_payout_001"External IDiYour own reference echoed by Cobre for reconciliation.
}
Response 201
{
"id": "mm_UsdtPayout001",IdiUnique Cobre identifier for this resource.
"status": {StatusiLifecycle status object for the resource or movement.
"state": "initiated",StateiCurrent lifecycle state (e.g. completed, failed, rejected).
"code": "",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": ""DescriptioniHuman-readable detail for the current status.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"token": "usdt",TokenRequirediCobre field at "metadata.token" in this payload.
"description": "Merchant USDT settlement"DescriptioniHuman-readable label or note.
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "usdt_payout_001",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": "fedwire",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspGlobalUsd01",Global balanceRequirediCobre id of the source account or counterparty.
"destination_id": "cp_GlobalUsdt01",Global counterpartyRequirediCobre id of the destination account or counterparty.
"currency": "usd",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000,Amount (USD cents)RequirediAmount in cents — the last two digits are decimals.
"created_at": "2026-07-24T12:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-24T12:10:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesMoney movement

USDT payout completed on-chain to the beneficiary wallet.

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.

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_UsdtPayout001Cmp",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-24T12: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": "mm_UsdtPayout001",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.
"token": "usdt",TokeniMetadata field "token" attached to the resource.
"description": "Merchant USDT settlement"DescriptioniHuman-readable label or note.
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "usdt_payout_001",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": "fedwire",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_GlobalUsdt01",Destination IdiCobre id of the destination account or counterparty.
"currency": "usd",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-07-24T12:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-24T12:15: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_UsdtPayout001Cmp",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-24T12: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": "mm_UsdtPayout001",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.
"token": "usdt",TokeniMetadata field "token" attached to the resource.
"description": "Merchant USDT settlement"DescriptioniHuman-readable label or note.
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "usdt_payout_001",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": "fedwire",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_GlobalUsdt01",Destination IdiCobre id of the destination account or counterparty.
"currency": "usd",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-07-24T12:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-24T12:15: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_UsdtPayout001Cmp",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-24T12: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": "mm_UsdtPayout001",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.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"token": "usdt",TokeniMetadata field "token" attached to the resource.
"description": "Merchant USDT settlement"DescriptioniHuman-readable label or note.
},
"creator": "cli_psp_latam01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "usdt_payout_001",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": "fedwire",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins).
"geo": "global",GeoiGeography code (e.g. col = Colombia, mex = Mexico).
"source_id": "acc_PspGlobalUsd01",Source IdiCobre id of the source account or counterparty.
"destination_id": "cp_GlobalUsdt01",Destination IdiCobre id of the destination account or counterparty.
"currency": "usd",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 50000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-07-24T12:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-07-24T12:15:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
}
Step 28 of 29 Global USDT Payout Reconciliation

Reconcile USDT Payout

Close the USDT payout on your ledger using external_id and mm_id from the completion webhook.

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

Cobre field & valuePlatform ledger field
content.external_id
usdt_payout_001
payout_reference
content.id
mm_UsdtPayout001
cobre_mm_id
content.metadata.token
usdt
settlement_token
content.amount
50000
usd_debited_cents
content.status.state
completed
payout_status
Step 29 of 29 Reconciliation Reconciliation

Reconcile Omnibus Treasury

Close end-of-day positions across COP, MXN, and USD omnibus balances using external_id, account_reference, fx_quote_id, and cbmm_id. Optional COP→USD conversion (COP collections feeding Global for a later USDT payout) uses the same FX Quote + CBMM pattern with source_id/destination_id swapped.

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

Cobre field & valuePlatform ledger field
content.external_id
psp_fx_usdcop001
fx_external_id
content.id
mm_CbmmUsdCop01
cbmm_id
content.forex_quote_id
fxq_LatamUsdCop01
fxq_id
content.status.state
completed
treasury_fx_status