Every column, with the exact name it carries in the file you download — plus the file layout, real sample data, and the two things about ZIP+4 that catch people out. Nothing here is behind a sales call.
ZIP+4 is over a gigabyte compressed, so it is not one file. You get 62 of them — one per state or territory, each complete for that state — plus the 5-digit ZIP Code Database and the specification sheet.
| File | What it is | Columns | Edition |
|---|---|---|---|
ZIP4-XX.zip | One per state or territory — the ZIP+4 table for that state | 37 | Standard |
ZIP4-XX-PREMIUM.zip | The same table with street-level centroids resolved | 40 | Premium |
ZIP4-XX-DELUXE.zip | The same table with building-level centroids resolved | 40 | Deluxe |
LatLonMultiMatch.zip | Every additional coordinate for ZIP+4s that have more than one match | — | Premium & Deluxe |
…-Update-Edition.zip | The monthly change file — adds and deletes, keyed on UpdateKey | — | All |
zip-4-EDITION-SQL-Scripts.zip | CREATE TABLE scripts for the layout. Scripts only — the data itself is CSV | — | All |
ZIP4DatabaseSpecifications-Edition.pdf | The specification sheet | — | All |
The 5-digit ZIP Code Database comes with it, and you need it.
ZIP+4 records carry UrbanizationKey and PreferredLastLineKey rather
than a city name — join those to the bundled ZIP Code Database to resolve the last line
of the address. Standard bundles the Standard build; Premium and Deluxe bundle the Deluxe
build.
All 50 states plus DC, Puerto Rico, Guam, the U.S. Virgin Islands, American Samoa, the Marshall Islands, Micronesia, Palau, the Northern Mariana Islands and APO/FPO/DPO military addresses — 62 files in total, verified against the current publication. Take only the states you need.
Every column in the download, with the exact name as it appears in the file header. 37 in Standard, 40 in Premium and Deluxe. Premium and Deluxe are the same columns; they differ in how many coordinates are resolved, and how precisely.
One row is an address RANGE, not an address.
AddressPrimaryLowNumber and AddressPrimaryHighNumber bound
it, and AddressPrimaryEvenOdd says which side of the street it covers, so
a single row can stand for hundreds of deliverable addresses. Match a house number
into the range rather than joining on it, and read
Plus4Low–Plus4High the same way.
Do not build a ZIP+4 importer from the specification PDF. Eight of its forty
field names disagree with the file it ships beside — CarrierRouteID
for CarrierRoute, BuildingFirmName for
BuildingName, the four AddressSecondary* columns for
AddressSec*, and more. The names below are read from the shipped header,
so they are the ones your code needs.
Seven columns here are legacy, and we would rather you did not build on them.
FromLatitude, ToLatitude, FromLongitude,
ToLongitude, CensusTract, CensusBlock and
TLID came from a joint USPS and Census Bureau effort to attach TIGER
geography to ZIP+4. USPS discontinued it, and those columns have not been maintained
since. They stay in the file because customers have depended on them for years —
not because they are current. For coordinates use CenLat and
CenLon; for census geography, join a current Census file. They are
marked legacy below.
| Column name | Description | Type | Standard | Premium | Deluxe |
|---|---|---|---|---|---|
| The address itself 10 fields | 10 | 10 | 10 | ||
ZipCode | 00000-99999 Five digit numeric ZIP Code of the area.Example: 96799 | Char(5) | |||
Plus4Low | ZIP Add-On Low Number in the range. Also known as the +4.Example: 1681 | Char(4) | |||
Plus4High | ZIP Add-On High Number in the range. Also know nas the +4.Example: 5320 | Char(4) | |||
AddressPrimaryLowNumber | The low number in a range of numeric or alphanumeric components to an address preceding the street name.Example: 0000006761 | VarChar(10) | |||
AddressPrimaryHighNumber | The high number in a range of numeric or alphanumeric components to an address preceding the street name.Example: 0000002160 | VarChar(10) | |||
AddressPrimaryEvenOdd | Code that identifies the side or sides of a street for which a given address range is applicable. O = Odd, E = Even.Values: E even · O odd · B both | Char(1) | |||
StPreDirAbbr | The directional abbreviation that comes before an address: Ex: The N meaning North in “123 N MAIN ST” | Char(2) | |||
StName | The official name of the street as assigned by a local governing authority for this record.Example: TAU MANUA | VarChar(28) | |||
StSuffixAbbr | Code that is the standard USPS abbreviation for the trailing designator in a street address.Example: VLG | VarChar(4) | |||
StPostDirAbbr | A geographic direction that follows the street name. Ex: The N meaning North in “123 MAIN ST N” | Char(2) | |||
| Apartments, suites and floors 4 fields | 4 | 4 | 4 | ||
AddressSecAbbr | Only Applicable to Record Types F and H. | VarChar(04) | |||
AddressSecLowNumber | The low-end secondary address component in a range of secondary addresses. Only Applicable to Record Types F and H. | VarChar(10) | |||
AddressSecHighNumber | The high-end secondary address component in a range of secondary addresses. Only Applicable to Record Types F and H. | VarChar(10) | |||
AddressSecOddEven | Code that identifies the side or sides of a street for which a given address range is applicable. O = Odd, E = Even. Only Applicable to Record Types F and H.Values: E even · O odd · B both | Char(1) | |||
| Record type & delivery 7 fields | 7 | 7 | 7 | ||
RecordType | A flag indicating which type of record this is. Ex: Firm, General Delivery, High Rise, PO Box, Rural Route, or Street.Example: P | Char(1) | |||
BuildingName | The name of a company, building, apartment complex, shopping center, or other distinguishing secondary address information.Example: POSTMASTER | VarChar(40) | |||
GovernmentBuilding | This indicates what type of Government building this is if applicable. | Char(1) | |||
CarrierRoute | Carrier identification code or number for a given delivery route or PO box presentation.Example: B012 | Char(4) | |||
FinanceNumber | A code assigned to Postal Service facilities (primarily post offices) to collect cost and statistical data and compile revenue and expense data.Example: 445000 | VarChar(6) | |||
LACSStatus | L = LACS Converted, Blank = Not ApplicableValues: L LACS converted · blank not applicable | Char(1) | |||
BaseAlternateCode | Code that specifies whether a record is a base (preferred) or alternate record. B= Base, A = AlternateExample: B | Char(1) | |||
| Geography & keys into the ZIP Code Database 6 fields | 6 | 6 | 6 | ||
State | A 2-character abbreviation for the name of a state, U.S. territory, or armed forces ZIP Code designation.Example: AS | Char(2) | |||
CountyFIPS | The 3-digit (FIPS) code assigned to counties in sequence within each state. Match this code with the County Table for county based info.Example: 050 | Char(3) | |||
CongressionalDistrict | The 115th Congressional District this record is assigned to.Example: AL | Char(2) | |||
UrbanizationKey | An index to the Deluxe ZIP Code Database CityStateKey that provides the urbanization name for this delivery range. | VarChar(6) | |||
PreferredLastLineKey | Match this field to our Deluxe ZIP Code Database CityStateKey for City name, City alias, Area Code, Time Zone, and more.Example: Z10357 | VarChar(6) | |||
MunicipalityKey | Reserved by USPS for future use. Present in the file, and currently empty — do not build against it. | VarChar(6) | |||
| Coordinates 7 fields Premium and Deluxe add 2 | 5 | 7 | 7 | ||
FromLatitude | legacyLegacy TIGER range endpoint — the start of the address range. Retained for backward compatibility only.Example: 0 | Decimal(10,8) | |||
ToLatitude | legacyLegacy TIGER range endpoint — the end of the address range. Retained for backward compatibility only.Example: 0 | Decimal(10,8) | |||
FromLongitude | legacyLegacy TIGER range endpoint. Retained for backward compatibility only.Example: 0 | Decimal(11,8) | |||
ToLongitude | legacyLegacy TIGER range endpoint. Retained for backward compatibility only.Example: 0 | Decimal(11,8) | |||
CenLat | Latitude of the ZIP+4 centroid, and the coordinate to use. Deluxe resolves it to the building; Premium to the street. Absent from Standard.Example: -14.317259 | Decimal(11,8) | — | ||
CenLon | Longitude of the ZIP+4 centroid, on the same basis as CenLat.Example: -170.718837 | Decimal(11,8) | — | ||
LatLonMultiMatch | Flags a ZIP+4 that has more than one latitude/longitude match, i.e. one where the geocode is ambiguous. Present in every edition — handle these rather than trusting them. | Char(1) | |||
| Census linkage 4 fields Premium and Deluxe add 1 | 3 | 4 | 4 | ||
CensusTract | legacyCensus tract from the original TIGER load. Frozen at that vintage — join your own current tract file instead if the tract matters. | Char(6) | |||
CensusBlock | legacyCensus block from the original TIGER load, on the same frozen vintage as CensusTract. | Char(4) | |||
BlockGroup | Census block group — state, county, tract and block group in one code. Derived from the centroid, so its accuracy follows the centroid it came from: assigned from the building on Deluxe, from the street on Premium. Near a block group boundary a street-level centroid can sit meters from the line and land on the wrong side, so if the block group is what you are analyzing, that difference is the one that matters.Example: 600509510002 | VarChar(12) | — | ||
TLID | legacyTIGER/Line identifier from the original load. Not maintained, and not resolvable against current TIGER releases. | Char(10) | |||
| Monthly change file 2 fields | 2 | 2 | 2 | ||
UpdateKey | A unique key identifying this record, so a monthly change file can be applied instead of reloading all 48.5 million rows.Example: Z122023042 | VarChar(10) | |||
Action | A or D, add or delete. Always A in the base file; the monthly change file uses both.Values: A add · D delete | Char(1) | |||
Column names are read from the shipped CSV header, types from the specification sheet included with every download, and examples are real values out of the file. Measured from publication 2026-07-28. The data is delivered as 62 files, one per state or territory, and every file carries the same columns for its edition.
CSV, and only CSV. At 48.5 million rows the other formats we ship for the 5-digit database are not viable — Excel tops out at 65,536 rows a sheet, and an Access file would not hold it. SQL creation scripts are included; the data is CSV.
, comma" double quoteCRLF (\r\n).zip per state; over 1 GB compressed in totalAddressPrimaryLowNumber to AddressPrimaryHighNumber bounds
it, and AddressPrimaryEvenOdd says which side of the street.Plus4Low to Plus4High works the same way.ZipCode, Plus4Low, Plus4High,
CountyFIPS, CensusTract, CensusBlock and
CarrierRoute all carry significant leading zeros.0000003300) and are alphanumeric, not integers.UpdateKey identifies the record; Action is
A or D.A. The monthly file carries both.CenLat / CenLon — the maintained centroid, and
the one to build on. Building-level on Deluxe, street-level on Premium,
absent from Standard.FromLatitude/ToLatitude and the longitude pair are
legacy TIGER range endpoints, unmaintained since USPS ended that project.
Present in every edition; not recommended for new work.LatLonMultiMatch flags ambiguous geocodes, and the
LatLonMultiMatch file holds the alternatives.BlockGroup is derived from the centroid, so it carries whatever
accuracy the centroid had.LOAD DATA LOCAL INFILE 'ZIP4-NY.csv' INTO TABLE Zip4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 ROWS;COPY Zip4 FROM '/path/to/ZIP4-NY.csv' WITH (FORMAT csv, HEADER true);BULK INSERT Zip4 FROM 'C:\path\to\ZIP4-NY.csv' WITH (FORMAT='CSV', FIRSTROW=2, FIELDTERMINATOR=',', ROWTERMINATOR='0x0d0a');CREATE TABLE scripts in the download, or build the table from
the data dictionary above —
every code column as VARCHAR, never INT.ZipCode and the address-number pair; that is what a lookup hits.Real records from the production file, not mock data, so you can test your importer against the actual layout before you buy. No email required.
37 columns · 48,188 records
The full address layout — ranges, street parts, secondary units, carrier route, county and congressional district — with range-endpoint coordinates.
CSV
Download sample 1.5 MB40 columns · 107,354 records
Everything in Standard plus the centroid pair, the multi-match flag and block group — resolved to street level.
CSV
Download sample 4.0 MB40 columns · 48,188 records
The same 40 columns as Premium, with the centroid resolved to the building rather than the street.
CSV
Download sample 2.2 MBSizes and record counts measured from the sample files themselves. Column counts are the full counts for each edition.
30 real questions from developers, DBAs and GIS teams working with this data. We have been answering them since 2003, so these are the ones that come up again and again — why a row is an address range rather than an address, how the three editions differ on coordinate accuracy, and how to apply a monthly change file instead of reloading 48.5 million records. Answers, not marketing.
Real technical questions from real developers in the trenches. We've been doing this since 2003, so we've seen every edge case imaginable. This FAQ covers everything from centroid accuracy to transaction files to why the USPS does things that make you scratch your head. Whether you're integrating at 2 PM or 2 AM, this FAQ will save you time and headaches.
This is the primary difference between Premium and Deluxe editions. Both include the same 40 fields (CenLat, CenLon, CensusBlockGroup), but the centroid coordinates come from very different data sources.
Premium Edition:
Deluxe Edition:
Completion rates by state: Mainland U.S. averages 97-99% completion for both editions. Military addresses (AA/AE/AP) are 99%+. Territories vary: Puerto Rico (88.66%), Guam (57%), Virgin Islands (8%), American Samoa and others below 1%.
Bottom line: If you need "good enough" coordinates for most mapping applications, Premium delivers excellent value. If you need the highest possible accuracy for logistics, routing, or precision applications - Deluxe is worth the investment.
Transaction files contain only the records that changed since the previous month. They're much smaller than the full database files and allow you to efficiently maintain current data.
File naming convention:
2026-10-ZIP4-Update-Standard.zip → 2026-10-ZIP4-Update-Standard.csv
2026-10-ZIP4-Update-Premium.zip → 2026-10-ZIP4-Update-Premium.csv
2026-10-ZIP4-Update-Deluxe.zip → 2026-10-ZIP4-Update-Deluxe.csv
Format: YYYY-MM-ZIP4-Update-[Edition].zip
How updates work - The D/A pattern:
The USPS doesn't have an "Update" action code. Instead, they use a Delete-then-Add pattern:
It's annoying and antiquated, but it's how the USPS does it. Welcome to government data!
Processing logic:
1. Read transaction file
2. For each record:
IF Action = 'D':
DELETE FROM zip4_table WHERE UpdateKey = record.UpdateKey
ELSE IF Action = 'A':
INSERT INTO zip4_table VALUES (record data)
3. Commit changes
Typical change volume:
Pro tip: If you're using FTP automation, schedule downloads for the 5th of each month. We've never missed publishing on the 1st in many years, but occasionally there are republications to correct edge cases.
Every ZIP+4 purchase includes the corresponding ZIP Code Database to provide city names, area codes, time zones, and other data not included in the ZIP+4 files.
Edition pairings:
Note: You can upgrade to ZIP Code Database Business separately if needed.
What data comes from the ZIP Code Database?
Join relationships - three ways to connect:
| ZIP+4 Field | Joins To | ZIP Code DB Field | Use Case |
|---|---|---|---|
PreferredLastLineKey |
→ | PreferredLastLineKey |
Primary join method |
PreferredLastLineKey |
→ | CityStateKey |
Alternate join (same data) |
UrbanizationKey |
→ | PreferredLastLineKey |
For Puerto Rico urbanization names |
SQL Example:
-- Primary join method
SELECT
z4.ZipCode,
z4.Plus4Low,
z4.StName,
zc.City,
zc.AreaCode,
zc.TimeZone
FROM zip4_database z4
LEFT JOIN zipcode_database zc
ON z4.PreferredLastLineKey = zc.PreferredLastLineKey
WHERE z4.ZipCode = '10001';
Why the complexity? The USPS uses different key structures for different purposes. We keep all the keys in the data so you can join however makes sense for your use case. For most applications, stick with PreferredLastLineKey → PreferredLastLineKey.
Non-Deliverable (ND) ZIP+4 codes represent addresses where the USPS does not deliver mail. They account for approximately 1.35% of all records (~653,000 out of 48.5 million).
What makes a ZIP+4 non-deliverable?
How to identify ND codes:
ND codes are marked by "ND" in the Plus4Low and Plus4High fields:
ZipCode: 12345
Plus4Low: 14ND
Plus4High: 14ND
Are they temporary or permanent?
ND codes are generally permanent until an area gains delivery service or structures are built. They're not "under construction" placeholders - they represent areas that currently have no mail delivery capability.
How should developers handle ND codes?
USPS Guidance: The USPS explicitly states that mailers should not match addresses to non-delivery areas. CASS-certified software treats ND codes as invalid for delivery, so your validation logic should too.
The RecordType field indicates what kind of address record you're dealing with. Each type has different field characteristics and usage patterns.
Distribution across 48.5 million records:
| Code | Type | Count | Percentage | Description |
|---|---|---|---|---|
| S | Street | 32.7M | 67.44% | Standard street addresses with address ranges |
| H | High-Rise | 14.4M | 29.61% | Multi-unit buildings (apartments, condos) |
| P | PO Box | 732K | 1.51% | Post Office Box addresses |
| F | Firm | 509K | 1.05% | Unique business/organization addresses |
| R | Rural Route | 164K | 0.34% | Rural Route / Highway Contract addresses |
| G | General Delivery | 27K | 0.06% | General Delivery service addresses |
Field characteristics by RecordType:
S (Street) - 67.44%: Standard street addressing. All street name fields populated, address ranges in Primary Low/High, coordinates available for most records. This is your typical "123 Main St" address.
H (High-Rise) - 29.61%: Multi-unit buildings. Uses Secondary Address fields (AddressSecondaryAbbr, AddressSecondaryLowNumber, AddressSecondaryHighNumber) for apartment/unit ranges. Example: "100 Park Ave, APT 101-125". Primary Low usually equals Primary High (single building).
P (PO Box) - 1.51%: Street name is literally "PO BOX". Box number range appears in AddressPrimaryLowNumber/HighNumber fields. No coordinates - PO Boxes don't have street locations. Filter these out if you're doing geocoding.
F (Firm) - 1.05%: Similar to High-Rise but for businesses receiving large mail volumes. The firm gets its own unique ZIP+4. May use secondary address fields for internal mail sorting (departments, floors). Example: Large corporate headquarters.
R (Rural Route) - 0.34%: Rural addressing. Street name shows "RR #" (Rural Route) or "HC #" (Highway Contract). Box numbers appear in Primary address range fields. Example: "RR 2 Box 123". Coordinates available at same rates as other types.
G (General Delivery) - 0.06%: USPS service for people without fixed addresses. Street name is always "GENERAL DELIVERY", no Primary address range, Plus4Low/High always "9999", OddEven always "B". Rare but used in remote areas.
Developer tip: When building address validation, filter by RecordType first. Street (S) and High-Rise (H) cover 97% of records and use standard validation logic. The other types need special handling.
All coordinate fields use the WGS84 geodetic datum with 6 decimal places of precision.
Coordinate precision:
DECIMAL(11,8) for latitude, DECIMAL(11,8) for longitude40.748817, -73.985428 (Empire State Building)Coordinate fields available:
| Field | Edition | Purpose | Recommendation |
|---|---|---|---|
CenLat / CenLon |
Premium/Deluxe | Centroid of ZIP+4 address range | RECOMMENDED |
FromLat / FromLon |
All editions | Address range start point | DO NOT USE |
ToLat / ToLon |
All editions | Address range end point | DO NOT USE |
IMPORTANT: Do NOT use FromLatitude/FromLongitude or ToLatitude/ToLongitude
These fields are legacy data from a USPS/Census collaborative project that was supposed to be updated annually but was abandoned around 2010. We kept them in the database for backward compatibility, but they are not maintained and should not be relied upon for any application.
What to use instead:
CenLat and CenLon - these are actively maintained and highly accurateMilitary ZIP+4 coordinates:
Military addresses (AA/AE/AP) do have coordinate data, but these should NOT be used for proximity analysis or mapping. The coordinates are administrative placeholders (often pointing to mail processing centers) rather than actual overseas base locations.
Bottom line: For any geocoding, mapping, or distance calculations - use CenLat/CenLon from Premium or Deluxe editions only. The From/To coordinates are reference-only at best.
All files use UTF-8 encoding without BOM (byte order mark).
Why UTF-8? It handles international characters and special symbols that appear in U.S. place names (yes, even domestically we have diacritics and special characters).
Database-specific recommendations:
utf8mb4 character set and utf8mb4_unicode_ci collationENCODING 'UTF8' when creating the databaseNVARCHAR data types for full Unicode supportCSV Import:
-- MySQL LOAD DATA example
LOAD DATA LOCAL INFILE 'ZIP4-NY.csv'
INTO TABLE zip4_database
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;
The files don't have a BOM (byte order mark), which is good - BOMs can cause parsing issues in many tools. Just specify UTF-8 and you're set.
UpdateKey is a unique identifier assigned to each ZIP+4 record by the USPS. It's the only field guaranteed to be unique across the entire dataset.
Why not use ZIP+Plus4Low+Plus4High?
Multiple records can share the same ZIP+4 combination if they represent different address ranges or record types. The UpdateKey ensures you can uniquely identify each record.
UpdateKey characteristics:
Database schema recommendation:
CREATE TABLE zip4_database (
UpdateKey VARCHAR(10) PRIMARY KEY,
ZipCode CHAR(5) NOT NULL,
Plus4Low CHAR(4),
Plus4High CHAR(4),
-- ... other fields
INDEX idx_zipcode (ZipCode),
INDEX idx_carrier_route (CarrierRoute)
);
Pro tip: Always create an index on ZipCode for query performance, even though UpdateKey is the primary key. Most applications query by ZIP code, not UpdateKey.
We use empty strings ("") rather than NULL values.
Why? Years ago, we made a decision to use empty strings because they're easier to understand for non-technical users. Looking back, we probably should have used NULL, but we've maintained this approach for consistency and backward compatibility. You can convert them to NULL in your database if you prefer.
Key patterns:
Query patterns:
-- Find records with no building/firm name
SELECT * FROM zip4_database
WHERE BuildingFirmName = '';
-- In application code
if (record.StPreDirAbbr === '' || record.StPreDirAbbr === null) {
// No pre-directional
}
Philosophy: We only include data we can confirm with reasonable certainty. If we don't know something, we leave it empty rather than guessing. It irritates some customers, but it's the right thing to do.
These fields are legacy data that should NOT be used for any application.
The backstory: Around 2008-2010, the USPS partnered with the Census Bureau to provide address range endpoint coordinates. The plan was to update these annually. We waited years being told updates would resume, but they never did. The data became stale around 2010 and has not been maintained since.
What's affected:
FromLatitude / FromLongitude - Start point of address rangeToLatitude / ToLongitude - End point of address rangeCensusTract - Also from this same abandoned projectCensusBlock - Also from this same abandoned projectWhy we kept them: Legacy compatibility. Some customers have applications built around these fields, and we try not to remove columns once we've added them. But for new implementations - don't use them.
What to use instead:
CenLat and CenLon (Premium/Deluxe only) - these are actively maintained and accurateCensusBlockGroup (Premium/Deluxe only) - this is current and reliableBottom line: Treat FromLatitude, FromLongitude, ToLatitude, ToLongitude, CensusTract, and CensusBlock as reference-only at best, unusable at worst. Do not build applications around this data. Upgrade to Premium or Deluxe for reliable geographic coordinates.
Address ranges define which house numbers on a street segment share the same ZIP+4 code.
The three key fields:
AddressPrimaryLowNumber - Start of the rangeAddressPrimaryHighNumber - End of the rangeAddressPrimaryOddEven - Which numbers in the range are includedOddEven values:
| Code | Meaning | Example |
|---|---|---|
O |
Odd numbers only | Range 100-198, Odd = 101, 103, 105... |
E |
Even numbers only | Range 100-198, Even = 100, 102, 104... |
B |
Both odd and even | Range 100-198, Both = 100, 101, 102, 103... |
Validation logic example:
function validateAddress(houseNumber, record) {
// Check if number is in range
if (houseNumber < record.AddressPrimaryLowNumber ||
houseNumber > record.AddressPrimaryHighNumber) {
return false;
}
// Check odd/even match
const isOdd = houseNumber % 2 === 1;
const isEven = houseNumber % 2 === 0;
if (record.AddressPrimaryOddEven === 'O' && !isOdd) {
return false;
}
if (record.AddressPrimaryOddEven === 'E' && !isEven) {
return false;
}
// 'B' matches both, so no check needed
return true; // Valid!
}
Special cases:
Pro tip: When building address validation, always check both the range AND the odd/even indicator. A house number can be numerically within the range but still invalid if it doesn't match the parity requirement.
It varies significantly, but most months see 1-5% of records change.
Typical patterns:
What causes changes:
No meaningful monthly pattern beyond the Congressional District cycle. Some months are quiet, some are busier - it depends on what's happening across the country. The USPS updates reflect real-world changes in the addressing system.
Planning tip: Budget for processing 1-5% of your records each month. The transaction files make this efficient - you're not reloading the entire 48.5M record dataset.
Yes, all military ZIP+4 codes are included in every edition.
Military "state" codes:
Record counts:
What's included:
Coordinate warning:
Military records DO have coordinate data (latitude/longitude), but these coordinates should NOT be used for proximity analysis or mapping. The coordinates are administrative placeholders - often pointing to mail processing centers or collection points (like Miami for some AA codes) rather than actual overseas base locations.
How to identify military records:
SELECT * FROM zip4_database
WHERE State IN ('AA', 'AE', 'AP');
Delivery notes:
Military addresses use the standard ZIP+4 format but are delivered differently. The USPS collects mail domestically and transports it to military transit hubs, where the military handles final delivery to bases, ships, and deployed units worldwide.
P.S. We are a veteran-owned business!
PO Box records (RecordType = P) have a different structure than street addresses. They represent Post Office Box ranges, not physical street locations.
PO Box record characteristics:
PExample PO Box record:
RecordType: P
StName: PO BOX
AddressPrimaryLowNumber: 1
AddressPrimaryHighNumber: 120
Plus4Low: 0001
Plus4High: 0120
CarrierRoute: P001
Query to find PO Box records:
SELECT * FROM zip4_database
WHERE RecordType = 'P';
Validation differences:
Common mistake: Trying to geocode PO Box addresses. Filter these out (RecordType = 'P') before any coordinate-based operations to avoid errors or nonsense results.
Rural Route (RR) and Highway Contract (HC) addresses are used in less densely populated areas where traditional street addressing isn't practical.
Rural Route record characteristics:
RExample Rural Route record:
RecordType: R
StName: RR 2
AddressPrimaryLowNumber: 100
AddressPrimaryHighNumber: 199
Plus4Low: 9501
Plus4High: 9599
CarrierRoute: R002
RR vs HC:
Validation logic:
Match the box number (not a house number) against the address range. Example: "HC 73 Box 125" would match a record with StName = "HC 73", AddressPrimaryLowNumber = 100, AddressPrimaryHighNumber = 150.
Rural addressing represents only 0.34% of records (164K), but it's essential for serving remote communities. Many of these addresses have since converted to city-style addressing through the LACS program.
Our data is USPS-licensed ZIP+4 data, but our database product is NOT CASS-certified.
What is CASS?
CASS (Coding Accuracy Support System) is a USPS certification program that evaluates address-matching software for accuracy in assigning ZIP+4 codes, delivery points, and carrier routes. Software must pass annual tests to maintain certification.
Can you use this data for address validation?
Yes - you can build address validation systems using this data. The data itself is from the USPS and is the same data used by CASS-certified tools. With proper implementation, you can achieve 95%+ validation accuracy.
What's the catch?
Standard validation workflow:
When you NEED CASS certification:
When our data works fine:
Bottom line: Use our data for internal validation, standardization, and analysis. If you need USPS postage discounts or official CASS certification, you'll need CASS-certified software (which uses this same USPS data under the hood).
USPS Publication 28 defines official addressing standards. Our data follows these standards, and your validation/standardization should too.
Case requirements:
Street suffix abbreviations:
| Full Name | USPS Abbr | Full Name | USPS Abbr |
|---|---|---|---|
| Street | ST | Avenue | AVE |
| Road | RD | Lane | LN |
| Drive | DR | Court | CT |
| Boulevard | BLVD | Circle | CIR |
| Parkway | PKWY | Highway | HWY |
See USPS Publication 28 Appendix C for the complete list of 100+ suffix abbreviations.
Directional abbreviations:
| Direction | USPS Abbr | Direction | USPS Abbr |
|---|---|---|---|
| North | N | South | S |
| East | E | West | W |
| Northeast | NE | Northwest | NW |
| Southeast | SE | Southwest | SW |
Secondary unit designators:
Punctuation and spacing:
Example standardization:
Input: "123 North Main Street, Apartment 5B"
Output: "123 N MAIN ST APT 5B"
Our database uses these standards throughout. Match your input addresses to these standards before querying for best results.
General Delivery is a USPS service for people without fixed addresses. Mail is addressed to "General Delivery" and held at a post office for pickup.
General Delivery record characteristics:
GB (both)9999When is it used?
How rare is it?
Only 0.06% of records (27,300 out of 48.5 million) are General Delivery. It's a niche service but important for serving transient populations and remote communities.
General Delivery mail is addressed: "John Doe, General Delivery, CITY, STATE ZIP". No street address needed.
Mainland U.S. states average 97-99% centroid completion. U.S. territories struggle with significantly lower completion rates.
Territory completion rates (Premium & Deluxe):
| Territory | Records with Centroids | Completion % |
|---|---|---|
| Puerto Rico (PR) | 215,978 / 243,589 | 88.66% |
| Guam (GU) | 5,401 / 9,430 | 57.27% |
| U.S. Virgin Islands (VI) | 737 / 8,979 | 8.21% |
| American Samoa (AS) | 1 / 170 | 0.59% |
| Northern Mariana Islands (MP) | 3 / 1,050 | 0.29% |
| Micronesia (FM) | 0 / 314 | 0.00% |
| Palau (PW) | 0 / 186 | 0.00% |
| Marshall Islands (MH) | 0 / 139 | 0.00% |
Why the difference?
Data collection and geocoding infrastructure in U.S. territories lags behind the mainland. Factors include:
What this means for your application:
Pro tip: If your application serves U.S. territories, consider falling back to ZIP Code-level coordinates (from the included ZIP Code Database) when CenLat/CenLon are empty in the ZIP+4 data.
Yes, we maintain historical ZIP+4 data with the same field structure as current data.
Historical data availability by edition:
Why different start dates?
We began offering Standard in 2007. Deluxe was introduced in 2010. Premium was created in 2018 as a mid-tier option after licensing changes made Deluxe significantly more expensive - giving cost-conscious customers a street-level centroid option.
What's included:
Common use cases:
Yes, absolutely. This is a downloadable database product, not a cloud API service. Once you download the data, it's yours to use locally.
What you can do:
Updates:
Your purchase includes 12 months of monthly updates. After your subscription period:
Perfect for:
License: Fully licensed for your organization's internal use. No external API dependencies. Your data, your infrastructure, your control.
LACS (Locatable Address Conversion System) identifies rural addresses that have been converted to city-style addressing.
What is LACS?
The USPS program that converts rural route addresses (e.g., "RR 2 Box 123") into standard street addresses (e.g., "456 County Road 789"). This improves mail delivery efficiency and emergency services response.
LACSStatus values:
| Value | Meaning | Action |
|---|---|---|
L |
LACS record - rural address converted to city-style | Use the street address in this record |
(empty) |
Not a LACS conversion | Standard processing |
Why it matters:
Query example:
-- Find all LACS-converted addresses in a ZIP
SELECT * FROM zip4_database
WHERE ZipCode = '12345'
AND LACSStatus = 'L';
Most developers can ignore this field unless you're specifically dealing with rural address conversion or address cleansing projects.
Multi-unit buildings use secondary address fields to represent apartment/suite/unit ranges.
Which records have secondary addresses?
Street (S), PO Box (P), Rural (R), and General Delivery (G) records do NOT use secondary address fields.
Secondary address fields:
AddressSecondaryAbbr - Unit designator (APT, STE, FL, UNIT, etc.)AddressSecondaryLowNumber - Start of unit rangeAddressSecondaryHighNumber - End of unit rangeAddressSecondaryOddEven - O/E/B indicator for unit numbersExample High-Rise record:
RecordType: H
StName: PARK AVE
AddressPrimaryLowNumber: 100
AddressPrimaryHighNumber: 100 (single building)
AddressSecondaryAbbr: APT
AddressSecondaryLowNumber: 101
AddressSecondaryHighNumber: 125
AddressSecondaryOddEven: O (odd apartments only)
Plus4Low: 5401
Plus4High: 5413
This represents: "100 Park Ave, APT 101-125 (odd numbers)"
Validation logic:
1. Match primary address: "100 Park Ave"
2. Check if AddressSecondaryAbbr is populated
3. If yes, validate unit number against:
- AddressSecondaryLowNumber/HighNumber range
- AddressSecondaryOddEven indicator
4. Return appropriate Plus4 code
Common issue: Missing apartment numbers in multi-unit buildings will fail validation or return incomplete ZIP+4 codes. Always collect and validate secondary address information for H and F record types.
The BaseAlternateCode distinguishes between preferred (Base) and alternate address formats.
Values:
| Code | Meaning | Usage |
|---|---|---|
B |
Base (preferred address format) | Use this for validation and standardization |
A |
Alternate (acceptable but not preferred) | Secondary format, use Base if available |
(empty) |
Not applicable | Most records - no alternate format exists |
When does this occur?
Some addresses can be written multiple ways, and the USPS designates one as "preferred":
Best practice:
-- Prioritize Base records in validation
SELECT * FROM zip4_database
WHERE ZipCode = '12345'
AND StName = 'MAIN'
AND (BaseAlternateCode = 'B' OR BaseAlternateCode = '')
ORDER BY BaseAlternateCode DESC;
In practice, most records have an empty BaseAlternateCode field - this only appears when multiple formats exist for the same deliverable address. When in doubt, prefer 'B' over 'A'.
Extremely rare, but yes - a few edge cases exist, primarily in the Connecticut/Massachusetts border area.
How rare is this?
Out of 48.5 million ZIP+4 records, only a handful of ZIP codes span state boundaries. When they do, individual ZIP+4 codes typically stay within one state - the 5-digit ZIP crosses, but the +4 segments divide along state lines.
Why does this happen?
Connecticut planning regions:
Connecticut replaced counties with planning regions in 2022, which creates additional complexity when working with historical data or cross-state analysis. See our Connecticut planning regions guide for details.
For developers:
This is such a rare edge case that most applications can safely ignore it. But if you're building compliance systems or need perfect accuracy - be aware it exists.
FinanceNumber is the USPS facility finance code for the post office serving that ZIP+4 code.
What it represents:
Format:
012345Common use cases:
For most developers:
You can safely ignore this field. It's specialized data that matters primarily to bulk mailers with USPS facility-level contracts or organizations analyzing USPS operational data.
We include it because it's in the USPS data, but 95% of our customers never use it.
The GovernmentBuilding field identifies federal, state, and local government facilities.
Values:
| Code | Meaning |
|---|---|
A | Federal government building |
B | State government building |
C | Local/municipal government building |
(empty) | Not a government facility |
Use cases:
Query example:
-- Find all federal government addresses in DC
SELECT * FROM zip4_database
WHERE State = 'DC'
AND GovernmentBuilding = 'A';
Most records have an empty GovernmentBuilding field - this is specialized metadata that matters primarily for government contractors and specific compliance scenarios.
With 48.5 million records, proper indexing is critical for query performance.
Essential indexes:
-- Primary key (already indexed)
PRIMARY KEY (UpdateKey)
-- ZIP code lookups (most common query)
CREATE INDEX idx_zipcode ON zip4_database(ZipCode);
-- Carrier route queries
CREATE INDEX idx_carrier_route ON zip4_database(CarrierRoute);
-- State-based filtering
CREATE INDEX idx_state ON zip4_database(State);
-- Composite index for street name lookups
CREATE INDEX idx_zip_street ON zip4_database(ZipCode, StName);
-- RecordType filtering
CREATE INDEX idx_recordtype ON zip4_database(RecordType);
Query optimization tips:
LIKE '%Main%')Hardware recommendations:
Fast query example:
-- Good: Uses index on ZipCode
SELECT * FROM zip4_database
WHERE ZipCode = '10001'
AND StName = 'BROADWAY'
AND AddressPrimaryLowNumber <= 123
AND AddressPrimaryHighNumber >= 123;
-- Slow: No ZipCode filter, full table scan
SELECT * FROM zip4_database
WHERE StName = 'MAIN ST';
Pro tip: Most address validation queries complete in under 10ms with proper indexes. If your queries are slow, you're probably missing the ZipCode index.
No, the license is for your organization's internal use only.
What you CAN do:
What you CANNOT do:
Common scenarios:
ALLOWED: You're a SaaS company building an address validation feature into your application. Customers use YOUR tool, which uses OUR data internally. The customers never see or download the raw ZIP+4 database.
NOT ALLOWED: You're a consultant who wants to provide the ZIP+4 database files to your clients as part of a project deliverable. Each client needs their own license.
Need to provide data to clients?
We offer volume licensing and reseller programs. Contact us at info@zip-codes.com to discuss options.
License enforcement: We take license compliance seriously. Violations can result in license termination and legal action. When in doubt, contact us - we're happy to clarify.
UrbanizationKey is used exclusively for Puerto Rico addresses to identify urbanization names (neighborhoods/districts).
What is an Urbanization?
In Puerto Rico, an "urbanización" is a community or neighborhood name that appears in mailing addresses. It's similar to a subdivision name but more formal and required by USPS for proper mail delivery.
Address format example:
JUAN GARCIA
URB LAS LOMAS 123 CALLE PRINCIPAL
SAN JUAN PR 00926-1234
"URB LAS LOMAS" is the urbanization name
How to use UrbanizationKey:
The UrbanizationKey in the ZIP+4 Database joins to the PreferredLastLineKey in the ZIP Code Database to retrieve the actual urbanization name.
-- Get urbanization name for Puerto Rico addresses
SELECT
z4.ZipCode,
z4.StName,
zc.City AS UrbanizationName
FROM zip4_database z4
LEFT JOIN zipcode_database zc
ON z4.UrbanizationKey = zc.PreferredLastLineKey
WHERE z4.State = 'PR'
AND z4.UrbanizationKey != '';
When is it populated?
Why it matters:
Unless you're specifically working with Puerto Rico addresses, you can ignore this field. For PR addresses, it's essential for proper USPS formatting.
We provide free technical support to all customers.
Email: info@zip-codes.com | Phone: 1-800-425-1169