Facturiadocs
Errores

Códigos

Los códigos de error que devuelve la API y los códigos de rechazo del SII, con su causa y si conviene reintentar.

Códigos de la API

Agrupados por dónde te los vas a encontrar.

Autenticación y permisos

CódigoHTTPCausa
insufficient_scope403A la llave le falta un scope; error.message nombra cuál
empresa_required400Falta el header Facturia-Empresa en una llamada con alcance de empresa
empresa_not_allowed403La empresa está fuera de la lista blanca de la llave
empresa_mismatch400Mandaste Facturia-Empresa con un token de empresa y no coincide
privilege_escalation403Una llave minteada pedía más scopes o empresas que su minteadora
api_key_roll_conflict409Dos rotaciones simultáneas de la misma llave; ganó la otra y su secreto es el vivo
email_verification_required403Minteo de una llave sk_live_ desde una cuenta sin verificar
test_mode_only403Un endpoint de /v1/test_helpers llamado con una llave live

Emisión

CódigoHTTPCausa
receptor_incomplete400Al receptor le faltan giro/address y ningún documento anterior de esta empresa al mismo RUT los tiene. param nombra el campo
totals_mismatch422Los totals que enviaste como aserción no coinciden con nuestro cálculo. No se emitió nada
test_field_in_live_mode400El objeto test viajó con una llave live
external_id_exists409Ya existe un documento con ese external_id en esta empresa; error.existing_id lo nombra
idempotency_key_reused409Misma Idempotency-Key, cuerpo distinto
idempotency_in_progress409Un request con esa llave sigue en vuelo; reintenta en un momento
artifact_not_ready409Pediste el XML de un documento que sigue en queued
artifact_not_available409El documento se emitió directo en el portal del SII (SFG); su XML nunca estuvo bajo custodia de Facturia y solo se recupera con la descarga manual «Respaldo de DTE y/o IECV» del portal
cedible_not_available422copy=cedible en un tipo que no es factura (solo 33 y 34)
cedible_not_available_for_channel422copy=cedible en un documento emission_channel=sfg; el SII firma y timbra su propio PDF, sin variante cedible
cesion_not_applicable422Pediste la cesibilidad de un tipo que no la tiene: el registro del SII responde solo por 33, 34 y 43
cesion_status_not_available409Pediste la cesibilidad de un documento que el SII todavía no tiene registrado (queued, sent) o que nunca va a tener (failed, rejected)
certificate_expired422El certificado de la empresa venció; la empresa está suspended
caf_belongs_to_another_empresa422El <RE> del CAF que subiste a POST /cafs nombra otro RUT. El SII emite un CAF a un solo emisor: todo documento sacado del rango de otra empresa se rechaza, y para entonces el folio ya se gastó
caf_expired422El rango de folios se pasó de vigencia: un CAF vale seis meses corridos desde su <FA> (Res. Ex. SII N° 58 de 2017) y el SII rechaza al recibir cualquier documento sacado de uno vencido. La emisión se rechaza antes de gastar el folio. Pide folios nuevos y anula los sin usar del rango vencido
tipo_not_available_for_channel422El canal de la empresa no emite ese tipo: sfg emite 33/34/52/56/61 y sólo rechaza la 46 (el propio portal del SII no abre el formulario sin autorización de agente retenedor); mercado emite todos los tipos publicados. Las boletas 39/41 no llegan acá: salen por el motor propio de Facturia diga lo que diga el canal, y lo que las condiciona es la habilitación de boletas del SII — una empresa sin ella recibe empresa_not_emitting nombrando el paso habilitacion
dispatch_required400Guía de despacho (52) sin bloque dispatch
dispatch_incomplete422El dispatch no trae transfer_type (el IndTraslado), que define si la guía constituye venta
dispatch_not_applicable422Mandaste dispatch.transfer_type (IndTraslado) o dispatch.dispatch_type (TipoDespacho) en un tipo que no es guía
dispatch_not_available_for_channel422dispatch.destination o dispatch.dispatch_type en una empresa sfg: el formulario del portal lleva una sola dirección — la del receptor — y no tiene campo de TipoDespacho. En mercado los dos se aceptan
sfg_guia_zero_amount422Una guía (52) con una línea en unit_price 0 o total 0 en una empresa sfg: el portal valida la guía con las validaciones de la factura y exige precio mayor que 0 en toda clase de traslado. En mercado el monto cero se acepta
line_discount_not_available_for_channel422items[].discount_percent mayor que 0 en una empresa sfg: el formulario del portal no tiene campo de descuento por línea en ninguna captura nuestra, así que aceptarlo te cotizaría un total con descuento y emitiría el documento sin él. Métele el descuento al unit_price, o emite por emission_channel=mercado
global_discount_not_available_for_channel422global_discounts en una empresa sfg: el formulario del portal tiene sus entradas de descuento comentadas, no hay dónde ponerlo. Mismo remedio que el de línea
invalid_field400Un valor de filtro o de enum no reconocido; el mensaje lista los válidos
field_too_long400Un campo excede el maxLength que el XSD del SII le pone al elemento en que se convierte (receptor.giro → GiroRecep 40, receptor.legal_name → RznSocRecep 100, receptor.address.street → DirRecep 70, dispatch.carrier.plate → Patente 8, …). Se rechaza, nunca se trunca

Recepción

CódigoHTTPCausa
commercial_response_not_applicable422El tipo de documento no lleva respuesta comercial (solo 33/34/43)
commercial_response_window_closed422Pasaron los 8 días corridos. deadline_at viene en el error
commercial_response_already_registered409Ya se registró una acción sobre ese documento; es de un solo tiro

Impuestos

CódigoHTTPCausa
fx_rate_required400currency no es CLP y no mandaste fx_rate
f29_amount_confirmation_mismatch422confirm_total_payable no coincide con la propuesta vigente

Plataforma

CódigoHTTPCausa
plan_limit_reached402Declarado y sin emisor: el plan es plano y con documentos ilimitados, así que hoy nada devuelve este código. Está publicado para que un cliente que ya maneja 402 tenga contra qué programar
subscription_required402Esa empresa no tiene suscripción activa y el acto es real (emisión, nota de crédito, folios, envío, puesta en marcha). Se cobra por empresa: las demás siguen
payload_too_large413El cuerpo supera el tope de la superficie (2 MB en JSON, 9 MB en multipart/form-data). El mensaje nombra el tope en bytes. Se responde antes de revisar la llave, así que puede llegar sin autenticación; no se leyó ni se guardó nada. Si lo estás topando con JSON, casi siempre es un archivo mandado como base64: los endpoints de subida reciben multipart/form-data

Códigos de rechazo del SII

Cuando un documento termina en rejected o reparo, rejection_reasons trae una lista estructurada:

"rejection_reasons": [
  {
    "code": "ted_signature_invalid",
    "sii_code": "TED-2-510",
    "message": "Firma del timbre electrónico incorrecta",
    "hint": "El DD del timbre fue alterado entre la firma y el envío.",
    "retriable": false
  }
]
Código FacturiaCódigo SIICausa
schema_invalidSCH-00001Esquema del sobre rechazado
caratula_invalidRCTDatos de la carátula mal (frecuentemente FchResol / NroResol)
ted_signature_invalidTED-2-510La firma del timbre no coincide
field_invalidHED-3-211Un campo de cabecera lleva un valor que el SII rechaza
signer_not_authorizedenvío estado 1 / ESTADO 6El certificado firmante no es usuario autorizado de la empresa
emisor_not_authorizedEMPEmpresa no autorizada a emitir este tipo de documento
document_not_authorizedFNAFolio fuera de un CAF autorizado, o CAF revocado
totals_mismatchDNKLos montos enviados difieren de los que calculó el SII

`retriable` es la única señal que importa al reintentar

Un rechazo con retriable: false no cambia de resultado por volver a intentarlo: el documento tiene un problema de datos o de autorización. Un retriable: true sí puede pasar la próxima vez.

No infieras la respuesta del código HTTP: un 502 sii_error puede ser cualquiera de los dos, y la lista de motivos es lo que lo distingue.

La copia legible por máquina

curl https://api.facturia.cl/v1/error_codes

Sin autenticación. Devuelve cada código de Facturia, su contraparte del SII y su retriable, para que tu propio manejo de errores no tenga que transcribir esta tabla a mano.

En esta página