Financial Events Screening
Evaluate a financial event and receive a fraud recommendation from the Payment Fraud Detection product.
POST https://api.fraudio.com/v2/financial-events/screening
Typical request
The request body is split into a main event and its associated entities.
The event may refer to multiple entities by their id.
Events and entities can also be sent via the Financial Events Enrichment endpoint, for cases where no immediate fraud rating is required.
{
"event": {
"type": "card_network_transaction",
"id": "a12c34def",
"timestamp": 1770000000.123,
"sender": { "refs": { "card": "c67876543" } },
"receiver": { "refs": { "merchant_business": "hotel-bristol", "merchant_account": "hotel-bristol-front" } },
"details": {
"mti": "0100",
"transaction_type": "purchase",
"currency": "EUR",
"currency_unit": "major",
"amount": 42.1,
"mcc": "7011"
}
},
"entities": [
{
"type": "card",
"id": "c67876543",
"card_token": "67876543",
"last_four_digits": "9876",
"expiry_date": "1127",
"refs": { "issuer": "b-450901", "cardholder": "c4rdh0ld" }
},
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com" },
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } },
{ "type": "issuer", "id": "b-450901", "bin": "450901", "name": "Example Issuer", "country_code": "PRT" }
]
}
Typical response
The response body is a fraud risk assessment informed by fraud rules and/or AI models. Depending on the source of the recommendation, more information may be present in the full response.
{
"score": 0.12,
"recommendation": "green"
}
Request structure
A request consists of a top-level event object and an entities array, as shown in the typical request above. The sections below describe variations on this structure.
Pre-registered entities
You can also send entity information separately from events. Register or update entities via the
Financial Events Enrichment
endpoint (entities-only payload), then omit entities from subsequent screening requests.
Restrictions:
- Entity references in events must be resolvable, i.e. match an entity sent prior to the event.
- Keep at least 2 seconds between an entity update and an event (e.g. between merchant registration and the first transaction).
PEP/sanctions check
The optional options.plugins field enables additional plugins to run alongside standard fraud screening.
- The plugin
"sanctions_cardholder"checks the cardholder against global sanctions lists. - The plugin
"pep_cardholder"checks the cardholder against Politically Exposed Persons lists.
These are per-transaction checks that make additional fields available for rules, and they may also return additional
information in the API response. For checks outside the transaction context, see event type due_diligence.
Product overview for KYC, KYB and PEP & Sanctions is available here.
Plugins incur additional per-event costs and may increase latency, as they rely on trusted external providers.
{
"event": {
"type": "card_network_transaction",
"id": "a12c34def",
"timestamp": 1770000000.123,
"sender": { "refs": { "card": "c67876543", "cardholder": "c4rdh0ld" } },
"receiver": { "refs": { "merchant_business": "hotel-bristol", "merchant_account": "hotel-bristol-front" } },
"details": {
"mti": "0100",
"transaction_type": "purchase",
"currency": "EUR",
"currency_unit": "major",
"amount": 42.1,
"mcc": "7011"
}
},
"entities": [
{
"type": "card",
"id": "c67876543",
"card_token": "67876543",
"last_four_digits": "9876",
"expiry_date": "1127",
"refs": { "issuer": "b-450901", "cardholder": "c4rdh0ld" }
},
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com", "country_code": "NLD" },
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } }
],
"options": {
"plugins": ["sanctions_cardholder", "pep_cardholder"]
}
}
{
"score": 0.12,
"recommendation": "green",
"plugins": {
"sanctions_cardholder": { "match": false },
"pep_cardholder": { "match": false }
}
}
Event types
Categorization
The event.type field on an event is its primary categorization. It determines what the event represents and which additional fields apply to it.
| Value | Description |
|---|---|
card_network_transaction | A card payment network message (authorization, capture, reversal, etc.). See MTI and transaction type below. |
wallet_transfer | A direct transfer between two wallets. |
wallet_card_enrollment | A card being linked to a wallet. |
merchant_registration | A merchant being registered with an acquirer. |
wallet_withdrawal | A withdrawal from a wallet to a bank account. |
wallet_deposit | A deposit from a bank account into a wallet. |
bank_transfer | A transfer between two bank accounts. |
dispute | A chargeback, TC40, SAFE, or other fraud notification linked to a prior transaction. |
due_diligence | A KYC or KYB checks of an individual or business with various risk intelligence sources. |
Note that event.details.mti and event.details.transaction_type are ISO 8583 protocol fields. ISO 8583 is the messaging standard used by card payment networks (Visa, Mastercard, and others) to represent authorization requests, financial messages, reversals, and their responses. These fields carry meaning that is specific to that protocol: mti identifies the message class and function, while transaction_type encodes the ISO 8583 DE003 processing code.
Events of type wallet_transfer, bank_transfer, dispute, and others represent financial flows that do not originate from the card payment network. They have no concept of an MTI or processing code. Their categorization is fully expressed by the type field, and direction is conveyed through sender and receiver.
mti: Message Type Indicator
Fraudio accepts either the readable string value or the raw 4-digit ISO 8583 MTI code:
| Readable value | MTI | Description |
|---|---|---|
authorization_request | 0100 | Authorization request |
authorization_response | 0110 | Authorization response |
financial_request | 0200 | Financial transaction (capture) request |
financial_response | 0210 | Financial transaction (capture) response |
reversal_request | 0400 | Reversal request |
reversal_response | 0410 | Reversal response |
reversal_advice | 0420 | Reversal advice (acquirer-initiated, no response expected) |
transaction_type: DE003 (Visa field 3) processing code
event.details.transaction_type corresponds to the first two digits of ISO 8583 DE003 (the processing code). The remaining digits of DE003 (account type from digits 3–4, account type to digits 5–6) are expressed as sender.account_type and receiver.account_type on the event.
For transaction_type, Fraudio accepts either the readable string value or the raw ISO 8583 DE003 code:
| Readable value | DE003 digits 1–2 | Description |
|---|---|---|
purchase | 00 | Goods and services purchase |
atm_withdrawal | 01 | ATM cash withdrawal |
refund | 20 | Refund / return |
oct | 26 | Original Credit Transaction (payout to card) |
pin_change | 94 | PIN change / unblock |
For processing codes not listed here, send the raw DE003 code directly.
Similarly, sender.account_type and receiver.account_type accept either a readable string or the raw DE003 subfield code:
| Value | DE003 subfield | Description |
|---|---|---|
default | 00 | Unspecified (most common for merchants) |
savings | 10 | Savings account |
checking | 20 | Checking / current account |
credit | 30 | Credit card account |
revolving_credit | 90 | Revolving credit account |
This endpoint accepts multiple event types using the same request structure.
Below are the most common event.type values and example payloads.
card_network_transaction (purchase auth)
Authorization request. Use MTI 0100 and transaction_type: "purchase". This is the most common event to score, as the fraud check typically happens at auth time. See Transaction types for the full mapping.
{
"event": {
"type": "card_network_transaction",
"id": "a12c34def",
"timestamp": 1770000000.123,
"lifecycle_rrn": "123456789012",
"sender": { "account_type": "credit", "refs": { "card": "c67876543", "shopper": "5h0pp3r" } },
"receiver": { "refs": { "merchant_business": "hotel-bristol", "merchant_account": "hotel-bristol-front", "acceptor": "terminal-zxcvb12" } },
"refs": { "gateway": "molley", "acquirer": "b-7610201" },
"details": {
"mti": "0100",
"transaction_type": "purchase",
"currency": "EUR",
"currency_unit": "major",
"amount": 42.1,
"mcc": "7011"
}
},
"entities": [
{
"type": "card",
"id": "c67876543",
"card_token": "67876543",
"card_type": "credit",
"last_four_digits": "9876",
"expiry_date": "1127",
"refs": { "issuer": "b-450901", "cardholder": "c4rdh0ld" }
},
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com" },
{ "type": "shopper", "id": "5h0pp3r", "name": "Catherine Solara", "email": "c.solara@example.com" },
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } },
{ "type": "acceptor", "id": "terminal-zxcvb12", "name": "Payment terminal 3", "make": "SumUp", "model": "Solo", "terminal_type": "cat9" },
{ "type": "acquirer", "id": "b-7610201", "bin": "7610201", "name": "Example Acquirer", "country_code": "PRT" },
{ "type": "gateway", "id": "molley", "name": "Molley Payment Gateway" },
{ "type": "issuer", "id": "b-450901", "bin": "450901", "name": "Example Issuer", "country_code": "PRT" }
]
}
card_network_transaction (authorization response post-auth)
For clients integrated post-authorization, the 0110 authorization response can be sent directly to this endpoint for screening. Use this when your fraud check happens after authorization, for example when you only have access to the response leg of the transaction.
Because no prior 0100 event exists in Fraudio's dataset, include the full transaction context: sender, receiver, and event.details.amount, event.details.currency, event.details.currency_unit. Link to the authorization request where possible using parent_event_id and/or lifecycle_rrn.
If you score the 0100 at authorization time, send the 0110 to the Financial Events Enrichment endpoint instead: sender, receiver, and event.details.amount, event.details.currency, event.details.currency_unit can be omitted there since they are established on the original event.
{
"event": {
"type": "card_network_transaction",
"id": "auth-resp-001",
"timestamp": 1770004000.123,
"sender": { "refs": { "card": "c67876543" } },
"receiver": { "refs": { "merchant_business": "hotel-bristol", "merchant_account": "hotel-bristol-front" } },
"refs": { "acquirer": "b-7610201" },
"details": {
"mti": "0110",
"transaction_type": "purchase",
"currency": "EUR",
"currency_unit": "major",
"amount": 42.1,
"response_code": "00",
"eci": "02",
"avs_result": "Y",
"cvv_result": "M",
"cavv_result": "2"
}
},
"entities": [
{
"type": "card",
"id": "c67876543",
"card_token": "67876543",
"last_four_digits": "9876",
"expiry_date": "1127",
"refs": { "issuer": "b-450901", "cardholder": "c4rdh0ld" }
},
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com" },
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } },
{ "type": "acquirer", "id": "b-7610201", "bin": "7610201", "name": "Example Acquirer", "country_code": "PRT" },
{ "type": "issuer", "id": "b-450901", "bin": "450901", "name": "Example Issuer", "country_code": "PRT" }
]
}
card_network_transaction (purchase capture)
Financial transaction completing a prior auth. Use MTI 0200 and transaction_type: "purchase". Link to the auth using lifecycle_rrn and parent_event_id.
{
"event": {
"type": "card_network_transaction",
"id": "b99f12abc",
"timestamp": 1770000300.456,
"lifecycle_rrn": "123456789012",
"parent_event_id": "a12c34def",
"sender": { "refs": { "card": "c67876543" } },
"receiver": { "refs": { "merchant_business": "hotel-bristol", "merchant_account": "hotel-bristol-front" } },
"refs": { "acquirer": "b-7610201" },
"details": {
"mti": "0200",
"transaction_type": "purchase",
"currency": "EUR",
"currency_unit": "major",
"amount": 42.1,
"mcc": "7011"
}
},
"entities": [
{ "type": "card", "id": "c67876543" },
{ "type": "merchant_business", "id": "hotel-bristol" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123" },
{ "type": "acquirer", "id": "b-7610201" }
]
}
card_network_transaction (refund)
Refund/return credited back to the cardholder. Use transaction_type: "refund". Most refunds are standalone financial messages (MTI 0200) with no prior auth. If your network requires a refund authorization cycle, send a 0100 first and then the 0200, both with transaction_type: "refund". Link to the original purchase using parent_event_id and/or lifecycle_rrn.
{
"event": {
"type": "card_network_transaction",
"id": "c55a99xyz",
"timestamp": 1770086400.000,
"lifecycle_rrn": "123456789012",
"parent_event_id": "a12c34def",
"sender": { "refs": { "merchant_business": "hotel-bristol", "merchant_account": "hotel-bristol-front" } },
"receiver": { "refs": { "card": "c67876543" } },
"refs": { "acquirer": "b-7610201" },
"details": {
"mti": "0200",
"transaction_type": "refund",
"currency": "EUR",
"currency_unit": "major",
"amount": 42.1,
"mcc": "7011"
}
},
"entities": [
{ "type": "merchant_business", "id": "hotel-bristol" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123" },
{ "type": "card", "id": "c67876543" },
{ "type": "acquirer", "id": "b-7610201" }
]
}
card_network_transaction (ATM withdrawal)
ATM cash withdrawals use transaction_type: "atm_withdrawal" and are sent as financial messages (MTI 0200). There is no counterparty receiving funds: the cardholder withdraws cash from their own account, so only sender is set, similar to a PIN change. The ATM terminal is contextual metadata referenced via refs. If your network performs an auth/financial cycle, send MTI 0100 first with the same transaction_type, then the 0200 linked via lifecycle_rrn.
{
"event": {
"type": "card_network_transaction",
"id": "atm-evt-001",
"timestamp": 1770090000.000,
"lifecycle_rrn": "234567890123",
"sender": { "refs": { "card": "c67876543" } },
"refs": { "acquirer": "b-7610201", "acceptor": "atm-terminal-001" },
"details": {
"mti": "0200",
"transaction_type": "atm_withdrawal",
"currency": "EUR",
"currency_unit": "major",
"amount": 200.00
}
},
"entities": [
{ "type": "card", "id": "c67876543" },
{ "type": "acceptor", "id": "atm-terminal-001", "name": "Example Bank ATM", "country_code": "NLD", "terminal_type": "cat1" },
{ "type": "acquirer", "id": "b-7610201" }
]
}
card_network_transaction (PIN change)
PIN changes have an ISO-8583 DE003 processing code. Although it is not a fund transfer like most other transactions,
it still has event type card_network_transaction with transaction_type: "pin_change". Note that there is no receiver.
For events like these, the sender property denotes who initiated the transaction.
{
"event": {
"type": "card_network_transaction",
"id": "pin-evt-001",
"timestamp": 1770000123.456,
"sender": { "refs": { "card": "c67876543" } },
"details": {
"mti": "0200",
"transaction_type": "pin_change"
}
},
"entities": [
{
"type": "card",
"id": "c67876543",
"card_token": "67876543",
"last_four_digits": "9876",
"expiry_date": "1127",
"refs": { "issuer": "b-450901", "cardholder": "c4rdh0ld" }
},
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com" },
{ "type": "issuer", "id": "b-450901", "bin": "450901", "name": "Example Issuer", "country_code": "PRT" }
]
}
wallet_transfer (direct wallet-to-wallet)
Use this for direct wallet-to-wallet transfers. The wallet is the instrument, but the actual party may be a linked card, merchant, or cardholder. Include that entity in sender.refs/receiver.refs alongside the wallet when funds move from or to a specific linked account rather than the wallet balance itself.
Sometimes, a single transfer is represented by two records (a sending and receiving transaction, e.g. when migrating from v1/transactions/inter-account-transfers). In this case, use the sender-side ID as the event id and carry the receiver-side ID in event.details.sister_transaction_id.
{
"event": {
"type": "wallet_transfer",
"id": "cd99e97e-bb58-4148-caed-af26effefffd",
"timestamp": 1770001000,
"lifecycle_rrn": "123456789012",
"sender": { "refs": { "wallet": "wallet-111", "card": "c67876543" } },
"receiver": { "refs": { "wallet": "wallet-222" } },
"details": {
"sister_transaction_id": "d6a7b747-474f-bc95-98da-72b01855ba5b",
"currency": "EUR",
"currency_unit": "major",
"amount": 125.5
}
},
"entities": [
{ "type": "wallet", "id": "wallet-111" },
{ "type": "card", "id": "c67876543" },
{ "type": "wallet", "id": "wallet-222", "refs": { "merchant_business": "hotel-bristol" } },
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } }
]
}
wallet_card_enrollment (enrolling a card to a wallet)
Use this for linking cards to wallets. Note that there is no "receiver", since the event is not related to the movement of funds.
{
"event": {
"type": "wallet_card_enrollment",
"id": "reg-evt-001",
"timestamp": 1770002000,
"sender": { "refs": { "card": "c67876543", "wallet": "wlt-001" } }
},
"entities": [
{
"type": "card",
"id": "c67876543",
"card_token": "67876543",
"last_four_digits": "9876",
"expiry_date": "1127",
"refs": { "issuer": "b-450901", "cardholder": "c4rdh0ld" }
},
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com" },
{ "type": "issuer", "id": "b-450901", "bin": "450901", "name": "Example Issuer", "country_code": "PRT" },
{ "type": "wallet", "id": "wlt-001" }
]
}
merchant_registration (registering a merchant with an acquirer)
Use this when a merchant is onboarded or registered with an acquirer.
The registration is the event; send the merchant_business and the merchant_account as associated entities.
Registered MCCs belong on the merchant_account. Note that there is no receiver, since the event is not related to the movement of funds.
{
"event": {
"type": "merchant_registration",
"id": "merch-reg-001",
"timestamp": 1770002500,
"sender": { "refs": { "merchant_business": "hotel-bristol", "merchant_account": "hotel-bristol-front", "acquirer": "b-7610201" } }
},
"entities": [
{
"type": "merchant_business",
"id": "hotel-bristol",
"name": "Hotel Bristol B.V.",
"email": "support@hotelbristol.example",
"url": "www.hotelbristol.example",
"country_code": "NLD",
"city": "Amsterdam",
"registered_timestamp": 1770002500
},
{
"type": "merchant_account",
"id": "hotel-bristol-front",
"mid": "8842101000123",
"mccs": ["7011"],
"refs": { "merchant_business": "hotel-bristol", "acquirer": "b-7610201" }
},
{
"type": "acquirer",
"id": "b-7610201",
"bin": "7610201",
"name": "Example Acquirer",
"country_code": "PRT"
}
]
}
due_diligence (KYC / KYB checks)
Use this event type to retrieve identity or business information about a customer or business from trusted external providers. Unlike the "sanctions_cardholder" and "pep_cardholder" plugins on a card_network_transaction event, which check the parties involved in a specific payment, due_diligence is a standalone request focused on understanding who an entity is, rather than what they are doing. It can be sent at onboarding or at any later point, including periodic or event-driven reviews such as a significant change in merchant volume or industry.
For due diligence checks, sender is the entity being assessed. The plugins field specifies which type of due diligence to perform: use "kyc_cardholder" for individuals (e.g. a cardholder) and "kyb_merchant" for businesses (e.g. a merchant_business). Additional due diligence types may be supported in future plugins.
Product-level documentation for KYC, KYB and PEP & Sanctions is available here.
KYC and KYB responses have different shapes, reflecting how external providers work in practice:
- KYC providers verify an identity claim and return a clear outcome: whether the individual was found and whether the check passed. The response includes
matchandstatusfields. - KYB providers primarily return raw business information — registration details, directors, ownership structure — without a pass/fail assessment. The response is a
detailspayload only.
Plugins incur additional per-event costs and may increase latency, as they rely on trusted external providers.
{
"event": {
"type": "due_diligence",
"id": "dd-evt-001",
"timestamp": 1770003000,
"sender": { "refs": { "cardholder": "c4rdh0ld" } }
},
"entities": [
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com", "country_code": "NLD" }
],
"options": {
"plugins": ["kyc_cardholder"]
}
}
{
"score": 0.12,
"recommendation": "green",
"plugins": {
"kyc_cardholder": {
"match": true,
"status": "refer",
"full_name": "Ferdinand Solara",
"date_of_birth": "1985-06-15",
"nationality": "NLD",
"address": "Damrak 1, 1011 AB Amsterdam, NL",
"document_type": "passport",
"document_number": "NL1234567",
"document_expiry": "2030-06-14"
}
}
}
{
"event": {
"type": "due_diligence",
"id": "dd-evt-002",
"timestamp": 1770003000,
"sender": { "refs": { "merchant_business": "hotel-bristol" } }
},
"entities": [
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" }
],
"options": {
"plugins": ["kyb_merchant"]
}
}
{
"score": 0.12,
"recommendation": "green",
"plugins": {
"kyb_merchant": {
"details": {
"legal_name": "Hotel Bristol B.V.",
"registration_number": "12345678",
"registration_date": "2015-03-12",
"status": "active",
"company_type": "BV",
"country_code": "NLD",
"registered_address": "Damrak 1, 1011 AB Amsterdam, NL",
"industry_codes": ["7011"],
"directors": [
{ "name": "Jane Doe", "role": "director", "appointed_date": "2015-03-12" }
],
"ubos": [
{ "name": "Jane Doe", "ownership_percentage": 100 }
]
}
}
}
}
Entity types
A request can include entity snapshots or partial updates in the entities array. Each entity must have a type and a
stable id. Note that entity IDs are expected to be unique. If there is no pre-existing entity ID, you can often use a
natural key (e.g. card_token), a deterministic hash, or even a composite natural key to identify an entity
(e.g. <device_make>-<device_model>-<device_serial_code>).
The following entity types are supported.
card: A payment card entity (or tokenized representation).card_group: A proxy identifier used when a unique per-card ID is not available. See Card groups below.cardholder: The cardholder entity (person or account holder).shopper: The shopper/payer (can differ from the cardholder).merchant_business: The merchant business (legal/commercial entity that sells). See Merchant business below.merchant_account: A merchant account with an acquiring relationship; carries the processor-assignedmid. See Merchant account below.sub_merchant: A sponsored merchant that processes under a Payment Facilitator. See Sub-merchant below.acceptor: The accepting device/terminal entity.wallet: A wallet entity (for wallet-to-wallet transfers or card registrations).bank_account: A bank account entity (IBAN or equivalent).issuer: Issuing bank/entity.acquirer: Acquiring bank/entity. See Acquirer below.merchant_service_provider: An Independent Sales Organisation (ISO) or similar intermediary that manages the merchant account. See Merchant Service Provider below.payfac: A Payment Facilitator that aggregates sub-merchants under a master merchant account. See Payment Facilitator below.ubo: The Ultimate Beneficial Owner of the merchant. See UBO below.gateway: Payment gateway/intermediary.
Merchant category codes (MCCs) are modelled as follows:
- Assigned / registered MCCs live on the account-like entity:
merchant_account(direct account) orsub_merchant(PayFac-sponsored seller), viamccs. - As-processed MCC for a specific payment lives on the event, via
event.details.mcc(orevents[].details.mccon enrichment). - Do not put
mccson themerchant_businessentity. One business can hold severalmerchant_accounts, each with its own MCC(s).
Merchant business
A merchant_business entity represents the merchant business: the legal or commercial party that sells goods or services. It carries descriptive and risk-relevant attributes such as name, country of registration, KYC level, and limit profile.
A single merchant_business can have multiple merchant_account entities, for example hotel-bristol-front (front desk / lodging) and hotel-bristol-resto (hotel restaurant). Registered MCCs belong on those account entities (or on a sub_merchant under a PayFac), not on the business itself.
merchant_business entities can be sent as full snapshots alongside a transaction, or as standalone partial updates whenever attributes change, for example when a merchant is onboarded or its limit profile is updated.
Example:
{
"entities": [
{
"type": "merchant_business",
"id": "hotel-bristol",
"name": "Hotel Bristol B.V.",
"email": "support@hotelbristol.example",
"url": "www.hotelbristol.example",
"ip": "34.231.107.3",
"country_code": "NLD",
"city": "Amsterdam",
"state_code": "NH",
"postal_code": "1011 AB",
"street_address": "Damrak 1",
"geo_coordinates": "+52.3676+004.9041/",
"limit_profile": "2000",
"kyc_level": "3",
"kyc_level_norm": 0.6,
"ocpt_enabled": true,
"turnover": 50000,
"registered_timestamp": 1760000000,
"refs": {
"wallet": "wlt-hotel-bristol",
"ubo": "ubo-jdoe"
}
}
]
}
Card groups
Card references are usually explicit. If you have a stable per-card identifier, use event.sender.refs.card. If you do not (which can be the case for some clients), you can use event.sender.refs.card_group as a proxy.
- Meaning: A
card_grouprepresents a group of cards that share context when you cannot uniquely identify a single card. - Limitations:
- Not unique per card (context is shared across cards in the group)
- No additional entity attributes should be sent on
card_group(e.g. there is no single cardholder) - An ID for the group is still required. If you do not have one, take a collision-resistant hash of the BIN, last 4 digits and expiry date.
Example using card_group:
{
"event": {
"type": "card_network_transaction",
"id": "a12c34def",
"timestamp": 1770000000.123,
"sender": {
"refs": {
"card_group": "2178912839821380189023190"
}
},
"receiver": {
"refs": {
"merchant_business": "hotel-bristol"
}
},
"details": {
"currency": "EUR",
"currency_unit": "major",
"amount": 42.1,
"mcc": "7011"
}
},
"entities": [
{
"type": "card_group",
"id": "2178912839821380189023190",
"bin": "7610201",
"expiry_date": "1127",
"last_four_digits": "9876"
}
]
}
Acquirer
An acquirer entity represents the acquiring bank or payment processor that settles card payments on behalf of a merchant account. When sending account information that includes acquirer details, those fields should be sent as a separate acquirer entity and referenced from the merchant_account (or from a sub_merchant / payfac relationship) via refs.acquirer.
Example:
{
"entities": [
{
"type": "acquirer",
"id": "acquirer-x",
"name": "Acquirer X",
"country_code": "BEL"
}
]
}
Merchant account
A merchant_account entity represents a merchant account: the acquiring relationship under which card payments are processed. The processor- or acquirer-assigned Merchant ID is the mid property on this entity; it is not a separate entity type and does not uniquely identify the merchant business. A single merchant_business can have multiple merchant_account entities (for example one for front desk / lodging and one for the hotel restaurant).
Registered / assigned MCCs for that account belong here as mccs (typically the primary MCC for the account; additional codes only when the account is legitimately multi-MCC). The MCC that rode on a specific payment belongs on the transaction as details.mcc.
Reference a merchant_account from events with sender.refs.merchant_account / receiver.refs.merchant_account, and link it to the business with refs.merchant_business. Acquirer, merchant service provider, and related account parties are usually referenced from the merchant_account as well.
Example (one business, two accounts):
{
"entities": [
{
"type": "merchant_business",
"id": "hotel-bristol",
"name": "Hotel Bristol B.V.",
"country_code": "NLD"
},
{
"type": "merchant_account",
"id": "hotel-bristol-front",
"mid": "8842101000123",
"mccs": ["7011"],
"refs": {
"merchant_business": "hotel-bristol",
"acquirer": "acquirer-x",
"merchant_service_provider": "msp-abc"
}
},
{
"type": "merchant_account",
"id": "hotel-bristol-resto",
"mid": "8842101000456",
"mccs": ["5812"],
"refs": {
"merchant_business": "hotel-bristol",
"acquirer": "acquirer-x"
}
}
]
}
Sub-merchant
A sub_merchant entity represents a sponsored merchant that accepts payments under a Payment Facilitator (payfac) rather than under its own direct merchant account. Traffic typically clears under the PayFac's master MID; the sub-merchant is identified separately for network reporting, chargebacks, and risk.
Registered / assigned MCCs for the sponsored seller belong here as mccs. The MCC used on a specific payment still belongs on the transaction as details.mcc.
Reference a sub_merchant from events with sender.refs.sub_merchant / receiver.refs.sub_merchant, and link it to the PayFac (and optionally the merchant business) via refs.
Example:
{
"entities": [
{
"type": "merchant_business",
"id": "bloom-florist-bv",
"name": "Bloom Florist B.V.",
"country_code": "NLD"
},
{
"type": "sub_merchant",
"id": "bloom-florist",
"name": "Bloom Florist",
"country_code": "NLD",
"mccs": ["5992"],
"refs": {
"payfac": "payfac-xyz",
"merchant_business": "bloom-florist-bv"
}
}
]
}
Merchant Service Provider
A merchant_service_provider entity represents an Independent Sales Organisation (ISO) or similar intermediary that manages the merchant account on behalf of the acquiring bank.
Example:
{
"entities": [
{
"type": "merchant_service_provider",
"id": "msp-abc",
"name": "ABC Sales Organisation",
"country_code": "NLD"
}
]
}
Payment Facilitator
A payfac entity represents a Payment Facilitator: an organisation that onboards and aggregates sponsored sellers (sub_merchant) under its own master merchant_account with an acquirer. The PayFac typically holds that master account (with its own mid); sub-merchants do not each receive a bank-issued MID.
Example:
{
"entities": [
{
"type": "payfac",
"id": "payfac-xyz",
"name": "XYZ Payment Facilitator",
"country_code": "DEU",
"refs": {
"acquirer": "acquirer-x",
"merchant_account": "payfac-xyz-master"
}
},
{
"type": "merchant_account",
"id": "payfac-xyz-master",
"mid": "PFAC000991122",
"refs": {
"acquirer": "acquirer-x"
}
}
]
}
UBO
A ubo entity represents the Ultimate Beneficial Owner - the individual who is registered as the owner of the merchant account.
Example:
{
"entities": [
{
"type": "ubo",
"id": "ubo-jdoe",
"name": "Jane Doe",
"email": "jane.doe@example.com",
"phone_number": "+31612345678",
"country_code": "NLD",
"street_address": "Keizersgracht 123, Amsterdam"
}
]
}
Partial entity updates
Entities can be sent either as full snapshots or as partial updates.
- Partial update: send
type+id, plus only the fields that changed. - Unspecified fields: treated as unchanged.
- Clearing a field: send it as
null.
Example (partial update clearing a merchant limit_profile):
{
"entities": [
{
"type": "merchant_business",
"id": "hotel-bristol",
"limit_profile": null
}
]
}
Plugins and workflows
Supported plugins
Plugins are normally provided as a simple list in the request field options.plugins.
{
"event": {...}
"options": {
"plugins": ["pep_cardholder"]
}
}
The following plugins are supported.
- kyb_merchant: Know Your Business (KYB) check for a merchant.
- kyc_cardholder: Know Your Customer (KYC) check for a cardholder.
- pep_cardholder: Politically Exposed Person (PEP) check for a cardholder.
- pep_ubo: Politically Exposed Person (PEP) check for an ultimate business owner (UBO).
- sanctions_cardholder: Sanctions check for a cardholder.
- sanctions_ubo: Sanctions check for an ultimate business owner (UBO).
Workflows
Some checks may use multiple plugins, where one plugin is a prerequisite for another.
For example, a kyb_merchant check followed by a pep_ubo check on the business owner. In these cases, you can use the optional
options.workflow field instead of the options.plugins field. Each workflow step must provide a list of dependencies,
and they are executed in that order. Whenever possible, the steps are executed in parallel to minimize latency.
Workflows may not have circular dependencies. If they do occur, the workflow is invalid and no plugins are executed.
{
"event": {
"type": "due_diligence",
"id": "dd-evt-002",
"timestamp": 1770003000,
"sender": { "refs": { "merchant_business": "hotel-bristol" } }
},
"entities": [
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" }
],
"options": {
"workflow": {
"kyb_merchant": [],
"pep_ubo": ["kyb_merchant"]
}
}
}
{
"score": 0.12,
"recommendation": "green",
"plugins": {
"kyb_merchant": {
"details": {
"legal_name": "Hotel Bristol B.V.",
"registration_number": "12345678",
"registration_date": "2015-03-12",
"status": "active",
"company_type": "BV",
"country_code": "NLD",
"registered_address": "Damrak 1, 1011 AB Amsterdam, NL",
"industry_codes": ["7011"],
"directors": [
{ "name": "Jane Doe", "role": "director", "appointed_date": "2015-03-12" }
],
"ubos": [
{ "name": "Jane Doe", "ownership_percentage": 100 }
]
}
},
"pep_ubo": { "match": false }
}
}
Fields reference table
| Field | Data Type | Payment Fraud (Issuer) | Payment Fraud (Acquirer / Processor) | Merchant Fraud / AML | Description |
|---|---|---|---|---|---|
| event.type | String | Required | Required | Required | Event type. For payment fraud scoring use types such as card_network_transaction. For standalone KYC/KYB use due_diligence. PEP/sanctions plugins can run on card_network_transaction (parties in the payment) or on due_diligence / workflow steps. |
| event.id | String | Required | Required | Required | Unique identifier of the event. |
| event.timestamp | Double | Required | Required | Required | UTC time of the event as a Unix timestamp (seconds; may be fractional). |
| event.lifecycle_rrn | String | Optional | Optional | Optional | Lifecycle identifier shared across chained transactions (RRN). |
| event.parent_event_id | String | Optional | Optional | Optional | Direct parent transaction/event ID for chained events (backwards compatibility). |
| event.details.mti | String | Optional | Optional | Optional | ISO 8583 MTI when applicable. |
| event.details.transaction_type | String | Optional | Optional | Optional | ISO 8583 DE003 transaction type when applicable. |
| event.details.currency | String | Optional | Optional | Optional | 3-digit ISO currency code. |
| event.details.currency_unit | String | Optional | Optional | Optional | major or minor. |
| event.details.amount | Double | Optional | Optional | Optional | Amount in the currency and unit provided. |
| event.details.response_code | String | Optional | Optional | Optional | Authorization or financial response code from the issuer/network (for example ISO 8583 DE039). Typical on 0110 / post-auth events. |
| event.details.eci | String | Optional | Optional | Optional | Electronic Commerce Indicator from 3-D Secure or equivalent authentication. |
| event.details.avs_result | String | Optional | Optional | Optional | Address Verification System (AVS) result code. |
| event.details.cvv_result | String | Optional | Optional | Optional | Card verification value (CVV/CVC) check result. |
| event.details.cavv_result | String | Optional | Optional | Optional | Cardholder Authentication Verification Value (CAVV) or equivalent authentication result. |
| event.details.sister_transaction_id | String | Optional | Optional | Optional | ID of the counterpart record for the same transfer, used when a single transfer is represented by two records (e.g. one per side). When migrating from v1/transactions/inter-account-transfers, map receiver_transactionid here. |
| event.details.pos_entry_mode | String | Optional | Optional | Optional | ISO POS entry mode when applicable. |
| event.details.pos_condition_code | String | Optional | Optional | Optional | ISO POS condition code when applicable. |
| event.details.mcc | String | Optional | Optional | Optional | Merchant category code as processed on this event/transaction. Distinct from registered MCCs on a merchant_account or sub_merchant entity. |
| event.sender.refs.card | String | Optional | Optional | Optional | Reference to a card entity when available. |
| event.sender.refs.card_group | String | Optional | Optional | Optional | Reference to a card_group proxy when no unique card ID is available. |
| event.sender.refs.shopper | String | Optional | Optional | Optional | Reference to a shopper entity when applicable. |
| event.sender.refs.wallet | String | Optional | Optional | Optional | Reference to a wallet entity when applicable. |
| event.sender.ip | String | Optional | Optional | Optional | Sender IP address when applicable. |
| event.sender.geocoordinates | String | Optional | Optional | Optional | Sender geocoordinates. |
| event.receiver.refs.merchant_business | String | Optional | Optional | Optional | Reference to a merchant_business entity when applicable. |
| event.receiver.refs.merchant_account | String | Optional | Optional | Optional | Reference to a merchant_account entity when applicable. |
| event.receiver.refs.sub_merchant | String | Optional | Optional | Optional | Reference to a sub_merchant entity when the seller processes under a Payment Facilitator. |
| event.receiver.refs.acceptor | String | Optional | Optional | Optional | Reference to an acceptor (terminal/device) entity when applicable. |
| event.receiver.refs.wallet | String | Optional | Optional | Optional | Reference to a wallet entity when applicable. |
| event.receiver.ip | String | Optional | Optional | Optional | Receiver IP address when applicable. |
| event.receiver.geocoordinates | String | Optional | Optional | Optional | Receiver geocoordinates. |
| event.refs.gateway | String | Optional | Optional | Optional | Reference to the payment gateway (intermediary). |
| event.refs.acquirer | String | Optional | Optional | Optional | Reference to the acquirer (intermediary). |
| entities[] | Array | Optional | Optional | Optional | Optional entity objects included alongside the event. |
| entities[].type | String | Optional | Optional | Optional | Entity type, e.g. card, card_group, merchant_business, merchant_account, sub_merchant, wallet, acceptor, issuer, acquirer, payfac, gateway, cardholder, shopper. |
| entities[].id | String | Optional | Optional | Optional | Stable entity identifier. |
| entities[].refs | Object | Optional | Optional | Optional | Optional nested references to other entities. |
| entities[].card_token | String | Optional | Optional | Optional | Card token when sending full card entity. |
| entities[].last_four_digits | String | Optional | Optional | Optional | Last 4 digits when sending full card entity. |
| entities[].expiry_date | String | Optional | Optional | Optional | Expiry date when sending full card entity. |
| entities[].registered_on | Double | Optional | Optional | Optional | Registration timestamp for merchant when available. |
| entities[].limitprofile | String | Optional | Optional | Optional | Merchant limit profile when available. |
| entities[].mccs | Array | Optional | Optional | Optional | Registered / assigned MCC list on a merchant_account or sub_merchant entity. Do not send on merchant_business; use event.details.mcc for the as-processed code on a transaction. |
| entities[].mid | String | Optional | Optional | Optional | Processor- or acquirer-assigned Merchant ID on a merchant_account entity. |
| entities[].terminal_type | String | Optional | Optional | Optional | Cardholder-Activated Terminal (CAT) type on an acceptor entity (e.g. cat1, cat2, cat6, cat9). |
| entities[].bin | String | Optional | Optional | Optional | BIN for issuer/acquirer entities when available. |
| entities[].country_code | String | Optional | Optional | Optional | Country code for issuer/acquirer/merchant when available. |
Response codes
| Status Code | Status Message | Description | Schema |
|---|---|---|---|
200 | OK | Standard response for successful HTTP requests. | 200 OK - Screening response |
4xx, 500, 501, 502, 503, 504 | error | Various error messages for unsuccessful HTTP requests. | Problem response |
Code samples
- Shell
- Python
- Java
- Perl
- PHP
curl -X POST 'https://api.fraudio.com/v2/financial-events/screening' \
-H 'Content-Type: application/json' \
-H "authorization: Bearer $ACCESS_TOKEN" \
--data-raw '{
"event": {
"type": "card_network_transaction",
"id": "a12c34def",
"timestamp": 1770000000.123,
"sender": { "refs": { "card": "c67876543" } },
"receiver": { "refs": { "merchant_business": "hotel-bristol" } },
"details": { "mti": "0100", "transaction_type": "purchase", "currency": "EUR", "currency_unit": "major", "amount": 42.1 }
},
"entities": [
{ "type": "card", "id": "c67876543", "card_token": "67876543", "last_four_digits": "9876", "expiry_date": "1127", "refs": { "issuer": "b-450901", "cardholder": "c4rdh0ld" } },
{ "type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com" },
{ "type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD" },
{ "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } },
{ "type": "issuer", "id": "b-450901", "bin": "450901", "name": "Example Issuer", "country_code": "PRT" }
]
}'
import json
import os
import requests
financial_events_screening_endpoint = "https://api.fraudio.com/v2/financial-events/screening"
access_token = os.environ["ACCESS_TOKEN"]
transaction = {
"event": {
"type": "card_network_transaction",
"id": "a12c34def",
"timestamp": 1770000000.123,
"sender": {"refs": {"card": "c67876543"}},
"receiver": {"refs": {"merchant_business": "hotel-bristol"}},
"details": {"mti": "0100", "transaction_type": "purchase", "currency": "EUR", "currency_unit": "major", "amount": 42.1},
},
"entities": [
{"type": "card", "id": "c67876543", "card_token": "67876543", "last_four_digits": "9876", "expiry_date": "1127", "refs": {"issuer": "b-450901", "cardholder": "c4rdh0ld"}},
{"type": "cardholder", "id": "c4rdh0ld", "name": "Ferdinand Solara", "email": "f.solara@example.com"},
{"type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD"}, { "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } },
{"type": "issuer", "id": "b-450901", "bin": "450901", "name": "Example Issuer", "country_code": "PRT"},
],
}
headers = {
"authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
}
r = requests.post(financial_events_screening_endpoint, headers=headers, data=json.dumps(transaction))
print(r.json())
package com.fraudio;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class FinancialEventsScreening {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
String financialEventsScreeningEndpoint = "https://api.fraudio.com/v2/financial-events/screening";
String accessToken = System.getenv("ACCESS_TOKEN");
String transaction = "{\"event\":{\"type\":\"card_network_transaction\",\"id\":\"a12c34def\",\"timestamp\":1770000000.123,\"sender\":{\"refs\":{\"card\":\"c67876543\"}},\"receiver\":{\"refs\":{\"merchant_business\":\"hotel-bristol\"}},\"details\":{\"mti\":\"0100\",\"transaction_type\":\"purchase\",\"currency\":\"EUR\",\"currency_unit\":\"major\",\"amount\":42.1,\"mcc\":\"7011\"}},\"entities\":[{\"type\":\"card\",\"id\":\"c67876543\",\"card_token\":\"67876543\",\"last_four_digits\":\"9876\",\"expiry_date\":\"1127\",\"refs\":{\"issuer\":\"b-450901\",\"cardholder\":\"c4rdh0ld\"}},{\"type\":\"cardholder\",\"id\":\"c4rdh0ld\",\"name\":\"Ferdinand Solara\",\"email\":\"f.solara@example.com\"},{\"type\":\"merchant_business\",\"id\":\"hotel-bristol\",\"name\":\"Hotel Bristol B.V.\",\"country_code\":\"NLD\"},{\"type\":\"merchant_account\",\"id\":\"hotel-bristol-front\",\"mid\":\"8842101000123\",\"mccs\":[\"7011\"],\"refs\":{\"merchant_business\":\"hotel-bristol\"}},{\"type\":\"issuer\",\"id\":\"b-450901\",\"bin\":\"450901\",\"name\":\"Example Issuer\",\"country_code\":\"PRT\"}]}";
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI(financialEventsScreeningEndpoint))
.header("authorization", String.format("Bearer %s", accessToken))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(transaction))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse < String > response = client.send(request, HttpResponse.BodyHandlers.ofString());
String responseBody = response.body();
System.out.println("Response Code: " + response.statusCode() + "\nResponse Body: " + responseBody);
}
}
use LWP::UserAgent;
use HTTP::Request::Common;
my $financial_events_screening_endpoint = 'https://api.fraudio.com/v2/financial-events/screening';
my $access_token = $ENV{"ACCESS_TOKEN"};
my $transaction = '{"event":{"type":"card_network_transaction","id":"a12c34def","timestamp":1770000000.123,"sender":{"refs": {"card":"c67876543"}},"receiver":{"refs": {"merchant_business":"hotel-bristol"}},"details":{"mti":"0100","transaction_type":"purchase","currency":"EUR","currency_unit":"major","amount":42.1}},"entities":[{"type":"card","id":"c67876543","card_token":"67876543","last_four_digits":"9876","expiry_date":"1127","refs": {"issuer":"b-450901","cardholder":"c4rdh0ld"}},{"type":"cardholder","id":"c4rdh0ld","name":"Ferdinand Solara","email":"f.solara@example.com"},{"type": "merchant_business", "id": "hotel-bristol", "name": "Hotel Bristol B.V.", "country_code": "NLD"}, { "type": "merchant_account", "id": "hotel-bristol-front", "mid": "8842101000123", "mccs": ["7011"], "refs": { "merchant_business": "hotel-bristol" } },{"type":"issuer","id":"b-450901","bin":"450901","name":"Example Issuer","country_code":"PRT"}]}';
my $req = HTTP::Request -> new(POST => $financial_events_screening_endpoint);
$req -> header('authorization' => "Bearer $access_token", "Content-Type" => "application/json");
$req -> content($transaction);
my $ua = LWP::UserAgent -> new;
my $resp = $ua -> request($req);
my $message = $resp -> decoded_content;
print "Received reply: $message";
<?php
$financial_events_screening_endpoint = "https://api.fraudio.com/v2/financial-events/screening";
$access_token = $_SERVER["ACCESS_TOKEN"];
$transaction =
"{\"event\":{\"type\":\"card_network_transaction\",\"id\":\"a12c34def\",\"timestamp\":1770000000.123,\"sender\":{\"refs\":{\"card\":\"c67876543\"}},\"receiver\":{\"refs\":{\"merchant_business\":\"hotel-bristol\"}},\"details\":{\"mti\":\"0100\",\"transaction_type\":\"purchase\",\"currency\":\"EUR\",\"currency_unit\":\"major\",\"amount\":42.1,\"mcc\":\"7011\"}},\"entities\":[{\"type\":\"card\",\"id\":\"c67876543\",\"card_token\":\"67876543\",\"last_four_digits\":\"9876\",\"expiry_date\":\"1127\",\"refs\":{\"issuer\":\"b-450901\",\"cardholder\":\"c4rdh0ld\"}},{\"type\":\"cardholder\",\"id\":\"c4rdh0ld\",\"name\":\"Ferdinand Solara\",\"email\":\"f.solara@example.com\"},{\"type\":\"merchant_business\",\"id\":\"hotel-bristol\",\"name\":\"Hotel Bristol B.V.\",\"country_code\":\"NLD\"},{\"type\":\"merchant_account\",\"id\":\"hotel-bristol-front\",\"mid\":\"8842101000123\",\"mccs\":[\"7011\"],\"refs\":{\"merchant_business\":\"hotel-bristol\"}},{\"type\":\"issuer\",\"id\":\"b-450901\",\"bin\":\"450901\",\"name\":\"Example Issuer\",\"country_code\":\"PRT\"}]}";
$options = [
"http" => [
"header" =>
"authorization: Bearer $access_token" .
"Content-Type: application/json",
"method" => "POST",
"content" => $transaction,
],
];
$context = stream_context_create($options);
$result = file_get_contents($financial_events_screening_endpoint, false, $context);
print $result;
?>