Volver a Documentacion

Errores

Cada respuesta de error M2M usa RFC 7807 problem+json. El campo error_code es el identificador estable legible por máquina — haga switch sobre él en su código, nunca sobre el detail legible por humanos.

Esta página lista cada código que los socios pueden recibir, agrupado por dominio.


Forma de la respuesta

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/problem+json

{
  "type": "about:blank",
  "title": "Unprocessable Entity",
  "status": 422,
  "error_code": "DB-FX-410",
  "detail": "FX quote invalid, expired, or not owned",
  "trace_id": "0HN5K8M3F2X4P:00000007",
  "instance": "/api/v1/fxorder/createOrder",
  "errors": {
    "parameters.quote_id": ["Quote expired at 2026-04-28T10:35:00.000Z"]
  }
}
Campo Requerido Significado
type URI que identifica la clase de error. Actualmente siempre about:blank. Versiones futuras pueden introducir URIs tipados.
title Frase de motivo HTTP (p. ej. Bad Request, Unprocessable Entity).
status Código de estado HTTP (entero).
error_code Código estable legible por máquina del catálogo abajo. Haga switch sobre este campo, no sobre detail.
detail Explicación legible específica de esta ocurrencia. Puede localizarse vía Accept-Language.
trace_id ID de correlación para búsqueda en bitácora. Inclúyalo en solicitudes de soporte.
instance A veces Ruta de la solicitud.
errors A veces Errores de validación a nivel de campo (objeto con clave por ruta de campo punteada). Presente en 400/422.

Convención de nombres de código

{NAMESPACE}-{DOMINIO}-{NÚMERO}. Tres namespaces:

Namespace Origen Ejemplos
DB-* Originado en los procedimientos almacenados de SQL Server + lógica de negocio DB-FX-410, DB-TRF-048
GW-* Originado en una pasarela / integración externa GW-STC-001 (pasarela stablecoin)
CLIENT-* Originado en la capa cliente / SDK / red CLIENT-NET-001

El segmento DOMINIO agrupa por área de negocio: FX, TRF (transferencias), WAL (billeteras), CUS (clientes), CMP (cumplimiento), TRD (trading), PAD (Padrón Electoral), MNX (Monex broker externo), AML (anti-lavado de dinero), BRG (pasarela fiat stablecoin), BRI (capa de pasarela stablecoin).

Los rangos de número dentro de un dominio siguen convenciones flexibles:

Rango Significado típico
0xx1xx Conflictos de persistencia / concurrencia
2xx3xx Búsqueda / no-encontrado / transición de estado
4xx Validación / campo-requerido / formato
5xx Configuración / setup
6xx9xx Reglas de negocio específicas del dominio

Guía de reintentos

Bandera retryable Comportamiento del cliente
(sí) Seguro reintentar con la misma Idempotency-Key. Use backoff exponencial (1s → 2s → 4s → 8s, tope 30s) + jitter. Limite reintentos a 5 intentos.
(no) No reintente — la misma llamada producirá el mismo error. Resuelva la causa raíz (corrija la solicitud, contacte soporte, etc.) antes de cualquier nuevo intento.

La bandera retryable abajo refleja la categoría del error mismo. Los problemas de capa de red (5xx, 429) son siempre reintentables sin importar el error_code subyacente. Vea Idempotencia para la matriz completa de decisión de reintentos.


Catálogo por dominio

El catálogo abajo se genera desde <azure-iac>/registry/errors/namespaces/*.yaml y se mantiene en sincronía vía la pipeline de codegen del registro. Si encuentra un código en producción que falta aquí, abra un ticket de soporte — códigos no documentados son un bug de deriva de documentación.

CLIENT-NET — Cliente / red

Código HTTP Categoría Reintentable Título
CLIENT-NET-001 503 infra Network unavailable

DB-AML — AML / cumplimiento

Código HTTP Categoría Reintentable Título
DB-AML-701 422 business Falla en verificación AML (paso directo de error crudo de SQL Server; detail lleva los detalles)

DB-STC — stablecoin / pasarela fiat

Código HTTP Categoría Reintentable Título
DB-STC-310 422 business stablecoin webhook replay detected
DB-STC-320 422 business Idempotency conflict: payload hash differs for same idempotency_key
DB-STC-601 404 business BridgeTransaction not found

DB-CMP — Cumplimiento / KYC

Código HTTP Categoría Reintentable Título
DB-CMP-331 404 business Movement instruction not found
DB-CMP-332 409 conflict Movement instruction was modified by another operator (concurrency conflict)
DB-CMP-333 422 business Movement instruction is not in an approvable state
DB-CMP-334 409 conflict Compliance approval already granted
DB-CMP-335 409 conflict Operations approval already granted
DB-CMP-341 404 business Movement instruction not found
DB-CMP-342 422 business Movement instruction must be in approved status to execute
DB-CMP-351 422 business Period end must be after period start
DB-CMP-501 422 business Security can only be edited in draft or active status
DB-CMP-502 403 business Separation of duties violation — approver cannot be the creator
DB-CMP-503 404 business Security not found
DB-CMP-504 409 conflict Optimistic concurrency conflict — record was modified by another user
DB-CMP-505 409 conflict ISIN already exists in the catalog

DB-CUS — Clientes

Código HTTP Categoría Reintentable Título
DB-CUS-001 404 business Customer not found
DB-CUS-003 409 conflict Concurrency conflict: registration was modified
DB-CUS-004 403 business Separation of duties violation: reviewer cannot be the creator
DB-CUS-005 404 business Registration not found

DB-FX — Órdenes FX + cotizaciones

Código HTTP Categoría Reintentable Título
DB-FX-111 409 conflict UPDATE affected 0 rows — order_id mismatch or concurrent delete
DB-FX-410 422 validation FX quote invalid, expired, or not owned
DB-FX-411 400 validation FX quote required
DB-FX-412 422 validation FX quote currencies do not match order
DB-FX-413 422 business FX quote creation failed
DB-FX-414 422 business FX quote consume failed
DB-FX-415 422 business FX quote release failed
DB-FX-416 422 validation FX quote incomplete for sinpe rail
DB-FX-417 400 validation FX order missing required fields
DB-FX-420 422 validation Invalid origin wallet ownership — wallet does not belong to the order customer

DB-MNX — Monex / broker externo

Código HTTP Categoría Reintentable Título
DB-MNX-201 404 business Operation not found
DB-MNX-202 422 business Operation not pending reversal

DB-PAD — Padrón Electoral

Código HTTP Categoría Reintentable Título
DB-PAD-000 409 conflict Duplicate national ID
DB-PAD-001 422 business Invalid district code combination

DB-TRD — Trading / valores

Código HTTP Categoría Reintentable Título
DB-TRD-101 404 business Account not found, trading disabled, or missing broker account
DB-TRD-102 404 business Order not found
DB-TRD-104 422 business Cannot cancel order pending submission to broker
DB-TRD-105 404 business Order not found
DB-TRD-107 422 business Cannot replace order pending submission to broker
DB-TRD-108 422 business Cannot specify both qty and notional — choose one
DB-TRD-109 409 conflict Idempotency-Key already used with different request payload
DB-TRD-110 409 conflict UPDATE affected 0 rows — order_id mismatch or concurrent delete

DB-TRF — Transferencias

Código HTTP Categoría Reintentable Título
DB-TRF-021 404 business Transfer not found
DB-TRF-022 422 business Invalid status transition
DB-TRF-040 422 validation Invalid amount
DB-TRF-041 422 validation Invalid source currency
DB-TRF-042 422 validation Invalid destination currency
DB-TRF-043 422 business Source and destination currencies must be different
DB-TRF-044 422 validation Invalid user identifier
DB-TRF-045 404 business Customer not found or inactive
DB-TRF-046 404 business Exchange rate not found
DB-TRF-047 404 business User source wallet not found
DB-TRF-048 422 business Insufficient balance
DB-TRF-049 404 business User destination wallet not found
DB-TRF-050 409 conflict User debit failed — concurrent modification or wallet not active
DB-TRF-051 409 conflict User credit failed
DB-TRF-060 404 business Treasury customer not found or inactive
DB-TRF-061 422 business Treasury insufficient liquidity
DB-TRF-062 404 business Treasury source currency wallet not found
DB-TRF-063 404 business Treasury destination currency wallet not found
DB-TRF-064 409 conflict Treasury source credit failed
DB-TRF-065 409 conflict Treasury destination debit failed — concurrent modification
DB-TRF-066 422 validation Amount too small for conversion
DB-TRF-070 422 validation Locked rate parameters are required
DB-TRF-071 409 business Transfer incomplete — prior attempt partially failed
DB-TRF-072 422 validation Idempotency key is required
DB-TRF-080 422 validation Partial CompletionOutbox params — all four @outbox_* fields required together or all NULL

DB-WAL — Billeteras + saldos

Código HTTP Categoría Reintentable Título
DB-WAL-301 404 business Wallet not found
DB-WAL-302 409 conflict Wallet is already a custody account
DB-WAL-303 422 business Wallet must be active or pending_activation to open custody
DB-WAL-311 404 business Wallet not found
DB-WAL-312 422 business Wallet is not a custody account
DB-WAL-313 409 conflict Custody account is already closed
DB-WAL-314 422 business Cannot close custody account with non-zero balance — transfer all funds first
DB-WAL-315 422 business Cannot close custody account with active securities positions — transfer all positions first
DB-WAL-316 422 business Cannot close custody account with pending movement instructions
DB-WAL-317 422 business Custody wallet is not in active status
DB-WAL-318 404 business Custody wallet not found
DB-WAL-321 422 business Wallet is not a custody account or does not belong to customer
DB-WAL-322 422 business Custody account is not active

GW-STC — Pasarela stablecoin

Código HTTP Categoría Reintentable Título
GW-STC-001 401 auth stablecoin authentication failed
GW-STC-002 429 upstream stablecoin rate limit exceeded
GW-STC-003 403 business stablecoin KYC required
GW-STC-004 422 business stablecoin KYC rejected
GW-STC-005 428 business stablecoin KYC pending documents
GW-STC-006 502 upstream stablecoin wallet creation failed
GW-STC-007 422 validation stablecoin virtual account currency unsupported
GW-STC-008 422 business stablecoin transfer rejected by compliance
GW-STC-009 401 auth stablecoin webhook signature invalid
GW-STC-010 409 conflict stablecoin webhook replay detected

Nota sobre títulos en inglés. Los títulos arriba se mantienen en inglés porque el detail y title retornados en el response también están en inglés actualmente; localizar este catálogo por separado introduciría deriva. Cuando ARi habilite localización del response vía Accept-Language, este catálogo se traducirá automáticamente.


Resumen de códigos de estado HTTP

Estado Significado Ejemplos de códigos
400 Falla a nivel de esquema (la solicitud está mal formada) DB-FX-411, DB-FX-417
401 Autenticación falló (clave de suscripción inválida o auth upstream rechazada) GW-STC-001, GW-STC-009
403 Prohibido (alcance ausente, violación de separación de funciones) DB-CMP-502, DB-CUS-004, GW-STC-003
404 Recurso no encontrado DB-CUS-001, DB-TRD-102, DB-TRF-021
409 Conflicto de concurrencia O Idempotency-Key reutilizada con cuerpo distinto DB-TRD-109, DB-TRF-050, DB-FX-111
422 Bien formado pero semánticamente inválido (la mayoría de errores de dominio) DB-FX-410, DB-TRF-048, GW-STC-004
428 Precondición requerida (KYC con documentos pendientes) GW-STC-005
429 Limitado por tasa GW-STC-002 (upstream); límites de nivel APIM en el borde
502 Falla de pasarela upstream GW-STC-006
503 Servicio / red no disponible CLIENT-NET-001

La distinción 400 vs 422 importa para codegen de SDK de socio: violaciones de esquema oneOf son 400 (el cuerpo de la solicitud no encaja con el contrato); violaciones de regla de negocio en una solicitud bien formada son 422 (el cuerpo es válido pero la operación no puede proceder).


Errores a nivel de campo

Cuando un 400 o 422 incluye fallas de validación por campo, aparecen en el objeto errors con clave por ruta de campo punteada:

{
  "status": 400,
  "error_code": "DB-FX-417",
  "detail": "FX order missing required fields",
  "errors": {
    "parameters.origin_currency": ["origin_currency is required"],
    "parameters.destination_currency": ["destination_currency must be 3 characters"]
  }
}

Itere Object.keys(response.errors) para obtener una lista plana de nombres de campo; cada valor es un arreglo de strings con mensajes de validación para ese campo.


Qué registrar en errores

Cada respuesta de error incluye trace_id. Siempre regístrelo del lado cliente. Cuando contacte soporte, incluya el trace_id en su mensaje — es la ruta más rápida a una resolución porque ARi puede consultar inmediatamente las trazas distribuidas desde ese ID.

Forma de línea de log recomendada:

[ERROR] api={endpoint} status={status} error_code={error_code} trace_id={trace_id} attempt={n}/{max}

Vea también