Smart Verify API
Instantly verify that a bank account is open and can receive payments using Trice's new Smart Verify API.
Instantly verify that a bank account is open and can receive payments using Trice's new Smart Verify API. Use this API to send a microdeposit ($2.00 or less) to any bank account that can receive via RTP or FedNow. The API intelligently routes to the right network based on availability (i.e. which rail(s) supported), its connectivity status (i.e. active or offline), and your preferences.
The receiving bank will display the sender's name for the transaction. Sender name is the sender's DBA or entity name of the account that is sending the credit transfer. If you want to display a verification code, keep reading!
Intelligent rail routing
The Smart Verify API will intelligently route your payment instruction to the correct rail (RTP, FedNow, Same Day ACH) based on:
- what rails the account's routing number supports (i.e. RTP, FedNow, ACH),
- the bank's status within RTP/FedNow network (signed on or off), and
- the preferences that you indicate.
If the account's routing number supports RTP or FedNow but that bank is currently offline within that network (i.e. planned maintenance or an outage), we will not route transactions to that bank using that rail.
The default rail preferences are: RTP, FedNow, and then Same Day ACH. Rail preference can be overridden by setting network_priority_list
in the request body. Rails can be excluded by setting network_deny_list
in the request body.
Display a verification code
The API can send a credit transfer with a verification code that you provide.
The verification code is displayed to the end user in their banking app. Your application can request the user to log into their bank app, view the transaction with verification code, and return that verification code back to your application to verify control of the account.
For FedNow: Trice will append code
and/or memo
fields (if they are provided) to the sender name using "|" as the delimiter for code and "-" as the delimter for memo to ensure important data is displayed to the end user. Use prepend_code=true
to prepend the verification code before the sender name.
For RTP: Trice will prepend code
field (if provided) to the sender name using "|" as the delimiter to ensure important data is displayed to the end user. Use prepend_code=true
to prepend the verification code before the sender name.
RTP Verification Code Examples:
code field | Displayed to end user* |
---|---|
"ab1234" | ab1234|sender_name |
FedNow Verification Code Examples:
code field | memo field | Displayed to end user* |
---|---|---|
null (or not defined) | "1234" | sender_name-1234 |
"ab1234" | null (or not defined) | sender_name|ab1234 |
"ab1234" with prepend_code=false (or omitted) | "account verify" | sender_name|ab1234-account verify |
"ab1234" with prepend_code=true | "account verify" | ab1234|sender_name-account verify |
"ab1234" with prepend_code=true | null (or not defined) | ab1234|sender_name |
*Receiving banks may truncate the display name to as few as 15 characters.
* The total number of characters for the sender_name, code, memo, and delimiters is 140 characters. Trice will drop memo and/or code if they will exceed the 140 character limit.
Note: the verification code is not stored / returned in the API. If you need Trice to store it, add this data to the internal_description
field or persist it within your application.
Verify account control using microdeposits
Call the Smart Verify API twice using 2 different amounts ($2.00 or less). Your application can request the user to log into their bank app, view the 2 transactions, and return the transaction amounts back to your application to prove ownership of the account.
Verify name match
Trice can verify that the provided accountholder name is a match for the account. Name Match feature is supported on the Smart Verify API and the Smart Transfer API. To trigger a name match, set party['bank_details']['name_match']['type'] = 'match_only'
(which can be accomplished when creating a new party or updating an existing party) before sending a transfer via Smart Verify or Smart Transfer endpoints.
# given: your Trice account is enabled for name match
assert account['capabilities']['smart_verify_and_smart_transfer_name_match'] == 'active'
# trigger name match when sending Smart Verify or Smart Transfer
payload = {
"amount": 1,
"enrollment": enrollment['id'],
"new_party": {
"name": "PANACEA PRODUCTS CORP",
"type": "business",
"bank_details": {
"account_number": "4209451234",
"routing_number": "041000124",
"account_holder_name": "PANACEA PRODUCTS CORP",
"account_holder_type": "business",
"name_match": {
"type": "match_only" # Request name match
}
}
}
}
smart_verify = create_smart_verify(access_token, payload)
# review the name match results in the party response
name_match_results = smart_verify['rtp_transfer']['party']['bank_details']['name_match_results']
json.dumps(name_match_results, indent=2)
{
"account_holder_name": "PANACEA PRODUCTS CORP",
"account_holder_type": "business",
"account_number_last4": "1234",
"account_type": null,
"created": "2025-08-07 19:05:24",
"first_name": null,
"last_name": null,
"match_result": "match",
"result_data": null,
"routing_number": "041000124",
"type": "match_only"
}
August 7, 2025: feature live in sandbox ✅
August 15, 2025: feature live in production
Updated 16 days ago