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:
Party modeling
Transactions support up to four parties:| Role | Who |
|---|---|
APPLICANT | The customer on your platform initiating the transaction |
REMITTER | Whoever sent the funds (often same as applicant) |
BENEFICIARY | Whoever receives the funds (often same as counterparty) |
COUNTERPARTY | The other side of the transaction |
vendor_data (binding to a User or Business entity), or be included as a snapshot (external, no 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
| Status | What to do |
|---|---|
APPROVED | Process the transaction as normal. |
IN_REVIEW | Hold the transaction until analyst review or automated re-check resolves. |
DECLINED | Reject the transaction. Surface a generic error to the user. |
AWAITING_USER | A remediation session has been created — deliver its URL to the user. |
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 linked to the same vendor_data. The response includes a remediation_session_id and a url you deliver to the user:
APPROVED or DECLINED automatically, and a transaction.status.updated webhook fires.
Best practices
| Practice | Why |
|---|---|
Always pass vendor_data | Enables aggregation. |
Use your own txn_id | Idempotency. |
Subscribe to both transaction.created and transaction.status.updated | Catch async state changes (e.g. analyst review outcomes). |
| Set rule thresholds deliberately | Low thresholds = more alerts; high = more missed risk. See risk scoring. |
| Monitor rule run counts in console | Catch rules that never fire (misconfigured) or fire on everything (too loose). |
| Test rules in TEST mode before going live | See rules. |
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.