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.
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 'https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000'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);import requests
res = requests.get("https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000", timeout=20)
res.raise_for_status()
print(res.json()){
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
seriesId | path segment | Required | BLS series identifier. `LNS14000000` is the seasonally adjusted unemployment rate; `CUUR0000SA0` is CPI-U for all items. LNS14000000 |
startyear / endyear | query | Optional | Year bounds. Without them the API returns the last three years. Maximum span on v1 is ten years. 2020 |
(POST body) | body | Optional | A 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
Inflation Calculator
See how inflation erodes purchasing power over time, or what a past amount is worth today. Enter an amount, rate and years. Free, private inflation tool.
Percentage Change Calculator
Work out the percentage increase or decrease between an old and a new value. See the absolute change and whether it went up or down, instantly and privately.
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
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.