Skip to main content

Endpoints para descargar fallos

RecursoCSVJSON
TransaccionesGET /batch-import/transaction-jobs/{jobId}/failures.csvGET …/failures
EventosGET /batch-import/user-event-jobs/{jobId}/failures.csvGET …/failures
EntidadesGET /batch-import/entity-jobs/{jobId}/failures.csvGET …/failures
Alias legacy CSV entidades: GET /entities/automatic/bulk/imports/{jobId}/failures.csv.
  • …/failures.csv → archivo CSV descargable (Content-Type: text/csv)
  • …/failures → JSON (Content-Type: application/json)

Modelo de tres capas

CapaCuándoDónde leer
Pre-jobRequest rechazado antes de devolver jobId (400)Body HTTP (error.code)
Job completoJob abortado (status: failed)Historial unificadoworkerError, metadata.apiError; JSON → jobFailure
Por filaAlgunas filas fallaron (failed > 0, job puede ser completed)CSV/JSON de fallos según tipo de job
Cada fallo por fila incluye code (máquina) y message (humano). Jobs legacy pueden tener solo error en texto libre; la API normaliza al leer.

Tres resultados posibles por fila (entidades)

Resultadooutcome¿Va a failures.csv?Dónde se ve
CreadacreatedNoJob succeeded, reporte completo
Omitida (skip)skipped_existingNoJob skipped / skippedExisting, reporte completo, JSON skips[]
FallidafailedJob failed, failures.csv / JSON failures[]

Duplicate por taxId — el caso que confunde

Bulk manual (default): duplicateTaxIdPolicy: skip_existing.
  • Mismo taxId + mismo type ya existe → skipped_existing, código SKIPPED_DUPLICATE_TAX_ID
  • No aparece en failures.csv (no es error)
  • Contador: skippedExisting en historial unificado
Bulk automático:
  • Entidad principal ya existía → skipped_existing, código SKIPPED_ENTITY_ALREADY_EXISTS
Cuándo sí es fallo (failed):
SituaciónCódigo batch
Mismo taxId pero tipo distinto (person vs company)TAX_ID_TYPE_MISMATCH
Mismo taxId+mismo tipo con política error (API unitaria; no default bulk)DUPLICATE_TAX_ID
Mismo externalIdDUPLICATE_EXTERNAL_ID

Códigos de fallo por fila (failures[] / failures.csv)

CódigoSignificado
VALIDATION_ERRORValidación Zod / esquema antes de persistir
PROCESSING_ERRORError inesperado al procesar la fila
ENTITY_NOT_FOUNDEntidad referenciada no existe en la org
INVALID_RISK_MATRIXMatriz inválida o de otra org
CREATION_QUOTA_EXCEEDEDCuota de creación excedida
DATABASE_INSERT_ERRORInsert rechazado por PG (sin clasificar)
DUPLICATE_EXTERNAL_IDMismo externalId ya existe
DUPLICATE_TAX_IDMismo taxId + tipo (error duro)
TAX_ID_TYPE_MISMATCHtaxId registrado bajo otro tipo de entidad
CONSTRAINT_VIOLATIONOtro constraint PG (FK, check, unique)
MISSING_COUNTRYFila sin país ISO2 válido
INVALID_COUNTRYPaís no permitido para el modo (p. ej. automatic ≠ AR/BR/CL)
ENRICHMENT_FAILEDProveedor enrichment falló
CREATION_FAILEDNo se pudo crear la entidad

Códigos de skip (skips[] — solo entidades, no es fallo)

CódigoSignificado
SKIPPED_DUPLICATE_TAX_IDBulk manual: taxId+tipo ya existía, fila omitida
SKIPPED_ENTITY_ALREADY_EXISTSBulk automático: entidad ya existía
Matriz de riesgo / reglas de negocio: la ejecución de reglas ocurre después de crear la fila. Los resultados de reglas no aparecen en failures.csv / JSON failures[] y no revierten la fila. Usá alertas, score de riesgo y timelines de auditoría.

Códigos de job completo (jobFailure)

CódigoSignificado
INVALID_ENTITY_REFERENCESBatch txn: validateExistingEntity=true y refs origen/destino sin resolver — ninguna fila creada
TOO_MANY_ITEMSArchivo supera límite del plan
CSV_PARSE_ERRORCSV no parseable o mapeo falló
MAPPING_VALIDATION_ERRORMapeo guardado o preflight validate-csv falló
MISSING_REQUIRED_FIELDCampo multipart / fila requerido faltante antes de encolar
COOPERATIVE_CANCELJob cancelado durante procesamiento
WORKER_ERRORError no manejado del worker

Matriz de escenarios (FAQ cliente)

Escenario¿En failures por fila?Código / ubicación típica
Columna CSV faltante (pre-parse)No400 antes del job
Ref entidad inválida (txn batch, validación default)NoJob INVALID_ENTITY_REFERENCES
Duplicate txn externalId con skipDuplicates=trueNoContado como skipped
Duplicate entity externalId (import manual)DUPLICATE_EXTERNAL_ID
Duplicate entity taxId (mismo tipo, bulk default)Noskipped_existingSKIPPED_DUPLICATE_TAX_ID en skips[]
Duplicate entity taxId (tipo distinto)TAX_ID_TYPE_MISMATCH
Fallo enrichment (entity automatic)ENRICHMENT_FAILED
Campo inválido en user eventVALIDATION_ERROR
Error evaluación reglas / matrizNoFila igual se crea

Escenarios reproducibles (pruebas)

User events (fallos por fila más simples): CSV válido + mapping; una fila con campo requerido vacío → GET …/user-event-jobs/{jobId}/failures. Entidades (manual): crear entidad con external_id=X, importar otra fila con mismo external_idDUPLICATE_EXTERNAL_ID. Transacciones (job-level): validateExistingEntity=true + originExternalId=DOES_NOT_EXIST → job failed, jobFailure.code=INVALID_ENTITY_REFERENCES. Transacciones (row-level): batchErrorHandling=continue_collect_errors + filas válidas mezcladas con violaciones de constraint → entradas en endpoint de fallos.

Límites

  • Máx. 500 fallos por fila persistidos por job batch de transacciones (CSV + JSON pueden truncar; JSON expone truncated + failuresTotal).
Reporte completo por email (entidades): todas las filas (created, skipped_existing, failed) con columna code. Ver también: Importaciones masivas — overview.