Fill & enrichment
Description, LinkedIn page, funding and pay — completed with evidence.
Fill takes a bare company row and completes it — with no model and no guessing. Whatever it can't prove it leaves empty, and writes down why.
What one fill does#
- Read the descriptionCandidates from the homepage's meta tags, JSON-LD and first paragraphs, then the About page, then the LinkedIn About text. Each passes the description guardrail (60–600 characters, about this company, not boilerplate); the best one is stored with its source.
- Find the LinkedIn pageThe company's own homepage usually links its LinkedIn page — that link is kept even when LinkedIn itself is unreadable. When the page can be read (as a guest), size band, founding year and a jobs count are added. Since 23 Oct 2026 every scrape that comes across a company's LinkedIn link stores it the same way — normalised, with its source, never overwriting a different value silently — because the People tab can only be bought for a company whose LinkedIn page is known.
- Prove hiring
careers.run_company()looks for any careers page or board and reads its roles. Any open role on their own page counts as proof. See Hiring proof. - Find the fundingRound, amount, date and investors from a keyless search, each validated (a real amount, not debt; a date not in the future; a quote that names the company).
- Record what is missing, and whyEvery gap gets a reason in
fill_state— “roles only on instahyre.com (an aggregator)”, “site blocks readers”, “no careers page anywhere on their site” — shown on the dashboard after a fill.
When it runs#
| Trigger | Scope |
|---|---|
| Every free tick | Up to 20 companies, ★ list → India → remote; a company is refilled after 7 days (30 once complete). |
| Today’s company (Best bets) | “Fill it”, or decide fill — then the brain decides it again |
| Opening a company page | That company, unless complete or filled in the last 6 hours |
| Fill now (Graph page) | That company, now — the result says what is still missing and why |
| The Apify job, every 30 minutes | First, for free: up to 30 homepages read for their LinkedIn link (★ list, Bengaluru / Hyderabad and the remote targets) |
| A mixer run | The LinkedIn page the company’s own job ads agree on |
| fill.backfill_linkedin() | By hand: the LinkedIn link from every homepage in those cohorts (776 found on 19 Oct 2026) |
Enrichment with models#
Separately, the paid tick fills what needs reading comprehension — a company's story, a better description, stipend and PPO mentions — through enrich.py, inside the model budget. Pay from levels.fyi is read through scrape.do (levels.py) and converted to fresher ₹ LPA.
Evidence on every field#
Each written value records its evidence, source URL, channel, time and confidence in field_meta. When two sources agree, confidence rises; when they disagree, the better-evidenced value wins and the loser is kept as a rejection with the reason “conflict”. Nothing is silently overwritten.