<?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 30 new tech jobs is junior, and 1 in 6 'AI jobs' is AI-training work (Oct 26-Nov 1, 2026)</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:20:45 +0000</pubDate>
      <link>https://dev.to/siftwright_data/whos-hiring-this-week-only-1-in-30-new-tech-jobs-is-junior-and-1-in-6-ai-jobs-is-ai-training-25l4</link>
      <guid>https://dev.to/siftwright_data/whos-hiring-this-week-only-1-in-30-new-tech-jobs-is-junior-and-1-in-6-ai-jobs-is-ai-training-25l4</guid>
      <description>&lt;p&gt;Every week we pull the new postings straight from about 7,300 companies' own career pages (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio) and count what's there. These are jobs as the companies themselves posted them, not job-board reposts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week of October 26 – November 1, 2026: 47,292 new postings from 3,638 companies.&lt;/strong&gt; Of those, 3,156 were software, data or AI roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: juniors at 1 in 30
&lt;/h2&gt;

&lt;p&gt;Only &lt;strong&gt;107&lt;/strong&gt; new tech postings this week were explicitly junior, intern or graduate-level. That's about &lt;strong&gt;1 in 30&lt;/strong&gt;, the smallest share since we started this series four issues ago (earlier weeks ranged from 1 in 21 to 1 in 28).&lt;/p&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,538&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-level or unspecified&lt;/td&gt;
&lt;td&gt;1,511&lt;/td&gt;
&lt;td&gt;48%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Junior / Intern / Graduate&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The advice stays the same: the "unspecified level" roles are nearly half the market, and many of them don't ask for years of experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the AI numbers carefully
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;32%&lt;/strong&gt; of new tech postings (1,008) mention AI, ML, LLMs or agents in the title. But a good slice of those aren't engineering jobs building AI products. They're &lt;strong&gt;AI-training work&lt;/strong&gt;: experts hired to write, rate or check training data for models.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gramian Consulting Group&lt;/strong&gt; posted 119 AI-titled roles, with titles like "Rust Backend Architect - AI Training Projects" and "Machine Learning Research &amp;amp; Engineering Specialist", plus non-tech experts (aviation, forensics) for "AI Projects".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prolific&lt;/strong&gt; posted 46 "AI Research Participants" roles for physicians and other specialists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those two alone are about &lt;strong&gt;1 in 6&lt;/strong&gt; AI-titled postings this week. If you're an engineer looking for product or infrastructure work in AI, filter these out first. If you're a domain expert, they're a real (often remote, often contract) way in.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;33%&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.&lt;/li&gt;
&lt;li&gt;Among US roles with a published yearly range, the &lt;strong&gt;median midpoint is $207,500&lt;/strong&gt; (203 postings). That sample skews senior and toward pay-transparency states, so treat 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 (125), Miratech (82), Sopra Steria (72), Weekday AI (56), LawnStarter (54, with the same 8 data and engineering roles listed in several locations each), Prolific (46), Clera (44), Bosch (43), ServiceNow (43) and Private Equity Insights (35).&lt;/p&gt;

&lt;p&gt;Across all job types, Domino's again led on volume (6,625 postings, mostly store and delivery roles), followed by Accor (1,038), AECOM (960), H&amp;amp;M Group (550) and Bosch (528).&lt;/p&gt;

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

&lt;p&gt;For tech roles: London (141), San Francisco (124), Bengaluru (96), New York (49 plus 34 listed as "New York City") and Singapore (38). Across all job types: London (975), New York (753 plus 421 as "New York City"), San Francisco (583), Berlin (485) and Paris (482). Toronto made the all-jobs top 10 this week with 305.&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,300 company boards. "New" means the posting date falls inside the week; the snapshot is taken early on Sunday, so Sunday's postings are mostly missing (weekends are quiet anyway). Roles are classified by job-title keywords, so treat the categories as approximate. We don't compare totals with earlier weeks, because postings drop out of the feeds once they're filled, which makes older weeks look smaller than they were.&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;Just this week's lists as spreadsheets: every new remote tech role (1,032), every junior/intern/graduate tech role (107) and every AI/ML role (1,008), with apply links: &lt;a href="https://buy.stripe.com/bJecN65x8aCygLWfP1a7C08" rel="noopener noreferrer"&gt;$9 instant download&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The full current snapshot (390k+ 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>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Who's hiring this week: one company posted the same AI job 245 times, and only 1 in 21 tech jobs is junior (Oct 19-25, 2026)</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Mon, 26 Oct 2026 13:51:18 +0000</pubDate>
      <link>https://dev.to/siftwright_data/whos-hiring-this-week-one-company-posted-the-same-ai-job-245-times-and-only-1-in-21-tech-jobs-is-27m0</link>
      <guid>https://dev.to/siftwright_data/whos-hiring-this-week-one-company-posted-the-same-ai-job-245-times-and-only-1-in-21-tech-jobs-is-27m0</guid>
      <description>&lt;p&gt;Every week we pull the new postings straight from about 7,300 companies' own career pages (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio) and count what's there. These are jobs as the companies themselves posted them, not job-board reposts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week of October 19–25, 2026: 52,839 new postings from 3,640 companies.&lt;/strong&gt; Of those, 3,799 were software, data or AI roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: one AI job, 245 cities
&lt;/h2&gt;

&lt;p&gt;The single biggest tech poster this week wasn't a consultancy or a big tech firm. &lt;strong&gt;Speechify posted 246 tech roles, and 245 of them are the same job&lt;/strong&gt;: "Software Engineer, AI Data", copied once per city, from Aarhus to Anchorage, every one of them listed as remote.&lt;/p&gt;

&lt;p&gt;That one listing makes up about 1 in 5 of all the AI-titled postings we saw this week. It's a reminder to read "AI hiring is booming" numbers carefully: a few companies cloning one role across hundreds of locations can move the totals a lot. Without Speechify, &lt;strong&gt;28%&lt;/strong&gt; of new tech postings mention AI, ML, LLMs or agents in the title (998 of 3,553), in line with recent weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Juniors: still about 1 in 20
&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,768&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-level or unspecified&lt;/td&gt;
&lt;td&gt;1,849&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Junior / Intern / Graduate&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only &lt;strong&gt;182&lt;/strong&gt; tech postings were explicitly junior, intern or graduate-level, about &lt;strong&gt;1 in 21&lt;/strong&gt;. As before, the "unspecified level" roles are the best bet for early-career applicants: they're half the market and many don't ask for years of experience.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;36%&lt;/strong&gt; of new tech roles are listed as remote (32% without Speechify's copies).&lt;/li&gt;
&lt;li&gt;Only &lt;strong&gt;9%&lt;/strong&gt; include a salary range.&lt;/li&gt;
&lt;li&gt;Among US roles that publish a yearly range, the &lt;strong&gt;median midpoint is $216,000&lt;/strong&gt; (237 postings). That sample skews senior and toward pay-transparency states, so treat it as a ceiling, not a typical salary.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Speechify (246), Gramian Consulting Group (119), Miratech (95), Encora (55), Launch Potato (54), Clera (49), ServiceNow (49), SupportYourApp (46), Bosch (46), and Weekday AI, NCS and Experian (32 each).&lt;/p&gt;

&lt;p&gt;For AI-titled roles specifically, after Speechify and Gramian (118) it spreads out quickly: ServiceNow (28), Clera (22), Launch Potato (18) and Bosch (17).&lt;/p&gt;

&lt;p&gt;Across all job types, Domino's again dominated volume (10,000+ postings, mostly store and delivery roles), followed by Accor (971), H&amp;amp;M Group (860), AECOM (729) and BAYADA Home Health Care (560).&lt;/p&gt;

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

&lt;p&gt;For tech roles: San Francisco (146), London (120), New York (75), Singapore (60), Paris (56), Mountain View (42) and Berlin (42). Across all job types: London (992), San Francisco (732), New York (694 plus 363 listed as "New York City"), Berlin (501) and Paris (484).&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,300 company boards. "New" means the posting date falls inside the week; this week's snapshot was taken early on Sunday, so Sunday's postings are mostly missing (weekends are quiet anyway). Roles are classified by job-title keywords, so treat the categories as approximate. We don't compare totals with earlier weeks, because postings drop out of the feeds once they're filled, which makes older weeks look smaller than they were.&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;Just this week's lists as spreadsheets: every new remote tech role (1,367), every junior/intern/graduate tech role (182) and every AI/ML role (1,244), with apply links: &lt;a href="https://buy.stripe.com/bJecN65x8aCygLWfP1a7C08" rel="noopener noreferrer"&gt;$9 instant download&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The full current snapshot (390k+ 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>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Who's hiring this week: 3 in 10 new tech jobs are AI roles, but only 1 in 28 is junior (Oct 12-18, 2026)</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Mon, 19 Oct 2026 13:48:42 +0000</pubDate>
      <link>https://dev.to/siftwright_data/whos-hiring-this-week-3-in-10-new-tech-jobs-are-ai-roles-but-only-1-in-28-is-junior-oct-12-18-1iff</link>
      <guid>https://dev.to/siftwright_data/whos-hiring-this-week-3-in-10-new-tech-jobs-are-ai-roles-but-only-1-in-28-is-junior-oct-12-18-1iff</guid>
      <description>&lt;p&gt;Every week we pull the new postings straight from about 7,300 companies' own career pages (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio) and count what's there. 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 12–18, 2026: 48,208 new postings from 3,674 companies.&lt;/strong&gt; Of those, 3,250 were software, data or AI roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: AI everywhere, juniors almost nowhere
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;30% of new tech postings&lt;/strong&gt; (979 roles) mention AI, ML, LLMs or agents in the title. Over the same week, only &lt;strong&gt;118&lt;/strong&gt; tech postings were explicitly junior, intern or graduate-level.&lt;/p&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,648&lt;/td&gt;
&lt;td&gt;51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-level or unspecified&lt;/td&gt;
&lt;td&gt;1,484&lt;/td&gt;
&lt;td&gt;46%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Junior / Intern / Graduate&lt;/td&gt;
&lt;td&gt;118&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;That's about &lt;strong&gt;1 in 28&lt;/strong&gt;. Senior titles alone made up more than half of new tech postings. If you're early in your career, the unspecified-level roles are your best bet: they're nearly half the market and many don't require years of experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's posting the AI roles
&lt;/h2&gt;

&lt;p&gt;One company stands out: &lt;strong&gt;Gramian Consulting Group posted 106 AI roles&lt;/strong&gt;, about 1 in 9 of all AI postings we saw. After that it spreads out quickly: ServiceNow (33), Bosch (24), Sia (22), Encora (20), Clera (16), Nebius (14), Lago (12), Sopra Steria (11) and IFS (11).&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 $216,000&lt;/strong&gt; (211 postings). 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 (112), Bosch (69), ServiceNow (63), Encora (58), Clera (45), Miratech (44), Sopra Steria (40), Accenture Federal Services (40), Sia (36) and Devoteam (27). As last week, consultancies and IT services firms dominate the volume; product companies post fewer roles each.&lt;/p&gt;

&lt;p&gt;Across all job types, the biggest posters were Domino's (6,684, including 1,356 customer-service roles), Accor (1,030), AECOM (693), JYSK (650) and Bosch (616).&lt;/p&gt;

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

&lt;p&gt;For tech roles, San Francisco led clearly (158 new postings), followed by London (97), New York (72), Bengaluru (55), Berlin (46), Paris (45) and Singapore (44). Across all job types: London (928), San Francisco (724), New York (710 plus 333 listed as "New York City"), Paris (591) and Berlin (567).&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,300 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. We don't compare totals with earlier weeks, because postings drop out of the feeds once they're filled, which makes older weeks look smaller than they were.&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;Just this week's lists as spreadsheets: every new remote tech role (901), every junior/intern/graduate tech role (118) and every AI/ML role (979), with apply links: &lt;a href="https://buy.stripe.com/bJecN65x8aCygLWfP1a7C08" rel="noopener noreferrer"&gt;$9 instant download&lt;/a&gt;.&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>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>How to read any Shopify store's product catalog with products.json (no API key)</title>
      <dc:creator>Siftwright Data</dc:creator>
      <pubDate>Wed, 14 Oct 2026 21:56:34 +0000</pubDate>
      <link>https://dev.to/siftwright_data/how-to-read-any-shopify-stores-product-catalog-with-productsjson-no-api-key-40nl</link>
      <guid>https://dev.to/siftwright_data/how-to-read-any-shopify-stores-product-catalog-with-productsjson-no-api-key-40nl</guid>
      <description>&lt;p&gt;Almost every Shopify store publishes its whole public catalog as JSON. There's no API key, no app and no scraping of HTML. Add &lt;code&gt;/products.json&lt;/code&gt; to the store's domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example-store.com/products.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That returns the store's products, with titles, descriptions, prices, variants, SKUs, stock flags and image URLs. It's handy for competitor price checks, catalog audits, building a comparison site, or simply exporting your own store to a spreadsheet.&lt;/p&gt;

&lt;p&gt;Here's how it works, how to page through big catalogs, and a few things to watch for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get back
&lt;/h2&gt;

&lt;p&gt;Each request returns &lt;code&gt;{"products": [...]}&lt;/code&gt;. A trimmed product looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7340901859408&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Women's Flip Flop - Dusty Pink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"womens-flip-flop-dusty-pink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body_html"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;p&amp;gt;Sun on your feet. Comfort underneath...&amp;lt;/p&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vendor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Brand"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"product_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Shoes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"womens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"summer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"published_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-25T16:58:13-07:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-14T14:56:02-07:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42146889039952&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A12513W070"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"25.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"compare_at_price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"50.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://cdn.shopify.com/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"alt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few useful details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;price&lt;/code&gt; and &lt;code&gt;compare_at_price&lt;/code&gt;&lt;/strong&gt; are strings. A &lt;code&gt;compare_at_price&lt;/code&gt; above &lt;code&gt;price&lt;/code&gt; means the item is on sale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;available&lt;/code&gt;&lt;/strong&gt; on each variant tells you whether that size or colour is in stock. You don't get stock counts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;handle&lt;/code&gt;&lt;/strong&gt; builds the product URL: &lt;code&gt;https://example-store.com/products/&amp;lt;handle&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;images[].alt&lt;/code&gt;&lt;/strong&gt; is the image's alt text. &lt;code&gt;null&lt;/code&gt; means none was set, which matters for accessibility and SEO.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paging through the whole catalog
&lt;/h2&gt;

&lt;p&gt;The default page holds 30 products. Ask for up to 250 per page and step through pages until one comes back empty:&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;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example-store.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&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="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/products.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;params&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;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&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="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;products&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;products&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;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;variants&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;rows&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="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;p&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;variant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&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;sku&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sku&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;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&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;compare_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;compare_at_price&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;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&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;url&lt;/span&gt;&lt;span class="sh"&gt;"&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="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/products/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;handle&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&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="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog.csv&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;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&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="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;variants saved&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;Shopify sends &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; on this endpoint, so the same request works from browser JavaScript too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example-store.com/products.json?limit=250&amp;amp;page=1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  One collection only
&lt;/h2&gt;

&lt;p&gt;Every collection has its own feed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example-store.com/collections/&amp;lt;collection-handle&amp;gt;/products.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Things to watch for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Some stores turn it off&lt;/strong&gt; or sit behind a password page. Then you'll get a 404 or HTML instead of JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be polite.&lt;/strong&gt; Space requests a second or two apart. Shopify rate-limits heavy traffic, and a catalog of a few thousand products only needs a handful of requests anyway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's public data only.&lt;/strong&gt; No costs, no stock counts, no unpublished products.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prices are in the store's currency.&lt;/strong&gt; Multi-currency stores may show a different currency depending on where you request from.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free tools if you'd rather not write code
&lt;/h2&gt;

&lt;p&gt;We put three small browser tools on Hugging Face that use this same feed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://huggingface.co/spaces/SiftwrightData/shopify-product-exporter" rel="noopener noreferrer"&gt;Shopify product exporter&lt;/a&gt;:&lt;/strong&gt; paste a store URL and download its catalog as a CSV.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://huggingface.co/spaces/SiftwrightData/shopify-description-checker" rel="noopener noreferrer"&gt;Product description checker&lt;/a&gt;:&lt;/strong&gt; flags products with thin, missing or duplicated descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://huggingface.co/spaces/SiftwrightData/shopify-alt-text-checker" rel="noopener noreferrer"&gt;Image alt-text checker&lt;/a&gt;:&lt;/strong&gt; lists product images with no alt text, a quick accessibility and SEO win.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd like a store's prices tracked daily, with alerts when something changes or goes on sale, email &lt;a href="mailto:siftwright.data@gmail.com"&gt;siftwright.data@gmail.com&lt;/a&gt; and we'll set it up for you.&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ecommerce</category>
      <category>javascript</category>
      <category>python</category>
    </item>
    <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>
