Authenticate
Exchange API credentials for a short-lived Bearer token (~20 minutes). Reuse the same token string on every later call in this flow.
| Content-Type | application/json |
{ "user_id": "cli_demo_co_dd01",User IDRequirediAPI user id issued by Cobre (cli_…). "secret": "sk_live_2Hg8nP4qR7"SecretRequirediAPI secret from key creation — treat like a password.}{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19jb19kZDAxIn0.R2pDd9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ",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.}Subscribe to Direct Debit Events
Subscribe to Direct Debit Registration status events (tokenization) and Money Movement payin events (collection). Include accounts.balance.credit for dd_credit on completion. Verify deliveries with HMAC-SHA256.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19jb19kZDAxIn0.R2pDd9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "url": "https://yourplatform.co/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications. "description": "Direct Debit Nequi 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": "WHddNequi9xZ"Signature keyRequirediSecret you provide; Cobre HMAC-signs each delivery.}{ "id": "sub_DdNequi01",IdiUnique Cobre identifier for this resource. "url": "https://yourplatform.co/webhooks/cobre",Notification URLRequirediHTTPS endpoint that receives Cobre POST notifications. "description": "Direct Debit Nequi 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-04T10:00:00Z"Created AtiTimestamp when the resource was created (ISO 8601, UTC).}Register the Payer (dp Counterparty)
Direct Debit debits a registered bank account counterparty (type dp, cc, or ch). For Nequi, set beneficiary_institution to 1507 and account_number to the Nequi account (often the payer's phone-linked account). Register once per payer — reuse the same cp_… for future debits after DDR consent.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19jb19kZDAxIn0.R2pDd9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "geo": "col",GeographyRequiredicol = Colombia. "type": "dp",TypeRequiredidp = electronic deposit (demo uses Nequi FI 1507). cc/ch also support Direct Debit when registered. "alias": "Nequi payer - dd_sub_001",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "counterparty_fullname": "Juliana Restrepo",Full nameRequirediPayer's full legal name — required for Direct Debit registration. "beneficiary_institution": "1507",Financial institutionRequiredi1507 = Nequi (Colombian bank code). "account_number": "3001234567",Account numberRequirediNequi account to debit — typically the phone-linked account number. "counterparty_id_type": "nd",ID typeRequirediUse nd with counterparty_id_number ND to skip ID validation on the Nequi rail (data minimization). "counterparty_id_number": "ND",ID numberRequirediND when skipping ID validation; both ID fields must be ND together. "counterparty_phone": "+573123927834"PhoneiSupports the Nequi consent push during DDR registration. }}{ "id": "cp_NequiDdPayer001",IdiUnique Cobre identifier for this resource. "geo": "col",GeographyRequiredicol = Colombia. "type": "dp",TypeRequiredidp = electronic deposit (demo uses Nequi FI 1507). cc/ch also support Direct Debit when registered. "alias": "Nequi payer - dd_sub_001",AliasiDisplay name that helps identify it and clarify its purpose. "metadata": {MetadataiCustom key-value metadata attached to the resource. "counterparty_fullname": "Juliana Restrepo",Full nameRequirediPayer's full legal name — required for Direct Debit registration. "beneficiary_institution": "1507",Financial institutionRequiredi1507 = Nequi (Colombian bank code). "account_number": "3001234567",Account numberRequirediNequi account to debit — typically the phone-linked account number. "counterparty_id_type": "nd",ID typeRequirediUse nd with counterparty_id_number ND to skip ID validation on the Nequi rail (data minimization). "counterparty_id_number": "ND",ID numberRequirediND when skipping ID validation; both ID fields must be ND together. "counterparty_phone": "+573123927834",PhoneiSupports the Nequi consent push during DDR registration. "registered_account": falseRegistered AccountiCobre field at "metadata.registered_account" in this payload. }, "created_at": "2026-08-04T10:05:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:05:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Request Direct Debit Consent (Nequi)
Start one-time Direct Debit Registration for the payer. Cobre sends a Nequi push — the payer has up to 15 minutes to accept or reject. Only type: nequi is required; registration_description is optional (max 15 characters). Do not create debits until status.state is registered.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19jb19kZDAxIn0.R2pDd9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
{ "type": "nequi",Registration typeRequiredinequi — only supported Direct Debit registration rail in this demo. "registration_description": "Platform subs"Registration descriptioniOptional label sent to the network — max 15 characters.}{ "id": "ddr_NequiReg001",IdiUnique Cobre identifier for this resource. "type": "nequi",Registration typeRequiredinequi — only supported Direct Debit registration rail in this demo. "destination_id": "",Destination IdiCobre id of the destination account or counterparty. "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. }, "registration_description": "Platform subs",Registration descriptioniOptional label sent to the network — max 15 characters. "created_at": "2026-08-04T10:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:10:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Webhook delivered
direct_debit_registrations.status.registeredAfter the payer accepts the Nequi push, Cobre delivers this webhook. The counterparty is now eligible for silent Direct Debit collections. Track ddr id and poll GET …/direct_debit_registrations if needed.
| Content-Type | application/json |
{ "id": "ev_DdReg001Reg",IdiUnique Cobre identifier for this resource. "event_key": "direct_debit_registrations.status.registered",Event KeyiWebhook subscription key (e.g. money_movements.status.completed). "created_at": "2026-08-04T10:18: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": "ddr_NequiReg001",IdiUnique Cobre identifier for this resource. "type": "nequi",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "destination_id": "",Destination IdiCobre id of the destination account or counterparty. "status": {StatusiLifecycle status object for the resource or movement. "state": "registered",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. }, "registration_description": "Platform subs",Registration DescriptioniCobre field at "content.registration_description" in this payload. "created_at": "2026-08-04T10:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:18:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). }}Verify Registration Status
Before each debit, confirm the payer has at least one Direct Debit Registration in registered state. Poll this endpoint or rely on your cached ddr status from webhooks.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19jb19kZDAxIn0.R2pDd9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
{ "contents": [ContentsiArray of result objects for this page. { "id": "ddr_NequiReg001",IdiUnique Cobre identifier for this resource. "type": "nequi",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "destination_id": "",Destination IdiCobre id of the destination account or counterparty. "status": {StatusiLifecycle status object for the resource or movement. "state": "registered",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. }, "registration_description": "Platform subs",Registration DescriptioniCobre field at "contents.0.registration_description" in this payload. "created_at": "2026-08-04T10:10:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:18:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC). } ], "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": 1Page ItemsiNumber of items returned on this page.}Collect via Direct Debit (Nequi)
Create a Direct Debit Money Movement: source = registered counterparty, destination = your COP Cobre Balance. No payer push per debit — Nequi processes in real time after tokenization. metadata.description max 15 characters. Amount is integer cents (500000 = COP 5,000.00). Reuse idempotency on retries — valid 24h.
| Authorization | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbGlfZGVtb19jb19kZDAxIn0.R2pDd9xK2vN7cL4wT8aH1gF6yJ0bZ5eQ |
| Content-Type | application/json |
| idempotency | dd-charge-sub-001-cycle-12 |
{ "amount": 500000,Amount (cents)Requiredi500000 cents = COP 5,000.00. "source_id": "cp_NequiDdPayer001",Payer counterpartyRequiredicp_… with a registered Direct Debit Registration (Nequi). "destination_id": "acc_FundingCOP01",Destination balanceRequirediYour COP Cobre Balance that receives the payin. "metadata": {MetadataiCustom key-value metadata attached to the resource. "description": "Monthly sub"DescriptionRequirediDirect Debit description — max 15 characters. }, "external_id": "dd_sub_001_cycle_12"External IDiYour debit reference — primary reconciliation join key.}{ "id": "mm_DdNequi001",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": "Monthly sub",DescriptionRequirediDirect Debit description — max 15 characters. "registration_description": "Platform subs"Registration DescriptioniCobre field at "metadata.registration_description" in this payload. }, "creator": "cli_demo_co_dd01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "dd_sub_001_cycle_12",External IDiYour debit 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": "direct_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "cp_NequiDdPayer001",Payer counterpartyRequiredicp_… with a registered Direct Debit Registration (Nequi). "destination_id": "acc_FundingCOP01",Destination balanceRequirediYour COP Cobre Balance that receives the payin. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 500000,Amount (cents)Requiredi500000 cents = COP 5,000.00. "created_at": "2026-08-04T10:25:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:25:00Z"Updated AtiTimestamp of the last update (ISO 8601, UTC).}Webhook outcomes — Money movement
When the Direct Debit settles, Cobre delivers this webhook. Mark the payin as received using external_id. Cobre also credits your Cobre Balance (dd_credit) — see the Transaction tab when mapped.
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.
money_movements.status.completed| Content-Type | application/json |
{ "id": "ev_DdNequi001Cmp",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-04T10:26: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_DdNequi001",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": "Monthly sub",DescriptioniHuman-readable label or note. "registration_description": "Platform subs"Registration DescriptioniMetadata field "registration_description" attached to the resource. }, "creator": "cli_demo_co_dd01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "dd_sub_001_cycle_12",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": "direct_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "cp_NequiDdPayer001",Source IdiCobre id of the source account or counterparty. "destination_id": "acc_FundingCOP01",Destination IdiCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 500000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-08-04T10:25:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:26: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):
| 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 |
F003 | R2P Payment link expired. | Payin |
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": "ev_DdNequi001Cmp",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-04T10:26: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_DdNequi001",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. "description": "Monthly sub",DescriptioniHuman-readable label or note. "registration_description": "Platform subs"Registration DescriptioniMetadata field "registration_description" attached to the resource. }, "creator": "cli_demo_co_dd01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "dd_sub_001_cycle_12",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": "direct_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "cp_NequiDdPayer001",Source IdiCobre id of the source account or counterparty. "destination_id": "acc_FundingCOP01",Destination IdiCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 500000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-08-04T10:25:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:26: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):
| 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 |
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 |
R012 | The user has abandoned the transaction. | Payin |
R016 | Payment rejected due to timeout. | Payin |
R017 | Payment rejected due to expired money movement. | Payin |
R019 | Payment rejected due to incorrect amount. | Payin |
R020 | Payment rejected due to user authentication failure. | Payin |
R021 | Insufficient funds in payer account. | Payin |
R023 | Payment cancelled by the user. | Payin and 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 |
R081 | The counterparty registration has expired. | Payin |
R082 | The counterparty registration has been canceled. | Payin |
R084 | The counterparty registration has been rejected. | Payin |
money_movements.status.rejected| Content-Type | application/json |
{ "id": "ev_DdNequi001Cmp",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-04T10:26: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_DdNequi001",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. "description": "Monthly sub",DescriptioniHuman-readable label or note. "registration_description": "Platform subs"Registration DescriptioniMetadata field "registration_description" attached to the resource. }, "creator": "cli_demo_co_dd01",CreatoriActor that created the resource. On a Checkout-created Money Movement this is the r2p source counterparty (cp_…), not the API user. "external_id": "dd_sub_001_cycle_12",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": "direct_debit",TypeiResource or movement type as defined by the Cobre API for this rail/product (e.g. breb_credit for Cobre Key payins). "geo": "col",GeoiGeography code (e.g. col = Colombia, mex = Mexico). "source_id": "cp_NequiDdPayer001",Source IdiCobre id of the source account or counterparty. "destination_id": "acc_FundingCOP01",Destination IdiCobre id of the destination account or counterparty. "currency": "cop",CurrencyiISO currency code (e.g. cop, mxn). "amount": 500000,AmountiAmount in cents — the last two digits are decimals. "created_at": "2026-08-04T10:25:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "updated_at": "2026-08-04T10:26: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.
accounts.balance.credit| Content-Type | application/json |
{ "id": "ev_DdNequi001Cr",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-04T10:26: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_DdNequi001Cr",IdiUnique Cobre identifier for this resource. "type": "dd_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_FundingCOP01",Account IdiCobre Balance account id affected by the event. "amount": 500000,AmountiAmount in cents — the last two digits are decimals. "previous_balance": 0,Previous BalanceiCobre field at "content.previous_balance" in this payload. "current_balance": 500000,Current BalanceiCobre field at "content.current_balance" in this payload. "currency": "COP",CurrencyiISO currency code (e.g. cop, mxn). "credit_debit_type": "credit",Credit Debit Typeicredit = funds in; debit = funds out. "transaction_date": "2026-08-04T10:26:00Z",Transaction DateiTimestamp when the transaction was posted (ISO 8601, UTC). "created_at": "2026-08-04T10:26:00Z",Created AtiTimestamp when the resource was created (ISO 8601, UTC). "metadata": {MetadataiCustom key-value metadata attached to the resource. "money_movement_id": "mm_DdNequi001",Money Movement IdiMoney Movement that generated this balance transaction. "description": "Monthly sub",DescriptioniHuman-readable label or note. "tracking_key": ""Tracking KeyiNetwork tracking key for the payment (PSE ticket or Bre-B key). } }}Reconcile the Direct Debit Payin
Match the completion webhook to your platform ledger on external_id and mm_id. Cross-check the COP balance credit (dd_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 & value | Platform ledger field | |
content.external_id dd_sub_001_cycle_12 |
→ | debit_reference Primary join key — your subscription or billing cycle id. |
content.id mm_DdNequi001 |
→ | cobre_mm_id |
content.amount 500000 |
→ | received_amount_cents |
content.status.state completed |
→ | payin_status Map completed → RECEIVED; rejected often means insufficient funds. |
content.type direct_debit |
→ | payin_rail |