Address Verification REST API for Developers

Validate, correct, and standardize US addresses through a simple REST API built for developers, with accurate US address standardization and deliverability checks.

Last updated: June 27, 2026

The sthan.io Address Verification REST API lets developers validate, correct, and standardize US addresses in a single call. Each lookup checks deliverability and returns standardized components, ZIP+4, county, and a deliverable status. Start free with 100 requests/month, no credit card.

Match mode

Fuzzy/Speculative recover heavier typos — check matchTier, confidence and deliverableStatus in the result.

Usage
0 / day
Remaining
500 / day
Average
0 MS
IP Address
216.73.217.46

Address Verification API Pricing

Free — 100 requests/month, no credit card. Paid — from $12/month (10,000 requests). Annual saves up to ~45%.

Basic: 10,000 requests — $12/month
Starter: 50,000 requests — $42/month
Business: 150,000 requests — $85/month

Integrate in Minutes

Two steps: get your token, then make the GET request. Pick your language and start building.

# Step 1: Get your auth token
TOKEN=$(curl -s "https://api.sthan.io/Auth/Token" \
  -H "profileName: YOUR_PROFILE_NAME" \
  -H "profilePassword: YOUR_PROFILE_PASSWORD" | jq -r '.access_token')

# Step 2: Make the API call
ADDRESS="6000 j st sacramento ca 95819"
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$ADDRESS'))")

curl "https://api.sthan.io/v2/address-verification/usa/speculative/$ENCODED" \
  -H "Authorization: Bearer $TOKEN"
// Step 1: Get your auth token
const auth = await fetch("https://api.sthan.io/Auth/Token", {
  headers: {
    "profileName": "YOUR_PROFILE_NAME",
    "profilePassword": "YOUR_PROFILE_PASSWORD"
  }
});
const { access_token } = await auth.json();

// Step 2: Make the API call
const address = "6000 j st sacramento ca 95819";
const encoded = encodeURIComponent(address);

const response = await fetch(
  `https://api.sthan.io/v2/address-verification/usa/speculative/${encoded}`, {
  headers: { "Authorization": `Bearer ${access_token}` }
});
const data = await response.json();
console.log(data);
import requests
from urllib.parse import quote

# Step 1: Get your auth token
auth = requests.get(
    "https://api.sthan.io/Auth/Token",
    headers={
        "profileName": "YOUR_PROFILE_NAME",
        "profilePassword": "YOUR_PROFILE_PASSWORD"
    }
)
token = auth.json()["access_token"]

# Step 2: Make the API call
address = "6000 j st sacramento ca 95819"
encoded = quote(address)

response = requests.get(
    f"https://api.sthan.io/v2/address-verification/usa/speculative/{encoded}",
    headers={"Authorization": f"Bearer {token}"}
)
data = response.json()
print(data)
using var client = new HttpClient();

// Step 1: Get your auth token
client.DefaultRequestHeaders.Add("profileName", "YOUR_PROFILE_NAME");
client.DefaultRequestHeaders.Add("profilePassword", "YOUR_PROFILE_PASSWORD");
var authJson = await client.GetStringAsync("https://api.sthan.io/Auth/Token");
var auth = JsonSerializer.Deserialize<JsonElement>(authJson);
var token = auth.GetProperty("access_token").GetString();

// Step 2: Make the API call
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", token);

var address = "6000 j st sacramento ca 95819";
var encoded = Uri.EscapeDataString(address);

var response = await client.GetStringAsync(
    $"https://api.sthan.io/v2/address-verification/usa/speculative/{encoded}");
Console.WriteLine(response);
import java.net.*; import java.net.http.*;

// Step 1: Get your auth token
HttpClient client = HttpClient.newHttpClient();
HttpRequest authReq = HttpRequest.newBuilder()
    .uri(URI.create("https://api.sthan.io/Auth/Token"))
    .header("profileName", "YOUR_PROFILE_NAME")
    .header("profilePassword", "YOUR_PROFILE_PASSWORD")
    .build();
HttpResponse<String> authResp = client.send(authReq,
    HttpResponse.BodyHandlers.ofString());
// Parse access_token from authResp.body()

// Step 2: Make the API call
String address = "6000 j st sacramento ca 95819";
String encoded = URLEncoder.encode(address, "UTF-8");

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.sthan.io/v2/address-verification/usa/speculative/" + encoded))
    .header("Authorization", "Bearer " + token)
    .build();
HttpResponse<String> resp = client.send(request,
    HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
// Step 1: Get your auth token
$ch = curl_init("https://api.sthan.io/Auth/Token");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "profileName: YOUR_PROFILE_NAME",
    "profilePassword: YOUR_PROFILE_PASSWORD"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = json_decode(curl_exec($ch), true);
$token = $data["access_token"];

// Step 2: Make the API call
$address = "6000 j st sacramento ca 95819";
$encoded = urlencode($address);

$ch = curl_init("https://api.sthan.io/v2/address-verification/usa/speculative/" . $encoded);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer " . $token
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo $response;
require 'net/http'
require 'json'
require 'uri'

# Step 1: Get your auth token
uri = URI("https://api.sthan.io/Auth/Token")
req = Net::HTTP::Get.new(uri)
req["profileName"] = "YOUR_PROFILE_NAME"
req["profilePassword"] = "YOUR_PROFILE_PASSWORD"
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http|
  http.request(req)
}
token = JSON.parse(resp.body)["access_token"]

# Step 2: Make the API call
address = "6000 j st sacramento ca 95819"
encoded = URI.encode_www_form_component(address)

uri = URI("https://api.sthan.io/v2/address-verification/usa/speculative/#{encoded}")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{token}"
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http|
  http.request(req)
}
puts JSON.parse(resp.body)
import ("net/http"; "net/url"; "io"; "fmt")

// Step 1: Get your auth token
authReq, _ := http.NewRequest("GET", "https://api.sthan.io/Auth/Token", nil)
authReq.Header.Set("profileName", "YOUR_PROFILE_NAME")
authReq.Header.Set("profilePassword", "YOUR_PROFILE_PASSWORD")
authResp, _ := http.DefaultClient.Do(authReq)
defer authResp.Body.Close()
// Parse access_token from response JSON

// Step 2: Make the API call
address := "6000 j st sacramento ca 95819"
encoded := url.QueryEscape(address)

req, _ := http.NewRequest("GET",
    "https://api.sthan.io/v2/address-verification/usa/speculative/" + encoded, nil)
req.Header.Set("Authorization", "Bearer " + token)

resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
Example Response
{
  "inputAddress": "6000 j st sacramento ca 95819",
  "fullAddress": "6000 J St, Sacramento, CA 95819-2605",
  "addressLine1": "6000 J St",
  "addressLine2": "Sacramento, CA 95819-2605",
  "city": "Sacramento",
  "stateCode": "CA",
  "zipCode": "95819",
  "zip4": "2605",
  "county": "Sacramento",
  "dpvConfirmation": "Y",
  "deliverableStatus": "Confirmed",
  "matchMode": "Speculative",
  "matchTier": "Exact",
  "confidence": 1,
  "matchCode": {
    "houseNumber": "Matched",
    "street": "Matched",
    "city": "Matched",
    "state": "Matched",
    "zipCode": "Matched",
    "zip4": "Inferred"
  },
  "isError": false,
  "errorMessages": []
}

AI-Driven Address Parsing and Correction

Validate, correct, and standardize address data with AI-driven accuracy and standardized US address data.

Get Started Instantly – No Credit Card Required

Test our solution with 100 free requests per month, perfect for startups, developers, and small-scale operations.

Up to 100 monthly requests included in the free tier.

AI-Powered Address Parsing and Correction

Eliminate errors and standardize address data with intelligent processing:

Corrects misspelled street names:
1345 avvenue of americas new york ny → 1345 Avenue Of The Americas, New York, NY 10105-0302
325 w broaddwey # m ny 10013 → 325 W Broadway PH M, New York, NY 10013-1835
Fixes city name errors:
6000 j street sacrmeto ca → 6000 J St, Sacramento, CA 95819-2605
10094 delware bay raod derdenelle → 10094 Delaware Bay Rd, Dardanelle, AR 72834-2609
Fills in missing state details:
543 sanders road cross → 543 Sanders Rd, Cross, SC 29436
1199 w shaw avenue fresno → 1199 W Shaw Ave, Fresno, CA 93711
Adds missing ZIP codes:
543 sanders road cross sc → 543 Sanders Rd, Cross, SC 29436
1199 w shaw avenue fresno ca → 1199 W Shaw Ave, Fresno, CA 93711
Restructures out-of-order addresses:
1345 americas avenue NY → 1345 Ave Of The Americas, New York, NY 10105-0302
1199 fresno avenue west shaw ca → 1199 W Shaw Ave, Fresno, CA 93711
Quality of input matters:

AI-powered address parsing delivers highly accurate results, but the precision depends on the details provided. The more complete the input, the better the output. While our system intelligently fills in gaps, missing key details like city, state, or ZIP code may affect accuracy.

Standardized, Validated US Address Data

Validate and standardize US addresses for accurate, consistent, deliverable results.

Scalable & Cost-Effective Pricing

Flexible pricing that adapts to your business needs:

Plans from $12/month, tailored for growth.
Annual savings up to 45% with long-term plans.
Fair, volume-based discounts as your usage scales.

Secure, Transparent & Commitment-Free

We do not store your payment details, and you can cancel your subscription anytime—no commitments, no hidden charges.

Frequently Asked Questions

Address Verification is the process of validating and standardizing mailing addresses to standard postal formats. It corrects misspellings, adds missing ZIP codes, standardizes abbreviations, and checks whether an address exists and is properly formatted. This reduces returned mail, shipping costs, and improves customer data quality.
The free tier includes 100 verifications/month with no credit card. Paid plans start at $12/month for 10,000 verifications, with annual savings. See our pricing page for all plans.
No — sthan.io is not CASS-certified. The API standardizes US addresses, corrects errors, adds ZIP+4, and returns a deliverability status. If you need CASS certification for presort-mail discounts, use a CASS-certified provider.
Our AI-powered Address Verification corrects misspelled street and city names, adds missing state and ZIP codes, standardizes abbreviations (St, Ave, Blvd), handles unit types (Apt, Suite, #), and restructures out-of-order address components into proper postal format.
Response times depend on input quality:

Complete addresses — 1-5 seconds
Partial or ambiguous addresses — Up to 60 seconds (deeper recovery)

Longer response times mean the API is working harder to verify your address, rather than returning an empty result.
Address Verification and Address Validation are often used interchangeably. Both refer to the process of checking an address against postal data to confirm it exists and is correctly formatted. Our API provides full verification including standardization, correction, and format validation.

Ready to Get Started?

Start with 100 free requests every month. No credit card required.