POST /v3/transactions/ and GET /v3/transactions/{transaction_id}/. Both endpoints return the same TransactionDetail object; the API reference carries the field-by-field schema and this page walks through it.
Top-level structure
uuid is the Didit-stable identifier and is what GET /v3/transactions/{transaction_id}/ expects in its path; txn_id is the transaction_id you supplied at create time. transaction_number is the application-scoped sequential number the console shows.
The subject and counterparty you submitted do not come back as top-level keys. They are the entries of the parties array, distinguished by role, and vendor_data at the top level is a convenience copy of the applicant’s vendor_data.
Key fields
Financial fields
amount/currency— transaction amount as submitted.amountis a decimal string with trailing zeros stripped ("1500","0.5"), with up to 18 decimal places.currency_type—fiatorcrypto, as submitted incurrency_kind;nullwhen omitted.amount_in_default_currency/default_currency_code— the pre-converted amount you supplied on the request, echoed back;nullwhen you did not send one.preferred_currency_amount/preferred_currency_code—amountconverted to your application’s preferred currency.nullwhen no exchange rate is available forcurrencyand you did not supplyamount_in_default_currency.payment_details/payment_txn_id— the free-text payment reference and the external payment reference (for example a blockchain transaction hash) from the request.
Status fields
status—APPROVED,IN_REVIEW,DECLINED,AWAITING_USER. Transactions are createdAPPROVED; rules may flip them synchronously.score— integer risk score accumulated by rules. Higher is riskier.severity—UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL, ornulluntil a rule or provider sets it.decision_reason_code/decision_reason_label— structured + human reason for the current status.environment-liveorsandbox, from the application that owns the transaction. Asandboxtransaction is stored but never evaluated, so its emptyrule_runsmeans “not evaluated” rather than “nothing matched”. See Transaction Monitoring in sandbox.source-LIVEfor transactions submitted through the API or SDK,IMPORTEDfor transactions loaded through the console CSV import.
Parties
Every party on the transaction is an entry inparties. The create endpoint records the subject as APPLICANT and the optional counterparty as COUNTERPARTY; the role enum also includes REMITTER and BENEFICIARY. All entries share one shape.
role—APPLICANT,COUNTERPARTY,REMITTER,BENEFICIARY. Filter on it to find the subject.entity_type—individual,company,external,unhostedWallet, as submitted.kind—USERorBUSINESSwhen the party links to a Didit user or business throughvendor_data;EXTERNALotherwise.country_code/dob— from the submittedaddress.countryanddate_of_birth.address/institution_info— the objects as submitted;{}when omitted.external_party_snapshot— frozen copy of the party data forEXTERNALparties;nullwhile the party is linked to a Didit user or business.
device
device is the device_context you submitted for that party, normalized to snake_case, plus server-side IP enrichment. It is {} when the request carried no device context, so always treat every key as optional.
There is no separate enrichment object. When the party carried a public
network_context.ip_address, Didit resolves it inline and writes the enriched fields into the same network_context object, filling only the keys you did not supply. Keys the resolver returned empty are omitted, so a fully enriched network_context holds the four submitted keys (ip_address, ip_country_code, latitude, longitude) plus whichever of ip_country, ip_state, ip_city, isp, organization, is_vpn_or_tor, is_data_center, time_zone, time_zone_offset, asn_number, asn_organization, connection_type, carrier and proxy_type were resolved. is_vpn_or_tor and is_data_center are always present after a successful resolution.
Enrichment is skipped, and network_context is returned exactly as submitted, when the IP is missing or non-routable, when the application is in sandbox, or when resolution failed. ip_country_code is an ISO 3166-1 alpha-2 code when Didit resolved it and whatever you submitted otherwise; rule conditions normalize both forms before comparing.
Payment methods
role—SOURCE,DESTINATION,FUNDING,BENEFICIARY. The create endpoint assignsSOURCE/DESTINATIONfromdirection: on an outbound transaction the subject’s method is theSOURCEand the counterparty’s theDESTINATION; inbound is the reverse.payment_method_type—bank_card,bank_account,e_wallet,crypto_wallet,unhosted_wallet,other.fingerprint— SHA-256 overtype:account_id:issuing_country, stable across transactions so you can correlate reuse of the same instrument.nullwhen noaccount_idwas submitted.owner_kind/vendor_data/owner_name— who owns the instrument, following the sameUSER/BUSINESS/EXTERNALconvention as parties.details— the rawpayment_methodobject as submitted.
Rule runs
rule— UUID of the rule that ran;rule_title,rule_description,rule_categoryare copied from it.matched— a run is recorded only when the rule’s conditions matched, so live evaluations always carrymatched: true. Rules that evaluated without matching leave no entry. Demo data can includematched: falserows.is_test/mode—trueandTESTwhen the rule ran in test mode; a test run is recorded but has no effect onstatus,scoreorseverity.score_delta/status_target/severity— what this run contributed.status_targetis set when achange_statusaction ran, or when the added score crossed a threshold.action_summary— a string summary of the actions the rule executed, joined with;(score +30,change_status:IN_REVIEW,add_tag:<name>,add_note,add_to_list,open_case);nullwhen the rule executed no action.metadata— the evaluation detail:scope_match, plusconditions[]andaggregations[]. The two lists use different value keys:conditions[]— one entry per condition withfield,operator,expected_value, thecurrent_valuethat was read from the transaction,matched,group_indexandgroup_logic.field_sourceis alwaysnullon transaction rule runs; it is only classified for monitoring events.aggregations[]— one entry per velocity / count / sum aggregation withmetric,field,operator,expected_value, thecomputed_valuethat the aggregate evaluated to,window,filters,matchedandsample_references. Aggregations that could only be computed asynchronously carrycomputed_value: nullanddeferred: true.
Alerts
status: OPEN, INVESTIGATING, AWAITING_USER, PENDING_SAR, SAR_FILED, RESOLVED, DISMISSED. source: RULE, PROVIDER, MANUAL. See Alerts.
Activities
The transaction’s activity log: creation, notes, manual reviews and status changes.TRANSACTION_NOTE_ADDED entries; there is no separate notes array.
Documents
Files attached to the transaction from the console.[] when none.
file_url is a short-lived signed URL; fetch it when you need it rather than storing it.
Provider results
External provider outputs (transaction hash screening, wallet screening, fiat monitoring, sanctions screening).result_type: FIAT_MONITORING, WALLET_SCREENING, TRANSACTION_SCREENING, TRAVEL_RULE, NETWORK_GRAPH, CUSTOM.
payload.risk_factors is the ranked explanation of score — what produced the verdict, high-risk drivers first and then by value moved. A high score with no is_high_risk entry means the provider graded the entity on its own exposure model without reporting a sanctions or attributed-entity match; summary says so explicitly. Field-by-field reference: Risk factors. Results screened before this field existed omit the key.
For crypto transaction-hash screening, transaction_flows is populated when on-chain enrichment is available. It normalizes chain activity so the console can render both the transaction overview and visualization graph from the same response payload.
Supported enrichment sources:
- EVM chains use Blockscout to normalize the main transaction, internal calls, and token transfers.
- Bitcoin uses mempool.space to normalize transaction inputs and outputs.
- Solana uses Helius to normalize native SOL transfers, SPL token transfers, and available NFT event context.
transaction_flows[] item includes stable normalized fields (flow_type, from_address, to_address, amount, amount_usd, currency, token_name, token_address, transaction_hash, block_timestamp, index, success) plus provider-specific metadata.
Common metadata examples:
metadata is additive and provider-specific. Do not build critical integrations that require every key to be present for every chain.
Travel rule
null when the transaction has no Travel Rule transfer or check. It is populated when you submit travel_rule_details, and also when Travel Rule is enabled for the application and the transaction was created with transaction_category: "travelRule": Didit then initiates the exchange itself, with or without travel_rule_details, and reports its status here. Read this field rather than the request you sent.
Network snapshot
The stored graph itself, not a reference to it. It comes from either source:- a
network_snapshotyou submitted with the transaction, or - the graph Didit builds when AML wallet screening succeeds for a crypto transaction, even if the request carried no
network_snapshot. A screening-built graph replaces a submitted one, and an asynchronous re-screen refreshes it.
null when neither exists:
Tags, metadata, props
tags[]— attached tags (either by rule action or by analyst):{ "uuid", "name", "color", "description", "source" }, wheresourceisdiditfor a preset tag andcustomfor one of yours.metadata— a snapshot of thesubjectandcounterpartypayloads exactly as you submitted them at create time, under those two keys.props— thecustom_propertiesyou supplied at create time. Each key is addressable in rule conditions ascustom_values.<key>.
Remediation
When a rule triggersAWAITING_USER, Didit creates the linked verification session and returns it in two fields:
remediation— the linked session:{ "session_id", "session_token", "url", "status" }. Stays populated for the life of the transaction, so you can always see how the user action ended.action_required— the action the user must take right now, ornullonce nothing is pending:{ "type": "verification_session", "url", "session_id", "session_token", "status" }. Redirect the user tourl, or feedsession_tokento a Didit SDK. Travel Rule wallet-ownership actions use{ "type": "wallet_ownership", "url", "widget_session_id", "expires_at" }and take precedence when both could apply.
transaction.created and transaction.status.updated webhook payloads (action_required) - see webhooks.
Cost breakdown
null until a billable feature ran for the transaction. Otherwise { "total_price", "items": [ { "usage_type", "price", "details" } ] }, one item per metered feature (screening, enrichment, and so on).
Currency conversion
preferred_currency_amount is amount converted to your application’s preferred currency at mid-market rates, unless you supplied amount_in_default_currency, in which case that pre-converted value is used as is. Rule conditions on amount compare the native amount; use preferred_currency_amount in conditions when you need one threshold across currencies.
Next steps
Submit transactions
Full request schema.
Statuses
What each status means.
Risk scoring
How score is computed.