Documentation · page 7 of 7
This page says where each part of StartupGraph comes from, how a fact is checked before we call it verified, which sites we do not read and why, and what is not right yet. It describes the code that answers the API today. The matching rules in full are on Contributing facts, and how much is on file is on What the data covers.
import_source. A field whose value came from an importer reads status: "imported" and verified: false in fields on GET /api/companies/{slug}: no check of ours stands behind it. A funding round works the same way: each round has verified and status on GET /api/companies/{slug}, /funding, GET /api/funding-rounds and the MCP tools. status is one of verified, unverified, imported: verified when a verified funding round fact stands behind the round (it put the round on file, or it states the same company, day and type), unverified when a contributed fact put it on file and has not verified, and imported when an importer wrote it and no fact has checked it. verified is true only for verified. An imported round's source_url is the link the importer stored, which our verifier has not read (#571).POST /api/facts, MCP submit_fact) or a new company (POST /api/companies). The fact is checked against that page, as below.quality_pause, when more than 10% of its newest 200 decided facts were leads or rejected, or more than 2% were answered with a server error, once at least 50 are decided.Asked with added_since or sort=added, GET /api/companies says which of the three added each company in added_by: imported, contributed or system.
Some companies came from a Wikipedia list, not from a page about the company. Each imported field then cites the list it came from (#568):
acquired_by. Where we have no record of which list, source_url is null and source says the list was not recorded.Before this, every Wikipedia row linked to a page built from the company's name, which often did not exist or was about something else. The stored rows did not change; the answer is built differently.
Some sources' terms forbid what we do with their data. We stopped the importers that read them (#557). Nothing schedules them, their commands refuse to run and say why, and a job already queued ends without fetching.
| Source | Why it is stopped |
|---|---|
| TechCrunch (funding rounds, news, discovery) | Personal, non-commercial use only, and no automated copying. |
| Y Combinator | Its terms forbid scraping and commercial use. |
| Crunchbase (discovery) | No storing or redistributing its data without written consent. |
| Wellfound | Its terms forbid harvesting and commercial use. |
| Product Hunt | Its API "must not be used for commercial purposes". |
| OpenCorporates | Free keys are for journalists, NGOs and academics, and the data is share-alike (ODbL). |
| LinkedIn (headcounts) | The User Agreement forbids scraping. |
For Crunchbase only the discovery importer is stopped. Importing a Crunchbase export file that a person supplies still runs, and is under review (#560).
The rows these importers wrote earlier are still on file and still served. Replacing those values from sources we can use is open (#260), and so is whether to keep the funding rounds read from TechCrunch (#465). The Hacker News importer is not stopped. The GitHub trending importer no longer reads the trending page; it asks the GitHub search API for the most-starred new repositories.
verified: false, and is checked in the background. Whether to hold every fact back until it is verified is open (#363, #364).find-and-update.company-information.service.gov.uk (Companies House), ycombinator.com, techcrunch.com, ft.com, theinformation.com, prnewswire.com, fortune.com, forbes.com, cnbc.com, theverge.com and wired.com. So is one on the company's own website, under the rules below.needs_second_source). See Held claims.source_unreachable: kept as a lead, not served, no strike.verified flag. It does not yet say whether the source was the company's own word, one accepted page, or two people agreeing (#277).The website we trust for a company is accepted on its own for facts about that company. Never a website that is still being claimed. These rules decide what counts as the company's own site:
crunchbase.com, wellfound.com, producthunt.com, pitchbook.com and others), app stores (apps.apple.com, play.google.com), hosts where anyone can get a page (github.io, vercel.app, sites.google.com, linktr.ee), social sites, and parked domains. The host is matched in full, so sites.google.com is never anyone's own site while google.com is still Google's. If a company's website on file is a page on one of these hosts, no other page there counts as the company's word: a stranger's page on crunchbase.com that names the company and the claim is held for a second source.website or investor_website fact, or a tip, on one of these hosts answers 422 website_not_own_site. Nothing is stored and it does not count against the key's daily limit. A short, fixed list in the code covers the few companies that are one of these sites, such as Y Combinator on ycombinator.com and GitLab on gitlab.com. Nothing a contributor sends can add to that list.A claim we could not verify yet is held, not dropped, in one of three states:
needs_second_source: the page states the claim, but the site is not accepted on its own. It is served, marked unverified. It is verified when a different person sends the same claim citing a different site, or when its sender sends it again citing an accepted site that states it. Two keys on one email are one person, and two pages on one site are one site.source_unreachable: a lead whose page we could not open after the tries above.The sender can give a held claim a better page by sending the same claim again with a different link. We check it against the fact on file right away. At most 3 new pages are checked for one fact, each once; a page we could not open can be sent again after 24 hours. When a fact takes a new page, the page it cited before is kept in our records and is not served.
These sites refuse every request our verifier makes: Business Wire (businesswire.com), GlobeNewswire (globenewswire.com), Reuters (reuters.com), Axios (axios.com), Bloomberg (bloomberg.com), The Wall Street Journal (wsj.com) and the SEC (sec.gov). So the verifier never fetches them. A fact citing one reads source_unreachable on its first check. That is not a rejection: the refusal says nothing about the claim, so there is no strike. None of them is on the list of sites accepted on its own. Sent again as a better page for a held claim, one of them is answered at once and does not use up one of those pages. To get such a claim verified, cite another page that states it, such as the company's own announcement.
* and for each of ClaudeBot, Claude-Web, anthropic-ai, Claude-User and Claude-SearchBot. A robots.txt that answers 404 allows everything. Any other failure counts as no.techcrunch.com (its robots.txt), prnewswire.com (its terms), fortune.com (its terms), cnbc.com (its robots.txt) and forbes.com (its robots.txt), plus every site that refuses us.companies-house, crunchbase (a file a person supplies), edgar, github, github-orgs, wikipedia, wikipedia-acquisitions, wikipedia-categories and wikipedia-defunct, plus Hacker News discovery. None of them checks robots.txt or the lists above, and the EDGAR importer reads sec.gov, which refuses the verifier. This is open (#576).So for TechCrunch: a TechCrunch page a person cites still verifies a fact, our importer no longer reads TechCrunch, and the API's own fetching never goes there.
synthetic_history on /headcount is that seed data, not evidence; snapshots carry a source.To correct a value, send it as a fact with a public page that states it (Contributing facts). It is checked like any other. If you think we got a check wrong, write to hello@startupgraph.dev.
GET /api/companies/{slug}: fields gives each value with its source_url, source, verified and status.GET /api/companies/{slug}/facts: the contributed facts on file that you may read, with their status.GET /api/changes: every fact applied, verified or rejected, in order.GET /api/coverage and GET /api/pulse: how much is on file and what landed recently.Every call is in the reference.