Browse documentation
Identity & KYC Verification APIs

Driving Licence Advanced Verification API

Verify a driving licence and also get split addresses, vehicle category dates, blood group and endorsement details.

What it verifies

Checks a driving licence number with the holder's date of birth and returns the full record: split permanent and present addresses, vehicle category issue and expiry dates, blood group, endorsement details and whether a photo was held. The photo itself is never returned.

Who uses it

  • Fleet and logistics platforms that need address and category dates, not only class codes
  • Insurers underwriting drivers with permanent vs present address
  • Gig platforms verifying licence status and blood group for onboarding packs
  • Lenders financing commercial vehicles that need endorsement history

Request and response

POSThttps://verification.techinnoverz.com/api/v1/identity-kyc/driving-licence-advanced

Verify a driving licence and fetch addresses, category dates and endorsement details. This call is billed when it returns a successful result.

Request body

dlNumberstringrequired

Driving licence number, 13 to 25 characters (letters, digits and /).

dateOfBirthstringrequired

Licence holder's date of birth, YYYY-MM-DD. Must be at least 16 years before today.

consentstringrequired

Must be "Y". Records that the end customer consented to this check; logged against the transaction.

referenceIdstringoptional

Your own id, echoed back in the response for reconciliation.

Example requests

curl -X POST "https://verification.techinnoverz.com/api/v1/identity-kyc/driving-licence-advanced" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dlNumber": "AP11111100000000",
  "dateOfBirth": "1986-01-10",
  "consent": "Y",
  "referenceId": "app_20915"
}'

200 response — status "found"

Response
{
  "status": "found",
  "data": {
    "dlNumber": "AP11111100000000",
    "name": "John Doe",
    "status": "Active",
    "dateOfBirth": "1986-01-10",
    "dateOfIssue": null,
    "dateOfLastTransaction": null,
    "lastTransactedAt": null,
    "fatherOrHusbandName": "Prasad",
    "address": "18-1-20/402 CHANDRANAGARKTROAD TIRUPATIURBAN",
    "addresses": [
      {
        "type": "permanent",
        "completeAddress": "28-1-20/805 CHANDRANAGARKTROAD TIRUPATIURBAN",
        "addressLine": "28-1-20/805 CHANDRANAGARKTROAD",
        "district": "CHITTOOR",
        "city": "TIRUPATI (URBAN)",
        "state": "ANDHRA PRADESH",
        "stateCode": "AP",
        "pincode": "517503",
        "country": "IN"
      }
    ],
    "bloodGroup": "B+",
    "expiryDate": "2037-03-03",
    "hasPhoto": true,
    "vehicleClasses": [
      "LMV",
      "MCWG"
    ],
    "vehicleCategories": [
      {
        "vehicleClass": "LMV",
        "issueDate": "2018-03-04",
        "expiryDate": "2038-03-03"
      }
    ],
    "validFrom": "2018-04-04",
    "validUpto": "2038-03-03",
    "transportValidFrom": null,
    "transportValidTo": null,
    "hillValidTill": null,
    "hazardousValidTill": null,
    "endorseDate": null,
    "endorseNumber": null,
    "statusDetails": 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

dlNumberstringoptional

The driving licence number that was verified.

namestringoptional

Licence holder's name.

statusstringoptional

Licence status when the source reports one. null when not held.

dateOfBirthstringoptional

Date of birth as YYYY-MM-DD.

dateOfIssuestringoptional

Date the licence was issued, YYYY-MM-DD. null when not held.

dateOfLastTransactionstringoptional

Date the licence record was last modified, YYYY-MM-DD. null when not held.

lastTransactedAtstringoptional

Place where the licence record was last modified. null when not held.

fatherOrHusbandNamestringoptional

Father or husband name on the licence. null when not held.

addressstringoptional

Primary address string from the source. null when not held.

addressesarrayoptional

Permanent and present addresses with split district, city, state, pincode and country when held.

bloodGroupstringoptional

Blood group on the licence. null when not held.

expiryDatestringoptional

Overall licence expiry date, YYYY-MM-DD. null when not held.

hasPhotobooleanoptional

Whether the source held a photo. The photo bytes are never returned.

vehicleClassesarrayoptional

Vehicle classes the licence covers.

vehicleCategoriesarrayoptional

Vehicle categories with their own issue and expiry dates when held.

validFromstringoptional

Non-transport validity start date, YYYY-MM-DD. null when not held.

validUptostringoptional

Non-transport validity end date, YYYY-MM-DD. null when not held.

transportValidFromstringoptional

Transport validity start date, YYYY-MM-DD. null when not held.

transportValidTostringoptional

Transport validity end date, YYYY-MM-DD. null when not held.

hillValidTillstringoptional

Hill validity end date, YYYY-MM-DD. null when not held.

hazardousValidTillstringoptional

Hazardous goods validity end date, YYYY-MM-DD. null when not held.

endorseDatestringoptional

Endorsement date, YYYY-MM-DD. null when not held.

endorseNumberstringoptional

Endorsement number. null when not held.

statusDetailsobjectoptional

Status transition details when the source holds them: from, remarks and to. null when not held.

Error codes

Errors return a non-200 HTTP status and the same envelope, so your retry logic and your reconciliation agree.

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
{
  "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.

Every response carries billing.charged and your remaining billing.walletBalance. Per-hit pricing is set on your rate card; book a demo to get yours.

Related checks

All API documentation · OpenAPI specification · Docs as plain text