Beneficiary Verification API Migration (UAE)
Map the legacy UAE Beneficiary Verification endpoint to the current Spare API.
Who this is for
This guide is for existing UAE integrations moving from the legacy Beneficiary Verification endpoint to the current API. New integrations should start from the Beneficiary Verification guide and don't need this page.
This is a 1:1 endpoint mapping between the legacy and new Beneficiary Verification API. Only the differences are highlighted; anything not mentioned remains the same.
Beneficiary Verification confirms that an IBAN belongs to the expected account holder before a payment is made. It's a single, synchronous call.
Migration checklist
- Update the base URL.
- Add the
x-tenant: UAEheader to the request. - Update the endpoint path per the mapping table below.
- No request-body or response-shape changes: the payload and the response are unchanged.
- Ensure the client's subscription includes Beneficiary Verification (see Footnotes).
Global changes (apply to all endpoints)
| Aspect | Legacy | New |
|---|---|---|
| Base URL | https://sandbox.tryspare.ae | https://api.sandbox.tryspare.ae |
| Tenant header | Not required | x-tenant: UAE required on every request (except JWKS) |
No change
The authentication header format (Authorization: Bearer <token>), the request body, and the response all remain the same. Beneficiary Verification does not require an x-signature (it isn't a signed payment write).
1. Authentication
Authentication is identical to the legacy flow: the Token, Refresh, and JWKS endpoints, formats, and status changes are the same. In short:
- Token:
GET /api/v1.0/authentication/Token→POST /auth/api-keys/sessions(200 → 201) - Refresh:
GET /api/v1.0/authentication/Refresh→POST /auth/api-keys/sessions/refresh - JWKS:
GET /api/v1.0/authentication/Jwks→GET /auth/.well-known/jwks.json(no auth, no tenant header)
Use the resulting Authorization: Bearer <token> on the verify call below, plus x-tenant: UAE.
2. Beneficiary Verification
2.1 Verify (Match)
| Legacy | New | |
|---|---|---|
| Method | POST | POST |
| Path | /api/v1.0/verification/BeneficiaryVerification/Match | /verifications/beneficiary |
| Status | 200 OK | 200 OK |
| Headers | Authorization: Bearer | Unchanged. Add x-tenant: UAE |
| Body | { "iban": "...", "beneficiaryName": "..." } | Unchanged |
| Response | Verification result payload | Unchanged: identical field names, casing, null-omission |
| Notes | N/A | Path changed only. Request and response are unchanged |
Request body
{
"iban": "AE070331234567890123456",
"beneficiaryName": "ABC Trading LLC"
}iban: required. 23-character UAE IBAN (AE+ check digits). Case-insensitive; normalized to upper case server-side.beneficiaryName: optional, max 150 characters. Omit or send blank if you only want an account-existence check.
Response body (unchanged from legacy)
{
"data": {
"requestId": "bv_01hqnx2w8f",
"result": "MATCH",
"bank": {
"englishName": "Gulf International Bank",
"arabicName": "بنك الخليج الدولي",
"bankCode": "033"
},
"beneficiaryName": "ABC TRADING LLC",
"inputBeneficiaryName": "ABC Trading LLC",
"accountIdentifier": "AE070331234567890123456",
"accountStatus": "Account Active and Available",
"executionDate": "2026-07-31T10:15:00+00:00"
}
}result:MATCH,NO_MATCH, orERROR.nullwhen the outcome is an error (errorDescriptionis populated instead). Values unchanged from legacy.errorDescription: present only on a non-pass; a human-readable message, not a raw provider code.accountIdentifier: the verified IBAN, echoed back. Field name unchanged from legacy.- Null fields are omitted from the response in both APIs.
Quick reference: full endpoint map
Migrated endpoints (legacy → new)
| # | Operation | Method | Legacy path | New path | Status change |
|---|---|---|---|---|---|
| 1 | Token | GET → POST | /api/v1.0/authentication/Token | /auth/api-keys/sessions | 200 → 201 |
| 2 | Refresh | GET → POST | /api/v1.0/authentication/Refresh | /auth/api-keys/sessions/refresh | N/A |
| 3 | JWKS | GET | /api/v1.0/authentication/Jwks | /auth/.well-known/jwks.json | N/A |
| 4 | Verify (Match) | POST | /api/v2/management/BeneficiaryVerification/Match | /verifications/beneficiary | N/A |
Footnotes
- Response envelope: the response is wrapped in a
{ "data": ... }envelope. Null fields are omitted in both the legacy and new APIs. - Error format: error responses follow the same structure across both APIs:
{ "error": "...", "errorDescription": "..." }. Business-level non-passes (for example a closed or mismatched account) still return200 OKwithresultanderrorDescriptioninsidedata; transport and validation failures use the usual400/401/403/429/500codes. - Entitlement: the endpoint is gated by the Beneficiary Verification subscription. If a client's plan doesn't include it, the call returns
403 Forbidden. Confirm the client is subscribed before cutover. - Result semantics:
MATCHmeans name and account confirmed;NO_MATCHmeans the account resolved but the name did not match;ERRORmeans the account could not be verified (resultisnull, seeerrorDescription). These match the legacy semantics exactly. - Rate limiting: rate limits are enforced per endpoint and are unchanged from legacy.
- Support: for migration questions or issues, contact support at
support@tryspare.com.