Extract PAN Card Data with Make.com: Google Drive to Google Sheets
Watch an India-KYC Drive folder, call Cryvis POST /v1/documents/pan with multipart file, and append PAN number, name, and holder type to Google Sheets.
Indian KYC packs often land as PAN card scans in a shared Drive folder before anyone opens a CRM. This Make.com scenario watches an India-KYC folder, sends each new file to Cryvis POST /v1/documents/pan, and appends structured rows to Google Sheets — including holder_type and pan_structure fields you can use for Individual vs Company routing.
Multi-document HubSpot flow: Automate KYC. Aadhaar companion: Extract Aadhaar data.
Architecture
Google Drive
/India-KYC/pan-inbox/
|
v (Watch files)
Make.com
|
v
POST https://api.cryvis.com/v1/documents/pan
-F file=@scan.jpg
-H "Authorization: Bearer ..."
|
v
Google Sheets
pan_number | full_name | father_name | dob | holder_type | ...Prerequisites
- Cryvis API key
- Google Drive folder dedicated to PAN uploads (isolate from Aadhaar/passport)
- Google Sheet with a header row
- Make.com Google Drive + Sheets + HTTP modules
Step 1: Folder and Sheet schema
Drive path example: India-KYC / pan-inbox. Optionally move processed files to pan-done to avoid re-processing.
Sheet columns:
| Column | Cryvis data field |
|---|---|
| A processed_at | Make now |
| B drive_file_id | Drive module |
| C file_name | Drive module |
| D pan_number | pan_number |
| E full_name | full_name |
| F father_name | father_name |
| G date_of_birth | date_of_birth |
| H holder_type_code | holder_type_code |
| I holder_type | holder_type |
| J series | pan_structure.series |
| K name_initial | pan_structure.name_initial |
| L sequence | pan_structure.sequence |
| M check_digit | pan_structure.check_digit |
| N status | ok / error |
Step 2: Watch Drive
Google Drive → Watch Files in a Folder
- Folder:
pan-inbox - Restrict to images/PDF if the module allows MIME filters
Downstream: Google Drive → Download a File so Make has binary content. Watching metadata alone is not enough for multipart upload.
Step 3: Call Cryvis PAN
HTTP → Make a request
| Setting | Value |
|---|---|
| URL | https://api.cryvis.com/v1/documents/pan |
| Method | POST |
| Header | Authorization: Bearer {{cryvis_api_key}} |
| Body type | Multipart/form-data |
| Field name | Value |
|---|---|
file | Downloaded Drive binary (required) |
Supported types: PDF, JPEG, PNG, WebP.
cURL equivalent:
curl -X POST https://api.cryvis.com/v1/documents/pan \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@pan-card.jpg"Step 4: Response fields
{
"success": true,
"data": {
"pan_number": "ABCPS1234F",
"full_name": "RAHUL SHARMA",
"father_name": "SURESH SHARMA",
"date_of_birth": "1992-08-14",
"holder_type_code": "P",
"holder_type": "Individual",
"pan_structure": {
"series": "ABC",
"holder_type_code": "P",
"holder_type": "Individual",
"name_initial": "S",
"sequence": "1234",
"check_digit": "F"
}
}
}holder_type_code is the 4th character semantics (e.g. P = Individual, C = Company). Use holder_type for human-readable Sheets filters.
Docs: /docs/api/extractPan · Product: /apis/pan.
Step 5: Append to Sheets
Google Sheets → Add a Row
Map each column from Step 1. For nested structure:
series = data.pan_structure.series
name_initial = data.pan_structure.name_initial
sequence = data.pan_structure.sequence
check_digit = data.pan_structure.check_digitSet status = ok on the success path.
Step 6: Route by holder type
Add a Router after a successful extract:
| Route | Condition | Action |
|---|---|---|
| Individual | holder_type_code = P | Optional Slack “retail KYC” |
| Company | holder_type_code = C | Flag for entity KYC pack |
| Other | else | Ops review |
You are not calling another Cryvis endpoint here — only branching on returned enums.
Step 7: Move processed files
Google Drive → Move a File from pan-inbox → pan-done. Prevents Watch modules from re-ingesting the same scan on the next poll.
Step 8: Errors
Error handler on HTTP:
- Write a Sheets row with
status=error,pan_numberblank,file_nameset, and a short error message column if you add one. - Move the file to
pan-failedinstead ofpan-done. - Alert Slack with Drive link only — not the image bytes.
Common issues:
- Wrong field name (
documentinstead offile) - HEIC uploads (convert before Cryvis, or reject in Filter)
- Multi-page PDF of an entire KYC pack — prefer a cropped PAN-only file for higher accuracy
Validation tips without inventing APIs
Cryvis returns structured pan_structure. You can add Make Filters such as:
length(pan_number)Equal to10upper(pan_number)Equalspan_number(normalize before compare)
Do not claim a separate “PAN verification against NSDL” step unless you integrate that yourself — this scenario is extraction, not government verification.
Ops cadence
| Metric | How |
|---|---|
| Daily volume | COUNTA on Sheets date column |
| Error rate | filter status=error |
| Company share | filter holder_type_code=C |
Make.com module settings (detail)
HTTP — Make a Request checklist:
- Body type must be
Multipart/form-data, notRawJSON. - Field name is exactly
file(lowercase). - Field type is File; map the Drive download binary, not the file URL string.
- Parse response as JSON (enable JSON parse on the module or add JSON → Parse JSON).
- Map Sheets from
data.pan_number, never from a guessed top-levelpan_numberunless you flatten first.
If Make shows the response as a string, add Parse JSON with JSON string = {{http.body}} (or the module’s data field name in your Make version).
Deduping PAN rows
Before Add a Row, optionally Google Sheets → Search Rows where pan_number equals data.pan_number:
- Found → Update a Row (refresh name/DOB from latest scan)
- Not found → Add a Row
This keeps one row per PAN when ops re-drop the same card after a blurry first attempt.
Credits and throughput
PAN extraction is 1 credit per PDF page or image (Credits). A single JPEG PAN is one credit. A multi-page PDF of an entire KYC pack still bills per page — crop to the PAN page before upload when possible.
For bursts (hundreds of files), raise Make’s scenario max run time and prefer Drive move-to-done so Watch does not re-queue.
Sample end-to-end timeline
T0 File lands in pan-inbox
T1 Watch Files fires (poll interval depends on Make plan)
T2 Download + HTTP Cryvis (~few seconds)
T3 Sheets row written; file moved to pan-done
T4 Router notifies Slack if holder_type_code = CIf T1 feels slow, switch the trigger to Google Drive → Watch Files with a shorter interval, or use a Drive webhook-style push if your Make plan supports it.
Related reading
CTA
Extract Indian PAN cards to JSON with Cryvis: /apis/pan. Docs: /docs/api/extractPan. From Make, POST file to https://api.cryvis.com/v1/documents/pan with Bearer auth and append data.pan_number, data.full_name, and data.holder_type to Sheets.