Census API without a key: 302 to missing_key.html, empty body

Checked 2026-09-08 · Statistical agencies: BLS, Census, BEA, FRED and EIA

api.census.gov data endpoints no longer serve anything without a key. A keyless request gets HTTP 302 with a zero-length body and Location: https://api.census.gov/data/missing_key.html; a request with a well-formed but unregistered key gets the same 302 to invalid_key.html. Follow the redirect and you get an HTML page, so a JSON parser fails either way. The metadata endpoints under the same host are still open.

What we saw

A keyless ACS 5-year call returns 302 with an empty body and a header naming the reason. Source (response headers, 2026-09-08).

HTTP/1.1 302 
Set-Cookie: originalReferer=http%3A%2F%2Fapi.census.gov%2Fdata%2F2023%2Facs%2Facs5%3Fget%3DNAME%2CB19013_001E%26for%3Dstate%3A06; Path=/; Secure
X-DataWebAPI-KeyError: 1
Location: https://api.census.gov/data/missing_key.html
Content-Length: 0

A syntactically valid 40-character key that is not registered gets the same 302 and the same header, but a different destination. Source (response headers, 2026-09-08).

HTTP/1.1 302 
X-DataWebAPI-KeyError: 1
Location: https://api.census.gov/data/invalid_key.html

This is not specific to ACS. The 2020 decennial redistricting file and a timeseries endpoint behave identically. Source (HTTP status, 2026-09-08).

== https://api.census.gov/data/2020/dec/pl?get=NAME,P1_001N&for=state:06
HTTP 302 ct=
== https://api.census.gov/data/timeseries/eits/marts?get=cell_value,time_slot_id&for=us:*&time=2024
HTTP 302 ct=

Following the redirect yields HTML, not an error object, so the failure surfaces as a JSON decode error on a <html tag. Source (page body, 2026-09-08).

<html style="font-size: 14px;">

<head>
    <title>Missing Key</title>

Variable metadata is still served keyless as JSON, so you can resolve variable names and check a table's labels before you have a key. Source (response body, 2026-09-08).

HTTP 200 ct=application/json;charset=utf-8
{
  "name": "B19013_001E",
  "label": "Estimate!!Median household income in the past 12 months (in 2023 inflation-adjusted dollars)",
  "concept": "Median Household Income in the Past 12 Months (in 2023 Inflation-Adjusted Dollars)",

The dataset discovery page is also keyless. Source (HTTP status and title, 2026-09-08).

HTTP 200 ct=text/html;charset=utf-8
<title>Census Data API: /data</title>

The command

curl -sS -D - -o /dev/null 'https://api.census.gov/data/2023/acs/acs5?get=NAME,B19013_001E&for=state:06'
HTTP/1.1 302 
X-DataWebAPI-KeyError: 1
Location: https://api.census.gov/data/missing_key.html
Content-Length: 0

Checked 2026-09-08.

curl -sS -D - -o /dev/null 'https://api.census.gov/data/2023/acs/acs5?get=NAME,B19013_001E&for=state:06&key=0123456789abcdef0123456789abcdef01234567' | grep -iE 'HTTP/|Location|KeyError'
HTTP/1.1 302 
X-DataWebAPI-KeyError: 1
Location: https://api.census.gov/data/invalid_key.html

Checked 2026-09-08.

curl -sSL -w '\nHTTP %{http_code} final=%{url_effective}\n' 'https://api.census.gov/data/2023/acs/acs5?get=NAME,B19013_001E&for=state:06' | head -c 200
<html style="font-size: 14px;">

<head>
    <title>Missing Key</title>

Checked 2026-09-08.

curl -sS -o /tmp/c.out -w 'HTTP %{http_code} ct=%{content_type}\n' 'https://api.census.gov/data/2023/acs/acs5/variables/B19013_001E.json'; head -c 250 /tmp/c.out
HTTP 200 ct=application/json;charset=utf-8
{
  "name": "B19013_001E",
  "label": "Estimate!!Median household income in the past 12 months (in 2023 inflation-adjusted dollars)",

Checked 2026-09-08.

requestHTTPLocationbody
data endpoint, no key302https://api.census.gov/data/missing_key.html0 bytes
data endpoint, unregistered key302https://api.census.gov/data/invalid_key.html0 bytes
data endpoint, redirect followed200-HTML titled Missing Key
/data/<vintage>/<dataset>/variables/<VAR>.json200-JSON
/data.html200-HTML dataset list

Limits

Open question

The response sets an originalReferer cookie holding the full original query string. Is the intent that a browser session can replay the request after signup, and does a data request succeed if that cookie is carried back?

Plain text