Step 1 of 5 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_demo_mx_r2pspei01",User IDRequirediAPI user id issued by Cobre (cli_…).
"secret": "sk_live_MxR2p8kL3nQ9"SecretRequirediAPI secret from key creation — treat like a password.
}
Response 201
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19teF9yMnBzcGVpMDEifQ.MxR2p7nK9xQ2mLd3vBw8aF1cR6eH0tJ4gZ",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 5 Configuration API step

Subscribe to Payin Events

Register webhooks for Money Movement status changes and Cobre Balance credits. Subscribe to money_movements.status.* and accounts.balance.credit (r2p_spei_credit on completion). Verify deliveries with HMAC-SHA256.

POST https://api.cobre.co/v1/subscriptions
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19teF9yMnBzcGVpMDEifQ.MxR2p7nK9xQ2mLd3vBw8aF1cR6eH0tJ4gZ
Content-Typeapplication/json
Request body
{
"url": "https://yourplatform.mx/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications.
"description": "Direct Link R2P SPEI payin 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",
"accounts.balance.credit"
],
"event_signature_key": "WHr2pSpei9xZ"Signature keyRequirediSecret you provide; Cobre HMAC-signs each delivery.
}
Response 201
{
"id": "sub_R2pSpeiPayin01",IdiUnique Cobre identifier for this resource.
"url": "https://yourplatform.mx/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications.
"description": "Direct Link R2P SPEI payin 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",
"accounts.balance.credit"
],
"event_signature_key": "******9xZ",Signature keyRequirediSecret you provide; Cobre HMAC-signs each delivery.
"created_at": "2026-08-19T09:00:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).
}
Step 3 of 5 Direct Link R2P SPEI Payin API step

Register the Payer (r2p_spei Counterparty)

Direct Link SPEI payins require an r2p_spei counterparty representing the payer. Register once per customer — the same cp_… can be reused across sessions. counterparty_fullname is required; id and contact fields help resolve disputes.

POST https://api.cobre.co/v1/counterparties
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19teF9yMnBzcGVpMDEifQ.MxR2p7nK9xQ2mLd3vBw8aF1cR6eH0tJ4gZ
Content-Typeapplication/json
Request body
{
"geo": "mex",GeographyRequiredimex = Mexico.
"type": "r2p_spei",TypeRequiredir2p_spei = Direct Link SPEI payer.
"alias": "Jaime Roa",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_fullname": "Jaime Roa",Full nameRequirediPayer's full legal name.
"counterparty_id_type": "rfc",ID typeiMexican tax/identification document type.
"counterparty_id_number": "REMJ0000011C8",ID numberiPayer identification number matching the ID type.
"counterparty_email": "jaime.roa@email.com",EmailiPayer email — RFC 5322 compliant.
"counterparty_phone": ""Counterparty PhoneiCobre field at "metadata.counterparty_phone" in this payload.
}
}
Response 201
{
"id": "cp_PayerR2pSpei001",IdiUnique Cobre identifier for this resource.
"geo": "mex",GeographyRequiredimex = Mexico.
"type": "r2p_spei",TypeRequiredir2p_spei = Direct Link SPEI payer.
"alias": "Jaime Roa",AliasiDisplay name that helps identify it and clarify its purpose.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"counterparty_fullname": "Jaime Roa",Full nameRequirediPayer's full legal name.
"counterparty_id_type": "rfc",ID typeiMexican tax/identification document type.
"counterparty_id_number": "REMJ0000011C8",ID numberiPayer identification number matching the ID type.
"counterparty_email": "jaime.roa@email.com",EmailiPayer email — RFC 5322 compliant.
"counterparty_phone": ""Counterparty PhoneiCobre field at "metadata.counterparty_phone" in this payload.
},
"created_at": "2026-08-19T09:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-08-19T09:10:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}
Step 4 of 5 Direct Link R2P SPEI Payin API step

Collect via SPEI (Direct Link)

Create a Direct Link Money Movement: source = r2p_spei payer counterparty, destination = your MXN Cobre Balance. Set metadata.r2p_rail to spei and valid_until to a short collection window. Cobre returns a one-use CLABE in metadata.virtual_account — display it to the payer to transfer to via SPEI. Amount is in smallest currency unit (800000 = MXN 8,000.00).

POST https://api.cobre.co/v1/money_movements
Headers
AuthorizationBearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19teF9yMnBzcGVpMDEifQ.MxR2p7nK9xQ2mLd3vBw8aF1cR6eH0tJ4gZ
Content-Typeapplication/json
idempotencypayin-r2pspei-001
Request body
{
"amount": 800000,Amount (smallest unit)Requiredi800000 = MXN 8,000.00.
"source_id": "cp_PayerR2pSpei001",Payer counterpartyRequiredicp_… of the registered r2p_spei payer.
"destination_id": "acc_FundingMxR2p01",Destination balanceRequirediYour MXN Cobre Balance that receives the payin.
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"r2p_rail": "spei",R2P railRequiredispei — the only Direct Link rail available in Mexico.
"description_to_payer": "PayIn SPEI",Description to payerRequirediShown to the payer alongside the virtual CLABE.
"description_to_payee": "PayIn SPEI",Description to payeeRequirediShown on your side of the transaction.
"valid_until": "2026-08-19T09:45:00Z"Valid untilRequirediCollection window for the virtual CLABE — minimum 5 minutes, maximum 7 days.
},
"external_id": "payin_ref_101"External IDiYour payin reference — primary reconciliation join key.
}
Response 201
{
"id": "mm_R2pSpeiPayin001",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.
"virtual_account": "703012345678901234",Virtual AccountiCobre field at "metadata.virtual_account" in this payload.
"tracking_key": "",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description_to_payer": "PayIn SPEI",Description to payerRequirediShown to the payer alongside the virtual CLABE.
"description_to_payee": "PayIn SPEI",Description to payeeRequirediShown on your side of the transaction.
"valid_until": "2026-08-19T09:45:00Z",Valid untilRequirediCollection window for the virtual CLABE — minimum 5 minutes, maximum 7 days.
"r2p_rail": "spei"R2P railRequiredispei — the only Direct Link rail available in Mexico.
},
"creator": "cli_demo_mx_r2pspei01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payin_ref_101",External IDiYour payin reference — primary reconciliation join 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": "r2p_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": "cp_PayerR2pSpei001",Payer counterpartyRequiredicp_… of the registered r2p_spei payer.
"destination_id": "acc_FundingMxR2p01",Destination balanceRequirediYour MXN Cobre Balance that receives the payin.
"currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 800000,Amount (smallest unit)Requiredi800000 = MXN 8,000.00.
"created_at": "2026-08-19T09:30:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-08-19T09:30:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).
}

Webhook outcomesMoney movement

After the payer transfers via SPEI to the virtual CLABE and funds settle, Cobre delivers this webhook. Mark the payin as received using external_id. Cobre also credits your Cobre Balance (r2p_spei_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_R2pSpeiPayin001Cmp",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-08-19T09: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": "mm_R2pSpeiPayin001",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.
"virtual_account": "703012345678901234",Virtual AccountiMetadata field "virtual_account" attached to the resource.
"tracking_key": "20260819093000001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description_to_payer": "PayIn SPEI",Description To PayeriPayer-facing description. On Checkout this is checkout_item.
"description_to_payee": "PayIn SPEI",Description To PayeeiDescription that appears on the credit in your Cobre Balance.
"valid_until": "2026-08-19T09:45:00Z",Valid UntiliMetadata field "valid_until" attached to the resource.
"r2p_rail": "spei"R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb).
},
"creator": "cli_demo_mx_r2pspei01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payin_ref_101",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "r2p_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": "cp_PayerR2pSpei001",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_FundingMxR2p01",Destination IdiCobre id of the destination account or counterparty.
"currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 800000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-08-19T09:30:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-08-19T09:35: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_R2pSpeiPayin001Cmp",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-08-19T09: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": "mm_R2pSpeiPayin001",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": "F003",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "R2P Payment link expired."DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"virtual_account": "703012345678901234",Virtual AccountiMetadata field "virtual_account" attached to the resource.
"tracking_key": "20260819093000001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description_to_payer": "PayIn SPEI",Description To PayeriPayer-facing description. On Checkout this is checkout_item.
"description_to_payee": "PayIn SPEI",Description To PayeeiDescription that appears on the credit in your Cobre Balance.
"valid_until": "2026-08-19T09:45:00Z",Valid UntiliMetadata field "valid_until" attached to the resource.
"r2p_rail": "spei"R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb).
},
"creator": "cli_demo_mx_r2pspei01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payin_ref_101",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "r2p_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": "cp_PayerR2pSpei001",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_FundingMxR2p01",Destination IdiCobre id of the destination account or counterparty.
"currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 800000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-08-19T09:30:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-08-19T09:35: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_R2pSpeiPayin001Cmp",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-08-19T09: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": "mm_R2pSpeiPayin001",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": "R016",CodeiProvider or Cobre status code when the state is failed or rejected.
"description": "Payment rejected due to timeout."DescriptioniHuman-readable label or note.
},
"metadata": {MetadataiCustom key-value metadata attached to the resource.
"virtual_account": "703012345678901234",Virtual AccountiMetadata field "virtual_account" attached to the resource.
"tracking_key": "20260819093000001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"description_to_payer": "PayIn SPEI",Description To PayeriPayer-facing description. On Checkout this is checkout_item.
"description_to_payee": "PayIn SPEI",Description To PayeeiDescription that appears on the credit in your Cobre Balance.
"valid_until": "2026-08-19T09:45:00Z",Valid UntiliMetadata field "valid_until" attached to the resource.
"r2p_rail": "spei"R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb).
},
"creator": "cli_demo_mx_r2pspei01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user.
"external_id": "payin_ref_101",External IdiYour own reference echoed by Cobre for reconciliation.
"checker_approval": false,Checker ApprovaliWhen true, Cobre pauses at pending_approval and locks source funds until an approval/denial decision via Money Movement Approvals API.
"mm_approval_id": "",Mm Approval IdiMoney Movement Approval id (mma_…) when checker_approval is true — used for the decision endpoint.
"type": "r2p_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": "cp_PayerR2pSpei001",Source IdiCobre id of the source account or counterparty.
"destination_id": "acc_FundingMxR2p01",Destination IdiCobre id of the destination account or counterparty.
"currency": "mxn",CurrencyiISO currency code (e.g. cop, mxn).
"amount": 800000,AmountiAmount in cents — the last two digits are decimals.
"created_at": "2026-08-19T09:30:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC).
"updated_at": "2026-08-19T09:35: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_R2pSpeiPayCr",IdiUnique Cobre identifier for this resource.
"event_key": "accounts.balance.credit",Event KeyiWebhook subscription key (e.g. money_movements.status.completed).
"created_at": "2026-08-19T09: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_R2pSpeiPayinCr",IdiUnique Cobre identifier for this resource.
"type": "r2p_spei_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_FundingMxR2p01",Account IdiCobre Balance account id affected by the event.
"amount": 800000,AmountiAmount in cents — the last two digits are decimals.
"previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload.
"current_balance": 800000,Current BalanceiCobre field at "content.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-08-19T09:35:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC).
"created_at": "2026-08-19T09: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_R2pSpeiPayin001",Money Movement IdiMoney Movement that generated this balance transaction.
"mm_external_id": "payin_ref_101",Mm External IdiMetadata field "mm_external_id" attached to the resource.
"description": "PayIn SPEI",DescriptioniHuman-readable label or note.
"sender_name": "",Sender NameiMetadata field "sender_name" attached to the resource.
"sender_clabe": "",Sender ClabeiMetadata field "sender_clabe" attached to the resource.
"tracking_key": "20260819093000001",Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key).
"r2p_rail": "spei"R2p RailiRequest-to-Pay rail the payer chose (pse, nequi, bancolombia, breb).
}
}
}
Step 5 of 5 Reconciliation Reconciliation

Reconcile the Direct Link R2P SPEI Payin

Match the completion webhook to your platform ledger on external_id and mm_id. Cross-check the MXN balance credit (r2p_spei_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_101
payin_reference
Primary join key — your payin or order id.
content.id
mm_R2pSpeiPayin001
cobre_mm_id
content.amount
800000
received_amount_cents
content.status.state
completed
payin_status
Map completed → RECEIVED; failed/rejected → review or retry.
content.metadata.virtual_account
703012345678901234
collection_clabe
One-use CLABE generated for this Money Movement — do not reuse across payins.