Developer documentation
Emver Verification API
One consistent JSON API for identity, business, banking and workforce verification.
Every API is a single POST request
authenticated with an API key, with the same envelope, the same error format and a sandbox to build against
before you go live.
- APIs
- 113
- Categories
- 7
- Format
- JSON
- Auth
- Bearer
Getting started
Four steps from zero to a verified record.
-
1
Get console access
Your account manager enables the developer console for your organisation and grants the APIs you need. Sign in at the console with your organisation login.
-
2
Create an API key
Under API Keys, create a sandbox key first. The full key is shown once; store it in a secrets manager. Keys are environment-specific.
-
3
Send a sandbox request
Pick any API below, copy the sample, replace
YOUR_API_KEYand the input values, and send it to the sandbox base URL. Sandbox calls draw from your demo allowance and are never billed. -
4
Go live
Create a production key, point your integration at the production base URL, and top up your wallet. Production calls are billed per successful hit at your contracted rate.
Authentication
Every request carries your API key as a Bearer token in the Authorization header.
There is no session or OAuth handshake.
Authorization: Bearer YOUR_API_KEY Content-Type: application/json Accept: application/json
- Environment-bound. A sandbox key is rejected by the production server and vice versa. Keep one key per environment.
- Shown once. The console reveals the full key only at creation; afterwards only its prefix is visible. Rotate by creating a new key and revoking the old one.
- Scoped to your organisation. A key can only call the APIs granted to your account. Calling an API that is not enabled returns
403. - Server-side only. Never embed a key in a browser or mobile app; proxy calls through your backend.
Environments
Two base URLs. Same paths, same payloads, different keys and billing.
| Environment | Base URL | Billing |
|---|---|---|
| Sandbox | https://app.emver.io/api/sandbox | Draws demo hits. Never billed. |
| Production | https://app.emver.io/api | Billed per hit to your wallet or postpaid plan. |
Every endpoint is {base_url}/{version}/{api-slug}. The version segment
(v1 today) is set per API and printed on its page, so a future revision of one
API never changes the path of another.
Each API page has a sandbox / production switch that rewrites the sample code for you. Production access is enabled per API by your account manager once the sandbox integration is signed off.
Sandbox mock mode
Set a sandbox key's Sandbox responses to Mock (API Keys → Generate or Edit access) and its calls are answered with sample responses:
no source is contacted, no demo hits are used and nothing is billed. Answers have the same shape as live ones, carry
"mock": true, and can be read back from /requests/{request_id}.
Input validation still runs first, so a malformed value gets a real 422. Production keys always run live.
- Test inputs. The last character of the first request field you send picks the scenario:
N→not_found,X→invalid_input,E→provider_error, anything else →success(e.g. PANABCDE1234Nanswers "not found"). - Header override. Send
X-Mock-Scenario: success | not_found | invalid_input | provider_errorto choose directly — handy for numeric inputs. An unknown value is refused with 400. - Outcomes. Each scenario answers with its own HTTP status (by default 200, 404, 422 and 503);
provider_errorbehaves like a real outage — marked failed, withRetry-After.
Making a request
Every API is POST {base_url}/{version}/{api-slug} with a JSON body.
The fields each API accepts are listed on its page; required fields are marked.
curl -X POST https://app.emver.io/api/sandbox/v1/aadhaar-api-without-otp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{ "...": "fields listed on the API page" }'
- Field names are stable. They are the canonical names shown in these docs and do not change when we improve a source behind the scenes.
- Send strings as given. Numbers such as PAN, Aadhaar or account numbers are strings; do not strip leading zeros.
- Dates are ISO. Use
YYYY-MM-DDunless the field says otherwise. - Consent is yours to collect. You confirm the person has authorised the verification before you call us; keep the record of that consent.
- Timeouts. Most APIs answer within a few seconds; allow up to 60 seconds for sources that are slow at peak hours.
Responses
A successful call returns HTTP 200 with a JSON body.
The exact shape is documented per API; most follow this envelope:
{
"status": 200,
"message": "Verification successful",
"data": {
... fields listed on the API page ...
}
}
- A "not found" or "mismatch" is a result, not an error. The record was checked and the answer is negative; it comes back as HTTP 200 with the outcome in the body, and it is billed like any other successful hit.
- Types are declared. Each API page shows the type of every field (string, integer, boolean, date) so you can map it straight into your models.
- Asynchronous sources. A few APIs depend on sources that answer later. Those calls answer
HTTP 202with astatus_url; see Results, retries & webhooks.
Document APIs
Some APIs deliver a document — a credit bureau PDF, for example — rather than fields. Their HTTP 200 answer is the document itself, in one call:
{
"status": "success",
"message": "Credit report fetched successfully",
"report_url": "https://app.emver.io/api/sandbox/requests/req_xxxxxxxxxxxxxxxxxxxxxxxx/report",
"report": {
"format": "pdf",
"mime": "application/pdf",
"filename": "cibil-transunion-pdf-req_xxxxxxxxxxxxxxxxxxxxxxxx.pdf",
"size": 183422,
"url": "https://app.emver.io/api/sandbox/requests/req_xxxxxxxxxxxxxxxxxxxxxxxx/report",
"expires_at": "2026-10-20T10:12:00+05:30",
"base64": "JVBERi0xLjQK..."
}
}
- No second call is needed.
report.base64is the whole file: decode it and save it asreport.filename. - Downloading is optional. If you would rather stream the file, or need it again later,
GETreport_urlwith the same API key — it answers the raw file with itsContent-Type, not JSON. Fetching the call again viaGET /requests/{request_id}also carries the samereportblock. - Kept for 72 hours.
report.expires_atsays when the file is deleted; after that the URL answers410andreportdisappears from the call. Store the file on your side if you need it longer. - A negative outcome is still JSON. When the source has no record, the answer is the usual
{status, message}body without areportblock. - JSON APIs can add a PDF. For an API that answers fields, add
?report=pdfto the call to receive a PDF report in the samereportshape alongside the JSON.
curl https://app.emver.io/api/sandbox/requests/req_xxxxxxxxxxxxxxxxxxxxxxxx/report \ -H "Authorization: Bearer YOUR_API_KEY" \ -o report.pdf
Results, retries & webhooks
Every answer carries a request_id (body and X-Request-Id header),
and a Server-Timing header that splits the call's time into vendor (the data source), app (us) and total, in milliseconds.
You can read any call back later with the same key:
curl https://app.emver.io/api/sandbox/requests/req_xxxxxxxxxxxxxxxxxxxxxxxx \ -H "Authorization: Bearer YOUR_API_KEY"
status is processing (a two-step source is still working), completed (the answer is in result) or failed (not answered, never billed).
result is removed once your data retention window has passed.
- Webhooks. Add an endpoint under Webhooks in the developer console to have
verification.completed/verification.failedevents POSTed to you — by default for late (202) answers, optionally for every call. Each POST carriesWebhook-Id,Webhook-TimestampandWebhook-Signature: v1=<hex>, the HMAC-SHA256 of"{timestamp}.{raw body}"with the endpoint's secret. Answer 2xx; anything else is retried for up to a day. - Safe retries. Send an
Idempotency-Keyheader (any unique string). A retry with the same key within 24 hours returns the first answer, markedIdempotent-Replayed: true, and is not billed again. Reusing a key for a different body is refused with 422; a call that was not billed (402, 5xx) frees its key. - Your reference. Send
X-Client-Referencewith your own id; it is echoed back, searchable in the console's API logs and included in webhooks.
Errors & status codes
Anything other than a verification result comes back with a non-2xx status and a two-field body:
{
"status": 401,
"message": "Invalid or expired API key"
}
| Status | Meaning | Billed |
|---|---|---|
| 200 | Verified. The outcome (including a negative one) is in the body. | Yes |
| 400 / 422 | The request was rejected: a required field is missing or a value is badly formatted. Fix the input and resend. | No |
| 401 | The API key is missing, invalid, expired or belongs to the other environment. | No |
| 402 | Your wallet balance or demo allowance is exhausted. Top up in the console and resend. | No |
| 403 | This API is not enabled for your account in this environment, or the key is restricted to other APIs. | No |
| 404 | The requested record could not be found at the source. | Yes |
| 429 | Too many requests. Slow down and retry after the pause indicated by the response. | No |
| 503 (service_maintenance) | The API is in a scheduled maintenance window. The body carries code service_maintenance and the window; Retry-After says how many seconds until it ends. You are emailed when it starts and when it is back. | No |
| 5xx | A temporary problem on the verification side. Retry with exponential backoff. | No |
Only a delivered verification is charged. Transport errors, server errors and authentication failures are never billed, and any hit that was reserved for such a call is released back to your balance automatically.
Postman & OpenAPI
Both files are generated from this catalogue, so they always match the pages here.
One folder per category, a request per API, sample bodies and responses. Set api_key and go.
GET https://app.emver.io/docs/postman-collection.json
Import into Swagger UI, Insomnia or a client generator for typed SDKs in your language.
GET https://app.emver.io/docs/openapi.json
API reference
Every API, grouped by category. Each page has the endpoint, request fields, sample code in four languages and the response structure.
Identity & KYC
Validates an Aadhaar number against UIDAI records and returns demographic details of the holder (age range, gender, state, mobile-linkage status). Non-OTP — no consent/OTP flow required.
Reviews an individual’s credit history using a TransUnion CIBIL credit report obtained through an authorized process. The check covers the available credit score, loan and credit card accounts, repayment history, outstanding balances and reported adverse account statuses. Processing is subject to the individual’s consent, permitted purpose and applicable access requirements.
Reviews an individual’s credit history using a TransUnion CIBIL credit report obtained through an authorized process. The check covers the available credit score, loan and credit card accounts, repayment history, outstanding balances and reported adverse account statuses. Processing is subject to the individual’s consent, permitted purpose and applicable access requirements.
Reviews an individual’s credit history using a TransUnion CIBIL credit report obtained through an authorized process. The check covers the available credit score, loan and credit card accounts, repayment history, outstanding balances and reported adverse account statuses. Processing is subject to the individual’s consent, permitted purpose and applicable access requirements.
Reviews an individual’s credit history using a TransUnion CIBIL credit report obtained through an authorized process. The check covers the available credit score, loan and credit card accounts, repayment history, outstanding balances and reported adverse account statuses. Processing is subject to the individual’s consent, permitted purpose and applicable access requirements.
Consent-based document & identity verification (Aadhaar/PAN/DL) via DigiLocker. Generate a candidate consent link; verified documents + eKYC return to the case.
Step 1 of DigiLocker KYC - generates a consent link for the customer to sign in to DigiLocker and share documents. Use the returned transaction_id with the Digilocker Fetch Details API.
Step 2 of DigiLocker KYC - after the customer completes consent, fetches the verified Aadhaar e-KYC details using the transaction_id returned by the Digilocker API.
Verifies a Driving Licence number with date of birth against RTO records and returns holder, validity, address and vehicle class details.
DL Validation Plus - enhanced Driving Licence verification returning holder photo, blood group, expiry, status details and vehicle-category wise validity.
Validate a PAN, match the name and confirm it is active with the tax department.
Validates PAN against Income Tax Department records via emver. Checks name, DOB, and PAN status.
Verifies a passport using the application file number and date of birth and returns passport number, holder name and application/dispatch dates.
Verifies a Voter ID (EPIC) number against Election Commission records and returns voter, constituency and polling station details.
Paperless offline KYC: the person shares a UIDAI-signed XML and you get verified demographics and photo.
Full Aadhaar eKYC with a one-time password on the registered mobile.
Verify a lawyer's enrolment number with the state bar council.
Look up an existing central KYC record and reuse it with consent.
Validate a death certificate for claims, succession and account closure.
Verify a medical practitioner's registration with the national or state medical council.
Confirm a driving licence is valid, current and permits the right vehicle class.
Validate a pharmacy or drug distributor licence and its validity.
Confirm a nurse or midwife is registered with the state nursing council.
Confirm a PAN is seeded with the given Aadhaar.
Verify Indian passport details against official records.
Verify a RERA-registered project or real-estate agent.
Confirm a ration card number and the household members listed on it.
Validate an EPIC number and retrieve the registered name and constituency.
Business & KYB
Advanced company verification - MCA master data plus registered state/city/pincode, active compliance, CIRP status, charges, present and past directors and related parties.
Verifies a company CIN / LLPIN against MCA records and returns company master data, charges and directors/signatories.
Fetches e-Challan (traffic violation) records linked to a vehicle registration number, including offence, amount, payment and court status.
Verifies an FSSAI licence / registration number and returns emver name, address, licence type and validity status.
Advanced GSTIN verification - adds promoters/partners, aggregate turnover, gross total income, e-invoice mandate, additional emver places and contact details.
Verifies a GSTIN and returns taxpayer registration details - legal/trade name, status, constitution, registration date, address and filing status.
Vehicle RC verification - returns owner, vehicle, insurance, PUC, permit and financer details for a vehicle registration number.
Vehicle RC verification (Plus) - enhanced RC lookup with owner, vehicle, insurance, PUC, permit, blacklist and challan details.
Step 1 of Udyam Advanced (OTP based) - sends an OTP to the mobile number linked with the Udyam registration. Submit the OTP with the returned reference_id to the Udyam Advanced Submit OTP API.
Step 2 of Udyam Advanced - submits the OTP and returns full Udyam details including owner, PAN, contact, bank, emver and financials.
Verifies a Udyam (MSME) registration number and returns emver profile, classification, address, NIC activity and branch details.
Trace who ultimately owns and controls a company.
Incorporation status, company type, registered office and filing compliance from the corporate registry.
Filed financial statements, charges and shareholding from the corporate registry.
Find companies and LLPs by name and get their CIN or LLPIN.
Resolve a person's directorships and DIN status from the corporate registry.
Verify a food emver licence, its status and validity.
Month-by-month GST return filing history for a GSTIN.
Consented GST pull: OTP to the registered mobile, then the complete profile and filing history.
Confirm GST registration, legal name, emver type and filing compliance.
Discover every GST registration held against a PAN.
Validate an Import Export Code and the entity behind it.
Check whether a vendor is a "specified person" for higher TDS under section 206AB / 206CCA.
Pull the statutory documents a company has filed with the registrar.
Confirm a state shop and establishment registration and the emver behind it.
Validate a Tax Deduction Account Number and resolve the deductor.
Look up registered and pending trademarks by name, application number or owner.
Confirm MSME registration, emver type and major activity.
Validate a legacy Udyog Aadhaar (UAM) number for MSMEs that have not migrated to Udyam.
Documents & Biometrics
Automatically mask the first eight digits on Aadhaar images and PDFs.
Flag synthetic or manipulated faces in selfies and video frames.
Detect edited, forged or template-generated documents before you trust their contents.
Compare a selfie to the photo on an ID document or KYC record.
Extract structured data from Aadhaar, PAN, passport, DL, voter ID and more.
Prove the selfie is a live person, not a photo, screen or mask.
Score how well two names match, allowing for initials, order and spelling.
Compare a signature on a document with a reference specimen and get a match score.
Agent-assisted or self-serve video identification with recording and audit trail.
Banking & Credit
Verifies a bank account number and IFSC in real time and returns the account holder name with optional name-match score.
Reviews an individual’s credit history using a TransUnion CIBIL credit report obtained through an authorized process. The check covers the available credit score, loan and credit card accounts, repayment history, outstanding balances and reported adverse account statuses. Processing is subject to the individual’s consent, permitted purpose and applicable access requirements.
Reviews an individual’s credit history using a TransUnion CIBIL credit report obtained through an authorized process. The check covers the available credit score, loan and credit card accounts, repayment history, outstanding balances and reported adverse account statuses. Processing is subject to the individual’s consent, permitted purpose and applicable access requirements.
Verifies a UPI ID / VPA and returns the linked account holder name, with optional name match against the supplied name.
Consented bank statements and financial data through the Account Aggregator framework.
Confirm an account exists and belongs to the person or emver you are paying.
Confirm an account and holder name without moving any money.
Turn PDF statements into categorised transactions, income and risk indicators.
Consent-based credit score and report for lending and financial-role screening.
Resolve an IFSC to its bank, branch, address and supported payment rails.
Verify bank account ownership by having the person pay one rupee via UPI.
Resolve a UPI ID to its registered account holder and match the name.
Register recurring debit mandates digitally with net-banking, debit-card or Aadhaar authentication.
Commercial bureau report and score for a company or proprietorship.
Workforce & Assets
Retrieve a candidate's emver history from provident fund records using their UAN.
Retrieve a candidate's emver history from provident fund records using their UAN.
Detect concurrent emver from overlapping provident fund contributions.
Confirm an employee's state insurance registration and the employer behind it.
Confirm degrees and diplomas with the issuing university or through the national credential repository.
Find a company's provident fund establishment record and confirm it is a real employer.
Confirm a vehicle's FASTag status and issuing bank from its registration number.
Validate a Form 16 against the TDS records it claims to reflect.
Confirm a Chartered Accountant's membership number, status and type.
Verify a Company Secretary's membership with the Institute of Company Secretaries of India.
Verify declared income from tax filings and salary credits with the person's consent.
Validate a commercial vehicle's national permit and its validity period.
Find a person's Universal Account Number from their mobile or PAN.
Pending and paid traffic challans for a vehicle or driving licence.
Confirm a vehicle is insured, by whom and until when.
Verify a vehicle registration and its owner from the national vehicle registry.
Direct confirmation of tenure, designation and exit reason from the previous employer.
Contact & Address
Fetches the PAN linked to a mobile number along with PAN holder name, status, type, DOB, gender, Aadhaar-link status and address.
Verify a residential address with geo-tagged, timestamped photos captured by the person.
Check an email address is deliverable, not disposable and consistent with the person.
Confirm a mobile number is active, who it is registered to and which network serves it.
Find the name registered against a mobile number.
A field agent visits the address and confirms residence with geotagged evidence.
Operator, circle, connection type and porting status for any Indian mobile number.
Know whether a number is reachable on WhatsApp before you message it.
Risk & Compliance
Screen people and entities against global sanctions, PEP and watchlists.
Find negative news about a person or company across news and public sources.
Search civil and criminal case records across Indian courts for a person or entity.
Track a specific case by CNR or case number: status, next hearing and orders.
Has this email or phone appeared in known credential leaks?
How established is this person online? Signals from phone, email and app presence.