PAN TO AADHAAR SEARCH API

Returns the linking status between a PAN and the identifier seeded against it, with the masked identifier and the last seeding date. Full identifiers are never returned.

v1
POST https://versatile-lavender-rat.163-61-39-39.cpanel.site/api/v1/pan-to-aadhaar-search

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.

SchemeLocationValue
JWT bearerHeaderAuthorization: Bearer <token>
API keyHeaderX-API-Key: pk_xxxxxxxx
API secretHeaderX-API-Secret: sk_xxxxxxxx

Headers

HeaderRequiredDescription
AuthorizationOptionalBearer JWT issued by the token endpoint.
X-API-KeyYesYour API key (pk_…).
X-API-SecretYesYour API secret (sk_…), shown once at creation.
Content-TypeYesapplication/json
X-Request-IdNoYour idempotency key; echoed back in the response.

Parameters & validation rules

NameTypeRequiredValidationDescription
pan string Yes /^[A-Z]{5}[0-9]{4}[A-Z]$/ 10-character PAN, e.g. ABCDE1234F.
consent string Yes /^(Y|y)$/ Must be "Y" to confirm the holder has given consent.

Example request

curl -X POST 'https://api.yourdomain.com/api/v1/pan-to-aadhaar-search' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'x-api-secret: YOUR_API_SECRET' \
  -H 'Content-Type: application/json' \
  -d '{"pan": "ABCDE1234F", "consent": "Y"}'
<?php
$payload = ['pan' => 'ABCDE1234F', 'consent' => 'Y'];
$ch = curl_init('https://api.yourdomain.com/api/v1/pan-to-aadhaar-search');
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/pan-to-aadhaar-search', {
  method: 'POST',
  headers: {
    'x-api-key': 'YOUR_API_KEY',
    'x-api-secret': 'YOUR_API_SECRET',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"pan": "ABCDE1234F", "consent": "Y"}),
});
const json = await res.json();
console.log(json.data);
import requests

res = requests.post(
    'https://api.yourdomain.com/api/v1/pan-to-aadhaar-search',
    json={"pan": "ABCDE1234F", "consent": "Y"},
    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 = "{\"pan\": \"ABCDE1234F\", \"consent\": \"Y\"}";

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.yourdomain.com/api/v1/pan-to-aadhaar-search"))
    .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(`{"pan": "ABCDE1234F", "consent": "Y"}`)

    req, _ := http.NewRequest("POST", "https://api.yourdomain.com/api/v1/pan-to-aadhaar-search", 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": 5.0,
    "environment": "production",
    "balance": 4821.5,
    "response_ms": 312
  },
  "data": {
    "pan": "ABCDE1234F",
    "linked": true,
    "id_masked": "XXXXXXXX1234",
    "seeded_on": "2023-06-19",
    "name": "RAHUL SHARMA"
  }
}
Error 4xx
{
  "success": false,
  "request_id": "req_8f21c0b4a7",
  "error": {
    "code": "NOT_LINKED",
    "message": "No identifier is seeded against this PAN."
  },
  "meta": {
    "charged": 0
  }
}

HTTP status codes

CodeMeaning
200Success - verification completed and wallet debited.
400Validation failed - check the parameter rules below.
401Missing or invalid JWT / API key.
402Insufficient wallet balance.
403API not purchased or key not permitted for this endpoint.
404Record not found at the source registry.
422Upstream provider returned an unprocessable response.
429Rate limit exceeded - retry after the window resets.
500Unexpected server error - safe to retry with the same request_id.
503Upstream registry temporarily unavailable.

Rate limit & billing

Rate limit
60 req/min per key
Charge
₹5.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.