# TAM Graph Find any type of company, at scale. Describe the companies you need in plain English; an agent searches hundreds of niche datasets (60M+ company records), runs lookalike matching over company embeddings, and deep-scrapes the live web on demand until the list is complete, then delivers it by email and API — usually within 24 hours. Ask for the people at those companies and you get contacts instead: one row per person, with title and email. The underlying datasets are also queryable directly. Flat rate: no seats, no per-record pricing, no credits. The email finder is included and unlimited under fair use. Base URL: https://api.tamgraph.com ## Auth Pass your API key in the `X-API-Key` header on every request. Sign up at https://api.tamgraph.com/login and your key is issued instantly; add a card on the dashboard to activate the trial — 50 API requests, lifetime, at the full Pro speed of 5 requests/second, and the card is never charged during the trial. Without a card, or once the 50 are gone, requests return 402. One paid plan, Pro, $199/month at https://api.tamgraph.com/dashboard: everything — company and contact search across the main index and every niche index, the email finder and exports, through the site, this API and MCP. No record caps and no credits; fair use is 5 requests/second and 500,000 records/day. ## Agent search (start here) - POST /v1/find — body: {"query": "", "notify_email": "you@company.com" (optional; defaults to your account email), "limit": 500 (optional; how many rows you want, 1-5000 — omit it to get every matching company up to the row cap)}. Returns {"job_id", "status": "queued", "eta": "within 24 hours"}. The search is asynchronous and can take up to 24 hours; the finished list arrives by email and stays available via the API. Each one runs an agent, so they are capped per day: 3/day on trial, 25/day on Pro. Over the cap returns 429. - GET /v1/find/{job_id} — status of a search you submitted ({"job_id", "status", "query", "notify_email", "created_at", "eta"}; once done also "result_count", "summary", "csv_url"). Jobs belonging to another key return 404. - GET /v1/find/{job_id}/csv — download the finished list as CSV. - GET /v1/find/{job_id}/results?limit=100&cursor= — the same list as JSON, paginated. Returns {"job_id", "status", "count", "total", "results", "next_cursor"}; pass next_cursor back as cursor until it comes back null. Lists finished before row-level storage existed return 409 — use /csv. Queries can be as niche as the data allows, e.g. "companies that sponsored a newsletter in the last 6 months", "B2B SaaS doing $1-10M ARR", "startups that raised a seed round this quarter", "Shopify stores doing $500k+/yr that use Klaviyo", "companies hiring SDRs right now", "agencies in Texas with 11-50 employees", "dentists in Florida with 200+ Google reviews". Describe people and you get contacts: "CMOs at US SaaS companies between $1M and $10M ARR", "founders of Shopify agencies in the UK". The agent builds the company list first, then finds the people at those companies. Each contact row has full_name, title, company, and an email with an `email_status` column: `verified_source` for an email from our verified data, `pattern_guess` or `reported_format_guess` for one built from the domain's naming pattern, `none` when we have no address. A guess is always labeled as a guess. A domain works as a description too: "companies similar to coinbase.com" or "lookalikes of these 20 customers: " runs a vector-similarity search over company embeddings and returns the nearest matches, ranked. Say how many you want with the `limit` parameter rather than writing a count into the query text — the prose describes who you want, `limit` says how many. When the answer isn't already in the graph, the agent scrapes it fresh from the live web inside the search window — which is why a run can take hours rather than milliseconds. ## Direct dataset endpoints - GET /v1/datasets — catalog of directly queryable datasets with sizes, allowed filters, and query hints. Machine-readable; read it before filtering. - POST /v1/search/{dataset} — body: {"filters": {...}, "limit": 25, "cursor": null}. Datasets: companies (36M global companies), local (2.3M US local businesses with emails), places (7.2M US local businesses scraped from Google Maps, with category, city/state, phone and rating), ecommerce (2.9M online stores with revenue estimates and installed apps), startups (1.7M companies with funding data), saas (170k SaaS companies). Filters support exact values, lists (OR), and _gte/_lte suffixes on numeric/date fields. Unknown filter fields return 400 with the allowed list. Paginate by passing next_cursor back as cursor; no depth limit. - GET /v1/company/{domain} — merged record for one company across all datasets, including generic emails and email pattern when known. All of it is database-held and unlimited under fair use. - GET /v1/email-pattern/{domain} — email naming pattern (e.g. first.last), generic inboxes, MX records. Database-held; no record cost on Pro. ## Examples curl -X POST https://api.tamgraph.com/v1/find \ -H "X-API-Key: $KEY" -H "Content-Type: application/json" \ -d '{"query": "B2B SaaS companies doing $1-10M ARR that sponsor newsletters"}' curl -X POST https://api.tamgraph.com/v1/search/ecommerce \ -H "X-API-Key: $KEY" -H "Content-Type: application/json" \ -d '{"filters": {"platform": "Shopify", "country": "US", "monthly_sales_gte": 100000}, "limit": 5}' ## Notes - POST /v1/find is the right call when the list you want doesn't map cleanly onto one dataset's filters. Use the dataset endpoints when it does and you want results in the same request. - Responses omit empty fields. All company records share one core schema (domain, name, linkedin_url, country, region, locality, industry, employee_range/employee_count, founded, emails, socials) plus a dataset-specific extension block (local / ecommerce / startup / saas). - On Pro, usage is metered on records returned — requests that return zero results are free. On the trial it is metered in whole requests: each call to /v1/search, /v1/company, /v1/email-pattern or /v1/find/{id}/results spends one of the 50, and /v1/datasets and job-status polls spend nothing. Rate limit: 5 requests/second on both. The email finder is unlimited under fair use — no credits. - Query timeout: 20s. - OpenAPI spec: https://api.tamgraph.com/openapi.json ## Pages - https://tamgraph.com/pricing — the two plans, limits and billing - https://tamgraph.com/faq — common questions about coverage, access and limits - https://tamgraph.com/about — what TAM Graph is and who it is for - https://tamgraph.com/blog — how-to posts on querying the API and the MCP server - https://tamgraph.com/best-b2b-lead-database — B2B lead databases compared - https://tamgraph.com/best-b2b-data-api — B2B data APIs compared - https://tamgraph.com/best-b2b-contact-database — B2B contact databases compared - https://tamgraph.com/best-lead-enrichment-api — lead enrichment APIs compared - https://tamgraph.com/terms — terms of service - https://tamgraph.com/privacy — privacy policy - https://tamgraph.com/contact — hello@tamgraph.com