> **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 ContactOut

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

**Authentication:** API Key
**Categories:** CRM & Sales
**Tools:** 26: 20 read, 5 write, 1 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=CONTACTOUT)

## 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 ContactOut connection

   In **AgentKit > Connections**, create a ContactOut 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 = 'contactout'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize ContactOut:', 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: 'contactout_count_people',
     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 = "contactout"
   identifier = "user_123"

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

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

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their ContactOut 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: 'contactout_bulk_get_contact_info',
  toolInput: {
    profiles: ['https://www.linkedin.com/in/example-person'],
  },
  connector: 'contactout',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="contactout_bulk_get_contact_info",
    tool_input={
        "profiles": ["https://www.linkedin.com/in/example-person"],
    },
    connection_name="contactout",
    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.

### `contactout_bulk_get_contact_info`

Bulk Get Contact Info · Read-only

Get emails, and optionally phones, for up to 100 LinkedIn profile URLs in one synchronous request.
Returns profiles keyed by LinkedIn URL; each value is a list of emails, or an object with emails and phones when include_phone is true.
Use this for up to 100 URLs with an immediate answer. Use contactout_create_bulk_contact_info_job for up to 1000 URLs or real-time work email lookup.

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

Inputs:

- `profiles` (`array`, required): LinkedIn profile URLs to look up, 1 to 100. Example: ["https://www.linkedin.com/in/example-person"]
- `email_type` (`string`, optional): Which emails to return. personal returns only personal emails; work returns only work emails (verified in real time, slower); personal,work returns both. One of: `personal`, `work`, `personal,work`.
- `include_phone` (`boolean`, optional): If true, each profile maps to an object with emails and phones instead of a plain email list. Phones need a phone-enabled token and phone credits. API default is false.

Example input: `{"profiles":["https://www.linkedin.com/in/example-person"]}`

### `contactout_check_personal_email`

Check Personal Email · Read-only

Check whether ContactOut has a personal email for a LinkedIn profile, without using credits. Available on paid plans only.
Returns profile.email: true when a personal email is available.
Use this before contactout_get_contact_info to avoid spending credits on profiles with no data.
Rate limit: 150 requests per minute.

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

Inputs:

- `profile` (`string`, required): LinkedIn profile URL of the person. Must start with http and contain linkedin.com/in/ or linkedin.com/pub/. Sales Navigator and Recruiter URLs are not supported. Example: https://www.linkedin.com/in/example-person

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

### `contactout_check_phone`

Check Phone · Read-only

Check whether ContactOut has a phone number for a LinkedIn profile, without using credits. Available on paid plans only.
Returns profile.phone: true when a phone number is available.
Use this before contactout_get_contact_info to avoid spending credits on profiles with no data.
Rate limit: 150 requests per minute.

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

Inputs:

- `profile` (`string`, required): LinkedIn profile URL of the person. Must start with http and contain linkedin.com/in/ or linkedin.com/pub/. Sales Navigator and Recruiter URLs are not supported. Example: https://www.linkedin.com/in/example-person

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

### `contactout_check_work_email`

Check Work Email · Read-only

Check whether ContactOut has a work email for a LinkedIn profile, without using credits. Available on paid plans only.
Returns profile.email (true when a work email is available) and profile.email_status (Verified, Unverified or null).
Use this before contactout_get_contact_info to avoid spending credits on profiles with no data.
Rate limit: 150 requests per minute.

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

Inputs:

- `profile` (`string`, required): LinkedIn profile URL of the person. Must start with http and contain linkedin.com/in/ or linkedin.com/pub/. Sales Navigator and Recruiter URLs are not supported. Example: https://www.linkedin.com/in/example-person

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

### `contactout_count_people`

Count People · Read-only

Count the people that match a set of search filters, without using credits.
Returns total_results plus estimated_personal_emails, estimated_work_emails and estimated_phones.
Use this to size a search before contactout_search_people, which takes the same filters.

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

Inputs:

- `company` (`array`, optional): Company names to match, up to 50. Scope (current or past employer) is set by company_filter. Example: ["Stripe", "Plaid"]
- `company_filter` (`string`, optional): Which roles the company filter applies to: current (API default), past, past_only (company in past experience but not the current employer), or both. One of: `current`, `past`, `past_only`, `both`.
- `company_size` (`array`, optional): Company headcount ranges, up to 8. Values: 1_10, 11_50, 51_200, 201_500, 501_1000, 1001_5000, 5001_10000, 10001. Example: ["51_200", "201_500"]
- `current_company_only` (`boolean`, optional): If true (the API default), company matches only the current employer.
- `current_titles_only` (`boolean`, optional): If true (the API default), job_title matches only current roles. Set false to also match past job titles.
- `current_work_location` (`array`, optional): Locations where the person currently works, up to 50. Example: ["New York"]
- `domain` (`array`, optional): Company website domains to match, up to 50. Example: ["stripe.com"]
- `education` (`array`, optional): Schools or degrees to match, up to 50. Supports capitalized AND, OR, NOT. Example: ["Stanford University"]
- `educations` (`array`, optional): Structured education filters, up to 50. Each item can set a school name, a field of study and a location. Example: [{"school_name": "Stanford University", "field_of_study": "Computer Science"}]
- `exclude_companies` (`array`, optional): Company names to exclude, up to 50. Scope is set by exclude_companies_filter (default both current and past). Example: ["Acme Corp"]
- `exclude_companies_filter` (`string`, optional): Which roles exclude_companies applies to: current, past, or both (API default). Independent of company_filter. One of: `current`, `past`, `both`.
- `exclude_job_titles` (`array`, optional): Job titles to exclude from results. Example: ["Intern", "Assistant"]
- `include_related_job_titles` (`boolean`, optional): If true, also matches job titles related to the ones in job_title. API default is false.
- `industry` (`array`, optional): Industries to match, up to 50. Prefix a value with NOT to exclude it, for example "NOT Computer Software". AND and OR are not supported here. Example: ["Financial Services"]
- `is_currently_working` (`boolean`, optional): If true, returns only people with an active current role; if false, only people without one. Omit to return both.
- `job_function` (`array`, optional): Job functions to filter by, up to 50. Example: ["Engineering", "Sales"]
- `job_title` (`array`, optional): Current job titles to match (up to 50). Supports capitalized boolean operators AND, OR, NOT inside a value. Example: ["Head of Sales", "VP Sales"]
- `keyword` (`string`, optional): Keyword that appears anywhere in the profile. Supports capitalized AND, OR, NOT. Example: fintech AND payments
- `languages` (`array`, optional): Languages the person speaks, up to 50. Each item needs a language name and can list accepted proficiency levels. Example: [{"language": "Spanish", "proficiency": ["Native or bilingual proficiency"]}]
- `location` (`array`, optional): Locations where the person lives, up to 50. Example: ["San Francisco, California", "United States"]
- `location_radius` (`integer`, optional): Search radius in miles around location, from 1 to 500. Works only when location is a city or area. Example: 25
- `match_experience` (`string`, optional): Requires job_title and company to match within the same experience entry: current (API default), past, or both. One of: `current`, `past`, `both`.
- `name` (`string`, optional): Full or partial name of the person to find. Example: Jane Doe
- `past_company` (`array`, optional): Companies the person worked at in past (non-current) roles, up to 50. Cannot be combined with company_filter past, past_only or both, or with match_experience when both job_title and company are set. Example: ["Google"]
- `past_job_title` (`array`, optional): Job titles the person held in past (non-current) roles, up to 50. Supports capitalized AND, OR, NOT. Cannot be combined with current_titles_only false, or with match_experience when both job_title and company are set. Example: ["Software Engineer"]
- `past_work_location` (`array`, optional): Locations where the person worked before, up to 50. Example: ["London"]
- `recently_changed_jobs` (`boolean`, optional): If true, returns only people whose current job started within the last 3 calendar months. Cannot be used with years_in_current_role.
- `seniority` (`array`, optional): Seniority levels to filter by, up to 50. Example: ["Manager", "Vice President"]
- `skills` (`array`, optional): Skills to match, up to 50. Supports capitalized AND, OR, NOT. Example: ["Python", "Machine Learning"]
- `years_in_current_role` (`array`, optional): Years-in-current-role ranges, up to 20. Example values: 1_2, 3_5. Cannot be used with recently_changed_jobs. Example: ["1_2"]
- `years_of_experience` (`array`, optional): Total years of experience ranges, up to 20. Example values: 1_2, 3_5, 6_10, 10. Example: ["3_5", "6_10"]

Example input: `{}`

### `contactout_enrich_domains`

Enrich Company Domains · Read-only

Get company information for up to 30 domains in one request.
Returns companies keyed by domain, each with name, description, website, industry, size, headquarter, locations, technologies, revenue, employees and funding.
Use this when you have exact domains. Use contactout_search_companies to find companies by filters.

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

Inputs:

- `domains` (`array`, required): Company domains to look up, 1 to 30. Example: ["contactout.com", "stripe.com"]

Example input: `{"domains":["contactout.com","stripe.com"]}`

### `contactout_enrich_email`

Enrich Email Address · Read-only

Find the LinkedIn profile and contact details behind an email address.
Returns profile in camelCase: fullName, linkedinUrl, headline, company, experience, education, skills, phone, workEmail, confidenceLevel and altMatches.
Use contactout_find_linkedin_by_email when you only need the LinkedIn URL. Use contactout_enrich_linkedin_profile when you already have the URL.

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

Inputs:

- `email` (`string`, required): Email address to look up. Personal emails usually match better than work emails. Example: jane.doe@gmail.com
- `include` (`string`, optional): Extra data to include. Only work_email is supported; it adds the person's work email (verified in real time, so slower). One of: `work_email`.

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

### `contactout_enrich_linkedin_profile`

Enrich LinkedIn Profile · Read-only

Get the full profile for a LinkedIn profile URL, including emails, phones, work history, education and skills.
Returns profile with full_name, headline, company, location, experience, education, skills, email, work_email, personal_email and phone; errors lists contact types skipped for lack of credits.
Use contactout_get_contact_info when you only need emails and phones. Use contactout_enrich_person when you don't have a LinkedIn URL.

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

Inputs:

- `profile` (`string`, required): LinkedIn profile URL of the person. Must start with http and contain linkedin.com/in/ or linkedin.com/pub/. Sales Navigator and Recruiter URLs are not supported. Example: https://www.linkedin.com/in/example-person
- `profile_only` (`boolean`, optional): If true, returns profile data without contact information and uses 1 search credit instead of email/phone credits. API default is false.

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

### `contactout_enrich_person`

Enrich Person · Read-only

Find a person's profile by combining data points such as name, email, phone, LinkedIn URL, company, school, location and job title.
Returns profile with full_name, headline, company, experience, education and skills, plus the contact types requested in include.
Use this when you lack a LinkedIn URL. Send one primary identifier (linkedin_url, email or phone), or a name plus at least one of company, company_domain, education, location or job_title.
Use contactout_enrich_linkedin_profile when you have the LinkedIn URL.

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

Inputs:

- `company` (`array`, optional): Company names the person works or worked at, up to 10. Example: ["Stripe"]
- `company_domain` (`array`, optional): Company domains, up to 10. Example: ["stripe.com"]
- `education` (`array`, optional): Schools the person attended, up to 10. Example: ["Stanford University"]
- `email` (`string`, optional): Email address of the person. A primary identifier. Example: jane.doe@gmail.com
- `first_name` (`string`, optional): First name. Use with last_name instead of full_name. Example: Jane
- `full_name` (`string`, optional): Full name of the person. Combine with at least one secondary field (company, company_domain, education, location or job_title). Example: Jane Doe
- `include` (`array`, optional): Contact data to include in the response: work_email, personal_email, phone. Each type uses its own credits. Example: ["work_email", "personal_email"]
- `job_title` (`string`, optional): Job title of the person. Example: Head of Sales
- `last_name` (`string`, optional): Last name. Use with first_name instead of full_name. Example: Doe
- `linkedin_url` (`string`, optional): LinkedIn profile URL of the person. A primary identifier. Example: https://www.linkedin.com/in/example-person
- `location` (`string`, optional): City or location of the person. Example: San Francisco
- `phone` (`string`, optional): Phone number of the person, ideally with country code. A primary identifier. Example: +14155550123

Example input: `{}`

### `contactout_find_linkedin_by_email`

Find LinkedIn Profile by Email · Read-only

Find the LinkedIn profile URL that belongs to an email address.
Returns profile with email and linkedin (the profile URL).
Use this when you only need the URL. Use contactout_enrich_email for the full profile.

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

Inputs:

- `email` (`string`, required): Email address to look up. Example: jane.doe@gmail.com

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

### `contactout_get_bulk_contact_info_job`

Get Bulk Contact Info Job · Read-only

Get the status and results of an asynchronous bulk contact info job.
Returns data with uuid, status (SENT when complete) and result keyed by LinkedIn URL, each with emails, personal_emails, work_emails and phones.
Requires a job_id from contactout_create_bulk_contact_info_job.

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

Inputs:

- `job_id` (`string`, required): ID of the bulk contact info job, as returned in job_id by contactout_create_bulk_contact_info_job. Example: 3f1c2b7e-8a4d-4c55-9a0e-1b2c3d4e5f60

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

### `contactout_get_bulk_email_verification_job`

Get Bulk Email Verification Job · Read-only

Get the status and results of a bulk email verification job.
Returns data with uuid, status (DONE when complete) and result mapping each email to valid, invalid, accept_all, disposable or unknown.
Requires a job_id from contactout_create_bulk_email_verification_job.

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

Inputs:

- `job_id` (`string`, required): ID of the bulk email verification job, as returned in job_id by contactout_create_bulk_email_verification_job. Example: 3f1c2b7e-8a4d-4c55-9a0e-1b2c3d4e5f60

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

### `contactout_get_campaign`

Get Campaign · Read-only

Get one email campaign with its sequence steps and, optionally, performance stats.
Returns data with id, name, status, created_at, updated_at and steps (sequence_number, type, subject, delay_in_days), plus stats when include_stats is true.
Use contactout_list_campaigns to find the campaign_id.
Requires the Campaigns API to be enabled for your API token; otherwise ContactOut returns 403.

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

Inputs:

- `campaign_id` (`string`, required): ID of the campaign to retrieve. Get it from contactout_list_campaigns (the id field) or from the last segment of the campaign URL in the ContactOut web app. Example: pEVRKd
- `include_stats` (`boolean`, optional): If true, also returns a stats object with sends, opens, replies, bounces, open_rate and reply_rate. API default is false.

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

### `contactout_get_contact_info`

Get Contact Info · Read-only

Get the emails and, optionally, phone numbers for one LinkedIn profile URL.
Returns profile with url, email, personal_email, work_email, work_email_status, phone and github; errors lists contact types skipped for lack of credits.
Use this for contact details only. Use contactout_enrich_linkedin_profile for the full profile. Use contactout_bulk_get_contact_info for up to 100 URLs.

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

Inputs:

- `profile` (`string`, required): LinkedIn profile URL of the person. Must start with http and contain linkedin.com/in/ or linkedin.com/pub/. Sales Navigator and Recruiter URLs are not supported. Example: https://www.linkedin.com/in/example-person
- `email_type` (`string`, optional): Which emails to return. personal returns only personal emails; work returns only work emails (verified in real time, slower); personal,work returns both; none returns no emails. One of: `personal`, `work`, `personal,work`, `none`.
- `include_phone` (`boolean`, optional): If true, includes phone numbers and uses phone credits. API default is false.

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

### `contactout_get_decision_makers`

Get Decision Makers · Read-only

Get the key decision makers at a company, identified by its LinkedIn URL, domain or name.
Returns metadata (page, page_size, total_results) and profiles keyed by LinkedIn URL with full_name, title, company and location; contact_info is filled only when reveal_info is true.
Send at least one of linkedin_url, domain or name. Use contactout_search_people for wider filters.

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

Inputs:

- `domain` (`string`, optional): Company domain. Example: contactout.com
- `linkedin_url` (`string`, optional): Company LinkedIn URL. Example: https://linkedin.com/company/contactout
- `name` (`string`, optional): Company name. Example: ContactOut
- `page` (`integer`, optional): Page number of results, starting at 1. API default is 1. Example: 2
- `reveal_info` (`boolean`, optional): If true, contact_info is filled with emails and phones and credits are charged. API default is false.

Example input: `{}`

### `contactout_get_usage_stats`

Get Usage Stats · Read-only

Get API credit usage and quotas for a billing month.
Returns period (start, end) and usage with email, phone and search counts and quotas; postpaid accounts also get remaining and over_quota values.
Use this to check remaining credits before large enrichment or search jobs.

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

Inputs:

- `period` (`string`, optional): Billing month to report, as YYYY-MM. Defaults to the current month. The API also accepts a full date (YYYY-MM-DD) and ignores the day. Example: 2024-01

Example input: `{}`

### `contactout_list_campaigns`

List Campaigns · Read-only

List your ContactOut email campaigns, one page at a time.
Returns data (each campaign's id, name, status, created_at, updated_at) and metadata (page, page_size, total_results, has_more).
Use this to find a campaign_id. Use contactout_get_campaign for steps and stats.
Requires the Campaigns API to be enabled for your API token; otherwise ContactOut returns 403.

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

Inputs:

- `page` (`integer`, optional): Page number to retrieve, starting at 1. API default is 1. Example: 2
- `page_size` (`integer`, optional): Number of campaigns per page, up to 50. API default is 25. Example: 25

Example input: `{}`

### `contactout_search_companies`

Search Companies · Read-only

Search companies by name, domain, LinkedIn URL, size, location, industry, technologies, revenue and founding year.
Returns metadata (page, page_size, total_results) and companies, each with name, url, domain, overview, size, industry, headquarter, website and funding.
Use contactout_enrich_domains when you already have exact domains.

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

Inputs:

- `domain` (`array`, optional): Company domains to match, up to 50. Example: ["contactout.com"]
- `hq_only` (`boolean`, optional): If true, location matches only the company headquarters.
- `industry` (`array`, optional): Industries to match, up to 50. Example: ["Computer Software"]
- `linkedin_url` (`array`, optional): Company LinkedIn URLs to look up, up to 25. Cannot be combined with any other filter. Example: ["https://www.linkedin.com/company/contactout"]
- `location` (`array`, optional): Company locations to match, up to 50. Example: ["United States"]
- `max_revenue` (`integer`, optional): Maximum annual revenue in USD. Example: 50000000
- `min_revenue` (`integer`, optional): Minimum annual revenue in USD. Example: 1000000
- `name` (`array`, optional): Company names to match, up to 50. Example: ["ContactOut"]
- `page` (`integer`, optional): Page number of results, starting at 1. API default is 1. Example: 2
- `size` (`array`, optional): Company headcount ranges such as 1_10, 11_50, 51_200, 201_500, 501_1000, 1001_5000, 5001_10000, 10001. Example: ["1_10", "11_50"]
- `technologies` (`array`, optional): Technologies the company uses, up to 50. Capitalized AND joins terms inside a value. Example: ["Salesforce", "HubSpot AND AWS"]
- `year_founded_from` (`integer`, optional): Earliest founding year, 1985 or later. Example: 2010
- `year_founded_to` (`integer`, optional): Latest founding year. Must be greater than or equal to year_founded_from. Example: 2020

Example input: `{}`

### `contactout_search_people`

Search People · Read-only

Search ContactOut's people database with filters such as job title, company, location, skills, seniority, industry and keyword.
Returns metadata (page, page_size, total_results) and profiles keyed by LinkedIn URL, each with full_name, title, headline, company, location and contact_availability; contact_info is filled only when reveal_info is true.
Use contactout_count_people first to size a search without using credits. Use contactout_get_decision_makers for the leaders of one company.
Rate limit: 60 requests per minute.

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

Inputs:

- `company` (`array`, optional): Company names to match, up to 50. Scope (current or past employer) is set by company_filter. Example: ["Stripe", "Plaid"]
- `company_filter` (`string`, optional): Which roles the company filter applies to: current (API default), past, past_only (company in past experience but not the current employer), or both. One of: `current`, `past`, `past_only`, `both`.
- `company_size` (`array`, optional): Company headcount ranges, up to 8. Values: 1_10, 11_50, 51_200, 201_500, 501_1000, 1001_5000, 5001_10000, 10001. Example: ["51_200", "201_500"]
- `current_company_only` (`boolean`, optional): If true (the API default), company matches only the current employer.
- `current_titles_only` (`boolean`, optional): If true (the API default), job_title matches only current roles. Set false to also match past job titles.
- `current_work_location` (`array`, optional): Locations where the person currently works, up to 50. Example: ["New York"]
- `data_types` (`array`, optional): Return only profiles that have at least one of these contact data types: personal_email, work_email, phone. Example: ["work_email"]
- `detailed_education` (`boolean`, optional): If true, education entries are structured objects (school, degree, years) instead of strings. API default is false.
- `detailed_experience` (`boolean`, optional): If true, experience entries are structured objects (title, company, dates) instead of strings. API default is false.
- `domain` (`array`, optional): Company website domains to match, up to 50. Example: ["stripe.com"]
- `education` (`array`, optional): Schools or degrees to match, up to 50. Supports capitalized AND, OR, NOT. Example: ["Stanford University"]
- `educations` (`array`, optional): Structured education filters, up to 50. Each item can set a school name, a field of study and a location. Example: [{"school_name": "Stanford University", "field_of_study": "Computer Science"}]
- `exclude_companies` (`array`, optional): Company names to exclude, up to 50. Scope is set by exclude_companies_filter (default both current and past). Example: ["Acme Corp"]
- `exclude_companies_filter` (`string`, optional): Which roles exclude_companies applies to: current, past, or both (API default). Independent of company_filter. One of: `current`, `past`, `both`.
- `exclude_job_titles` (`array`, optional): Job titles to exclude from results. Example: ["Intern", "Assistant"]
- `include_related_job_titles` (`boolean`, optional): If true, also matches job titles related to the ones in job_title. API default is false.
- `industry` (`array`, optional): Industries to match, up to 50. Prefix a value with NOT to exclude it, for example "NOT Computer Software". AND and OR are not supported here. Example: ["Financial Services"]
- `is_currently_working` (`boolean`, optional): If true, returns only people with an active current role; if false, only people without one. Omit to return both.
- `job_function` (`array`, optional): Job functions to filter by, up to 50. Example: ["Engineering", "Sales"]
- `job_title` (`array`, optional): Current job titles to match (up to 50). Supports capitalized boolean operators AND, OR, NOT inside a value. Example: ["Head of Sales", "VP Sales"]
- `keyword` (`string`, optional): Keyword that appears anywhere in the profile. Supports capitalized AND, OR, NOT. Example: fintech AND payments
- `languages` (`array`, optional): Languages the person speaks, up to 50. Each item needs a language name and can list accepted proficiency levels. Example: [{"language": "Spanish", "proficiency": ["Native or bilingual proficiency"]}]
- `location` (`array`, optional): Locations where the person lives, up to 50. Example: ["San Francisco, California", "United States"]
- `location_radius` (`integer`, optional): Search radius in miles around location, from 1 to 500. Works only when location is a city or area. Example: 25
- `match_experience` (`string`, optional): Requires job_title and company to match within the same experience entry: current (API default), past, or both. One of: `current`, `past`, `both`.
- `name` (`string`, optional): Full or partial name of the person to find. Example: Jane Doe
- `output_fields` (`array`, optional): Limit each profile to these fields, up to 16. Allowed: li_vanity, full_name, title, headline, company, company.name, company.website, company.headquarter, company.domain, company.size, location, industry, experience, education, skills, profile_picture_url. Example: ["full_name", "title", "company.name"]
- `page` (`integer`, optional): Page number of results, starting at 1. API default is 1. Example: 2
- `page_size` (`integer`, optional): Number of profiles per page, from 1 to 25 (API default 25). Search credits are charged per profile returned. Example: 10
- `past_company` (`array`, optional): Companies the person worked at in past (non-current) roles, up to 50. Cannot be combined with company_filter past, past_only or both, or with match_experience when both job_title and company are set. Example: ["Google"]
- `past_job_title` (`array`, optional): Job titles the person held in past (non-current) roles, up to 50. Supports capitalized AND, OR, NOT. Cannot be combined with current_titles_only false, or with match_experience when both job_title and company are set. Example: ["Software Engineer"]
- `past_work_location` (`array`, optional): Locations where the person worked before, up to 50. Example: ["London"]
- `recently_changed_jobs` (`boolean`, optional): If true, returns only people whose current job started within the last 3 calendar months. Cannot be used with years_in_current_role.
- `reveal_info` (`boolean`, optional): If true, contact_info in each profile is filled with emails and phones, and email/phone credits are charged. API default is false.
- `seniority` (`array`, optional): Seniority levels to filter by, up to 50. Example: ["Manager", "Vice President"]
- `skills` (`array`, optional): Skills to match, up to 50. Supports capitalized AND, OR, NOT. Example: ["Python", "Machine Learning"]
- `years_in_current_role` (`array`, optional): Years-in-current-role ranges, up to 20. Example values: 1_2, 3_5. Cannot be used with recently_changed_jobs. Example: ["1_2"]
- `years_of_experience` (`array`, optional): Total years of experience ranges, up to 20. Example values: 1_2, 3_5, 6_10, 10. Example: ["3_5", "6_10"]

Example input: `{}`

### `contactout_verify_email`

Verify Email · Read-only

Check whether one email address is deliverable.
Returns data.status: valid, invalid, accept_all, disposable or unknown.
Use this for one address. Use contactout_create_bulk_email_verification_job for up to 100.

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

Inputs:

- `email` (`string`, required): Email address to verify. Example: jane.doe@example.com

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

### `contactout_add_campaign_recipients`

Add Campaign Recipients · Write

Add up to 100 recipients to an email campaign.
Returns success_count, failure_count and results with each recipient's email, status (success, warning or failed) and message.
Use contactout_list_campaigns to find the campaign_id. Use contactout_start_campaign to send to them.
Requires the Campaigns API to be enabled for your API token; otherwise ContactOut returns 403.

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

Inputs:

- `campaign_id` (`string`, required): ID of the campaign to add recipients to. Get it from contactout_list_campaigns (the id field) or from the last segment of the campaign URL in the ContactOut web app. Example: pEVRKd
- `recipients` (`array`, required): Recipients to add, 1 to 100. Each recipient needs an email or a valid phone number, and can also have a first name, last name and company. Recipients are processed one by one, so some can fail while others succeed. Example: [{"email": "jane.doe@example.com", "first_name": "Jane", "last_name": "Doe", "company": "Acme"}]

Example input: `{"campaign_id":"<campaign_id>","recipients":[{"email":"jane.doe@example.com","first_name":"Jane","last_name":"Doe","company":"Acme"}]}`

### `contactout_create_bulk_contact_info_job`

Create Bulk Contact Info Job · Write

Start an asynchronous job that finds emails, and optionally phones, for up to 1000 LinkedIn profile URLs, including real-time work email lookup.
Returns status (QUEUED) and job_id.
Use this for large batches. Then call contactout_get_bulk_contact_info_job with the job_id, or receive results at callback_url. Use contactout_bulk_get_contact_info for 100 URLs or fewer.

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

Inputs:

- `profiles` (`array`, required): LinkedIn profile URLs to process, 1 to 1000. Example: ["https://www.linkedin.com/in/example-person"]
- `callback_url` (`string`, optional): Optional HTTPS URL that ContactOut POSTs the results to when the job finishes. If omitted, poll for results with the job_id. Example: https://example.com/webhooks/contactout
- `email_type` (`string`, optional): Which emails to return. personal returns only personal emails; work returns only work emails (verified in real time, slower); personal,work returns both; none returns no emails and uses no email credits. One of: `personal`, `work`, `personal,work`, `none`.
- `include_phone` (`boolean`, optional): If true, results include phone numbers and use phone credits. API default is false.

Example input: `{"profiles":["https://www.linkedin.com/in/example-person"]}`

### `contactout_create_bulk_email_verification_job`

Create Bulk Email Verification Job · Write

Start an asynchronous job that checks deliverability for up to 100 email addresses.
Returns status (QUEUED) and job_id.
Then call contactout_get_bulk_email_verification_job with the job_id, or receive results at callback_url. Use contactout_verify_email for a single address.

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

Inputs:

- `emails` (`array`, required): Email addresses to verify, 1 to 100. Example: ["jane.doe@example.com", "john@example.org"]
- `callback_url` (`string`, optional): Optional HTTPS URL that ContactOut POSTs the results to when the job finishes. If omitted, poll for results with the job_id. Example: https://example.com/webhooks/contactout

Example input: `{"emails":["jane.doe@example.com","john@example.org"]}`

### `contactout_start_campaign`

Start Campaign · Write

Start a draft email campaign, or resume a stopped one.
Returns message and data with the campaign id and its new status; an already active campaign returns 200 with Campaign is already active.
Use contactout_stop_campaign to stop it. Fails with 422 when the campaign can't start from its current status, for example completed.
Requires the Campaigns API to be enabled for your API token; otherwise ContactOut returns 403.

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

Inputs:

- `campaign_id` (`string`, required): ID of the campaign to start. Get it from contactout_list_campaigns (the id field) or from the last segment of the campaign URL in the ContactOut web app. Example: pEVRKd

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

### `contactout_stop_campaign`

Stop Campaign · Write

Stop a running email campaign.
Returns message and data with the campaign id and its new status; an already stopped campaign returns 200 with Campaign is already stopped.
Use contactout_start_campaign to resume it. Fails with 422 when the campaign can't stop from its current status.
Requires the Campaigns API to be enabled for your API token; otherwise ContactOut returns 403.

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

Inputs:

- `campaign_id` (`string`, required): ID of the campaign to stop. Get it from contactout_list_campaigns (the id field) or from the last segment of the campaign URL in the ContactOut web app. Example: pEVRKd

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

### `contactout_remove_campaign_recipients`

Remove Campaign Recipients · Destructive

Remove up to 100 recipients from an email campaign by email address.
Returns success_count, failure_count and results with each recipient's email, status and message (for example Recipient not found in campaign).
Use contactout_list_campaigns to find the campaign_id.
Requires the Campaigns API to be enabled for your API token; otherwise ContactOut returns 403.

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

Inputs:

- `campaign_id` (`string`, required): ID of the campaign to remove recipients from. Get it from contactout_list_campaigns (the id field) or from the last segment of the campaign URL in the ContactOut web app. Example: pEVRKd
- `recipients` (`array`, required): Recipients to remove, 1 to 100, each identified by email. Example: [{"email": "jane.doe@example.com"}]

Example input: `{"campaign_id":"<campaign_id>","recipients":[{"email":"jane.doe@example.com"}]}`

## 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 |
