Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to ContactOut

Scalekit connector
Open markdown

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.

Tools
26
What they doRead · write · destructive
20 · 5 · 120 read5 write1 destructive
Users sign in with

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

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

  4. Authorize a user and make your first call

    quickstart.mts
    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)
    Terminal window
    npx tsx quickstart.mts

    Each user opens the link once and enters their ContactOut credentials there. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • contactout_bulk_get_contact_infoGet emails, and optionally phones, for up to 100 LinkedIn profile URLs in one synchronous request.Read-only

    Bulk Get Contact Info

    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.

    Inputs

    profilesarrayrequired
    LinkedIn profile URLs to look up, 1 to 100. Example: ["https://www.linkedin.com/in/example-person"]
    email_typestring
    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 personalworkpersonal,work
    include_phoneboolean
    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.
  • contactout_check_personal_emailCheck whether ContactOut has a personal email for a LinkedIn profile, without using credits.Read-only

    Check Personal Email

    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.

    Inputs

    profilestringrequired
    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
  • contactout_check_phoneCheck whether ContactOut has a phone number for a LinkedIn profile, without using credits.Read-only

    Check Phone

    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.

    Inputs

    profilestringrequired
    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
  • contactout_check_work_emailCheck whether ContactOut has a work email for a LinkedIn profile, without using credits.Read-only

    Check Work Email

    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.

    Inputs

    profilestringrequired
    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
  • contactout_count_peopleCount the people that match a set of search filters, without using credits.Read-only

    Count People

    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.

    Inputs

    companyarray
    Company names to match, up to 50. Scope (current or past employer) is set by company_filter. Example: ["Stripe", "Plaid"]
    company_filterstring
    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 currentpastpast_onlyboth
    company_sizearray
    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_onlyboolean
    If true (the API default), company matches only the current employer.
    current_titles_onlyboolean
    If true (the API default), job_title matches only current roles. Set false to also match past job titles.
    current_work_locationarray
    Locations where the person currently works, up to 50. Example: ["New York"]
    domainarray
    Company website domains to match, up to 50. Example: ["stripe.com"]
    educationarray
    Schools or degrees to match, up to 50. Supports capitalized AND, OR, NOT. Example: ["Stanford University"]
    educationsarray
    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_companiesarray
    Company names to exclude, up to 50. Scope is set by exclude_companies_filter (default both current and past). Example: ["Acme Corp"]
    exclude_companies_filterstring
    Which roles exclude_companies applies to: current, past, or both (API default). Independent of company_filter.one of currentpastboth
    exclude_job_titlesarray
    Job titles to exclude from results. Example: ["Intern", "Assistant"]
    include_related_job_titlesboolean
    If true, also matches job titles related to the ones in job_title. API default is false.
    industryarray
    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_workingboolean
    If true, returns only people with an active current role; if false, only people without one. Omit to return both.
    job_functionarray
    Job functions to filter by, up to 50. Example: ["Engineering", "Sales"]
    job_titlearray
    Current job titles to match (up to 50). Supports capitalized boolean operators AND, OR, NOT inside a value. Example: ["Head of Sales", "VP Sales"]
    keywordstring
    Keyword that appears anywhere in the profile. Supports capitalized AND, OR, NOT. Example: fintech AND payments
    languagesarray
    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"]}]
    locationarray
    Locations where the person lives, up to 50. Example: ["San Francisco, California", "United States"]
    location_radiusinteger
    Search radius in miles around location, from 1 to 500. Works only when location is a city or area. Example: 25
    match_experiencestring
    Requires job_title and company to match within the same experience entry: current (API default), past, or both.one of currentpastboth
    namestring
    Full or partial name of the person to find. Example: Jane Doe
    past_companyarray
    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_titlearray
    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_locationarray
    Locations where the person worked before, up to 50. Example: ["London"]
    recently_changed_jobsboolean
    If true, returns only people whose current job started within the last 3 calendar months. Cannot be used with years_in_current_role.
    seniorityarray
    Seniority levels to filter by, up to 50. Example: ["Manager", "Vice President"]
    skillsarray
    Skills to match, up to 50. Supports capitalized AND, OR, NOT. Example: ["Python", "Machine Learning"]
    years_in_current_rolearray
    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_experiencearray
    Total years of experience ranges, up to 20. Example values: 1_2, 3_5, 6_10, 10. Example: ["3_5", "6_10"]
  • contactout_enrich_domainsGet company information for up to 30 domains in one request.Read-only

    Enrich Company Domains

    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.

    Inputs

    domainsarrayrequired
    Company domains to look up, 1 to 30. Example: ["contactout.com", "stripe.com"]
  • contactout_enrich_emailFind the LinkedIn profile and contact details behind an email address.Read-only

    Enrich Email Address

    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.

    Inputs

    emailstringrequired
    Email address to look up. Personal emails usually match better than work emails. Example: jane.doe@gmail.com
    includestring
    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
  • contactout_enrich_linkedin_profileGet the full profile for a LinkedIn profile URL, including emails, phones, work history, education and skills.Read-only

    Enrich LinkedIn Profile

    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.

    Inputs

    profilestringrequired
    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_onlyboolean
    If true, returns profile data without contact information and uses 1 search credit instead of email/phone credits. API default is false.