BYTETOOLS

US Bureau of Labor Statistics API

Free Bureau of Labor Statistics API with no key on v1: unemployment rate, CPI, payrolls and thousands of US labour series by series id. Tested example and live response.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the US Bureau of Labor Statistics API?

The US Bureau of Labor Statistics offers a free public API whose version 1 requires no key at all. A GET request with a series id returns the last three years of that series, covering unemployment, CPI, employment and wage data.

Almost every US macro data source now demands registration, which makes the BLS v1 endpoint quietly valuable: no key, no account, no header, just a series id in the path. The trade-off is explicit rather than hidden — v1 allows 25 requests a day per IP, 25 series per request and a ten-year span, where the keyed v2 raises all three and adds calculations and catalogue metadata.

Series ids are structured, not arbitrary. `LNS14000000` is the seasonally adjusted national unemployment rate; the prefix names the survey, and the digits encode seasonal adjustment and the series within it. Once you can read a prefix you can construct siblings without searching. Two response conventions to note: `value` is a **string** despite being numeric, and `period` is a code (`M07` for July, `Q01` for the first quarter, `M13` for an annual average) that must never be parsed as a month number without checking the prefix letter first.

Quick facts

Base URL
https://api.bls.gov/publicAPI/v1
Authentication
Version 1 needs no key. Version 2 requires a free registered key and lifts the daily and per-request limits — this page documents v1 only.
Rate limit
25 requests per day per IP, 25 series per request, 10 years per request on v1.
Pricing
Free. The keyed v2 tier is also free but requires registration.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the US Bureau of Labor Statistics API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. US unemployment rate, most recent three years

GET https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000

curl
curl 'https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000'
JavaScript (fetch)
const res = await fetch("https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "status": "REQUEST_SUCCEEDED",
  "responseTime": 110,
  "message": [],
  "Results": {
    "series": [
      {
        "seriesID": "LNS14000000",
        "data": [
          {
            "year": "2026",
            "period": "M07",
            "periodName": "July",
            "latest": "true",
            "value": "4.1",
            "footnotes": [
              {}
            ]
          },
          {
            "year": "2026",
            "period": "M06",
            "periodName": "June",
            "value": "4.2",
            "footnotes": [
              {}
            ]
          },
          {
            "year": "2026",
            "period": "M05",
            "periodName": "May",
            "value": "4.3",
            "footnotes": [
              {}
            ]
          },
          {
            "year": "2026",
            "period": "M04",
            "periodName": "April",
            "value": "4.3",
            "footnotes": [
              {}
            ]
          },
          {
            "year": "2026",
            "period": "M03",
            "periodName": "March",
            "value": "4.3",
            "footnotes": [
              {}
            ]
          },
          {
            "year": "2026",
            "period": "M02",
            "periodName": "February",
            "value": "4.4",
            "footnotes": [
              {}
            ]
          },
          {
            "year": "2026",
            "period": "M01",
            "periodName": "January",
            "value": "4.3",
            "footnotes": [
              {

Parameters

ParameterTypeRequiredDescription
seriesIdpath segmentRequiredBLS series identifier. `LNS14000000` is the seasonally adjusted unemployment rate; `CUUR0000SA0` is CPI-U for all items. LNS14000000
startyear / endyearqueryOptionalYear bounds. Without them the API returns the last three years. Maximum span on v1 is ten years. 2020
(POST body)bodyOptionalA JSON body with a `seriesid` array requests up to 25 series in one call. {"seriesid":["LNS14000000"]}

Response fields

statusstring
`REQUEST_SUCCEEDED` or a failure code. Check this, not just the HTTP status — failures still return HTTP 200.
messagearray
Warnings and errors, including the message telling you the daily threshold has been exceeded.
Results.series[].seriesIDstring
Echo of the requested series id.
Results.series[].data[].yearstring
Four-digit year, as a string.
Results.series[].data[].periodstring
Period code — `M01`–`M12` for months, `M13` for an annual average, `Q01`–`Q04` for quarters. Never parse the digits alone.
Results.series[].data[].periodNamestring
Human-readable period name such as `July`.
Results.series[].data[].valuestring
The observation, returned as a string. Parse before arithmetic.
Results.series[].data[].lateststring
Present and set to `true` on the most recent observation only.
Results.series[].data[].footnotesarray
Revision and methodology notes attached to an observation.

What you can build with the US Bureau of Labor Statistics API

  • Show the current US unemployment rate on a dashboard
  • Chart CPI inflation over the last decade
  • Pull average hourly earnings for a wage comparison feature
  • Detect the newest observation with the `latest` flag rather than sorting

Common errors and how to fix them

`status: REQUEST_NOT_PROCESSED` with HTTP 200

The daily 25-request threshold has been reached, or the series id is invalid.

Fix: Read `status` and `message` — the API signals failure in the body, not the status code. Cache responses; these series change monthly.

Only three years returned

No `startyear`/`endyear` was supplied.

Fix: The default window is three years. Request an explicit range, up to ten years on v1.

Month parsed as 13

The `M13` annual-average period code was treated as a month.

Fix: Filter to `M01`–`M12` when you want monthly observations. `M13` is a yearly summary row.

US Bureau of Labor Statistics API — frequently asked questions

Can I use the BLS API without an API key?

Yes. Version 1 requires no key or registration. It is limited to 25 requests a day per IP, 25 series per request and a ten-year span; version 2 lifts those but needs a free registered key.

What is the series id for the US unemployment rate?

`LNS14000000` is the seasonally adjusted national unemployment rate from the Current Population Survey. `LNU04000000` is the unadjusted equivalent.

Why are the values returned as strings?

The BLS returns every observation as a string, including numeric ones. Parse explicitly before arithmetic rather than relying on a deserialiser to coerce them.

What does period M13 mean?

It is the annual average for that year, not a thirteenth month. Filter the period code to `M01` through `M12` if you only want monthly observations.

Tools that pair with this API

US Bureau of Labor Statistics is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.