# Techinnoverz Verification API — full documentation > Techinnoverz Verification API is a REST API for identity, credit, banking, business and vehicle verification in India: Aadhaar OTP, PAN, Voter ID, driving licence, CIBIL, CRIF, Experian and Equifax credit reports, bank account (penny drop), GST and vehicle RC and challan checks. One API key, one prepaid wallet, JSON in and JSON out. Product overview: https://www.techinnoverz.com/verification-api Documentation index: https://verification.techinnoverz.com/api-docs OpenAPI 3.1 specification: https://verification.techinnoverz.com/openapi.json ## Base URL https://verification.techinnoverz.com/api/v1 ## Authentication Send your API key in the x-api-key header on every request, with Content-Type: application/json. Checks use POST with a JSON body and return JSON; stored results are fetched with GET /requests/{txnId}. ## Billing You are charged only on successful hits. Failed, no-data and error calls are free. - Charged on a delivered result: A call is charged only when it returns status "found" and the response has been delivered to you. No-data results, errors, timeouts and test calls are never charged. - Balance in every response: Each successful response carries billing.charged and billing.walletBalance, your balance after this call, so you can reconcile without a second call. - Retries never double-charge: Send an Idempotency-Key with each call. If you do not get an answer, retry with the same key: you receive the same result and are charged once. - Zero balance blocks calls: You receive 402 WALLET_EMPTY until the wallet is topped up. Your balance can never go below zero. - Per-hit rates: Per-hit pricing is set on your rate card, before GST. Book a demo to get yours. ## Integration notes ### Test and live keys There is one base URL. The prefix of your key decides what happens: tz_test_ keys run against sample data, are never charged and never touch your wallet; tz_live_ keys run real checks and are charged. Live keys are issued once your account has been approved for live access. Every response carries livemode, true for a live key and false for a test key. A successful response also carries source and dataAsOf. source is "provider" when the data was fetched for your call, and "stored" when we answered a repeat of the same lookup from a record we kept of an earlier one; dataAsOf is when the data was fetched from its source. A result served from a kept record is billed the same as any other successful result. ### Idempotency and retries Send an Idempotency-Key header (1 to 128 letters, digits or . _ : -) with every check. Calling again with the same key and the same body returns the same result, marked with the Idempotent-Replayed: true header, and never charges twice. If a call with the key is still running you receive 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After header. The same key with a different body is 422 IDEMPOTENCY_KEY_REUSED. If an earlier attempt failed without charge (SOURCE_ERROR, SOURCE_TIMEOUT or a lost call), retrying with the same key runs the check again. Keys are remembered for 7 days. ### Fetching a result again Every response carries a txnId. GET /requests/{txnId} returns the stored response of that transaction, free of charge. If your connection dropped before you received a found result, fetching it (or retrying with the same Idempotency-Key) within 10 minutes delivers it and charges it once; a result you never fetch is not charged. Stored responses are kept for 7 days. For Aadhaar, DigiLocker and credit-bureau checks they are kept for 10 minutes only. ### Response headers X-Request-Id repeats the txnId. RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset describe your per-key limit, and Retry-After accompanies 409, 429 and 503 responses. ### Timeouts and request size A call that cannot finish within 30 seconds is answered with an error and is not charged. In the rare case that the result is found just after that, it can still be fetched with its txnId and is then charged once. Request bodies are limited to 64 KB, except checks that take photos (face match and face match with liveness), which accept up to 6 MB with JPEG or PNG images of up to about 2 MB each, base64 encoded. Images are never stored. ## Error codes - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. ## Rate limits 60 requests per minute per key and 10 concurrent requests by default, with RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers on every response and Retry-After when you are limited. Higher limits are available on request. ## Identity & KYC Verification APIs Verify an individual's identity against Aadhaar, PAN, Voter ID and driving licence records. ### Aadhaar OTP Verification API Docs page: https://verification.techinnoverz.com/api-docs/aadhaar-otp-verification-api Consent-based Aadhaar verification with OTP delivered to the registered mobile number. Verifies an individual's Aadhaar with their consent in two calls. The first call sends an OTP to the mobile number registered against the Aadhaar; the second submits that OTP and returns the verified details with the Aadhaar number masked. Who uses it: - Lenders and NBFCs completing digital KYC before disbursal - Fintech and wallet apps onboarding customers without paperwork - Gig, staffing and marketplace platforms verifying workers and partners - Insurers and brokers confirming a customer's identity at issuance #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/aadhaar-otp/send Send an OTP to the mobile number linked to the Aadhaar. Request body fields: - `aadhaarNumber` (string, required): 12-digit Aadhaar number, no spaces. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/aadhaar-otp/send" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "aadhaarNumber": "234567890124", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "otpSent"): ```json { "status": "otpSent", "data": { "otpReferenceId": "otp_5c91d2e4" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": false, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `otpReferenceId` (string, optional): Pass this to the verify call together with the OTP. Billing: this call is not charged. #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/aadhaar-otp/verify Submit the OTP and receive the verified Aadhaar details. Request body fields: - `otpReferenceId` (string, required): The otpReferenceId returned by the send call. - `otp` (string, required): 6-digit OTP received on the linked mobile number. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/aadhaar-otp/verify" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "otpReferenceId": "otp_5c91d2e4", "otp": "123456", "consent": "Y" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "maskedAadhaar": "XXXX XXXX 4312", "dateOfBirth": "1991-04-17", "gender": "F", "address": { "state": "MH", "pincode": "411045" } }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Name as recorded against the Aadhaar. - `maskedAadhaar` (string, optional): Aadhaar number with the first eight digits masked. - `dateOfBirth` (string, optional): Date of birth, YYYY-MM-DD. - `gender` (string, optional): Gender as recorded (M, F or T). - `address` (object, optional): State and pincode of the registered address. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. - 400 INVALID_OTP: The OTP is incorrect or has expired. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### PAN Verification API Docs page: https://verification.techinnoverz.com/api-docs/pan-verification-api Verify PAN card details and status against Income Tax Department records. Checks a PAN's validity and status and returns the name registered against it, in a single call with no document upload. Who uses it: - Lenders and NBFCs validating PAN during KYC and underwriting - Brokerage, wealth and mutual-fund platforms onboarding investors - Payroll, HR and vendor-onboarding teams validating PAN before payouts - Marketplaces and platforms that need a valid PAN on file for sellers and partners #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/pan Verify a PAN, fetch its status and registered name, and optionally compare a name you supply. Request body fields: - `pan` (string, required): 10-character PAN. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. - `name` (string, optional): Optional. A name to compare with the name held against the PAN. English letters, spaces and . & / \ ^ ~ only, up to 85 characters. When you send it, the response says whether it matches. - `nameMatchMethod` (string, optional): Optional, used only with name. exact needs the same words; fuzzy (the default) tolerates spelling and word-order differences; enhanced also copes with abbreviations such as Md and Mohd and with missing common surnames. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/pan" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pan": "ABCPE1234F", "consent": "Y", "referenceId": "app_20915", "name": "Asha Sample", "nameMatchMethod": "fuzzy" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "pan": "ABCPE1234F", "name": "Asha Sample", "panStatus": "VALID", "panDisplayName": "Asha Sample", "aadhaarSeedingStatus": "OPERATIVE", "nameMatch": true, "nameMatchScore": 100 }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `pan` (string, optional): The PAN that was verified. - `name` (string, optional): Name registered against the PAN. - `panStatus` (string, optional): Status of the PAN. VALID: the PAN exists and is active. A PAN that is not valid is answered with NO_DATA and not charged. - `panDisplayName` (string, optional): The name printed on the PAN card. null when the source does not hold it. - `aadhaarSeedingStatus` (string, optional): Whether the PAN is linked to Aadhaar: OPERATIVE, NOT_OPERATIVE, or NOT_APPLICABLE for a PAN that is not an individual's. null when the source did not say. - `nameMatch` (boolean, optional): Whether the name you sent matches the name held against the PAN (a score above 80). null when you sent no name. - `nameMatchScore` (integer, optional): How closely the name you sent matches, from 0 to 100. With nameMatchMethod exact it is 0 or 100. null when you sent no name. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### PAN Advanced Verification API Docs page: https://verification.techinnoverz.com/api-docs/pan-advanced-verification-api Verify a PAN and also get its holder type and whether it is linked to Aadhaar. Checks a PAN like the basic check, and also returns the holder type and whether the PAN is linked to Aadhaar, so you can decide whether it is usable for filing and KYC. Who uses it: - Lenders and NBFCs that need a PAN that is operative, not just valid - Brokerage and wealth platforms onboarding investors - Payroll and vendor-onboarding teams validating PAN before payouts #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/pan-advanced Verify a PAN and fetch its status, holder type and Aadhaar link status. Request body fields: - `pan` (string, required): 10-character PAN. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/pan-advanced" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pan": "ABCPE1234F", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "pan": "ABCPE1234F", "name": "Asha Sample", "panStatus": "VALID", "holderType": "Individual", "aadhaarLinked": true }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `pan` (string, optional): The PAN that was verified. - `name` (string, optional): Name registered against the PAN. - `panStatus` (string, optional): Status of the PAN, for example VALID. - `holderType` (string, optional): Type of holder: Individual, Company, Firm, Trust and so on. - `aadhaarLinked` (boolean, optional): Whether the PAN is linked to an Aadhaar number. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Voter ID Verification API Docs page: https://verification.techinnoverz.com/api-docs/voter-id-verification-api Verify EPIC (Voter ID) details against Election Commission of India records. Verifies an EPIC (Voter ID) number and returns the elector details held against it, so a Voter ID can be accepted as identity or address proof without a manual check. Who uses it: - Lenders and NBFCs accepting Voter ID as identity or address proof - Fintech and payments apps completing KYC - Background-verification and staffing firms - Government-linked and welfare-service integrators #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/voter-id Verify a Voter ID (EPIC) number. Request body fields: - `epicNumber` (string, required): Voter ID (EPIC) number. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/voter-id" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "epicNumber": "ABC1234567", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "relativeName": "Ravi Sample", "gender": "F", "state": "MH", "assemblyConstituency": "Kothrud" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Elector name. - `relativeName` (string, optional): Name of the relative recorded against the elector. - `gender` (string, optional): Gender as recorded. - `state` (string, optional): State of registration. - `assemblyConstituency` (string, optional): Assembly constituency name. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Driving Licence Verification API Docs page: https://verification.techinnoverz.com/api-docs/driving-licence-verification-api Verify driving licence number, validity and vehicle class against Parivahan records. Verifies a driving licence number against the holder's date of birth and returns its validity and the vehicle classes the licence covers. Who uses it: - Fleet, logistics and mobility platforms onboarding drivers - Gig and staffing platforms hiring drivers - Insurers and used-vehicle platforms validating a driver - Lenders financing commercial vehicles #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/driving-licence Verify a driving licence and fetch its validity and vehicle classes. Request body fields: - `dlNumber` (string, required): Driving licence number. - `dateOfBirth` (string, required): Licence holder's date of birth, YYYY-MM-DD. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/driving-licence" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "dlNumber": "MH1420110000000", "dateOfBirth": "1991-04-17", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "status": "ACTIVE", "validUpto": "2031-04-16", "vehicleClasses": [ "LMV", "MCWG" ], "issuingAuthority": "RTO Pune" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Licence holder's name. - `status` (string, optional): Licence status, for example ACTIVE. - `validUpto` (string, optional): Licence validity end date, YYYY-MM-DD. - `vehicleClasses` (array, optional): Vehicle classes the licence covers. - `issuingAuthority` (string, optional): Issuing RTO. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Face Match API Docs page: https://verification.techinnoverz.com/api-docs/face-match-verification-api Compare two photos and get a match score, for example a selfie against an ID photo. Compares two photos of a face and returns whether they show the same person, with a match score. Typically a selfie against the photo on an ID. Who uses it: - Lenders and fintechs completing video-less KYC - Gig and marketplace platforms verifying partners - Insurers and brokers checking identity at claim time #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/face-match Compare two face images. Request body fields: - `image1` (string, required): First photo, JPEG or PNG, base64 encoded (up to about 2 MB). - `image2` (string, required): Second photo, JPEG or PNG, base64 encoded (up to about 2 MB). - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/face-match" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "image1": "/9j/4AAQSkZJRgABAQAAAQABAAD...", "image2": "/9j/4AAQSkZJRgABAQAAAQABAAD...", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "match": true, "matchScore": 92.4 }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `match` (boolean, optional): Whether the two photos show the same person. - `matchScore` (number, optional): Similarity from 0 to 100. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Face Match with Liveness API Docs page: https://verification.techinnoverz.com/api-docs/face-liveness-verification-api Check that a selfie is of a live person and matches the photo on their ID, in one call. Checks that a selfie shows a live person (not a photo of a photo or a screen) and that it matches the photo on their ID, in one call. Who uses it: - Lenders and fintechs onboarding customers remotely - Wallets and brokers preventing impersonation - Gig platforms re-verifying partners #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/face-liveness Check liveness of a selfie and match it to an ID photo. Request body fields: - `selfie` (string, required): The selfie, JPEG or PNG, base64 encoded (up to about 2 MB). - `idImage` (string, required): The photo on the ID, JPEG or PNG, base64 encoded (up to about 2 MB). - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/face-liveness" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "selfie": "/9j/4AAQSkZJRgABAQAAAQABAAD...", "idImage": "/9j/4AAQSkZJRgABAQAAAQABAAD...", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "isLive": true, "livenessScore": 97.1, "match": true, "matchScore": 91.8 }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `isLive` (boolean, optional): Whether the selfie shows a live person. - `livenessScore` (number, optional): Confidence of liveness from 0 to 100. - `match` (boolean, optional): Whether the selfie matches the ID photo. - `matchScore` (number, optional): Similarity from 0 to 100. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### DigiLocker Verification API Docs page: https://verification.techinnoverz.com/api-docs/digilocker-verification-api Consent-based fetch of a person's verified documents from DigiLocker. Lets a person share their verified documents from DigiLocker with consent. You start a request, send the person to the returned link to approve it, then fetch the details once they have. Who uses it: - Lenders and NBFCs collecting verified identity documents - Insurers and brokers completing KYC without uploads - Employers and staffing firms verifying candidates #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/digilocker/initiate Start a DigiLocker request and get the link the person must approve. Request body fields: - `redirectUrl` (string, required): Where the person returns to after approving, an https address. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/digilocker/initiate" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "redirectUrl": "https://example.com/kyc/done", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "initiated"): ```json { "status": "initiated", "data": { "digilockerRequestId": "dlr_8c31ba91", "authorizationUrl": "https://digilocker.example/authorize/dlr_8c31ba91" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": false, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `digilockerRequestId` (string, optional): Quote this when fetching the result. - `authorizationUrl` (string, optional): Send the person here to approve the share. Billing: this call is not charged. #### POST https://verification.techinnoverz.com/api/v1/identity-kyc/digilocker/fetch Fetch the shared details once the person has approved. Request body fields: - `digilockerRequestId` (string, required): The id returned when the request was started. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/digilocker/fetch" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "digilockerRequestId": "dlr_8c31ba91", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "dateOfBirth": "1994-03-21", "maskedAadhaar": "XXXXXXXX1234", "documents": [ "PAN", "DRIVING_LICENCE" ] }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Name as recorded in DigiLocker. - `dateOfBirth` (string, optional): Date of birth, YYYY-MM-DD. - `maskedAadhaar` (string, optional): Aadhaar number with all but the last four digits hidden. - `documents` (array, optional): Documents the person shared. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ## Mobile Intelligence APIs Start from a mobile number to find the name, address, UPI IDs and e-commerce addresses linked to it. ### Mobile to Address API Docs page: https://verification.techinnoverz.com/api-docs/mobile-to-address-api Find the name and address linked to a mobile number. Finds the name and address linked to a mobile number. Who uses it: - Lenders and collections teams locating and verifying customers - Delivery and logistics platforms validating addresses - Insurers and fintechs cross-checking declared addresses #### POST https://verification.techinnoverz.com/api/v1/mobile/mobile-to-address Fetch the name and address linked to a mobile number. Request body fields: - `mobile` (string, required): 10-digit Indian mobile number. +91 and spaces are accepted. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/mobile/mobile-to-address" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "mobile": "9876543210", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "address": "12 Sample Road, Sample Nagar", "pincode": "560001" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Name linked to the number. - `address` (string, optional): Address linked to the number. - `pincode` (string, optional): Postal code of the address. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Mobile to Prefill API Docs page: https://verification.techinnoverz.com/api-docs/mobile-prefill-api Prefill a customer's name, date of birth, email and address from their mobile number. Prefills a customer's details from their mobile number so they type less on a sign-up or loan form. Who uses it: - Lenders and fintechs shortening application forms - Insurers and brokers prefilling proposals - Marketplaces onboarding sellers and partners #### POST https://verification.techinnoverz.com/api/v1/mobile/mobile-prefill Fetch prefill details for a mobile number. Request body fields: - `mobile` (string, required): 10-digit Indian mobile number. +91 and spaces are accepted. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/mobile/mobile-prefill" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "mobile": "9876543210", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "gender": "F", "dateOfBirth": "1994-03-21", "email": "asha@example.com", "address": "12 Sample Road, Sample Nagar", "pincode": "560001" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Full name. - `gender` (string, optional): Gender as recorded. - `dateOfBirth` (string, optional): Date of birth, YYYY-MM-DD. - `email` (string, optional): Email address. - `address` (string, optional): Address. - `pincode` (string, optional): Postal code. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Mobile to UPI ID API Docs page: https://verification.techinnoverz.com/api-docs/mobile-to-upi-id-api Find the UPI ID and registered name linked to a mobile number. Finds the UPI ID and registered name linked to a mobile number, to confirm a payee before paying. Who uses it: - Payout and refund platforms validating beneficiaries - Lenders and collections teams confirming a payment handle - Marketplaces paying sellers and partners #### POST https://verification.techinnoverz.com/api/v1/mobile/mobile-to-upi-id Fetch the UPI ID linked to a mobile number. Request body fields: - `mobile` (string, required): 10-digit Indian mobile number. +91 and spaces are accepted. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/mobile/mobile-to-upi-id" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "mobile": "9876543210", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "upiId": "asha@sample", "name": "Asha Sample" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `upiId` (string, optional): UPI ID linked to the number. - `name` (string, optional): Name registered against the UPI ID. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Mobile to Multiple UPI IDs API Docs page: https://verification.techinnoverz.com/api-docs/mobile-to-multiple-upi-api Find every UPI ID linked to a mobile number. Finds every UPI ID linked to a mobile number. Who uses it: - Payout platforms choosing the right handle to pay - Fraud and risk teams checking how many handles share a number - Collections teams locating active payment handles #### POST https://verification.techinnoverz.com/api/v1/mobile/mobile-to-multiple-upi Fetch all UPI IDs linked to a mobile number. Request body fields: - `mobile` (string, required): 10-digit Indian mobile number. +91 and spaces are accepted. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/mobile/mobile-to-multiple-upi" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "mobile": "9876543210", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "upiIds": [ "asha@sample", "asha.s@sample" ] }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Name registered against the UPI IDs. - `upiIds` (array, optional): UPI IDs linked to the number. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Mobile to E-Commerce Address API Docs page: https://verification.techinnoverz.com/api-docs/mobile-to-ecomm-address-api Find delivery addresses used on e-commerce platforms with a mobile number. Finds delivery addresses used on e-commerce platforms with a mobile number. Who uses it: - Lenders verifying where a customer actually receives deliveries - Collections teams locating customers - Fraud and risk teams checking address history #### POST https://verification.techinnoverz.com/api/v1/mobile/mobile-to-ecomm-address Fetch e-commerce delivery addresses for a mobile number. Request body fields: - `mobile` (string, required): 10-digit Indian mobile number. +91 and spaces are accepted. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/mobile/mobile-to-ecomm-address" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "mobile": "9876543210", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "name": "Asha Sample", "addresses": [ "12 Sample Road, Sample Nagar, 560001" ] }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `name` (string, optional): Name used on the orders. - `addresses` (array, optional): Delivery addresses found. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ## Background & Bureau Verification APIs Pull a consumer's credit history from any of the four major credit bureaus. ### CIBIL Credit Report API Docs page: https://verification.techinnoverz.com/api-docs/cibil-credit-report-api Pull a consumer's CIBIL credit score, history and active tradelines. Pulls a consumer's CIBIL credit score and a summary of their credit history through a single call, normalised into one JSON schema so you can switch or combine bureaus without changing your integration. Who uses it: - Lenders and NBFCs underwriting loan applications - Fintech and buy-now-pay-later apps pre-screening applicants - Credit-card and loan-against-property teams checking existing obligations - Collections and portfolio-monitoring teams tracking borrower health #### POST https://verification.techinnoverz.com/api/v1/bureau/cibil-credit-report Fetch a CIBIL credit report for a PAN. Request body fields: - `pan` (string, required): 10-character PAN. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/bureau/cibil-credit-report" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pan": "ABCPE1234F", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "score": 782, "tradelines": 4, "enquiriesLast6Months": 1 }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `score` (integer, optional): Credit score on the bureau's 300–900 scale. - `tradelines` (integer, optional): Number of credit accounts (tradelines) on file. - `enquiriesLast6Months` (integer, optional): Credit enquiries made in the last six months. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### CRIF Credit Report API Docs page: https://verification.techinnoverz.com/api-docs/crif-credit-report-api Pull a consumer's CRIF High Mark credit score, history and active tradelines. Pulls a consumer's CRIF High Mark credit score and a summary of their credit history through a single call, normalised into one JSON schema so you can switch or combine bureaus without changing your integration. Who uses it: - Lenders and NBFCs underwriting loan applications - Fintech and buy-now-pay-later apps pre-screening applicants - Credit-card and loan-against-property teams checking existing obligations - Collections and portfolio-monitoring teams tracking borrower health #### POST https://verification.techinnoverz.com/api/v1/bureau/crif-credit-report Fetch a CRIF High Mark credit report for a PAN. Request body fields: - `pan` (string, required): 10-character PAN. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/bureau/crif-credit-report" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pan": "ABCPE1234F", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "score": 782, "tradelines": 4, "enquiriesLast6Months": 1 }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `score` (integer, optional): Credit score on the bureau's 300–900 scale. - `tradelines` (integer, optional): Number of credit accounts (tradelines) on file. - `enquiriesLast6Months` (integer, optional): Credit enquiries made in the last six months. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Experian Credit Report API Docs page: https://verification.techinnoverz.com/api-docs/experian-credit-report-api Pull a consumer's Experian credit score, history and active tradelines. Pulls a consumer's Experian credit score and a summary of their credit history through a single call, normalised into one JSON schema so you can switch or combine bureaus without changing your integration. Who uses it: - Lenders and NBFCs underwriting loan applications - Fintech and buy-now-pay-later apps pre-screening applicants - Credit-card and loan-against-property teams checking existing obligations - Collections and portfolio-monitoring teams tracking borrower health #### POST https://verification.techinnoverz.com/api/v1/bureau/experian-credit-report Fetch a Experian credit report for a PAN. Request body fields: - `pan` (string, required): 10-character PAN. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/bureau/experian-credit-report" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pan": "ABCPE1234F", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "score": 782, "tradelines": 4, "enquiriesLast6Months": 1 }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `score` (integer, optional): Credit score on the bureau's 300–900 scale. - `tradelines` (integer, optional): Number of credit accounts (tradelines) on file. - `enquiriesLast6Months` (integer, optional): Credit enquiries made in the last six months. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Equifax Credit Report API Docs page: https://verification.techinnoverz.com/api-docs/equifax-credit-report-api Pull a consumer's Equifax credit score, history and active tradelines. Pulls a consumer's Equifax credit score and a summary of their credit history through a single call, normalised into one JSON schema so you can switch or combine bureaus without changing your integration. Who uses it: - Lenders and NBFCs underwriting loan applications - Fintech and buy-now-pay-later apps pre-screening applicants - Credit-card and loan-against-property teams checking existing obligations - Collections and portfolio-monitoring teams tracking borrower health #### POST https://verification.techinnoverz.com/api/v1/bureau/equifax-credit-report Fetch a Equifax credit report for a PAN. Request body fields: - `pan` (string, required): 10-character PAN. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/bureau/equifax-credit-report" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pan": "ABCPE1234F", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "score": 782, "tradelines": 4, "enquiriesLast6Months": 1 }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `score` (integer, optional): Credit score on the bureau's 300–900 scale. - `tradelines` (integer, optional): Number of credit accounts (tradelines) on file. - `enquiriesLast6Months` (integer, optional): Credit enquiries made in the last six months. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ## Banking & Finance Verification APIs Confirm a bank account is real and owned by who it claims to be before money moves. ### Bank Penny Drop / IES Verification API Docs page: https://verification.techinnoverz.com/api-docs/bank-penny-drop-verification-api Confirm bank account ownership via penny-drop, with an instant e-statement (IES) option. Confirms that a bank account exists and returns the name held at the bank, using a penny-drop transfer or an instant e-statement (IES), so you can match it against your customer before money moves. Who uses it: - Lenders and NBFCs verifying the disbursal account - Payout, payroll and marketplace platforms validating beneficiaries - Insurers and fintechs verifying refund and claim accounts - Investment and collections platforms confirming account ownership #### POST https://verification.techinnoverz.com/api/v1/banking/bank-penny-drop Verify a bank account and fetch the name held at the bank. Request body fields: - `accountNumber` (string, required): Bank account number. - `ifsc` (string, required): 11-character IFSC of the branch. - `method` (string, optional): Verification method: pennyDrop (default) or ies for an instant e-statement. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/banking/bank-penny-drop" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "accountNumber": "1234567890", "ifsc": "ABCD0123456", "method": "pennyDrop", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "accountExists": true, "nameAtBank": "Asha Sample", "bankName": "Sample Bank" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `accountExists` (boolean, optional): Whether the account exists and can receive funds. - `nameAtBank` (string, optional): Account holder name returned by the bank. - `bankName` (string, optional): Name of the bank. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### Bank Account Verification (Penny-less) API Docs page: https://verification.techinnoverz.com/api-docs/bank-pennyless-verification-api Confirm a bank account and the name held at the bank without sending any money. Confirms that a bank account exists and returns the name held at the bank without sending any money. Who uses it: - Lenders and NBFCs verifying the disbursal account - Payout, payroll and marketplace platforms validating beneficiaries - Collections platforms confirming account ownership #### POST https://verification.techinnoverz.com/api/v1/banking/bank-pennyless Verify a bank account without a penny-drop transfer. Request body fields: - `accountNumber` (string, required): Bank account number. - `ifsc` (string, required): 11-character IFSC of the branch. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/banking/bank-pennyless" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "accountNumber": "1234567890", "ifsc": "ABCD0123456", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "accountExists": true, "nameAtBank": "Asha Sample", "bankName": "Sample Bank" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `accountExists` (boolean, optional): Whether the account exists. - `nameAtBank` (string, optional): Account holder name returned by the bank. - `bankName` (string, optional): Name of the bank. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ## Employment Verification APIs Check a person's employment history from their EPFO records. ### UAN Advance API Docs page: https://verification.techinnoverz.com/api-docs/uan-advance-api Fetch a person's EPFO employment history from their Universal Account Number (UAN). Fetches a person's employment history from their EPFO Universal Account Number (UAN): employers, joining and exit dates. Who uses it: - Lenders assessing income stability - Background-verification and staffing firms confirming past employment - HR teams verifying candidate-declared experience #### POST https://verification.techinnoverz.com/api/v1/employment/uan-advance Fetch employment history for a UAN. Request body fields: - `uan` (string, required): 12-digit Universal Account Number. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/employment/uan-advance" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "uan": "100123456789", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "uan": "100123456789", "name": "Asha Sample", "employmentHistory": [ { "establishmentName": "Sample Technologies Pvt Ltd", "dateOfJoining": "2021-06-01", "dateOfExit": null } ] }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `uan` (string, optional): The UAN that was checked. - `name` (string, optional): Member name. - `employmentHistory` (array, optional): Employers in order, most recent first. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ## Business & GST Verification APIs Verify a business's GST registration and filing status before onboarding it. ### GST Advance Verification API Docs page: https://verification.techinnoverz.com/api-docs/gst-advance-verification-api Verify GSTIN details, registration status and filing history against GSTN records. Verifies a GSTIN and returns the business's registration details, current status and recent return-filing history from GSTN records, so you can vet a business before onboarding it. Who uses it: - Lenders and NBFCs onboarding MSME borrowers - B2B marketplaces and procurement teams onboarding vendors - Finance and compliance teams checking supplier registration before payment - Trade-finance and invoice-discounting platforms #### POST https://verification.techinnoverz.com/api/v1/business-gst/gst-advance Verify a GSTIN and fetch registration status and filing history. Request body fields: - `gstin` (string, required): 15-character GSTIN. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/business-gst/gst-advance" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "gstin": "22AAAAA0000A1Z5", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "gstin": "22AAAAA0000A1Z5", "legalName": "Sample Enterprises Private Limited", "tradeName": "Sample Enterprises", "registrationStatus": "Active", "registrationDate": "2018-07-01", "filingHistory": [ { "period": "082026", "returnType": "GSTR-3B", "filedOn": "2026-09-18", "status": "Filed" } ] }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `gstin` (string, optional): The GSTIN that was verified. - `legalName` (string, optional): Legal name of the business. - `tradeName` (string, optional): Trade name of the business. - `registrationStatus` (string, optional): Registration status, for example Active. - `registrationDate` (string, optional): Date of registration, YYYY-MM-DD. - `filingHistory` (array, optional): Recent return filings. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ## Vehicle Verification APIs Verify vehicle registration, ownership and outstanding traffic challans. ### RC Verification API Docs page: https://verification.techinnoverz.com/api-docs/rc-verification-api Verify vehicle registration certificate (RC) details against Parivahan records. Verifies a vehicle registration certificate (RC) and returns the registered owner, vehicle details and registration status. Who uses it: - Used-vehicle marketplaces and dealers verifying a vehicle before listing or sale - Vehicle and two-wheeler lenders confirming the financed vehicle - Insurers issuing and renewing motor policies - Fleet, rental and logistics operators onboarding vehicles #### POST https://verification.techinnoverz.com/api/v1/vehicle/rc Verify a vehicle registration certificate. Request body fields: - `registrationNumber` (string, required): Vehicle registration number without spaces. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/vehicle/rc" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "registrationNumber": "MH12AB1234", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "ownerName": "Asha Sample", "vehicleClass": "Motor Car", "makeModel": "Sample Motors Hatchback", "fuelType": "PETROL", "registrationDate": "2019-03-12", "rcStatus": "ACTIVE" }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `ownerName` (string, optional): Registered owner's name. - `vehicleClass` (string, optional): Vehicle class. - `makeModel` (string, optional): Make and model. - `fuelType` (string, optional): Fuel type. - `registrationDate` (string, optional): Date of first registration, YYYY-MM-DD. - `rcStatus` (string, optional): Registration status, for example ACTIVE. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free. ### RC Challan Verification API Docs page: https://verification.techinnoverz.com/api-docs/rc-challan-verification-api Check outstanding traffic challans registered against a vehicle. Checks whether any traffic challans are outstanding against a vehicle and returns the details of each one. Who uses it: - Used-vehicle marketplaces and dealers who need challans cleared before a transfer - Vehicle lenders and insurers assessing a vehicle's compliance history - Fleet and rental operators tracking fines across vehicles - Logistics and mobility platforms onboarding vehicles and drivers #### POST https://verification.techinnoverz.com/api/v1/vehicle/rc-challan Fetch outstanding traffic challans for a vehicle. Request body fields: - `registrationNumber` (string, required): Vehicle registration number without spaces. - `consent` (string, required): Must be "Y". Records that the end customer consented to this check; logged against the transaction. - `referenceId` (string, optional): Your own id, echoed back in the response for reconciliation. Example request (cURL): ```bash curl -X POST "https://verification.techinnoverz.com/api/v1/vehicle/rc-challan" \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "registrationNumber": "MH12AB1234", "consent": "Y", "referenceId": "app_20915" }' ``` Example response (HTTP 200, status "found"): ```json { "status": "found", "data": { "totalChallans": 1, "challans": [ { "challanNumber": "MH00000000000000", "offence": "Over-speeding", "amount": 1000, "status": "PENDING", "issuedOn": "2026-08-02" } ] }, "source": "provider", "dataAsOf": "2026-11-03T09:30:00.000Z", "referenceId": "app_20915", "billing": { "charged": true, "walletBalance": "12450.00" }, "txnId": "txn_8c31ba90", "livemode": true } ``` Fields returned in `data`: - `totalChallans` (integer, optional): Number of challans found. - `challans` (array, optional): Details of each challan. Amounts are in INR. Billing: this call is charged when it returns a successful result. Error codes: - 400 INVALID_INPUT: A field is missing or malformed. The details list each problem. Not charged. - 401 INVALID_KEY: The key is missing, revoked, or not a key we issued. - 402 WALLET_EMPTY: Your available balance is below the price of this call. Top up and retry. Not charged. - 403 PRODUCTION_NOT_ENABLED: A live key was used before live access was enabled for your account. Use a test key, or ask us to enable live access. - 403 TEST_NOT_ENABLED: A test key was used before test (UAT) access was enabled for your account. Ask us to enable it. - 403 API_NOT_ENABLED: This check is switched off for your account, or is not available for live use yet. - 403 IP_NOT_ALLOWED: The key is restricted to certain IP addresses and this call came from another. - 403 ACCOUNT_SUSPENDED: The account is suspended. Contact support. - 404 NO_DATA: A valid request, but no record was found. Not charged. - 404 ROUTE_NOT_FOUND: There is no endpoint at that path. - 405 METHOD_NOT_ALLOWED: Use the method shown in the Allow header. - 409 IDEMPOTENCY_IN_PROGRESS: A call with the same Idempotency-Key is still being processed. Retry after the delay in Retry-After. - 413 PAYLOAD_TOO_LARGE: The request body is too large. Not charged. - 415 UNSUPPORTED_MEDIA_TYPE: Send the request with Content-Type: application/json. - 422 IDEMPOTENCY_KEY_REUSED: This Idempotency-Key was already used with a different request body. Use a new key for a new request. - 429 RATE_LIMITED: Too many requests or too many at once. Wait for the Retry-After delay. - 500 INTERNAL_ERROR: Something went wrong on our side. Not charged. Quote the txnId if you contact support. - 502 SOURCE_ERROR: The data source returned an error. Not charged. - 503 SOURCE_DOWN: The data source is unavailable right now. Not charged. Retry after the delay in Retry-After. - 504 SOURCE_TIMEOUT: The data source did not answer in time. Not charged. Error response example: ```json { "status": "error", "error": { "code": "NO_DATA", "message": "No record found for the given input. Not charged." }, "billing": { "charged": false }, "txnId": "txn_8c31ba91", "livemode": true } ``` Billing: You are charged only on successful hits. Failed, no-data and error calls are free.