Architecture
Authentication
Standardx-api-key header. Same keys used for sessions and entities. See API authentication.
Submitting a transaction
Single endpoint:POST /v3/transactions/. See submitting transactions for the full schema.
Minimal payload:
txnId, txnDate, type, info, applicant, props, travelRule, includeCryptoScreening) - the SDK wire format and the snake_case format land in the same place.
Party modeling
Every transaction has a requiredsubject (your customer - the party you monitor) and an optional counterparty (the other side). Each carries its own payment_method and optional device context.
In the response, they come back in the parties array with roles APPLICANT and COUNTERPARTY; a party without vendor_data is stored as an external snapshot (kind: EXTERNAL) with no linked entity.
See transactions payload for party fields.
Idempotency
txn_id is unique per application. Re-submitting the same txn_id returns the existing transaction’s current state (not an error) — effectively idempotent for retries.
Always generate txn_id on your side before submitting; don’t rely on a Didit-generated ID for idempotency. Use your own database ID, a UUID, or a hash of transaction fields.
Real-time vs batch
- Real-time — recommended for most use cases. Submit the transaction the moment it happens in your system. Rules evaluate synchronously and return the decision.
- Batch / backfill — for historical ingestion, pass
txn_datein the past. Rules still run and can trigger webhooks. To avoid triggering rules on backfill, use the console’s CSV import with the “dry ingest” flag.
Historical ingestion
When you’re migrating from another transaction monitoring system:- Export your historical transactions to a CSV.
- Use Transactions → Import history in the console (or submit via API in a loop) with
txn_datein the past. - Enable rules only after ingestion finishes, or use dry ingest to skip rule evaluation.
Webhooks
Subscribe to:transaction.created— every submitted transaction.transaction.status.updated— status changes (e.g. analyst moves fromIN_REVIEWtoAPPROVED, or an async AML check updates the score).
Handling statuses
See TM statuses.
Linking transactions to entities
Passvendor_data on every party. Benefits:
- Every transaction aggregates into the User or Business profile.
- Velocity and behavioral rules have the full history to evaluate against.
- Blocking an entity propagates to future transactions automatically.
vendor_data isn’t a hard error — the transaction is stored as an external snapshot — but you lose entity-level aggregation.
Remediation sessions
When a rule action moves a transaction toAWAITING_USER, Didit automatically creates a remediation session - a standard hosted verification session for the same vendor_data.
Custom rules always name the workflow on the action itself; for built-in library rules the workflow falls back to the remediation workflow in your transaction settings, then your application’s Biometric Authentication workflow (when the subject has a stored reference face), then your application’s default workflow.
Travel Rule transactions are excluded from this automatic fallback - their pending action is wallet-ownership proof.
The transaction (response, every subsequent read, and every webhook) carries it in the canonical action_required block:
remediation is kept for backward compatibility; action_required is the canonical block (it also carries wallet_ownership actions for Travel Rule transfers).
The user completes the verification - for a Biometric Authentication workflow, a liveness-checked selfie matched against the face captured at their original KYC onboarding, the strongest step-up for high-value transactions.
Once the session reaches a decision, the transaction follows it automatically - APPROVED (decision_reason_code: user_action_approved), DECLINED (user_action_declined), or IN_REVIEW (user_action_in_review) - and a transaction.status.updated webhook fires.
Any workflow type except KYB can be selected.
Biometric Authentication workflows (and workflows where face match runs before ID verification) require the subject to already have a stored reference face from an approved verification; users without one are sent to your application’s default workflow instead, with a note on the transaction recording the substitution.
Best practices
Rate limits
See rate limiting. Transaction create is one of the highest-throughput endpoints; typical limits are in the hundreds of requests per second. Burst carefully.Next steps
Transactions
Full payload reference.
Rules
How rules evaluate.
Webhooks
Event catalog.
Troubleshooting
Common integration issues.