Step 1 of 11 Configuration API step

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.

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

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.

POST https://api.cobre.co/v1/accounts
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Step 3 of 11 Configuration API step

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.

POST https://api.cobre.co/v1/subscriptions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Step 4 of 11 Player Onboarding API step

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.

POST https://api.cobre.co/v1/account_references
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"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.
}
Response 200
{
"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).
}
Step 5 of 11 Bank Account Registration API step

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.

POST https://api.cobre.co/v1/account_verifications
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"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.
}
Response 201
{
"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).
}
Step 6 of 11 Bank Account Registration API step

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.

GET https://api.cobre.co/v1/account_verifications/av_PlayerBank01Verification IDRequirediPath parameter — the av_… from the creation response.
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Response 200
{
"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).
}
Step 7 of 11 Bank Account Registration API step

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.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
Request body
{
"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.
}
}
Response 201
{
"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).
}
Step 8 of 11 SPEI Deposit API step

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.

GET https://api.cobre.co/v1/accounts/acc_GamingMx01MXN Cobre BalanceRequirediPath parameter — Cobre Balance where Virtual CLABE SPEI credits are recorded./transactions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
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_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.credit

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

Headers
Content-Typeapplication/json
Payload
{
"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.
}
}
Step 9 of 11 SPEI Deposit Reconciliation

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 & valuePlatform 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.
Step 10 of 11 SPEI Withdrawal API step

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.

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZ2FtaW5nX214MDEifQ.Lg7Kp3nQ9xY2mLd8vBw1aF6cR0eH4tJ5gZ
Content-Typeapplication/json
idempotency10042001
Request body
{
"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.
}
Response 201
{
"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.

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

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": "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):

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": "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).
}
}
Step 11 of 11 Reconciliation Reconciliation

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 & valuePlatform 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