Zip-Codes.com is a drop-in JSON replacement for the address and ZIP operations (Verify, ZipCodeLookup, CityStateLookup). XML POST becomes a JSON GET. USERID becomes a single API key. Free tier: 2,500 credits per day, no expiration.
2,500 credits/day · No credit card · No expiration
Trusted by teams at








USPS Web Tools ran for roughly 22 years as the de facto free address-and-shipping API for US developers. It covered three families: address operations (Verify, ZipCodeLookup, CityStateLookup), rate calculation (RateV4, IntlRateV2), and tracking / labels (TrackV2, eVS, Service Standards). When USPS retired the platform on January 25, 2026, integrations across WooCommerce, Magento, Drupal Commerce, nopCommerce, osCommerce, custom ERPs, and one-off scripts went dark. This page is about replacing the address-and-ZIP family. For tracking and shipping, you’ll need a separate path.
The migration concentrates in three places. Format: Web Tools accepted
XML POST with an XML= query parameter and returned text/xml.
Our endpoints accept ordinary REST — GET with query parameters,
application/json response, real HTTP status codes. Every mainstream language
has JSON parsing in its stdlib. Auth: Web Tools used a plaintext
USERID attribute on the outermost XML element — no secret, no rotation.
We use a single API key (header or query parameter), generated and rotatable in your
dashboard, with no key-pair handshake or OAuth dance. Routing: Web Tools
routed every operation through one dispatcher (secure.shippingapis.com/ShippingAPI.dll)
with operation selected by an API= query parameter. Our endpoints have their
own URLs — /v2/address, /v2/zip, /v2/quick-zip
— with standard REST semantics that your routing layer, retries, and circuit
breakers expect.
The operation mapping for the address-and-ZIP family is direct. The Verify
operation (address standardization with USPS-style delivery metadata) maps to
/v2/address: pass a free-form address, get back the standardized form, ZIP+4,
parsed components (number, directional, street, suffix, secondary), and delivery
metadata (carrier route, county FIPS, congressional district, building name, record type).
ZipCodeLookup (address → ZIP) is also covered by /v2/address
— ZIP+4 is part of the standardized output. CityStateLookup (ZIP →
city/state) maps to /v2/quick-zip for the lightweight version, or
/v2/zip if you want the 50+ optional enrichment fields that Web Tools never
offered.
A few capabilities we add that Web Tools never had: radius search (find every postal code within N miles of a center point, centroid or true spatial polygon-intersection), geographic typeahead (cities, counties, CBSAs, FSAs, ZIPs), point-to-point distance with bearing, Census ACS demographic enrichment across 14 years and 542 fields per ZIP, and full Canadian FSA + 6-character postal coverage on the same API key. Same credit pool, same monthly plan.
Web Tools operation → Zip-Codes.com equivalent. Tracking and shipping operations not covered — see honest concession below.
| USPS Web Tools operation | Zip-Codes.com equivalent | Notes |
|---|---|---|
Verify (address standardization) |
GET /v2/address |
Standardized address, ZIP+4, parsed components, USPS metadata |
ZipCodeLookup (address → ZIP) |
GET /v2/address |
ZIP+4 is part of the standardized output — same endpoint |
CityStateLookup (ZIP → city/state) |
GET /v2/quick-zip |
Or upgrade to /v2/zip for 50+ enrichment fields |
| Not covered — use a separate shipping/tracking API | ||
RateV4, IntlRateV2 |
Not offered | Rate calculation — EasyPost, Shippo |
TrackV2 |
Not offered | Package tracking — AfterShip, EasyPost |
eVS, ExpressMailCommitment |
Not offered | Label printing, service standards — shipping API or USPS direct |
Same address, same workflow. XML POST becomes a JSON GET.
POST https://secure.shippingapis.com/ShippingAPI.dll
Content-Type: application/x-www-form-urlencoded
API=Verify&XML=
<AddressValidateRequest USERID="YOUR_USERID">
<Revision>1</Revision>
<Address ID="0">
<Address2>1600 Pennsylvania Ave NW</Address2>
<City>Washington</City>
<State>DC</State>
<Zip5></Zip5>
<Zip4></Zip4>
</Address>
</AddressValidateRequest>
# Response: text/xml
<AddressValidateResponse>
<Address ID="0">
<Address2>1600 PENNSYLVANIA AVE NW</Address2>
<City>WASHINGTON</City>
<State>DC</State>
<Zip5>20500</Zip5>
<Zip4>0003</Zip4>
</Address>
</AddressValidateResponse>
GET https://api.zip-codes.com/v2/address
?address=1600 Pennsylvania Ave NW, Washington DC
&key=YOUR_API_KEY
# Response: application/json
{
"success": true,
"results": [{
"success": true,
"matches": [{
"formatted_address": "1600 PENNSYLVANIA AVE NW, WASHINGTON, DC 20500-0003",
"address_line1": "1600 PENNSYLVANIA AVE NW",
"address_line2": "WASHINGTON, DC 20500-0003",
"address_components": {
"number": "1600", "street": "PENNSYLVANIA", "suffix": "AVE",
"post_directional": "NW", "city": "WASHINGTON", "state": "DC",
"zip": "20500", "plus4": "0003", "country": "US"
},
"match_info": { "confidence": "high" },
"details": {
"record_type": "H", "record_type_description": "Highrise",
"carrier_route": "C049", "county_fips": "11001",
"congressional_district": "98", "building_name": "WHITE HOUSE"
}
}]
}],
"meta": { "credits": { "used": 1, "remaining": 2499 } }
}
Notice the response carries more structured data than Web Tools’ address envelope — parsed components broken out, confidence flag, carrier route, county FIPS, congressional district, building name, record type. All from the same 1-credit call.
Web Tools was free with unspecified rate limits and ToS restrictions on list/batch use. Most production Web Tools workloads fit on our free or Developer tiers.
| Monthly volume | USPS Web Tools (former) | Zip-Codes.com |
|---|---|---|
| Up to ~75,000 calls | Free (with ToS restrictions) | Free tier — 2,500/day, no card |
| 100,000 calls | Free | $49 Developer plan |
| 1,000,000 calls | Free (gray-area at this scale on Web Tools ToS) | $499 Business plan |
For most Web Tools migrations: the free tier covers evaluation and small production
workloads at no cost. Paid tiers buy higher per-minute rates, batch endpoints, and full
enrichment depth on /v2/zip.
Web Tools covered more than addresses. If your integration depended on these, you need another path:
For shipping/tracking/labels in 2026, EasyPost, Shippo, and AfterShip are common paths.
“Nearly my entire professional life, I've had ONE source for the best zip data — zip-codes.com from Datasheer. CTO at BankMobile, ScheduleEngine, RevDial — we trusted Zip-Codes.com everywhere.”
Sign up, get an API key in under 60 seconds, and try /v2/address in the
demo before you touch your code path. If you’re migrating
a WooCommerce / Magento / Drupal Commerce / nopCommerce store and want a hand mapping the
integration, email info@zip-codes.com with your
platform.
secure.shippingapis.com no longer responds to requests,
breaking every integration that hadn’t migrated.
/v2/address does NOT include: DPV certification. For workflows
that strictly require certified delivery-point validation, a CASS-licensed
vendor like Smarty is the right fit.
Verify, ZipCodeLookup, CityStateLookup).
Web Tools also offered RateV4 / IntlRateV2 (rate
calculation), TrackV2 (tracking),
ExpressMailCommitment, eVS (label printing), and
Service Delivery Calculator operations — we don’t replace those.
If your integration depended on shipping/tracking/labeling workflows,
you’ll need a separate vendor (EasyPost, Shippo, AfterShip are common
2026 paths).
secure.shippingapis.com with a JSON GET to
api.zip-codes.com/v2/address, swap your USERID for an API key,
and update your parser from XML to JSON. Plugin updates from those
platforms’ communities are landing as of early 2026; you may want to
wait for an official update or fork the legacy module. For shipping-rate and
tracking integrations, you’ll need a separate shipping API. Email
info@zip-codes.com with your
platform if you want help mapping the address path.
/v2/address call regardless of
match outcome.
X-Api-Key header or a
key= query parameter. No USERID. No password. No OAuth
handshake or token refresh. The key is generated in your dashboard at
zip-codes.com/api and can be rotated, scoped to specific IPs or domains,
or split into multiple keys (up to 25 on the Business tier).
/v2/quick-zip and
/v2/zip accept Canadian FSA / postal codes directly;
/v2/distance handles cross-border pairs in one call.
/v2/address against a
known address in the demo; (2) swap the URL and
auth in your existing code path; (3) update the XML parser to a JSON parser
(most languages have native JSON in stdlib); (4) update field-name mappings
since JSON field names differ from XML element names. The bulk of effort is
the XML-to-JSON parsing change.