Ir al contenido
SimploSimplo Docs

Emitir DTE

POST
/api/v1/billing/dte
curl -X POST "https://api.simplo.cl/api/v1/billing/dte" \
-H "X-Api-Key: $SIMPLO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"tipo_dte": 33,
"fecha_emision": "2026-08-01",
"receptor": {
"rut": "76543210-3",
"razon_social": "Empresa Ejemplo SpA",
"giro": "Desarrollo de software",
"direccion": "Av. Providencia 1234",
"comuna": "Providencia",
"ciudad": "Santiago"
},
"detalle": [
{
"nombre": "Servicio de consultoria TI",
"cantidad": 10,
"unidad": "UN",
"precio": 50000
}
]
}'

Emite un Documento Tributario Electrónico. Soporta los 12 tipos SII: facturas (33, 34), boletas (39, 41), liquidación factura (43), factura de compra (46), guía de despacho (52), notas de débito/crédito (56, 61) y documentos de exportación (110, 111, 112).

El request body es una unión discriminada por tipo_dte (12 variantes, ver EmitirDTERequestPorTipo): cada variante declara los campos condicionales obligatorios de su tipo (ind_servicio en boletas, tipo_doc_liq por línea en 43, ind_traslado en 52, referencias en 56/61/111/112, export_data en 110-112) y la semántica de precios medida (x-simplo-price-semantics: gross = IVA incluido en boletas 39/41; net en el resto). Payload máximo: 2 MiB — sobre eso la API responde 413 PAYLOAD_TOO_LARGE.

Flujo: validación, asignación de folio desde el CAF activo, generación del XML, timbre electrónico (TED), firma digital y persistencia. La respuesta 201 retorna inmediatamente con estado firmado; el envío al SII ocurre de forma asíncrona. Siga el estado con polling en GET /api/v1/billing/dte/{id} (la entrega de webhooks aún no está activa).

Requiere el header Idempotency-Key (UUID). Un reintento con la misma key retorna la respuesta original con X-Idempotency-Replay: true.

Las boletas (tipo 39 y 41) requieren además el campo ind_servicio (use 3); omitirlo responde 400.

Con una API key sandbox (sk_simplo_sandbox_...) el documento se emite contra el sandbox de la empresa — sin validez tributaria; con una key live, contra el SII real.

Idempotency-Key
requerido
string format: uuid
Example
550e8400-e29b-41d4-a716-446655440000

UUID único para garantizar idempotencia. Obligatorio. Reintentar con la misma key retorna la respuesta original con el header X-Idempotency-Replay: true. Las keys completadas se retienen 24 horas.

Media typeapplication/json
One of: discriminator: tipo_dte

Cuerpo de emisión como unión discriminada por tipo_dte: elige la variante de tu tipo de documento — cada una declara los campos condicionales OBLIGATORIOS y la semántica de precios medida (bruto en boletas, neto en el resto). EmitirDTERequest documenta el universo completo de campos.

object
tipo_dte
requerido

Código SII del tipo de Documento Tributario Electrónico (33 factura, 39 boleta, 52 guía de despacho, 56/61 notas, 110-112 exportación). Detalle de cada tipo en la guía Tipos de DTE.

integer
Valores permitidos: 33 34 39 41 43 46 52 56 61 110 111 112
fecha_emision

Fecha de emisión tributaria del DTE en formato YYYY-MM-DD. Si se omite, se usa la fecha de negocio en Chile. Para exportación con moneda extranjera, debe coincidir con una fecha que tenga tipo de cambio oficial publicado cuando se informa export_data.tpo_cambio.

string format: date
receptor
requerido
object
rut
requerido

RUT del receptor con dígito verificador

string
razon_social
requerido

Máximo 100 caracteres (RznSocRecep del schema SII). Superarlo responde 400 RAZON_SOCIAL_INVALIDA. Medido 2026-09-04.

string
<= 100 characters
giro

Máximo 40 caracteres (GiroRecep del schema SII). Superarlo responde 400 GIRO_INVALIDO; el SII real rechaza el documento con STATUS=7 «Esquema inválido». Medido 2026-09-04.

string
<= 40 characters
direccion

Máximo 70 caracteres (DirRecep del schema SII). Superarlo responde 400 DIRECCION_INVALIDA. Medido 2026-09-04.

string
<= 70 characters
comuna

Máximo 20 caracteres (CmnaRecep del schema SII). Superarlo responde 400 COMUNA_INVALIDA. Medido 2026-09-04.

string
<= 20 characters
ciudad

CiudadRecep del schema SII declara 20. Medido 2026-09-04: la API acepta por encima de eso y corta más arriba, pero mantente en 20 — maullín devolvió STATUS=7 con 73 caracteres.

string
<= 20 characters
detalle
requerido

Recomendado <= 60 items (formato SII). La API hoy NO rechaza mas items (verificado: 200 items -> 201); el limite efectivo es el payload de 1 MiB, y el SII real puede rechazar documentos fuera de formato. Mantente dentro de la recomendacion.

Array<object>
>= 1 items
object
tipo_doc_liq

Tipo de documento liquidado. Requerido en Liquidación Factura (tipo 43).

string
<= 3 characters
ind_exe

Marca una línea como exenta cuando el tipo de DTE lo requiere.

integer
Valores permitidos: 1
cod_imp_adic

Código de impuesto adicional por línea. Para factura de compra con retención total de IVA se usa 15.

integer
nombre
requerido

Nombre del item o servicio. Máximo 80 caracteres (NmbItem del schema SII). Superarlo responde 400 DETALLE_INVALIDO nombrando el índice de la línea; el SII real rechaza el documento con STATUS=7 «Esquema inválido». Un nombre de catálogo largo NO cabe: usa dsc_item para el detalle extenso. Medido 2026-09-04.

string
<= 80 characters
dsc_item

Descripción adicional de la línea. En notas con codigo_ref=2 y monto cero se serializa como DscItem y se omiten QtyItem/PrcItem.

string
<= 1000 characters
cantidad

Cantidad (soporta decimales para unidades fraccionarias). Puede omitirse solo en correcciones de texto codigo_ref=2 sin monto. cantidad: 0 en una línea con precio responde 400 MONTO_INVALIDO con context.field = detalle[N].cantidad; no se emite nada y no se quema folio (medido 2026-09-04).

number
unidad

Unidad de medida opcional del item, por ejemplo UN, Kg o Lt

string
<= 4 characters
precio

Precio unitario en pesos chilenos (en boletas 39/41 es bruto, IVA incluido; en facturas es neto). Puede omitirse solo en correcciones de texto codigo_ref=2 sin monto. Un precio negativo o un total <= 0 responden 400 MONTO_INVALIDO con context.field y received_value; no se emite nada y no se quema folio (medido 2026-09-04).

integer
monto_item

Monto total de la línea. Uso acotado (por ejemplo liquidaciones) cuando el valor de línea no debe recalcularse como cantidad por precio.

integer
descuento_pct

Descuento porcentual sobre la línea (0-100)

number
<= 100
recargo_pct

Recargo porcentual sobre la línea (0-100)

number
<= 100
comisiones

Comisiones de Liquidación Factura (tipo 43)

Array<object>
object
tipo_movim
requerido

C para cobro/comisión positiva, O para otros movimientos o rebajas.

string
Valores permitidos: C O
glosa
requerido
string
tasa_comision
number
val_com_neto
requerido
integer
val_com_exe
requerido
integer
val_com_iva
integer
impuestos_retenciones

Impuestos retenidos en Totales/ImptoReten. Usado por factura de compra (tipo 46) y sus notas.

Array<object>
object
tipo_imp
requerido

Código SII del impuesto retenido. Para IVA retenido total en factura de compra se usa 15.

integer
tasa_imp

Tasa usada para calcular el monto retenido cuando monto_imp no viene informado.

number
monto_imp

Monto retenido explícito. Si se omite y hay tasa_imp, se calcula sobre el neto.

integer
referencias

Requerido para notas de crédito (61), notas de débito (56), y exportación (111, 112). Recomendado <= 40 referencias (formato SII); la API hoy no aplica ese tope.

Array<object>
object
tipo_doc_ref
requerido
One of:

Código SII del tipo de Documento Tributario Electrónico (33 factura, 39 boleta, 52 guía de despacho, 56/61 notas, 110-112 exportación). Detalle de cada tipo en la guía Tipos de DTE.

integer
Valores permitidos: 33 34 39 41 43 46 52 56 61 110 111 112
folio_ref
requerido

Folio del documento referenciado

integer
fecha_ref
requerido

Fecha del documento referenciado

string format: date
codigo_ref

Código de referencia SII:

  • 1: Anula documento referenciado
  • 2: Corrige texto del documento referenciado
  • 3: Corrige montos del documento referenciado

Nota de comportamiento real: la API también acepta el valor como string numérico (“1”) y no rechaza enteros fuera de 1-3 — usa solo 1|2|3, que es lo que el SII entiende. En las respuestas de detalle, referencias[] NO incluye codigo_ref y la fecha vuelve como fch_ref (ver ReferenciaOut).

integer
razon_ref
requerido

Razón de la referencia

string
<= 200 characters
ind_traslado

Tipo de traslado para Guía de Despacho (tipo 52):

  • 1: Operación constituye venta
  • 2: Venta por efectuar
  • 3: Consignación
  • 4: Entrega gratuita
  • 5: Traslado interno
  • 6: Otros traslados no venta
  • 7: Guía de devolución
  • 8: Traslado para exportación (no venta)
  • 9: Venta para exportación
integer
Valores permitidos: 1 2 3 4 5 6 7 8 9
tipo_despacho

Modo de despacho para Guía de Despacho (tipo 52):

  • 1: Despacho por cuenta del comprador
  • 2: Despacho por cuenta del emisor a instalaciones del comprador
  • 3: Despacho por cuenta del emisor a otras instalaciones
integer
Valores permitidos: 1 2 3
ind_servicio

Indicador de servicio. Obligatorio para boletas (tipo 39 y 41) — para una boleta estándar use 3 (boleta de venta y servicios); omitirlo en una boleta responde 400.

  • 1: Facturación de servicios periódicos domiciliarios
  • 2: Facturación de otros servicios periódicos
  • 3: Factura de servicio; en exportación, servicio calificado por Aduana
  • 4: Factura de exportación por servicios de hotelería
  • 5: Factura de exportación por transporte terrestre internacional
  • 6: Factura de exportación por servicios prestados y utilizados totalmente en el extranjero
integer
Valores permitidos: 1 2 3 4 5 6
descuentos_globales

Descuentos y recargos globales aplicados sobre el neto. Recomendado <= 20 (formato SII); la API hoy no aplica ese tope.

Array<object>
object
nro_lin_dr

Número de línea del descuento/recargo

integer
tpo_mov
requerido

D = descuento, R = recargo

string
Valores permitidos: D R
tpo_valor
requerido

% = porcentaje, $ = monto fijo

string
Valores permitidos: % $
valor_dr
requerido

Valor del descuento/recargo. En exportación puede incluir decimales.

number
glosa_dr

Glosa descriptiva

string
<= 45 characters
ind_exe_dr

1 = descuento/recargo global no afecto; 2 = no facturable. Para DTE exentos/exportación se infiere 1 si se omite.

integer
Valores permitidos: 1 2
auto_send

Cuando es true (default), el DTE se encola para envío individual al SII inmediatamente después de emitirse. Cuando es false, el DTE queda en estado firmado para un envío posterior.

boolean
default: true
export_data

Datos de exportación para tipos 110, 111, 112

object
tpo_moneda
requerido

Código de moneda según tabla Aduanas (e.g., “DOLAR USA”, “EURO”)

string
tpo_cambio

Tipo de cambio fijado por el Banco Central para OtraMoneda cuando se informa

number
mnt_export

Monto auxiliar de compatibilidad para OtraMoneda

number
nacionalidad

Código o nombre de país para Receptor/Extranjero/Nacionalidad

string
num_id

Número de identificación del receptor extranjero/turista para Exportaciones/Extranjero/NumId

string
tipo_doc_id

No usar en tipos 110, 111, 112; el XSD de Exportaciones no permite TipoDocID dentro de Receptor/Extranjero

integer
forma_pago_exp

Código Aduana de forma de pago de exportación

integer
modalidad_venta

Código Aduana de modalidad de venta

integer
clausula_venta

Cláusula Aduana, acepta código numérico o etiqueta conocida como CIF, CFR, FOB

string
total_clausula

Total de la cláusula de venta

number
via_transporte

Código Aduana de vía de transporte

integer
puerto_embarque

Código o nombre de puerto de embarque

string
puerto_desembarque

Código o nombre de puerto de desembarque

string
tara

Tara

integer
unidad_tara

Código Aduana de unidad de medida de tara

integer
peso_bruto

Peso bruto

number
unidad_peso_bruto

Código Aduana de unidad de peso bruto

integer
peso_neto

Peso neto

number
unidad_peso_neto

Código Aduana de unidad de peso neto

integer
tipo_bulto

Tipo de bulto, acepta código numérico o etiqueta conocida

string
total_bultos

Total de bultos

integer
marcas

Marcas informadas dentro de TipoBultos cuando la operación lo exige

string
mnt_flete

Monto de flete en moneda de venta

number
mnt_seguro

Monto de seguro en moneda de venta

number
pais_recep

Código o nombre de país receptor según tabla Aduanas

string
pais_dest

Código o nombre de país destino según tabla Aduanas

string
metadata

ADVERTENCIA: este campo se acepta pero HOY NO SE PERSISTE — la API lo descarta en silencio (defecto conocido). No lo uses para correlación: guarda id y folio de la respuesta contra tu orden en tu propio sistema. El metadata de las respuestas de detalle es generado por el servidor (tracking SII), no el tuyo.

object
key
additional properties
any
tipo_dte
requerido
integer
Valores permitidos: 33
receptor
requerido
object
rut
requerido

RUT del receptor con dígito verificador

string
razon_social
requerido

Máximo 100 caracteres (RznSocRecep del schema SII). Superarlo responde 400 RAZON_SOCIAL_INVALIDA. Medido 2026-09-04.

string
<= 100 characters
giro

Máximo 40 caracteres (GiroRecep del schema SII). Superarlo responde 400 GIRO_INVALIDO; el SII real rechaza el documento con STATUS=7 «Esquema inválido». Medido 2026-09-04.

string
<= 40 characters
direccion
requerido

Máximo 70 caracteres (DirRecep del schema SII). Superarlo responde 400 DIRECCION_INVALIDA. Medido 2026-09-04.

string
<= 70 characters
comuna
requerido

Máximo 20 caracteres (CmnaRecep del schema SII). Superarlo responde 400 COMUNA_INVALIDA. Medido 2026-09-04.

string
<= 20 characters
ciudad

CiudadRecep del schema SII declara 20. Medido 2026-09-04: la API acepta por encima de eso y corta más arriba, pero mantente en 20 — maullín devolvió STATUS=7 con 73 caracteres.

string
<= 20 characters
Examples

Factura electrónica (tipo 33)

{
"tipo_dte": 33,
"fecha_emision": "2026-08-01",
"receptor": {
"rut": "76543210-3",
"razon_social": "Empresa Ejemplo SpA",
"giro": "Desarrollo de software",
"direccion": "Av. Providencia 1234",
"comuna": "Providencia",
"ciudad": "Santiago"
},
"detalle": [
{
"nombre": "Servicio de consultoria TI",
"cantidad": 10,
"unidad": "UN",
"precio": 50000
}
]
}

DTE emitido exitosamente

Media typeapplication/json
object
id
requerido
string format: uuid
folio
requerido
integer
tipo_dte
requerido

Código SII del tipo de Documento Tributario Electrónico (33 factura, 39 boleta, 52 guía de despacho, 56/61 notas, 110-112 exportación). Detalle de cada tipo en la guía Tipos de DTE.

integer
Valores permitidos: 33 34 39 41 43 46 52 56 61 110 111 112
estado
requerido

Estado del DTE en su ciclo de vida.

Importante:

  • la API serializa estos valores exactamente como aparecen aquí
  • use estos mismos literales para renderizar UI, hacer exhaustiveness checks y filtrar por estado en GET /api/v1/billing/dte

Valores:

  • borrador: Creado pero aún no firmado
  • generado: Documento construido, previo a firma
  • firmado: Firmado digitalmente, pendiente de envío
  • enviando: Sobre aceptado por la plataforma, esperando procesamiento SII
  • procesando: SII recibió el envío y se está consultando estado final del DTE
  • aceptado: Aceptado por el SII
  • rechazado: Rechazado por el SII
  • con_reparos: Aceptado por el SII con observaciones
  • error_envio: El envío al SII falló de forma DEFINITIVA (no es un reintento pendiente). NO es un veredicto del SII: el documento nunca llegó a evaluarse. Causa típica: folios agotados (CAF) al momento de enviar. El motivo llega en sii_status.glosa como texto libre, sin code estructurado, y tracking queda en null.

Estados TERMINALES: aceptado, rechazado, con_reparos, error_envio. Un bucle de polling que sólo espere los tres primeros NO TERMINA NUNCA.

string
Valores permitidos: borrador generado firmado enviando procesando aceptado rechazado con_reparos error_envio
monto_total
requerido

Monto total en pesos chilenos

integer
created_at
requerido
string format: date-time
Example
{
"id": "4f9c9c2e-8a49-4f2e-9d5f-0d8f3a1b2c3d",
"folio": 1042,
"tipo_dte": 33,
"estado": "firmado",
"monto_total": 595000,
"created_at": "2026-08-01T14:30:00Z"
}
X-Idempotency-Replay
string
Valores permitidos: true

Presente con valor true cuando la respuesta es un replay de una ejecución anterior (misma Idempotency-Key).

Error de validación

Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
]
}

Token o API key inválido o ausente

Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
],
"severity": "critical"
}

La key es válida pero la operación no está permitida. Códigos:

  • BILLING_API_KEY_NOT_ENABLED — la empresa no tiene habilitada la emisión live por API key
  • BILLING_SANDBOX_API_KEY_NOT_ENABLED — falta o fue revocado el entitlement de sandbox
  • BILLING_API_KEY_ROUTE_NOT_ALLOWED — la ruta es solo-sesión
Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
],
"severity": "critical"
}

Conflicto. Posibles causas:

  • Folio duplicado
  • Idempotency-Key ya está siendo procesada (código IDEMPOTENCY_IN_PROGRESS)
Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
],
"severity": "critical"
}

El body supera el límite de 2 MiB de esta ruta (código PAYLOAD_TOO_LARGE). Envía menos líneas de detalle o glosas más cortas. Verificado 2026-09-04: 2,3 MB → 413 con el sobre JSON estándar (antes era un 502 HTML del CDN).

Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
],
"severity": "critical"
}

Idempotency-Key reutilizada con un body de request diferente al original (código IDEMPOTENCY_BODY_MISMATCH)

Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
],
"severity": "critical"
}

Rate limit excedido

Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
],
"severity": "critical"
}
Retry-After
integer

Segundos hasta poder reintentar

Servicio de idempotencia temporalmente no disponible. Reintentar.

Media typeapplication/json
object
code
requerido

Código de error máquina-legible

string
message
requerido

Mensaje descriptivo del error. Este es el campo canónico para clientes nuevos.

string
error

Alias de compatibilidad de message mantenido hacia atrás.

string
details
Array<object>
object
field
requerido

Campo con error (dot notation para nested)

string
code
requerido

Código de validación

string
message
requerido

Mensaje descriptivo

string
action

Acción recomendada para el cliente

string
severity

Severidad opcional del error

string
Valores permitidos: critical error warning info
context

Contexto estructurado opcional para debugging

object
key
additional properties
any
Example
{
"code": "VALIDATION_ERROR",
"message": "Error de validacion en los campos enviados",
"details": [
{
"field": "receptor.rut",
"code": "INVALID_RUT",
"message": "RUT invalido: digito verificador no coincide"
}
],
"severity": "critical"
}