Validate a postal address
A single missing apartment number or a swapped street type turns a delivery into a lost package and a support ticket. The address validation API parses free-text addresses into structured fields, corrects common formatting mistakes and standardises them against known postal conventions, so the address stored in your database is the one that actually gets a package or a letter to the door.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
The mundane cost of a messy address
Address data is chronically messy because it's usually typed once, by hand, under no particular scrutiny, at checkout or signup. Abbreviations vary by user and by region, apartment and unit numbers get dropped, street types get misspelled or omitted, and the same real-world address ends up stored a dozen different ways across a customer database. None of that matters until a carrier, a billing system or a compliance check needs the address to be exact, at which point the messiness becomes returns, failed deliveries and manual cleanup.
What the endpoint does with a raw address
Send free-text or partially structured input to POST /verify/address and the task parses it into discrete components such as street, number, unit, city, region and postal code, applies corrections for common typos and non-standard abbreviations, and returns the address standardised to conventional postal formatting for its country. Where the input is ambiguous or incomplete, the result reflects that rather than guessing silently, so downstream systems can decide whether to accept, flag or request clarification.
A little context on why address formats vary so much
Postal addressing conventions grew up independently in each country, shaped by how mail systems and municipal numbering evolved locally, which is why a format that reads naturally in one country looks foreign in another: unit-before-street versus street-before-unit ordering, postal code placement, and even whether a region or state field is expected at all differ by country. A validation layer that understands these conventions rather than applying one rigid template is what makes standardisation actually useful across an international customer base instead of just a domestic one.
Fitting it into checkout, CRM or shipping flows
Because the task runs asynchronously, most integrations call it right after a user submits an address at checkout or signup, using the standardised result to both confirm the order and store a cleaner record going forward; the result arrives by signed webhook, or through a signed link valid 24 hours if your pipeline polls instead. At $0.003 per request plus $0.0135 per item validated, it scales naturally from a single checkout call to a bulk cleanup pass over an entire legacy customer table, and failed validations are never billed.
What it validates, and what it deliberately doesn't claim
This endpoint validates structure and format against postal conventions; it does not claim to confirm that a specific unit is currently occupied or that a business is still operating at that address, which is a different kind of verification entirely. Treat it as making an address correct and deliverable-shaped, not as a guarantee of who or what is physically there today.
What you can do with it
Checkout address confirmation
Validate and standardise the shipping address the moment a customer submits it, catching a missing unit number before the order ships to the wrong door.
Legacy customer database cleanup
Run a bulk pass over years of accumulated free-text addresses to standardise formatting and surface records too incomplete to ship to reliably.
Invoicing and compliance records
Standardise billing addresses against postal conventions so invoices and tax documents carry a consistently formatted, deliverable address.
Multi-country signup forms
Parse addresses submitted from different countries into the correct field structure and ordering for each, instead of forcing one rigid form layout.
FAQ
Is the address validation API free?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
How is address validation priced?
$0.003 per request plus $0.0135 per address item validated, charged only when the task completes successfully.
Can it validate addresses in bulk?
Yes, submit a batch as items within a request or send multiple requests; the per-item pricing is built for cleaning up large existing address datasets.
Does it work for international addresses?
Yes, the task applies the postal formatting conventions appropriate to the address's country rather than one fixed template.
Does it confirm someone actually lives at the address?
No, it validates structure and postal formatting, not current occupancy; that's a separate kind of check entirely.
What happens with an incomplete or ambiguous address?
The result reflects the ambiguity rather than silently guessing, so you can decide whether to flag it, request clarification or accept it as-is.
How do I get the validated result?
By signed webhook, recommended for checkout and signup flows, or via a signed link valid 24 hours if you prefer to poll.
Is my address data retained after validation?
No, submitted address data is deleted after the retention window and is never used for training.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/verify/address \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"items":["valor-1","valor-2"]}'const res = await fetch("https://api.kit.forhosting.com/verify/address", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"items": [
"valor-1",
"valor-2"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/verify/address",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"items": [
"valor-1",
"valor-2"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/verify/address", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"items":["valor-1","valor-2"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"items":["valor-1","valor-2"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/verify/address", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"items": [
"valor-1",
"valor-2"
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "verify.address",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |