TheirStack watches live job postings across the web. A company posting roles has budget, growth and a hiring problem, which makes it a candidate pool and a business development target at the same time. It reports what technology each one runs, too.
TheirStack starts a pipeline from a signal rather than a list. It names the company; enrichment finds the person to call.
turn a hiring company into a named hiring manager
direct dials for the people behind the posting
the funding round usually lands before the job posting does
a second read on the technology signal
run the BD outreach straight off the hiring signal
A skill is a whole pipeline your agent already knows. These ones call TheirStack as part of the run.
TheirStack flags 50+ open roles. Poach displaced talent via Apollo + Lusha into Lemlist.
Read the CV with claude, map who would actually want them via TheirStack + Apollo, name the hiring manager via Prospeo, send the anonymized profile through Instantly. Stops at the reply.
Every tool ships with a written playbook, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the TheirStack docs →HOW in lib/theirstack.py. Paths CONFIRMED from theirstack.com/en/docs (2026-06-01); index: reference/docs/theirstack/raw/endpoints.md.
https://api.theirstack.com · Auth: Authorization: Bearer <token> (env THEIRSTACK_API_KEY, from app.theirstack.com/settings/api-key; never hardcode).page (0-based) + limit (or offset + limit), in the POST body for searches; include_total_results: false for faster large pulls.Signals: search_jobs (POST /v1/jobs/search), search_companies (POST /v1/companies/search), company_technographics (POST /v1/companies/technologies), company_buying_intents. Free: credit_balance, catalog_industries, catalog_locations, catalog_keywords, list_company_lists, get_company_list, create_company_list. Long tail (saved-searches, webhooks, datasets, list add/remove/export, more catalog) → request().
blur_company_data=True (free obfuscated preview) to validate filters before a real (credited) pull; for jobs use a tiny limit + posted_at_max_age_days. Check credit_balance() before bulk; gate large pulls behind approval.posted_at_max_age_days and dedupe on job id.Signal/sourcing layer: find companies actively hiring (search_jobs/search_companies) → enrich tech/intent (company_technographics/company_buying_intents) → hand domains/companies to the enrichment tools (find contacts) → sequence → ATS. Pairs with [[apify]]/[[serper]]/[[exa]] on the discovery side.
lib/theirstack.pyImport: from lib.theirstack import TheirStack → instantiate TheirStack() (reads key from env). Base: https://api.theirstack.com. Generic passthrough: request(method, path, *, params, json).
catalog_industries(*, industry: str | None = None, page: int = 0, limit: int = 25) -> Any — GET /v0/catalog/industries — industry codes (+job/company counts). Free. LinkedIn Industry Codes V2.catalog_keywords(**params) -> Any — GET /v0/catalog/keywords — technology/keyword slugs (free; use slugs in *_technology_slug_or filters).catalog_locations(**params) -> Any — GET /v0/catalog/locations — location reference data (free).company_buying_intents(*, company_domain: str | None = None, company_name: str | None = None, company_linkedin_url: str | None = None, **extra) -> Any — POST /v1/companies/buying_intents — buying-intent topics detected for a company (2.7 credits).company_technographics(*, company_domain: str | None = None, company_name: str | None = None, company_linkedin_url: str | None = None, **extra) -> Any — POST /v1/companies/technologies — technologies a company uses (2.7 credits).create_company_list(payload: dict) -> Any — POST /v0/company_lists — create a company list.credit_balance() -> Any — GET /v0/billing/credit-balance — remaining credits (free, safe read-only pilot).get_company_list(list_id: str | int) -> Any — GET /v0/company_lists/{id}.list_company_lists(**params) -> Any — GET /v0/company_lists — all company lists for the team.search_companies(filters: dict | None = None, *, page: int = 0, limit: int = 25, blur_company_data: bool | None = None, **extra) -> Any — POST /v1/companies/search — company search. 2.7 credits per company returned.search_jobs(filters: dict | None = None, *, page: int = 0, limit: int = 25, **extra) -> Any — POST /v1/jobs/search — hiring-signal job search. 0.9 credits per job returned.