> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to TheirStack

The TheirStack connector lets your AI agent act in each user's TheirStack account. Each user connects their own TheirStack access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 25 tools.

**Authentication:** Bearer Token
**Categories:** CRM & Sales
**Tools:** 25: 17 read, 7 write, 1 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=THEIRSTACK)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the TheirStack connection

   In **AgentKit > Connections**, create a TheirStack connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'theirstack'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize TheirStack:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'theirstack_get_company_buying_intents',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "theirstack"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize TheirStack:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="theirstack_get_company_buying_intents",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their TheirStack credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'theirstack_get_company_buying_intents',
  toolInput: {},
  connector: 'theirstack',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="theirstack_get_company_buying_intents",
    tool_input={},
    connection_name="theirstack",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `theirstack_get_company_buying_intents`

Get Company Buying Intents · Read-only

Look up the buying intent topics detected for one company from its job postings, such as projects, initiatives and tools it is investing in.
Returns each topic with confidence (low, medium, high), job counts, first and last dates found, and rank within its category.
Use get_company_buying_intents for the investment signals of one known company. Use get_company_technologies for its technology stack. Each lookup uses 3 API credits.
At least one of company_domain, company_name or company_linkedin_url must be set.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company_domain` (`string`, optional): Only return companies that match this domain exactly. It accepts full urls (https://www.google.com/) and emails (andrew@stripe.com).
- `company_id` (`string`, optional): Only return companies that match this TheirStack Company ID exactly. This ID is temporary and internal and will change in the future and become stable. Until then, it is only meant to be used internally by our UI (app.theirstack.com). For deduplication logic, use company_domain or company_linkedin_url instead.
- `company_linkedin_url` (`string`, optional): Return companies whose LinkedIn URL matches this URL exactly.
- `company_name` (`string`, optional): Only return companies that match this name exactly, case-sensitively.
- `confidence_or` (`array`, optional): Only return keywords (technologies or buying intent topics) detected with any of these confidence levels. Available values: "high", "medium", "low"
- `first_date_found_gte` (`string`, optional): Only return keywords (technologies or buying intent topics) where the first time they were found was after or on this date. Format: "YYYY-MM-DD"
- `include_total_results` (`boolean`, optional): When enabled, calculates and returns `total_results` and `total_companies` fields in the response. WARNING: This significantly slows down responses as it requires reading the entire dataset. Recommended usage: enable only for the initial request to get totals, then disable for subsequent pagination requests.
- `keyword_category_slug_or` (`array`, optional): Only return keywords from any of these categories. Case sensitive. Pass slugs. Check out all keyword categories at GET /v1/catalog/keywords/categories
- `keyword_parent_category_slug_or` (`array`, optional): Only return keywords from any of these parent categories. Case sensitive. Pass slugs. Check out all keyword categories at GET /v1/catalog/keywords/categories
- `keyword_slug_or` (`array`, optional): Only return these keywords (technologies or buying intent topics). Case sensitive. Pass slugs. Check out all keywords at GET /v0/catalog/keywords
- `last_date_found_gte` (`string`, optional): Only return keywords (technologies or buying intent topics) where the last time they were found was after or on this date. Format: "YYYY-MM-DD"
- `limit` (`integer`, optional): Number of results per page
- `max_jobs` (`integer`, optional): Maximum number of jobs in which each company mentions the keyword (technology or buying intent topic)
- `min_jobs` (`integer`, optional): Minimum number of jobs in which each company mentions the keyword (technology or buying intent topic)
- `offset` (`integer`, optional): Number of results to skip. Required for offset-based pagination.
- `page` (`integer`, optional): Page number. Required when using page-based pagination.

Example input: `{}`

### `theirstack_get_company_list`

Get Company List · Read-only

Get one company list by ID.
Returns the list's name, owner, type, creation date and number of companies. The companies themselves are not included.
Use get_company_list for list details. Use list_companies_in_list to read the companies in it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `list_id` (`integer`, required): ID of the company list. Use list_company_lists to find it.

Example input: `{"list_id":1}`

### `theirstack_get_company_technologies`

Get Company Technologies · Read-only

Look up the technologies one company uses, detected from its job postings.
Returns each technology with confidence (low, medium, high), job counts, first and last dates found, and rank within its category.
Use get_company_technologies to see the tech stack of one known company. Use search_companies to find companies by technology. Each lookup uses 3 API credits.
At least one of company_domain, company_name or company_linkedin_url must be set.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company_domain` (`string`, optional): Only return companies that match this domain exactly. It accepts full urls (https://www.google.com/) and emails (andrew@stripe.com).
- `company_id` (`string`, optional): Only return companies that match this TheirStack Company ID exactly. This ID is temporary and internal and will change in the future and become stable. Until then, it is only meant to be used internally by our UI (app.theirstack.com). For deduplication logic, use company_domain or company_linkedin_url instead.
- `company_linkedin_url` (`string`, optional): Return companies whose LinkedIn URL matches this URL exactly.
- `company_name` (`string`, optional): Only return companies that match this name exactly, case-sensitively.
- `confidence_or` (`array`, optional): Only return keywords (technologies or buying intent topics) detected with any of these confidence levels. Available values: "high", "medium", "low"
- `first_date_found_gte` (`string`, optional): Only return keywords (technologies or buying intent topics) where the first time they were found was after or on this date. Format: "YYYY-MM-DD"
- `include_total_results` (`boolean`, optional): When enabled, calculates and returns `total_results` and `total_companies` fields in the response. WARNING: This significantly slows down responses as it requires reading the entire dataset. Recommended usage: enable only for the initial request to get totals, then disable for subsequent pagination requests.
- `keyword_category_slug_or` (`array`, optional): Only return keywords from any of these categories. Case sensitive. Pass slugs. Check out all keyword categories at GET /v1/catalog/keywords/categories
- `keyword_parent_category_slug_or` (`array`, optional): Only return keywords from any of these parent categories. Case sensitive. Pass slugs. Check out all keyword categories at GET /v1/catalog/keywords/categories
- `keyword_slug_or` (`array`, optional): Only return these keywords (technologies or buying intent topics). Case sensitive. Pass slugs. Check out all keywords at GET /v0/catalog/keywords
- `last_date_found_gte` (`string`, optional): Only return keywords (technologies or buying intent topics) where the last time they were found was after or on this date. Format: "YYYY-MM-DD"
- `limit` (`integer`, optional): Number of results per page
- `max_jobs` (`integer`, optional): Maximum number of jobs in which each company mentions the keyword (technology or buying intent topic)
- `min_jobs` (`integer`, optional): Minimum number of jobs in which each company mentions the keyword (technology or buying intent topic)
- `offset` (`integer`, optional): Number of results to skip. Required for offset-based pagination.
- `page` (`integer`, optional): Page number. Required when using page-based pagination.

Example input: `{}`

### `theirstack_get_credit_balance`

Get Credit Balance · Read-only

Get the team's current TheirStack credit balance.
Returns UI credits and API credits available, credits used in the current billing cycle, and the earliest expiration date.
Use get_credit_balance before large searches to check available credits. This call is read-only.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `theirstack_get_saved_search`

Get Saved Search · Read-only

Get one saved search by ID.
Returns its name, type, filters, email alert settings and whether a webhook is active on it.
Use get_saved_search for one known search. Use list_saved_searches to browse them all.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `search_id` (`integer`, required): ID of the saved search. Use list_saved_searches to find it.

Example input: `{"search_id":1}`

### `theirstack_list_companies_in_list`

List Companies In List · Read-only

List the companies in one company list, with sorting and name filtering.
Returns each entry with company name, the date it was added, the date it was revealed, and the company profile.
Use list_companies_in_list to read the contents of a list. Use get_company_list for list details only.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `list_id` (`integer`, required): ID of the company list. Use list_company_lists to find it.
- `company_name_partial` (`string`, optional): Pass a partial company name to filter the list of companies
- `limit` (`integer`, optional): Number of results per page
- `offset` (`integer`, optional): Number of results to skip. Required for offset-based pagination.
- `order_by` (`string`, optional): Order by field. One of: `revealed_at`, `name`.
- `order_direction` (`string`, optional): Order direction. One of: `asc`, `desc`.
- `page` (`integer`, optional): Page number. Required when using page-based pagination.

Example input: `{"list_id":1}`

### `theirstack_list_company_countries`

List Company Countries · Read-only

List countries with the number of companies headquartered in each.
Returns each country with ISO 2-letter code, country name and company count.
Use list_company_countries to find headquarters country codes for company filters. Use list_job_countries for job locations instead. The call is free.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `country` (`string`, optional): Name of a country. Will return the country matching their name in English
- `limit` (`integer`, optional): Number of results per page
- `page` (`integer`, optional): Page number.

Example input: `{}`

### `theirstack_list_company_lists`

List Company Lists · Read-only

List all company lists of the team.
Returns each list with id, name, type, number of companies, creation date and owner.
Use list_company_lists to find a list ID before get_company_list, list_companies_in_list, add_companies_to_list or rename_company_list.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `theirstack_list_industries`

List Industries · Read-only

List industries (LinkedIn Industry Codes V2), searchable by name.
Returns each industry with id, name, hierarchy, description, parent id, and the number of companies and jobs in it.
Use list_industries to find the IDs that the industry_id_or and industry_id_not filters of search_companies expect. The call is free.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `industry` (`string`, optional): Name of an industry, case-insensitive. Will return industries that contain the given string either in their name, hierarchy or description
- `limit` (`integer`, optional): Number of results per page
- `page` (`integer`, optional): Page number.

Example input: `{}`

### `theirstack_list_job_countries`

List Job Countries · Read-only

List countries with the number of jobs located there and the number of companies hiring there.
Returns each country with ISO 2-letter code, country name, job count and company count.
Use list_job_countries to find job country codes and gauge hiring volume per country. Use list_company_countries for headquarters counts instead. The call is free.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `country` (`string`, optional): Name of a country. Will return the country matching their name in English
- `limit` (`integer`, optional): Number of results per page
- `page` (`integer`, optional): Page number.

Example input: `{}`

### `theirstack_list_keyword_categories`

List Keyword Categories · Read-only

List the main categories of technologies and buying intent topics.
Returns each category with name, slug, description, and the number of keywords and companies in it.
Use list_keyword_categories to browse categories and get slugs for category filters. Use list_keyword_subcategories for the next level down.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category_slug` (`string`, optional): Optional category slug to filter and return only a specific category

Example input: `{}`

### `theirstack_list_keyword_subcategories`

List Keyword Subcategories · Read-only

List keyword subcategories with a sample of the keywords in each, optionally for one parent category.
Returns each subcategory with name, slug, description, counts of keywords and companies, and a sample of its technologies.
Use list_keyword_subcategories to drill into a category from list_keyword_categories. Use list_keywords to search keywords directly.
subcategory_slug works only together with category_slug.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category_slug` (`string`, optional): Parent category slug to filter subcategories. If provided with subcategory_slug, returns only that specific subcategory. If provided alone, returns all subcategories for that parent category.
- `num_technologies_per_category` (`integer`, optional): Number of keywords per category to include in the response
- `subcategory_slug` (`string`, optional): Subcategory slug to filter by a specific subcategory. Must be used together with category_slug.

Example input: `{}`

### `theirstack_list_keywords`

List Keywords · Read-only

List the technologies and buying intent topics TheirStack tracks, searchable by name, type or category.
Returns each keyword with name, slug, type, category, parent category, description, and the number of jobs and companies that mention it.
Use list_keywords to look up the slugs that search_jobs, search_companies and get_company_technologies filters expect. Use list_keyword_categories to browse categories. The call is free.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category_slug` (`string`, optional): Keyword category slug
- `keyword_type` (`string`, optional): Keyword type to filter by. One of: `technology`, `software_product`, `technology_concept`, `operational_activity`, `strategic_initiative`, `metric_or_concept`, `product_or_service_offered`, `regulation`, `threat_or_risk`, `event`, `commodity`, `industry_vertical`, `physical_equipment`, `medical_research`, `government_body`.
- `limit` (`integer`, optional): Number of results per page
- `name_pattern` (`string`, optional): Case-insensitive text to search for in the keyword name
- `page` (`integer`, optional): Page number.
- `parent_category_slug` (`string`, optional): Keyword parent category slug
- `q` (`string`, optional): General search query. Searches across keyword name, keyword type, category, and parent category (case-insensitive). Results where the keyword name starts with the query are ranked first.
- `slug` (`array`, optional): Keyword slug of a single keyword

Example input: `{}`

### `theirstack_list_locations`

List Locations · Read-only

Search geographic locations by name, country code or ID.
Returns each location with id, name, region, country code, country name, feature type and display name.
Use list_locations to find the location IDs that the job_location_or and job_location_not filters of search_jobs expect.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `country_code` (`string`, optional): The country code of the location, all the returned locations will be filtered by this country code
- `feature_code` (`string`, optional): GeoNames feature code(s) to filter by location type (e.g. PPL=populated place, ADM1=first-order admin division). See https://www.geonames.org/export/codes.html
- `id` (`integer`, optional): The ids of the locations
- `limit` (`integer`, optional): The limit of the results
- `name` (`string`, optional): Search value for the location, this will be used to filter the locations by name
- `offset` (`integer`, optional): The offset of the results

Example input: `{}`

### `theirstack_list_saved_searches`

List Saved Searches · Read-only

List the team's active saved job and company searches.
Returns each saved search with id, name, type, filters, alert settings, owner and dates. Archived searches are excluded.
Use list_saved_searches to find a saved search ID. Use get_saved_search for one search in full.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `order_by` (`string`, optional): Order by field. One of: `name`, `created_at`, `updated_at`.
- `order_direction` (`string`, optional): Order direction. One of: `asc`, `desc`.
- `types` (`string`, optional): Filter by type of search. One of: `companies`, `jobs`.

Example input: `{}`

### `theirstack_search_companies`

Search Companies · Read-only

Search companies by firmographics (industry, country, size, revenue, funding), the technologies they use, and the roles or technologies they are hiring for.
Returns matching companies with id, name, domain, industry, country, employee count, LinkedIn URL, funding, technology slugs and job counts, plus metadata with result totals.
Use search_companies to build a list of target accounts. Use search_jobs for individual postings and get_company_technologies for one known company's full tech stack. Each company returned uses 3 API credits.
Pass company_id values from the results to add_companies_to_list.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company_country_code_not` (`array`, optional): Return companies whose HQ country code is not any of the ones passed here, case sensitive. Pass ISO2 country codes.
- `company_country_code_or` (`array`, optional): Return companies whose HQ country code is any of the ones passed here, case sensitive. Pass ISO2 country codes.
- `company_description_pattern_or` (`array`, optional): Case-insensitive patterns to match in the company description. Will return companies that match any of the patterns.
- `company_domain_not` (`array`, optional): Only return companies that don't match these domains exactly. It accepts full urls (https://www.google.com/) and emails (andrew@stripe.com).
- `company_domain_or` (`array`, optional): Only return companies that match these domains exactly. It accepts full urls (https://www.google.com/) and emails (andrew@stripe.com). This filter acts as an OR filter, so if you pass more than one company domain, it will return companies that match any of the domains.
- `company_id_or` (`array`, optional): Only return companies that match these IDs exactly. This filter acts as an OR filter, so if you pass more than one company ID, it will return companies that match any of the IDs.
- `company_investors_partial_match_or` (`array`, optional): Investors of the company. Will return companies for which any of their investors contains any of the substrings passed here. For example, if you pass 'andree', all funds that match it (like 'Andreessen Horowitz', 'Andreessen Horowitz LLC', etc).
- `company_keyword_slug_and` (`array`, optional): Return results from companies that have mentioned all of these keywords in their jobs. Case sensitive. Pass slugs. Check out all the keywords we track at GET /v0/catalog/keywords
- `company_keyword_slug_not` (`array`, optional): Return results from companies that haven't mentioned any of these keywords in their jobs. Case sensitive. Pass slugs. Check out all the keywords we track at GET /v0/catalog/keywords
- `company_keyword_slug_or` (`array`, optional): Return results from companies that have mentioned any of these keywords in their jobs. Case sensitive. Pass slugs. Check out all the keywords we track at GET /v0/catalog/keywords
- `company_linkedin_url_or` (`array`, optional): Return companies whose LinkedIn page matches any of the values passed here. Both forms of LinkedIn company URL work — the vanity slug (`https://www.linkedin.com/company/google/`) and the numeric company ID (`https://www.linkedin.com/company/1038`) — as do a bare slug (`google`) and a bare numeric ID (`1038`). A numeric value is matched against the company's LinkedIn ID and its slug, so you do not need to know which of the two you are holding. We have a LinkedIn slug for ~26% of companies and a numeric LinkedIn ID for ~14%, so if you have the company's domain, `company_domain_or` matches more often.
- `company_list_id_not` (`array`, optional): Return companies that don't belong to any of the company lists passed here
- `company_list_id_or` (`array`, optional): Return companies that belong to any of the company lists passed here
- `company_location_pattern_or` (`array`, optional): Return companies whose city matches any of the patterns passed here. Case insensitive. For example, if you pass 'san francisco', it will return companies whose city is 'San Francisco', 'San Francisco Bay Area', etc.
- `company_name_case_insensitive_or` (`array`, optional): Only return companies that match these names exactly, case-insensitively.
- `company_name_not` (`array`, optional): Only return companies that don't match these names exactly, case-sensitively.
- `company_name_or` (`array`, optional): Only return companies that match these names exactly, case-sensitively. This filter acts as an OR filter, so if you pass more than one company name, it will return companies that match any of the names.
- `company_name_partial_match_or` (`array`, optional): Company names. Will return companies whose name contains any of the substrings passed here, case-insensitively. For example, if you pass "google", it will return "Google", "Google LLC", "Google Inc", etc.
- `company_tags_or` (`array`, optional): Return companies that match any of these keywords
- `company_technology_slug_and` (`array`, optional): Return results from companies that have mentioned all of these technologies in their jobs (in job searches, not necessarily in the jobs returned). Case sensitive. Pass slugs. Check out all the technologies we track at GET /v0/catalog/keywords with `keyword_type=technology`
- `company_technology_slug_not` (`array`, optional): Return results from companies that haven't mentioned any of these technologies in their jobs. Case sensitive. Pass slugs. Check out all the technologies we track at GET /v0/catalog/keywords with `keyword_type=technology`
- `company_technology_slug_or` (`array`, optional): Return results from companies that have mentioned any of these technologies in their jobs (in job searches, not necessarily in the jobs returned). Case sensitive. Pass slugs. Check out all the technologies we track at GET /v0/catalog/keywords with `keyword_type=technology`
- `company_type` (`string`, optional): Filter by company type. One of: `recruiting_agency`, `direct_employer`, `all`.
- `funding_stage_or` (`array`, optional): Funding stages of companies returned. Possible values: ['angel', 'convertible_note', 'debt_financing', 'equity_crowdfunding', 'other', 'private_equity', 'seed', 'series_a', 'series_b', 'series_c', 'series_d', 'series_e', 'series_f', 'series_g', 'series_h', 'venture_round_not_specified', 'series_i', 'series_j', 'undisclosed', 'series_unknown', 'pre_seed', 'post_ipo_secondary', 'post_ipo_equity', 'post_ipo_debt', 'non_equity_assistance', 'late_vc', 'initial_coin_offering', 'growth_equity_vc', 'grant', 'early_vc', 'corporate_round', 'secondary_market', 'product_crowdfunding']
- `include_total_results` (`boolean`, optional): When enabled, calculates and returns `total_results` and `total_companies` fields in the response. WARNING: This significantly slows down responses as it requires reading the entire dataset. Recommended usage: enable only for the initial request to get totals, then disable for subsequent pagination requests.
- `industry_id_not` (`array`, optional): Industry ids to exclude. You can use any of LinkedIn's Industry Codes V2 or GET /v0/catalog/industries
- `industry_id_or` (`array`, optional): Industry codes. You can use any of LinkedIn's Industry Codes V2 or GET /v0/catalog/industries
- `job_filters` (`object`, optional): Filter companies by the jobs they have posted. Takes the job filters of the job search endpoint and requires a date filter (`posted_at_max_age_days`, `posted_at_gte` or `posted_at_lte`). Returns companies with at least one matching job, or at least `min_num_jobs_found` if set.
- `last_funding_round_date_gte` (`string`, optional): Only return companies whose last funding round date is after or on this date. Format: 'YYYY-MM-DD'
- `last_funding_round_date_lte` (`string`, optional): Only return companies whose last funding round date is before or on this date. Format: 'YYYY-MM-DD'
- `limit` (`integer`, optional): Number of results per page
- `max_employee_count` (`integer`, optional): Maximum number of employees in a company
- `max_funding_usd` (`integer`, optional): Maximum company funding, in USD
- `max_revenue_usd` (`integer`, optional): Maximum company revenue, in USD
- `min_employee_count` (`integer`, optional): Minimum number of employees in a company
- `min_funding_usd` (`integer`, optional): Minimum company funding, in USD
- `min_num_jobs_found` (`integer`, optional): Minimum number of jobs matching `job_filters` a company must have to be returned (thresholds the `num_jobs_found` count). Requires `job_filters` with a date filter, so the count is always computed over the date-bounded set of matching jobs.
- `min_revenue_usd` (`integer`, optional): Minimum company revenue, in USD
- `offset` (`integer`, optional): Number of results to skip. Required for offset-based pagination.
- `only_yc_companies` (`boolean`, optional): Only return YC companies
- `page` (`integer`, optional): Page number. Required when using page-based pagination.
- `property_exists_and` (`array`, optional): Return companies that have all of these fields not null. For example, if you pass ['domain', 'linkedin_url'], it will return companies that have both domain AND linkedin_url set.

Example input: `{}`

### `theirstack_search_jobs`

Search Jobs · Read-only

Search job postings by title, description keywords, technology, location, salary, seniority, workplace type, posting date and company.
Returns matching jobs with id, job title, url, date posted, company, location, salary, seniority, technology slugs and description, plus metadata with result totals.
Use search_jobs to find individual job postings. Use search_companies to find companies and get_company_technologies for one company's tech stack. Each job returned uses 1 API credit.
At least one of posted_at_max_age_days, posted_at_gte, posted_at_lte, job_id_or, company_domain_or, company_linkedin_url_or, company_name_or, company_name_case_insensitive_or or company_name_partial_match_or must be set, otherwise the request fails.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company_country_code_or` (`array`, optional): Return companies whose HQ country code is any of the ones passed here, case sensitive. Pass ISO2 country codes.
- `company_domain_not` (`array`, optional): Only return companies that don't match these domains exactly. It accepts full urls (https://www.google.com/) and emails (andrew@stripe.com).
- `company_domain_or` (`array`, optional): Only return companies that match these domains exactly. It accepts full urls (https://www.google.com/) and emails (andrew@stripe.com). This filter acts as an OR filter, so if you pass more than one company domain, it will return companies that match any of the domains.
- `company_id_or` (`array`, optional): Only return companies that match these IDs exactly. This filter acts as an OR filter, so if you pass more than one company ID, it will return companies that match any of the IDs.
- `company_linkedin_url_or` (`array`, optional): Return companies whose LinkedIn page matches any of the values passed here. Both forms of LinkedIn company URL work — the vanity slug (`https://www.linkedin.com/company/google/`) and the numeric company ID (`https://www.linkedin.com/company/1038`) — as do a bare slug (`google`) and a bare numeric ID (`1038`). A numeric value is matched against the company's LinkedIn ID and its slug, so you do not need to know which of the two you are holding. We have a LinkedIn slug for ~26% of companies and a numeric LinkedIn ID for ~14%, so if you have the company's domain, `company_domain_or` matches more often.
- `company_name_case_insensitive_or` (`array`, optional): Only return companies that match these names exactly, case-insensitively.
- `company_name_or` (`array`, optional): Only return companies that match these names exactly, case-sensitively. This filter acts as an OR filter, so if you pass more than one company name, it will return companies that match any of the names.
- `company_name_partial_match_or` (`array`, optional): Company names. Will return companies whose name contains any of the substrings passed here, case-insensitively. For example, if you pass "google", it will return "Google", "Google LLC", "Google Inc", etc.
- `company_technology_slug_or` (`array`, optional): Return results from companies that have mentioned any of these technologies in their jobs (in job searches, not necessarily in the jobs returned). Case sensitive. Pass slugs. Check out all the technologies we track at GET /v0/catalog/keywords with `keyword_type=technology`
- `company_type` (`string`, optional): Filter by company type. One of: `recruiting_agency`, `direct_employer`, `all`.
- `discovered_at_gte` (`string`, optional): Only jobs discovered by TheirStack on this date or datetime or after will be returned. In UTC timezone.
- `discovered_at_lte` (`string`, optional): Only jobs discovered by TheirStack on this date or datetime or before will be returned. In UTC timezone.
- `discovered_at_max_age_days` (`integer`, optional): If 0, only return jobs added to our database in the current day. If 1, from today and yesterday, etc.
- `employment_statuses_or` (`array`, optional): Filter jobs by employment status. Returns jobs that match any of the specified employment types. If no values are provided or an empty list is sent, all jobs regardless of employment status will be returned.
- `include_total_results` (`boolean`, optional): When enabled, calculates and returns `total_results` and `total_companies` fields in the response. WARNING: This significantly slows down responses as it requires reading the entire dataset. Recommended usage: enable only for the initial request to get totals, then disable for subsequent pagination requests.
- `is_closed` (`boolean`, optional): If True, only return closed jobs (jobs where TheirStack detected the posting was closed). If False, only return open jobs. If None, return all jobs regardless of closure status.
- `job_country_code_not` (`array`, optional): 2-letter ISO country code of the location of the job. Can pass more than 1. Will exclude jobs from these countries
- `job_country_code_or` (`array`, optional): 2-letter ISO country code of the location of the job. Can pass more than 1
- `job_description_contains_not` (`array`, optional): Exclude jobs whose description contains any of these whole words using word boundaries (\b). Case-insensitive by default, except for the patterns that are uppercase - in that case we'll respect it. Only finds complete words (e.g., searching 'quality' won't match 'inequality'). Results will exclude jobs whose description contains any of these words.
- `job_description_contains_or` (`array`, optional): Search for whole words in job descriptions using word boundaries (\b). Case-insensitive by default, except for the patterns that are uppercase - in that case we'll respect it. Only finds complete words (e.g., searching 'quality' won't match 'inequality'). Results will include jobs whose description contains any of these words.
- `job_description_pattern_or` (`array`, optional): Regex patterns to look for in job descriptions. Case-sensitive. Results will include jobs whose description matches any of these patterns. Use (?i) at the start of a pattern to make it case-insensitive. Can pass more than one.
- `job_id_or` (`array`, optional): Get jobs with these IDs only.
- `job_keyword_slug_or` (`array`, optional): Will return jobs where any of these keyword slugs appear. Case sensitive. Check out all the keywords we track at GET /v0/catalog/keywords
- `job_location_not` (`array`, optional): Filter jobs by location. Returns jobs whose locations DO NOT match ANY of the specified location criteria. Each location criteria is specified using a JobLocationFilter object. (You can find location IDs using the locations catalog endpoint)
- `job_location_or` (`array`, optional): Filter jobs by location. Returns jobs whose locations match ANY of the specified location criteria. Each location criteria is specified using a JobLocationFilter object. (You can find location IDs using the locations catalog endpoint)
- `job_seniority_or` (`array`, optional): Will return jobs where the seniority is any of the ones passed here
- `job_technology_slug_and` (`array`, optional): Will return jobs where all of these technologies appear. Case sensitive. Pass slugs. Check out all the technologies we track at GET /v0/catalog/keywords with `keyword_type=technology`.
- `job_technology_slug_not` (`array`, optional): Will return jobs where none of these technologies appear. Case sensitive. Pass slugs. Check out all the technologies we track at GET /v0/catalog/keywords with `keyword_type=technology`.
- `job_technology_slug_or` (`array`, optional): Will return jobs where any of these technologies appear. Case sensitive. Pass slugs. Check out all the technologies we track at GET /v0/catalog/keywords with `keyword_type=technology`. If you pass more than one technology, we will return jobs that mention at least one of them.
- `job_title_not` (`array`, optional): Keyword-based patterns to exclude job titles. Case-insensitive. Excludes jobs whose title contains all the words in any of the patterns, in any order. For example, `marketing vp` excludes titles such as `VP of Marketing` or `Marketing VP, EMEA`.
- `job_title_or` (`array`, optional): Keyword-based patterns to match job titles. Case-insensitive. Returns jobs whose title contains all the words in any of the patterns, in any order. For example, `marketing vp` matches titles such as `VP of Marketing` or `Marketing VP, EMEA`. Passing `["software engineer", "data scientist"]` returns jobs matching either pattern.
- `limit` (`integer`, optional): Number of results per page
- `max_employee_count` (`integer`, optional): Maximum number of employees in a company
- `max_salary_usd` (`number`, optional): Maximum annual salary in USD. For example, 150000 means $150,000.
- `min_employee_count` (`integer`, optional): Minimum number of employees in a company
- `min_salary_usd` (`number`, optional): Minimum annual salary in USD. For example, 100000 means $100,000.
- `offset` (`integer`, optional): Number of results to skip. Required for offset-based pagination.
- `page` (`integer`, optional): Page number. Required when using page-based pagination.
- `posted_at_gte` (`string`, optional): ISO 8601 date string (yyyy-mm-dd). Only jobs published in this date or after will be returned.
- `posted_at_lte` (`string`, optional): ISO 8601 date string (yyyy-mm-dd). Only jobs published in this date or before will be returned.
- `posted_at_max_age_days` (`integer`, optional): Date posted max age in days. If 0, only return jobs posted today. If 1, from today and yesterday, etc.
- `workplace_types_or` (`array`, optional): Filter jobs by workplace type. Returns jobs that match any of the specified workplace types. `on_site` matches jobs that are neither hybrid nor remote. If no values are provided or an empty list is sent, jobs are not filtered by workplace type.

Example input: `{}`

### `theirstack_add_companies_to_list`

Add Companies To List · Write

Add companies to one company list by company ID.
Returns the list with its new company count.
Use add_companies_to_list after search_companies to save results. Use create_company_list first if no list exists.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `company_ids` (`array`, required): Company IDs to add, taken from the id of each company in a search_companies result.
- `list_id` (`integer`, required): ID of the company list. Use list_company_lists to find it.

Example input: `{"company_ids":[],"list_id":1}`

### `theirstack_archive_saved_search`

Archive Saved Search · Write

Archive one saved search so it no longer appears in the active list.
Returns the API's confirmation response. Webhooks attached to the search stop triggering.
Use archive_saved_search to retire a saved search. Use list_saved_searches to find the ID.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `search_id` (`integer`, required): ID of the saved search. Use list_saved_searches to find it.

Example input: `{"search_id":1}`

### `theirstack_create_company_list`

Create Company List · Write

Create an empty company list for the team.
Returns the new list with its id, name, type and company count.
Use create_company_list to start a new list, then add companies with add_companies_to_list.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the new company list.

Example input: `{"name":"<name>"}`

### `theirstack_create_saved_search`

Create Saved Search · Write

Save a job or company search so it can be run again or opened in the TheirStack app.
Returns the saved search with id, name, type, filters, alert settings and creation date.
Use create_saved_search to store filters you want to reuse. Saving costs no credits. The body uses the same filters as search_jobs (type jobs) or search_companies (type companies).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `body` (`object`, required): Search filters to save, as an object. Use the same filter names as search_jobs when type is jobs, or search_companies when type is companies.
- `type` (`string`, required): Type of search to save: companies or jobs. One of: `companies`, `jobs`.
- `is_alert_active` (`boolean`, optional): Set to true to email new results to the creator, weekly by default.
- `name` (`string`, optional): Name of the saved search. A name is generated from the filters when omitted.

Example input: `{"body":{},"type":"companies"}`

### `theirstack_duplicate_company_list`

Duplicate Company List · Write

Copy one company list, with all its companies, into a new list owned by the caller.
Returns the new list with its id, name (the original name plus ' (copy)'), type and company count.
Use duplicate_company_list to branch a list before editing it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `list_id` (`integer`, required): ID of the company list. Use list_company_lists to find it.

Example input: `{"list_id":1}`

### `theirstack_remove_companies_from_list`

Remove Companies From List · Write

Remove companies from one company list by company ID.
Returns the list with its new company count. Only their place in this list is removed; the companies and any other list holding them are not affected.
Use remove_companies_from_list to prune a list. Use delete_company_list to delete the whole list.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `company_ids` (`array`, required): Company IDs to remove, taken from the id of each company in a search_companies result.
- `list_id` (`integer`, required): ID of the company list. Use list_company_lists to find it.

Example input: `{"company_ids":[],"list_id":1}`

### `theirstack_rename_company_list`

Rename Company List · Write

Rename one company list.
Returns the updated list with its id, new name, type and company count.
Use rename_company_list to change a list's name. The Companies seen list can't be renamed.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `list_id` (`integer`, required): ID of the company list. Use list_company_lists to find it.
- `new_name` (`string`, required): New name for the company list.

Example input: `{"list_id":1,"new_name":"<new_name>"}`

### `theirstack_delete_company_list`

Delete Company List · Destructive

Permanently delete one company list.
Returns the API's confirmation response. Only the list is removed; the companies in it and any other list holding them are not affected.
Use delete_company_list to remove a list for good. Use remove_companies_from_list to take companies out of a list instead. Only the list's owner can delete it, and the Companies seen list can't be deleted.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `list_id` (`integer`, required): ID of the company list. Use list_company_lists to find it.

Example input: `{"list_id":1}`

## Related

Other CRM & Sales connectors ([all 97](/agentkit/connectors/?category=crm-sales)):

- [Insightly](/agentkit/connectors/insightly/): Scalekit connector, API key, 108 tools
- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Salesforce](/agentkit/connectors/salesforce/): Scalekit connector, OAuth, 74 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
