Changelog
All notable changes to the Lira API are documented here. Breaking changes are marked explicitly. Dates follow ISO 8601 (YYYY-MM-DD).
2026-07-14
Added
-
Bank routing endpoints. Documented four bank routing checks, now grouped under Bank Routing in the API reference:
POST /verifications/bic— validate a BIC/SWIFT code (ISO 9362) and break it into its component parts.POST /verifications/routing-codes— validate a US ABA routing number (length + mod-10 checksum).POST /verifications/correspondents— look up the correspondent banks on file for a foreign BIC, sorted by confidence (recorded and billed; send anIdempotency-Key).POST /verifications/batch— validate up to 100 mixed BIC/routing/route items in one request.
In sandbox, these endpoints return seeded fixture data for a documented set of test identifiers (see Test Numbers → Bank Routing); any other identifier returns
TEST_NUMBER_NOT_FOUND. See Bank Routing.
2026-06-26
Added
- United Arab Emirates (
AE) bank-account verification. Added IBAN bank-account verification for the UAE. A name-match check: supply the IBAN asaccountNumber, thecountry(AE), and theaccountNameto match. NobankCodeis required — the IBAN carries the routing — and AED accounts only. Synchronous only (mode: "async"is not supported). See Bank Account: Country Requirements. - Australia (
AU) bank-account verification. Added bank-account verification for Australia. A name-match check: supply the account number, the 6-digit BSB asbankCode, and theaccountNameto match. AUD accounts only. Synchronous only (mode: "async"is not supported). See Bank Account: Country Requirements. - United States (
US) bank-account verification. Added bank-account verification for the United States. A name-match check: supply the account number, the 9-digit ABA routing number asbankCode, and theaccountNameto match. USD accounts only. Synchronous only (mode: "async"is not supported). See Bank Account: Country Requirements.
2026-06-25
Added
- Europe (SEPA) bank-account verification. Added IBAN bank-account verification for 21 Eurozone countries: Austria (
AT), Belgium (BE), Bulgaria (BG), Croatia (HR), Cyprus (CY), Estonia (EE), Finland (FI), France (FR), Germany (DE), Greece (GR), Ireland (IE), Italy (IT), Latvia (LV), Lithuania (LT), Luxembourg (LU), Malta (MT), Netherlands (NL), Portugal (PT), Slovakia (SK), Slovenia (SI), and Spain (ES). All are name-match checks: supply the IBAN asaccountNumber, thecountry, and theaccountNameto match. NobankCodeis required — the IBAN carries the routing — and EUR accounts only. Every SEPA corridor is synchronous only (mode: "async"is not supported). See Bank Account: Country Requirements.
2026-06-24
Added
- LATAM bank-account corridors. Added bank-account verification for Brazil (
BR), Mexico (MX), Argentina (AR), Uruguay (UY), Peru (PE), Chile (CL), Colombia (CO), and Ecuador (EC). All eight are name-match checks and synchronous (mode: "async"is not supported). Brazil, Mexico, Argentina, and Peru need nobankCode— the routing is embedded in the IBAN/CLABE/CBU/CCI; Uruguay, Chile, Colombia, and Ecuador use the bank's BIC or local clearing code. Brazil, Chile, Colombia, and Ecuador require a national/tax identifier inidentifiers(CPF/CNPJ,RUT,CC/NIT,CC/RUC). See Bank Account: Country Requirements.
2026-06-22
Added
- Asia bank-account corridors. Added bank-account verification for India (
IN), Indonesia (ID), Vietnam (VN), Nepal (NP), Pakistan (PK), South Korea (KR), Bangladesh (BD), Malaysia (MY), Thailand (TH), and the Philippines (PH). India, Indonesia, Vietnam, Nepal, Pakistan, South Korea, Bangladesh, and Malaysia are name-match checks. Thailand is an account-existence check and the Philippines is a format/syntax check (neither performs a name match). All requireaccountNameand all are synchronous (mode: "async"is not supported). India uses an 11-character IFSC inbankCode; the other nine use the bank's BIC. See Bank Account: Country Requirements.
2026-06-14
Added
-
Kenya (
KE) identity verification:POST /verify/identitynow supports Kenya. Select the document with theidTypefield:national_id— Kenyan National ID number (up to 9 digits, e.g.12345678). Returns split name fields plus date of birth.drivers_license— driver's licence number (e.g.B1234567). The lookup is matched against the holder's name, sovalidation.firstNameandvalidation.lastNameare required.passport— Kenyan passport number (6–12 alphanumeric characters, e.g.A1234567).
Responses carry a
verificationTypeofKE_NATIONAL_ID,KE_DRIVERS_LICENSE, orKE_PASSPORT. Passport and driver's licence records usually return a combinedfullNamerather than split name components, so readfullNameand treat the individual parts as optional. See National ID, Driver's Licence & Passport. -
Kenya (
KE) phone number verification:POST /verify/phonenow supports Kenya. Numbers are supplied in E.164 format (254700000000; the leading+is optional) and nonetworkCodeis required — the operator is resolved automatically. A successful verification returnsfullNameanddateOfBirth; individual name components are not available. See Phone Number in Kenya.
2026-05-30
Added
- United Kingdom (
GB) and China (CN) bank account verification. Both are name-match corridors: you supply the account details plus theaccountNameyou expect, and the bank confirms whether the name matches the account on record. See Bank Account in the United Kingdom and Bank Account in China.- United Kingdom: 8-digit account number with a 6-digit sort code supplied in
bankCode.accountNameis required. - China: select the account type with
accountHolderType.INDIVIDUALaccounts use the UnionPay card number;BUSINESSaccounts use the bank's BIC inbankCodeplus an 18-character Uniform Credit Code supplied as aBUSINESS_REGISTRATIONentry inidentifiers.accountNameis required. - Both corridors are synchronous only.
mode: "async"is not supported.
- United Kingdom: 8-digit account number with a 6-digit sort code supplied in
Changed
- Unified routing code field. The receiving institution's routing code is now always supplied in the single
bankCodefield, whatever its local form: the African bank/clearing code, the UK 6-digit sort code, or the bank's BIC/SWIFT code for China business accounts. There is no separatesortCodeorbicfield. - Typed account-holder identifiers. Corridor-specific identity codes are now supplied through an
identifiersarray of{ "type": ..., "value": ... }entries. China business accounts carry their Uniform Credit Code as aBUSINESS_REGISTRATIONidentifier. - Name-match response shape. For
GBandCN, a successful verification (verified: true) echoes back theaccountNameyou submitted, confirmed to match the bank's record. These corridors do not disclose a separately sourced account name. Whenverifiedisfalse,accountNameis omitted.
2026-05-28
Address verification SDK 1.0.2
All-platform release of the Uselira address-verification SDK. iOS, Android, and React Native all bump to 1.0.2; native iOS and Android also bump from 1.0.1 since their SdkConfig signatures change.
Fixed
- React Native iOS bridge build failure.
@uselira/core@1.0.1shipped with an incorrectimport Uselirain the iOS bridge. The published pod exposes the module asUseliraCore(the Swift class isUselira, living inside that module). Every iOS build of 1.0.1 failed withUnable to find module dependency: 'Uselira'. Fixed in 1.0.2 by changing the import toUseliraCore.
Breaking changes (all three platforms)
SdkConfig.environmentis now REQUIRED. No default. Host apps must explicitly picksandboxorproductionso a sandbox build cannot accidentally ship to production.- Swift:
SdkConfig(... duration: 14, environment: .sandbox, ...) - Kotlin:
SdkConfig(... duration = 14, environment = LiraEnvironment.SANDBOX, ...) - React Native:
{ ... duration: 14, environment: 'sandbox', ... }
- Swift:
- Recovery paths are stricter too: iOS
Uselira.restoreIfNeeded()and AndroidUselira.start(context)refuse to restore from a corrupt or missing stored environment instead of silently falling back to sandbox. iOSUselira.cancelVerification(...)returns.invalidConfig(reason:)when no environment is stored.
Documentation
- The React Native SDK README iOS Setup section now puts the two required Podfile edits up front:
platform :ios, '16.0':UseliraCorerequires iOS 16; the RN scaffold defaultmin_ios_version_supportedresolves to ~13.4 and failspod installwith a platform-mismatch error.use_frameworks! :linkage => :dynamic:UseliraCoreships as a binary.xcframeworkthat is not consumable under static linking; without dynamic linking the Swift import fails withNo such module 'UseliraCore'.
- This page (Address verification) was updated for the new requirements: the
Configuration referencetable marksenvironmentrequired, the React Native example passesenvironment, and the iOS install section spells out the two Podfile edits with the specific failure each prevents. - New section: Best practice: don't start a second verification while one is in flight, covering host-side gating with the persisted
jobId+Uselira.statusAPI. Includes React Native, iOS Swift, and Android Kotlin sketches. - Error-handling section updated:
LiraSetupError.servernow carries a parseddetail(code,message,actionType,actionHint). The SDK's in-flow retry banner showsactionHintwhen present; hosts should branch onactionType(FIX_INPUT/CONTACT_ADMINwon't be resolved by a retry). - React Native: documented the two new event subscriptions:
addSetupFailedListener(with theSetupFailurediscriminated union) andaddUploadAttemptedListener({ success, count, error? }per batch). - Behaviour-guarantees section: updated the idempotency-key description to reflect that the key is now derived from
(customerRef, lat, lng, consent-minute UTC)rather than(customerRef, lat, lng, UTC day). Same-minute double-taps still collapse; cross-flow retries get a fresh key and reach the validation layer instead of replaying a cached failure.
Migration
Existing call sites won't compile until environment is added to every SdkConfig(...). The compiler will flag every missed call on iOS (SdkConfig requires 'environment:') and Android (No value passed for parameter 'environment'); React Native rejects at runtime with INVALID_CONFIG.
iOS host apps additionally need the two Podfile edits described above.
2026-05-07
Added
- Actionable error responses: All API error responses now include an optional
actionfield with a machine-readabletypeand a human-readablehint. When present,action.typetells your application what the caller should do to resolve the error, for exampleCONTACT_ADMINwhen a service is not enabled,TOP_UP_WALLETwhen the wallet balance is insufficient, orWAIT_AND_RETRYwhen a rate limit is active. See Errors → Actionable errors for the full type list and a handling example.
Changed
- 402 Payment Required is now returned when a verification cannot be billed: either because the organization's wallet has insufficient funds (
INSUFFICIENT_FUNDS), the account has been auto-suspended (WALLET_SUSPENDED), or the service has no price configured (SERVICE_PRICE_NOT_CONFIGURED). Previously these conditions returned a 500 or a generic 422. All 402 responses include anactionfield. - 403 Forbidden now covers service-not-enabled errors in addition to permission errors. If a verification service is not enabled for your organization, you receive a 403 with
code: SERVICE_NOT_ENABLEDandaction.type: CONTACT_ADMIN.
2026-04-24
Added
- Francophone Africa coverage: Bank account and phone number verification now supported for Côte d'Ivoire (
CI), Senegal (SN), Cameroon (CM), Burkina Faso (BF), Mali (ML), Benin (BJ), and Togo (TG). Tanzania (TZ) is also added. All phone verifications for the new markets require anetworkCode. Contact support for the carrier code list per country.
2026-03-09
Added
- Ghana phone number verification:
POST /verify/phonenow supports Ghana (GH) in addition to Nigeria. Ghana verifications require anetworkCode(MTN,Vodafone, orAirtelTigo). OmittingnetworkCodefor a GH request returnsNETWORK_CODE_REQUIRED. - Webhook delivery history: New endpoints to inspect webhook delivery attempts:
GET /client/webhooks/:id/deliveries: list recent deliveries with status and response detailsGET /client/webhooks/:id/deliveries/:deliveryId: get a specific delivery record
- Async verification mode: All verification endpoints now accept
"mode": "async". The API returnsstatus: pendingimmediately and delivers the result via webhook when processing completes. lastUsedAton API keys:GET /client/api-keysresponses now include alastUsedAttimestamp showing when each key was most recently used.expiresAton API keys: API key list responses include anexpiresAtfield. Currentlynullfor all keys; expiry configuration will be supported in a future release.
Changed
-
Webhook retry schedule updated: Retry delays changed from fixed 5-minute intervals to exponential backoff: immediate → 1 min → 3 min → 9 min → 27 min. Total retry window is approximately 40 minutes (previously 25 minutes). No action required for existing webhooks.
-
X-Signatureheader format: Webhook signature headers now use thesha256=<hex>prefix format. Previously the raw hex digest was sent without a prefix. Update your signature verification logic to strip thesha256=prefix before comparing.Migration: If you were comparing the header directly against a computed hex digest, update to:
JavaScriptconst expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
Fixed
- Resolved an issue where
GET /verifywithstatus=pendingreturned completed verifications in some edge cases. PATCH /client/webhooks/:idno longer requires all fields to be present; partial updates work as documented.
2026-02-15
Added
- Webhook management API: New endpoints for registering and managing webhook endpoints:
POST /client/webhooks: register an endpointGET /client/webhooks: list all webhooks, with optionalstatusandeventfiltersGET /client/webhooks/:id: get a single webhookPATCH /client/webhooks/:id: update URL, events, status, or signing secretDELETE /client/webhooks/:id: delete a webhook
- Verification list endpoint:
GET /verifyreturns a paginated list of past verifications. Supportstype,status,limit, andoffsetquery parameters. - Verification retrieve endpoint:
GET /verify/:idretrieves the result of a specific verification by ID. Useful as a polling fallback when a webhook delivery is missed.
Changed
- API key header renamed: The authentication header for verification endpoints changed from
X-Lira-KeytoX-API-Key. The old header will continue to work until 2026-05-15; update before that date to avoid disruption. (Breaking change, grace period active)
2026-01-20
Added
- Phone number verification:
POST /verify/phoneverifies that a mobile number is registered with a carrier and returns the subscriber's name and date of birth. Supported country: Nigeria (NG). DEVELOPERrole: New organization role with access to verification endpoints and webhook management. Cannot create or revoke API keys.
Changed
- Verification response shape: Responses from
POST /verify/accountnow include a top-levelverifiedboolean field (in addition tostatus) for quick checks.verified: trueis equivalent tostatus: "success".
2026-01-05: Initial release
Added
- Bank account verification:
POST /verify/accountverifies a Nigerian bank account against official records and returns the account holder's name and address. - Authentication:
POST /auth/login,POST /auth/refresh,POST /auth/logoutfor JWT-based session management. - API key management:
POST /client/api-keys,GET /client/api-keys,DELETE /client/api-keys/:idfor creating and revoking API keys scoped to sandbox or live environments. - Sandbox environment: All endpoints are available in sandbox with deterministic test data. No real external queries are made and no charges are incurred.
- Supported countries: Nigeria (
NG) for bank account verification.