Banking & Financial Services · Java SDK

Check a wire against your rules before funds move

Your payment agent proposes a release. Wrap the release call in the Java SDK and send the wire facts your screening and customer systems already hold. The bank’s rules decide whether it moves, waits for compliance, or stops.

The wire facts the rule reads

These are the field names the wire simulator sends. Use the same names and you can compare your runs with the simulator’s record side by side.

FactWhat it holds
amount_usdRequested transfer amount in US dollars.
beneficiary_countryDestination country, such as germany or uae.
purpose_codeWhy the money moves: supplier_payment, intercompany, real_estate, securities_settlement, or unspecified.
sanctions_dispositionYour screening provider’s answer: clear, potential_match, or confirmed_match.
kyc_refresh_age_monthsMonths since the sender’s customer file was last refreshed.
daily_wire_volume_usdWhat this sender has already wired today.
high_risk_corridorTrue when your bank rates the destination as higher risk. Your code works this out; the rule reads the answer.

Java: release only on a released result

The release call runs inside govern, so it never starts when a rule says no. reviews is the review runtime your service creates once with veriproof.reviews(...).

Java · com.veriproof:veriproof-sdk-core

import com.veriproof.sdk.GovernOptions;
import java.util.Map;

var result = veriproof.govern(
    "wire.release",
    wire,
    context -> payments.release(context.input(), context.idempotencyKey()),
    GovernOptions.builder()
        .facts(Map.of(
            "amount_usd", wire.amountUsd(),
            "beneficiary_country", wire.beneficiaryCountry(),
            "purpose_code", wire.purposeCode(),
            "sanctions_disposition", screening.disposition(),
            "kyc_refresh_age_months", customer.kycRefreshAgeMonths(),
            "daily_wire_volume_usd", limits.sentTodayUsd(),
            "high_risk_corridor", corridors.isHigherRisk(wire.beneficiaryCountry())))
        .build());

switch (result.status()) {
    case COMPLETED, COMPLETED_WITH_WARNING, TRANSFORMED -> confirmRelease(result.value());
    case REVIEW_REQUIRED -> reviews.saveIfRequired(result);
    default -> holdWire(result.reasonCode(), result.message());
}

Only COMPLETED, COMPLETED_WITH_WARNING, and TRANSFORMED carry a value. For anything else, execution() tells you whether the release started, so you never guess before a retry.

Why Java here: Core banking and payment hubs usually run on the JVM, so the check sits in the same service that calls the payment rail.

Three wires, three results

Each row is a scenario you can run in the wire simulator. Run wire simulator

ResultWhenWhat your code seesWho picks it up
AllowedA routine supplier payment to Germany with a clear screening result.The release call runs. The record keeps the wire facts, the rule version, and the result.The Business Owner sees it in release activity. Auditors read it later inside an engagement.
Sent to a personA large wire to a higher-risk destination.The status is REVIEW_REQUIRED. Your code saves the checkpoint and resumes once the signed decision comes back.The compliance reviewer who holds that authority, in the VeriProof Inbox, by email, or in Slack or Microsoft Teams, with reminders and escalation.
StoppedThe agent approved release, but screening still shows an unresolved potential match.The status is BLOCKED and the release call never runs.The Governance Engineer sees which rule and version stopped it.

When compliance changes what the rule needs

Developer fix request

Say compliance adds a rule on how long the beneficiary account has existed. Your agent doesn’t send that field yet, so the Developer gets a fix request naming it. The request closes when the field arrives, and compliance is asked to check again.

Changing the rule

When risk lowers the review threshold for higher-risk destinations, the new version can run in Shadow first. It records what it would have decided without touching live wires. A governance engineer’s change to the production agent then goes to an administrator or compliance officer to approve.

See how the six role portals hand off work

Screening stays with your provider

Your sanctions provider keeps doing the screening. The rule reads its answer from sanctions_disposition, so the record shows both the screening result and the bank’s decision about it.

Take it further

Send a wire through the simulator

Pick a scenario, watch the rule decide, then open the full record with the same field names you read here.