Skip to main content
This guide covers the full integration surface of Transaction Monitoring. The quickstart gets you running; this page gets you to production.

Architecture

Authentication

Standard x-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:
Richer payload with payment methods, device context, and custom properties:
camelCase aliases are accepted for every top-level field (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 required subject (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_date in 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:
  1. Export your historical transactions to a CSV.
  2. Use Transactions → Import history in the console (or submit via API in a loop) with txn_date in the past.
  3. Enable rules only after ingestion finishes, or use dry ingest to skip rule evaluation.
Be deliberate about historical rule evaluation. Feeding 6 months of history through a “20 transfers in 30 days” rule will generate thousands of alerts at once.

Webhooks

Subscribe to:
  • transaction.created — every submitted transaction.
  • transaction.status.updated — status changes (e.g. analyst moves from IN_REVIEW to APPROVED, or an async AML check updates the score).
Full details: TM webhooks.

Handling statuses

See TM statuses.

Linking transactions to entities

Pass vendor_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.
Missing 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 to AWAITING_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.