Authenticate
Exchange the platform's API credentials for a short-lived Bearer token (~20 minutes). Reuse the same token string in every later call in this demo.
| Content-Type | application/json |
{ "user_id": "cli_gaming_mx01",User IDRequirediAPI user id issued by Cobre (cli_…). "secret": "sk_live_GamingMx01"SecretRequirediAPI key secret — treat it like a password.}{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ",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.}Create the platform's MXN Cobre Balance
Provision the omnibus MXN Cobre Balance on provider pr_mex_cobre3 — the provider that supports layering many player Virtual CLABEs on a single balance. Create it once, before onboarding any player; every player's Virtual CLABE (from the next step onward) is issued against this same account.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
| Content-Type | application/json |
{ "provider_id": "pr_mex_cobre3",ProviderRequirediCobre Balance Mexico 3 — the only MXN provider that supports Virtual CLABE account references on top of the balance. "action": "create",ActionRequirediCobre field at "action" in this payload. "alias": "Player wallet omnibus balance"AliasiDisplay name that helps identify it and clarify its purpose.}{ "id": "acc_GamingMx01",IdiUnique Cobre identifier for this resource. "account_number": "646180303700100033",Account NumberiBank account or CLABE number for the counterparty. "account_type": "clabe",Account TypeiCobre field at "account_type" in this payload. "provider_id": "pr_mex_cobre3",ProviderRequirediCobre Balance Mexico 3 — the only MXN provider that supports Virtual CLABE account references on top of the balance. "provider_name": "Cobre Balance Mexico 3",Provider NameiCobre field at "provider_name" in this payload. "geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn). "alias": "Player wallet omnibus balance",AliasiDisplay name that helps identify it and clarify its purpose. "connectivity": {ConnectivityiConnection/registration status for keys or accounts. "status": "connected",StatusiLifecycle status object for the resource or movement. "description": ""DescriptioniHuman-readable label or note. }, "obtained_balance": 0,Obtained BalanceiCobre field at "obtained_balance" in this payload. "obtained_balance_at": "2026-09-15T14:58:00Z",Obtained Balance AtiCobre field at "obtained_balance_at" in this payload. "created_at": "2026-09-15T14:58:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T14:58:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Subscribe to deposit and withdrawal events
One stream feeds several systems in parallel: the compliance transaction-monitoring engine, the platform's ledger, and treasury. Include accounts.balance.credit (Virtual CLABE deposit, no Money Movement is created), the withdrawal's Money Movement statuses, and returned for SPEI returns. Verify deliveries with HMAC-SHA256.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
| Content-Type | application/json |
{ "url": "https://compliance.gamingdemo.example.com/webhooks/cobre",Notification URLRequirediHTTPS endpoint on the platform's side that receives Cobre's POST notifications. "description": "Player wallet SPEI + Compliance",DescriptioniLabel for this subscription in the Cobre portal. "events": [EventsiList of webhook event types this subscription listens to. "accounts.balance.credit", "accounts.balance.debit", "money_movements.status.initiated", "money_movements.status.processing", "money_movements.status.completed", "money_movements.status.failed", "money_movements.status.rejected", "money_movements.status.returned" ], "event_signature_key": "WHgamingdemo9xZ"Signature keyRequirediSecret the platform provides; Cobre signs every delivery with HMAC.}{ "id": "sub_GamingMx01",IdiUnique Cobre identifier for this resource. "url": "https://compliance.gamingdemo.example.com/webhooks/cobre",Notification URLRequirediHTTPS endpoint on the platform's side that receives Cobre's POST notifications. "description": "Player wallet SPEI + Compliance",DescriptioniLabel for this subscription in the Cobre portal. "events": [EventsiList of webhook event types this subscription listens to. "accounts.balance.credit", "accounts.balance.debit", "money_movements.status.initiated", "money_movements.status.processing", "money_movements.status.completed", "money_movements.status.failed", "money_movements.status.rejected", "money_movements.status.returned" ], "event_signature_key": "******9xZ",Signature keyRequirediSecret the platform provides; Cobre signs every delivery with HMAC. "created_at": "2026-09-15T15:00:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).}Create the player's permanent Virtual CLABE
At sign-up, every player on the platform receives their own permanent, exclusive CLABE over the MXN Cobre Balance. The player saves it once as a frequent payee in their bank. From then on, funding does not require opening the platform: they transfer straight from their banking app. Attribution is deterministic — the CLABE is the player; there is no numeric reference the user has to type.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
| Content-Type | application/json |
{ "source_id": "acc_GamingMx01",MXN Cobre BalanceRequirediPlatform's Cobre Balance that receives SPEI credits from the Virtual CLABE. "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": "Player 10042 - permanent CLABE"AliasiDisplay name that helps identify it and clarify its purpose.}{ "id": "ref_PlayerMx01",IdiUnique Cobre identifier for this resource. "alias": "Player 10042 - permanent CLABE",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": "703013052111000038",ValueiCobre field at "value" in this payload. "source_id": "acc_GamingMx01",MXN Cobre BalanceRequirediPlatform's Cobre Balance that receives SPEI credits from the Virtual CLABE. "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-09-15T15:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T15:05:05Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Verify ownership of the player's CLABE
Account Verification is the backbone of the "register your bank account" flow. The player declares their CLABE; Cobre confirms it exists and cross-checks the holder's data against the RFC/CURP already verified in the platform's identity stack. Creation returns processing — do not treat processing as authorization. Continue only once the later GET returns matched.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
| Content-Type | application/json |
{ "model": "mex_acc_ownership_1",ModelRequiredimex_acc_ownership_1 = ownership model — the CLABE must match the declared identity. "verification_request": {Verification RequestiInput fields sent to the verification model. "account_number": "012180001234567890",Player's CLABERequiredi18-digit CLABE the player wants to register for funding and withdrawal. "account_type": "clabe",Account typeRequirediclabe for standard SPEI bank accounts. "account_holder_id_number": "PEGJ850101HX4",Holder IDRequirediPlayer's RFC or CURP, already verified in the platform's identity stack. "account_holder_id_type": "rfc"ID typeRequiredirfc or curp — must match the number's format. }, "external_id": "player_10042_verify"External IDiPlayer id on the platform, for audit traceability.}{ "id": "av_PlayerBank01",IdiUnique Cobre identifier for this resource. "creator_id": "cli_gaming_mx01",Creator IdiCobre field at "creator_id" in this payload. "model": "mex_acc_ownership_1",ModelRequiredimex_acc_ownership_1 = ownership model — the CLABE must match the declared identity. "geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "verification_request": {Verification RequestiInput fields sent to the verification model. "account_number": "012180001234567890",Player's CLABERequiredi18-digit CLABE the player wants to register for funding and withdrawal. "account_type": "clabe",Account typeRequirediclabe for standard SPEI bank accounts. "account_holder_id_number": "PEGJ850101HX4",Holder IDRequirediPlayer's RFC or CURP, already verified in the platform's identity stack. "account_holder_id_type": "rfc"ID typeRequiredirfc or curp — must match the number's format. }, "status": {StatusiLifecycle status object for the resource or movement. "state": "processing",StateiCurrent lifecycle state (e.g. completed, failed, rejected). "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable detail for the current status. }, "external_id": "player_10042_verify",External IDiPlayer id on the platform, for audit traceability. "created_at": "2026-09-15T15:08:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T15:08:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Get the verification result
Poll GET until status.state is completed. Enable the account only if verification_response.verification_result is matched. Unmatched or failed go to review — funding and withdrawal are not enabled. This turns the same-holder principle from a process control into a system control.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
{ "id": "av_PlayerBank01",IdiUnique Cobre identifier for this resource. "creator_id": "cli_gaming_mx01",Creator IdiCobre field at "creator_id" in this payload. "model": "mex_acc_ownership_1",ModeliVerification model identifier (region- and rail-specific). "geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "verification_request": {Verification RequestiInput fields sent to the verification model. "account_number": "012180001234567890",Account NumberiBank account or CLABE number for the counterparty. "account_type": "clabe",Account TypeiCobre field at "verification_request.account_type" in this payload. "account_holder_id_number": "PEGJ850101HX4",Account Holder Id NumberiCobre field at "verification_request.account_holder_id_number" in this payload. "account_holder_id_type": "rfc"Account Holder Id TypeiCobre field at "verification_request.account_holder_id_type" in this payload. }, "verification_response": {Verification ResponseiResult returned by the verification model. "verification_result": "matched"Ownership resultRequiredimatched = ownership confirmed; unmatched = do not enable the account. }, "status": {StatusiLifecycle status object for the resource or movement. "state": "completed",StatusRequirediMust be completed before registering the counterparty and moving funds. "code": "",CodeiProvider or Cobre status code when the state is failed or rejected. "description": ""DescriptioniHuman-readable detail for the current status. }, "external_id": "player_10042_verify",External IdiYour own reference echoed by Cobre for reconciliation. "created_at": "2026-09-15T15:08:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T15:08:40Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Register the verified CLABE as a counterparty
Only after matched: register the player's CLABE as a SPEI counterparty. This is the only account enabled to receive withdrawals. Normalize accents in counterparty_fullname — special characters are not allowed.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
| Content-Type | application/json |
{ "geo": "mex",GeographyRequiredimex for counterparties in Mexico. "type": "clabe",TypeRequirediclabe for a standard SPEI payout to a bank account. "alias": "Player 10042 - enabled account",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "account_number": "012180001234567890",CLABERequirediThe same 18-digit CLABE verified in the ownership step. "counterparty_fullname": "Juan Perez Garcia",Full nameRequirediPlayer's legal name — no special characters. "counterparty_id_type": "rfc",ID typeRequirediMust match the ID used in account verification. "counterparty_id_number": "PEGJ850101HX4"ID numberRequirediRFC or CURP matching the ownership verification request. }}{ "id": "cp_PlayerBank01",IdiUnique Cobre identifier for this resource. "geo": "mex",GeographyRequiredimex for counterparties in Mexico. "type": "clabe",TypeRequirediclabe for a standard SPEI payout to a bank account. "alias": "Player 10042 - enabled account",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "account_number": "012180001234567890",CLABERequirediThe same 18-digit CLABE verified in the ownership step. "counterparty_fullname": "Juan Perez Garcia",Full nameRequirediPlayer's legal name — no special characters. "counterparty_id_type": "rfc",ID typeRequirediMust match the ID used in account verification. "counterparty_id_number": "PEGJ850101HX4"ID numberRequirediRFC or CURP matching the ownership verification request. }, "created_at": "2026-09-15T15:09:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T15:09:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}SPEI credit on the player's CLABE
The player transfers MXN 2,500.00 via SPEI to their platform CLABE (703013052111000038). Cobre credits the Cobre Balance with spei_credit — no Money Movement is created. metadata.account_reference attributes the credit to player 10042. metadata.sender_clabe is the source control: the platform accepts the deposit only if it matches the player's registered, verified CLABE. A third-party deposit is identified at the moment and flagged or rejected. Because every CLABE is tied to one player, caps (amount, daily/monthly accumulated, transaction count) are enforced at the moment of credit.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
{ "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_Payin001",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_GamingMx01",Account IdiCobre Balance account id affected by the event. "amount": 250000,Credited amountiAmount in cents — the last two digits are decimals. "previous_balance": 80000000,Previous BalanceiCobre field at "contents.0.previous_balance" in this payload. "current_balance": 80250000,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-09-15T16:12:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-09-15T16:12:01Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "reference": "10042",ReferenceiPayment reference echoed in metadata for reconciliation. "sender_name": "JUAN,PEREZ/GARCIA",Sender NameiMetadata field "sender_name" attached to the resource. "sender_clabe": "012180001234567890",Source CLABEiCLABE the SPEI transfer came from. Must match the player's registered account. "tracking_key": "20260915161200001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "description": "Player 10042 deposit",DescriptioniHuman-readable label or note. "account_reference": "703013052111000038"Account referenceiVirtual CLABE value — the key that attributes the credit to player 10042. } } ]}Webhook delivered
accounts.balance.creditFires when the Virtual CLABE credit is recorded. The compliance engine receives in real time: player (account_reference), source CLABE, counterparty institution (tracking_key), amount, timestamp, and state. No polling and no next-day batch file.
| Content-Type | application/json |
{ "id": "evt_Payin001",IdiUnique Cobre identifier for this resource. "event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-09-15T16:12: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_Payin001",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": 250000,AmountiAmount in cents — the last two digits are decimals. "currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn). "date": "2026-09-15T16:12: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": "10042",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": "20260915161200001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "description": "Player 10042 deposit",DescriptioniHuman-readable label or note. "account_reference": "703013052111000038"Account ReferenceiTransfer-In reference number used to reconcile incoming deposits. }, "account_id": "acc_GamingMx01",Account IdiCobre Balance account id affected by the event. "previous_balance": 80000000,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 80250000,Current BalanceiCobre field at "content.current_balance" in this payload. "credit_debit_type": "credit"Credit Debit Typeicredit = funds in; debit = funds out. }}Reconcile the deposit and apply source rules
Match the accounts.balance.credit webhook against the platform's ledger. Attribution: account_reference → player. Source control: sender_clabe must be the registered CLABE. If it does not match, flag or reject the deposit (third party). Apply funding caps by profile (per operation, daily, monthly, transaction count) at this moment — not afterward.
Mapping the webhook payload from an earlier step onto Platform ledger / Compliance. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Platform ledger / Compliance field | |
content.metadata.account_reference 703013052111000038 |
→ | player_virtual_clabe Attribution key — the CLABE is player 10042. |
content.metadata.sender_clabe 012180001234567890 |
→ | registered_bank_clabe Restricted deposit: only accepted if it matches the holder's verified CLABE. |
content.id trx_Payin001 |
→ | cobre_transaction_id |
content.amount 250000 |
→ | credited_amount_cents MXN credited (250000 = MXN 2,500.00). Use this amount for profile caps. |
content.metadata.tracking_key 20260915161200001 |
→ | spei_tracking_key Banxico tracking key — unusual-operation file and bank reconciliation. |
SPEI withdrawal to the same account
System rule: the withdrawal can only go to the CLABE that originated the deposit (cp_PlayerBank01 = 012180001234567890). The platform does not let the player type in another account. Amount in cents (180000 = MXN 1,800.00). metadata.reference is numeric, 1–7 digits. Reuse the idempotency header on retries — valid for 24h. Subscribe to returned for SPEI returns.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ |
| Content-Type | application/json |
| idempotency | 10042001 |
{ "amount": 180000,Amount (cents)Requiredi180000 cents = MXN 1,800.00. "source_id": "acc_GamingMx01",Source balanceRequirediPlatform's MXN Cobre Balance. "destination_id": "cp_PlayerBank01",Destination counterpartyRequiredicp_… of the verified CLABE belonging to the same player who funded. "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Player 10042 withdrawal",DescriptioniOptional SPEI description, max 40 characters. "reference": "10042"SPEI referenceRequirediNumeric reference, 1–7 digits — required for SPEI. }, "external_id": "wd_player_10042_001"External IDiWithdrawal id on the platform — primary reconciliation key.}{ "id": "mm_Withdraw001",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": "Player 10042 withdrawal",DescriptioniOptional SPEI description, max 40 characters. "reference": "10042"SPEI referenceRequirediNumeric reference, 1–7 digits — required for SPEI. }, "creator": "cli_gaming_mx01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "wd_player_10042_001",External IDiWithdrawal id on the platform — primary reconciliation key. "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": "spei",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_GamingMx01",Source balanceRequirediPlatform's MXN Cobre Balance. "destination_id": "cp_PlayerBank01",Destination counterpartyRequiredicp_… of the verified CLABE belonging to the same player who funded. "currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn). "amount": 180000,Amount (cents)Requiredi180000 cents = MXN 1,800.00. "created_at": "2026-09-15T16:40:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T16:40:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Webhook outcomes — Money movement
SPEI completed — mark the withdrawal settled on the platform using external_id. Persist tracking_key and cep_url for audit and CEP. The same event feeds Compliance: player, destination CLABE, amount, timestamp, and state.
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.
money_movements.status.completed| Content-Type | application/json |
{ "id": "evt_Withdraw001",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-09-15T16:42:20Z",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_Withdraw001",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": "Player 10042 withdrawal",DescriptioniHuman-readable label or note. "reference": "10042",ReferenceiPayment reference echoed in metadata for reconciliation. "tracking_key": "20260915mmGamingWd01",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "cep_url": "https://cep.banco.com/download"Cep UrliMetadata field "cep_url" attached to the resource. }, "creator": "cli_gaming_mx01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "wd_player_10042_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": "spei",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_GamingMx01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_PlayerBank01",Destination IdiCobre id of the destination account or counterparty. "currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn). "amount": 180000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-09-15T16:40:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T16:42:20Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Cobre or the rail could not process the movement. Inspect status.code and status.description. The list below is filtered to this Money Movement’s direction (payin, payout, or both):
| Code | Description | Applies to |
|---|---|---|
F001 | Payment processing failed please try again. | Payin and payout |
F002 | NSF - Not Sufficient Funds in the designated account. | Payin and payout |
F004 | Daily transaction amount limit has been reached. | Payin and payout |
F005 | Amount exceeds the maximum allowed transaction limit. | Payin and payout |
F098 | Could not process the money movement at this time. | Payin and payout |
F099 | Could not process the money movement at this time. | Payin and payout |
money_movements.status.failed| Content-Type | application/json |
{ "id": "evt_Withdraw001",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-09-15T16:42:20Z",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_Withdraw001",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": "Player 10042 withdrawal",DescriptioniHuman-readable label or note. "reference": "10042",ReferenceiPayment reference echoed in metadata for reconciliation. "tracking_key": "20260915mmGamingWd01",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "cep_url": "https://cep.banco.com/download"Cep UrliMetadata field "cep_url" attached to the resource. }, "creator": "cli_gaming_mx01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "wd_player_10042_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": "spei",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_GamingMx01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_PlayerBank01",Destination IdiCobre id of the destination account or counterparty. "currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn). "amount": 180000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-09-15T16:40:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T16:42:20Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}The bank or payment network rejected the transaction. Inspect status.code. The list below is filtered to this Money Movement’s direction (payin, payout, or both):
| Code | Description | Applies to |
|---|---|---|
R000 | Transaction rejected. | Payin and payout |
R001 | Inactive or blocked account. | Payin and payout |
R002 | Account and identification provided do not coincide. | Payin and payout |
R004 | ID not valid. | Payout |
R005 | Account does not exist. | Payin and payout |
R006 | Invalid account number. | Payin and payout |
R009 | Exceeds maximum allowed amount. | Payin and payout |
R010 | Account not authorized to debit. | Payin and payout |
R011 | Invalid Account type. | Payout |
R015 | Account not authorized to be credited. | Payout |
R018 | Payment rejected due invalid key. | Payout |
R023 | Payment cancelled by the user. | Payin and payout |
R024 | Exceeds maximum allowed number of transactions. | Payout |
R025 | Required information missing. | Payout |
R026 | Payment rejected due to unavailable bank services. | Payin and payout |
R027 | Account exceeds the maximum allowed transaction limit. | Payin and payout |
R034 | Account closed. | Payin and payout |
R085 | Bank processing error. | Payout |
money_movements.status.rejected| Content-Type | application/json |
{ "id": "evt_Withdraw001",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-09-15T16:42:20Z",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_Withdraw001",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": "Player 10042 withdrawal",DescriptioniHuman-readable label or note. "reference": "10042",ReferenceiPayment reference echoed in metadata for reconciliation. "tracking_key": "20260915mmGamingWd01",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). "cep_url": "https://cep.banco.com/download"Cep UrliMetadata field "cep_url" attached to the resource. }, "creator": "cli_gaming_mx01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "wd_player_10042_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": "spei",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "mex",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "acc_GamingMx01",Source IdiCobre id of the source account or counterparty. "destination_id": "cp_PlayerBank01",Destination IdiCobre id of the destination account or counterparty. "currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn). "amount": 180000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-09-15T16:40:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-09-15T16:42:20Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Reconcile the SPEI withdrawal
Match the completion webhook against the platform's ledger by external_id and mm_id. Confirm destination_id is the same counterparty that funded. The platform, Cobre, and the bank reconcile against the same identifier — the gray zone between "the player says they deposited/withdrew" and "the system doesn't see it" disappears.
Mapping the webhook payload from an earlier step onto Platform ledger / Compliance. No API call is made — this step closes the loop in your own system.
| Cobre field & value | Platform ledger / Compliance field | |
content.external_id wd_player_10042_001 |
→ | withdrawal_id Primary key — the withdrawal id on the platform. |
content.id mm_Withdraw001 |
→ | cobre_mm_id |
content.destination_id cp_PlayerBank01 |
→ | registered_counterparty_id Must be the same verified counterparty that originated the deposit. |
content.metadata.tracking_key 20260915mmGamingWd01 |
→ | spei_tracking_key SPEI network tracking key — audit file and bank reconciliation. |
content.metadata.cep_url https://cep.banco.com/download |
→ | spei_receipt_url Download URL for the CEP (Comprobante Electrónico de Pago). |
content.status.state completed |
→ | withdrawal_status Map completed → PAID; failed/rejected/returned → review. |
content.amount 180000 |
→ | paid_amount_cents |