Field Notes

Scrape Any LinkedIn Finance Role with Claude

Scrape Any LinkedIn Finance Role with Claude

Automate your linkedin job funnel in just a few steps for under $1 a month

Automate your linkedin job funnel in just a few steps for under $1 a month

Share:

Copy link

Copied!

Finding a job is a pain in the ass. Understanding what keywords to include, refreshing results daily, going into each job posting to find hidden salary information only to realize that they’re paying peanuts.

So I built a pipeline instead: a scraper pulls the raw postings, and a skill I wrote does the filtering and sorting — reading each listing against stated criteria and tiering the survivors.

This is a guide to setting the same thing up for yourself. This is NOT a guide to automate application submissions to stale jobs on Indeed with AI slop cover letters.


What you need

  • An Apify account, free tier included. Apify hosts a marketplace of web scrapers — LinkedIn, Instagram, Yelp, Airbnb, CrunchBase, and thousands more.

  • Claude Cowork, on desktop. The connector and skill-upload flow in this guide is Cowork-specific. The Apify connector does not work on the web version.

  • A skill file that defines the actor call, the filters, and the tiering logic.

  • A set of starting criteria. "Strategic finance manager jobs in New York City, posted in the last 30 days" is a fine place to start.


You can download the skill file here.


Without further ado, let's begin…


1. Create your Apify account

Go to apify.com and sign up. You’ll be auto-enrolled into the free tier which is all you’ll need. Apify provide $5 of credits/month which is more than enough.


2. Generate an API token

In Apify, go to Settings, then API & Integrations, then API tokens. Click Create a new token, give it a description you'll recognize (ex: "Claude Cowork"), and save it. Copy the token and hold onto it for the next step — you won't need it again after setup.


3. Connect Apify to Claude Cowork

Open Claude Cowork on desktop. Click your account, then Settings, then Connectors, then Add a new connector → Browse Connectors. Search for Apify and install it. The install asks for the API token — paste it in, then confirm the connector shows as enabled. And wallah — you’re ready to start scraping 😈


4. Upload the skill

In Cowork settings, click Skills, then Add Skills, then Upload a Skill, and select the file. But WAIT! Read the next section first — this is the step that determines whether the results match your search or not.


5. Customize the skill before you run it

The starter skill was built around an example search — strategic finance roles in NYC — and it carries details tuned to that. For instance, the search excludes NYC-specific staffing and recruiting firms active in that market, a geoId for the NYC metro, and filters out Director-and-above titles. Your search is going to need different values in at least two of those three places.

Notably, the skill draws a real distinction between hard-drop filters (companyExcludejobTitleExcludesubLocationExclude) which stop a job from ever entering the dataset, and soft-flag filters, which collect the job anyway and just tag it. Hard drops are where your customization lives, because that's what controls cost; every row a hard drop kills is a row you never pay Claude to read.

Two ways to make the edit:

  • Open the file and swap the exclusion list, the geoId, and the seniority band by hand.

  • Or paste the contents into a fresh Claude conversation and ask for the swap directly:

Here's a skill file I'm customizing for my own job search. Replace the companyExclude list, the geoId, and the seniority-band cutoffs with the following, and leave the rest of the structure intact: [your criteria here].

If you're searching outside the New York City metro, don't just swap the geoId; guessing a geoId doesn't error, it returns postings for the wrong metro, and every downstream step sits on bad data. For anywhere other than a geoId you've verified yourself, switch to a plain location string instead and sanity-check the first few returned location values before you trust the rest.


6. Run your first search

Ok, let’s take this for a spin. Open a new chat in Claude Cowork and give it your criteria:

Find me strategic finance manager jobs in New York City, posted in the last 30 days.

The skill runs each title as its own query rather than combining them — LinkedIn's matching degrades on long OR strings — so if you gave it more than one title, expect it to fan out into separate runs. It may also ask a clarifying question before it starts; answer it before it burns Apify credits on an misfired search.


7. Read the output

You'll get a Tier A table delivered inline — the direct matches, the actual answer — plus a Tier B summary of adjacent roles worth peeking at. Searching for strategic finance manager, Tier B is where an FP&A manager or corp dev posting lands: similar seniority, adjacent function, plausibly still relevant. Alongside both, you get a workbook with three tabs:

  • The full Job Results table (Tier A shaded, live links)

  • A Search Funnel tab showing raw-to-final counts per query

  • An Exclusion Rules tab logging exactly what got dropped and why.

The funnel number is the one to keep in mind as it tells you whether the search was too narrow before you go tweak anything.


Common errors, and how to fix them

The connector shows installed but nothing runs. Installed and enabled aren't the same. Check Connectors and confirm Apify is toggled on.

The run comes back with zero rows in under two seconds. The actor has a hard floor of 150 rows under pay-per-result billing, and if a row cap gets passed in the wrong field — callOptions.maxItems instead of input.maxItems — it aborts before scraping anything. There's no smaller test run available; 150 rows and roughly eleven cents is the minimum spend per query.

Results are full of staffing agencies and recruiter reposts. That's an unedited companyExclude list — you're seeing someone else's exclusions, tuned for someone else's market (i.e. you didn’t read carefully). Go back to step 5.

A salary field comes back as a single garbled number, like ["$10000"], on a posting that clearly lists a real band.That's the actor's parser mangling salaryInfo, not a bad posting. The skill reports it as "not listed" rather than passing through a number that would mislead — if you see a raw number that looks wrong, don't trust it at face value. You won’t make a million dollars as a manager at the Farmer’s Dog, sorry 🤷🏽‍♂️

A location you searched outside the verified NYC geoId comes back with postings that don't look local. Confirm you switched to a plain location string rather than guessing a geoId — a wrong geoId doesn't error, it just returns the wrong metro, and nothing downstream will catch it for you.

The output feels thin — very few rows survived filtering. Check the Search Funnel tab before assuming the market is dry. A phrasing returning under roughly 15 raw rows is usually a dead query, not an empty one; try a reordered version of the same title ("Strategic Finance Manager" vs. "Manager, Strategic Finance") before concluding nothing's out there.


Some closing thoughts.

This isn't a hiring pipeline but it's a better filter on the same postings everyone else you’re competing with is looking at. It won't write your resume, won't apply for you, and won't surface referral-only roles that never get publicly posted. What it does is take the part of the search that's pure repetitive attention — scanning a hundred-plus listings to find the dozen worth applying to — and hand it to something that runs the same filter every time with zero-to-no incremental effort from you.

Run it weekly with a seven-day lookback instead of thirty, and the cost will drop; you're paying for the delta, not re-deriving the same shortlist from scratch each time.

Good luck on your job search!

Published:

More to explore