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

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

**Authentication:** Bearer Token
**Categories:** CRM & Sales, Marketing
**Tools:** 35: 23 read, 8 write, 4 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=FINDYMAIL)

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

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

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

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

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

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Findymail 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: 'findymail_find_email_by_business_profile',
  toolInput: {
    linkedin_url: '<linkedin_url>',
  },
  connector: 'findymail',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="findymail_find_email_by_business_profile",
    tool_input={
        "linkedin_url": "<linkedin_url>",
    },
    connection_name="findymail",
    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.

### `findymail_find_email_by_business_profile`

Find Email by LinkedIn Profile · Read-only

Find a person's verified work email from their LinkedIn profile URL or username.
Returns a contact object with name, domain, and email; uses 1 finder credit only when a verified email is found.
Use find_email_by_business_profile when you have a LinkedIn profile. Use find_email_by_name when you only have a name and company, and find_phone for a phone number.

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

Inputs:

- `linkedin_url` (`string`, required): The person's LinkedIn profile URL, or just the profile username. Example: https://www.linkedin.com/in/johndoe or johndoe.

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

### `findymail_find_email_by_name`

Find Email by Name · Read-only

Find a person's verified work email from their full name and their company's domain or name.
Returns a contact object with name, domain, and email; uses 1 finder credit only when a verified email is found.
Use find_email_by_name when you know the person's name and company. Use find_email_by_business_profile when you have their LinkedIn URL, and verify_email to check an address you already have.

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

Inputs:

- `domain` (`string`, required): The company's website domain (most accurate) or the company name. Example: website.com.
- `name` (`string`, required): The person's full name. Example: John Doe.

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

### `findymail_find_employees`

Find Employees · Read-only

Find people who work at a company in given job titles, using the company website.
Returns a list of contacts with name, linkedinUrl, companyName, companyWebsite, and jobTitle, without emails; uses 1 credit per contact found.
Use find_employees to discover who holds a role at a company. Then use find_email_by_business_profile with a returned linkedinUrl to get that person's email.

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

Inputs:

- `job_titles` (`array`, required): Job titles to search for, up to 10. Example: ["Software Engineer", "CEO"].
- `website` (`string`, required): The company's website domain. Example: google.com.
- `count` (`integer`, optional): How many contacts to return, from 1 to 5. Defaults to 1. Each contact found costs 1 credit. Example: 3. Default: `1`.

Example input: `{"job_titles":["Software Engineer","CEO"],"website":"<website>"}`

### `findymail_find_phone`

Find Phone Number · Read-only

Find a person's phone number from their LinkedIn profile URL or username.
Returns phone (E.164, US numbers only) and line_type, both null when nothing is found; uses 10 finder credits only when a phone is found. Requests for EU citizens return no result.
Use find_phone for a phone number. Use find_email_by_business_profile for an email from the same profile.

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

Inputs:

- `linkedin_url` (`string`, required): The person's LinkedIn profile URL, or just the profile username. Example: https://www.linkedin.com/in/johndoe or johndoe.

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

### `findymail_get_company`

Get Company · Read-only

Look up a company's firmographic data by LinkedIn company URL, website domain, or name.
Returns name, domain, company_size, industry, linkedin_url, and description; uses 1 finder credit only when data is found, and returns 404 when no company matches.
Use get_company for one known company. Use search_lookalike_companies to find similar companies, and lookup_company_technologies for a company's tech stack.
Provide at least one of linkedin_url, domain, or name.

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

Inputs:

- `domain` (`string`, optional): The company's website domain. Example: stripe.com.
- `linkedin_url` (`string`, optional): The company's LinkedIn page URL. Example: https://www.linkedin.com/company/findymail/.
- `name` (`string`, optional): The company name. Least precise of the three identifiers. Example: Stripe.

Example input: `{}`

### `findymail_get_credits`

Get Remaining Credits · Read-only

Get the account's remaining Findymail credit balance.
Returns credits (finder credits) and verifier_credits.
Use get_credits for the current balance. Use get_usage_summary for credits spent over time.

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

Inputs: none.

Example input: `{}`

### `findymail_get_exclusion_list`

Get Exclusion List · Read-only

Get one exclusion list's details, without its domains.
Returns id, name, is_shared, is_owner, user_id, and owner_name.
Use get_exclusion_list for one list's settings. Use list_excluded_domains with list_id for its domains.

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

Inputs:

- `list_id` (`integer`, required): The numeric ID of the exclusion list. Example: 16.

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

### `findymail_get_intellimatch_results`

Get Intellimatch Results · Read-only

Read the company and contact rows from a completed Intellimatch search, one page at a time.
Returns data rows (company name, domain, description, employee_count_range, industries, country, match_score, and contact name, email, job title, phone, and LinkedIn URL) plus meta with current_page, last_page, and total. Returns 404 if the search is not finished.
Use get_intellimatch_results after get_intellimatch_status reports success.
Requires the hash from create_intellimatch_search.

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

Inputs:

- `hash` (`string`, required): The hash returned by create_intellimatch_search. Example: 74ebbec924a9666053d234eecc685a1d73c699d1.
- `page` (`integer`, optional): Page number to return, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Rows per page, from 1 to 500. Defaults to 100. Example: 250.

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

### `findymail_get_intellimatch_status`

Get Intellimatch Status · Read-only

Check the progress of an Intellimatch search.
Returns status (success, processing, pending, failed, or not_found) with progress, total_jobs, processed_jobs, pending_jobs, and failed_jobs.
Use get_intellimatch_status to poll until status is success. Then use get_intellimatch_results to read the rows.
Requires the hash from create_intellimatch_search.

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

Inputs:

- `hash` (`string`, required): The hash returned by create_intellimatch_search. Example: 74ebbec924a9666053d234eecc685a1d73c699d1.

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

### `findymail_get_signal`

Get Signal · Read-only

Get one signal with its contact, company, and the monitors that matched it.
Returns id, type, category, payload, detected_at, expires_at, contact, company, and monitors.
Use get_signal for one signal's full details. Use list_signals to browse and find signal IDs.

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

Inputs:

- `signal_id` (`integer`, required): The numeric ID of the signal. Example: 1.

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

### `findymail_get_team_usage_summary`

Get Team Usage Summary · Read-only

Get credit usage for every member of your team over a date range. Only team owners can call this.
Returns from, to, total finder and verifier credits used, and members with each person's name and usage. Returns 403 if you are not the team owner.
Use get_team_usage_summary to compare usage across the team. Use get_usage_summary for your own usage over time.

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

Inputs:

- `from` (`string`, optional): Start date (inclusive) of the report, in YYYY-MM-DD format. Leave empty to use the default (30 days ago). Example: 2026-01-01.
- `to` (`string`, optional): End date (inclusive) of the report, in YYYY-MM-DD format. Leave empty to use the default (today). Example: 2026-01-31.

Example input: `{}`

### `findymail_get_usage_summary`

Get Usage Summary · Read-only

Get your own credit usage over a date range, grouped by day for ranges under 2 months and by month otherwise.
Returns from, to, total finder and verifier credits used, and items with finder and verifier usage per period.
Use get_usage_summary for your own usage history. Use get_team_usage_summary for usage per team member, and get_credits for the remaining balance.

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

Inputs:

- `from` (`string`, optional): Start date (inclusive) of the usage timeline, in YYYY-MM-DD format. Leave empty to use the default (30 days ago). Example: 2026-01-01.
- `to` (`string`, optional): End date (inclusive) of the usage timeline, in YYYY-MM-DD format. Leave empty to use the default (today). Example: 2026-01-31.

Example input: `{}`

### `findymail_list_contact_lists`

List Contact Lists · Read-only

List the contact lists in the Findymail account.
Returns lists with id, name, shared_with_team, is_owner, created_at, and updated_at.
Use list_contact_lists to find a list ID. Use list_contacts to read the contacts saved in a list.

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

Inputs: none.

Example input: `{}`

### `findymail_list_contacts`

List Contacts · Read-only

List the contacts saved in Findymail, either all of them or those in one contact list.
Returns recordsTotal and a data array of contacts with id, name, email, linkedin_url, company, and job_title.
Use list_contacts to read saved contacts. Use list_contact_lists to find a list ID.

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

Inputs:

- `list_id` (`integer`, optional): ID of the contact list to read. Use 0 for all contacts regardless of list. Defaults to 0. Example: 18. Default: `0`.

Example input: `{}`

### `findymail_list_excluded_domains`

List Excluded Domains · Read-only

List excluded domains, from one exclusion list or from your global exclusions, one page at a time.
Returns data (id, domain, excluded_domain_list_id) with current_page, per_page, and total.
Use list_excluded_domains to see or search excluded domains and get their IDs for remove_excluded_domains. Use list_exclusion_lists to see the lists themselves.

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

Inputs:

- `list_id` (`integer`, optional): Exclusion list to read. Leave empty for the global exclusion list. Example: 1.
- `page` (`integer`, optional): Page number to return, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Domains per page. Example: 50.
- `query` (`string`, optional): Text to filter domains by. Example: competitor.

Example input: `{}`

### `findymail_list_exclusion_lists`

List Exclusion Lists · Read-only

List the exclusion lists you own or that are shared with your team.
Returns lists with id, name, is_shared, is_owner, user_id, and owner_name.
Use list_exclusion_lists to find exclusion list IDs. Use list_excluded_domains to see the domains inside a list.

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

Inputs: none.

Example input: `{}`

### `findymail_list_signal_monitors`

List Signal Monitors · Read-only

List the signal monitors you own or that are shared with your team, newest first.
Returns monitors with id, name, signal_type, status, keywords, icp_filters, enrichment_level, match_count, sharing, and owner details.
Use list_signal_monitors to find monitor IDs and settings. Use list_signals to read what the monitors found.

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

Inputs:

- `ownership` (`string`, optional): Which monitors to return: my (yours), team (shared with your team), or all. Example: my. One of: `my`, `team`, `all`.

Example input: `{}`

### `findymail_list_signals`

List Signals · Read-only

List buying signals detected by your monitors and team-shared monitors, with optional filters, one page at a time.
Returns data (id, type, category, payload, detected_at, contact, company, and the matching monitors with relevance scores) plus pagination details.
Use list_signals to review recent signals. Use get_signal for one signal, and list_signal_monitors to see the monitors.

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

Inputs:

- `date_from` (`string`, optional): Only return signals detected on or after this date (YYYY-MM-DD). Example: 2026-01-01.
- `date_to` (`string`, optional): Only return signals detected on or before this date (YYYY-MM-DD). Example: 2026-03-01.
- `monitor_id` (`integer`, optional): Only return signals from this monitor. Get IDs from list_signal_monitors. Example: 1.
- `page` (`integer`, optional): Page number to return, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Signals per page, from 1 to 100. Defaults to 50. Example: 25.
- `relevance_scores` (`string`, optional): Comma-separated AI relevance scores to include, each from 0 to 5. Example: 3,4,5.
- `signal_type` (`string`, optional): Only return signals of this type. Example: keyword_mention. One of: `keyword_mention`, `new_hire`, `job_change`, `post_engagement`.

Example input: `{}`

### `findymail_lookup_company_technologies`

Lookup Company Technologies · Read-only

Get the technology stack a company uses, by its domain, optionally filtered to specific technologies.
Returns the resolved domain and technologies with name, category, subcategory, and last_detected_at; costs 1 finder credit when technologies are found, free otherwise.
Use lookup_company_technologies for one company's stack. Use search_technologies to find the catalog names to filter on.

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

Inputs:

- `domain` (`string`, required): The company's website domain. Example: stripe.com.
- `technologies` (`array`, optional): Technology names to check for, case-insensitive. Leave empty to return the full stack. Example: ["React", "TypeScript"].

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

### `findymail_reverse_email_lookup`

Reverse Email Lookup · Read-only

Find the LinkedIn profile behind a work or personal email address.
Returns the linkedin_url, or full profile data (name, headline, job title, location, company, jobs, education) when with_profile is true. Uses 1 finder credit when a profile is found, or 2 with with_profile.
Use reverse_email_lookup to go from an email to a person. Use find_email_by_business_profile to go from a profile to an email.

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

Inputs:

- `email` (`string`, required): The email address to look up. Work and personal emails both work. Example: john@example.com.
- `with_profile` (`boolean`, optional): Set to true to also return the full profile (name, headline, job, location, company, work history, education). Costs 2 finder credits instead of 1. Defaults to false. Example: true. Default: `false`.

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

### `findymail_search_lookalike_companies`

Search Lookalike Companies · Read-only

Find companies similar to a seed company domain, optionally limited to the same country or size.
Returns companies (domain, name, linkedin_url, company_size, country), total, and credits_used; costs 1 finder credit per 10 results, rounded up.
Use search_lookalike_companies to expand from a known good customer. Use create_intellimatch_search to search from a text description, and get_company for one company's details.

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

Inputs:

- `seed` (`string`, required): Domain or URL of the company to find lookalikes for. Example: stripe.com.
- `exclusion_list_ids` (`array`, optional): IDs of exclusion lists whose domains should be left out of the results. Get IDs from list_exclusion_lists. Example: [1, 2].
- `limit` (`integer`, optional): Maximum number of companies to return, from 1 to 10000. Defaults to 100. Each 10 results cost 1 credit. Example: 50. Default: `100`.
- `same_country` (`boolean`, optional): true to return only companies in the seed's country. Defaults to false. Example: true. Default: `false`.
- `same_size` (`boolean`, optional): true to return only companies in the seed's employee size range. Defaults to false. Example: true. Default: `false`.

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

### `findymail_search_technologies`

Search Technologies · Read-only

Search Findymail's technology catalog by name.
Returns up to 25 technologies with name, category, and subcategory. Free, but limited to 10 requests per minute.
Use search_technologies to find the exact technology names to filter on. Use lookup_company_technologies to see which technologies a company uses.

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

Inputs:

- `q` (`string`, required): Search term, at least 2 characters. Example: React.

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

### `findymail_verify_email`

Verify Email · Read-only

Check whether an email address is valid and deliverable.
Returns the email, a verified true/false flag, and the detected email provider; uses 1 verifier credit per attempt.
Use verify_email to check an address you already have. Use find_email_by_name or find_email_by_business_profile to discover an address.

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

Inputs:

- `email` (`string`, required): The email address to verify. Example: john@example.com.

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

### `findymail_add_excluded_domains`

Add Excluded Domains · Write

Add domains to an exclusion list, or to your global exclusions when no list is given.
Returns success, total, processed_immediately, queued, and list_id. Batches over 50 domains are partly queued for background processing.
Use add_excluded_domains to stop Intellimatch and lookalike searches returning these companies. Use remove_excluded_domains to undo.

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

Inputs:

- `domains` (`array`, required): Domains to exclude, up to 10000. Example: ["competitor.com", "blocked.io"].
- `list_id` (`integer`, optional): Exclusion list to add the domains to. Leave empty to add them as global exclusions. Example: 1.

Example input: `{"domains":["competitor.com","blocked.io"]}`

### `findymail_create_contact_list`

Create Contact List · Write

Create a new contact list in Findymail.
Returns the new list with id, name, shared_with_team, is_owner, and timestamps.
Use create_contact_list for a list of saved contacts. Use create_exclusion_list for a list of domains to exclude from Intellimatch searches.

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

Inputs:

- `name` (`string`, required): Name of the new contact list. Example: Q3 prospects.

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

### `findymail_create_exclusion_list`

Create Exclusion List · Write

Create an exclusion list for domains that Intellimatch and lookalike searches should skip.
Returns the new list's id, name, is_shared, and is_owner. Returns 422 if you already have a list with that name.
Use create_exclusion_list to start a new list. Then use add_excluded_domains to fill it.

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

Inputs:

- `name` (`string`, required): Name of the list, unique among your lists. Example: Competitors.
- `is_shared` (`boolean`, optional): true to share the list with your current team. Leave empty to keep it private. Example: true.

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

### `findymail_create_intellimatch_search`

Create Intellimatch Search · Write

Start an Intellimatch search that finds companies, and optionally their contacts, from a plain-language description of your target market.
Returns a hash that identifies the search task. The search runs in the background; contact emails cost 1 finder credit each and phones 10 each.
Use create_intellimatch_search to build a new lead list from a description. Then poll get_intellimatch_status with the hash and read rows with get_intellimatch_results. Use search_lookalike_companies to start from a seed company instead.

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

Inputs:

- `query` (`string`, required): Plain-language description of the target companies. Example: SaaS companies in US with 50-200 employees.
- `config` (`object`, optional): Optional export settings; every key is optional. Set find_contact to true to find a contact at each company, and find_email or find_phone to enrich that contact (emails cost 1 credit each, phones 10). target_job_titles is a list of up to 3 priority tiers, each a list of equivalent titles; the search tries tier 1 first and falls back to the next (default [["CEO"]]). mode is broad (default) or targeted. require_email true keeps only companies where an email was found. lead_list_id adds found contacts to a contact list. add_to_exclusion_list true with exclusion_list_id saves exported domains to an exclusion list, and exclusion_filter_list_ids lists exclusion lists to filter out ([0] is the global list, the default; [-1] means no filter). Example: {"find_contact": true, "find_email": true, "target_job_titles": [["RevOps"], ["CEO", "CTO"]], "mode": "broad"}.
- `limit` (`integer`, optional): Maximum number of companies to export, from 1 to 5000. Defaults to 100. Example: 200. Default: `100`.

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

### `findymail_create_signal_monitor`

Create Signal Monitor · Write

Create a monitor that watches for a type of buying signal, such as keyword mentions, new hires, job changes, post engagement, or company hiring.
Returns the new monitor with id, name, signal_type, status, its settings, and match_count.
Use create_signal_monitor to start tracking a new signal. Use update_signal_monitor to change an existing one; the signal type can't be changed after creation.

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

Inputs:

- `name` (`string`, required): Name of the monitor. Example: Hiring monitor.
- `signal_type` (`string`, required): What the monitor watches for: keyword_mention (posts mentioning keywords), new_hire, job_change, post_engagement (likes or comments on a LinkedIn post or profile), or company_hiring (job postings). It can't be changed later. Example: keyword_mention. One of: `keyword_mention`, `new_hire`, `job_change`, `post_engagement`, `company_hiring`.
- `ai_relevance_prompt` (`string`, optional): Optional instructions, up to 500 characters, that Findymail's AI uses to score how relevant each matched signal is. Example: Focus on Series B+ SaaS companies hiring VP Sales.
- `engagement_types` (`array`, optional): Which engagement to track on a post_engagement monitor: like, comment, or both. Required for post_engagement monitors. Example: ["like", "comment"].
- `enrichment_level` (`string`, optional): How much to enrich matched contacts: email, or email_phone for email plus phone. Example: email. One of: `email`, `email_phone`.
- `icp_filters` (`object`, optional): Optional ideal-customer-profile filters that narrow which signals match. The object can hold industries (LinkedIn industry names), employee_count_ranges (any of 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+), countries (2-letter ISO codes), job_title_keywords (up to 10), and seniority_levels (numbers: 1 Entry, 4 IC, 6 Senior IC, 8 Management, 9 Director, 11 VP, 13 Executive, 14 C-Suite, 15 Founder). job_title_keywords and seniority_levels are rejected for company_hiring monitors. Example: {"industries": ["Biotechnology"], "employee_count_ranges": ["51-200"], "countries": ["US", "FR"], "seniority_levels": [11, 13]}.
- `is_shared` (`boolean`, optional): true to share the monitor with your current team. Defaults to false. Example: false. Default: `false`.
- `job_offer_title_keywords` (`array`, optional): Job posting title keywords to watch for, up to 10, matched as case-insensitive substrings with OR logic. Required for company_hiring monitors and rejected for every other type. Example: ["Account Executive", "SDR"].
- `keywords` (`array`, optional): Keywords to track, up to 5. Required for keyword_mention monitors, and for post_engagement monitors that don't set post_url. Example: ["hiring", "fundraise"].
- `lead_list_id` (`integer`, optional): ID of a Findymail contact list to add matched contacts to automatically. Get IDs from list_contact_lists. Example: 42.
- `post_url` (`string`, optional): For post_engagement monitors: the LinkedIn post URL to watch. Use this or profile_url, or keywords. Example: https://www.linkedin.com/posts/johndoe_activity-123.
- `profile_url` (`string`, optional): For post_engagement monitors: a LinkedIn profile whose posts to watch, as an alternative to post_url. Example: https://www.linkedin.com/in/johndoe.
- `target_companies` (`array`, optional): Company names or domains to limit signals to, up to 100. Only allowed on new_hire and job_change monitors; any other type returns a 422. Example: ["stripe.com", "Notion"].
- `webhook_url` (`string`, optional): Optional HTTPS URL that Findymail calls when new signals match this monitor. Example: https://example.com/webhooks/signals.

Example input: `{"name":"<name>","signal_type":"keyword_mention"}`

### `findymail_update_contact_list`

Update Contact List · Write

Rename a contact list and set whether it is shared with your team.
Returns the updated list with id, name, shared_with_team, is_owner, and timestamps.
Use update_contact_list to change a list's name or sharing. Both name and is_shared are required, so pass the current name to change only sharing.

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

Inputs:

- `is_shared` (`boolean`, required): true to share the list with your team, false to make it private. Example: true.
- `list_id` (`integer`, required): The numeric ID of the contact list. Example: 16.
- `name` (`string`, required): The list's name. Pass the current name to keep it. Example: Q3 prospects.

Example input: `{"is_shared":true,"list_id":16,"name":"<name>"}`

### `findymail_update_exclusion_list`

Update Exclusion List · Write

Rename an exclusion list or change whether it is shared with your team. Only the list owner can do this.
Returns success and the updated list with id, name, is_shared, and is_owner. Returns 400 when sharing is requested but you are not on a team.
Use update_exclusion_list to change a list's settings. Use add_excluded_domains or remove_excluded_domains to change its domains.

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

Inputs:

- `list_id` (`integer`, required): The numeric ID of the exclusion list. Example: 16.
- `name` (`string`, required): The list's name, unique among your lists. Pass the current name to keep it. Example: Competitors 2026.
- `is_shared` (`boolean`, optional): true to share with your team, false to make the list private. Leave empty to keep the current setting. Example: false.

Example input: `{"list_id":16,"name":"<name>"}`

### `findymail_update_signal_monitor`

Update Signal Monitor · Write

Update a signal monitor's name, keywords, filters, enrichment, sharing, or webhook. The signal type can't be changed.
Returns the updated monitor with id, name, signal_type, status, its settings, and match_count.
Use update_signal_monitor to adjust a monitor. Use create_signal_monitor to track a different signal type.

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

Inputs:

- `monitor_id` (`integer`, required): The numeric ID of the monitor to update. Example: 1.
- `name` (`string`, required): The monitor's name. Pass the current name to keep it. Example: Updated monitor name.
- `ai_relevance_prompt` (`string`, optional): Optional instructions, up to 500 characters, that Findymail's AI uses to score how relevant each matched signal is. Example: Focus on Series B+ SaaS companies hiring VP Sales.
- `engagement_types` (`array`, optional): Which engagement to track on a post_engagement monitor: like, comment, or both. Required for post_engagement monitors. Example: ["like", "comment"].
- `enrichment_level` (`string`, optional): How much to enrich matched contacts: email, or email_phone for email plus phone. Example: email. One of: `email`, `email_phone`.
- `icp_filters` (`object`, optional): Optional ideal-customer-profile filters that narrow which signals match. The object can hold industries (LinkedIn industry names), employee_count_ranges (any of 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+), countries (2-letter ISO codes), job_title_keywords (up to 10), and seniority_levels (numbers: 1 Entry, 4 IC, 6 Senior IC, 8 Management, 9 Director, 11 VP, 13 Executive, 14 C-Suite, 15 Founder). job_title_keywords and seniority_levels are rejected for company_hiring monitors. Example: {"industries": ["Biotechnology"], "employee_count_ranges": ["51-200"], "countries": ["US", "FR"], "seniority_levels": [11, 13]}.
- `is_shared` (`boolean`, optional): true to share the monitor with your team, false to unshare it. Only the owner or a team admin can change this. Leave empty to keep the current setting. Example: true.
- `job_offer_title_keywords` (`array`, optional): Job posting title keywords to watch for, up to 10, matched as case-insensitive substrings with OR logic. Required for company_hiring monitors and rejected for every other type. Example: ["Account Executive", "SDR"].
- `keywords` (`array`, optional): Keywords to track, up to 5. Required for keyword_mention monitors, and for post_engagement monitors that don't set post_url. Example: ["hiring", "fundraise"].
- `lead_list_id` (`integer`, optional): ID of a Findymail contact list to add matched contacts to automatically. Get IDs from list_contact_lists. Example: 42.
- `target_companies` (`array`, optional): Company names or domains to limit signals to, up to 100. Only allowed on new_hire and job_change monitors; any other type returns a 422. Example: ["stripe.com", "Notion"].
- `webhook_url` (`string`, optional): Optional HTTPS URL that Findymail calls when new signals match this monitor. Example: https://example.com/webhooks/signals.

Example input: `{"monitor_id":1,"name":"<name>"}`

### `findymail_delete_contact_list`

Delete Contact List · Destructive

Delete a contact list from Findymail.
Returns an empty object on success.
Use delete_contact_list to remove a list permanently. Use update_contact_list to rename it instead.

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

Inputs:

- `list_id` (`integer`, required): The numeric ID of the contact list. Example: 16.

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

### `findymail_delete_exclusion_list`

Delete Exclusion List · Destructive

Delete an exclusion list and every domain in it. Only the list owner can do this.
Returns success true.
Use delete_exclusion_list to remove a whole list. Use remove_excluded_domains to remove only some domains.

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

Inputs:

- `list_id` (`integer`, required): The numeric ID of the exclusion list. Example: 16.

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

### `findymail_delete_signal_monitor`

Delete Signal Monitor · Destructive

Delete a signal monitor so it stops tracking signals.
Returns no content (HTTP 204) on success.
Use delete_signal_monitor to stop a monitor for good. Use update_signal_monitor to change it instead.

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

Inputs:

- `monitor_id` (`integer`, required): The numeric ID of the monitor to delete. Example: 1.

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

### `findymail_remove_excluded_domains`

Remove Excluded Domains · Destructive

Remove excluded domains by their IDs. Only domains you have permission to delete are removed.
Returns success and deleted_count; deleted_count is 0 when you lack permission.
Use remove_excluded_domains to drop specific domains. Use delete_exclusion_list to remove a whole list.
Get the domain IDs from list_excluded_domains.

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

Inputs:

- `ids` (`array`, required): IDs of the excluded-domain records to delete, as returned by list_excluded_domains (not the domain names). Example: [1, 2, 3].

Example input: `{"ids":[1,2,3]}`

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