USA Address Parser

AI-powered address component extraction with USPS validation. Response times range from 1s–5s depending on address complexity.

Last updated: March 7, 2026

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

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="123 main st apt 1 andover ma"
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$ADDRESS'))")

curl "https://api.sthan.io/AddressParser/USA/Single/$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 = "123 main st apt 1 andover ma";
const encoded = encodeURIComponent(address);

const response = await fetch(
  `https://api.sthan.io/AddressParser/USA/Single/${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 = "123 main st apt 1 andover ma"
encoded = quote(address)

response = requests.get(
    f"https://api.sthan.io/AddressParser/USA/Single/{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 = "123 main st apt 1 andover ma";
var encoded = Uri.EscapeDataString(address);

var response = await client.GetStringAsync(
    $"https://api.sthan.io/AddressParser/USA/Single/{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 = "123 main st apt 1 andover ma";
String encoded = URLEncoder.encode(address, "UTF-8");

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.sthan.io/AddressParser/USA/Single/" + 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 = "123 main st apt 1 andover ma";
$encoded = urlencode($address);

$ch = curl_init("https://api.sthan.io/AddressParser/USA/Single/" . $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 = "123 main st apt 1 andover ma"
encoded = URI.encode_www_form_component(address)

uri = URI("https://api.sthan.io/AddressParser/USA/Single/#{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 := "123 main st apt 1 andover ma"
encoded := url.QueryEscape(address)

req, _ := http.NewRequest("GET",
    "https://api.sthan.io/AddressParser/USA/Single/" + 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": "123 main st apt 1 andover ma",
  "fullAddress": "123 Main St APT 1, Andover, MA 01810-3816",
  "addressLine1": "123 Main St APT 1",
  "addressLine2": "Andover, MA 01810-3816",
  "addressNumber": "123",
  "streetName": "Main",
  "streetPostType": "St",
  "unitType": "APT",
  "unitNumber": "1",
  "city": "Andover",
  "stateCode": "MA",
  "state": "Massachusetts",
  "zipCode": "01810",
  "zip4": "3816",
  "county": "Essex",
  "isPostalVerified": true,
  "confidence": 1,
  "algorithmUsed": "202"
}

Enterprise-Grade Address Parsing with AI Precision

Enhance your address validation with AI-driven accuracy, seamless USPS verification, and robust error correction.

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 daily requests included in the free tier.

AI-Powered Address Parsing for Unmatched Accuracy

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 sacrmento 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.

Verified by USPS Data for Maximum Reliability

Leverage real-time, officially sourced USPS data for trusted address validation.

Scalable & Cost-Effective Pricing

Flexible pricing that adapts to your business needs:

Plans from $8/month, tailored for growth.
Annual savings up to 40% 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 Parsing is the process of breaking down a single address string into its individual components: street number, street name, unit/apartment, city, state, and ZIP code. This enables data storage, analysis, and integration with systems that require structured address fields.
Sthan.io includes a free tier for Address Parsing with no credit card required. Paid plans are available for higher volumes. See our pricing page for current plans and rates. Annual subscriptions provide additional savings.
Address Parsing extracts components from an address string (e.g., separating "123 Main St, Boston, MA 02101" into individual fields). Address Verification validates that the address is real and deliverable against USPS data. Many applications use both: first parsing, then verifying.
Yes, our AI-powered Address Parser handles messy, unstructured address input including typos, missing components, abbreviations, and out-of-order elements. It intelligently identifies and extracts components even from poorly formatted data.
Yes, our Address Parser corrects common errors including misspelled street and city names, standardizes abbreviations (St, Ave, Blvd), adds missing ZIP codes when possible, and restructures out-of-order components into proper USPS format.
Response times depend on input quality:

Complete addresses — 1-5 seconds
Partial or ambiguous addresses — Up to 60 seconds (multi-source resolution)

Longer response times mean the parser is working harder to resolve your address against additional sources, rather than returning an empty result.

Ready to Get Started?

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