<?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: Chris O'Connor</title>
    <description>The latest articles on DEV Community by Chris O'Connor (@anointedxwolf).</description>
    <link>https://dev.to/anointedxwolf</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%2F4234351%2F51f18fe4-0f82-46f5-bf3f-844fda988c26.jpg</url>
      <title>DEV Community: Chris O'Connor</title>
      <link>https://dev.to/anointedxwolf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anointedxwolf"/>
    <language>en</language>
    <item>
      <title>The best job posting APIs in 2026, compared by a builder (prices included)</title>
      <dc:creator>Chris O'Connor</dc:creator>
      <pubDate>Mon, 09 Nov 2026 03:53:31 +0000</pubDate>
      <link>https://dev.to/anointedxwolf/the-best-job-posting-apis-in-2026-compared-by-a-builder-prices-included-2840</link>
      <guid>https://dev.to/anointedxwolf/the-best-job-posting-apis-in-2026-compared-by-a-builder-prices-included-2840</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I built one of the tools below, &lt;a href="https://apify.com/trap_check/career-site-jobs" rel="noopener noreferrer"&gt;Career Site Jobs&lt;/a&gt;. I've tried to be fair to the others, including where they beat mine. Prices are as listed on each site on November 8, 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're building a job board, a job-search app, a recruiting tool or a hiring-signals product, you need job postings from somewhere. There are three kinds of sources, and picking the wrong kind costs more than picking the wrong vendor.&lt;/p&gt;

&lt;h2&gt;
  
  
  First decide: career sites, job boards, or both?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Company career sites (the ATS feeds):&lt;/strong&gt; jobs straight from the employer's own Greenhouse, Workday, Lever, Ashby, iCIMS (and so on) careers page. They appear there first, they link to the real apply page, and they vanish when the role is filled. No agency reposts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job boards (LinkedIn, Indeed, Glassdoor):&lt;/strong&gt; much bigger, but full of duplicates, staffing-agency reposts and listings that stay up long after they're filled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both, de-duplicated:&lt;/strong&gt; the most complete and the most expensive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a job board or anything that sends people to "apply", career sites are usually the right base. For labor-market research, you probably want job boards or history too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The options
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Fantastic.jobs: the biggest career-site coverage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; 275,000+ career sites across 58 ATS platforms, plus job boards on some plans. Updated hourly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; monthly plans from $45 (5,000 jobs) up to $2,800 (2M jobs). That's about $9 per 1,000 jobs at the small end and $1.40 at the top. A 14-day free trial is available. Also on Apify and RapidAPI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; funded job boards and job-search products that need the widest coverage and will pay monthly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. TheirStack: jobs as a sales signal
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; jobs from career sites, ATSs and job boards (225M records since 2021), plus technographics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; credit subscriptions from $49/month (1,500 credits).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; B2B sales teams who want "companies hiring for X using tool Y."&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Coresignal: multi-source with history
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; LinkedIn, Indeed, Glassdoor and Wellfound, de-duplicated, with history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; from $49/month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; HR tech and investment research that needs the job-board view and historical data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Bright Data: raw job-board datasets
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; LinkedIn, Indeed, Glassdoor datasets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; from $250 per 100,000 records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; data teams who want big one-off dumps and will do the cleaning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. LinkUp and Lightcast: enterprise labor data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; employer career pages since 2007 (LinkUp); multi-source plus government data (Lightcast).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; not published (sales demo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; economists, investors and workforce planners with enterprise budgets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Career Site Jobs (mine): pay per job, no subscription
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; nearly 30,000 companies' career sites on 10 job systems: Workday, Greenhouse, Lever, Ashby, SmartRecruiters, Workable, BambooHR, Recruitee, Personio and iCIMS. About 1.6 million open jobs, every company checked daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; $3 per 1,000 jobs, pay as you go on &lt;a href="https://apify.com/trap_check/career-site-jobs" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;. No plan, no minimum. Apify's free monthly credit covers about 1,600 jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's different:&lt;/strong&gt; you don't supply a company list (search "data engineer, remote, US" across all of them), and a &lt;strong&gt;daily new + closed jobs feed&lt;/strong&gt; tells you what to add and what to take down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where it loses:&lt;/strong&gt; fewer companies than Fantastic.jobs, daily rather than hourly, and no LinkedIn/Indeed or historical data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; niche job boards, side projects, recruiters and agents that need career-site jobs without a monthly commitment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Starts at&lt;/th&gt;
&lt;th&gt;Pay model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fantastic.jobs&lt;/td&gt;
&lt;td&gt;275k career sites + boards&lt;/td&gt;
&lt;td&gt;$45/mo&lt;/td&gt;
&lt;td&gt;subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TheirStack&lt;/td&gt;
&lt;td&gt;career sites + boards&lt;/td&gt;
&lt;td&gt;$49/mo&lt;/td&gt;
&lt;td&gt;credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coresignal&lt;/td&gt;
&lt;td&gt;job boards, history&lt;/td&gt;
&lt;td&gt;$49/mo&lt;/td&gt;
&lt;td&gt;subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bright Data&lt;/td&gt;
&lt;td&gt;job boards&lt;/td&gt;
&lt;td&gt;$250 / 100k&lt;/td&gt;
&lt;td&gt;per dataset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkUp / Lightcast&lt;/td&gt;
&lt;td&gt;career sites / multi&lt;/td&gt;
&lt;td&gt;demo&lt;/td&gt;
&lt;td&gt;enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Career Site Jobs&lt;/td&gt;
&lt;td&gt;~30k career sites&lt;/td&gt;
&lt;td&gt;$0 (pay per job)&lt;/td&gt;
&lt;td&gt;$3 / 1,000 jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How I'd choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testing an idea or running a niche board:&lt;/strong&gt; start pay-per-job, so you only pay for what you pull. Move to a subscription once your volume makes it cheaper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need every employer on earth, hourly:&lt;/strong&gt; Fantastic.jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selling to companies that are hiring:&lt;/strong&gt; TheirStack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research with history:&lt;/strong&gt; Coresignal, LinkUp or Lightcast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whichever you choose, check three things before you commit: how many of &lt;em&gt;your&lt;/em&gt; target employers it covers (search a few by name), whether it tells you when jobs close, and what a month at your real volume costs.&lt;/p&gt;

&lt;p&gt;If you want to try the pay-per-job route, here's a &lt;a href="https://github.com/AnointedxWolf/career-site-jobs-sample" rel="noopener noreferrer"&gt;free sample of 31,752 jobs posted in a single day&lt;/a&gt; and some ready-made searches: &lt;a href="https://apify.com/trap_check/career-site-jobs/examples/new-jobs-posted-today-us" rel="noopener noreferrer"&gt;new US jobs posted today&lt;/a&gt;, &lt;a href="https://apify.com/trap_check/career-site-jobs/examples/remote-software-engineer-jobs-salary" rel="noopener noreferrer"&gt;remote software jobs with salary&lt;/a&gt;, &lt;a href="https://apify.com/trap_check/career-site-jobs/examples/daily-new-jobs-feed" rel="noopener noreferrer"&gt;daily new + closed feed&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>webscraping</category>
      <category>jobs</category>
      <category>datasets</category>
    </item>
    <item>
      <title>How to fill a niche job board with fresh jobs from company career sites (and remove filled ones automatically)</title>
      <dc:creator>Chris O'Connor</dc:creator>
      <pubDate>Mon, 09 Nov 2026 03:36:17 +0000</pubDate>
      <link>https://dev.to/anointedxwolf/how-to-fill-a-niche-job-board-with-fresh-jobs-from-company-career-sites-and-remove-filled-ones-kph</link>
      <guid>https://dev.to/anointedxwolf/how-to-fill-a-niche-job-board-with-fresh-jobs-from-company-career-sites-and-remove-filled-ones-kph</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: this uses &lt;a href="https://apify.com/trap_check/career-site-jobs" rel="noopener noreferrer"&gt;Career Site Jobs&lt;/a&gt;, a tool I built. The approach works with any source that gives you new and closed jobs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every niche job board hits the same wall: employers don't post enough paid listings at first, so the board looks empty, so job seekers don't come back, so employers don't post. The usual fix is &lt;strong&gt;backfill&lt;/strong&gt;: fill the board with real jobs from elsewhere until paid listings take over.&lt;/p&gt;

&lt;p&gt;The catch is that most backfill comes from big aggregators, which means duplicates, agency reposts and jobs that were filled weeks ago. Here's how to backfill straight from employers' own career sites instead, in about 40 lines of Python, with filled jobs removed automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why career sites
&lt;/h2&gt;

&lt;p&gt;Companies post jobs on their own careers page first: Greenhouse, Workday, Lever, Ashby, iCIMS and the rest. That page links to the real apply form, and the job disappears from it when the role is filled. So if you mirror career sites, your board stays as fresh as the employers' own pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: describe your niche as a search
&lt;/h2&gt;

&lt;p&gt;Say your board is "remote data jobs in the US." As a search, that's:&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;"keywords"&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;"data engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data analyst"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"analytics engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&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;"US"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workplaceTypes"&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;"remote"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"onlyNewSinceLastRun"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeClosedJobs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feedName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-board"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&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;ul&gt;
&lt;li&gt;
&lt;code&gt;keywords&lt;/code&gt; match job titles (a job matches if its title has all the words of any keyword).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onlyNewSinceLastRun&lt;/code&gt; makes each run return only jobs that appeared since your previous run.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;includeClosedJobs&lt;/code&gt; adds the jobs employers took down since then, marked &lt;code&gt;"status": "closed"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;feedName&lt;/code&gt; keeps your place even if you tweak the filters later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it once in the browser first: &lt;a href="https://apify.com/trap_check/career-site-jobs/examples/daily-new-jobs-feed" rel="noopener noreferrer"&gt;the daily feed search&lt;/a&gt; has this set up. The first run returns everything that matches today, which is your initial backfill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: sync it into your board every day
&lt;/h2&gt;

&lt;p&gt;Install the client: &lt;code&gt;pip install apify-client&lt;/code&gt;. Then:&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;os&lt;/span&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="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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_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;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;data analyst&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;countries&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;US&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;workplaceTypes&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;onlyNewSinceLastRun&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;includeClosedJobs&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;feedName&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;my-board&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;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&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;trap_check/career-site-jobs&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="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;job&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;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;closed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;remove_from_board&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;          &lt;span class="c1"&gt;# your code: unpublish it
&lt;/span&gt;        &lt;span class="n"&gt;removed&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;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;upsert_on_board&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;                     &lt;span class="c1"&gt;# your code: insert or update by id
&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;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;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;                  &lt;span class="c1"&gt;# stable, use it as your key
&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;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;company&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;company&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;location&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;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;remote&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="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;workplaceType&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;salary&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="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;salary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;      &lt;span class="c1"&gt;# e.g. "$120k–150k / yr", when posted
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;posted_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;job&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;postedAt&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;apply_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;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;span class="c1"&gt;# the employer's own apply page
&lt;/span&gt;        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="nf"&gt;print&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;added &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, removed &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;removed&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;remove_from_board&lt;/code&gt; and &lt;code&gt;upsert_on_board&lt;/code&gt; are wherever your board keeps jobs: a database table, a WordPress job plugin's API, Airtable, a JSON file your static site builds from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: run it daily
&lt;/h2&gt;

&lt;p&gt;Pick one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cron or GitHub Actions:&lt;/strong&gt; run the script once a day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No code:&lt;/strong&gt; in Apify, save the search as a task, add a daily schedule, and connect the results to Zapier, Make or a webhook that posts into your board.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;$3 per 1,000 jobs returned, and $1 per 1,000 closed jobs. A niche board pulling 100 new jobs a day pays about $9 a month. Apify's free monthly credit covers about 1,600 jobs, which is enough to test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips from running this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start narrow.&lt;/strong&gt; A board with 300 relevant jobs beats one with 30,000 random ones. Use &lt;code&gt;excludeKeywords&lt;/code&gt; (e.g. "senior", "sales") to trim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Label backfilled jobs.&lt;/strong&gt; Many boards show them with a small "via company site" tag and rank paid listings above them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the apply link pointing to the employer.&lt;/strong&gt; It's what job seekers want, and it's what makes backfill legitimate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check coverage for your niche first.&lt;/strong&gt; Search a few employers you'd expect on your board by name, using the &lt;code&gt;companies&lt;/code&gt; field.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd rather look at the data before writing code, here's a &lt;a href="https://github.com/AnointedxWolf/career-site-jobs-sample" rel="noopener noreferrer"&gt;free CSV of 31,752 jobs posted in one day&lt;/a&gt;.&lt;/p&gt;

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