<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Siftwright Data</title>
    <description>The latest articles on DEV Community by Siftwright Data (@siftwright_data).</description>
    <link>https://dev.to/siftwright_data</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4183191%2Fe16c67bc-c93f-404f-8c76-8eb25e93219c.png</url>
      <title>DEV Community: Siftwright Data</title>
      <link>https://dev.to/siftwright_data</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siftwright_data"/>
    <language>en</language>
    <item>
      <title>Who's hiring this week: only 1 in 24 new tech jobs is junior-level (Oct 7-13, 2026)</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Wed, 14 Oct 2026 15:00:29 +0000</pubDate>
      <link>https://dev.to/siftwright_data/whos-hiring-this-week-only-1-in-24-new-tech-jobs-is-junior-level-oct-7-13-2026-48eh</link>
      <guid>https://dev.to/siftwright_data/whos-hiring-this-week-only-1-in-24-new-tech-jobs-is-junior-level-oct-7-13-2026-48eh</guid>
      <description>&lt;p&gt;Every week we pull the new postings straight from about 7,500 companies' own career pages (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio) and count what changed. Unlike job-board numbers, these are jobs as the companies themselves posted them, without reposts or duplicates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week of October 7–13, 2026: 52,516 new postings from 3,747 companies.&lt;/strong&gt; Of those, 3,487 were software, data or AI roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: junior roles are scarce
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Seniority (tech roles)&lt;/th&gt;
&lt;th&gt;New postings&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Senior / Staff / Principal / Lead&lt;/td&gt;
&lt;td&gt;1,547&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-level or unspecified&lt;/td&gt;
&lt;td&gt;1,793&lt;/td&gt;
&lt;td&gt;51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Junior / Intern / Graduate&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only about &lt;strong&gt;1 in 24&lt;/strong&gt; new tech postings was explicitly junior, intern or graduate-level. If you're early in your career, apply to the unspecified-level roles too: half of all postings don't state a level.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI is now a quarter of tech hiring
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;28% of new tech postings&lt;/strong&gt; mention AI, ML or LLMs in the title (992 roles). The companies posting the most AI roles this week were Gramian Consulting Group, Bosch, Clera, Encora, ServiceNow, IFS, Sia, DoorDash, Nebius and Rocket Lab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote and pay transparency
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;28%&lt;/strong&gt; of new tech roles are listed as remote.&lt;/li&gt;
&lt;li&gt;Only &lt;strong&gt;9%&lt;/strong&gt; include a salary range in the posting.&lt;/li&gt;
&lt;li&gt;Among US roles that publish a yearly range, the &lt;strong&gt;median midpoint is $215,000&lt;/strong&gt;. That sample skews senior and toward states with pay-transparency laws, so read it as a ceiling rather than a typical salary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who posted the most tech roles
&lt;/h2&gt;

&lt;p&gt;Gramian Consulting Group (136), Encora (82), Bosch (74), Miratech (73), Clera (48), ServiceNow (43), Sopra Steria (38), Talan (34), Inetum (33) and bet365 (28). Consultancies and IT services firms dominate the volume, and product companies post fewer roles each.&lt;/p&gt;

&lt;p&gt;Across all job types, the biggest posters were Domino's (9,189, mostly store roles), Northwestern Memorial Healthcare (1,370), Accor (1,061), AECOM (755) and Bosch (606).&lt;/p&gt;

&lt;h2&gt;
  
  
  Where
&lt;/h2&gt;

&lt;p&gt;The cities with the most new postings this week: London (937), New York (721 plus 332 listed as "New York City"), San Francisco (700), Chicago (598), Paris (540), Berlin (510), Houston (329) and Singapore (312).&lt;/p&gt;

&lt;h2&gt;
  
  
  How this is measured
&lt;/h2&gt;

&lt;p&gt;The numbers come from the public job feeds of ~7,900 company boards, refreshed daily. "New" means the posting date falls inside the week. Roles are classified by job-title keywords, so treat the categories as approximate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Search it yourself, filtered by keyword, location, remote or salary: &lt;a href="https://apify.com/siftwright_data/ats-jobs-search" rel="noopener noreferrer"&gt;ATS Jobs Search on Apify&lt;/a&gt; ($1 per 1,000 jobs).&lt;/li&gt;
&lt;li&gt;The full current snapshot (400k+ open jobs, one CSV): &lt;a href="https://buy.stripe.com/00w9AUe3E9yucvG32fa7C03" rel="noopener noreferrer"&gt;$39 instant download&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A custom weekly feed or report for your niche: &lt;a href="mailto:siftwright.data@gmail.com"&gt;siftwright.data@gmail.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See you next Monday.&lt;/p&gt;

</description>
      <category>career</category>
      <category>jobs</category>
      <category>datascience</category>
      <category>programming</category>
    </item>
    <item>
      <title>Check your online store's accessibility in 5 minutes (and what to fix first)</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:58:50 +0000</pubDate>
      <link>https://dev.to/siftwright_data/check-your-online-stores-accessibility-in-5-minutes-and-what-to-fix-first-3ggh</link>
      <guid>https://dev.to/siftwright_data/check-your-online-stores-accessibility-in-5-minutes-and-what-to-fix-first-3ggh</guid>
      <description>&lt;p&gt;We ran an automated accessibility scan on the homepages of 14 small US online stores (boutiques, coffee roasters, a pet shop). &lt;strong&gt;12 of the 14 had at least one serious problem&lt;/strong&gt;, and most were the same handful of issues, all fixable in an afternoon.&lt;/p&gt;

&lt;p&gt;Here's how to check your own store for free, and which issues to fix first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5-minute check
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open your store's homepage in Chrome.&lt;/li&gt;
&lt;li&gt;Press F12 to open DevTools, go to the &lt;strong&gt;Lighthouse&lt;/strong&gt; tab, tick only &lt;strong&gt;Accessibility&lt;/strong&gt;, and click &lt;strong&gt;Analyze page load&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For more detail, install the free &lt;strong&gt;axe DevTools&lt;/strong&gt; extension, open its tab in DevTools and run a scan. It uses the same rules engine (axe-core) that most professional audits start from.&lt;/li&gt;
&lt;li&gt;Repeat on one product page and on the cart. Those are where problems cost you sales.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What we found most often (fix these first)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Text that's too faint (low colour contrast).&lt;/strong&gt; This was the most common issue by far, on 9 of 14 stores. Light-grey text, pastel buttons with white text and announcement bars were the usual offenders. WCAG asks for a contrast ratio of 4.5:1 for normal text. &lt;em&gt;Fix:&lt;/em&gt; darken the text colour or the button background in your theme settings, and check it with any contrast checker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Links and icons with no name.&lt;/strong&gt; These were on 10 of 14 stores. Search, cart and wishlist icons, social icons, and the "Powered by" footer link often have no text, so a screen reader announces just "link". &lt;em&gt;Fix:&lt;/em&gt; add a visually hidden label or an &lt;code&gt;aria-label&lt;/code&gt; such as "Search" or "Cart".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Images with no alt text.&lt;/strong&gt; "As featured in" press logos and product images were the usual cases. &lt;em&gt;Fix:&lt;/em&gt; in Shopify, open the image in the media library and fill in "Alt text". Describe what matters ("NBC logo", "Linen wide-leg pants in olive").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Form fields and dropdowns with no label.&lt;/strong&gt; Product option pickers and quantity boxes sometimes have no label, so a blind shopper can't tell what they're choosing. These were the most severe issues we saw. &lt;em&gt;Fix:&lt;/em&gt; make sure each &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; has a &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; or an &lt;code&gt;aria-label&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Zoom disabled on mobile.&lt;/strong&gt; Some themes ship &lt;code&gt;user-scalable=no&lt;/code&gt; in the viewport tag. &lt;em&gt;Fix:&lt;/em&gt; remove &lt;code&gt;maximum-scale=1&lt;/code&gt; and &lt;code&gt;user-scalable=no&lt;/code&gt; from &lt;code&gt;theme.liquid&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother?
&lt;/h2&gt;

&lt;p&gt;About 1 in 4 US adults has a disability. ADA-related demand letters to small online stores have also become common, and they usually cite exactly these automated-scan issues. Fixing the basics makes the store easier for everyone to use and removes the easy targets.&lt;/p&gt;

&lt;p&gt;One caveat: automated tools catch only part of what WCAG covers. Keyboard navigation and screen-reader testing still need a human look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want it done for you?
&lt;/h2&gt;

&lt;p&gt;We run a multi-page scan (homepage, a product page, a collection page and the cart) and send a plain-English, step-by-step fix guide your developer, or you, can follow, then re-scan after the changes: &lt;a href="https://buy.stripe.com/eVq14o4t4bGC67igT5a7C04" rel="noopener noreferrer"&gt;&lt;strong&gt;accessibility check-up, $99&lt;/strong&gt;&lt;/a&gt;. Questions: &lt;a href="mailto:siftwright.data@gmail.com"&gt;siftwright.data@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>shopify</category>
      <category>ecommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Track new job openings at specific companies without scraping Indeed or LinkedIn</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:58:14 +0000</pubDate>
      <link>https://dev.to/siftwright_data/track-new-job-openings-at-specific-companies-without-scraping-indeed-or-linkedin-311h</link>
      <guid>https://dev.to/siftwright_data/track-new-job-openings-at-specific-companies-without-scraping-indeed-or-linkedin-311h</guid>
      <description>&lt;p&gt;Scraping Indeed or LinkedIn Jobs looks like the obvious way to watch who's hiring. In practice you fight Cloudflare challenges, logins, rate limits and HTML that changes every few weeks, and the listings you do get are often days old, reposted from somewhere else.&lt;/p&gt;

&lt;p&gt;That somewhere else is usually the company's own careers page, and most careers pages are powered by an applicant tracking system (ATS) that publishes a clean, public JSON feed. Watching those feeds directly is faster, more reliable and fully public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: find which ATS a company uses
&lt;/h2&gt;

&lt;p&gt;Open the company's careers page and look at where the "Apply" links point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If links go to...&lt;/th&gt;
&lt;th&gt;The ATS is&lt;/th&gt;
&lt;th&gt;Public feed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;boards.greenhouse.io/acme&lt;/code&gt; or &lt;code&gt;job-boards.greenhouse.io/acme&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Greenhouse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://boards-api.greenhouse.io/v1/boards/acme/jobs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jobs.lever.co/acme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lever&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.lever.co/v0/postings/acme?mode=json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jobs.ashbyhq.com/acme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ashby&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.ashbyhq.com/posting-api/job-board/acme&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apply.workable.com/acme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Workable&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://apply.workable.com/api/v1/widget/accounts/acme&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jobs.smartrecruiters.com/Acme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SmartRecruiters&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://api.smartrecruiters.com/v1/companies/Acme/postings&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The part after the domain (&lt;code&gt;acme&lt;/code&gt;) is the board slug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: poll the feed and keep only new jobs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;SEEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seen.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEEN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;SEEN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greenhouse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://boards-api.greenhouse.io/v1/boards/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/jobs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jobs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;absolute_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stripe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;databricks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;notion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;greenhouse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gh:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;SEEN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it from cron once a day and you have a "new openings" alert for any list of companies, with no browser, proxies or logins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: scale past a handful of companies
&lt;/h2&gt;

&lt;p&gt;The manual approach breaks down when you want hundreds of companies across several ATSs, because every ATS has a different schema and you first need to know each company's slug.&lt;/p&gt;

&lt;p&gt;That's the problem we built &lt;a href="https://apify.com/siftwright_data/ats-jobs-search" rel="noopener noreferrer"&gt;&lt;strong&gt;ATS Jobs Search&lt;/strong&gt;&lt;/a&gt; on Apify to solve. It covers seven ATSs (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio), uses one output schema, has a built-in directory of about 7,900 companies' boards, and has an "only new jobs since last run" mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;siftwright_data/ats-jobs-search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchDirectory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data engineer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analytics engineer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;locations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Remote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onlyNewJobs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It costs $1 per 1,000 jobs, and Apify's free monthly credit covers a lot of testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer a file or a ready-made feed?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Everything at once:&lt;/strong&gt; today's full snapshot (about 400,000 open jobs from 7,500+ companies, one CSV) is a &lt;a href="https://buy.stripe.com/00w9AUe3E9yucvG32fa7C03" rel="noopener noreferrer"&gt;$39 instant download&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A daily niche feed&lt;/strong&gt; (for example "remote data jobs" or "healthcare roles in Texas") delivered to a spreadsheet or your inbox: email &lt;a href="mailto:siftwright.data@gmail.com"&gt;siftwright.data@gmail.com&lt;/a&gt; and we'll quote it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy hunting.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>jobs</category>
      <category>automation</category>
      <category>recruiting</category>
    </item>
    <item>
      <title>How to pull fresh job openings straight from company career pages (Greenhouse, Lever, Ashby and more)</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Wed, 14 Oct 2026 03:53:31 +0000</pubDate>
      <link>https://dev.to/siftwright_data/how-to-pull-fresh-job-openings-straight-from-company-career-pages-greenhouse-lever-ashby-and-10al</link>
      <guid>https://dev.to/siftwright_data/how-to-pull-fresh-job-openings-straight-from-company-career-pages-greenhouse-lever-ashby-and-10al</guid>
      <description>&lt;p&gt;Most job boards repost listings days after they appear on the company's own careers page. If you're a recruiter, job-seeker or building a job product, the freshest source is the applicant tracking system (ATS) the company itself uses: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio all publish public job feeds.&lt;/p&gt;

&lt;p&gt;This post shows how to query those feeds in one go.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quick way: one call, every ATS
&lt;/h2&gt;

&lt;p&gt;We published a tool on the Apify Store, &lt;a href="https://apify.com/siftwright_data/ats-jobs-search" rel="noopener noreferrer"&gt;&lt;strong&gt;ATS Jobs Search&lt;/strong&gt;&lt;/a&gt;, that searches all seven feeds at once, detects which ATS a careers page uses, and can return only jobs that are new since your last run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;siftwright_data/ats-jobs-search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchDirectory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data engineer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;locations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Remote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New York&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onlyNewJobs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New to Apify? The free plan's monthly credit is enough to try it on thousands of jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing it by hand (for one company)
&lt;/h2&gt;

&lt;p&gt;Each ATS has a public JSON endpoint, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Greenhouse: &lt;code&gt;https://boards-api.greenhouse.io/v1/boards/{company}/jobs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Lever: &lt;code&gt;https://api.lever.co/v0/postings/{company}?mode=json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ashby: &lt;code&gt;https://api.ashbyhq.com/posting-api/job-board/{company}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That works for a handful of companies. The hard part is knowing &lt;em&gt;which&lt;/em&gt; companies use which ATS and what their board slug is, which is what the tool's built-in directory solves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need something custom?
&lt;/h2&gt;

&lt;p&gt;If you need a feed for a specific niche delivered to a spreadsheet or Slack every morning, email &lt;a href="mailto:siftwright.data@gmail.com"&gt;siftwright.data@gmail.com&lt;/a&gt; and we'll quote a fixed price.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>jobs</category>
      <category>python</category>
      <category>api</category>
    </item>
  </channel>
</rss>
