Skip to Content
B2C APITransaction Endpoints

Transaction Screening

Screen transaction risk levels and process payments.

User onboarding

Submit Transaction

Process a new transaction and receive an immediate risk assessment. This endpoint handles various payment methods including bank transfers, card payments, and cryptocurrency transactions.

Endpoint

POST /v1/transaction

Request Schema

FieldTypeRequiredDescription
idstringYesUnique transaction identifier
userIdstringConditionalUser identifier. Omit if the user field is used. One of userId or user is required
userobjectConditionalComplete User object. Omit if the userId field is used. One of userId or user is required. The User can be sent via the /user endpoint, or using this field
accountIdstringNoAccount identifier associated with user
statusenumYesTransaction status: PENDING, APPROVED, DECLINED, BLOCKED, FAILED, CANCELED, ABANDONED, CHARGEBACK
currencyCodestringYesISO 4217 currency code
amountnumberYesTransaction amount in specified currency
timestampnumberYesUnix epoch milliseconds. Must not be in the future, and must be within the last year
userDeviceIdstring | nullNoUnique device identifier, if userDevice is sent via the /userDevice endpoint, simply refer to it’s id. Must not be sent together with userDevice. Accepts an explicit null
userDeviceobjectNoComplete user device information, if not sent via /userDevice endpoint. Must not be sent together with userDeviceId
directionenumNoPayment direction: payin, payout
actionTypestringNoTransaction type: topup, withdrawal, transfer, deposit
providerstringNoPayment method provider (e.g., onafriq, stripe)
paymentMethodenumNoPayment method: crypto, wallet, bank, card, cash, vas, ewa
sourcestringNoSource of funds (e.g., savings, checking)
externalIdstringNoExternal reference ID for transaction
flowstringNoYour own label for the flow this transaction belongs to, available to rules
merchantIdstringNoMerchant identifier, where the transaction involves a merchant. Must not be sent together with merchant
merchantobjectNoComplete Merchant object. Must not be sent together with merchantId. The Merchant can be sent via the /merchant endpoint, or using this field
terminalIdstringNoTerminal identifier, where the transaction originated at a terminal
billingAddressobjectNoBilling address information, see Address Schema
recipientobjectNoDetails when a single recipient differs from the sender. Must not be sent together with recipients
recipientsarrayNoArray of recipient objects, for transactions paying out to more than one party. Must not be sent together with recipient

Payment Method Details

When paymentMethod is set, the matching object below must be present, otherwise the request is rejected:

FieldTypeDescription
bankobjectBank payment details
cardobjectCard payment details
cryptoobjectCryptocurrency payment details
walletobjectDigital wallet payment details
cashobjectCash payment details
ewaobjectEarned Wage Advance (EWA) payment details
vasobjectValue Added Services (VAS) payment details

The details specific to each payment method can be found in the Payment Method Schemas section below.

Recipient Details

There is also a recipient object which is only necessary if the recipient is different from the originating user

When sending funds to another party, include recipient information:

A recipient accepts every field of the User Schemaid, firstName, lastName, dateOfBirth, address, phone, email, documents, kycDetail, amlDetail and the rest, all optional — plus the recipient-specific fields below. Recipient identity and KYC data feeds counterparty rules, so send what you have.

FieldTypeDescription
recipient.idstringRecipient identifier
recipient.amountnumberAmount for this recipient, where it differs from the transaction amount. Useful with recipients
recipient.currencyCodestringISO 4217 currency code for this recipient, where it differs from the transaction currency
recipient.paymentMethodenumRecipient payment method: crypto, wallet, bank, card, cash, vas, ewa
recipient.bankobjectRecipient bank details
recipient.cardobjectRecipient card details
recipient.cryptoobjectRecipient crypto details
recipient.walletobjectRecipient wallet details
recipient.cashobjectRecipient cash details
recipient.vasobjectRecipient VAS details
recipient.ewaobjectRecipient EWA details

As with the transaction itself, when recipient.paymentMethod is set the matching object must be present, otherwise the request is rejected.

The same fields apply to each entry of the recipients array.

Example Request

{ "id": "TXN123", "userId": "USER123", "accountId": "ACCT123", "status": "PENDING", "currencyCode": "ZAR", "amount": 1000.00, "direction": "payout", "actionType": "withdrawal", "source": "savings", "provider": "dlocal", "paymentMethod": "bank", "bank": { "accountNumber": "1234567890", "bankCode": "051001", "branchCode": "123456", "accountType": "checking", "accountHolderName": "John Doe" }, "billingAddress": { "street": "123 Main St", "city": "Cape Town", "country": "ZA", "postalCode": "8001" }, "timestamp": 1734167723000, "externalId": "EXT789", "userDeviceId": "DEVICE123" }

Response Schema

FieldTypeRequiredDescription
transactionIdstringYesUnique identifier for processed transaction
statusstringYesUpdated transaction status
riskLevelenumYesRisk assessment: low, medium_low, medium, high, very_high, n/a
recommendedActionenumYesSuggested action: ALLOW, REVIEW, BLOCK, STEP_UP_AUTH, STEP_UP_KYC, STEP_UP_ID, FLAG_FOR_MONITORING, REPORT_SUSPICIOUS, MESSAGE_USER, MESSAGE_MERCHANT

Example Responses

Low Risk Response

{ "id": "TXN123", "riskLevel": "low", "recommendedAction": "ALLOW", "triggered": [], "timestamp": 1734100583000 }

High Risk Response

{ "id": "TXN123", "riskLevel": "high", "recommendedAction": "REVIEW", "timestamp": 1734100583000, "triggered": [ { "id": "TRIG123456", "name": "Transaction amount above threshold", "level": "high", "reason": "Transaction amount exceeds allowed purchase size", "recommendedAction": "REVIEW" } ] }

Understanding Risk Levels

The response includes a risk assessment with the following levels:

  • low: Minimal risk, transaction can proceed
  • medium_low: Slightly elevated risk, usually safe to proceed
  • medium: Moderate risk, may require additional verification
  • high: Significant risk, careful review recommended
  • very_high: Highest risk level, manual review strongly advised
  • n/a: No risk assessment was produced, typically because no rules evaluated

Based on the risk assessment, you’ll receive one of the following recommended actions:

  • ALLOW: Process the transaction normally
  • REVIEW: Flag for manual review
  • BLOCK: Reject the transaction
  • STEP_UP_AUTH: Request additional authentication
  • STEP_UP_KYC: Request additional KYC information
  • STEP_UP_ID: Request additional identity verification
  • FLAG_FOR_MONITORING: Allow but monitor for suspicious patterns
  • REPORT_SUSPICIOUS: Consider reporting to appropriate authorities
  • MESSAGE_USER: Contact the user
  • MESSAGE_MERCHANT: Contact the merchant

These actions can be configured according through client config. Reach out to support@orca-fraud.com if you’d like a list of all possible actions.

Error Response Format

See the Error Reference section for a full description of API errors. All API errors follow a consistent JSON structure:

{ "error": { "type": "ERROR_TYPE", "message": "Human-readable error description", "details": ["Additional error details (optional)"] }, "timestamp": 1755602195137 }

In the case of a validation error, the format will be as follows:

{ "error": { "type": "VALIDATION_ERROR", "message": "Request validation failed", "details": [ "/amount: Expected number to be greater or equal to 0" ] }, "timestamp": 1755602195137 }

Update Transaction Endpoint

The update endpoint allows you to update transaction statuses and provide additional context about processed transactions. This data helps improve risk assessment accuracy over time.

Endpoint

POST /v1/transaction/update

Request Schema

FieldTypeRequiredDescription
transactionIdstringYesTransaction identifier to update
statusenumNoUpdated status: PENDING, APPROVED, DECLINED, BLOCKED, FAILED, CANCELED, ABANDONED, CHARGEBACK
timestampnumberNoUnix epoch milliseconds (defaults to current time if not provided)
reasonstringNoOptional reason for the update, usually a reason code
descriptionstringNoOptional textual description for the update
typestringNoOptional type of update (e.g., merchant_decision, manual_review)
isFraudulentbooleanNoFlag to indicate if the transaction is fraudulent, if applicable
transactionobjectNoPartial transaction object with updated fields since original processing
feedbackobjectNoDeprecated. Use the top-level status, type, description and timestamp fields instead. See Deprecated feedback object

Transaction Update Fields

The transaction field accepts a partial transaction object containing only the fields that have been updated since the transaction was originally processed:

FieldTypeDescription
accountIdstringUpdated Account ID
paymentMethodenumUpdated payment method: bank, card, vas, cash. The matching object must be sent with it
bankBank Details SchemaUpdated bank details
cardCard Details SchemaUpdated card details
vasVAS Details SchemaUpdated VAS details
cashCash Details SchemaUpdated cash details

Note: Only include fields in the transaction object that have actually changed since the original transaction was processed.

Any method object you include must be non-empty — sending "bank": {} is rejected. Only accountId, paymentMethod, bank, card, vas and cash are updatable here; other transaction fields are ignored.

Deprecated feedback object

feedback predates the top-level update fields and is retained only for existing integrations. It will be removed. New integrations should send status, type, description and timestamp at the top level instead.

FieldTypeDescription
feedback.idstringRequired if feedback is sent. Identifier for the feedback
feedback.statusenumSuperseded by the top-level status
feedback.typestringSuperseded by the top-level type
feedback.descriptionstringSuperseded by the top-level description
feedback.createdAtnumberSuperseded by the top-level timestamp

Example Update Request

{ "transactionId": "TXN123456", "status": "APPROVED", "description": "Transaction approved after manual review", "reason": "Customer verification completed", "type": "manual_review", "isFraudulent": false, "timestamp": 1734167723000, "transaction": { "accountId": "ACC789456" } }

Response

By default, this endpoint returns a simple success response:

{ "status": "Success" }

A validation error in the same structure as above will be returned should the request fail validation.

Monitoring Response

If monitoring is configured for your client on this endpoint, you will receive the same response structure as the transaction screening endpoint, including risk assessment:

{ "id": "TXN123456", "riskLevel": "low", "recommendedAction": "ALLOW", "triggered": [], "timestamp": 1734167723000 }

Note: To enable monitoring on this endpoint and receive risk assessment responses, contact support@orca-fraud.com to configure this feature for your account.

Retrieve Transaction

Get risk assessment results for a specific transaction that has already been assessed.

Endpoint

GET /v1/transaction/{id}

Parameters

ParameterTypeRequiredDescription
idstringYesTransaction identifier

Example Response

{ "id": "TXN123456", "riskLevel": "medium", "recommendedAction": "ALLOW", "timestamp": 1734100583000, "triggered": [ { "id": "TRIG123456", "name": "Unusual volume", "level": "medium", "reason": "User is exhibiting unusual transactional behaviour relative to normal behaviour.", "recommendedAction": "ALLOW" } ] }

Response Schema

FieldTypeRequiredDescription
idstringYesTransaction identifier
riskLevelenumYesRisk level: low, medium_low, medium, high, very_high, n/a
recommendedActionenumYesAction to take: ALLOW, REVIEW, BLOCK, STEP_UP_AUTH, STEP_UP_KYC, STEP_UP_ID, FLAG_FOR_MONITORING, REPORT_SUSPICIOUS, MESSAGE_USER, MESSAGE_MERCHANT
triggeredarrayNoArray of triggered risk rules
timestampnumberYesUnix epoch milliseconds

Note: Both the POST and GET transaction endpoints return the same response structure. This allows consistent handling of transaction risk assessments regardless of how they are retrieved.

Triggered Rule Schema

FieldTypeDescription
idstringUnique identifier for the triggered rule
namestringName of the triggered rule
levelenumRule severity: low, medium_low, medium, high, very_high, n/a
reasonstringReason for the triggered rule
recommendedActionenumSuggested action: ALLOW, REVIEW, BLOCK, STEP_UP_AUTH, STEP_UP_KYC, STEP_UP_ID, FLAG_FOR_MONITORING, REPORT_SUSPICIOUS, MESSAGE_USER, MESSAGE_MERCHANT

User Schema

The User details can either be sent via the /user endpoint, or in an object on the /transaction request. If the user object is used, please omit the root userId field in favour of user.id

FieldTypeRequiredDescription
idstringYesUnique user identifier
timestampnumberYesUnix epoch milliseconds. Must not be in the future
firstNamestringNoUser’s first name
lastNamestringNoUser’s last name
dateOfBirthstringNoISO format date (YYYY-MM-DD)
addressobjectNoUser’s address details
companystringNoCompany name for grouping users
phone.phonestringNoPhone number in E.164 format
phone.countrystringNoISO 3166-1 alpha-2 country code
phone.isVerifiedbooleanNoWhether phone has been verified
email.emailstringNoUser’s email address
email.isVerifiedbooleanNoWhether email has been verified
documentsarrayNoUser identification documents
lastLoginnumberNoTimestamp of last user login
userDeviceobjectNoUser’s device information, if not sent using /userDevice endpoint
statusenumNoUser status: ACTIVE, INACTIVE, BLOCKED, plus the aliases PENDING and APPROVED (both stored as active) and DECLINED (stored as inactive)
amlDetail.amlStatusstringNoAML verification status
amlDetail.amlSourcestringNoSource of AML verification
kycDetail.sourceOfIncomestringNoUser’s income source
kycDetail.kycStatusstringNoKYC verification status
kycDetail.kycSourcestringNoSource of KYC verification
kycDetail.kycStatusMessagestringNoAdditional KYC status details
salary.cycleenumNoSalary payment frequency: weekly, bi-weekly, monthly, if applicable
salary.amountnumberNoSalary amount, if applicable
salary.currencystringNoSalary currency code, if applicable
referralCodestringNoReferral code of user, if applicable
referrerCodestringNoReferral code used by user to register, if applicable
taxNumberIdstringNoTax identification number for the user
guestbooleanNoWhether this is a guest user rather than a registered account

Payment Method Schemas

For each of the following schemas, no fields are required however some form of identifier that can be used to identify subsequent transactions is ideal.

Bank Details Schema

FieldTypeDescription
accountNumberstringBank account number
routingNumberstringBank routing number (ACH)
currencystringCurrency code of the account
ibanFullstringFull IBAN number for international payments
sortCodestringUK sort code if applicable
accountTypestringType of account (checking/savings)
accountHolderNamestringName of the account holder
bankNamestringName of the bank
bankBranchstringName of the bank branch
bankBranchCodestringCode identifying the specific bank branch
balance.amountnumberAccount balance, exclusive of this transaction. Drives balance-based rules
balance.currencystringISO 4217 currency code of the balance
billingAddressobjectBilling address held against the account, see Address Schema
isVirtualAccountbooleanWhether this is a virtual account
typestringAccount classification, as your provider reports it
descriptionstringFree-text description of the account
paymentReferencestringReference used on the payment

Card Details Schema

FieldTypeDescription
binstringFirst six digits of card
binCountrystringCountry associated with the card BIN. This can be inferred if not sent.
brandstringCard brand (e.g., Visa, Mastercard)
last4stringLast four digits of card
numberstringFull card number. Prefer cardFingerprint and last4 — send this only if you have no tokenized identifier
expiryMonthstringTwo-digit expiry month, 01 to 12
expiryYearstringExpiry year, 2 to 4 digits
typestringCard type: CREDIT, DEBIT
mccCodestringMerchant Category Code associated with the card transaction
isDigitalWalletbooleanIndicates if this is from Google Pay/Apple Pay
cardFingerprintstringUnique tokenized card identifier
digitalWalletTypestringType of digital wallet if applicable
digitalWalletTokenstringToken or identifier from digital wallet if applicable
billingAddressobjectBilling address held against the card, see Address Schema

Crypto Details Schema

FieldTypeDescription
assetSymbolstring/arrayCryptocurrency symbol(s) (e.g., BTC, ETH)
networkstringBlockchain network
addressstringWallet address
currencystringISO 4217 currency code the crypto amount is denominated in
transactionHashstringBlockchain transaction hash (only on transactions)

Wallet Details Schema

Support for various wallet types, such as:

  • PIX (Brazil)
  • M-PESA (Kenya)
FieldTypeDescription
idstringUnique Wallet identifier
tokenBrandstringWallet brand (e.g., PIX)
phonestringPhone number associated with wallet (in E.164 international format if applicable)
phoneCountrystringCountry code for phone (if not sent this can be inferred if phone is in E.164 international format)
countrystringCountry code, kept separate for verification. Use if different from phoneCountry
phoneProviderstringMobile phone wallet provider if applicable
currencystringCurrency code for the wallet
typestringWallet type
pixKeystringPIX key for PIX transactions
taxNumberIdstringTax ID for PIX transactions
providerstringWallet provider
accountIdstringProvider-side account identifier for the wallet
balance.amountnumberWallet balance, exclusive of this transaction. Drives balance-based rules
balance.currencystringISO 4217 currency code of the balance

EWA (Earned Wage Access) Details Schema

FieldTypeDescription
idstringUnique identifier for EWA instrument
employerIdstringID of the employer associated with the EWA

VAS (Value Added Service) Details Schema

FieldTypeDescription
idstringUnique identifier for voucher/VAS instrument
voucherCodestringUnique code identifying the voucher
voucherReferencestringYour own reference for the voucher
voucherTypeenumType of voucher: gift, discount, promotional, prepaid, service
issuerstringCompany that issued the voucher
recipient.emailstringEmail of gift voucher recipient
recipient.phonestringPhone number of gift voucher recipient
faceValuenumberOriginal/nominal value
currentBalancenumberRemaining balance
currencystringCurrency code
expiryDatenumberTimestamp when voucher expires
activationDatenumberTimestamp when voucher became active
statusenumVoucher status: active, redeemed, expired, cancelled, pending

Cash Details Schema

FieldTypeDescription
idstringUnique identifier for cash transaction
agentIdstringID of the agent where cash was deposited
typestringCash transaction classification, as your provider reports it
typestringType of cash transaction

Address Schema

Used by billingAddress, the User address field, and the billingAddress inside the bank and card objects. Note that two fields are required whenever an address object is sent at all — a partial address is rejected.

FieldTypeRequiredDescription
postalCodestringYesPostal or ZIP code
countrystringYesISO 3166-1 alpha-2 country code, uppercase (e.g. ZA)
streetstringNoStreet address
citystringNoCity
regionCodestringNoRegion, province or state code
isVerifiedbooleanNoWhether the address has been verified
Last updated on