Citation Atlas API
Version 1.1.0 · data as of October 5, 2026 · OpenAPI 3.1 spec (openapi.json)
The same records as the weekly alert, as JSON or CSV: newly published OSHA citations, newly opened inspections, and penalty and status changes, for every state, filtered the way you want. Included with the All states + API plan ($79/month).
curl -H "Authorization: Bearer $CITATION_ATLAS_KEY" \
"https://citationatlas.com/api/v1/weekly?state=TX§or=construction&min_penalty=5000"
Authentication
Every request needs your API key in the Authorization header: Authorization: Bearer <key>. Don't put the key in a URL.
- Get your key. Subscribe to All states + API. Open your preferences page from the link in your welcome email or any weekly email, or request a sign-in link at Manage subscription (no passwords). The API section of that page shows your key and two ready-made curl commands.
- Reset it. On the same page, Reset links and API key issues a new key. The old key stops working immediately, and so do older emailed links (new emails carry fresh ones). Do this if a key leaks.
- When it stops working. Keys don't expire. A reset key returns
401; a key whose subscription is canceled, unpaid or moved to the State plan returns403.
The key is a bearer secret: anyone with it can download your plan's data. Keep it in an environment variable or secret store, not in client-side code.
Endpoints
Base URL: https://citationatlas.com. Both endpoints are GET only (and HEAD) and return JSON unless you ask for CSV.
GET/api/v1/weekly: One week's records
Newly published citations, newly opened inspections and penalty/status changes for one alert week, filtered. With no filters: every state. Filters combine with AND; comma-separated values within one filter combine with OR. A state with at least one chosen county is limited to those counties.
| Parameter | Type | Description | Example |
|---|---|---|---|
week | string (date) | Alert week (a Monday) from /api/v1/weeks. Default: the latest week. | 2026-10-05 |
state | string | Comma-separated two-letter postal codes. Default: every state and territory. | TX,OK |
sector | string | Comma-separated industry sector slugs: accommodation-food, admin-waste-services, agriculture, arts-recreation, construction, education, finance-insurance, health-care, information, management, manufacturing, mining-oil-gas, other-services, professional-services, public-administration, real-estate, retail, transportation-warehousing, utilities, wholesale, other. Default: all. | construction |
county | string | Comma-separated five-digit county FIPS codes (at most 60). Records whose ZIP code has no county are excluded in states where you chose counties. | 48201 |
min_penalty | integer | Citations and changes with an initial (proposed) penalty of at least this many dollars. Openings are not affected. | 5000 |
openings | string | 0 leaves out newly opened inspections. | 0 |
format | string | json (default), csv (one file, record_type column) or zip (the CSV plus the license texts). | csv |
limit | integer | JSON only. Page size, applied to each of citations, openings and changes (1 to 1000). Default: no limit. | 100 |
offset | integer | JSON only. Records to skip in each array; use next_offset from the previous page. | 0 |
| Status | Meaning |
|---|---|
200 | The week's records. |
400 | Invalid parameter (message says which). |
401 | Missing, invalid or revoked API key. |
403 | The key is valid but the subscription is not an active All states + API plan. |
404 | No data published yet, or the week is not available. |
405 | Method other than GET or HEAD. |
429 | Rate limit exceeded. |
500 | Unexpected server error. Retry later. |
GET/api/v1/weeks: Available weeks
Alert weeks available to /api/v1/weekly, newest first.
No parameters.
| Status | Meaning |
|---|---|
200 | Weeks, newest first. |
401 | Missing, invalid or revoked API key. |
403 | The key is valid but the subscription is not an active All states + API plan. |
405 | Method other than GET or HEAD. |
429 | Rate limit exceeded. |
500 | Unexpected server error. Retry later. |
format=csv returns one file with every matching record and a record_type column (citation, inspection_opened, change), the same as the weekly email's CSV: the official record URL in osha_record_url and the Establishment Search fallback in osha_search_url. format=zip adds the attribution and license texts. CSV cells that start with = + - @ are prefixed with an apostrophe so spreadsheets don't run them as formulas.
Response fields
Field tables below are generated from the OpenAPI spec, which is tested against the live functions' responses. New optional fields may be added within v1, so ignore fields you don't know. Dates are YYYY-MM-DD; money is US dollars.
The weekly response
| Field | Type | Description |
|---|---|---|
week | string (date) | Monday of the alert week. |
as_of | string (date) | Date of the DOL data snapshot. |
newest_issuance | string (date) | Newest citation issuance date in the data. Citations publish about 30 days after issuance. |
statuses | object | Status slug -> label. |
sectors | object | Sector slug -> label. |
change_basis | string | How changes were found: snapshot (diff against last week's data) or events (settlements recorded in the last 7 days; first week only). One of: snapshot, events. |
osha_search_url | string (uri) | OSHA's Establishment Search: the fallback for any record's osha link. |
osha_record_note | string | What to tell people when the osha.gov record link shows a verification page or the homepage. |
total | object | Records matching your filters, before offset and limit. |
offset | integer | The offset applied. |
limit | integer | null | The limit applied; null when none was given (everything returned). |
next_offset | integer | null | Pass as offset for the next page; null on the last page. |
citations | array of Citation | Newly published citations, largest initial penalty first. |
openings | array of Opening | Newly opened inspections, newest first. Empty with openings=0. |
changes | array of Change | Penalty and status changes, largest penalty change first. |
attribution optional | object | Present when any returned record has a contact. Keep it with the contact data wherever you redistribute it. |
licenses optional | object | Present with attribution: file name -> full license text (CDLA-Permissive-2.0, Apache-2.0 + Foursquare NOTICE, CC0, ATTRIBUTION). |
Fields on every record
Fields shared by citations, openings and changes. Citations, openings and changes all carry these.
| Field | Type | Description |
|---|---|---|
id | string | OSHA inspection number (activity number). Search it at OSHA's Establishment Search if the osha.gov link lands on the homepage. |
name | string | null | Establishment name, cleaned (State Plan case-number prefixes removed, title case). null when person is true. |
person | boolean | true when the name looks like an individual (e.g. a sole proprietor). Then name, addr, page and hist are null and no contact is matched. Show it as "Name withheld (individual)". |
addr | string | null | Site street address. null when withheld or missing. |
city | string | null | Site city. |
st | string | Two-letter state or territory postal code. |
zip | string | null | Five-digit site ZIP code. |
cfips | string | null | Five-digit county FIPS code, from the ZIP code (Census 2020 ZCTA, largest land share). null for PO-box and unique ZIP codes. |
county | string | null | County name for cfips. |
naics | string | null | NAICS industry code as recorded by OSHA. |
sector | string | Industry sector slug (labels in the response's sectors map); filter with sector. |
opened | string (date) | null | Date the inspection was opened. |
osha | string (uri) | Official osha.gov inspection detail URL (the record of authority). osha.gov may ask you to verify you're human; if you land on the homepage, search the inspection number at OSHA's Establishment Search. Search URL: https://www.osha.gov/ords/imis/establishment.html |
page | string | null | Path of the establishment's Citation Atlas company page (prefix https://citationatlas.com), or null. |
hist | History | null |
Citation fields
An inspection whose citations were newly published in the DOL data this week. Citations list alleged violations and proposed penalties until they become final orders. Also has every field in Fields on every record.
| Field | Type | Description |
|---|---|---|
issued_first | string (date) | Date the first citation was issued. |
issued | string (date) | Date the latest citation was issued (citations reach the public data about 30 days later). |
items | integer | Alleged violation items (deleted items excluded). |
types | object | Alleged items by violation type; types with no items are omitted. |
init | number | Initial (proposed) penalty, USD, summed over the items. |
cur | number | Current penalty, USD, after any settlement or order. Show it next to init. |
status | string | Status label derived from the item statuses: open (Open), contested (Contested), informal (Informal settlement), formal (Formal settlement), final (Final order), deleted (Deleted), unknown (Status not determinable). Labels are in the response's statuses map. |
stds | array of string | Standards cited (up to 12), e.g. 1926.501(b)(13). |
topic | object | null | Main standard: the section with the largest initial penalty (ties: most items). |
wr_topic | object | null | Section of an alleged willful or repeat item, if any. |
abate_first | string (date) | null | Earliest abatement due date, per OSHA record. |
abate_last | string (date) | null | Latest abatement due date, per OSHA record. |
contested_on | string (date) | null | Contest date, per OSHA record. |
final_order | string (date) | null | Final order date, per OSHA record (null while contested). |
contest_est | string (date) | null | ESTIMATED close of the contest window: 15 working days (federal holidays excluded) after the latest issuance. Only set when the record has no contest or final-order date and the status is open. The legal deadline runs from the employer's receipt of the citation, so label it as an estimate. |
contact optional | Contact |
Opening fields
An inspection newly listed this week with no citations yet. Opening an inspection does not mean any violation was found. Also has every field in Fields on every record.
| Field | Type | Description |
|---|---|---|
type | string | Inspection type. Accident and fatality types are folded into Unprogrammed. One of: Complaint, Referral, Programmed (planned), Programmed, Unprogrammed, Follow-up, Monitoring, Variance, Other. |
sh | string | null | Safety or health inspection. One of: Safety, Health. |
contact optional | Contact |
Change fields
Change event: a cited inspection whose current penalty or status changed. With change_basis: snapshot (normal weeks) it compares this week's data with last week's; with change_basis: events (the first week) it lists settlements recorded in the last 7 days, from the initial penalty. Also has every field in Fields on every record.
| Field | Type | Description |
|---|---|---|
init | number | Initial (proposed) penalty, USD. |
issued | string (date) | null | Date the latest citation was issued. |
from_cur | number | Current penalty before the change, USD (the initial penalty when from_is_initial). |
to_cur | number | Current penalty after the change, USD. |
from_status | string | null | Status before the change; null for settlement events. |
to_status | string | Status now. |
event optional | string | Settlement type (events basis only). One of: informal, formal. |
event_date optional | string (date) | Date the settlement was recorded (events basis only). |
from_is_initial optional | boolean | true when from_cur is the initial proposed penalty (events basis only). |
History
Inspection history at the same establishment (normalized name + ZIP code), from the full DOL history back to the 1970s. null when there is only one inspection on record or the name is withheld. A business that moved or renamed is undercounted.
| Field | Type | Description |
|---|---|---|
n | integer | Inspections on record, including this one. |
since | integer | Year of the earliest inspection on record. |
prior | integer | Inspections opened before this one. |
prior_cited | integer | How many of the earlier inspections had citations. |
prior_wr | integer | Alleged willful or repeat items in the earlier inspections. |
prior_init | number | Total initial (proposed) penalties of the earlier inspections, USD. |
last_prior | string (date) | null | Open date of the most recent earlier inspection; null when there is none. |
Contact
Public business listing matched to the establishment (Overture Maps Places). Present on about 44% of eligible records; never on government establishments or withheld individuals. Redistributing it carries license obligations: see attribution, licenses and /data-license/.
| Field | Type | Description |
|---|---|---|
phone | string | null | Listing phone, formatted (NNN) NNN-NNNN. May be a mobile number: TCPA, Do Not Call and state telemarketing rules apply to you. |
web | string (uri) | null | Listing website. |
tier | string | A: name and street address match. B: near-exact name in the same ZIP code (probable). One of: A, B. |
basis | string | What matched, in words: "name + address" or "name in same ZIP (probable)". |
ov | string | Overture Maps place id (GERS id) of the listing. |
listed_as | string | The business name on the listing. |
lic | array of string | Licenses of the listing's sources, e.g. CDLA-Permissive-2.0, Apache-2.0. |
closed | boolean | true when the listing is marked closed. |
WeeksResponse
| Field | Type | Description |
|---|---|---|
weeks | array of string (date) | Alert weeks (Mondays), newest first. |
Error
| Field | Type | Description |
|---|---|---|
error | string | Human-readable message. |
code | string | Machine-readable code. One of: invalid_parameter, unauthorized, forbidden, not_found, method_not_allowed, rate_limited, internal_error. |
week optional | string | The requested week (404 week not found only). |
Status labels
Every citation has a status, derived from the statuses of its items in the public data. Show it with every record. The response's statuses map gives the label for each slug.
| Slug | Label | Meaning |
|---|---|---|
open | Open | Citations issued; not yet a final order in the public data. |
contested | Contested | Under contest; not a final finding. Items and penalties may change. |
informal | Informal settlement | Resolved through an informal settlement agreement. |
formal | Formal settlement | Resolved through a formal settlement after a contest. |
final | Final order | The citation items have become a final order. |
deleted | Deleted | All citation items were deleted or withdrawn. |
unknown | Status not determinable | Item statuses are mixed or incomplete in the public data. |
Deadlines
- Per OSHA record:
abate_firstandabate_last(abatement due),contested_on(contest date) andfinal_order(final order date) come straight from the DOL data. - Estimate:
contest_estis our estimate of when the contest window closes: 15 working days after the latest issuance date, excluding federal holidays. It is set only when the record has no contest or final-order date and the status is open. The legal deadline runs from the employer's receipt of the citation, so always label it as an estimate. Because citations reach the public data about 30 days after issuance, most estimated deadlines have already passed when a record first appears.
Change events
changes lists cited inspections whose current penalty or status changed. The response's change_basis says how they were found:
snapshot(normal weeks): this week's penalty and status compared with last week's data.from_cur/from_statusare last week's values,to_cur/to_statusthis week's.events(the first week only): informal and formal settlements recorded in the last 7 days. These also carryevent,event_dateandfrom_is_initial: true(from_curis the initial proposed penalty), andfrom_statusis null.
Inspections that are also new citations this week appear only in citations. Changes are sorted by the size of the penalty change, largest first.
Example response
Real records from the week of 2026-10-05 (GET /api/v1/weekly?state=NY&limit=1). The phone number is partially hidden on this public page; the API returns it in full. License texts are abbreviated.
{
"week": "2026-10-05",
"as_of": "2026-10-05",
"newest_issuance": "2026-09-03",
"statuses": {
"open": "Open",
"contested": "Contested",
"informal": "Informal settlement",
"formal": "Formal settlement",
"final": "Final order",
"deleted": "Deleted",
"unknown": "Status not determinable"
},
"sectors": {
"agriculture": "Agriculture, forestry & fishing",
"mining-oil-gas": "Mining, oil & gas",
"utilities": "Utilities",
"construction": "Construction",
"manufacturing": "Manufacturing",
"wholesale": "Wholesale trade",
"retail": "Retail trade",
"transportation-warehousing": "Transportation & warehousing",
"information": "Information",
"finance-insurance": "Finance & insurance",
"real-estate": "Real estate & rental",
"professional-services": "Professional & technical services",
"management": "Management of companies",
"admin-waste-services": "Administrative & waste services",
"education": "Educational services",
"health-care": "Health care & social assistance",
"arts-recreation": "Arts, entertainment & recreation",
"accommodation-food": "Accommodation & food services",
"other-services": "Other services",
"public-administration": "Public administration",
"other": "Unclassified"
},
"change_basis": "events",
"osha_search_url": "https://www.osha.gov/ords/imis/establishment.html",
"osha_record_note": "osha.gov may ask you to verify you're human; if you land on the homepage, search the inspection number at OSHA's Establishment Search.",
"total": {
"citations": 24,
"openings": 33,
"changes": 2
},
"offset": 0,
"limit": 1,
"next_offset": 1,
"citations": [
{
"id": "348855081",
"name": "Empire Plastics, Inc.",
"person": false,
"addr": "2011 E. Main Street",
"city": "Endwell",
"st": "NY",
"zip": "13760",
"cfips": "36007",
"county": "Broome County",
"naics": "326199",
"sector": "manufacturing",
"opened": "2026-03-25",
"osha": "https://www.osha.gov/ords/imis/establishment.inspection_detail?id=348855081",
"page": "/company/empire-plastics-inc-endwell-ny-13760/",
"hist": {
"n": 9,
"since": 1981,
"prior": 8,
"prior_cited": 6,
"prior_wr": 0,
"prior_init": 27240.0,
"last_prior": "2016-04-20"
},
"issued_first": "2026-08-28",
"issued": "2026-08-28",
"items": 3,
"types": {
"S": 3
},
"init": 16551.0,
"cur": 6620.0,
"status": "informal",
"stds": [
"1910.147(c)(4)(ii)",
"1910.147(c)(6)(i)",
"1910.212(a)(1)"
],
"topic": {
"code": "1910.147",
"short": "Lockout/Tagout"
},
"wr_topic": null,
"abate_first": "2026-10-16",
"abate_last": "2026-10-16",
"contested_on": null,
"final_order": "2026-09-22",
"contest_est": null,
"contact": {
"phone": "(607) 754-••••",
"web": null,
"tier": "A",
"basis": "name + address",
"ov": "382151d2-11ff-419a-8d8b-adbf9de4ca3a",
"listed_as": "Empire Plastics Inc",
"lic": [
"CDLA-Permissive-2.0"
],
"closed": false
}
}
],
"openings": [
{
"id": "349180802",
"name": "Van Derhoof Roofing Co., Inc.",
"person": false,
"addr": "100 Hazelhurst Avenue",
"city": "North Syracuse",
"st": "NY",
"zip": "13212",
"cfips": "36067",
"county": "Onondaga County",
"naics": "238160",
"sector": "construction",
"opened": "2026-09-23",
"osha": "https://www.osha.gov/ords/imis/establishment.inspection_detail?id=349180802",
"page": null,
"hist": null,
"type": "Other",
"sh": "Safety",
"contact": {
"phone": "(315) 475-••••",
"web": "https://www.vanderhoofroofing.com",
"tier": "A",
"basis": "name + address",
"ov": "b59cd971-2c05-44b1-a074-a7e94cefafc9",
"listed_as": "Van Derhoof Roofing Co., Inc.",
"lic": [
"CDLA-Permissive-2.0"
],
"closed": false
}
}
],
"changes": [
{
"id": "348866526",
"name": "ADD Ventures Construction Services LLC",
"person": false,
"addr": "Mountainview Condominiums Sierra Vista Lane",
"city": "Valley Cottage",
"st": "NY",
"zip": "10989",
"cfips": "36087",
"county": "Rockland County",
"naics": "238160",
"sector": "construction",
"opened": "2026-04-03",
"osha": "https://www.osha.gov/ords/imis/establishment.inspection_detail?id=348866526",
"page": "/company/add-ventures-construction-services-llc-valley-cottage-ny-10989/",
"hist": null,
"init": 31861,
"issued": "2026-08-10",
"from_cur": 31861,
"to_cur": 19116,
"from_status": null,
"to_status": "informal",
"event": "informal",
"event_date": "2026-09-30",
"from_is_initial": true
}
],
"attribution": {
"text": "Contact data: Overture Maps Foundation (overturemaps.org), release 2026-09-23.1. Licensed per source: CDLA-Permissive-2.0, Apache-2.0 (Foursquare), CC0. License texts: https://citationatlas.com/data-license/",
"release": "2026-09-23.1",
"license_url": "https://citationatlas.com/data-license/",
"phones": "Public business listing phones; may be mobile numbers. TCPA, Do Not Call and state telemarketing compliance is the API user's responsibility."
},
"licenses": {
"ATTRIBUTION.txt": "(full text)",
"LICENSE-CDLA-Permissive-2.0.txt": "(full text)",
"LICENSE-Apache-2.0.txt": "(full text)",
"NOTICE-Foursquare.txt": "(full text)",
"LICENSE-CC0-1.0.txt": "(full text)"
}
}
Pagination
By default /api/v1/weekly returns the whole week in one response (a national week is roughly 1 MB of JSON). To page through it, add limit (1 to 1000) and offset:
limitandoffsetapply to each ofcitations,openingsandchanges, in their documented order.totalgives the full count of each array for your filters.next_offsetis theoffsetfor the next page, ornullonce every array is exhausted.- Pagination is JSON only:
format=csvandformat=zipalways return every matching record. - A week's data doesn't change once published, so pages are stable. Pass the same
weekon every page so a new week can't arrive mid-way.
Rate limits
120 requests per API key per hour (UTC clock hour), across both endpoints. The data changes once a week, so a normal integration needs a handful of requests per week. Every authenticated response carries:
X-RateLimit-Limit: 120X-RateLimit-Remaining: requests left this hourX-RateLimit-Reset: Unix time when the hour resets
Over the limit you get 429 with a Retry-After header in seconds. Need more? Email [email protected].
Errors
Errors are JSON: {"error": "human-readable message", "code": "machine_code"}.
| Status | code | When |
|---|---|---|
400 | invalid_parameter | A parameter is malformed or unknown (the message names it). |
401 | unauthorized | No Authorization header, or the key is invalid or was reset. |
403 | forbidden | The key is valid but the subscription isn't an active All states + API plan (canceled, unpaid, or a State plan). |
404 | not_found | No data published yet, or the requested week isn't available. |
405 | method_not_allowed | Anything other than GET or HEAD. |
429 | rate_limited | More than the hourly limit for this key; wait for Retry-After seconds. |
500 | internal_error | Unexpected error on our side; retry later. |
curl, Python and JavaScript
curl
# the latest week, Texas and Oklahoma construction, citations of $5,000 or more, as JSON
curl -H "Authorization: Bearer $CITATION_ATLAS_KEY" \
"https://citationatlas.com/api/v1/weekly?state=TX,OK§or=construction&min_penalty=5000"
# available weeks, then one week as CSV
curl -H "Authorization: Bearer $CITATION_ATLAS_KEY" "https://citationatlas.com/api/v1/weeks"
curl -H "Authorization: Bearer $CITATION_ATLAS_KEY" -o week.csv \
"https://citationatlas.com/api/v1/weekly?week=2026-10-05&format=csv"
Python
import os, time
import requests # pip install requests
API = "https://citationatlas.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['CITATION_ATLAS_KEY']}"}
def get(path, **params):
while True:
r = requests.get(f"{API}/{path}", headers=HEADERS, params=params, timeout=60)
if r.status_code == 429: # rate limited: wait and retry
time.sleep(int(r.headers.get("Retry-After", "60")))
continue
r.raise_for_status()
return r.json()
week = get("weeks")["weeks"][0]
citations, offset = [], 0
while offset is not None: # page through the week, 200 records at a time
page = get("weekly", week=week, state="TX", openings=0, limit=200, offset=offset)
citations += page["citations"]
offset = page["next_offset"]
for c in citations[:5]:
name = "Name withheld (individual)" if c["person"] else c["name"]
print(f'{name} ({c["city"]}, {c["st"]}): {c["items"]} alleged items, '
f'initial (proposed) penalty ${c["init"]:,.0f}, current ${c["cur"]:,.0f}, '
f'status {page["statuses"][c["status"]]}; inspection {c["id"]}: {c["osha"]}')
JavaScript (Node 18+ or a server)
const API = "https://citationatlas.com/api/v1";
const headers = { Authorization: `Bearer ${process.env.CITATION_ATLAS_KEY}` };
async function get(path, params = {}) {
const res = await fetch(`${API}/${path}?${new URLSearchParams(params)}`, { headers });
if (res.status === 429) {
await new Promise((r) => setTimeout(r, 1000 * Number(res.headers.get("Retry-After") || 60)));
return get(path, params);
}
if (!res.ok) throw new Error(`${res.status} ${(await res.json()).error}`);
return res.json();
}
const data = await get("weekly", { state: "NY,NJ", sector: "manufacturing", min_penalty: 10000 });
for (const c of data.citations) {
const phone = c.contact?.phone ?? "no listing";
console.log(c.person ? "Name withheld (individual)" : c.name, data.statuses[c.status], c.init, c.cur, phone, c.id);
}
if (data.attribution) console.log(data.attribution.text); // keep with any contact data you pass on
Data freshness
The data is rebuilt from the DOL bulk files every week; a new alert week (a Monday) appears in /api/v1/weeks after the Monday build. Citations publish about 30 days after issuance: "new" means newly published in the DOL data that week, not newly issued. newest_issuance is the newest issuance date in the snapshot and as_of the snapshot date. Newly opened inspections usually appear within two to three weeks of opening. The first week (2026-10-05) was bootstrapped from the newest 7 days of issuance and open dates.
osha.gov record links
Every record's osha field is the official osha.gov inspection detail page, the record of authority; id is the OSHA inspection number. osha.gov may ask you to verify you're human; if you land on the homepage, search the inspection number at OSHA's Establishment Search. The search page is in every JSON response as osha_search_url and in every CSV row as osha_search_url: https://www.osha.gov/ords/imis/establishment.html. If you show records to people, show the inspection number next to the link.
Contact data license and attribution
Phone numbers and websites (contact) come from Overture Maps Foundation Places, which is licensed per source: CDLA-Permissive-2.0, Apache-2.0 (Foursquare, with its NOTICE) and CC0. If you share or republish contact data you got from the API:
- keep the attribution line (
attribution.text) with it, and - include the license texts: JSON responses with contacts carry them in
licenses, andformat=zipbundles them with the CSV.
Full texts and credits: Data sources, credits and licenses. The OSHA records themselves are U.S. government works in the public domain.
Allegations, TCPA and Do Not Call
Citations are allegations. They list alleged violations and proposed penalties; employers can contest them, and many are reduced or withdrawn in settlement. They are not findings of wrongdoing until they become final orders. Wherever you display these records, use that wording ("alleged", "initial (proposed) penalty"), show the status label and the current penalty next to the initial penalty, and link the official osha.gov record. Never reconstruct names we withhold (person: true). Opening an inspection does not mean a violation was found.
TCPA and Do Not Call. Phone numbers come from public business listings and may be mobile numbers. You are responsible for complying with the Telephone Consumer Protection Act, the National Do Not Call Registry and state telemarketing laws: no autodialed, prerecorded or text-message outreach without the consent those laws require, and scrub numbers against the Do Not Call Registry. A listing match (contact.tier, contact.basis) is not confirmation that the listing belongs to the inspected establishment.
Citation Atlas is not affiliated with DOL or OSHA, and nothing here is legal advice. See the terms. Wrong record? Request a correction. Questions about the API: [email protected].