Saved in this browser. Connection checks don't use credits; endpoint Try it requests are live and may use credits.

Letsfin

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/v1

API 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.

FieldTypeRequiredDescription
panNumberstringYes10-character PAN, e.g. ABCDE1234F
consentPurposestringNoWhy 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.

FieldTypeRequiredDescription
panNumberstringYes10-character PAN, e.g. ABCDE1234F
consentPurposestringNoWhy 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.

FieldTypeRequiredDescription
mobilestringNoPre-fill the customer's mobile number
redirectUrlstringNoWhere 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.

FieldTypeRequiredDescription
referenceIdstringYesThe 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

FieldTypeRequiredDescription
namestringYesCustomer's full name as recorded on Aadhaar
redirectUrlstringNoWhere to send the customer's browser after completion
faceAuthenticationbooleanNoRequest 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.

FieldTypeRequiredDescription
imagesstring[]YesAt least 2 base64-encoded images — the first is the source (selfie), the rest are compared against it
thresholdnumberNoMinimum 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.

FieldTypeRequiredDescription
accountNumberstringYesBank account number
ifscstringYesBank branch IFSC code
namestringNoExpected 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.

FieldTypeRequiredDescription
accountNumberstringYesBank account number
ifscstringYesBank branch IFSC code
namestringNoExpected 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.

FieldTypeRequiredDescription
upiVpastringYesUPI 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

FieldTypeRequiredDescription
namestringYesFull name to screen
fatherNamestringNoFather's name, improves match accuracy
dobstringNoDate of birth, format DD/MM/YYYY
panNumberstringNoPAN number
mobileNumberstringNoMobile number
passportNumberstringNoPassport number
addressstringNoAddress
exactMatchbooleanNoRestrict 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.

FieldTypeRequiredDescription
referenceIdstringYesThe 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

FieldTypeRequiredDescription
namestringYesFull name to search
addressstringYesAddress, improves match accuracy
fatherNamestringNoFather's name
dobstringNoDate of birth
typestringNo"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.

FieldTypeRequiredDescription
referenceIdstringYesThe 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

FieldTypeRequiredDescription
statestringYesState name (must match the source's spelling exactly)
districtstringYesDistrict name
tehsilstringYesTehsil name
villagestringYesVillage name
survey_nostringYesSurvey / khasra number
service_typestringNo"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.

FieldTypeRequiredDescription
referenceIdstringYesThe 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.

FieldTypeRequiredDescription
namestringYesFull name (2-40 characters)
mobilestringYes10-digit mobile number
inquiryPurposestringYesTwo-letter code: PL, CC, CL, HL, GL, or BL
panNumberstringNoPAN number, improves match accuracy
dobstringNoDate 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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
panNumberstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
uanstringYes12-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.

FieldTypeRequiredDescription
aadhaarstringYes12-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.

FieldTypeRequiredDescription
namestringYesFull name as on PAN
mobilestringYes10-digit mobile number
panstringYes10-character PAN, e.g. ABCDE1234F
consentbooleanYesMust 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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
uanstringYes12-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.

FieldTypeRequiredDescription
aadhaarstringYes12-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.

FieldTypeRequiredDescription
namestringYesFull name as on PAN
mobilestringYes10-digit Indian mobile number
panstringYes10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number)
consentbooleanYesMust 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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
gstinstringYes15-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.

FieldTypeRequiredDescription
panstringNo10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number)
mobilestringNo10-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).

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
companystringYesRegistered 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).

FieldTypeRequiredDescription
dinstringYes8-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
panstringYes10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number)
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
mobilestringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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 to Father Name

POST /verify/pan-father-name

Finds the father's name recorded against a PAN.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
panstringYes10-character PAN, e.g. ABCDE1234F (also accepted as: panNumber, pan_number)
tanstringYes10-character TAN, e.g. DELS67631E
financial_yearstringYesFinancial year, e.g. 2024-25 (also accepted as: financialYear)
quarterstringYesQuarter 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.

FieldTypeRequiredDescription
panstringYes10-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.

FieldTypeRequiredDescription
tanstringYes10-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.

FieldTypeRequiredDescription
regNostringYesShop and Establishment registration number (also accepted as: reg_no, registrationNumber)
areaCodestringYesState / 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.

FieldTypeRequiredDescription
food_license_numberstringYes14-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.

FieldTypeRequiredDescription
gstinstringYes15-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.

FieldTypeRequiredDescription
gstinstringYes15-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.

FieldTypeRequiredDescription
business_company_namestringYesRegistered 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

Udyam / MSME Verification

POST /verify/udyam-verify

Verifies an Udyam (MSME) registration number.

FieldTypeRequiredDescription
registration_nostringYesUdyam 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.

FieldTypeRequiredDescription
establishment_namestringYesEstablishment 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.

FieldTypeRequiredDescription
establishment_codestringYesEPFO 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.

FieldTypeRequiredDescription
companyCinstringYes21-character CIN (also accepted as: cin, company_cin)
companyPanstringYes10-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.

FieldTypeRequiredDescription
consumer_idstringYesConsumer / customer ID on the bill (also accepted as: consumerId)
service_providerstringYesElectricity 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.

FieldTypeRequiredDescription
consumer_idstringYesConsumer / customer ID on the bill (also accepted as: consumerId)
service_providerstringYesGas 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).

FieldTypeRequiredDescription
consumer_idstringYesConsumer / 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.

FieldTypeRequiredDescription
doc_typestringYesDocument type letter, normally P
issuing_countrystringYes3-letter country code, e.g. IND
surnamestringYesSurname as on the passport
given_namesstringYesGiven names as on the passport
passport_numstringYesPassport number
nationalitystringYesNationality as on the passport
dobstringYesDate of birth as DD/MM/YYYY (also accepted as: dateOfBirth, date_of_birth)
sexstringYesM, F or X
expiry_datestringYesExpiry date as DD/MM/YYYY (also accepted as: expiryDate)
personal_numstringNoPersonal 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.

FieldTypeRequiredDescription
file_numberstringYesPassport file number, e.g. HYB123456789012 (also accepted as: fileNumber)
dobstringYesDate 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.

FieldTypeRequiredDescription
dl_nostringYesDriving licence number, e.g. UP1420110012345 (spaces are ignored) (also accepted as: dlNumber, licenseNumber)
dobstringYesDate 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.

FieldTypeRequiredDescription
voterstringYesVoter 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.

FieldTypeRequiredDescription
emailstringYesA 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).

FieldTypeRequiredDescription
location_1stringYesFirst location (address or area) (also accepted as: location1)
location_2stringYesSecond location (address or area) (also accepted as: location2)
location_3stringNoThird location, optional (also accepted as: location3)
thresholdstringNoDistance 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.

FieldTypeRequiredDescription
vehicle_nostringYesVehicle 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.

FieldTypeRequiredDescription
vehicle_nostringYesVehicle 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.

FieldTypeRequiredDescription
vehicle_nostringYesVehicle 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.

FieldTypeRequiredDescription
chassis_nostringYesVehicle 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.

FieldTypeRequiredDescription
vehicle_nostringYesVehicle 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.

FieldTypeRequiredDescription
upi_idstringYesUPI 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.

FieldTypeRequiredDescription
digital_payment_idstringYesUPI 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.

FieldTypeRequiredDescription
ifscstringYes11-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.

FieldTypeRequiredDescription
account_numberstringYesBank account number (6 to 20 digits) (also accepted as: accountNumber)
ifscstringYes11-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.

FieldTypeRequiredDescription
accountNumberstringYesBank account number (9 to 18 digits)
ifscstringYes11-character IFSC, e.g. HDFC0000370
remarkstringNoYour 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.

FieldTypeRequiredDescription
accountNumberstringYesBank account number (9 to 18 digits)
ifscstringYes11-character IFSC, e.g. HDFC0000370
remarkstringNoYour 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.

FieldTypeRequiredDescription
text1stringYesFirst name
text2stringYesSecond name
textualThresholdnumberNoMinimum textual match % to pass (default 80)
phoneticThresholdnumberNoMinimum 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.

FieldTypeRequiredDescription
namestringYesThe name to check against their Aadhaar/PAN record
mobilestringNoPre-fill the customer's mobile number
nameMatchCutoffnumberNoMinimum match % to pass (default 80)
redirectUrlstringNoWhere 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.

FieldTypeRequiredDescription
referenceIdstringYesThe 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.

FieldTypeRequiredDescription
imagestringYesBase64-encoded photo (JPEG/PNG). The detected face must be at least 128x128px
consentPurposestringNo20-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.

FieldTypeRequiredDescription
videostringNoBase64-encoded video file — required if videoUrl isn't given
videoUrlstringNoA URL to the video — required if video isn't given
consentPurposestringNoWhy 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

StatusMeaning
400 Bad RequestMissing or invalid input
401 UnauthorizedMissing or invalid API key, or the key was auto-blocked after too many failed calls — see the error field
402 Payment RequiredNo remaining credits, or your plan has expired — contact us to top up
403 ForbiddenYour key doesn't have access to this API
404 Not FoundNo matching record for that reference ID
422 UnprocessableThe 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 RequestsToo many requests in a short time — wait a moment and retry
501 Not ImplementedThis API isn't fully configured yet — contact us
502 Bad GatewayThe verification could not be completed — see the error field in the response
503 Service UnavailableThe 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.