Turn Job Posting Data Into a Public Table Readers Can Check
Choose a job posting data source, define each row, clean duplicates and salary fields, and publish a sourced table without confusing ads with vacancies.

To publish job posting data, start with a bounded question: Which open federal job announcements matched a documented data-related search during collection? The result should be a table readers can filter by agency, location, pay interval and closing date—with links back to the announcements.
Job posting data describes advertisements, not necessarily individual vacancies. Indeed notes that one posting can cover multiple openings, an advertisement may remain online after a role is filled, and some openings are never advertised online. Label your measure “announcements” or “postings,” not “available jobs.” (Indeed data FAQ)
Choose between individual postings and trend data
These sources serve different publishing tasks. The descriptions below reflect their documentation as of October 24, 2026.
| Source | What you can build | Important boundary |
|---|---|---|
| USAJOBS Search API | A snapshot of currently open U.S. federal job opportunity announcements | Requires an API key; this endpoint returns currently open announcements, not a historical archive |
| Indeed Hiring Lab repository | A time-series table of posting trends by country, sector or available subnational geography | These are aggregate index series, not individual ads or absolute vacancy counts |
| BLS Job Openings and Labor Turnover Survey (JOLTS) | A comparison using an official job-openings measure | Its definition differs from an online posting count |
The USAJOBS documentation describes authentication, search filters, pagination and returned fields. The Hiring Lab repository provides daily series refreshed weekly and permits public use under Creative Commons Attribution 4.0 with attribution to Indeed Hiring Lab.
For context, JOLTS defines job openings as unfilled positions on the last business day of the month that meet specific conditions, including a possible start within 30 days and active external recruiting. Do not combine that measure with advertisement counts as though they were interchangeable.
Build a posting-level snapshot
For the federal-announcement example, record your search terms, filters and collection start and end timestamps before cleaning anything. Decide whether “data-related” means a title match or a match anywhere in the announcement: USAJOBS distinguishes PositionTitle searches from broader Keyword searches, and its documentation says these searches can include synonyms. Describe the results as matches to your search, not an exhaustive classification of data-related work. Retrieve every results page, not just the first. (Search API reference)
Use one row per source announcement per snapshot. Here is a proposed publication schema—not a verbatim API response:
| Column | Meaning or preparation rule |
|---|---|
source, posting_id |
Source name and source identifier; preserve identifiers as text |
title_raw, employer_raw |
Original title and agency or employer name |
location_raw, location_count |
Original location information and number of listed locations |
salary_min, salary_max |
Numeric advertised endpoints; blank when unavailable |
salary_currency, salary_period |
Verified currency and source pay interval; leave unknown currency blank |
posted_date, closing_date |
Source publication date and application deadline |
retrieved_at |
Collection timestamp for the record, including time-zone context |
source_url |
Link to the original announcement |
For USAJOBS, map MatchedObjectId (the control number) to posting_id, PositionURI to source_url, PublicationStartDate to posted_date, and ApplicationCloseDate to closing_date. Structured locations are in PositionLocation; pay ranges and intervals are in PositionRemuneration. The documented remuneration object does not supply a currency field, so do not present currency as an API-provided value. If a record contains multiple pay ranges, document how you represent them rather than silently keeping only the first. (Response field definitions)
If you collect repeated snapshots, the same announcement may legitimately appear on several dates. That is evidence of repeated observation, not automatically a duplicate.
Clean without changing the meaning
Keep an untouched source extract privately, then prepare a separate release file.
- Deduplicate within a snapshot. Start with source plus posting ID. Across sources, identical titles and employers are only duplicate candidates; compare links, locations and dates before merging.
- Handle multiple locations explicitly. Retain one announcement row with its location list, or create a separate announcement-location table. If you expand locations into rows, count distinct announcement IDs when reporting posting totals.
- Preserve original labels. Add normalized titles or employer names in separate columns, with a documented mapping. Do not silently replace the source wording.
- Keep pay comparable. Do not average hourly and annual ranges together, or mix currencies. Leave undisclosed pay blank, not zero. If you annualize pay, retain the original interval and disclose the hours-per-year assumption.
- Distinguish “not stated” from “no.” Use an explicit unknown category when a remote-work or other attribute is absent rather than inferring it.
Use consistent dates and timestamps; the guide to dates and time zones in public tables explains the distinction. For pay and other missing fields, follow the same discipline as empty fields versus zero.
Publish a table with its counting rules
Before upload, check the unique-announcement count, missing salary count, reversed salary ranges and any rows multiplied by location expansion. Compare the cleaned count with your source extract and explain exclusions.
For a snapshot, useful summaries include announcements by agency and the share with a disclosed pay range. For trends, use a consistent collection schedule and search definition. A listing disappearing from your next snapshot does not establish that someone was hired.
If you choose Hiring Lab instead, preserve its series labels, adjustment status, baseline and download date. The repository documents methodology changes and historical revisions, so a reproducible release needs a dated copy of the input. (Hiring Lab methodology)
Review redistribution terms before publishing. Remove applicant information, recruiter personal contact details, credentials and private notes. A public advertisement is not permission to republish every field you collected.
Export the reviewed table as CSV or a supported spreadsheet. TablePage accepts CSV, TSV, XLSX and XLS and creates a public dataset page with a shareable link and filterable table. After upload, inspect identifiers, dates, missing values and row counts on the published page.
Accompany the link with the source, collection period, search scope, row definition, exclusions and counting rule. For this example, use a title such as “Federal job announcements matching a data-title search” and include the actual collection date. Readers should know exactly what the table includes before interpreting its totals.