Letsfin API
Identity verification and KYC APIs — PAN, Aadhaar, and face matching — for embedding directly into your own product.
Getting started
Every request is made over HTTPS to a single base URL. All request and response bodies are JSON.
https://os.letsfin.in/api/v1API keys are issued by your Letsfin account administrator. Each key is scoped to the specific APIs you've been granted access to — contact your Letsfin representative to request a key or to add access to another API.
Testing with a real key?
Enter the key in the sticky bar above and run its connection check to see enabled modules before trying an endpoint.
The fastest way is the Try it panel under each endpoint below — no tools needed, just paste your key once. If you'd rather use Postman, don't paste a full curl command into the URL field — use Import → Raw text in Postman instead, which correctly splits it into method, URL, headers, and body. Pasting it into the URL field sends the whole command as a single (nonexistent) path and returns a plain 404, not a real error from this API.
Authentication
Pass your API key as a bearer token on every request:
Authorization: Bearer <your_api_key>A missing or invalid key returns 401. A key that doesn't have access to the API you called returns 403.
Check the key and enabled modules without using a credit
POST https://os.letsfin.in/api/v1/connection-test
Authorization: Bearer <your_api_key>A successful response lists the modules enabled for this key and reports whether the client account has credits and an active plan. This check does not update API usage.
PAN Verification
POST /verify/pan
Validates a PAN card number against the government registry.
| Field | Type | Required | Description |
|---|---|---|---|
| panNumber | string | Yes | 10-character PAN, e.g. ABCDE1234F |
| consentPurpose | string | No | Why you're verifying this PAN (shown in your audit trail) |
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{"panNumber": "ABCDE1234F"}'Example response
{
"referenceId": "07dfba34-9cd9-453f-82ec-366f8b4e4091",
"result": {
"kycStatus": "SUCCESS",
"status": "SUCCESS",
"message": "PAN details retrieved successfully.",
"kycResult": {
"idNumber": "ABCDE1234F",
"idStatus": "VALID",
"category": "INDIVIDUAL OR PERSON",
"name": "..."
},
"transactionId": "CEF6D8A0E3464371B5F89DDA7FBB8650"
}
}Check kycStatus, not just the HTTP status — on failure, result is replaced with an error object describing what went wrong (see Errors).
Try it
Live API call — may use credits
PAN Complete
POST /verify/pan-complete
Enriched PAN lookup — returns father's name, gender, date of birth, masked Aadhaar, Aadhaar-seeding status, and full registered address, on top of what /verify/pan returns.
| Field | Type | Required | Description |
|---|---|---|---|
| panNumber | string | Yes | 10-character PAN, e.g. ABCDE1234F |
| consentPurpose | string | No | Why you're verifying this PAN (shown in your audit trail) |
Example response
{
"referenceId": "3ba9df69-...",
"result": {
"kycStatus": "SUCCESS",
"kycResult": {
"fullName": "...",
"fatherName": "...",
"gender": "M",
"dateOfBirth": "15-06-1999",
"maskedAadhaar": "********3178",
"aadhaarSeedingStatus": "Successful",
"address": { "full": "..." }
}
}
}Try it
Live API call — may use credits
Aadhaar (DigiLocker)
A consent-driven Aadhaar eKYC flow — your customer signs into their own DigiLocker account to share their Aadhaar, so you never handle a raw Aadhaar number. This is a two-step flow: create a session, send the customer to the returned link, then check the result once they're done.
POST /kyc/digilocker/session
Creates a verification session and returns a link to open for the customer.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | No | Pre-fill the customer's mobile number |
| redirectUrl | string | No | Where to send the customer's browser after they finish |
Example response
{
"referenceId": "6f2a1c9e-...",
"result": {
"status": "SUCCESS",
"message": "Session URL generated successfully",
"transactionId": "...",
"data": { "url": "https://<verification session link>" }
}
}Open result.data.url for the customer (a new tab or an in-app browser view both work). Once they complete the flow, poll the status endpoint below using the same referenceId.
Try it
Live API call — may use credits
POST /kyc/digilocker/status
Checks the result of a session you created. Only returns sessions created with your own API key.
| Field | Type | Required | Description |
|---|---|---|---|
| referenceId | string | Yes | The referenceId returned when the session was created |
Example response
{
"found": true,
"status": "success",
"result": { "...": "verification data" }
}status is pending until the customer finishes, then success or failed. A referenceId that doesn't belong to your key, or doesn't exist, returns 404.
Try it
Live API call — may use credits
Aadhaar QR (Pinless)
A hosted QR/intent verification flow. Your app receives a session URL and the customer completes Aadhaar consent and authentication outside Letsfin; do not collect or transmit their Aadhaar PIN or OTP.
POST /kyc/aadhaar/pinless/session
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Customer's full name as recorded on Aadhaar |
| redirectUrl | string | No | Where to send the customer's browser after completion |
| faceAuthentication | boolean | No | Request the optional face-authentication step |
Example response
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "QR generated successfully",
"data": {
"qrUrl": "https://maadhaar.com/getIntent?value=...",
"qrExpiry": "2026-09-23T13:36:12Z"
}
}
}Render qrUrl as a QR code for the customer to scan with their Aadhaar app before qrExpiry.
Try it
Live API call — may use credits
POST /kyc/aadhaar/pinless/status
Poll this endpoint with the returned referenceId. It only exposes sessions created with the same API key.
Try it
Live API call — may use credits
Face Match
POST /kyc/face-match
Compares a selfie against an ID document photo and returns a similarity score.
| Field | Type | Required | Description |
|---|---|---|---|
| images | string[] | Yes | At least 2 base64-encoded images — the first is the source (selfie), the rest are compared against it |
| threshold | number | No | Minimum match percentage to treat as the same person (default 70, max 95) |
Example response
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "Face scan completed successfully.",
"transactionId": "...",
"data": { "status": "SUCCESS", "match": "97.4%" }
}
}The top-level status reflects whether the scan itself ran — data.status is the actual verdict (SUCCESS the faces match, FAILURE they don't), and data.match is the similarity percentage either way.
Try it
Live API call — may use credits
Bank Validation - Hybrid
POST /validate/bank-account
Confirms an account number and IFSC resolve to a real, active bank account. Tries a free penniless check first and falls back to an actual ₹1 transfer only when needed — use this when you need a guaranteed result and don't mind the occasional real transfer. For a version that never moves real money, see PennyLess-Hybrid.
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber | string | Yes | Bank account number |
| ifsc | string | Yes | Bank branch IFSC code |
| name | string | No | Expected account holder name, to check a name match |
Example response
{
"referenceId": "...",
"result": {
"api_status": "SUCCESS",
"message": "Account validation was initiated successfully",
"data": {
"account_status": "valid",
"validation_type": "pennydrop",
"beneficiary_name": "ACME PRIVATE LIMITED",
"validation_message": "The account has been successfully verified."
}
}
}This is an HTTP 200 even for an invalid account — check data.account_status, not just the HTTP status. It tries a penniless check first and only falls back to an actual penny-drop transfer when needed — data.validation_type in the response tells you which one actually ran. Most current/company accounts don't support the penniless (NPCI/UPI) lookup, so this commonly falls back to a real ₹1 transfer for them.
Try it
Live API call — may use credits
PennyLess-Hybrid
POST /validate/bank-account-pennyless
Same account + IFSC check as Bank Validation - Hybrid, but never moves real money. Uses a penniless (NPCI/UPI-based) check only — if that isn't available for the account, this declines outright instead of falling back to a real transfer. Expect declines more often on current/company accounts than on personal accounts.
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber | string | Yes | Bank account number |
| ifsc | string | Yes | Bank branch IFSC code |
| name | string | No | Expected account holder name, to check a name match |
Example response
{
"referenceId": "...",
"result": {
"api_status": "SUCCESS",
"message": "Account validation was initiated successfully",
"data": {
"account_status": "valid",
"validation_type": "penniless",
"beneficiary_name": "JOHN DOE",
"validation_message": "The account has been successfully verified."
}
}
}As with Bank Validation - Hybrid, this is an HTTP 200 even when the account can't be verified — check data.account_status.
Try it
Live API call — may use credits
UPI VPA Validation
POST /validate/upi
Confirms a UPI ID is valid before you send a payout to it.
| Field | Type | Required | Description |
|---|---|---|---|
| upiVpa | string | Yes | UPI ID, e.g. name@bank |
Try it
Live API call — may use credits
AML/PEP Screening
Screens a name against global sanctions lists, watchlists, and politically exposed person (PEP) databases. This is a two-step flow: start the screening, then check its status using the same referenceId — most searches complete within the first request, but a few take longer.
POST /verify/aml-pep
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Full name to screen |
| fatherName | string | No | Father's name, improves match accuracy |
| dob | string | No | Date of birth, format DD/MM/YYYY |
| panNumber | string | No | PAN number |
| mobileNumber | string | No | Mobile number |
| passportNumber | string | No | Passport number |
| address | string | No | Address |
| exactMatch | boolean | No | Restrict to exact identity matches only |
Example response
{
"referenceId": "6f2a1c9e-...",
"pending": false,
"result": {
"status": "COMPLETED",
"total": 3,
"results": [ { "source": "...", "name": "...", "score": 92 } ]
}
}If pending is true, the screening is still running — poll the status endpoint below with the returned referenceId.
Try it
Live API call — may use credits
POST /verify/aml-pep/status
Checks a screening you started. Only returns searches started with your own API key.
| Field | Type | Required | Description |
|---|---|---|---|
| referenceId | string | Yes | The referenceId returned when the screening was started |
Try it
Live API call — may use credits
CRC Possible Match
Searches Indian court (eCourt) records for a possible criminal case match by name and address. Also a two-step flow: start the search, then check its status with the same referenceId.
POST /verify/crc
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Full name to search |
| address | string | Yes | Address, improves match accuracy |
| fatherName | string | No | Father's name |
| dob | string | No | Date of birth |
| type | string | No | "petitioner" or "respondent" — checks both by default |
Every case in the result includes a score, name_score, and address_score — sort or filter on these rather than treating every returned case as an equally strong match. A high name score with a low address score usually means a different person who happens to share a name.
Example response
{
"referenceId": "6f2a1c9e-...",
"pending": false,
"result": {
"status": 1,
"numresults": 2,
"cases": [ { "case_status": "Disposed", "court_name": "...", "score": 77 } ]
}
}Try it
Live API call — may use credits
POST /verify/crc/status
Checks a search you started. Only returns searches started with your own API key.
| Field | Type | Required | Description |
|---|---|---|---|
| referenceId | string | Yes | The referenceId returned when the search was started |
Try it
Live API call — may use credits
Land Record
Fetches state land records (khata / survey details) for a village and survey number. A two-step flow: place an order, then fetch the result with the same referenceId.
POST /verify/land-record
| Field | Type | Required | Description |
|---|---|---|---|
| state | string | Yes | State name (must match the source's spelling exactly) |
| district | string | Yes | District name |
| tehsil | string | Yes | Tehsil name |
| village | string | Yes | Village name |
| survey_no | string | Yes | Survey / khasra number |
| service_type | string | No | "DOC" (default), "Doc+Extraction", or "Doc+Extraction+Crop" |
State / district / tehsil / village must match the source's records exactly — an unknown value returns a clear error (e.g. state not found) rather than a result. If the result isn't ready on the first call the response is pending; poll the status endpoint with the referenceId.
Land records come live from each state's government portal, which is sometimes temporarily down. In that case the API returns HTTP 503 with a retry message — these calls are not charged; simply retry after a few minutes.
Example response
{
"referenceId": "f46ab854-...",
"pending": false,
"result": {
"data": {
"request_status": "Success",
"khata_land_document_pdf": { "1": { "khata_no": "...", "document_encoded": "<base64 pdf>" } },
"surveys": { "1": { "district": "...", "circle_rate_per_acre": 355402 } }
}
}
}Try it
Live API call — may use credits
POST /verify/land-record/status
Checks an order you placed. Only returns orders placed with your own API key.
| Field | Type | Required | Description |
|---|---|---|---|
| referenceId | string | Yes | The referenceId returned when the order was placed |
Try it
Live API call — may use credits
Credit Report - Exp
POST /financial/credit-report
Fetches a credit bureau report for a name + mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Full name (2-40 characters) |
| mobile | string | Yes | 10-digit mobile number |
| inquiryPurpose | string | Yes | Two-letter code: PL, CC, CL, HL, GL, or BL |
| panNumber | string | No | PAN number, improves match accuracy |
| dob | string | No | Date of birth |
Example response
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "Credit Report fetched successfully",
"data": {
"reportOrderNumber": "2963467079",
"cCRResponse": {
"status": "1",
"cIRReportDataLst": [{
"cIRReportData": {
"scoreDetails": [{ "name": "ERS4.0", "value": "866" }],
"iDAndContactInfo": {
"personalInfo": {
"name": { "fullName": "MAHESH KUMAR JHA" },
"gender": "Male",
"dateOfBirth": "1990-06-26",
"age": { "age": "36" }
},
"phoneInfo": [{ "number": "9711870560", "typeCode": "M", "reportedDate": "2026-09-16" }],
"emailAddressInfo": [{ "emailAddress": "name@example.com", "reportedDate": "2026-07-09" }],
"addressInfo": [{ "type": "Primary", "address": "...", "postal": "110044", "reportedDate": "2026-07-09" }],
"identityInfo": {
"pANId": [{ "idNumber": "ALVPJ0392C" }],
"voterID": [{ "idNumber": "..." }],
"passport": [{ "idNumber": "..." }]
}
},
"retailAccountsSummary": {
"noOfAccounts": "13",
"noOfActiveAccounts": "5",
"totalBalanceAmount": "1775989.00",
"totalPastDue": "0.00",
"oldestAccount": "Consumer Loan on 24-06-2014",
"recentAccount": "Personal Loan on 02-12-2025"
},
"retailAccountDetails": [
{
"institution": "Bajaj Finance Limited",
"accountType": "Personal Loan",
"accountStatus": "Current Account",
"balance": "3483",
"sanctionAmount": "1147028",
"dateOpened": "2024-03-09"
}
]
}
}]
}
}
}
}The report is nested several layers deep under data.cCRResponse.cIRReportDataLst[0].cIRReportData — the score is in scoreDetails, name/DOB/gender/ age/PAN/voter ID/passport/phone/email/address history in iDAndContactInfo, the account summary in retailAccountsSummary, and each individual loan/card in retailAccountDetails. This one endpoint already returns the full identity + bureau picture — there is no separate call needed for name/address. A person with no bureau history still returns HTTP 200 with cIRReportDataLst[0].error.errorDesc (e.g. "Consumer not found in bureau") and no cIRReportData — check for that key's presence rather than assuming a 200 means a report was found.
Try it
Live API call — may use credits
Mobile to Udyam
POST /financial/mobile-to-udyam
Looks up Udyam (MSME) registration details for a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit mobile number |
Example response
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "Udyam records retrieved Successfully",
"data": {
"result": [
{ "udyamName": "...", "udyamNumber": "UDYAM-UP-58-0027278", "panLinkedToUdyam": "" }
]
}
}
}A mobile number can return more than one Udyam registration — data.result is always an array, even for a single match.
Try it
Live API call — may use credits
Mobile to EPFO
POST /financial/mobile-to-epfo
Looks up EPFO (employment/UAN) details for a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit mobile number |
Example response (record found)
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "EPFO Search by Mobile Success.",
"data": {
"uan": ["100467553477", "100240533041"],
"individual": {
"name": "...",
"gender": "MALE",
"aadhaarVerificationStatus": "Verified"
},
"uanDetails": {
"100467553477": {
"establishmentName": "...",
"dateOfJoining": "2018-01-01",
"dateOfExit": "2026-01-05",
"isEmployed": false
}
}
}
}
}data.uan is just the list of UAN numbers found — the actual employment records are in data.uanDetails, keyed by each UAN number rather than being an array.
Example response (no record)
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "EPFO Details not found."
}
}A number with no EPFO record still returns HTTP 200 — check message for "not found" rather than assuming a 200 means a match was found.
Try it
Live API call — may use credits
PAN to Udyam
POST /financial/pan-to-udyam
Looks up Udyam (MSME) registration details for a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| panNumber | string | Yes | 10-character PAN |
Example response (no record)
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "No Udyam record found."
}
}Same as Mobile to Udyam — a "no record" result is still HTTP 200, so check message.
Try it
Live API call — may use credits
PAN to UAN
POST /financial/pan-to-uan
Finds the UAN (EPFO member account) linked to a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed). Invalid input returns HTTP 400/422 with an error.
Example response
{
"referenceId": "...",
"status": "success",
"result": { "uan": "100000000000", "name": "...", "memberId": "...", "dob": "..." }
}Try it
Live API call — may use credits
UAN Employment History
POST /financial/uan-history
Fetches the employment history recorded against a UAN.
| Field | Type | Required | Description |
|---|---|---|---|
| uan | string | Yes | 12-digit UAN |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed). Invalid input returns HTTP 400/422 with an error.
Example response
{
"referenceId": "...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs"
}Try it
Live API call — may use credits
Aadhaar to UAN
POST /financial/aadhaar-to-uan
Finds the UAN (EPFO member account) linked to an Aadhaar number.
| Field | Type | Required | Description |
|---|---|---|---|
| aadhaar | string | Yes | 12-digit Aadhaar number |
The Aadhaar number is masked (last 4 digits only) in responses and in our records.
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed). Invalid input returns HTTP 400/422 with an error.
Example response
{
"referenceId": "...",
"status": "success",
"result": { "uan": "100000000000", "aadhaar": "XXXXXXXX1234" }
}Try it
Live API call — may use credits
Credit Report - CIBIL
POST /financial/credit-report-cibil
Fetches a CIBIL credit report for a name + mobile number + PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Full name as on PAN |
| mobile | string | Yes | 10-digit mobile number |
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F |
| consent | boolean | Yes | Must be true — you hold the customer's consent to pull their credit report |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed). Invalid input returns HTTP 400/422 with an error.
Example response
{
"referenceId": "...",
"status": "success",
"result": { ...credit report fields... }
}Try it
Live API call — may use credits
PAN to UAN
POST /financial/pan-to-uan
Finds the UAN (EPFO member account) linked to a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/financial/pan-to-uan \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"dob": "string",
"uan": "string",
"name": "string",
"memberId": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No UAN (PF account) is linked to this PAN in the source data. The person may not have a PF account, or it is not linked to this PAN."
}Try it
Live API call — may use credits
UAN Employment History
POST /financial/uan-history
Fetches the employment history recorded against a UAN.
| Field | Type | Required | Description |
|---|---|---|---|
| uan | string | Yes | 12-digit UAN (also accepted as: uanNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/financial/uan-history \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"uan": "100000000000"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"uan": "string",
"name": "string",
"guardian_name": "string",
"employment_history": {
"1": {
"member_id": "string",
"date_of_exit": "string",
"date_of_joining": "string",
"establishment_name": "string"
}
}
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Aadhaar to UAN
POST /financial/aadhaar-to-uan
Finds the UAN (EPFO member account) linked to an Aadhaar number, live, in production. The Aadhaar number is masked in our records.
| Field | Type | Required | Description |
|---|---|---|---|
| aadhaar | string | Yes | 12-digit Aadhaar number (also accepted as: aadhaarNumber, aadhaar_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/financial/aadhaar-to-uan \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"aadhaar": "12-digit Aadhaar"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"uan": "string",
"aadhaar": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No UAN (PF account) is linked to this Aadhaar in the source data. The person may not have a PF account, or it is not linked to this Aadhaar."
}Try it
Live API call — may use credits
Credit Report - CIBIL
POST /financial/credit-report-cibil
Fetches a CIBIL credit report for a name + mobile number + PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Full name as on PAN |
| mobile | string | Yes | 10-digit Indian mobile number |
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
| consent | boolean | Yes | Must be true — you hold the customer's consent |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/financial/credit-report-cibil \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"name": "As on PAN",
"mobile": "9876543210",
"pan": "ABCDE1234F",
"consent": true
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"Asset": {
"Type": "string",
"Status": "string",
"AssetId": "string",
"CreationDate": "string",
"ExpirationDate": "string",
"SafetyCheckFailure": false,
"TrueLinkCreditReport": {
"Frozen": "string",
"Message": {
"Code": {
"...": "..."
},
"Type": {
"...": "..."
},
"text": "string"
},
"Sources": {
"Source": {
"...": "..."
}
},
"Borrower": {
"Birth": {
"...": "..."
},
"Gender": "string",
"Employer": {
"...": "..."
},
"CreditScore": {
"...": "..."
},
"borrowerKey": "string",
"BorrowerName": {
"...": "..."
},
"EmailAddress": {
"...": "..."
},
"BorrowerAddress": {
"...": "..."
},
"CreditStatement": {
"...": "..."
},
"BorrowerTelephone": {
"...": "..."
},
"IdentifierPartition": {
"...": "..."
}
},
"ReferenceKey": "string",
"FraudIndicator": false,
"currentversion": "string",
"InquiryPartition": {
"1": {
"...": "..."
}
},
"DeceasedIndicator": false,
"SafetyCheckPassed": true,
"TradeLinePartition": {
"1": {
"...": "..."
}
}
}
},
"htmlLink": "string",
"CreditSummaryData": {
"Inquires": "string",
"CreditMix": "string",
"OnTimePaymentHistory": "string",
"CreditCardUtilization": "string",
"OldestCreditAccountPeriod": "string"
}
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN Verification - Basic
POST /verify/pan-basic
Verifies a PAN and returns its basic details.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-basic \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN Verification - Detailed
POST /verify/pan-detailed
Verifies a PAN and returns its detailed profile.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-detailed \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"DOB": "string",
"PAN": "string",
"EMAIL": "string",
"GENDER": "string",
"MOBILE": "string",
"ADDRESS": {
"STATE": "string",
"PIN_CODE": "string",
"ADDRESS_LINE_1": "string",
"ADDRESS_LINE_2": "string",
"ADDRESS_LINE_3": "string",
"ADDRESS_LINE_4": "string",
"ADDRESS_LINE_5": "string"
},
"FULLNAME": "string",
"PAN_TYPE": "string",
"LAST_NAME": "string",
"FIRST_NAME": "string",
"MIDDLE_NAME": "string",
"AADHAAR_NUMBER": "string",
"AADHAAR_LINKAGE": true
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN Comprehensive
POST /verify/pan-comprehensive
Returns the most comprehensive set of details available for a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-comprehensive \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"dob": "string",
"tax": false,
"email": "string",
"fname": "string",
"gender": "string",
"address": {
"zip": "string",
"city": "string",
"full": "string",
"state": "string",
"line_1": "string",
"line_2": "string",
"country": "string",
"street_name": "string"
},
"category": "string",
"din_info": {
"din": "string",
"company_list": {},
"dinAllocationDate": "string"
},
"full_name": "string",
"less_info": false,
"pan_number": "string",
"is_director": {
"info": {},
"found": "string"
},
"phone_number": "string",
"aadhaar_linked": false,
"masked_aadhaar": "string",
"full_name_split": {
"1": "string"
},
"is_sole_proprietor": {
"info": {},
"found": "string"
}
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN to TAN
POST /financial/pan-to-tan
Finds the TAN (Tax Deduction Account Number) linked to a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/financial/pan-to-tan \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"pan": "string",
"tan_numbers": {
"1": {
"tan": "string",
"name": "string"
}
}
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No TAN is linked to this PAN in the source data. This does not mean the PAN is invalid (use PAN Verification to check the PAN itself). It is common for PANs of individuals, firms and LLPs that have no TAN registered."
}Try it
Live API call — may use credits
PAN to GST
POST /financial/pan-to-gst
Finds the GST registrations linked to a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/financial/pan-to-gst \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"gst_number": {
"1": "string"
},
"gst_details": {
"1": {
"gstin": "string",
"state": "string",
"status": "string",
"state_code": "string"
}
}
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No GST registration is linked to this PAN in the source data. The PAN may not be registered under GST."
}Try it
Live API call — may use credits
GST Verification
POST /verify/gst
Verifies a GSTIN and returns the registration details.
| Field | Type | Required | Description |
|---|---|---|---|
| gstin | string | Yes | 15-character GSTIN, e.g. 27ABCDE1234F1Z5 (also accepted as: gstNumber, gst_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/gst \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"gstin": "27ABCDE1234F1Z5"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"allFiling": {
"1": {
"<financial year>": {
"1": {
"...": "..."
}
}
}
},
"hsnDetails": {
"goods": {
"1": {
"hsnCode": "string",
"hsnDescription": "string"
}
},
"services": null
},
"basicDetails": {
"gstin": "string",
"ekycFlag": "string",
"tradeName": "string",
"aggreTurnOver": "string",
"memberDetails": {
"1": "string"
},
"businessNature": {
"1": "string"
},
"aadhaarVerified": "string",
"aggreTurnOverFY": "string",
"compositionRate": "string",
"isEInvoiceOpted": "string",
"cancellationDate": "string",
"percentTaxInCash": "string",
"registrationDate": "string",
"registrationType": "string",
"legalBusinessName": "string",
"stateJurisdiction": "string",
"isEInvoiceMandated": "string",
"percentTaxInCashFY": "string",
"registrationStatus": "string",
"centralJurisdiction": "string",
"constitutionOfBusiness": "string",
"natureOfCoreBusinessActivity": "string"
},
"branchDetails": {
"message": "string",
"principalAddress": {
"address": "string",
"natureOfBusiness": "string"
},
"additionalAddresses": {}
},
"liabilityPaidDetails": {
"currDetails": {
"1": {
"period": "string",
"liabPaidPct": 0
}
},
"currFinYear": "string",
"prevDetails": {
"1": {
"period": "string",
"liabPaidPct": 0
}
},
"prevFinYear": "string",
"prevTotalPct": 0
}
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
EPFO via PAN / Mobile
POST /financial/epfo
Fetches EPFO employment details using a PAN or a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | No | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
| mobile | string | No | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
Send at least one of pan or mobile.
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/financial/epfo \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F",
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"uan": {
"1": "string"
},
"summary": {
"uan_count": 0,
"is_employed": false,
"matching_uan": "string",
"date_of_exit_marked": true,
"employee_name_match": null,
"employer_name_match": null,
"recent_employer_data": {
"epfo": {
"is_recent": false,
"is_name_unique": true,
"has_pf_filings_details": true
},
"member_id": "string",
"date_of_exit": "string",
"leave_reason": "string",
"matching_uan": "string",
"date_of_joining": "string",
"establishment_id": "string",
"establishment_name": "string",
"employer_confidence_score": null
}
},
"uan_source": {
"1": {
"uan": "string",
"source": "string"
}
},
"uan_details": {
"<uan>": {
"basic_details": {
"name": "string",
"gender": "string",
"mobile": "string",
"date_of_birth": "string",
"employee_confidence_score": null,
"aadhaar_verification_status": 0
},
"additional_details": {
"pan": "string",
"email": "string",
"aadhaar": "string",
"relation": "string",
"bank_ifsc": "string",
"member_id": "string",
"bank_acc_no": "string",
"bank_address": "string",
"relative_name": "string"
},
"employment_details": {
"member_id": "string",
"date_of_exit": "string",
"leave_reason": "string",
"date_of_joining": "string",
"establishment_id": "string",
"establishment_name": "string",
"employer_confidence_score": null
}
}
},
"epfo_details": {
"matches": {
"1": {
"name": "string",
"confidence": 0,
"epf_history": {
"...": "..."
}
}
},
"pf_filing_details": {
"1": {
"wage_month": "string",
"total_amount": 0,
"employees_count": 0
}
},
"establishment_info": {
"date_of_setup": "string",
"ownership_type": "string",
"establishment_id": "string",
"establishment_name": "string"
}
},
"name_dob_filtering_score": null
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
ITR Compliance Check
POST /verify/itr-compliance
Checks a PAN's income-tax return filing compliance (Section 206AB / specified-person status).
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/itr-compliance \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"pan_status": "string",
"pan_allotted_date": "string",
"person_masked_name": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Company Name to CIN
POST /verify/company-to-cin
Finds the CIN (Corporate Identification Number) for a company name, live, in production. Covers companies only — LLPs have an LLPIN, not a CIN.
| Field | Type | Required | Description |
|---|---|---|---|
| company | string | Yes | Registered company name (at least 2 characters) (also accepted as: companyName, company_name) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/company-to-cin \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"company": "Acme Technologies Private Limited"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"1": {
"cin": "string",
"company": "string",
"incorporation_date": "string"
}
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No company with this name was found. Please use the exact registered name. Only companies have a CIN — LLPs and partnership firms are not covered by this check."
}Try it
Live API call — may use credits
DIN to PAN
POST /verify/din-to-pan
Looks up a director by DIN (Director Identification Number).
| Field | Type | Required | Description |
|---|---|---|---|
| din | string | Yes | 8-digit DIN (also accepted as: dinNumber, din_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/din-to-pan \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"din": "01234567"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Advance Mobile Verification
POST /verify/advance-mobile
Verifies a mobile number and returns the details available for it.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number, mob) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/advance-mobile \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile to Name
POST /verify/mobile-name
Finds the name registered against a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-name \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile to UPI
POST /verify/mobile-upi
Finds the UPI details linked to a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-upi \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
WhatsApp Check
POST /verify/whatsapp-check
Checks whether a mobile number is active on WhatsApp.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/whatsapp-check \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile Revoke
POST /verify/mobile-revoke
Checks whether a mobile number has been revoked or reassigned.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-revoke \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile to Carrier
POST /verify/mobile-carrier
Finds the telecom operator and circle of a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-carrier \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile to Director PAN
POST /verify/mobile-director-pan
Finds director PAN details linked to a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-director-pan \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile to ESIC
POST /verify/mobile-esic
Finds ESIC (employee state insurance) details linked to a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-esic \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
LPG through Mobile Number
POST /verify/lpg-mobile
Finds LPG connection details (HP, Bharat, Indane) linked to a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/lpg-mobile \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile Extensive
POST /verify/mobile-extensive
Returns the extensive set of details available for a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-extensive \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Mobile to GST
POST /verify/mobile-gst
Finds the GST registrations linked to a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/mobile-gst \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No GST registration is linked to this mobile number in the source data."
}Try it
Live API call — may use credits
Corporate Pro (Mobile to EPFO)
POST /verify/corporate-pro
Fetches EPFO employment details from a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number, mob_no) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/corporate-pro \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
EPFO Advance + History via PAN & Mobile
POST /verify/epfo-advance
Fetches advanced EPFO details and employment history using a PAN and a mobile number together.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number, mob_no) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/epfo-advance \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F",
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Skip Tracing
POST /verify/skip-tracing
Returns tracing details (linked identities and addresses) for a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/skip-tracing \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Skip Tracing Supreme
POST /verify/skip-tracing-supreme
Returns the fullest tracing report available for a mobile number.
| Field | Type | Required | Description |
|---|---|---|---|
| mobile | string | Yes | 10-digit Indian mobile number (also accepted as: mobileNumber, mobile_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/skip-tracing-supreme \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"mobile": "9876543210"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN Advanced Business Verification
POST /verify/pan-business
Verifies a business PAN and returns the business details.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-business \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"director_pan": "string",
"organisation_name": "string",
"organisation_incorporate_date": "string",
"organisation_email": "string",
"organisation_mobile": "string",
"organisation_address": {},
"director_or_sole_proprietor_details": {
"dob": "string",
"first_name": "string",
"middle_name": "string",
"last_name": "string",
"full_name": "string",
"pan_type": "string",
"mobile": "string",
"email": "string",
"gender": "string",
"address": "string",
"aadhaar": "string"
},
"cin": "string",
"director_din": "string",
"pan": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN to Masked Aadhaar
POST /verify/pan-mask-aadhaar
Finds the masked Aadhaar number linked to a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-mask-aadhaar \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"aadhaar_number": "string",
"pan": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN Aadhaar Linkage
POST /verify/pan-aadhaar-link
Checks whether a PAN is linked to an Aadhaar number.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
| aadhaar | string | Yes | Last 4 digits of the Aadhaar number (the full 12 digits are also accepted) (also accepted as: aadhaarNumber, aadhaar_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-aadhaar-link \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F",
"aadhaar": "Last 4 digits"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"aadhaar_number": "string",
"pan": "string",
"pan_adhr_link_status": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN to Father Name
POST /verify/pan-father-name
Finds the father's name recorded against a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-father-name \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"pan": "string",
"father_name": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN to IEC (Import Export Code)
POST /verify/pan-iec
Finds the Import Export Code (IEC) details linked to a PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-iec \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No Import Export Code is linked to this PAN in the source data."
}Try it
Live API call — may use credits
PAN & TAN to TDS
POST /verify/pan-tan-tds
Fetches TDS details for a PAN and TAN for a financial year and quarter.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
| tan | string | Yes | 10-character TAN, e.g. DELS67631E |
| financial_year | string | Yes | Financial year, e.g. 2024-25 (also accepted as: financialYear) |
| quarter | string | Yes | Quarter number: 1, 2, 3 or 4 |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-tan-tds \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F",
"tan": "DELS67631E",
"financial_year": "2024-25",
"quarter": "1"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
PAN Advance Plus Father
POST /verify/pan-advance-father
Verifies a PAN and returns the advanced profile including the father's name.
| Field | Type | Required | Description |
|---|---|---|---|
| pan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/pan-advance-father \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"pan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"aadhaar_linked": true,
"address": {
"line_1": "string",
"line_2": "string",
"street_name": "string",
"city": "string",
"state": "string",
"zip": "string",
"country": "string",
"full": "string"
},
"category": "string",
"dob": "string",
"email": "string",
"first_name": "string",
"middle_name": "string",
"last_name": "string",
"full_name": "string",
"fname": "string",
"gender": "string",
"masked_aadhaar": "string",
"phone_number": "string"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
TAN Verification
POST /verify/tan-verification
Verifies a TAN (Tax Deduction / Collection Account Number) and returns its details.
| Field | Type | Required | Description |
|---|---|---|---|
| tan | string | Yes | 10-character TAN, e.g. DELS67631E |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/tan-verification \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"tan": "DELS67631E"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Shop and Establishment Verification
POST /verify/shop-establishment
Verifies a Shop and Establishment registration.
| Field | Type | Required | Description |
|---|---|---|---|
| regNo | string | Yes | Shop and Establishment registration number (also accepted as: reg_no, registrationNumber) |
| areaCode | string | Yes | State / area code of the registration, e.g. DL for Delhi (also accepted as: area_code) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/shop-establishment \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"regNo": "2017000456",
"areaCode": "DL"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
FSSAI Verification
POST /verify/fssai
Verifies an FSSAI food licence number.
| Field | Type | Required | Description |
|---|---|---|---|
| food_license_number | string | Yes | 14-digit FSSAI licence number (also accepted as: fssai, licenseNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/fssai \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"food_license_number": "12345678901234"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
GST Advance
POST /verify/gst-advance
Returns the advanced details of a GSTIN.
| Field | Type | Required | Description |
|---|---|---|---|
| gstin | string | Yes | 15-character GSTIN, e.g. 27ABCDE1234F1Z5 (also accepted as: gstNumber, gst_number, gst, gst_no) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/gst-advance \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"gstin": "27ABCDE1234F1Z5"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
GST Details
POST /verify/gst-details
Returns the registration details of a GSTIN.
| Field | Type | Required | Description |
|---|---|---|---|
| gstin | string | Yes | 15-character GSTIN, e.g. 27ABCDE1234F1Z5 (also accepted as: gstNumber, gst_number, gst, gst_no) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/gst-details \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"gstin": "27ABCDE1234F1Z5"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Company to GST
POST /verify/company-gst
Finds the GST registrations for a company name.
| Field | Type | Required | Description |
|---|---|---|---|
| business_company_name | string | Yes | Registered company name (at least 2 characters) (also accepted as: companyName, company_name, company) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/company-gst \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"business_company_name": "Acme Technologies Private Limited"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "No GST registration was found for this company name. Please use the exact registered name."
}Try it
Live API call — may use credits
CIN Search
POST /verify/cin-search
Looks up a company by CIN (Corporate Identification Number).
| Field | Type | Required | Description |
|---|---|---|---|
| cin | string | Yes | 21-character CIN (also accepted as: cinNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/cin-search \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"cin": "U74899DL1989PTC037732"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Udyam / MSME Verification
POST /verify/udyam-verify
Verifies an Udyam (MSME) registration number.
| Field | Type | Required | Description |
|---|---|---|---|
| registration_no | string | Yes | Udyam number, e.g. UDYAM-DL-01-1234567 (also accepted as: udyam, udyamNumber, registrationNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/udyam-verify \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"registration_no": "UDYAM-XX-00-0000000"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Establishment Name to Establishment
POST /verify/establishment-name
Finds EPFO establishments matching an establishment name.
| Field | Type | Required | Description |
|---|---|---|---|
| establishment_name | string | Yes | Establishment name (at least 2 characters) (also accepted as: establishmentName) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/establishment-name \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"establishment_name": "Acme Technologies"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Establishment Code to Establishment Details
POST /verify/establishment-code
Fetches EPFO establishment details from an establishment code.
| Field | Type | Required | Description |
|---|---|---|---|
| establishment_code | string | Yes | EPFO establishment code, e.g. DSNOI0000000 (also accepted as: establishmentCode) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/establishment-code \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"establishment_code": "DSNOI0000000"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
BIR (Business Information Report)
POST /verify/bir
Fetches a Business Information Report for a company using its CIN and PAN.
| Field | Type | Required | Description |
|---|---|---|---|
| companyCin | string | Yes | 21-character CIN (also accepted as: cin, company_cin) |
| companyPan | string | Yes | 10-character PAN, e.g. ABCDE1234F (also accepted as: pan, company_pan) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/bir \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"companyCin": "U74899DL1989PTC037732",
"companyPan": "ABCDE1234F"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Electricity Bill
POST /verify/electricity-bill
Fetches electricity bill details for a consumer ID with a supported provider.
| Field | Type | Required | Description |
|---|---|---|---|
| consumer_id | string | Yes | Consumer / customer ID on the bill (also accepted as: consumerId) |
| service_provider | string | Yes | Electricity provider code, e.g. SBPDCL (ask us for the list of supported providers) (also accepted as: serviceProvider, provider) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/electricity-bill \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"consumer_id": "1000038938",
"service_provider": "SBPDCL"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
LPG Pipeline
POST /verify/lpg-pipeline
Fetches piped gas (Adani Gas, Mahanagar Gas, Indraprastha Gas) connection details.
| Field | Type | Required | Description |
|---|---|---|---|
| consumer_id | string | Yes | Consumer / customer ID on the bill (also accepted as: consumerId) |
| service_provider | string | Yes | Gas provider code, e.g. AG for Adani Gas (ask us for the list of supported providers) (also accepted as: serviceProvider, provider) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/lpg-pipeline \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"consumer_id": "1000038938",
"service_provider": "AG"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
LPG Cylinder
POST /verify/lpg-cylinder
Fetches LPG cylinder connection details (Bharat, HP Gas, Indane).
| Field | Type | Required | Description |
|---|---|---|---|
| consumer_id | string | Yes | Consumer / customer ID on the bill (also accepted as: consumerId) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/lpg-cylinder \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"consumer_id": "1000038938"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Passport MRZ
POST /verify/passport-mrz
Verifies passport details as printed in the machine-readable zone.
| Field | Type | Required | Description |
|---|---|---|---|
| doc_type | string | Yes | Document type letter, normally P |
| issuing_country | string | Yes | 3-letter country code, e.g. IND |
| surname | string | Yes | Surname as on the passport |
| given_names | string | Yes | Given names as on the passport |
| passport_num | string | Yes | Passport number |
| nationality | string | Yes | Nationality as on the passport |
| dob | string | Yes | Date of birth as DD/MM/YYYY (also accepted as: dateOfBirth, date_of_birth) |
| sex | string | Yes | M, F or X |
| expiry_date | string | Yes | Expiry date as DD/MM/YYYY (also accepted as: expiryDate) |
| personal_num | string | No | Personal number, if printed on the passport |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/passport-mrz \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"doc_type": "P",
"issuing_country": "IND",
"surname": "SHARMA",
"given_names": "ANITA KUMARI",
"passport_num": "P1234567",
"nationality": "INDIAN",
"dob": "DD/MM/YYYY",
"sex": "F",
"expiry_date": "DD/MM/YYYY"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Passport through File Number
POST /verify/passport-file
Checks a passport application using its file number and date of birth.
| Field | Type | Required | Description |
|---|---|---|---|
| file_number | string | Yes | Passport file number, e.g. HYB123456789012 (also accepted as: fileNumber) |
| dob | string | Yes | Date of birth as DD/MM/YYYY (also accepted as: dateOfBirth, date_of_birth) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/passport-file \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"file_number": "HYB000000000000",
"dob": "DD/MM/YYYY"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Driving License Verification
POST /verify/driving-license
Verifies a driving licence using its number and date of birth.
| Field | Type | Required | Description |
|---|---|---|---|
| dl_no | string | Yes | Driving licence number, e.g. UP1420110012345 (spaces are ignored) (also accepted as: dlNumber, licenseNumber) |
| dob | string | Yes | Date of birth as DD-MM-YYYY (also accepted as: dateOfBirth, date_of_birth) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/driving-license \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"dl_no": "UP1420110012345",
"dob": "DD-MM-YYYY"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Voter ID
POST /verify/voter-id
Verifies a Voter ID (EPIC) number.
| Field | Type | Required | Description |
|---|---|---|---|
| voter | string | Yes | Voter ID (EPIC) number, e.g. ABC1234567 (also accepted as: voterId, epic) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/voter-id \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"voter": "ABC1234567"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Advance Email Verification
POST /verify/email-verification
Verifies an email address and returns the details available for it.
| Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | A valid email address (also accepted as: emailId, email_id) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/email-verification \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"email": "name@example.com"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Distance Verification
POST /verify/distance
Checks how far apart the given locations are against a distance threshold (km).
| Field | Type | Required | Description |
|---|---|---|---|
| location_1 | string | Yes | First location (address or area) (also accepted as: location1) |
| location_2 | string | Yes | Second location (address or area) (also accepted as: location2) |
| location_3 | string | No | Third location, optional (also accepted as: location3) |
| threshold | string | No | Distance threshold in km |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/distance \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"location_1": "Noida sector 15",
"location_2": "Noida sector 18",
"location_3": "Noida sector 2",
"threshold": "50"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
RC Advance ++
POST /verify/rc-advance-plus
Returns the most detailed vehicle registration (RC) report.
| Field | Type | Required | Description |
|---|---|---|---|
| vehicle_no | string | Yes | Vehicle registration number, e.g. MH12AB1234 (also accepted as: vehicle_registration_number, vehicleNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/rc-advance-plus \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"vehicle_no": "MH12AB1234"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
RC Challan
POST /verify/rc-challan
Fetches traffic challans against a vehicle registration number.
| Field | Type | Required | Description |
|---|---|---|---|
| vehicle_no | string | Yes | Vehicle registration number, e.g. MH12AB1234 (also accepted as: registration_number, vehicleNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/rc-challan \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"vehicle_no": "MH12AB1234"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
RC Advance
POST /verify/rc-advance
Returns detailed vehicle registration (RC) information.
| Field | Type | Required | Description |
|---|---|---|---|
| vehicle_no | string | Yes | Vehicle registration number, e.g. MH12AB1234 (also accepted as: vehicle_no, vehicleNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/rc-advance \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"vehicle_no": "MH12AB1234"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Chassis to RC
POST /verify/chassis-to-rc
Finds the vehicle registration (RC) details for a chassis number.
| Field | Type | Required | Description |
|---|---|---|---|
| chassis_no | string | Yes | Vehicle chassis number, e.g. MA1AB2CD3E4F56789 (spaces are ignored) (also accepted as: chassisNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/chassis-to-rc \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"chassis_no": "MA1AB2CD3E4F56789"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
FASTag Verification
POST /verify/fastag
Fetches FASTag details for a vehicle.
| Field | Type | Required | Description |
|---|---|---|---|
| vehicle_no | string | Yes | Vehicle registration number, e.g. MH12AB1234 (also accepted as: vehicle_no, vehicleNumber) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/fastag \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"vehicle_no": "MH12AB1234"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
UPI Verification
POST /verify/upi-verification
Verifies a UPI ID and returns the account holder name.
| Field | Type | Required | Description |
|---|---|---|---|
| upi_id | string | Yes | UPI ID, e.g. name@okaxis (also accepted as: upiId, vpa) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/upi-verification \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"upi_id": "name@bank"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
UPI Details
POST /verify/upi-details
Fetches the details linked to a UPI ID.
| Field | Type | Required | Description |
|---|---|---|---|
| digital_payment_id | string | Yes | UPI ID, e.g. name@ptyes (also accepted as: upi_id, upiId, vpa) |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/upi-details \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"digital_payment_id": "name@bank"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
IFSC to Branch Details
POST /verify/ifsc-branch
Returns the bank and branch details for an IFSC.
| Field | Type | Required | Description |
|---|---|---|---|
| ifsc | string | Yes | 11-character IFSC, e.g. HDFC0001234 |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/ifsc-branch \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"ifsc": "HDFC0001234"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Bank Account Verification (BAV)
POST /verify/bank-account-bav
Verifies a bank account number and IFSC (supports 579 banks) and returns the account holder name.
| Field | Type | Required | Description |
|---|---|---|---|
| account_number | string | Yes | Bank account number (6 to 20 digits) (also accepted as: accountNumber) |
| ifsc | string | Yes | 11-character IFSC, e.g. HDFC0001234 |
status is "success" with a result, or "no_records" when the lookup completed but nothing matched (still billed) — that response also carries a hint explaining the likely reason. Invalid input returns HTTP 400/422 with an error naming the field to fix.
Example request
curl -X POST https://os.letsfin.in/api/v1/verify/bank-account-bav \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json" \
-d '{
"account_number": "123456789012",
"ifsc": "HDFC0001234"
}'Example response
{
"referenceId": "3f2b1c9e-...",
"status": "success",
"result": {
"...": "details returned by the source"
}
}When nothing matches
{
"referenceId": "3f2b1c9e-...",
"status": "no_records",
"message": "No records found for the given ID or combination of inputs",
"hint": "The lookup worked but the source has no record for this input. Please check the details and try again."
}Try it
Live API call — may use credits
Bank Verification - Penny-less
POST /verify/bank-pennyless
Confirms a bank account number + IFSC and returns the account holder's name, without depositing any money.
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber | string | Yes | Bank account number (9 to 18 digits) |
| ifsc | string | Yes | 11-character IFSC, e.g. HDFC0000370 |
| remark | string | No | Your own reference note (up to 100 characters) |
A completed check always returns HTTP 200. status is "verified" or "not_verified" — both are charged. Invalid input returns HTTP 400. If the service is temporarily unavailable you get HTTP 503; those calls are not charged, retry after a few minutes.
Example response
{
"referenceId": "6f2a1c9e-...",
"status": "verified",
"result": {
"accountExists": true,
"accountHolderName": "RAJESH KUMAR SHARMA",
"remarks": "Bank Account details verified successfully",
"ifscDetails": { "bank": "HDFC Bank", "branch": "THANE", "ifsc": "HDFC0000370", "imps": true, "neft": true, "rtgs": true, "upi": true }
}
}Try it
Live API call — may use credits
Bank Verification - Penny Drop
POST /verify/bank-penny-drop
Confirms a bank account number + IFSC with a small test deposit and returns the account holder's name and IMPS reference.
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber | string | Yes | Bank account number (9 to 18 digits) |
| ifsc | string | Yes | 11-character IFSC, e.g. HDFC0000370 |
| remark | string | No | Your own reference note (up to 100 characters) |
A completed check always returns HTTP 200. status is "verified" or "not_verified" — both are charged. Invalid input returns HTTP 400. If the service is temporarily unavailable you get HTTP 503; those calls are not charged, retry after a few minutes.
Example response
{
"referenceId": "6f2a1c9e-...",
"status": "verified",
"result": {
"accountExists": true,
"accountHolderName": "RAJESH KUMAR SHARMA",
"remarks": "Bank Account details verified successfully",
"ifscDetails": { "bank": "HDFC Bank", "branch": "THANE", "ifsc": "HDFC0000370", "imps": true, "neft": true, "rtgs": true, "upi": true }
}
}Try it
Live API call — may use credits
Name Match
POST /kyc/name-match
Compares two names for textual and phonetic similarity.
| Field | Type | Required | Description |
|---|---|---|---|
| text1 | string | Yes | First name |
| text2 | string | Yes | Second name |
| textualThreshold | number | No | Minimum textual match % to pass (default 80) |
| phoneticThreshold | number | No | Minimum phonetic match % to pass (default 80) |
Example response
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "Successfully performed matching",
"data": {
"textualMatch": { "matchScore": 100, "matchStatus": true },
"phoneticMatch": { "matchScore": 100, "matchStatus": true }
}
}
}Try it
Live API call — may use credits
Name Match (Aadhaar/PAN)
Checks a name against the customer's real Aadhaar/PAN record — the plain Name Match above only compares two strings you provide yourself, with no document involved. This one is not instant: the customer has to complete an actual DigiLocker login before a result exists, so it's a two-step flow like Aadhaar (DigiLocker) above, not a single synchronous call.
POST /kyc/name-match-document/session
Creates a verification session and returns a link to open for the customer.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | The name to check against their Aadhaar/PAN record |
| mobile | string | No | Pre-fill the customer's mobile number |
| nameMatchCutoff | number | No | Minimum match % to pass (default 80) |
| redirectUrl | string | No | Where to send the customer's browser after they finish |
Example response
{
"referenceId": "6f2a1c9e-...",
"result": {
"status": "SUCCESS",
"message": "Session URL generated successfully",
"data": { "url": "https://<verification session link>" }
}
}Open result.data.url for the customer. Once they complete the DigiLocker flow (sharing both Aadhaar and PAN), poll the status endpoint below using the same referenceId.
Try it
Live API call — may use credits
POST /kyc/name-match-document/status
Checks the result of a session you created. Only returns sessions created with your own API key.
| Field | Type | Required | Description |
|---|---|---|---|
| referenceId | string | Yes | The referenceId returned when the session was created |
Example response
{
"found": true,
"status": "success",
"result": {
"data": {
"NAME_MATCH_SUMMARY": {
"nameMatchPercentage": 92,
"matchStatus": true,
"cutoffThreshold": 80,
"remarks": "Name matched successfully."
}
}
}
}status is pending until the customer finishes, then success or failed — check NAME_MATCH_SUMMARY.matchStatus for the actual pass/fail, not just the HTTP status.
Try it
Live API call — may use credits
Image Liveness
POST /kyc/liveness/image
Checks a single photo for signs of spoofing (a printed photo, a screen replay) rather than a genuine live capture.
| Field | Type | Required | Description |
|---|---|---|---|
| image | string | Yes | Base64-encoded photo (JPEG/PNG). The detected face must be at least 128x128px |
| consentPurpose | string | No | 20-50 characters |
Example response
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "Passive liveness check performed successfully",
"data": { "live": false, "livenessScore": 7.19, "needToReview": true }
}
}The call can succeed (HTTP 200) while data.live is false — that's the check correctly catching a spoof, not a failed request. Check data.live, not just the HTTP status.
Try it
Live API call — may use credits
Video Liveness
POST /kyc/liveness/video
Checks a short video clip (max 20MB, max 10 seconds, .mp4/.webm) for signs of spoofing.
| Field | Type | Required | Description |
|---|---|---|---|
| video | string | No | Base64-encoded video file — required if videoUrl isn't given |
| videoUrl | string | No | A URL to the video — required if video isn't given |
| consentPurpose | string | No | Why you're checking this — shown in your audit trail |
Provide exactly one of video or videoUrl.
Example response
{
"referenceId": "...",
"result": {
"status": "SUCCESS",
"message": "Liveliness check performed successfully",
"data": { "status": "FAILURE", "confidence": "0.2495" }
}
}Note the shape differs from Image Liveness above — this one has no live/livenessScore fields, just data.status (SUCCESS/FAILURE) and data.confidence (a 0-1 decimal, as a string). The call can succeed (HTTP 200) while data.status is FAILURE — that's the check correctly catching a spoof or a low-confidence clip, not a failed request.
Try it
Live API call — may use credits
Errors
| Status | Meaning |
|---|---|
| 400 Bad Request | Missing or invalid input |
| 401 Unauthorized | Missing or invalid API key, or the key was auto-blocked after too many failed calls — see the error field |
| 402 Payment Required | No remaining credits, or your plan has expired — contact us to top up |
| 403 Forbidden | Your key doesn't have access to this API |
| 404 Not Found | No matching record for that reference ID |
| 422 Unprocessable | The source rejected the input (wrong format, or the ID does not exist) — the error field says what to fix. This counts as a call |
| 429 Too Many Requests | Too many requests in a short time — wait a moment and retry |
| 501 Not Implemented | This API isn't fully configured yet — contact us |
| 502 Bad Gateway | The verification could not be completed — see the error field in the response |
| 503 Service Unavailable | The source (for example a government portal) is temporarily down — retry after a short while. You are not charged for this |
Questions or need a new API enabled on your key? Reach out to your Letsfin account contact.