curl --request GET \
--url https://api.financialdatasets.ai/macro/labor \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/macro/labor"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/macro/labor', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/macro/labor",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/macro/labor"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/macro/labor")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/macro/labor")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"labor": [
{
"series": "<string>",
"date": "<string>",
"value": 123,
"change_prior": 123,
"change_year": 123,
"change_year_pct": 123
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}Historical
Get US labor market history since 1939: nonfarm payrolls, the unemployment rate, participation, hourly earnings, job openings, hires, quits, and weekly jobless claims, with the change from the prior period and from a year earlier.
curl --request GET \
--url https://api.financialdatasets.ai/macro/labor \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.financialdatasets.ai/macro/labor"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.financialdatasets.ai/macro/labor', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.financialdatasets.ai/macro/labor",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.financialdatasets.ai/macro/labor"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.financialdatasets.ai/macro/labor")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.financialdatasets.ai/macro/labor")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"labor": [
{
"series": "<string>",
"date": "<string>",
"value": 123,
"change_prior": 123,
"change_year": 123,
"change_year_pct": 123
}
],
"next_page_url": "<string>"
}{
"error": "Bad Request",
"message": "Invalid request parameters"
}{
"error": "Unauthorized",
"message": "Invalid API key provided"
}{
"error": "Payment Required",
"message": "This endpoint requires a paid subscription. Please upgrade your plan."
}{
"error": "Not Found",
"message": "Ticker XXXX not found"
}Overview
The Labor Market API lets you pull one US labor market series at a time: the jobs report (nonfarm payrolls, the unemployment rate, participation, hourly earnings), JOLTS job openings, hires, and quits, and weekly jobless claims. Monthly series run from 1939 and weekly claims from 1967, with the change from the prior period and from a year earlier computed for you. We source the data directly from authoritative government sources. Values are in each series’ own units (thousands of persons, percent, dollars per hour, persons); the changes are in the same units, plus a percent change over the year. To get started, please create an account and grab your API key at financialdatasets.ai. You will use the API key to authenticate your API requests.Coverage
| History | Series | Updated |
|---|---|---|
| 1939 to today | 24 | Monthly and weekly |
Series
Every concept is available seasonally adjusted (_sa) and, except the 4-week averages, not seasonally adjusted (_nsa).
Monthly (date is the first day of the month):
| Series | What it is | Units | From |
|---|---|---|---|
payrolls_sa, payrolls_nsa | Total nonfarm employment | Thousands of persons | 1939 |
unemployment_rate_sa, unemployment_rate_nsa | Unemployment rate | Percent | 1948 |
unemployment_rate_u6_sa, unemployment_rate_u6_nsa | U-6: unemployed, marginally attached, and part time for economic reasons | Percent | 1994 |
participation_rate_sa, participation_rate_nsa | Labor force participation rate | Percent | 1948 |
hourly_earnings_sa, hourly_earnings_nsa | Average hourly earnings, all private employees | Dollars per hour | 2006 |
job_openings_sa, job_openings_nsa | Job openings, total nonfarm | Thousands | 2000 |
hires_sa, hires_nsa | Hires, total nonfarm | Thousands | 2000 |
quits_sa, quits_nsa | Quits, total nonfarm | Thousands | 2000 |
date is the week-ending Saturday):
| Series | What it is | Units | From |
|---|---|---|---|
initial_claims_sa, initial_claims_nsa | Initial jobless claims | Persons | 1967 |
initial_claims_4_week_sa | Initial jobless claims, 4-week moving average | Persons | 1967 |
continued_claims_sa, continued_claims_nsa | Continued jobless claims | Persons | 1967 |
continued_claims_4_week_sa | Continued jobless claims, 4-week moving average | Persons | 1967 |
insured_unemployment_rate_sa, insured_unemployment_rate_nsa | Insured unemployment rate | Percent | 1971 |
GET request to:
https://api.financialdatasets.ai/macro/labor/series/
Reading the fields
dateis the reference period, not the release date: the first day of the month for monthly series (2026-08-01is the August 2026 jobs report, published in early September) and the week-ending Saturday for weekly series (2026-09-19is the week of September 13 to 19).valueis the published figure in the series’ units.change_priorisvalueminus the prior period’s value: the prior month for monthly series, the prior week for weekly. Same units asvalue.change_yearisvalueminus the value one year earlier: the same month a year back, or the week 52 weeks back. Same units asvalue.change_year_pctischange_yearas a percent of the year-earlier value, rounded to one decimal. It isnullfor series measured in percent (the unemployment, participation, and insured unemployment rates): a rate’s change is stated in points, inchange_year.- A change is
nullwhen the comparison period was not published. - History is the latest published values. When a past period is revised, the stored value is replaced. The newest week of a weekly series is the advance figure; it is replaced by the final figure when that is published.
Getting Started
There are only 3 steps for making a successful API call:- Add your API key to the header of the request as
X-API-KEY. - Add the
seriesparameter, which is required. Optionally addstart_dateandend_date(inclusive,YYYY-MM-DD). For a monthly series any day inside a month selects that month; for a weekly series you get every week-ending Saturday inside the window. With no dates you get the trailing five years. - Execute the API request.
next_page_url; request it as-is to get the next page. See the pagination guide.
Example
import requests
# add your API key to the headers
headers = {
"X-API-KEY": "your_api_key_here"
}
# set parameters
series = 'payrolls_sa' # required
start_date = '2025-09-01' # optional
end_date = '2026-08-31' # optional
# create the URL with parameters
url = (
f'https://api.financialdatasets.ai/macro/labor'
f'?series={series}'
f'&start_date={start_date}'
f'&end_date={end_date}'
)
# make API request
response = requests.get(url, headers=headers)
# parse the observations from the response
labor = response.json().get('labor')
Example Response
{
"labor": [
{
"series": "payrolls_sa",
"date": "2026-08-01",
"value": 159075,
"change_prior": 162,
"change_year": 603,
"change_year_pct": 0.4
}
]
}
Authorizations
API key for authentication.
Query Parameters
The series id, e.g. payrolls_sa. Eight monthly concepts (payrolls, unemployment_rate, unemployment_rate_u6, participation_rate, hourly_earnings, job_openings, hires, quits) and five weekly ones (initial_claims, initial_claims_4_week, continued_claims, continued_claims_4_week, insured_unemployment_rate), each seasonally adjusted (_sa) and, except the 4-week averages, not (_nsa). Use the /macro/labor/series endpoint to get the list.
The first period to return, inclusive, in YYYY-MM-DD format; for a monthly series any day inside a month selects that month. Defaults to five years before end_date when both dates are omitted; omit it with an end_date to get all available history through that date.
The last period to return, inclusive, in YYYY-MM-DD format. Defaults to today.
Opaque pagination cursor from a previous response's next_page_url. When provided, all other query parameters are ignored: the cursor carries the original request's filters. Treat it as opaque; do not construct or modify it.