JobPosting Markup Audit — Remote & Location Checks avatar

JobPosting Markup Audit — Remote & Location Checks

Pricing

$2.00 / 1,000 inspected job pages

Go to Apify Store
JobPosting Markup Audit — Remote & Location Checks

JobPosting Markup Audit — Remote & Location Checks

Audit public job-detail pages for JobPosting JSON-LD errors, remote-work geography, physical locations, dates and noindex signals. Get one precise report per page.

Pricing

$2.00 / 1,000 inspected job pages

Rating

0.0

(0)

Developer

Nathaniel Standridge

Nathaniel Standridge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

JobPosting Markup Audit

A job page can look fine to applicants while its structured data quietly loses a location, an employer name, or an indexable page. This Actor checks a list of public job-detail URLs and gives you a compact, repeatable report for each one.

It reads the static HTML response and inspects JobPosting JSON-LD. Findings point to a specific field, explain the problem in plain language, and suggest the next edit. A page that could not be fetched is reported as a fetch error, never as a clean page.

Start with two pages

{
"urls": [
"https://jobs.ashbyhq.com/openai/7613aca3-9dd8-41cd-b114-06ef4de967a9/",
"https://example.com/"
],
"maxRunSeconds": 120
}

The first URL is a public job-detail page that carried static JobPosting markup when this example was prepared; job pages can close or change. The second is a deliberate no-markup comparison. Replace both with your own public job URLs for production checks. The same input can be saved as an Apify Task and scheduled after career-site deployments.

One dataset row per inspected URL. markupStatus is found or missing. Open the Findings table for stable codes, severity, field path, and a concrete fix. URLs blocked by robots, timeouts, HTTP failures and non-HTML responses appear in OUTPUT.fetchErrorDetails with a stable code and time; they never appear as clean pages or billable dataset rows. OUTPUT also counts inspected pages, missing markup and pages with findings, and marks partial runs. Keep that summary beside exported data so a short run is not mistaken for a full audit.

Typical findings include MISSING_DATEPOSTED, MISSING_HIRING_ORGANIZATION, MISSING_ADDRESS_COUNTRY, MISSING_REMOTE_GEOGRAPHY, MULTIPLE_JOBPOSTING, NOINDEX, and PAST_VALID_THROUGH. A past validThrough is informational: Google documents it as a way to expire a closed job. A missing validThrough is not automatically a defect; it is required only if the posting has a known expiration.

What is checked

AreaCheck
PageHTTPS fetch, redirects, HTML content type, robots permissions, noindex, canonical link
JSON-LDParseable JobPosting in scripts and @graph; more than one job object on a detail page
Core fieldsJob title, full description, original posting date, hiring organization name
GeographyCountry on every physical jobLocation; TELECOMMUTE and eligible applicant locations for remote work
DatesISO 8601 syntax, future datePosted, and a published expiration earlier than the posting date
Optional fieldsDocumented employment-type and base-salary structure when those fields are present

The code does not guess whether a job is really remote, whether a salary matches the visible page, or whether an employer is authorized to post. Those require human review. It does not claim that Google has crawled, indexed, or approved a page.

Linked fields using @id are resolved only when an exact matching node appears in the same JSON-LD block. Resolution is bounded to 1,000 nodes and expansions; missing, conflicting or cyclic references receive an explicit inspection finding. External references and remote JSON-LD contexts are never fetched. Date comparisons retain timestamp offsets and precision; when the supplied values lack enough timezone or time-of-day information for an unambiguous comparison, the report says so.

Price and limits

The Store price is $0.002 per successfully fetched and inspected page ($2 per 1,000). A readable page with missing or broken markup still received an audit and is billable. Invalid input, duplicate URLs, robots blocks, HTTP failures, timeouts and non-HTML responses are not charged by this Actor. Apify's default dataset item event is the only charging path. Set a maximum total charge on the run if you need a hard cap. The OUTPUT record tells you when that cap stopped the batch.

Equivalent URLs with an explicit :443 port are deduplicated, and international paths are encoded before fetching. If an interrupted output write has an unknown result, the run stops with an explicit OUTPUT.stopReason. A resumed run continues only after the saved dataset confirms that pending page; it does not send the same uncertain billable write again.

  • 1–50 unique public HTTPS URLs per run; standard port 443 only.
  • Static response only: no browser, JavaScript execution, login, proxy, or CAPTCHA handling. If markup is injected by JavaScript, this Actor reports it as absent from static HTML.
  • Each page response is capped at 2 MB, each robots file at 256 KB, redirects at three, and each page's fetch work at 25 seconds including DNS, robots, redirects and body reads. Blocked fetch work is terminated at that deadline. The overall work budget is 30–180 seconds; bounded storage and summary operations can add shutdown time.
  • Public DNS addresses are resolved and checked before every connection. The connection is pinned to the checked public IP, including after redirects. URL credentials and private or local destinations are rejected.
  • At most 100 JSON-LD blocks and 20 JobPosting objects are checked per page; limit findings are explicit.
  • Reports contain at most 100 findings. FINDINGS_LIMIT marks omitted findings; severity counts describe the findings displayed in the report.
  • No application forms, applicant data or linked pages are fetched. The Actor stores only its dataset and run summary in your Apify account.

Reading the result honestly

The findings are technical checks based on the Google Search Central JobPosting guide, checked in November 2026. Google may change its rules. Use Google's Rich Results Test and Search Console URL Inspection for the final view of a page. In particular, a syntactically correct object can still describe a closed, misleading, or inaccessible job; automated markup checks cannot settle that.

For a reproducible problem, open an issue on this Actor's Apify page with the run ID, public page URL, expected finding and observed finding. Do not include credentials, signed URLs or applicant information.