Skip to content
The pipeline

The mixer

Decide first, then buy: free layers narrow the field, Apify fills only what is missing.

Decide first, then scrape. The mixer (jobhunter/mixer.py) narrows the companies with free checks, and only the few that survive — and still lack something only a paid lookup can tell — get their job ads bought from Apify. It never runs on a schedule: it spends only when you press the button or run the command.

The free layers#

Nothing is bought until a company has passed all of these, in order. Each one costs nothing.

LayerPasses when
1 · Pay powerIts pay power is pays, deep pockets or funded — or it states pay (or a PPO) at the India floor
2 · LocationIt sits in a decision pool: Bengaluru, Hyderabad, or Remote (a role open to someone in India)
3 · No DSAIndia only: how DSA-heavy its interviews look is under 0.5. Remote tolerates DSA
4 · The brainThe decision brain says target or fill first
5 · Not bought latelyIt was not bought in the last 14 days
6 · Needs paid dataSomething is genuinely missing: fresh ads, stated pay, or (in India) a culture rating

The funnel as it stood on 23 Oct 2026:

Decided by the brain2,479
Pay power passes593
In a pool593
No DSA (India)572
Target or fill first495
Not bought in 14 days494
Still needs paid data309

Survivors are queued best chance of an offer first, taking Bengaluru, Remote and Hyderabad in turn so each pool gets its share. A run buys the next two (mixer.per_run).

The paid layers#

  1. LinkedIn ads
    Every LinkedIn job ad from the company, in its own city (for Remote, ads open to India). If the company has no ad there, it stops here — nothing more is bought for it. The ads also name the company's LinkedIn page, which is kept (see Fill).
  2. Naukri ads (India only)
    Bought only while pay or culture is still unknown. Naukri ads state pay more often, and carry the company's AmbitionBox rating — the culture signal the brain reads (under 3.0/5 on ten or more reviews is a skip in India).
  3. Back through the brain
    Every ad is matched to the company by name before it is kept (a keyword search returns other employers too), goes through the same relevance gate and store as any scraper, then the roles are re-scored and the brain decides again. The run reports each company's chance of an offer before and after.

The money#

SettingValueMeaning
mixer.daily_usd$0 (since 24 Oct 2026)The mixer’s own share of a day’s Apify spend. Zero: Apify is for referrals only, so the paid job-ad layers buy nothing; raise it to use them again
mixer.referral_reserve_usd$0.30It refuses to buy unless this much of today’s Apify cap stays free for referrals afterwards
actors.apify.daily_usd$0.60The whole day’s Apify cap, shared with the People-tab job
mixer.per_run · refresh_days2 · 14Companies per run · days before a company may be bought again
Referrals come first
Apify is paid for to find the people who can refer you. The mixer gets a small slice, and the reserve means it can never spend the money the People-tab job needs that day. When the reserve would be touched, the Buy nextbutton is disabled and the panel reads “not buying today: referrals first”. Every lookup goes into the same Apify ledger and 24-hour cache.

Where to use it#

Best bets → Companies has a Mixer panel: the layer-by-layer funnel with a sample of who each layer dropped and why, the next companies it would buy, a Buy next N (≈ $cost)button, and today's spend against the mixer's share and the reserve.

terminal
python scripts/run.py mixer plan        # the funnel and who would be bought next — spends nothing
python scripts/run.py mixer run         # buy the next companies, re-score, decide again
python scripts/run.py mixer run --company 2802 --company 3110   # buy these instead of the plan
python scripts/run.py mixer history     # every paid lookup: found, matched, saved, cost