ArthOne Bridge API

Complete REST API for OCR document processing, ARN data lookup, PAN validation, user registration with OTP verification, and JWT-based authentication. All endpoints return JSON responses.

JWTAuth tokens
OCRPAN, Aadhaar
ARNMF data
PANValidation

API Documentation

ArthOne Bridge Platform provides REST APIs for OCR document processing (PAN/Aadhaar), ARN distributor data lookup, PAN validation, and JWT-based authentication with wallet billing. Every API call requires a single-use token — generate one with your API key, use it once, and the fee is auto-deducted with refund on failure.

Login to Portal

Need to create an account first? Open Bridge Registration to verify your mobile number and complete your profile.

Base URL

https://arthone.in/bridge/public

Key Features

JWT Authentication

Single-use, purpose-scoped Bearer tokens. Generate a token for OCR, ARN, or PAN, use it once. Fee is charged upfront with automatic refund on failure.

OCR Processing

Extract data from PAN cards, Aadhaar cards, and other documents. Supports PDF and image formats. File size must be less than 1.5 MB.

ARN Data API

Lookup AMFI Registration Numbers with full-text search, state/city filters, and pagination support.

PAN Validation

Verify PAN numbers via Easebuzz API. Get holder name, father's name, DOB, and validity status instantly.

Getting Started

  1. Get Your API Key Log in to the Bridge Portal and generate an API key. Each key has a secret pair used for JWT token generation.
  2. Choose Your API Pick the API you need from the sidebar — OCR for document processing, ARN for distributor data lookup, or PAN for PAN validation.
  3. Generate a JWT Token Call POST /auth/token with your api_key, api_secret, and purpose (ocr, arn, or pan). The fee is deducted from your wallet. You receive a single-use JWT token.
  4. Make Your API Call Use the code examples in each API section to make your call with Authorization: Bearer <token>. The token is consumed after one call.

Every API request requires a JWT token. Call POST /auth/token with your API key, API secret, and purpose (ocr, arn, or pan) to get a single-use token. The service fee is charged at token generation. Pass the token as Authorization: Bearer <token> header. If the API call fails, the fee is refunded automatically. ARN API also supports legacy X-API-Key header.

JWT Authentication

Secure token-based authentication for all Bridge API endpoints.

Important: Each token is single-use — it works for exactly one API call (one OCR, one ARN, or one PAN request). You must generate a new token for every request. The token is also scoped to a specific purpose (ocr, arn, or pan) — an OCR token cannot be used for ARN or PAN endpoints and vice versa.

POST

Generate JWT Token

Exchange your API key, API secret, and a purpose for a JWT Bearer token. The service fee is deducted from your wallet immediately at token generation — not after the API call. The token is valid for 1 hour but can only be used once. If the API call fails, the fee is automatically refunded to your wallet and the token is revoked.

POST https://arthone.in/bridge/public/auth/token

Parameters

ParameterTypeRequiredDescription
api_keystringRequiredYour bridge API key. Can be passed as POST param, JSON body, GET param, or X-API-Key header.
api_secretstringRequiredYour bridge API secret. Can be passed as POST param, JSON body, GET param, or X-API-Secret header. Both key and secret must match the same API key record.
purposestringRequiredWhat the token will be used for: ocr for OCR processing, arn for ARN data API, pan for PAN validation. An OCR token only works with /ocr/* endpoints; an ARN token only works with /arn/* endpoints; a PAN token only works with /pan/* endpoints.

How Billing Works

When you generate a token, the service fee (OCR: ₹5/call, ARN: ₹2/call, PAN: ₹3/call — all configurable by admin) is deducted from your wallet immediately. If the actual API call succeeds, the fee stays deducted. If the API call fails for any reason (OCR error, file issue, ARN not found, PAN invalid, server error), the fee is automatically refunded to your wallet and the token is revoked. You can then generate a new token to retry.

Example Request (cURL — form data)

# Generate a token for OCR processing curl -X POST https://arthone.in/bridge/public/auth/token \ -d "api_key=YOUR_API_KEY" \ -d "api_secret=YOUR_API_SECRET" \ -d "purpose=ocr"

Example Request (cURL — JSON body)

# Generate a token for ARN lookup curl -X POST https://arthone.in/bridge/public/auth/token \ -H "Content-Type: application/json" \ -d '{"api_key":"YOUR_API_KEY","api_secret":"YOUR_API_SECRET","purpose":"arn"}'

Success Response

{ "success": true, "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600, "expires_at": "2026-08-21T15:30:00+05:30", "api_key_id": 1, "key_name": "My App Key", "purpose": "ocr", "fee_charged": 5.00, "wallet_balance": 495.00 } }

Error Responses

CodeReason
400Missing api_key, api_secret, or purpose parameter
401Invalid key/secret, key inactive, or user inactive. Error message specifies the exact reason.
402Insufficient wallet balance for the requested service fee
POST

Verify Token

Check if a JWT token is valid and not revoked.

POST https://arthone.in/bridge/public/auth/verify

Headers

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
POST

Revoke Token

Revoke a JWT token immediately. Subsequent requests with this token will fail.

POST https://arthone.in/bridge/public/auth/revoke

Headers

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Using the token: Pass the token in the Authorization: Bearer <your_jwt_token> header for your API call. Each token works for exactly one request — after the API call completes (success or failure), the token is consumed. Generate a new token for every subsequent request.

Complete Request Flow

Every API request follows this 2-step flow. You cannot skip step 1 — the token is required and is consumed after step 2.

1
Generate a scoped token
Call POST /auth/token with your api_key, api_secret, and purpose (ocr, arn, or pan). The fee is deducted from your wallet. You receive a JWT token.
2
Make the API call
Call POST /ocr/process (for OCR), GET /arn/lookup (for ARN), or POST /pan/verify (for PAN) with Authorization: Bearer <token>. The token is consumed after this call.
Success — fee stays deducted
If the API call succeeds, you get the result. The fee that was charged at token generation remains deducted. Generate a new token for the next request.
Failure — automatic refund + token revoke
If the API call fails (OCR error, file issue, ARN not found, PAN invalid, server error), the fee is refunded to your wallet automatically and the token is revoked. Generate a new token to retry.
Key points: Token is single-use (1 call only). Token is purpose-scoped (OCR token ≠ ARN token ≠ PAN token). Fee is charged upfront at token generation, not at API call. Failed calls get automatic refund.

Error Codes & Responses

Standard HTTP status codes used across all API endpoints.

CodeMeaningWhen
200SuccessRequest completed successfully
400Bad RequestMissing or invalid parameters
401UnauthorizedMissing, invalid, or expired JWT token / API key
402Payment RequiredInsufficient wallet balance for token generation
403ForbiddenAccess denied (filtered key, restricted record, purpose mismatch)
404Not FoundRequested resource not found
405Method Not AllowedWrong HTTP method used
500Internal Server ErrorServer-side processing error
502Bad GatewayUpstream service error (e.g. Easebuzz PAN API failure)

Error Response Format

{ "success": false, "error": "Human-readable error message" }

OCR API

Extract structured data from PAN cards, Aadhaar cards, and other documents using AI-powered OCR.

Overview

The OCR API allows you to upload document images or PDFs and extract structured text data. It automatically detects document types (PAN, Aadhaar, GST, etc.) and returns parsed fields. Requires a JWT token generated with purpose=ocr.

Endpoint

POST https://arthone.in/bridge/public/ocr/process

Supported Document Types

PAN Card Aadhaar Card Cheque / Bank Statement GST Certificate Incorporation Certificate

Authentication

Requires a JWT token generated with purpose=ocr. The OCR fee (₹5/call) is charged at token generation. Pass the token in the Authorization header.

Step 1: Generate Token (purpose=ocr)

# Generate a single-use OCR token (fee is charged here) curl -X POST https://arthone.in/bridge/public/auth/token \ -d "api_key=YOUR_API_KEY" \ -d "api_secret=YOUR_API_SECRET" \ -d "purpose=ocr" # Response includes the token and updated wallet balance # { "success": true, "data": { "token": "eyJ...", "fee_charged": 5.00, "wallet_balance": 495.00 } }

Parameters

ParameterTypeRequiredDescription
filefileEither file or urlDocument file (multipart/form-data). File size must be less than 1.5 MB. Supports: PDF, PNG, JPG, JPEG, GIF, TIFF, BMP.
urlstringEither file or urlPublic URL of the document image (e.g., https://example.com/pan_card.jpg). The server downloads and processes it. File size must be less than 1.5 MB after download.
languagestringOptionalOCR language code (default: eng). Supported: eng, ara, bul, chs, cht, hrv, cze, dan, dut, fin, fre, ger, gre, hun, kor, ita, jpn, pol, por, rus, slv, spa, swe, tha, tur, ukr, vnm.

Code Examples

Headers

Authorization: Bearer YOUR_JWT_TOKEN Content-Type: multipart/form-data
# Option A: Upload a file (token consumed after this call) curl -X POST https://arthone.in/bridge/public/ocr/process \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -F "file=@/path/to/pan_card.jpg" \ -F "language=eng" # Option B: Send an image URL instead of uploading a file curl -X POST https://arthone.in/bridge/public/ocr/process \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -d "url=https://example.com/pan_card.jpg" \ -d "language=eng"
<?php // Step 1: Generate OCR token $ch = curl_init('https://arthone.in/bridge/public/auth/token'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => [ 'api_key' => 'YOUR_API_KEY', 'api_secret' => 'YOUR_API_SECRET', 'purpose' => 'ocr', ], ]); $resp = json_decode(curl_exec($ch), true); $token = $resp['data']['token']; curl_close($ch); // Step 2: Process OCR (token consumed after this) $ch = curl_init('https://arthone.in/bridge/public/ocr/process'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token], CURLOPT_POSTFIELDS => [ 'file' => new CURLFile('/path/to/document.jpg'), 'language' => 'eng', ], ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); print_r($data['data']);
// Step 1: Generate OCR token const tokenResp = await fetch('https://arthone.in/bridge/public/auth/token', { method: 'POST', body: new URLSearchParams({ api_key: 'YOUR_API_KEY', api_secret: 'YOUR_API_SECRET', purpose: 'ocr', }), }); const { data: { token } } = await tokenResp.json(); // Step 2: Process OCR (token consumed after this) const formData = new FormData(); formData.append('file', fileInput.files[0]); formData.append('language', 'eng'); const res = await fetch('https://arthone.in/bridge/public/ocr/process', { method: 'POST', headers: { 'Authorization': 'Bearer ' + token }, body: formData, }); const data = await res.json(); console.log(data.data);
# Step 1: Generate OCR token import requests token_resp = requests.post('https://arthone.in/bridge/public/auth/token', data={'api_key': 'YOUR_API_KEY', 'api_secret': 'YOUR_API_SECRET', 'purpose': 'ocr'}) token = token_resp.json()['data']['token'] # Step 2: Process OCR (token consumed after this) url = 'https://arthone.in/bridge/public/ocr/process' headers = {'Authorization': 'Bearer ' + token} files = {'file': open('document.jpg', 'rb')} data = {'language': 'eng'} resp = requests.post(url, headers=headers, files=files, data=data) result = resp.json() print(result['data'])

Success Response (PAN Card)

{ "success": true, "data": { "document_type": "PAN", "pan_number": "ACOFA0041K", "name": "Ramesh Kumar", "father_name": "Suresh Kumar", "date_of_birth": "15/03/1990", "raw_text": "INCOME TAX DEPARTMENT\nGOVT OF INDIA\nACOFA0041K\nName: Ramesh Kumar\nFather's Name: Suresh Kumar\nDate of Birth: 15/03/1990\nSignature", "log_id": 42, "fee_charged": 5.00, "wallet_balance": 495.00 } }
GET

Health Check

Returns the current status of the OCR service. No authentication required.

GET https://arthone.in/bridge/public/ocr/health

Response

{ "success": true, "data": { "status": "healthy", "ocr_keys_available": 3, "timestamp": "2026-08-21T14:30:00+05:30" } }
GET

OCR Processing Logs

Returns a paginated list of your OCR processing requests.

GET https://arthone.in/bridge/public/ocr/logs?page=1&limit=20

Headers

Authorization: Bearer YOUR_JWT_TOKEN

Parameters

ParameterTypeRequiredDescription
pageintOptionalPage number (default: 1)
limitintOptionalRecords per page (default: 20, max: 100)

Best Practices

PracticeRecommendation
Generate one token per requestOCR tokens are single-use and purpose-scoped. Never reuse a consumed token.
Validate files before uploadUse supported formats and keep file size less than 1 MB for best performance and reliability.
Keep API keys server-sideDo not expose your API key or secret in browser code or public repositories.
Handle automatic refundsWhen processing fails, show the error and allow a new token to be generated.

AI Integration Prompt

Copy the prompt below, paste it into any AI coding assistant (ChatGPT, Claude, Cursor, Bolt, etc.), replace [YOUR_TECH_STACK] with your technology (React, Node.js, Python, Flutter, PHP, etc.), and the AI will generate a complete working integration for you.

You are an expert developer. Integrate the ArthOne Bridge OCR API into my application. TECHNOLOGY: [YOUR_TECH_STACK] (e.g., React + Node.js, Python, Flutter, PHP, etc.) BASE_URL: https://arthone.in/bridge/public , API_KEY: YOUR_API_KEY API_SECRET: YOUR_API_SECRET API FLOW (2 steps — repeat both steps for each OCR request): STEP 1 — Generate Token: POST {BASE_URL}/auth/token Content-Type: application/x-www-form-urlencoded Body params: api_key, api_secret, purpose=ocr Response: { "success": true, "data": { "token": "JWT_TOKEN" } } The token is single-use. Generate a new one for every OCR request. STEP 2 — Process OCR: POST {BASE_URL}/ocr/process Headers: Authorization: Bearer {token} Body (multipart/form-data): file=@document.jpg OR image_url=https://example.com/doc.jpg Supported formats: jpg, jpeg, png, pdf, webp, bmp, tiff, heic (file size must be less than 1.5 MB) Response: { "success": true, "data": { "document_type": "PAN|Aadhaar|Cheque/Statement|GST|Incorporation|Unknown", "ocr_text": "full extracted text", "extracted_fields": { ... }, "log_id": 123 } } EXTRACTED FIELDS BY DOCUMENT TYPE: PAN: pan_number, name, fathers_name, date_of_birth Aadhaar: aadhaar_number, name, date_of_birth, gender, address{full_address, house_no, street, city, district, state, pincode} Cheque/Statement: account_number, account_holder_name, ifsc_code, bank_details{bank, branch, address, city, state, micr} GST: gstin, legal_name, trade_name, constitution, registration_type, date_of_liability, validity_from, validity_to, principal_place_of_business{...}, designated_partners[] Incorporation: entity_type, entity_name, identification_number, pan, tan, date_of_incorporation, act, signatory, signatory_designation, mailing_address HEALTH CHECK (no auth needed): GET {BASE_URL}/ocr/health Returns: { "success": true, "service": "...", "status": "operational", ... } OCR LOGS (no auth needed): GET {BASE_URL}/ocr/logs?page=1&limit=20 ERROR CODES: 401 — invalid, expired, or already-used token 403 — token purpose mismatch (not an OCR token) 400 — no file/URL provided, invalid file type, file too large, or OCR processing failed 500 — server error DELIVERABLES: 1. File upload UI with drag-drop, file picker, and URL input option 2. API service module that runs Step 1 then Step 2 sequentially 3. Loading and error states for each step (generating token, processing, success, error) 4. Display extracted fields grouped by document type in a clean structured layout 5. Retry button on failure (auto-generates a new token) 6. Config file for BASE_URL, API_KEY, API_SECRET 7. Responsive design for mobile and desktop Never expose API_KEY or API_SECRET in frontend/browser code. Route OCR calls through a backend proxy for web apps. Generate all files needed for a working integration.

Sample PHP Code

Download a complete, self-contained PHP file that demonstrates the full OCR integration flow — upload a document, generate a token, call the OCR API, and display the result. No framework needed, just upload it to any PHP server.

How to use: 1. Download the file. 2. Edit the three config lines at the top (BRIDGE_BASE_URL, BRIDGE_API_KEY, BRIDGE_API_SECRET). 3. Upload to any PHP 7.4+ server. 4. Open in browser, pick a document, and submit. Your API keys stay server-side — they never reach the browser.

Download ocr-sample.php

Error Responses

CodeReasonRefund?
401Missing, invalid, expired, or already-used JWT tokenNo (token was invalid)
403Token purpose mismatch (ARN/PAN token used for OCR)No (token was invalid)
400No file uploaded and no valid URL provided / invalid file type / file too large / image URL download failedYes — fee refunded, token revoked
400OCR processing failed (OCR service returned error)Yes — fee refunded, token revoked
500OCR service error / no API keys configured / cURL errorYes — fee refunded, token revoked

Automatic refund: If the OCR call fails for any reason (file validation, OCR service error, server error), the fee that was charged at token generation is automatically credited back to your wallet. The token is also revoked. You can generate a new token to retry.

ARN Data API

Access AMFI Registration Number (ARN) records with lookup, search, and filtering capabilities.

Overview

The ARN Data API gives you access to AMFI Registration Number records. Use it to look up specific ARN holders by number, or search and filter across the entire database with pagination support.

Base URL

https://arthone.in/bridge/public/arn/...

Access Types

TypeDescription
fullAll ARN records accessible, no restrictions
filteredOnly allowed states/cities records are returned

Authentication

Every request requires a JWT token with purpose=arn, or a legacy ARN API key. The ARN fee (₹2/call) is charged at token generation.

# Option 1: JWT Bearer token (purpose=arn, single-use) Authorization: Bearer YOUR_JWT_TOKEN # Option 2: Legacy ARN API key (no token needed) X-API-Key: YOUR_ARN_API_KEY

Step 1: Generate Token (purpose=arn)

# Generate a single-use ARN token (fee is charged here) curl -X POST https://arthone.in/bridge/public/auth/token \ -d "api_key=YOUR_API_KEY" \ -d "api_secret=YOUR_API_SECRET" \ -d "purpose=arn"
GET

Endpoint 1: ARN Lookup

Fetch complete data for a specific ARN number. Pass the ARN number and get all associated details including holder name, validity dates, contact, address, and EUIN.

GET https://arthone.in/bridge/public/arn/lookup?arn=122553

Parameters

ParameterTypeRequiredDescription
arnstringRequiredARN number to look up (e.g., 122553, ARN-12345). Passed as a query parameter.

Code Examples

# Lookup ARN (token consumed after this call) curl -X GET "https://arthone.in/bridge/public/arn/lookup?arn=122553" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"
<?php // Step 1: Generate ARN token $ch = curl_init('https://arthone.in/bridge/public/auth/token'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => [ 'api_key' => 'YOUR_API_KEY', 'api_secret' => 'YOUR_API_SECRET', 'purpose' => 'arn', ], ]); $resp = json_decode(curl_exec($ch), true); $token = $resp['data']['token']; curl_close($ch); // Step 2: Lookup ARN (token consumed after this) $ch = curl_init('https://arthone.in/bridge/public/arn/lookup?arn=122553'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token], ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); print_r($data['data']);
// Step 1: Generate ARN token const tokenResp = await fetch('https://arthone.in/bridge/public/auth/token', { method: 'POST', body: new URLSearchParams({ api_key: 'YOUR_API_KEY', api_secret: 'YOUR_API_SECRET', purpose: 'arn', }), }); const { data: { token } } = await tokenResp.json(); // Step 2: Lookup ARN (token consumed after this) const res = await fetch('https://arthone.in/bridge/public/arn/lookup?arn=122553', { headers: { 'Authorization': 'Bearer ' + token }, }); const data = await res.json(); console.log(data.data);
# Step 1: Generate ARN token import requests token_resp = requests.post('https://arthone.in/bridge/public/auth/token', data={'api_key': 'YOUR_API_KEY', 'api_secret': 'YOUR_API_SECRET', 'purpose': 'arn'}) token = token_resp.json()['data']['token'] # Step 2: Lookup ARN (token consumed after this) url = 'https://arthone.in/bridge/public/arn/lookup?arn=122553' headers = {'Authorization': 'Bearer ' + token} resp = requests.get(url, headers=headers) result = resp.json() print(result['data'])

Response Fields

FieldTypeDescription
arnstringAMFI Registration Number
arn_holder_namestringName of the ARN holder / distributor
arn_valid_fromstringARN validity start date
arn_valid_tillstringARN validity end date
telephone_ostringOffice telephone number
telephone_rstringResidence telephone number
emailstringEmail address of the distributor
addressstringFull postal address
pinstringPIN / ZIP code
citystringCity name
statestringState name
euinstringEuropean Union Identification Number (EUIN)

Success Response (JSON)

{ "success": true, "data": { "arn": "122553", "arn_holder_name": "John Doe Associates", "arn_valid_from": "01-Jan-2024", "arn_valid_till": "31-Dec-2027", "telephone_o": "02212345678", "telephone_r": "02298765432", "email": "john@example.com", "address": "123 Main Street, Andheri West", "pin": "400053", "city": "Mumbai", "state": "Maharashtra", "euin": "E123456" } }
GET

States & Cities

Get distinct states and cities available in the ARN database. Useful for building filter dropdowns.

Get States

GET https://arthone.in/bridge/public/arn/states
curl -X GET "https://arthone.in/bridge/public/arn/states" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"

Get Cities

GET https://arthone.in/bridge/public/arn/cities
curl -X GET "https://arthone.in/bridge/public/arn/cities" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"

Best Practices

PracticeRecommendation
Use header authenticationPrefer the Authorization header. Avoid putting credentials in URLs or query strings.
Use paginationFor large datasets, use page and limit. The maximum limit is 100.
Cache stable lookupsCache repeated ARN and location lookups to reduce unnecessary API calls.
Respect filtered accessKeep searches within the states and cities permitted for your API key.

AI Integration Prompt

Copy the prompt below, paste it into any AI coding assistant (ChatGPT, Claude, Cursor, Bolt, etc.), replace [YOUR_TECH_STACK] with your technology (React, Node.js, Python, Flutter, PHP, etc.), and the AI will generate a complete working integration for you.

You are an expert developer. Integrate the ArthOne Bridge ARN Data API into my application. TECHNOLOGY: [YOUR_TECH_STACK] (e.g., React + Node.js, Python, Flutter, PHP, etc.) BASE_URL: https://arthone.in/bridge/public , API_KEY: YOUR_API_KEY API_SECRET: YOUR_API_SECRET API FLOW (2 steps — repeat both steps for each ARN request): STEP 1 — Generate Token: POST {BASE_URL}/auth/token Content-Type: application/x-www-form-urlencoded Body params: api_key, api_secret, purpose=arn Response: { "success": true, "data": { "token": "JWT_TOKEN" } } The token is single-use. Generate a new one for every ARN request. STEP 2a — ARN Lookup (get single ARN record): GET {BASE_URL}/arn/lookup?arn=122553 Headers: Authorization: Bearer {token} Response: { "success": true, "data": { "arn": "122553", "arn_holder_name": "John Doe Associates", "arn_valid_from": "01-Jan-2024", "arn_valid_till": "31-Dec-2027", "telephone_o": "02212345678", "telephone_r": "02298765432", "email": "john@example.com", "address": "123 Main Street, Andheri West", "pin": "400053", "city": "Mumbai", "state": "Maharashtra", "euin": "E123456" } } STEP 2b — ARN Search (search and filter with pagination): GET {BASE_URL}/arn/search?search=john&state=Maharashtra&city=Mumbai&page=1&limit=20 Headers: Authorization: Bearer {token} Parameters: search — full-text search across ARN, holder name, email, city, EUIN state — filter by exact state name city — filter by exact city name month — filter by arn_valid_from month (1-12) year — filter by arn_valid_from year page — page number (default: 1) limit — records per page (default: 20, max: 100) Response: { "success": true, "data": [ { "arn": "122553", "arn_holder_name": "...", "city": "...", "state": "...", "euin": "..." } ], "pagination": { "total": 1500, "page": 1, "limit": 20, "total_pages": 75 } } STEP 2c — States and Cities (populate filter dropdowns): GET {BASE_URL}/arn/states Headers: Authorization: Bearer {token} GET {BASE_URL}/arn/cities Headers: Authorization: Bearer {token} ERROR CODES: 400 — missing arn parameter 401 — invalid or already-used token 403 — token purpose mismatch or access denied (filtered key, restricted state/city) 404 — ARN not found in database DELIVERABLES: 1. ARN lookup form — input for ARN number, submit button, result card showing all fields 2. ARN search interface — search box, state/city dropdowns (populated from /arn/states and /arn/cities), pagination 3. API service module that runs Step 1 then Step 2 sequentially 4. Loading and error states for each step 5. Pagination controls (prev/next, page indicator) 6. Click a search result to view full ARN details via lookup 7. Config file for BASE_URL, API_KEY, API_SECRET 8. Responsive design for mobile and desktop Never expose API_KEY or API_SECRET in frontend/browser code. Route calls through a backend proxy for web apps. Generate all files needed for a working integration.

Error Responses

CodeReasonRefund?
400Missing arn parameterYes — fee refunded
401Missing, invalid, or already-used token / API keyNo
403Token purpose mismatch (OCR/PAN token used for ARN)No
403Access denied (filtered key, restricted state/city)Yes — fee refunded
404ARN not found in databaseYes — fee refunded

Automatic refund: If the ARN lookup fails for any reason (not found, access denied, missing parameter), the fee that was charged at token generation is automatically credited back to your wallet. The token is also revoked. Generate a new token to retry.

PAN Validation API

Verify PAN numbers and get holder details via the Easebuzz PAN validation service.

Overview

The PAN Validation API allows you to verify a PAN number and retrieve the holder's name, father's name, date of birth, and validity status. It uses the Easebuzz PAN verification service behind the scenes. Requires a JWT token generated with purpose=pan.

Endpoint

POST https://arthone.in/bridge/public/pan/verify

The PAN fee (₹3/call, configurable by admin) is deducted from your wallet at token generation. If verification fails, the fee is automatically refunded.

Authentication

Requires a JWT token generated with purpose=pan. The PAN fee (₹3/call) is charged at token generation.

Step 1: Generate Token (purpose=pan)

# Generate a single-use PAN token (fee is charged here) curl -X POST https://arthone.in/bridge/public/auth/token \ -d "api_key=YOUR_API_KEY" \ -d "api_secret=YOUR_API_SECRET" \ -d "purpose=pan"
POST

Verify PAN

Verify a PAN number via the Easebuzz PAN validation API. Returns the holder's name, father's name, date of birth, and whether the PAN is valid. The fee was already charged at token generation — if this call fails, the fee is automatically refunded.

POST https://arthone.in/bridge/public/pan/verify

Headers

Authorization: Bearer YOUR_JWT_TOKEN Content-Type: application/json (or multipart/form-data)

Parameters

ParameterTypeRequiredDescription
pan_numberstringRequiredPAN number to verify. Format: 5 letters + 4 digits + 1 letter (e.g., ABCDE1234F). Can be passed as POST param, JSON body, or GET param.

Code Examples

# Verify PAN (token consumed after this call) curl -X POST https://arthone.in/bridge/public/pan/verify \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -d "pan_number=ABCDE1234F"
<?php // Step 1: Generate PAN token $ch = curl_init('https://arthone.in/bridge/public/auth/token'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => [ 'api_key' => 'YOUR_API_KEY', 'api_secret' => 'YOUR_API_SECRET', 'purpose' => 'pan', ], ]); $resp = json_decode(curl_exec($ch), true); $token = $resp['data']['token']; curl_close($ch); // Step 2: Verify PAN (token consumed after this) $ch = curl_init('https://arthone.in/bridge/public/pan/verify'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token], CURLOPT_POSTFIELDS => ['pan_number' => 'ABCDE1234F'], ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); print_r($data['data']);
// Step 1: Generate PAN token const tokenResp = await fetch('https://arthone.in/bridge/public/auth/token', { method: 'POST', body: new URLSearchParams({ api_key: 'YOUR_API_KEY', api_secret: 'YOUR_API_SECRET', purpose: 'pan', }), }); const { data: { token } } = await tokenResp.json(); // Step 2: Verify PAN (token consumed after this) const formData = new FormData(); formData.append('pan_number', 'ABCDE1234F'); const res = await fetch('https://arthone.in/bridge/public/pan/verify', { method: 'POST', headers: { 'Authorization': 'Bearer ' + token }, body: formData, }); const data = await res.json(); console.log(data.data);
# Step 1: Generate PAN token import requests token_resp = requests.post('https://arthone.in/bridge/public/auth/token', data={'api_key': 'YOUR_API_KEY', 'api_secret': 'YOUR_API_SECRET', 'purpose': 'pan'}) token = token_resp.json()['data']['token'] # Step 2: Verify PAN (token consumed after this) url = 'https://arthone.in/bridge/public/pan/verify' headers = {'Authorization': 'Bearer ' + token} resp = requests.post(url, headers=headers, data={'pan_number': 'ABCDE1234F'}) result = resp.json() print(result['data'])

Success Response

{ "success": true, "data": { "pan_number": "ABCDE1234F", "name": "JOHN DOE", "father_name": "JAMES DOE", "dob": "1990-01-15", "is_valid": true, "log_id": 42, "fee_charged": 3.00, "wallet_balance": 997.00 } }

Response Fields

FieldTypeDescription
pan_numberstringPAN number (uppercase)
namestringHolder's name as per PAN records
father_namestringFather's name as per PAN records
dobstringDate of birth as per PAN records
is_validbooleanWhether the PAN is valid and active
log_idintInternal log ID for this verification
fee_chargedfloatFee charged for this call
wallet_balancefloatUpdated wallet balance after fee deduction
GET

Health Check

Returns the current status of the PAN validation service. No authentication required.

GET https://arthone.in/bridge/public/pan/health

Response

{ "success": true, "service": "ArthOne Bridge PAN Validation", "status": "operational", "database": "connected", "timestamp": "2026-08-22T14:30:00+05:30", "version": "1.0.0" }
GET

PAN Verification Logs

Returns a paginated list of your PAN verification requests.

GET https://arthone.in/bridge/public/pan/logs?page=1&limit=20

Headers

Authorization: Bearer YOUR_JWT_TOKEN

Parameters

ParameterTypeRequiredDescription
pageintOptionalPage number (default: 1)
limitintOptionalRecords per page (default: 20, max: 100)

Best Practices

PracticeRecommendation
Validate PAN format locallyCheck the 5-letter, 4-digit, 1-letter pattern before generating a paid token.
Protect personal dataKeep PAN responses private, avoid logging full responses, and restrict access to authorized staff.
Use one token oncePAN tokens are single-use. Generate a fresh token for every verification request.
Handle invalid PANs clearlyShow the verification result separately from service errors and retry only after a new token is issued.

AI Integration Prompt

Copy the prompt below, paste it into any AI coding assistant (ChatGPT, Claude, Cursor, Bolt, etc.), replace [YOUR_TECH_STACK] with your technology (React, Node.js, Python, Flutter, PHP, etc.), and the AI will generate a complete working integration for you.

You are an expert developer. Integrate the ArthOne Bridge PAN Validation API into my application. TECHNOLOGY: [YOUR_TECH_STACK] (e.g., React + Node.js, Python, Flutter, PHP, etc.) BASE_URL: https://arthone.in/bridge/public , API_KEY: YOUR_API_KEY API_SECRET: YOUR_API_SECRET API FLOW (2 steps — repeat both steps for each PAN verification): STEP 1 — Generate Token: POST {BASE_URL}/auth/token Content-Type: application/x-www-form-urlencoded Body params: api_key, api_secret, purpose=pan Response: { "success": true, "data": { "token": "JWT_TOKEN" } } The token is single-use. Generate a new one for every PAN verification. STEP 2 — Verify PAN: POST {BASE_URL}/pan/verify Headers: Authorization: Bearer {token} Body (form-urlencoded, JSON, or multipart): pan_number=ABCDE1234F PAN format: 5 letters + 4 digits + 1 letter (e.g., ABCDE1234F) Response: { "success": true, "data": { "pan_number": "ABCDE1234F", "name": "JOHN DOE", "father_name": "JAMES DOE", "dob": "1990-01-15", "is_valid": true, "log_id": 42 } } HEALTH CHECK (no auth needed): GET {BASE_URL}/pan/health Returns: { "success": true, "service": "...", "status": "operational", ... } PAN LOGS (no auth needed): GET {BASE_URL}/pan/logs?page=1&limit=20 ERROR CODES: 400 — missing or invalid PAN format (must be 5 letters + 4 digits + 1 letter) 401 — invalid or already-used token 402 — insufficient wallet balance 403 — token purpose mismatch (not a PAN token) 502 — PAN verification service error DELIVERABLES: 1. PAN input form with client-side format validation (5 letters + 4 digits + 1 letter before calling API) 2. Result card showing pan_number, name, father_name, dob, is_valid (green check for valid, red cross for invalid) 3. API service module that runs Step 1 then Step 2 sequentially 4. Loading and error states for each step 5. Retry button on failure (auto-generates a new token) 6. Config file for BASE_URL, API_KEY, API_SECRET 7. Responsive design for mobile and desktop Never expose API_KEY or API_SECRET in frontend/browser code. Route calls through a backend proxy for web apps. PAN numbers are sensitive personal data — avoid logging full responses. Generate all files needed for a working integration.

Error Responses

CodeReasonRefund?
400Missing or invalid PAN format (must be 5 letters + 4 digits + 1 letter)Yes — fee refunded
401Missing, invalid, or already-used JWT tokenNo (token was invalid)
402Insufficient wallet balance for PAN tokenNo (token not generated)
403Token purpose mismatch (OCR/ARN token used for PAN)No (token was invalid)
502PAN verification service error (Easebuzz API failure)Yes — fee refunded

Automatic refund: If the PAN verification fails for any reason (invalid format, service error, network issue), the fee that was charged at token generation is automatically credited back to your wallet. The token is also revoked. Generate a new token to retry.

Utility API

Look up bank details by IFSC code and post office details by pincode. Free to use — no per-call fee.

Overview

The Utility API provides two free lookup endpoints: IFSC (bank branch details) and Pincode (post office details). No fee is charged per call. However, your wallet balance must be at least ₹5,000 to use these endpoints. Requires a JWT token generated with purpose=utility.

Free: The Utility API token fee is ₹0 — no charge at token generation. The only requirement is a minimum wallet balance of ₹5,000. If your balance drops below ₹5,000, API calls will be rejected with a 402 error.

Authentication

Requires a JWT token generated with purpose=utility. The token fee is ₹0 (free). Pass the token in the Authorization header.

Step 1: Generate Token (purpose=utility)

# Generate a free utility token (no fee charged) curl -X POST https://arthone.in/bridge/public/auth/token \ -d "api_key=YOUR_API_KEY" \ -d "api_secret=YOUR_API_SECRET" \ -d "purpose=utility"
GET

IFSC Lookup

Look up bank branch details by IFSC code. Returns bank name, branch, address, city, state, MICR, and supported payment modes (UPI, RTGS, NEFT, IMPS).

GET https://arthone.in/bridge/public/utility/ifsc?ifsc=HDFC0001234

Parameters

ParameterTypeRequiredDescription
ifscstringRequired11-character IFSC code (4 letters + 0 + 6 alphanumeric). Can be passed as query param, POST body, or JSON body.

Code Examples

# Step 1: Generate free utility token curl -X POST https://arthone.in/bridge/public/auth/token \ -d "api_key=YOUR_API_KEY" \ -d "api_secret=YOUR_API_SECRET" \ -d "purpose=utility" # Step 2: Look up IFSC (token consumed after this call) curl -X GET "https://arthone.in/bridge/public/utility/ifsc?ifsc=HDFC0001234" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"
<?php // Step 1: Generate utility token (free) $ch = curl_init('https://arthone.in/bridge/public/auth/token'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => [ 'api_key' => 'YOUR_API_KEY', 'api_secret' => 'YOUR_API_SECRET', 'purpose' => 'utility', ], ]); $resp = json_decode(curl_exec($ch), true); $token = $resp['data']['token']; curl_close($ch); // Step 2: Look up IFSC $ch = curl_init('https://arthone.in/bridge/public/utility/ifsc?ifsc=HDFC0001234'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token], ]); $response = json_decode(curl_exec($ch), true); print_r($response['data']);
// Step 1: Generate utility token (free) const tokenResp = await fetch('https://arthone.in/bridge/public/auth/token', { method: 'POST', body: new URLSearchParams({ api_key: 'YOUR_API_KEY', api_secret: 'YOUR_API_SECRET', purpose: 'utility', }), }); const { data: { token } } = await tokenResp.json(); // Step 2: Look up IFSC const res = await fetch('https://arthone.in/bridge/public/utility/ifsc?ifsc=HDFC0001234', { headers: { 'Authorization': 'Bearer ' + token }, }); const data = await res.json(); console.log(data.data);

Success Response

{ "success": true, "data": { "ifsc": "HDFC0001234", "bank": "HDFC Bank", "bank_code": "HDFC", "branch": "Mumbai Main", "address": "123 Main Street, Mumbai", "city": "Mumbai", "district": "Mumbai", "state": "Maharashtra", "contact": "+912266666666", "micr": "400240017", "upi": true, "rtgs": true, "neft": true, "imps": true, "swift": "", "iso3166": "IN-MH" } }
GET

Pincode Lookup

Look up post office details by 6-digit pincode. Returns all post offices serving that pincode with name, branch type, delivery status, division, region, circle, district, state, and country.

GET https://arthone.in/bridge/public/utility/pincode?pincode=110001

Parameters

ParameterTypeRequiredDescription
pincodestringRequired6-digit Indian pincode (e.g., 110001). Can be passed as query param, POST body, or JSON body.

Code Examples

# Step 1: Generate free utility token curl -X POST https://arthone.in/bridge/public/auth/token \ -d "api_key=YOUR_API_KEY" \ -d "api_secret=YOUR_API_SECRET" \ -d "purpose=utility" # Step 2: Look up pincode curl -X GET "https://arthone.in/bridge/public/utility/pincode?pincode=110001" \ -H "Authorization: Bearer YOUR_JWT_TOKEN"
<?php // Step 1: Generate utility token (free) $ch = curl_init('https://arthone.in/bridge/public/auth/token'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => [ 'api_key' => 'YOUR_API_KEY', 'api_secret' => 'YOUR_API_SECRET', 'purpose' => 'utility', ], ]); $resp = json_decode(curl_exec($ch), true); $token = $resp['data']['token']; curl_close($ch); // Step 2: Look up pincode $ch = curl_init('https://arthone.in/bridge/public/utility/pincode?pincode=110001'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token], ]); $response = json_decode(curl_exec($ch), true); print_r($response['data']);
// Step 1: Generate utility token (free) const tokenResp = await fetch('https://arthone.in/bridge/public/auth/token', { method: 'POST', body: new URLSearchParams({ api_key: 'YOUR_API_KEY', api_secret: 'YOUR_API_SECRET', purpose: 'utility', }), }); const { data: { token } } = await tokenResp.json(); // Step 2: Look up pincode const res = await fetch('https://arthone.in/bridge/public/utility/pincode?pincode=110001', { headers: { 'Authorization': 'Bearer ' . token }, }); const data = await res.json(); console.log(data.data);

Success Response

{ "success": true, "data": { "pincode": "110001", "message": "Number of Post office(s) found: 3", "status": "Success", "post_offices": [ { "name": "Connaught Place", "pincode": "110001", "branch_type": "Head Post Office", "delivery_status": "Delivery", "division": "New Delhi GPO", "region": "Delhi", "circle": "Delhi", "district": "New Delhi", "state": "Delhi", "country": "India", "block": "New Delhi" } ] } }
GET

Health Check

Returns the current status of the Utility API service. No authentication required.

GET https://arthone.in/bridge/public/utility/health

Response

{ "success": true, "service": "ArthOne Bridge Utility API", "status": "operational", "database": "connected", "timestamp": "2026-08-24T14:30:00+05:30", "version": "1.0.0", "min_wallet_balance": 5000 }

AI Integration Prompt

Copy the prompt below, paste it into any AI coding assistant (ChatGPT, Claude, Cursor, Bolt, etc.), replace [YOUR_TECH_STACK] with your technology (React, Node.js, Python, Flutter, PHP, etc.), and the AI will generate a complete working integration for you.

You are an expert developer. Integrate the ArthOne Bridge Utility API (IFSC & Pincode lookup) into my application. TECHNOLOGY: [YOUR_TECH_STACK] (e.g., React + Node.js, Python, Flutter, PHP, etc.) BASE_URL: https://arthone.in/bridge/publicAPI_KEY: YOUR_API_KEY API_SECRET: YOUR_API_SECRET IMPORTANT: The Utility API is FREE — no per-call fee. The token fee is 0. However, the user's wallet balance must be at least Rs.5000 to use these endpoints. If the balance is below 5000, a 402 error is returned. API FLOW (2 steps — repeat both steps for each lookup): STEP 1 — Generate Token (FREE): POST {BASE_URL}/auth/token Content-Type: application/x-www-form-urlencoded Body params: api_key, api_secret, purpose=utility Response: { "success": true, "data": { "token": "JWT_TOKEN", "fee_charged": 0 } } The token is single-use. Generate a new one for every lookup. STEP 2a — IFSC Lookup (bank branch details): GET {BASE_URL}/utility/ifsc?ifsc=HDFC0001234 Headers: Authorization: Bearer {token} IFSC format: 4 letters + 0 + 6 alphanumeric (11 chars total) Response: { "success": true, "data": { "ifsc": "HDFC0001234", "bank": "HDFC Bank", "branch": "Mumbai Main", "address": "123 Main Street, Mumbai", "city": "Mumbai", "district": "Mumbai", "state": "Maharashtra", "contact": "+912266666666", "micr": "400240017", "upi": true, "rtgs": true, "neft": true, "imps": true, "swift": "", "iso3166": "IN-MH" } } STEP 2b — Pincode Lookup (post office details): GET {BASE_URL}/utility/pincode?pincode=110001 Headers: Authorization: Bearer {token} Pincode format: 6 digits Response: { "success": true, "data": { "pincode": "110001", "message": "Number of Post office(s) found: 3", "status": "Success", "post_offices": [ { "name": "Connaught Place", "pincode": "110001", "branch_type": "Head Post Office", "delivery_status": "Delivery", "division": "New Delhi GPO", "region": "Delhi", "circle": "Delhi", "district": "New Delhi", "state": "Delhi", "country": "India", "block": "New Delhi" } ] } } HEALTH CHECK (no auth needed): GET {BASE_URL}/utility/health Returns: { "success": true, "service": "ArthOne Bridge Utility API", "status": "operational", "min_wallet_balance": 5000 } ERROR CODES: 400 — missing or invalid IFSC/pincode parameter 401 — invalid or already-used token 402 — wallet balance below Rs.5000 minimum 403 — token purpose mismatch (not a utility token) 404 — no data found for pincode 502 — upstream lookup service error DELIVERABLES: 1. IFSC lookup form — input for 11-char IFSC code, submit button, result card showing bank, branch, address, city, state, MICR, and payment mode badges (UPI/RTGS/NEFT/IMPS) 2. Pincode lookup form — input for 6-digit pincode, submit button, result card showing all post offices (name, branch type, delivery status, district, state, country) in a list or table 3. Tab-based or toggle UI to switch between IFSC and Pincode lookups on the same page 4. API service module that runs Step 1 then Step 2 sequentially 5. Loading and error states for each step (generating token, looking up, success, error) 6. Wallet balance warning — if balance is below 5000, show a warning message before the user tries a lookup 7. Retry button on failure (auto-generates a new token) 8. Config file for BASE_URL, API_KEY, API_SECRET 9. Responsive design for mobile and desktop Never expose API_KEY or API_SECRET in frontend/browser code. Route calls through a backend proxy for web apps. Generate all files needed for a working integration.

Sample PHP Code

Download a complete, self-contained PHP file that demonstrates the full Utility API integration flow — generate a free token, look up IFSC and pincode, and display results. No framework needed, just upload it to any PHP server.

How to use: 1. Download the file. 2. Edit the three config lines at the top (BRIDGE_BASE_URL, BRIDGE_API_KEY, BRIDGE_API_SECRET). 3. Upload to any PHP 7.4+ server. 4. Open in browser, enter an IFSC or pincode, and submit. Your API keys stay server-side — they never reach the browser.

Download utility-sample.php

Error Responses

CodeReason
400Missing or invalid IFSC/pincode parameter
401Missing, invalid, or already-used JWT token
402Wallet balance below ₹5,000 minimum required for Utility API
403Token purpose mismatch (not a utility token)
404No data found for the given pincode
502Upstream lookup service error (IFSC or pincode service unavailable)

Note: Utility API is free (no per-call fee). The token fee is ₹0. However, a minimum wallet balance of ₹5,000 is required. If your balance drops below this threshold, calls will be rejected with a 402 error. Recharge your wallet to continue using the Utility API.