Banking API payments
API 1.0.0An MCP tool wraps this operation: Banking API (BaaS).
The Payments group covers a payment's full cycle: create it, fetch it by identifier,
list it with filters and search it by any of its references.
POST /api/public/v1/transactions/payments
GET /api/public/v1/transactions/payments
GET /api/public/v1/transactions/payments/{payment_id}
POST /api/public/v1/transactions/payments/searchResource rules#
Methods. payment_method_code accepts PIN and SINPE_MOVIL. Direction.
direction accepts OUT (outbound) and IN (inbound). Destination account. it is
identified by IBAN or by PHONE, depending on the method.
Your own reference. client_reference is your payment identifier and is unique per
tenant: two payments of the same customer cannot share it. Use it to look a payment up
without storing the payment_id.
Safe retries. Creation accepts Idempotency-Key; resending the same key with the same
body returns the original payment instead of creating another one. See
safe retries.
States#
A payment moves through five states: pending, processing, confirmed, posted and
failed.
A reversal is not a state: a reversed payment stays in posted and is recognized by
result: reversed and has_reversal: true, plus the
payment.reversed event. Always check those two
fields before treating a payment as final.
Operations#
List customer payments
GET /api/public/v1/transactions/payments
Host: https://api-baas-sandbox.tilopay.com — requires Authorization: Bearer <access_token>.
Simple REST list of payments for an owned account (IBAN).
Filters are query parameters. Ownership (tenant_id, owner_type, owner_id) is derived from the access token; clients must not send ownership filters.
Account identification (required): type + value (identifier scheme + value, e.g. IBAN + IBAN string). This is not the internal account classification.
Pagination is cursor-based (limit, cursor). Default limit is 20 (max 100).
status in the response and as a filter uses the public lowercase catalog (pending, processing, confirmed, posted, failed). Same values as webhooks. REST also returns status_detail (uppercase operational name).
Each item includes a consolidated result (succeeded, failed, reversed, pending) for reconciliation when a webhook was missed. status is only the processing/lifecycle catalog and does not change to failed when a posted payment is later reversed — use result=reversed and has_reversal=true (webhook payment.reversed). error is null when there is no failure information; it is an object only when domain / platform is present (result is failed or reversed), same shape as webhook payment.failed payment.error. source / destination use null for unknown account, name, and identification; account values are IBAN or PHONE only (never ledger UUIDs). For PIN payments created after public identification persistence, identification.number is the partner-submitted public number (no SINPE hyphens); older payments may still show the hyphenated SINPE form. See docs/PAYMENT-IDENTIFICATION.md.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-Correlation-Id | header | string | — | Optional client-supplied correlation id for end-to-end tracing.
Echoed back as correlation_id in the response envelope. If omitted,
the API generates one and still returns it. |
type | query | string | yes | Account identifier scheme (e.g. IBAN).
This is not the internal account classification
(e.g. operational).Values: IBAN |
value | query | string | yes | Account identifier value (IBAN). Spaces are ignored. |
status | query | string | — | Optional payment status filter. Public catalog is lowercase:
pending, processing, confirmed, posted, failed.
Uppercase aliases of the same values are accepted. Legacy values
such as INITIATED map to pending.Values: pending, processing, confirmed, posted, failed |
date_from | query | string (date-time) | — | Inclusive lower bound for created_at. RFC 3339 (UTC Z or offset; optional fractional seconds). |
date_to | query | string (date-time) | — | Inclusive upper bound for created_at. RFC 3339 (UTC Z or offset; optional fractional seconds). |
client_reference | query | string | — | Filter by partner client reference (exact match against the value sent at payment creation). |
currency | query | string | — | Filter by payment currency (ISO 4217, e.g. CRC). |
payment_method_code | query | string | — | Filter by public payment method code.Values: PIN, SINPE_MOVIL |
direction | query | string | — | Filter by payment direction. Accepts public values OUT/IN or
PAYOUT/PAYIN (internally normalized to payout/payin).Values: OUT, IN, PAYOUT, PAYIN |
limit | query | integer | — | Page size (default 20, max 100). |
cursor | query | string | — | Opaque cursor from a previous response pagination.next_cursor. |
Response 200
The request was processed successfully.
response_code: OK
| Field | Type | Required | Description |
|---|---|---|---|
items | array<object> | yes | — |
items[].amount | object | yes | — |
items[].amount.amount | string | yes | — |
items[].amount.currency | string | yes | — |
items[].client_reference | string | yes | — |
items[].created_at | string | yes | — |
items[].destination | object | yes | — |
items[].destination.account | object | yes | — |
items[].destination.identification | object | yes | — |
items[].destination.name | string | yes | — |
items[].error | object | yes | — |
items[].error.domain | string | yes | — |
items[].error.platform | object | yes | — |
items[].external_reference | string | yes | — |
items[].has_reversal | boolean | yes | — |
items[].payment_id | string | yes | — |
items[].payment_method_code | string | yes | — |
items[].provider | object | yes | — |
items[].provider.correlation_id | string | yes | — |
items[].provider.occurred_at | string | yes | — |
items[].provider.provider_status_code | string | yes | — |
items[].provider.provider_status_desc | string | yes | — |
items[].provider.provider_status_semantic | string | yes | — |
items[].public_id | string | yes | — |
items[].result | string | yes | — |
items[].reversed_at | string | yes | — |
items[].schema_version | string | yes | — |
items[].source | object | yes | — |
items[].source.account | object | yes | — |
items[].source.identification | object | yes | — |
items[].source.name | string | yes | — |
items[].status | string | yes | — |
items[].status_detail | string | — | — |
items[].succeeded_at | string | yes | — |
items[].type | string | yes | — |
items[].updated_at | string | yes | — |
pagination | object | — | — |
pagination.limit | integer | yes | — |
pagination.next_cursor | string | — | — |
schema_version | string | yes | — |
Error responses
| HTTP | response_code | Description |
|---|---|---|
| 400 | INVALID_REQUEST | Invalid request. Check the required fields and try again. |
| 401 | UNAUTHORIZED | Unauthorized. Verify your session or credentials. |
| 403 | FORBIDDEN, ACCOUNT_ACCESS_DENIED | You do not have permission to perform this action. |
| 429 | TOO_MANY_REQUESTS | Too many requests. Please retry after a short delay. |
| 500 | INTERNAL_ERROR | An unexpected error occurred. Please try again later. |
| 502 | PROVIDER_ERROR | Unable to complete the request with the payment provider. Please try again later. |
| 503 | SERVICE_UNAVAILABLE | A required service is temporarily unavailable. Please try again later. |
Create payment
POST /api/public/v1/transactions/payments
Host: https://api-baas-sandbox.tilopay.com — requires Authorization: Bearer <access_token>. Accepts Idempotency-Key.
Creates a payment using an authorized internal source account. Processing may be asynchronous; HTTP 201 does not imply the payment is finalized. source.identification.number and destination.identification.number are stored in public form (the submitted digits, without SINPE hyphens) and returned on later payment reads. The GX/SINPE hyphenated form is used only internally and is not the public contract. Idempotency-Key is optional; if omitted, each request is treated as a new attempt. A repeated client_reference returns 409 PAYMENT_DUPLICATE when an in-flight or completed payment already uses it; a prior failed (or rejected/cancelled/expired) payment does not block a retry with the same client_reference. If Idempotency-Key is provided, the same key with the same payload replays the prior response; a different payload with the same key returns 409 IDEMPOTENCY_CONFLICT.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-Correlation-Id | header | string | — | Optional client-supplied correlation id for end-to-end tracing.
Echoed back as correlation_id in the response envelope. If omitted,
the API generates one and still returns it. |
Idempotency-Key | header | string | — | Optional opaque client key for safe retries. When omitted, each call is a new attempt (duplicates are detected by client_reference on in-flight or completed payments). Reusing a key with a different body returns 409. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
payment_method_code | string | yes | Public payment method catalog (PIN, SINPE_MOVIL).Values: PIN, SINPE_MOVIL |
direction | string | yes | Operation direction (OUT = payout from internal source)Values: OUT, IN |
country_code | string | — | Operational country when multi-country applies |
amount | object | yes | — |
amount.amount | string | — | — |
amount.currency | string | — | — |
source | object | yes | — |
source.account | object | yes | — |
source.account.type | string | yes | Account identifier scheme. Only IBAN is supported here.
This is not the internal account classification
(e.g. operational).Values: IBAN |
source.account.value | string | yes | IBAN (spaces allowed; normalized server-side) |
source.name | string | yes | Account holder name |
source.identification | object | yes | Counterparty identification for payment create.
type uses platform identification-catalog keys (e.g. cedula, juridica, dimex).
Same vocabulary as holder.id_type from POST /accounts/validate.
number is the public identification (digits, no SINPE hyphens). The platform
may reformat it internally for GX/SINPE; that internal form is not echoed on
public payment reads for payments created after public identification persistence.
For SINPE_MOVIL, account validate may return unknown because the wallet
operation does not expose identification type; do not assume a confirmed type. |
source.identification.type | string | — | Identification catalog key (lowercase), e.g. cedula, juridica.
May be copied from holder.id_type after account validate.
For SINPE_MOVIL that value may be unknown (expected limitation, not an error). |
source.identification.number | string | — | Public identification number as submitted by the partner.
Digits only; do not send SINPE hyphenation (e.g. 01-1234-3005)
or treat this field as the internal GX/SINPE display form.
Supported types include cedula, juridica, dimex, gobierno,
institucion_autonoma, didi, and pasaporte. |
destination | object | yes | — |
destination.account | object | yes | — |
destination.account.type | string | yes | Counterparty account identifier scheme (IBAN for PIN, PHONE for SINPE_MOVIL).
Not the internal account classification.Values: IBAN, PHONE |
destination.account.value | string | yes | — |
destination.name | string | yes | Counterparty name |
destination.identification | object | yes | Counterparty identification for payment create.
type uses platform identification-catalog keys (e.g. cedula, juridica, dimex).
Same vocabulary as holder.id_type from POST /accounts/validate.
number is the public identification (digits, no SINPE hyphens). The platform
may reformat it internally for GX/SINPE; that internal form is not echoed on
public payment reads for payments created after public identification persistence.
For SINPE_MOVIL, account validate may return unknown because the wallet
operation does not expose identification type; do not assume a confirmed type. |
destination.identification.type | string | — | Identification catalog key (lowercase), e.g. cedula, juridica.
May be copied from holder.id_type after account validate.
For SINPE_MOVIL that value may be unknown (expected limitation, not an error). |
destination.identification.number | string | — | Public identification number as submitted by the partner.
Digits only; do not send SINPE hyphenation (e.g. 01-1234-3005)
or treat this field as the internal GX/SINPE display form.
Supported types include cedula, juridica, dimex, gobierno,
institucion_autonoma, didi, and pasaporte. |
detail_reference | string | yes | Operational / transactional description stored on the payment |
client_reference | string | — | Partner functional reference. Unique per tenant among in-flight and completed payments; a failed attempt can be retried with the same value. |
channel_reference | string | — | — |
originator | object | — | Optional Ultimate Debtor / Travel Rule originator information. Informational only in this release; no validation is applied. Stored under payment metadata when provided. |
originator.company | object | — | — |
originator.company.legal_name | string | — | — |
originator.company.id_type | string | — | — |
originator.company.id_number | string | — | — |
originator.customer | object | — | — |
originator.customer.name | string | — | — |
originator.customer.id_type | string | — | — |
originator.customer.id_number | string | — | — |
Response 201
The resource was created successfully.
response_code: CREATED
| Field | Type | Required | Description |
|---|---|---|---|
created_at | string | yes | — |
payment_id | string | yes | — |
payment_method_code | string | yes | — |
public_id | string | yes | — |
status | string | yes | — |
status_detail | string | yes | — |
Error responses
| HTTP | response_code | Description |
|---|---|---|
| 400 | PAYMENT_INVALID_PAYLOAD, INVALID_PAYMENT_METHOD, INVALID_ACCOUNT_TYPE, ACCOUNT_INVALID, ACCOUNT_HOLDER_MISMATCH | Invalid payment request payload. |
| 401 | UNAUTHORIZED | Unauthorized. Verify your session or credentials. |
| 403 | FORBIDDEN, ACCOUNT_ACCESS_DENIED | You do not have permission to perform this action. |
| 404 | ACCOUNT_NOT_FOUND | Account not found. |
| 409 | IDEMPOTENCY_CONFLICT, PAYMENT_DUPLICATE, CONFLICT | Idempotency conflict: the same Idempotency-Key was reused with a different request body, or a previous request is still in progress. |
| 422 | INSUFFICIENT_FUNDS, LIMIT_EXCEEDED, UNPROCESSABLE_ENTITY | Insufficient funds to complete the payment. |
| 429 | TOO_MANY_REQUESTS | Too many requests. Please retry after a short delay. |
| 500 | INTERNAL_ERROR | An unexpected error occurred. Please try again later. |
| 502 | PROVIDER_ERROR | Unable to complete the request with the payment provider. Please try again later. |
| 503 | SERVICE_UNAVAILABLE | A required service is temporarily unavailable. Please try again later. |
Search payment by identifier
POST /api/public/v1/transactions/payments/search
Host: https://api-baas-sandbox.tilopay.com — requires Authorization: Bearer <access_token>.
Looks up a single payment within the supplied customer account by exactly one of:
payment_id(internal UUID)public_id(numeric public identifier)client_reference(partner reference sent at creation)
Sending more than one identifier returns 400. Response shape matches get-by-id (schema_version, payment-level external_reference, shared provider object, provider.provider_status_*, webhook-aligned error). Same public contract as GET /transactions/payments, including public identification.number for PIN payments created after public identification persistence. If several payments share a client_reference (failed attempt plus retry), the in-flight or completed payment is returned when one exists.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-Correlation-Id | header | string | — | Optional client-supplied correlation id for end-to-end tracing.
Echoed back as correlation_id in the response envelope. If omitted,
the API generates one and still returns it. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
account | object | yes | — |
account.type | string | yes | Account identifier scheme (e.g. IBAN, PHONE).
Not the internal account classification (e.g. operational).Values: IBAN, PHONE |
account.value | string | yes | — |
account.currency | string | — | Optional account currency in response payloads. |
payment_id | string (uuid) | — | Internal payment UUID. |
public_id | string | — | Numeric public payment identifier. |
client_reference | string | — | Partner reference sent at payment creation. |
Request example
byPaymentId
{
"account": {
"type": "IBAN",
"value": "CR08036900101010933608"
},
"payment_id": "11111111-1111-1111-1111-111111111111"
}byPublicId
{
"account": {
"type": "IBAN",
"value": "CR08036900101010933608"
},
"public_id": "134729"
}byClientReference
{
"account": {
"type": "IBAN",
"value": "CR08036900101010933608"
},
"client_reference": "INV-01082"
}Response 200
The request was processed successfully.
response_code: OK
| Field | Type | Required | Description |
|---|---|---|---|
amount | object | yes | — |
amount.amount | string | yes | — |
amount.currency | string | yes | — |
client_reference | string | yes | — |
created_at | string | yes | — |
destination | object | yes | — |
destination.account | object | yes | — |
destination.account.currency | string | — | — |
destination.account.type | string | yes | — |
destination.account.value | string | yes | — |
destination.identification | object | yes | — |
destination.identification.number | string | yes | — |
destination.identification.type | string | yes | — |
destination.name | string | yes | — |
error | object | yes | — |
error.domain | string | yes | — |
error.platform | object | yes | — |
error.platform.code | string | yes | — |
error.platform.message | string | yes | — |
external_reference | string | yes | — |
has_reversal | boolean | yes | — |
payment_id | string | yes | — |
payment_method_code | string | yes | — |
provider | object | yes | — |
provider.correlation_id | string | yes | — |
provider.occurred_at | string | yes | — |
provider.provider_status_code | string | yes | — |
provider.provider_status_desc | string | yes | — |
provider.provider_status_semantic | string | yes | — |
public_id | string | yes | — |
result | string | yes | — |
reversed_at | string | yes | — |
schema_version | string | yes | — |
source | object | yes | — |
source.account | object | yes | — |
source.account.currency | string | — | — |
source.account.type | string | yes | — |
source.account.value | string | yes | — |
source.identification | object | yes | — |
source.identification.number | string | yes | — |
source.identification.type | string | yes | — |
source.name | string | yes | — |
status | string | yes | — |
status_detail | string | — | — |
succeeded_at | string | yes | — |
type | string | yes | — |
updated_at | string | yes | — |
Error responses
| HTTP | response_code | Description |
|---|---|---|
| 400 | INVALID_REQUEST | Invalid request. Check the required fields and try again. |
| 401 | UNAUTHORIZED | Unauthorized. Verify your session or credentials. |
| 403 | FORBIDDEN, ACCOUNT_ACCESS_DENIED | You do not have permission to perform this action. |
| 404 | PAYMENT_NOT_FOUND | Payment not found. |
| 429 | TOO_MANY_REQUESTS | Too many requests. Please retry after a short delay. |
| 500 | INTERNAL_ERROR | An unexpected error occurred. Please try again later. |
| 502 | PROVIDER_ERROR | Unable to complete the request with the payment provider. Please try again later. |
| 503 | SERVICE_UNAVAILABLE | A required service is temporarily unavailable. Please try again later. |
Get payment by id
GET /api/public/v1/transactions/payments/{payment_id}
Host: https://api-baas-sandbox.tilopay.com — requires Authorization: Bearer <access_token>.
Returns a single payment using the same public contract as the list endpoint, including consolidated result, succeeded_at, has_reversal, and error. error is null when there is no failure information; it is an object only when domain / platform is present (result is failed or reversed), same shape as webhook payment.failed payment.error. source / destination use null for unknown nested fields and never expose ledger UUIDs. identification.number on PIN payments created after public identification persistence is the partner-submitted public number (digits, no SINPE hyphens). Older payments may still return the hyphenated SINPE form from processing metadata. Use this as a webhook backup.
Looks up a payment by either identifier:
payment_id(internal UUID)public_id(numeric public identifier)
For client_reference, use POST /api/public/v1/transactions/payments/search.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-Correlation-Id | header | string | — | Optional client-supplied correlation id for end-to-end tracing.
Echoed back as correlation_id in the response envelope. If omitted,
the API generates one and still returns it. |
payment_id | path | string | yes | Internal payment UUID or numeric public_id. |
Response 200
The request was processed successfully.
response_code: OK
| Field | Type | Required | Description |
|---|---|---|---|
amount | object | yes | — |
amount.amount | string | yes | — |
amount.currency | string | yes | — |
client_reference | string | yes | — |
created_at | string | yes | — |
destination | object | yes | — |
destination.account | object | yes | — |
destination.account.currency | string | — | — |
destination.account.type | string | yes | — |
destination.account.value | string | yes | — |
destination.identification | object | yes | — |
destination.identification.number | string | yes | — |
destination.identification.type | string | yes | — |
destination.name | string | yes | — |
error | object | yes | — |
error.domain | string | yes | — |
error.platform | object | yes | — |
error.platform.code | string | yes | — |
error.platform.message | string | yes | — |
external_reference | string | yes | — |
has_reversal | boolean | yes | — |
payment_id | string | yes | — |
payment_method_code | string | yes | — |
provider | object | yes | — |
provider.correlation_id | string | yes | — |
provider.occurred_at | string | yes | — |
provider.provider_status_code | string | yes | — |
provider.provider_status_desc | string | yes | — |
provider.provider_status_semantic | string | yes | — |
public_id | string | yes | — |
result | string | yes | — |
reversed_at | string | yes | — |
schema_version | string | yes | — |
source | object | yes | — |
source.account | object | yes | — |
source.account.currency | string | — | — |
source.account.type | string | yes | — |
source.account.value | string | yes | — |
source.identification | object | yes | — |
source.identification.number | string | yes | — |
source.identification.type | string | yes | — |
source.name | string | yes | — |
status | string | yes | — |
status_detail | string | — | — |
succeeded_at | string | yes | — |
type | string | yes | — |
updated_at | string | yes | — |
Error responses
| HTTP | response_code | Description |
|---|---|---|
| 400 | INVALID_REQUEST | Invalid request. Check the required fields and try again. |
| 401 | UNAUTHORIZED | Unauthorized. Verify your session or credentials. |
| 403 | FORBIDDEN, ACCOUNT_ACCESS_DENIED | You do not have permission to perform this action. |
| 404 | PAYMENT_NOT_FOUND | Payment not found. |
| 429 | TOO_MANY_REQUESTS | Too many requests. Please retry after a short delay. |
| 500 | INTERNAL_ERROR | An unexpected error occurred. Please try again later. |
| 502 | PROVIDER_ERROR | Unable to complete the request with the payment provider. Please try again later. |
| 503 | SERVICE_UNAVAILABLE | A required service is temporarily unavailable. Please try again later. |
Validate external account for a payment method
POST /api/public/v1/accounts/validate
Host: https://api-baas-sandbox.tilopay.com — requires Authorization: Bearer <access_token>.
Validates a counterparty account (IBAN or phone) via the SINPE provider for the given payment method. Does not validate internal ledger accounts. When valid, data.holder.id_type uses the same identification catalog keys as identification.type in POST /payments (e.g. cedula, juridica, dimex).
SINPE_MOVIL field availability (expected, stable)
For payment_method_code = SINPE_MOVIL, the backing wallet operation (ObtenerInfoMonedero) does not return identification type or institution name. A successful validation may therefore return:
data.holder.id_type=unknowndata.financial_institution.entity_name=""(empty string)
This is expected, stable behavior, not a mapping bug or a transient provider error. PIN (ObtenerInformacionCuentaSinpe) does populate both fields.
Integrators must not report these values as defects, and must not assume that holder.id_type or financial_institution.entity_name are always populated when is_valid is true.
SINPE rejection codes (data.rejection)
When is_valid is false, data.rejection explains why (see the rejected example on the 200 response below). rejection.code is one of a fixed set of normalized semantics (see the WebhookRejection.code schema enum). Most rows in the table below do NOT get a distinct `code` — only a subset of reason_code values has a dedicated semantic; every other reason_code, even one listed below with a specific message, returns code = SINPE_REJECTED (e.g. reason_code = 21 "fondos insuficientes" still returns SINPE_REJECTED). This same object and catalog is also used by the payment.failed webhook's rejection field. A reason_code not listed here at all still produces a response — message falls back to a generic text and code falls back to SINPE_REJECTED.
Cuenta / perfil / límites
| Code | Message |
|---|---|
| 21 | Cuenta Cliente con fondos insuficientes |
| 22 | Cuenta Cliente no admite créditos |
| 23 | Cuenta Cliente cerrada |
| 24 | Cuenta Cliente inactiva |
| 25 | Cuenta Cliente no admite débitos |
| 26 | Cuenta Cliente no es de fondos |
| 27 | Moneda de la Cuenta Cliente no corresponde |
| 28 | Cuenta cliente no existe |
| 29 | Cuenta Cliente no registrada en el SINPE |
| 30 | Cuenta Cliente no habilitada para el servicio |
| 31 | Cuenta Cliente bloqueada |
| 32 | Id cliente destino no coincide con registrado en la entidad |
| 33 | Nombre del cliente destino no coincide con el registrado en la entidad |
| 34 | Cuenta Cliente en proceso de cierre |
| 35 | Cuenta Cliente embargada |
| 36 | Cuenta Cliente con retención judicial |
| 37 | Cuenta de expediente simplificado no permite el monto indicado |
| 38 | Límite transaccional de la Cuenta Cliente excedido |
| 39 | Cuenta Cliente incorrecta |
| 40 | IBAN de la cuenta destino inválido |
| 41 | IBAN de la cuenta origen inválido |
| 42 | Tipo de cuenta no permite la transacción |
| 43 | Cuenta Cliente no pertenece a la entidad indicada |
| 44 | Producto de la cuenta no admite el servicio |
| 45 | Cuenta Cliente en estado de cancelación |
| 46 | Cuenta Cliente restringida por política de la entidad |
| 47 | Cuenta Cliente no permite pagos inmediatos |
| 48 | Cuenta Cliente no permite SINPE Móvil |
| 49 | Titular de la cuenta destino fallecido |
| 50 | Cuenta Cliente consolidada o migrada |
| 51 | Identificación del cliente origen no coincide |
| 52 | Identificación del cliente destino inválida |
| 53 | Cliente destino no autorizado para recibir el pago |
| 54 | Cliente origen no autorizado para enviar el pago |
| 55 | Perfil del cliente origen no permite la transacción |
| 56 | Monto inferior al mínimo permitido |
| 57 | Monto superior al máximo permitido |
| 58 | Cantidad de transacciones diarias excedida |
| 59 | Cantidad de transacciones mensuales excedida |
| 60 | Límite acumulado diario excedido |
| 61 | Límite acumulado mensual excedido |
| 62 | Comisión no pudo ser aplicada |
| 63 | Tipo de cambio no disponible |
| 64 | Transacción rechazada por control de lavado de dinero |
| 65 | Transacción rechazada por listas de control |
| 66 | Transacción en revisión de cumplimiento |
| 67 | Documento de respaldo requerido no presente |
| 68 | Firma o autenticación inválida |
| 69 | Token o segundo factor inválido |
| 70 | Sesión de usuario expirada |
| 71 | Usuario no autorizado para el canal |
| 72 | Dispositivo no registrado |
| 73 | Geolocalización no permitida |
| 74 | Operación no soportada en la moneda indicada |
| 75 | Operación no soportada para el tipo de cliente |
| 76 | Problemas de comunicación |
| 77 | Tiempo de espera agotado en la entidad origen |
| 78 | Tiempo de espera agotado en el SINPE |
| 79 | Error interno de la entidad origen |
| 80 | Error interno de la entidad destino |
| 81 | Entidad origen no disponible |
| 82 | Entidad destino no encontrada |
| 83 | Problemas en la respuesta del destino |
| 84 | Respuesta de la entidad origen incorrecta |
| 85 | Mensaje con formato electrónico inválido |
| 86 | Versión del estándar electrónico no soportada |
| 87 | Campo obligatorio no informado |
| 88 | Campo con valor fuera de catálogo |
| 89 | Checksum o integridad del mensaje inválida |
| 90 | Referencia SINPE duplicada |
| 91 | Moneda no corresponde |
| 92 | Transacción no autorizada por entidad destino |
| 93 | Transacción no autorizada por cliente destino |
| 94 | Transacción no autorizada por entidad origen |
| 95 | Transacción no autorizada por cliente origen |
| 96 | Reverso no permitido para el estado de la transacción |
| 97 | Reverso ya aplicado |
| 98 | Confirmación no permitida para el estado de la transacción |
| 99 | Liquidación no permitida para el estado de la transacción |
| 100 | Entidad Destino no disponible para procesar en tiempo real |
| 101 | Entidad origen no disponible para procesar en tiempo real |
| 102 | Servicio PIN no habilitado para la entidad destino |
| 103 | Servicio PIN no habilitado para la entidad origen |
| 104 | Código de entidad destino inválido |
| 105 | Código de entidad origen inválido |
| 106 | Código de país de la entidad destino inválido |
| 107 | Código de país de la entidad origen inválido |
| 108 | Número de referencia interna inválido |
| 109 | Número de referencia SINPE inválido |
| 110 | Transacción no se encuentra en un estado que permita la consulta |
Compensación con entidad destino
| Code | Message |
|---|---|
| 201 | Tiempo respuesta excedido por la entidad destino |
| 202 | Respuesta de la entidad destino incorrecta según el estándar electrónico |
| 203 | Se recibió una excepción de la entidad destino |
| 204 | Error de comunicación con la entidad destino |
| 205 | Falló procesamiento en el SINPE |
| 206 | Transacción no autorizada por cliente destino |
| 207 | Perfil transaccional del cliente destino no permite recibir el pago |
| 208 | Falló la acreditación en la cuenta destino |
| 209 | Falló el débito en la cuenta origen |
| 210 | Conciliación de la transacción no fue posible |
Identificación
| Code | Message |
|---|---|
| 801 | Identificación inválida |
| 802 | Identificación del cliente origen no encontrada |
| 803 | Identificación del cliente destino no encontrada |
| 804 | Identificación no vigente |
| 805 | Identificación vencida |
| 806 | Identificación no corresponde al tipo indicado |
| 807 | Tipo de identificación inválido |
| 808 | País de la identificación no soportado |
| 809 | Identificación de menor de edad no permitida |
| 810 | Identificación de persona jurídica no permitida para el servicio |
Validación de formato / Core Bancario
| Code | Message |
|---|---|
| 1001 | Cuenta cliente activa |
| 1002 | El Id de cliente destino no cumple con el formato esperado por el SINPE |
| 1003 | El Id de cliente origen no fue informado |
| 1004 | El Id de cliente origen no cumple con el formato esperado por el SINPE |
| 1005 | Monto con formato inválido |
| 1006 | Moneda con formato inválido |
| 1007 | Problemas de comunicación con el Core Bancario |
| 1008 | Core Bancario no disponible |
| 1009 | El valor para el campo no puede ser nulo o infringir su longitud mínima o máxima |
| 1010 | El valor para el campo no corresponde al tipo de dato esperado |
| 1011 | El valor para el campo no corresponde al catálogo permitido |
| 1012 | Fecha con formato inválido |
| 1013 | Hora con formato inválido |
| 1014 | Número de referencia con formato inválido |
| 1015 | IBAN con formato inválido |
Canal / tipo de identificación
| Code | Message |
|---|---|
| 1040 | Canal no informado |
| 1041 | Canal inválido |
| 1042 | Canal no corresponde |
| 1043 | Canal no habilitado para la entidad |
| 1044 | Canal no habilitado para el servicio |
| 1045 | El formato de la identificación es inválido |
| 1046 | Tipo de identificación no informado |
| 1080 | Tipo de identificación no corresponde al cliente origen |
| 1081 | Tipo de identificación no corresponde al cliente destino |
| 1082 | Tipo de identificación no vigente |
| 1083 | Tipo de identificación no soportado por el servicio |
| 1084 | Tipo de identificación inválido |
| 1085 | Tipo de identificación no soportado por la entidad |
SINPE Móvil (monedero)
| Code | Message |
|---|---|
| 15300 | El número de teléfono origen indicado es inválido |
| 15301 | El número de teléfono origen no tiene activo el Servicio Monedero |
| 15302 | El número de teléfono destino indicado es inválido |
| 15303 | El número de teléfono destino no está registrado en el padrón móvil del BCCR |
| 15304 | No es posible inactivar el monedero indicado pues no existe |
| 15305 | El número de teléfono indicado ya se encuentra activo como monedero en el padrón local |
⚠️ This catalog is under review — some entries (notably 208 and 209) are known to be pending verification against the official SINPE source and may be corrected in a future revision without notice.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-Correlation-Id | header | string | — | Optional client-supplied correlation id for end-to-end tracing.
Echoed back as correlation_id in the response envelope. If omitted,
the API generates one and still returns it. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
payment_method_code | string | yes | Payment method used to route validation (PIN for external IBAN, SINPE_MOVIL for phone wallet).Values: PIN, SINPE_MOVIL |
account | object | yes | — |
account.type | string | yes | —Values: IBAN, PHONE |
account.value | string | yes | — |
Request example
pin
{
"payment_method_code": "PIN",
"account": {
"type": "IBAN",
"value": "CR16010400000000000031"
}
}sinpe_movil
{
"payment_method_code": "SINPE_MOVIL",
"account": {
"type": "PHONE",
"value": "88887777"
}
}Response 200
The request was processed successfully.
response_code: OK
| Field | Type | Required | Description |
|---|---|---|---|
account | object | yes | — |
account.currency | string | yes | — |
account.product_name | string | yes | — |
account.type | string | yes | — |
account.value | string | yes | — |
financial_institution | object | yes | — |
financial_institution.country_code | string | yes | — |
financial_institution.entity_code | string | yes | — |
financial_institution.entity_name | string | yes | — |
holder | object | yes | — |
holder.id_number | string | yes | — |
holder.id_type | string | yes | — |
holder.name | string | yes | — |
is_valid | boolean | yes | — |
provider | object | yes | — |
provider.correlation_id | string | — | — |
provider.occurred_at | string | — | — |
provider.operation | string | yes | — |
rejection | object | yes | — |
rejection.code | string | yes | — |
rejection.message | string | yes | — |
rejection.reason_code | string | yes | — |
Error responses
| HTTP | response_code | Description |
|---|---|---|
| 400 | INVALID_REQUEST, INVALID_ACCOUNT_TYPE, INVALID_ACCOUNT_FORMAT, INVALID_PAYMENT_METHOD | Invalid request. Check the required fields and try again. |
| 401 | UNAUTHORIZED | Unauthorized. Verify your session or credentials. |
| 403 | FORBIDDEN, ACCOUNT_ACCESS_DENIED | You do not have permission to perform this action. |
| 422 | UNPROCESSABLE_ENTITY | The request is well-formed but cannot be processed due to business rules. |
| 429 | TOO_MANY_REQUESTS | Too many requests. Please retry after a short delay. |
| 500 | INTERNAL_ERROR | An unexpected error occurred. Please try again later. |
| 502 | PROVIDER_ERROR | Unable to complete the request with the payment provider. Please try again later. |
Last verified: 2026-09-02 · Owner: equipo-integraciones