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.
Address Verification API Pricing
Free — 100 requests/month, no credit card. Paid — from $12/month (10,000 requests). Annual saves up to ~45%.
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))
{
"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.
AI-Powered Address Parsing and Correction
Eliminate errors and standardize address data with intelligent processing:
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:
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
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.
Ready to Get Started?
Start with 100 free requests every month. No credit card required.