← all tools
Data & sourcing

TheirStack

Find the companies that are hiring, right now.

Cost per call0.9–2.7 cr / result
Your own keyoptional
CategoryData & sourcing

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.

things you can ask for

  • Who is hiring Java developers in Dublin this month, and who are the hiring managers per Apollo?
  • Take the companies that ramped hiring in the last 60 days and get direct dials from Lusha
  • Which of my accounts posted roles recently? Push them into Bullhorn as BD opportunities
  • What is this company's stack, and does BuiltWith agree?

works well with TheirStack

  • Apollo

    turn a hiring company into a named hiring manager

  • Lusha

    direct dials for the people behind the posting

  • PredictLeads

    the funding round usually lands before the job posting does

  • BuiltWith

    a second read on the technology signal

  • SourceWhale

    run the BD outreach straight off the hiring signal

Skills that use TheirStack

A skill is a whole pipeline your agent already knows. These ones call TheirStack as part of the run.

signal5 steps

Hiring sprint → competitor poach

TheirStack flags 50+ open roles. Poach displaced talent via Apollo + Lusha into Lemlist.

coming soon
compose5 steps

Candidate on the desk → 15-company spec campaign

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.

coming soon

What your agent reads before it touches TheirStack

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 →
Show the raw playbookwritten for the agent

HOW in lib/theirstack.py. Paths CONFIRMED from theirstack.com/en/docs (2026-06-01); index: reference/docs/theirstack/raw/endpoints.md.

Auth & config

  • Base URL: https://api.theirstack.com · Auth: Authorization: Bearer <token> (env THEIRSTACK_API_KEY, from app.theirstack.com/settings/api-key; never hardcode).
  • Pagination: page (0-based) + limit (or offset + limit), in the POST body for searches; include_total_results: false for faster large pulls.

Operations

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().

⚠️ Credits + guardrail

  • jobs search = 0.9 credits/job returned; companies search / technographics / buying-intents = 2.7 credits/company. Catalog + billing are free.
  • Pilot first: for company search use 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.
  • Avoid re-pulling the same jobs across runs: filter posted_at_max_age_days and dedupe on job id.

Handoff

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.

Callable surface — lib/theirstack.py

Import: 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.