SpareSpare Docs
GuidesAPI Reference
Guides

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: UAE header 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)

AspectLegacyNew
Base URLhttps://sandbox.tryspare.aehttps://api.sandbox.tryspare.ae
Tenant headerNot requiredx-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/TokenPOST /auth/api-keys/sessions (200 → 201)
  • Refresh: GET /api/v1.0/authentication/RefreshPOST /auth/api-keys/sessions/refresh
  • JWKS: GET /api/v1.0/authentication/JwksGET /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)

LegacyNew
MethodPOSTPOST
Path/api/v1.0/verification/BeneficiaryVerification/Match/verifications/beneficiary
Status200 OK200 OK
HeadersAuthorization: BearerUnchanged. Add x-tenant: UAE
Body{ "iban": "...", "beneficiaryName": "..." }Unchanged
ResponseVerification result payloadUnchanged: identical field names, casing, null-omission
NotesN/APath 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, or ERROR. null when the outcome is an error (errorDescription is 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)

#OperationMethodLegacy pathNew pathStatus change
1TokenGET → POST/api/v1.0/authentication/Token/auth/api-keys/sessions200 → 201
2RefreshGET → POST/api/v1.0/authentication/Refresh/auth/api-keys/sessions/refreshN/A
3JWKSGET/api/v1.0/authentication/Jwks/auth/.well-known/jwks.jsonN/A
4Verify (Match)POST/api/v2/management/BeneficiaryVerification/Match/verifications/beneficiaryN/A

Footnotes

  1. Response envelope: the response is wrapped in a { "data": ... } envelope. Null fields are omitted in both the legacy and new APIs.
  2. 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 return 200 OK with result and errorDescription inside data; transport and validation failures use the usual 400 / 401 / 403 / 429 / 500 codes.
  3. 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.
  4. Result semantics: MATCH means name and account confirmed; NO_MATCH means the account resolved but the name did not match; ERROR means the account could not be verified (result is null, see errorDescription). These match the legacy semantics exactly.
  5. Rate limiting: rate limits are enforced per endpoint and are unchanged from legacy.
  6. Support: for migration questions or issues, contact support at support@tryspare.com.

On this page