Skip to content

Published services, current details, and clear categories.

Explore APIs
Developers

Verification APIs with one integration to maintain.

Read the request and response shape before you write any code. The sections below show how an integration goes together, and what moving onto one integration removes from your code.

Service families

  • Banking ServicesBank account, UPI, and face-match services for secure payment and onboarding workflows.
  • Legal ServicesDigital signing, stamp-duty, and certificate-verification services for compliant document workflows.
  • KYC ServicesAadhaar, PAN, Voter ID, passport, driving licence, and KYC document OCR services for secure customer onboarding.
  • KYB ServicesBusiness identity, registration, and business document OCR services for confident merchant onboarding.
  • Corporate Registry ServicesCompany, director, and corporate identifier lookups for onboarding, diligence, and vendor checks.
  • Tax & Compliance ServicesGSTIN, e-Way Bill, and e-invoice verification services for tax, billing, and goods-movement workflows.
  • Vehicle ServicesVehicle registration, compliance, toll-tag, and vehicle document OCR services for mobility workflows.
  • Document OCR APIsOCR services for utility bills, invoices, IDs, statements, receipts, reports, and other customer documents.
Published catalog

What this reference covers

Both figures are counts of what the catalog publishes, read from the catalog itself when this page was built.

100+

Verification APIs

8

Service families

The endpoint explorer

Every endpoint, with the request and response shape

Every published endpoint, grouped by family, from a catalog of 100+ verification APIs. The worked example below uses PAN Verification API. Every other endpoint takes the same request shape and returns the same four fields, with only the path and the body fields changing.

You can read and copy the samples here. Nothing on this panel sends a real request.

Filter the endpoint directory by family

Banking Services6

Legal Services4

KYC Services12

KYB Services6

Corporate Registry Services4

Tax & Compliance Services3

Vehicle Services9

Document OCR APIs21

Endpoints across 8 families. Pick a row to open its full reference.

POST/v1/pan-kyc

PAN Verification API

KYC Services

Body

pan_numberABCDE1234F10 characters
consentYrequired on every call
Request language
cURL
curl -X POST "$FINSOUR_API_BASE_URL/v1/pan-kyc" \  -H "Authorization: Bearer $FINSOUR_API_KEY" \  -H "Content-Type: application/json" \  -d '{       "pan_number": "ABCDE1234F",       "consent": "Y"     }'
Node
const res = await fetch(`${process.env.FINSOUR_API_BASE_URL}/v1/pan-kyc`, {  method: "POST",  headers: {    Authorization: `Bearer ${process.env.FINSOUR_API_KEY}`,    "Content-Type": "application/json",  },  body: JSON.stringify({    "pan_number": "ABCDE1234F",    "consent": "Y"  }),}); const { success, data } = await res.json();
Python
import osimport requests res = requests.post(    os.environ["FINSOUR_API_BASE_URL"] + "/v1/pan-kyc",    headers={"Authorization": f"Bearer {os.environ['FINSOUR_API_KEY']}"},    json={      "pan_number": "ABCDE1234F",      "consent": "Y"    },    timeout=10,) payload = res.json()

Response

200 · Verified
response
{  "success": true,  "message": "Verified",  "data": {    "client_id": "pan_kyc_9f3ac2e7b1d4",    "pan_number": "ABCDE1234F",    "full_name": "***",    "category": "Individual",    "status": "VALID"  },  "status_code": 200}
  • One field to branch onEvery endpoint returns true or false here. You write one check instead of a result parser per endpoint.
  • What happened, in wordsA record that is not found comes back in the same four fields, with a message you can branch on. There is no thrown error to catch.
  • The only part that changesThe fields inside data differ by endpoint because the source records differ. The three keys around them stay the same.
  • The same four fields, every timeWhen you add another check, the error handling you already wrote keeps working. You point the same client at a new path.

The samples use sandbox fixtures drawn from the catalog. No figure on this panel is a measurement. FinSour publishes no latency, uptime or volume figures per endpoint, and this page does not invent any.

How to integrate

Three steps from sandbox key to production

Here is the whole integration, in the order you would do it. Every step below calls a published endpoint, read from the live catalog.

Select an integration step to see its code sample
.env
# the sandbox key we send you, against the same endpointsexport FINSOUR_API_BASE_URL=https://sandbox.exampleexport FINSOUR_API_KEY=sk_test_9f2a4c1b7e curl -X POST "$FINSOUR_API_BASE_URL/v1/pan-kyc" \  -H "Authorization: Bearer $FINSOUR_API_KEY" \  -H "Content-Type: application/json" \  -d '{"pan_number":"ABCDE1234F","consent":"Y"}'
verify.sh
# same header, same envelope, three different pathsfor check in pan-kyc penny-less aadhaar-esign; do  curl -s -X POST "$FINSOUR_API_BASE_URL/v1/$check" \    -H "Authorization: Bearer $FINSOUR_API_KEY" \    -d @"payloads/$check.json" \  | jq --arg check "$check" '{ endpoint: ("/v1/" + $check), status: .data.status }'done
audit_record.json
{  "client_id": "pan_kyc_9f3ac2e7b1d4",  "endpoint": "/v1/pan-kyc",  "consent": "Y",  "consent_text": "***",  "status": "VALID",  "status_code": 200}

What consolidating onto one integration removes

Most teams arrive with three vendor SDKs and three sets of keys to rotate. A spreadsheet often stands in for the consent log. Moving onto one integration usually removes more code than it adds.

  • vendor contracts31
  • API keys in production31
  • consent stores1 sheet0
  • retry policies31
  • error paths to write31

One bearer token reaches every endpoint in the catalog. The client is a thin typed wrapper around HTTP. A plain fetch works just as well.

diff --gita/src/onboarding/verify.tsb/src/onboarding/verify.ts+11−13
@@ -1,18 +1,16 @@ onboard
1import PanVendor from "@vendor-a/pan-sdk";
2import BankVendor from "@vendor-b/account-sdk";
3import EsignVendor from "@vendor-c/esign-sdk";
4import { appendConsentRow } from "./consent-sheet";
1// Nothing to install. One base URL, one header.
52
6const pan = new PanVendor({ key: process.env.PAN_KEY });
7const bank = new BankVendor({ key: process.env.BANK_KEY, host: BANK_HOST });
8const esign = new EsignVendor({ key: process.env.ESIGN_KEY });
3const call = (path, body) =>
4 fetch(process.env.FINSOUR_API_BASE_URL + path, {
5 method: "POST",
6 headers: { Authorization: `Bearer ${process.env.FINSOUR_API_KEY}` },
7 body: JSON.stringify(body),
8 }).then((response) => response.json());
99
1010export async function onboard(applicant) {
11 const identity = await pan.check(applicant.pan); // no consent field
12 await appendConsentRow(applicant.id, "pan", Date.now()); // best effort
13 const account = await bank.lookup(applicant.account);
14 if (!account.ok) await bank.retry(applicant.account); // vendor-specific
15 const signed = await esign.begin(applicant.docId);
11 const identity = await call("/v1/pan-kyc", { ...applicant.pan, consent: "Y" });
12 const account = await call("/v1/penny-less", applicant.account);
13 const signed = await call("/v1/aadhaar-esign", { document_id: applicant.docId });
1614
17 return { identity, account, signed, consent: "see the sheet" };
15 return { identity, account, signed, consent_ref: identity.data.consent_ref };
1816}

1 file changed, 11 insertions(+), 13 deletions(−)

Get started

Ready to take a sandbox key?

Tell us which checks your flow needs. Our team sets up your API access and walks through the first integration with you.