DL PDF API
Fetches the driving licence record for a licence number and date of birth and renders a ready-to-print PDF containing holder details, classes of vehicle, issuing RTO, validity dates and the current licence status. The response carries a signed, time-limited download URL plus the structured record.
Authentication
API key + API secret headers, or a Bearer JWT. Obtain the JWT from POST /api/v1/auth/token using your key and secret; tokens are valid for 3600 seconds.
| Scheme | Location | Value |
|---|---|---|
| JWT bearer | Header | Authorization: Bearer <token> |
| API key | Header | X-API-Key: pk_xxxxxxxx |
| API secret | Header | X-API-Secret: sk_xxxxxxxx |
Headers
| Header | Required | Description |
|---|---|---|
| Authorization | Optional | Bearer JWT issued by the token endpoint. |
| X-API-Key | Yes | Your API key (pk_…). |
| X-API-Secret | Yes | Your API secret (sk_…), shown once at creation. |
| Content-Type | Yes | application/json |
| X-Request-Id | No | Your idempotency key; echoed back in the response. |
Parameters & validation rules
| Name | Type | Required | Validation | Description |
|---|---|---|---|---|
| dl_number | string | Yes | /^[A-Z]{2}[0-9]{2}[ -]?[0-9]{4}[0-9]{7}$/ | Driving licence number, e.g. MH1220110012345. |
| dob | date | Yes | /^\d{4}-\d{2}-\d{2}$/ | Holder date of birth in YYYY-MM-DD format. |
Example request
curl -X POST 'https://api.yourdomain.com/api/v1/dl-pdf' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'x-api-secret: YOUR_API_SECRET' \
-H 'Content-Type: application/json' \
-d '{"dl_number": "MH1220110012345", "dob": "1992-04-18"}'
<?php
$payload = ['dl_number' => 'MH1220110012345', 'dob' => '1992-04-18'];
$ch = curl_init('https://api.yourdomain.com/api/v1/dl-pdf');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'x-api-key: YOUR_API_KEY',
'x-api-secret: YOUR_API_SECRET',
'Content-Type: application/json',
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response['data']);
const res = await fetch('https://api.yourdomain.com/api/v1/dl-pdf', {
method: 'POST',
headers: {
'x-api-key': 'YOUR_API_KEY',
'x-api-secret': 'YOUR_API_SECRET',
'Content-Type': 'application/json',
},
body: JSON.stringify({"dl_number": "MH1220110012345", "dob": "1992-04-18"}),
});
const json = await res.json();
console.log(json.data);
import requests
res = requests.post(
'https://api.yourdomain.com/api/v1/dl-pdf',
json={"dl_number": "MH1220110012345", "dob": "1992-04-18"},
headers={
'x-api-key': 'YOUR_API_KEY',
'x-api-secret': 'YOUR_API_SECRET',
},
timeout=30,
)
print(res.json()['data'])
import java.net.URI;
import java.net.http.*;
String payload = "{\"dl_number\": \"MH1220110012345\", \"dob\": \"1992-04-18\"}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.yourdomain.com/api/v1/dl-pdf"))
.header("x-api-key", "YOUR_API_KEY")
.header("x-api-secret", "YOUR_API_SECRET")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{"dl_number": "MH1220110012345", "dob": "1992-04-18"}`)
req, _ := http.NewRequest("POST", "https://api.yourdomain.com/api/v1/dl-pdf", bytes.NewBuffer(payload))
req.Header.Set("x-api-key", "YOUR_API_KEY")
req.Header.Set("x-api-secret", "YOUR_API_SECRET")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
Responses
Success 200
{
"success": true,
"request_id": "req_8f21c0b4a7",
"meta": {
"charged": 3.0,
"environment": "production",
"balance": 4821.5,
"response_ms": 312
},
"data": {
"dl_number": "MH1220110012345",
"name": "RAHUL SHARMA",
"dob": "1992-04-18",
"issuing_rto": "RTO PUNE (MH12)",
"vehicle_classes": [
"LMV",
"MCWG"
],
"valid_from": "2011-06-02",
"valid_upto": "2031-06-01",
"status": "ACTIVE",
"pdf_url": "https://cdn.example.com/pdf/dl/8f21c0b4.pdf",
"pdf_expires_in": 900
}
}
Error 4xx
{
"success": false,
"request_id": "req_8f21c0b4a7",
"error": {
"code": "DL_NOT_FOUND",
"message": "No licence record found for this number and date of birth."
},
"meta": {
"charged": 0
}
}
HTTP status codes
| Code | Meaning |
|---|---|
| 200 | Success - verification completed and wallet debited. |
| 400 | Validation failed - check the parameter rules below. |
| 401 | Missing or invalid JWT / API key. |
| 402 | Insufficient wallet balance. |
| 403 | API not purchased or key not permitted for this endpoint. |
| 404 | Record not found at the source registry. |
| 422 | Upstream provider returned an unprocessable response. |
| 429 | Rate limit exceeded - retry after the window resets. |
| 500 | Unexpected server error - safe to retry with the same request_id. |
| 503 | Upstream registry temporarily unavailable. |
Rate limit & billing
Rate limit
60 req/min per key
Charge
₹3.00 per successful call
Failed calls
Not charged (4xx/5xx)
When throttled, the API returns 429 with X-RateLimit-Limit, X-RateLimit-Remaining and Retry-After headers.