iChek Address API

Make sure every customer gives you a delivery address that actually works. iChek fills in city and state from the PIN code, catches wrong or incomplete addresses while the customer is still typing, and returns a clean, standardized address you can ship to.

Create a free accountTry the live demo
PIN auto-fillCustomer types a 6-digit PIN code, and city and state fill in instantly from India Post data.
Fix-it hintsWrong state for the PIN, missing house number, test text or a vague "near temple" gets a clear hint before the order is placed.
Clean address outEach address gets a score from 0 to 100, one of three statuses (VERIFIED, NEEDS_REVIEW or INVALID) and a standardized one-line address.

Quick start

  1. Create an account. The free plan includes 1,000 checks a month.
  2. Open Install & settings in your dashboard. You get two keys:
    • pk_… is the publishable key. It's safe to put in web pages and is used by the widget.
    • sk_… is the secret key. It's for your server only. Never put it in a web page or app.
  3. Pick how you connect:
    You have…UseCoding needed
    Any website checkout (custom, Magento, OpenCart…)Checkout widget: one script tagPaste one line
    WooCommerceWordPress pluginNone
    Your own backend or mobile appREST APIA few lines
    A spreadsheet of existing addressesBulk upload in the dashboardNone
  4. Before going live, add your website domain under Allowed website domains so your publishable key only works on your site.

Checkout widget

Paste this on your checkout or address page, just before </body>. Use your own publishable key:

<script src="https://api.ichek.info/widget.js" data-key="pk_YOUR_KEY" async></script>

That's all. The widget finds the address fields on the page by itself, including forms that appear later, like WooCommerce's. Then it:

Options

AttributeWhat it does
data-block-invalid="true"If the address is INVALID, the customer must fix it or click "Continue anyway" before the form submits.
data-lang="hi"Shows the widget's own labels in Hindi.
data-auto="false"Turns off auto-detection. Tell the widget your fields yourself (below).

Point it at your fields (optional)

<script src="https://api.ichek.info/widget.js" data-key="pk_YOUR_KEY" data-auto="false"></script>
<script>
  iChek.attach({
    pincode: '#zip', city: '#city', state: '#state',
    line1: '#address1', line2: '#address2', landmark: '#landmark', phone: '#phone',
    onResult: function (r) { console.log(r.status, r.score, r.standardized.full); }
  });
</script>

Every check also fires an ichek:result event on the form, with the result in event.detail.

Shopify: Shopify doesn't allow outside scripts on its own checkout pages, so the widget can't run there. It still works on Shopify cart pages and custom COD forms. Pro customers can score every Shopify order through a webhook instead (see RTO risk scoring).

WooCommerce plugin

  1. Download ichek-woocommerce.zip.
  2. In WordPress, go to Plugins → Add New → Upload Plugin, choose the zip, then Install and Activate.
  3. Go to WooCommerce → iChek and paste your publishable key. The iChek URL is already filled in. Click Save.

The widget now runs on your checkout and cart pages. Each order stores the address check result, which shows in the order screen under the shipping address.

REST API

Base URLhttps://api.ichek.info/api/v1
AuthenticationHeader X-API-Key: sk_YOUR_SECRET_KEY
FormatJSON in, JSON out (UTF-8)
Interactive referencehttps://api.ichek.info/docs (try calls in the browser)

POST/address/verify

Checks one address and returns a score, the problems found, hints to show the customer and a standardized address.

FieldRequiredDescription
line1yesHouse / flat number, building, street
line2Area / locality
landmarkNearby landmark
cityCity / town (filled from the PIN if empty)
stateState name or code (KA, Karnataka…). Filled from the PIN if empty.
pincodeyes (India)6-digit PIN code
phoneMobile number. +91 and spaces are fine.
countryISO code. Defaults to IN. Other countries get basic checks only.
curl -X POST https://api.ichek.info/api/v1/address/verify \
  -H "X-API-Key: sk_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"line1":"flat 204 lotus towers, 5th cross","line2":"indiranagar",
       "city":"Bangalore","state":"KA","pincode":"560038","phone":"+91 98765 43210"}'

Response: a good address

{
  "score": 95,
  "status": "VERIFIED",
  "standardized": {
    "line1": "Flat 204 Lotus Towers, 5th Cross",
    "line2": "Indiranagar",
    "landmark": "",
    "city": "Bangalore",
    "state": "Karnataka",
    "pincode": "560038",
    "country": "IN",
    "full": "Flat 204 Lotus Towers, 5th Cross, Indiranagar, Bangalore, Karnataka 560038"
  },
  "issues": [
    { "code": "NO_LANDMARK", "severity": "info", "message": "No landmark given", "penalty": 5 }
  ],
  "suggestions": [ "Add a nearby landmark (helps the courier)" ],
  "pincode_info": { "pin": "560038", "found": true, "state": "Karnataka",
                    "districts": ["Bengaluru"], "offices": ["HAL II Stage", "Indiranagar"] },
  "location": null,
  "phone": "9876543210",
  "phone_valid": true,
  "country": "IN"
}

Response: an address that needs fixing ("line1": "near temple", "state": "Bihar", "pincode": "560038")

{
  "score": 40,
  "status": "INVALID",
  "issues": [
    { "code": "STATE_PIN_MISMATCH", "severity": "error", "message": "PIN 560038 belongs to Karnataka, not Bihar", "penalty": 25 },
    { "code": "LINE_SHORT",  "severity": "warn", "message": "Address is very short", "penalty": 20 },
    { "code": "NO_HOUSE_NO", "severity": "warn", "message": "No house / flat / plot number", "penalty": 15 }
  ],
  "suggestions": [
    "PIN and state don't match — is the PIN or the state wrong? (Karnataka)",
    "Add building, street and area",
    "Add house or flat number"
  ],
  ...
}

GET/pincode/{pin}

Looks up a PIN code and returns its state, districts and post offices. Useful for building your own auto-fill.

curl https://api.ichek.info/api/v1/pincode/560038 -H "X-API-Key: sk_YOUR_SECRET_KEY"

{ "pin": "560038", "valid_format": true, "found": true, "state": "Karnataka",
  "districts": ["Bengaluru"], "offices": ["HAL II Stage", "Indiranagar"], "source": "api" }

found is false when the PIN doesn't exist. It is null when only the PIN's range could be checked, because the lookup service was unreachable.

Response fields

FieldMeaning
score0–100. Starts at 100, and each problem subtracts its penalty.
statusVERIFIED (80+): ship it · NEEDS_REVIEW (50–79): show the hints · INVALID (<50): ask the customer to fix it
standardizedThe cleaned address: proper capitalization, abbreviations expanded (opp → Opposite, rd → Road), canonical state name, city/state filled from the PIN, and full as one line.
issues[]Each problem: code, severity (error / warn / info), message, penalty
suggestions[]Short, customer-friendly hints, ready to show on screen.
pincode_infoWhat we know about the PIN code (state, districts, post offices).
location{lat, lon, precision} when available, otherwise null.
phone, phone_validThe normalized 10-digit mobile number, and whether it's a valid Indian mobile.

Issue codes

CodeSeverityMeaning
PIN_MISSING / PIN_FORMATerrorNo PIN, or not 6 digits
PIN_NOT_FOUNDerrorThe PIN doesn't exist in India Post records
STATE_PIN_MISMATCHerrorThe state doesn't match the PIN code
JUNK_TEXTerrorTest or placeholder text ("test", "asdf", "xyz"…)
LINE_MISSINGerrorNo street address
CITY_PIN_MISMATCHwarnThe city isn't in the PIN code's area
LINE_SHORT / LINE_FEW_WORDSwarnThe address is too short to find
NO_HOUSE_NOwarnNo house / flat / plot number
STATE_UNKNOWN, CITY_MISSING, PHONE_INVALIDwarnUnrecognized state, empty city, or invalid mobile
NO_LANDMARK, STATE_FILLED, CITY_FILLED, PIN_UNVERIFIEDinfoHints and auto-fills

Bulk CSV / Excel

In the dashboard, go to Bulk upload → Addresses and upload a .csv or .xlsx file of up to 5,000 rows. Column names are matched flexibly ("Pin Code", "Mobile", "Address 1", Shopify/WooCommerce exports…). You get a score, status, standardized address and hints for every row, and can download the results as CSV.

From code: POST /api/v1/bulk/verify with multipart fields file and mode=addresses.

Errors & limits

HTTPMeaningWhat to do
401Missing or wrong keyCheck X-API-Key (server) or data-key (widget)
402Monthly quota used upUpgrade your plan, or wait for next month
403Domain not allowed, or Pro featureAdd your domain in Settings, or upgrade to Pro
429Too many requests from one IP (widget: 60 per minute)Slow down and retry
400 / 422Bad inputThe response body says which field
If iChek can't be reached, let the order through. Never block your checkout on the API. The widget already fails silently.

RTO risk scoring PRO

For COD-heavy stores. Every order gets a risk level (LOW / REVIEW / HIGH) with reasons. The score uses address quality, COD vs prepaid, order value, the customer's past RTOs and failed deliveries, one phone used with many addresses (or one address with many phones), the PIN code's RTO rate and bursts of orders. Your team works a review queue (call, then Verify or Reject) before dispatch. Courier outcomes flow back, so the rules can be tuned from real results.

EndpointUse
POST/order/scoreAddress fields plus order_id, customer_name, payment_method (COD/PREPAID) and order_value. Returns risk_level, risk_score and risk_reasons.
POST/order/outcome{"order_id":"1001","outcome":"delivered | ndr | rto | cancelled"}
POST/order/verify{"order_id":"1001","action":"verified | rejected","note":"called customer"}
GET/orders/riskOrders waiting for a decision, highest risk first
Shopify / WooCommerceNo code: paste the webhook URL from your dashboard into your store's webhook settings, and every new order is scored automatically.
AlertsSet a callback URL. REVIEW/HIGH orders are POSTed to it and signed with X-iChek-Signature (HMAC-SHA256 of the body using your secret key).

Downloads

PIN code data: India Post. Questions? Contact us through ichek.info.