Import Data from Another Provider
Create an asynchronous import job for historical User Verification sessions, Business Verification sessions, transaction monitoring records, or workflow custom status rules. Use this to migrate from providers such as Sumsub, MetaMap, Veriff, Onfido, Persona, Trulioo, Jumio, Incode, iDenfy, or any other provider after transforming the export into Didit’s canonical CSV/NDJSON format. Imports are disabled by default and must be enabled per organization by Didit.
- Import historical verification work — recreate completed KYC, KYB, transaction monitoring, or workflow-rule records so Didit shows the old provider history. Use
POST /v3/session/imports/. - Import operating data — create Users, Businesses, profile faces, blocklist entries, or allowlist entries so Didit can use them in future checks. Use the entity, face, and list APIs.
session_type: "MIGRATED" for KYC and KYB. They do not send end-user emails, do not redirect users into the hosted flow, and do not re-run the original verification. The imported records appear in session lists, entity profiles, transaction views, and GET /v3/session/{session_id}/decision/ where applicable.
Which import should you use?
POST /v3/session/imports/.What can migrate from each provider?
Didit accepts a canonical CSV or NDJSON file, so you can migrate from any provider once you export and transform the data. The import contract is always Didit’s canonical schema.Migration workflow
- Decide whether you are importing history, profiles, faces, lists, transactions, or rules.
- Export the data from the old provider yourself. Do not send old-provider API keys to Didit.
- Transform the provider export into the matching Didit canonical CSV or NDJSON template.
- For large migrations, prefer NDJSON and split into files you can retry independently.
- Create the import job and poll progress.
- Fetch row errors, fix only failed rows, and retry them. All import jobs are idempotent on their natural external id.
Create an import job
Create an import job with a single multipart request:workflow_id:
Request fields
How records are tracked and deduplicated
There is no request field for the data source — every import uses Didit’s canonical schema. Each imported record storesmetadata.imported_from = "generic" for traceability.
user_verification and business_verification imports deduplicate rows on external_id within the application, so retrying the same file won’t create duplicates. transactions imports deduplicate on transaction_id instead.
Import document photos, videos, and selfie evidence
Forimport_type=user_verification, you can import the original document photos, document/liveness capture videos, and selfie image from the previous provider.
Use these canonical columns:
- URLs must use
https. - URLs must not resolve to private IPs, localhost, link-local ranges, or internal metadata hosts.
- Images accept either a URL column or its
*_base64fallback; base64 takes precedence when both are set. Videos are URL only — there is no*_video_base64column. - Videos must be
mp4,webm, ormov, and each video may be at most 10 MB. Larger or non-video files are rejected as row errors. - Didit enforces connect/read timeouts, maximum file size, and no infinite retries.
- Media download failures are stored as row errors so the rest of the import can continue.
- If you do not have media from the provider, leave these columns empty. Didit still imports the structured decision and document fields.
- Imported images and videos are evidence for historical review. Didit does not re-run OCR, liveness, or document-fraud analysis on imported historical media by default.
Poll progress
status, import_type, total_rows, processed_rows, created_count, updated_count, skipped_count, failed_count, and checkpoint_row.
Download row errors
row_number, external_id, error, and raw_row, so you can fix only the failed rows and retry.
Abuse protection
Historical import jobs throughPOST /v3/session/imports/ are disabled by default. Didit enables this capability per organization after review because these jobs can process millions of rows and download media. The normal operating-data imports in this guide — creating Users, creating Businesses, uploading profile faces, uploading face blocklists, or adding list entries — do not require special migration enablement beyond the normal API key permissions, product availability, and rate limits for those endpoints.
Historical import jobs also run on isolated workers with file size limits, row budgets, HTTPS-only media URLs, private-network URL blocking, per-application active-job limits, and per-row error capture.
Canonical statuses
Idempotency
Didit usesexternal_id as the import idempotency key for User Verification and Business Verification imports, scoped per application. Transaction imports use transaction_id per application. Retrying the same file skips rows that were already imported and creates rows that were not processed yet.
Import users, profile faces, and blocklists
Use these paths when you are not recreating a completed verification session:Import user profiles
Create users withPOST /v3/users/create/ or the Business Console CSV import in Import and Export Users. This creates or updates the VendorUser profile only. It does not create a verification session, KYC decision, document report, warning, or webhook history.
Use this when you want Didit to know the customer exists before future checks, or when you need to backfill CRM-like fields such as display_name, tags, or metadata.
Upload trusted profile faces
After a User exists, upload a trusted profile face withPOST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/. This attaches biometric evidence to the User profile and indexes it for duplicate detection and face search.
This does not blocklist the face. It is useful when you have a trusted profile image from a previous KYC provider and want future Didit checks to compare against it.
Import face blocklists and allowlists
To block or allow a face directly, usePOST /v3/lists/{list_uuid}/entries/face-upload/ with a face-type list. Didit extracts the biometric embedding and stores a list entry.
Use this for known fraudster images, trusted allowlist faces, or provider fraud-list migrations. If the face comes from an existing Didit session, prefer POST /v3/lists/{list_uuid}/entries/ with reference_session_id; Didit extracts the right face from the session and links the entry back to the source.
Import user, business, document, wallet, email, phone, IP, or device lists
UsePOST /v3/lists/{list_uuid}/entries/ for non-face list values. This is the right path for provider blocklists, allowlists, chargeback lists, wallet addresses, known risky IPs, device fingerprints, document numbers, emails, phones, users, or businesses.
Next steps
Import users
Import businesses
Upload profile face
Upload face to list
Create list entry
Rate limits
Authorizations
Body
What to import: historical User Verification sessions, historical Business Verification sessions, workflow custom status rules, or historical transaction monitoring records.
user_verification, business_verification, status_rules, transactions Workflow UUID that imported sessions or status rules should be attached to. Required for user_verification, business_verification, and status_rules. Omit for transactions.
Optional. Inferred from the uploaded file extension when omitted.
csv, ndjson Canonical CSV or NDJSON file. Use NDJSON for large imports. Maximum upload size 25 MB (use source_file_url for bigger files). Mutually exclusive with source_file_url.
Alternative to file upload. Must be an HTTPS URL resolving to a public address (private/loopback networks are rejected). Mutually exclusive with file.
Response
Import job accepted. Poll the returned uuid until status is COMPLETED or FAILED.
Import job id. Use this value to poll progress and fetch row errors.
PENDING, PROCESSING, COMPLETED, FAILED, PAUSED, CANCELLED user_verification, business_verification, status_rules, transactions csv, ndjson