Real-Time Transaction Risk Scoring at $0.02 per Transaction
Score every transaction in real time, get back one of four statuses — APPROVED, IN_REVIEW, DECLINED, AWAITING_USER — and act before the money settles. Here's how risk scoring works at $0.02 per transaction.

Batch monitoring is monitoring after the fact. Run your rules overnight and you find out a payment was suspicious the morning after it settled — when the money is already gone and the only thing left to do is file a report. Real-time scoring flips that: you evaluate the transaction while it's still in flight, get a decision back in milliseconds, and act before settlement.
Didit's Transaction Monitoring API scores every transaction inline. You send the payment, the engine runs it against every active rule, attaches a risk score, and returns one of four statuses — APPROVED, IN_REVIEW, DECLINED, or AWAITING_USER. Low-risk payments pass silently; risky ones are held, blocked, or routed back to the user. It works for fiat and crypto, and it costs $0.02 per transaction with no minimums.
This guide explains how the scoring works, what the four statuses mean, and how to act on them before money moves.
Key takeaways
- Real-time decisioning. Every transaction is scored inline and returns a status in milliseconds — so you can act before the money settles.
- Four statuses:
APPROVED,IN_REVIEW,DECLINED,AWAITING_USER— a clear, actionable outcome for every payment. - A numeric risk score accompanies the status, accumulated from the rules that fired, so you can set your own thresholds on top.
- Rules drive the score — each rule's action can add to the score, change the status, tag the transaction, or list a party.
- Fiat and crypto in one engine, scored the same way; crypto can trigger on-chain wallet screening automatically.
- $0.02 per transaction, pay-per-call, no minimums. AML screening on a flagged party is billed separately at $0.20.
What real-time risk scoring does
Every transaction you send is evaluated against the full set of active rules across every enabled bundle. Each rule that matches contributes: it can add to a cumulative risk score, change the status, add tags or notes for an analyst, or add a party to a list. The result is two things you act on — a numeric score that summarizes how risky the engine thinks the transaction is, and a status that tells you what to do about it.
Because the evaluation happens inline, the decision comes back before you settle. A clean payment is APPROVED and proceeds with no friction. A payment that crosses a soft threshold goes IN_REVIEW and opens an alert. A payment that trips a hard rule — a sanctioned counterparty — is DECLINED. And a payment that's risky but recoverable goes AWAITING_USER, pausing for a step-up the user can clear.
Why it matters
The whole value of monitoring is in the timing. Detecting structuring or a sanctioned counterparty a day late means the funds have already left; all you can do is report. Detecting it in the moment means you can hold the payment, decline it, or remediate it — you stop the harm instead of documenting it.
Real-time scoring also changes the economics. Batch systems force a blunt choice between blocking too much and reviewing everything. A per-transaction score with four distinct statuses lets you calibrate: auto-approve the clean majority, review the genuinely ambiguous, hard-decline the unambiguous, and push the recoverable cases back to the user. Analyst time goes only where it's needed, and at $0.02 per transaction the cost tracks volume rather than seat licenses.
Technical details
Transactions are created against the unified /v3/ API, idempotent on a transaction_id you control:
curl -X POST https://verification.didit.me/v3/transactions/ \
-H "x-api-key: $DIDIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"transaction_id": "txn_e02b7c",
"category": "finance",
"amount": 15000,
"currency": "EUR",
"currency_kind": "fiat",
"txn_date": "2026-05-21T15:22:00Z",
"subject": { "vendor_data": "user_2204", "role": "SENDER", "entity_type": "INDIVIDUAL" },
"counterparty": { "role": "RECEIVER", "entity_type": "INDIVIDUAL" },
"payment_method": "BANK_TRANSFER"
}'
The response carries the risk score, the status, and the rules that contributed:
{
"transaction_id": "txn_e02b7c",
"status": "IN_REVIEW",
"risk_score": 61,
"triggered_rules": [
{ "name": "Large transaction", "bundle": "Finance", "action": "ADD_SCORE" },
{ "name": "New account — high value", "bundle": "AML/CTF", "action": "CHANGE_STATUS" }
],
"alert_id": "alrt_3f90aa"
}
The four statuses:
| Status | Meaning |
|---|---|
APPROVED | No rule crossed a decline threshold — the transaction proceeds. |
IN_REVIEW | A rule flagged the transaction — an alert is opened for an analyst. |
DECLINED | A hard rule (e.g. sanctioned counterparty) blocked the transaction. |
AWAITING_USER | The transaction is held pending a user action — re-verification or proof of funds. |
Webhooks. Subscribe to transaction.created and transaction.status.updated so your ledger reflects the decision and any later change when an analyst resolves an alert or a remediation completes.
Price. $0.02 per transaction, billed per call, no minimums. AML screening on a flagged party is billed separately at $0.20.
Acting before settlement
The point of inline scoring is that the status arrives in time to do something:
APPROVED— release the payment. No friction, no analyst.IN_REVIEW— hold or settle-and-watch per your policy; an alert is already open for an analyst to investigate.DECLINED— block the payment outright; the transaction never settles.AWAITING_USER— pause and prompt the user for a step-up; the transaction resumes automatically once they clear it.
You set the thresholds that map the numeric score onto your own internal actions, on top of the statuses the engine returns. A score of 60 might be a hold for one product and a settle-and-watch for another — the engine gives you the number and the status; your policy decides the consequence.
Use cases
- Fintech — score deposits, transfers, and withdrawals inline; hold high-value first-time transfers for review before they settle.
- Crypto — score on-chain transactions and trigger wallet screening on the counterparty address before an outbound transfer goes through.
- Lending — score disbursements for synthetic-identity and mule signals before funds release.
- Marketplaces — score seller payouts for velocity and refund-abuse patterns before money moves.
- iGaming — score deposits for velocity spikes that double as a responsible-gaming signal.
How to integrate with Didit
- Configure rules and thresholds. In the Business Console, switch on the bundles that fit your business and set the score thresholds that map to your actions.
- Score inline.
POST /v3/transactions/synchronously from your payment path, with a stabletransaction_idandvendor_datalinking each to its user. - Act on the status. Approve, hold, decline, or prompt for remediation based on the returned status and score.
- Sync with webhooks. Listen for
transaction.status.updatedto react when an analyst resolves an alert or anAWAITING_USERstep completes.
Because it's all on the unified /v3/ API, a user onboarded with KYC flows straight into the same engine that scores their transactions — one identity-and-fraud platform, end to end.
Frequently asked questions
How fast is the scoring?
It's real time — the transaction is scored inline and returns a status in milliseconds, so you can act before the money settles.
What does the risk score represent?
A numeric summary of how risky the engine judged the transaction, accumulated from the rules that fired. It accompanies the status, so you can set your own thresholds on top of the four built-in outcomes.
What are the four statuses?
APPROVED, IN_REVIEW, DECLINED, and AWAITING_USER. Approved proceeds, in-review opens an alert, declined blocks the payment, and awaiting-user pauses for a step-up the user can clear.
Does it score crypto transactions too?
Yes. Set currency_kind to fiat or crypto. Crypto transactions are scored the same way and can automatically trigger on-chain wallet screening.
What does it cost?
$0.02 per transaction, billed per call with no minimums. AML screening on a flagged party is billed separately at $0.20.
Ready to get started?
Read the Transaction Monitoring overview in the docs, see how it fits the rest of the platform on the Transaction Monitoring product page, and check transparent per-call pricing on the pricing page. When you're ready, start free — 500 free KYC checks every month, and transaction monitoring at $0.02 per call.