Skip to main content
POST
Import entities (CSV)

Endpoint

Overview

Content-Type: multipart/form-data. Enqueues the same bulk job as the dashboard Bulk imports hub. Requires entities:bulk_import and org bulk automatic entity import enabled. 202 response includes jobId and effective importMode.

Authentication

Import Modes (entityImportMode)

Legacy values manual_no_enrichment and automatic_enriched are still accepted on input and normalized to manual / automatic. Responses use the canonical names.

If an enrichment fails (per row)

Each CSV row is processed independently. Default: a failed row is recorded and the job continues with the next row. Set stopOnFirstError=true to stop after the first failure (rows already created stay). In automatic, extra enrichments (Argentina BCRA, etc.) run only after basic data succeeds. A BCRA error never aborts a create whose basic-data step already succeeded.

Default When Sending Only the CSV

β†’ importMode: manual β€” minimal entity, no enrichments unless you add them explicitly.

Manual with Selected Enrichments

Same semantics as the dashboard Manual mode:
Optional monitoring JSON (main entity only in manual mode).

Automatic Mode (Explicit)

Omitting autoExecuteIntegrations in automatic mode β†’ all active enrichments for the org. With depth > 0, send autoExecuteIntegrationsShareholders (JSON) for shareholders.

Manual without Post-Create Rules

(You can omit entityImportMode β€” manual is already the default.)

Risk-matrix action after completion

The optional multipart field postImportActions accepts a JSON array. The run_risk_matrix_filtered action queues a bulk risk-matrix execution after the job reaches completed:
With relatedEntitiesOfCreatedEntitiesOnly=true, Gu1 evaluates only entities directly linked β€”as source or targetβ€” to rows whose outcome in this file was created. filters.type determines whether related entities must be company or person, and the matching matrix is required. Rows with skipped_existing or failed are excluded. Without this flag, filters applies to the organization’s full entity list. Alternatively, send sourceImportJobId with the ID of a previous completed entity import. Gu1 runs the matrix only on that batch’s created rows matching filters.type, including entities not linked to rows in the current file. sourceImportJobId and relatedEntitiesOfCreatedEntitiesOnly=true are mutually exclusive. The previous import must belong to the same organization and have its full report available. You can also send onlyWithoutRiskMatrixExecution=true to evaluate every entity of filters.type that does not yet have a matrix-execution audit. Once an entity is processed successfully, later imports do not include it again. The three scopes (sourceImportJobId, related entities, and no previous execution) are mutually exclusive.

Platform CSV (no mappingId)

Minimum headers: tax_id, type. Recommended: suggested_name (required in manual mode). See Country (ISO2) below for country_code.

Country (ISO2) β€” Always Required

Every entity row needs a country to create the record (manual and automatic). Provide it in one or both places: Priority: country_code on the row β†’ batch country. If neither is set for a row, the import fails with missing country before the job runs. Examples:
  • Simple CSV, all rows Argentina β†’ headers tax_id,type + form country=AR.
  • Advanced CSV, mixed countries β†’ include country_code on each row (form country optional fallback).
  • Advanced CSV, single country β†’ either all rows with country_code=AR or form country=AR without the column.
Reference templates β€” download (fixed demo tax IDs; replace before production import) or generate fresh IDs from the dashboard hub (Entities β†’ bulk import): Canonical source (keep in sync when columns change): apps/web/src/lib/bulk-automatic-entity-import-parse.ts. Automatic example (truncated):
Manual example (truncated):
Legacy single-file name bulk-entities-template.csv is no longer used by the hub; pick the template matching your entityImportMode.

Column Reference (Platform CSV)

Header names are case-insensitive; spaces become _ (e.g. country code β†’ country_code). Aliases in parentheses.
Same entity, multiple links (CSV): platform CSV supports one relationship per row. If the same person/company appears on several rows with different related_*, Gu1 does not recreate the entity (duplicate tax_id skip) but still applies that row’s link. If the edge (source β†’ target + type) already exists, that link is skipped (idempotent). API/JSON alternative: a single create with up to 10 items in relationships[].
Removed (2026-06-04): CSV columns execute_all_active_checks and checks are no longer part of the import contract. Use enrichments, enrichment_group_refs, and execute_all_active_enrichments instead. See Changelog.
Dot notation: same as native transaction CSV β€” dotted headers build nested objects. Enrichments may overwrite entityData; CSV values are re-applied at the end (CSV wins on conflicts). What goes to attributes: attributes.*, legacy metadata.*, or unprefixed columns. Batch-level form field attributes (JSON) is merged with per-row attributes (row wins on key collision). Simple CSV (only tax_id + type): send batch form field country (ISO2) β€” required. No country_code column needed. Custom CSV (non-platform headers): use a saved mappingId β€” column mapping is defined in the dashboard, not by this table.
  • Per-row enrichment columns apply in both modes when set on the row; depth / shareholders only in automatic.
Optional β€” automatic mode only. Prefix relationship_ (plural alias relationships_). Custom batch policies (e.g. Paytime): omit relationship_execute_all_active_enrichments from the CSV if you want step-2 form policy to apply. Use relationship_omit_enrichments per row for one-off exceptions only. Example: batch all-active on shareholders except global sanctions on children:

Custom CSV

Non-platform column layout β†’ mappingId required (entity_person / entity_company / entity_mixed mapping).

Form Fields

Success Response

Child Enrichments & Monitoring

Automatic mode with depth > 0 creates shareholders (company roots) or related entities (person roots). Two batch fields control how enrichments and watchlist monitoring apply to those children: monitoringApplyToRelationships: when false, the monitoring JSON applies to main entities only (monitoring.main); related entities are not added to watchlists even if enrichments run on them. Recommended false with by_root_type when the main entity should enter sanctions monitoring but children should not. Example (mixed company + person CSV, depth 1, main watchlist only, differentiated children):
Per-row autoExecuteIntegrationsShareholders in JSON bulk (POST /entities/bulk/automatic) or relationship_* CSV columns still override the batch policy for that item.

Manual vs. Automatic (Same Job Queue)

Limits

Default When Mode Omitted

Hub vs. API

See also: Bulk imports overview.