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.
| Layer | Passes when |
|---|---|
| 1 · Pay power | Its pay power is pays, deep pockets or funded — or it states pay (or a PPO) at the India floor |
| 2 · Location | It sits in a decision pool: Bengaluru, Hyderabad, or Remote (a role open to someone in India) |
| 3 · No DSA | India only: how DSA-heavy its interviews look is under 0.5. Remote tolerates DSA |
| 4 · The brain | The decision brain says target or fill first |
| 5 · Not bought lately | It was not bought in the last 14 days |
| 6 · Needs paid data | Something is genuinely missing: fresh ads, stated pay, or (in India) a culture rating |
The funnel as it stood on 23 Oct 2026:
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#
- LinkedIn adsEvery 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).
- 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).
- Back through the brainEvery 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#
| Setting | Value | Meaning |
|---|---|---|
| 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.30 | It refuses to buy unless this much of today’s Apify cap stays free for referrals afterwards |
| actors.apify.daily_usd | $0.60 | The whole day’s Apify cap, shared with the People-tab job |
| mixer.per_run · refresh_days | 2 · 14 | Companies per run · days before a company may be bought again |
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.
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