developer-friendly US address APIs for autocomplete, parsing, verification, geocoding, and IP geolocation. Get started in under 5 minutes.
All systems operationalFree tier, no credit cardAPI key or JWT authREST API
Last updated: March 7, 2026
Quick Start
Make your first API call in under 5 minutes.
1
Create a Free Account
Sign up at sthan.io and subscribe to the Free tier. No credit card required. The free tier covers 100 requests a month for verification, parsing and geocoding, 100,000 for autocomplete, and 50,000 for IP geolocation.
2
Get an API Key
Create an API key in your dashboard (it looks like sthan_live_...) and send it as Authorization: Bearer YOUR_API_KEY on every request. A JWT from /Auth/Token still works if you prefer the original flow.
3
Make Your First Call
Copy any example below and replace YOUR_TOKEN with your API key from step 2. That's it!
Authentication
Two methods are supported. API key (recommended): create one in the dashboard and send Authorization: Bearer sthan_live_... on every request; keys do not expire and work with the CLI, the MCP server and AI agents. JWT token (original flow): obtain a token from /Auth/Token with your profile credentials and send it as a Bearer token; tokens last 60 minutes. The steps below show the JWT flow.
Step 1: Get Your Token
GET/Auth/Token
Send your profileName and profilePassword as request headers. The API returns a JWT access token and its expiration time.
using var client = newHttpClient();
client.DefaultRequestHeaders.Add("profileName", "YOUR_PROFILE_NAME");
client.DefaultRequestHeaders.Add("profilePassword", "YOUR_PROFILE_PASSWORD");
var json = await client.GetStringAsync("https://api.sthan.io/Auth/Token");
// Deserialize, then read the token at Result.access_token
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sthan.io/Auth/Token"))
.header("profileName", "YOUR_PROFILE_NAME")
.header("profilePassword", "YOUR_PROFILE_PASSWORD")
.build();
HttpResponse<String> resp = client.send(request,
HttpResponse.BodyHandlers.ofString());
// Parse JSON, then read the token at Result.access_token
API requests are rate-limited per subscription plan. When you exceed your limit, the API returns 429 Too Many Requests. The response includes a Retry-After header indicating when you can retry.
Product
Free
Basic
Starter
Business
Address Verification
100 / mo 10 / min
10,000 / mo 500 / min
50,000 / mo 2,500 / min
150,000 / mo 7,500 / min
Address Parser
100 / mo 10 / min
10,000 / mo 500 / min
50,000 / mo 2,500 / min
150,000 / mo 7,500 / min
Geocoding (forward + reverse)
100 / mo 10 / min
10,000 / mo 500 / min
50,000 / mo 2,500 / min
150,000 / mo 7,500 / min
Address Autocomplete
100,000 / mo 5,000 / min
100,000 / mo 5,000 / min
1,000,000 / mo 50,000 / min
5,000,000 / mo 250,000 / min
IP Geolocation
50,000 / mo 2,000 / min
100,000 / mo 4,000 / min
1,000,000 / mo 40,000 / min
5,000,000 / mo 200,000 / min
Larger Basic, Starter and Business volumes (up to 3,000,000 a month for address products, 100,000,000 for autocomplete) are on the pricing page. Enterprise volumes and higher per-minute rates are quoted on request.
429 Response Headers
HTTP/1.1 429 Too Many Requests
Retry-After: 30X-RateLimit-Limit: 100000X-RateLimit-Remaining: 0X-RateLimit-Reset: 1708300800
GET
Address Autocomplete
/AutoComplete/USA/Address/{text}
Returns real-time address suggestions as the user types. Handles abbreviations, apartment/suite numbers, and partial input. Ideal for checkout forms and address fields.
Parameters
Name
Type
Required
Description
text
string
Required
Partial address to search. URL-encoded. Min 3 chars for best results.
Response Codes
200 Success400 Bad Request401 Unauthorized429 Rate Limited
Request
curl -X GET \
"https://api.sthan.io/AutoComplete/USA/Address/123%20main%20st" \
-H "Authorization: Bearer YOUR_TOKEN"
const response = awaitfetch(
"https://api.sthan.io/AutoComplete/USA/Address/123%20main%20st",
{ headers: { "Authorization": "Bearer YOUR_TOKEN" } }
);
const data = await response.json();
// ["123 Main St APT 1, Andover, MA 01810-3816", "123 Main St APT 1, Delhi, NY 13753-1257", ...]
import requests
response = requests.get(
"https://api.sthan.io/AutoComplete/USA/Address/123%20main%20st",
headers={"Authorization": "Bearer YOUR_TOKEN"}
)
print(response.json())
# ["123 Main St APT 1, Andover, MA 01810-3816", "123 Main St APT 1, Delhi, NY 13753-1257", ...]
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var json = await client.GetStringAsync(
"https://api.sthan.io/AutoComplete/USA/Address/123%20main%20st");
// ["123 Main St APT 1, Andover, MA 01810-3816", "123 Main St APT 1, Delhi, NY 13753-1257", ...]
req, _ := http.NewRequest("GET",
"https://api.sthan.io/AutoComplete/USA/Address/123%20main%20st", nil)
req.Header.Set("Authorization", "Bearer YOUR_TOKEN")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
// ["123 Main St APT 1, Andover, MA 01810-3816", "123 Main St APT 1, Delhi, NY 13753-1257", ...]
200 Response
[
"123 Main St APT 1, Andover, MA 01810-3816",
"123 Main St APT 1, Delhi, NY 13753-1257",
"123 Main St STE 1, Caldwell, ID 83605-5476",
"123 Main St STE 1, Corinth, NY 12822-1010",
"123 Main St STE 1, Delhi, NY 13753-1258"
]
Try it live
Need more than just the full address string? Explore related APIs:
Address Parser
From $8/mo
Break addresses into components: street, city, state, ZIP, county.
Parses a raw address string into structured components (street number, street name, unit, city, state, ZIP, county). Returns USPS-standardized results with confidence scores.
Parameters
Name
Type
Required
Description
address
string
Required
Full or partial US address to parse. URL-encoded.
Request
curl -X GET \
"https://api.sthan.io/v2/address-parser/usa/speculative/1600%20pennsylvania%20ave%20nw%20washington%20dc%2020500" \
-H "Authorization: Bearer YOUR_TOKEN"
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var json = await client.GetStringAsync(
"https://api.sthan.io/v2/address-parser/usa/speculative/1600%20pennsylvania%20ave%20nw%20washington%20dc%2020500");
// Deserialize to your model class
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var result = await client.GetFromJsonAsync<VerifiedAddress>(
"https://api.sthan.io/v2/address-verification/usa/speculative/6000%20j%20st%20sacramento%20ca%2095819");
Console.WriteLine($"DPV: {result.DpvConfirmation}");
Confirmed = safe to ship, ConfirmedPrimaryOnly = primary OK but secondary unit missing or invalid, NotDeliverable = postal authority rejected, Unknown = no postal confirmation on file. Single field for client routing logic; derived from dpvConfirmation.
dpvConfirmation
string
Raw postal DPV code: Y = confirmed deliverable, N = not deliverable, S = secondary (apt) missing, D = vacant
carrierRoute
string
USPS carrier route code (e.g., C001 = city route 1)
deliveryPoint
string
2-digit delivery point code appended to ZIP+4
recordType
string
S = street, H = highrise, F = firm, R = rural route, P = PO box
zip4
string
4-digit ZIP extension for precise delivery routing
unitType
string
Confirmed secondary-unit designator split out of the standardized address, for example APT, STE, UNIT. Empty when the address has no secondary unit. Only a postal-confirmed unit appears here.
unitNumber
string
Confirmed secondary-unit number, for example 142. Empty when the address has no secondary unit.
Returns real-time US city name suggestions as the user types. Supports multiple display formats combining city name with state code or full state name.
Parameters
Name
Type
Required
Description
displayType
int
Required
0 = City, StateCode (e.g., Sacramento, CA) 1 = City, State (e.g., Sacramento, California)
text
string
Required
Partial city name to search. URL-encoded.
Request
curl -X GET \
"https://api.sthan.io/AutoComplete/USA/City/DisplayType/0/sacram" \
-H "Authorization: Bearer YOUR_TOKEN"
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var json = await client.GetStringAsync(
"https://api.sthan.io/AutoComplete/USA/City/DisplayType/0/sacram");
Returns real-time ZIP code suggestions for US addresses. Supports 4 display formats with varying levels of detail. Covers all ~42,000 active US ZIP codes.
Parameters
Name
Type
Required
Description
displayType
int
Required
0 = ZipCode, City, StateCode 1 = ZipCode, City, State 2 = ZipCode-Zip4, City, StateCode 3 = ZipCode-Zip4, City, State
text
string
Required
Partial ZIP code or city name. URL-encoded.
Request
curl -X GET \
"https://api.sthan.io/AutoComplete/USA/ZipCode/DisplayType/0/9582" \
-H "Authorization: Bearer YOUR_TOKEN"
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var json = await client.GetStringAsync(
"https://api.sthan.io/AutoComplete/USA/ZipCode/DisplayType/0/9582");
Converts a US street address into geographic coordinates (latitude and longitude). Returns matched address components along with high-accuracy coordinates.
Parameters
Name
Type
Required
Description
address
string
Required
Full US address to geocode. URL-encoded.
Request
curl -X GET \
"https://api.sthan.io/Geocoding/USA/Forward/1600%20Pennsylvania%20Ave%20NW%20Washington%20DC" \
-H "Authorization: Bearer YOUR_TOKEN"
Converts geographic coordinates (latitude/longitude) into a human-readable street address. Returns the nearest matched address with city, state, ZIP, and county information.
Parameters
Name
Type
Required
Description
lat
double
Required
Latitude coordinate (-90 to 90)
lon
double
Required
Longitude coordinate (-180 to 180)
Request
curl -X GET \
"https://api.sthan.io/Geocoding/USA/Reverse/38.897676/-77.036530" \
-H "Authorization: Bearer YOUR_TOKEN"
{
"latitude": 38.897676,
"longitude": -77.036530,
"fullAddress": "1600 Pennsylvania Ave NW, Washington, DC 20500",
"city": "Washington",
"stateCode": "DC",
"state": "District of Columbia",
"zipCode": "20500",
"county": "District of Columbia"
}
Try it live
GET
IP Geolocation
/IpGeolocation/{ip}
Look up any IPv4 or IPv6 address. Returns country, region, city, coordinates, postal code, timezone with current local time, flag, currency, calling code, network (ASN, ISP, organisation), mobile/proxy/hosting flags, reverse DNS and a confidence score. confidence is 0 to 1 and is absent when the address is new to us (ask again in a few seconds) or when the sources did not agree on a city; precision says whether the answer goes down to a city, a region or only a country.
Parameters
Name
Type
Required
Description
ip
string
Required
IPv4 or IPv6 address (e.g., 8.8.8.8)
Request
curl -X GET \
"https://api.sthan.io/IpGeolocation/8.8.8.8" \
-H "Authorization: Bearer YOUR_TOKEN"
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var json = await client.GetStringAsync(
"https://api.sthan.io/AutoComplete/Ind/City/DisplayType/0/mumbai");
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var json = await client.GetStringAsync(
"https://api.sthan.io/AutoComplete/Ind/Locality/DisplayType/0/koramangala");
using var client = newHttpClient();
client.DefaultRequestHeaders.Authorization =
newAuthenticationHeaderValue("Bearer", "YOUR_TOKEN");
var json = await client.GetStringAsync(
"https://api.sthan.io/AutoComplete/Ind/PinCode/DisplayType/0/400001");