Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to Greenhouse

Scalekit connector
Open markdown

The Greenhouse connector lets your AI agent act in each user's Greenhouse account. Each user signs in to Greenhouse once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 90 tools.

Tools
90
What they doRead · write · destructive
46 · 32 · 1246 read32 write12 destructive
Users sign in with
OAuth app
Your own Greenhouse app

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 Greenhouse connection

    In AgentKit > Connections, create a Greenhouse connection and copy its redirect URI. The name you give it is the connection_name your code passes. See Configure connections.

  4. Register an OAuth app

    Greenhouse connections use your own OAuth app. Register one with Greenhouse and add the redirect URI you copied.

    Then enter the app's Client ID and Client Secret on the Greenhouse connection.

  5. 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 = 'greenhouse'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Greenhouse:', 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: 'greenhouse_application_stages_list',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • greenhouse_application_stages_listList the stage history rows of Greenhouse applications, one row per interview stage an application has occupied.Read-only

    List Application Stages

    List the stage history rows of Greenhouse applications, one row per interview stage an application has occupied. Returns stage rows with application_id, job_interview_stage_id, entered_at and exited_at. Use this for time-in-stage or the current stage of an application (current true). Use greenhouse_job_interview_stages_list for a job's stage definitions.

    Inputs

    application_idsstring
    Return only rows for these application ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    currentboolean
    When true, return only the application's current stage entry (the one with exited_at null); when false, only past stage entries. Omit to include the full stage history. Example: true
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: application_id, created_at, current, days_in_stage, entered_at, exited_at, id, job_interview_stage_id, updated_at. Example: id,application_id,created_at
    idsstring
    Return only application stages with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    job_interview_stage_idsstring
    Return only stage entries where the application visited one of these interview stage ids. These are hiring plan interview stage ids (look up the stages on a job via greenhouse_job_interview_stages_list (filtered by job_ids)); each row represents an application's visit to a stage, not the stage definition itself. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
  • greenhouse_applications_listList Greenhouse applications, filtered by candidate, job, job post, source, referrer, stage, status, or created/updated time.Read-only

    List Applications

    List Greenhouse applications, filtered by candidate, job, job post, source, referrer, stage, status, or created/updated time. Returns applications with candidate_id, job_id, current stage_id and stage_name, status, source, recruiter, coordinator and rejection data, newest first. Use this to see where candidates are in the pipeline. Use greenhouse_application_stages_list for an application's stage history.

    Inputs

    candidate_idsstring
    Return only rows for these candidate ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    custom_field_option_idinteger
    Return only applications whose application custom field value matches this single-select or multi-select option id. Example: 4012345002
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: agency_note_id, answers, candidate_id, coordinator_id, created_at, custom_fields, id, job_id, job_interview_stage_id, job_post_id, last_activity_at, location_address, needs_decision, prospect, prospective_job_ids, recruiter_id, referrer_id, rejected_at, rejection_reason_id, source_id, stage_id, stage_name, status, updated_at. Example: id,agency_note_id,answers
    idsstring
    Return only applications with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    job_idsstring
    Return only applications attached to these job (hiring plan) ids. This is the application's current job, not any prospective placement — use prospective_job_ids for that. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    job_interview_stage_idsstring
    Return only applications whose current job interview stage matches one of these stage IDs. These are job interview stage definition IDs (IDs from greenhouse_job_interview_stages_list). Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    job_post_idsstring
    Return only rows for these job post ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    last_activity_at_afterstring
    Filter by last-activity timestamp on the application: return records on or after this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    last_activity_at_beforestring
    Filter by last-activity timestamp on the application: return records on or before this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    prospectboolean
    When true, return only prospect applications; when false, only non-prospect (candidate) applications. Omit to include both. Example: true
    prospective_job_idsstring
    Return only applications that have a prospective placement on one of these job (hiring plan) ids. Prospective jobs are jobs a candidate is being considered for before being moved onto them; use job_ids to filter by the application's current job. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    referrer_idsstring
    Return only applications attributed to these referrer ids. A referrer is the Greenhouse Referrer record (see greenhouse_referrers_list) — not a user id. Look up the referrer id for a user via that endpoint first. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    source_idsstring
    Return only rows for these source ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    stage_idsstring
    Return only applications whose current stage matches one of these stage IDs. These are application-stage IDs — the same value returned as stage_id on each application — not job interview stage definition IDs (IDs from greenhouse_job_interview_stages_list will not match). Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    stage_namestring
    Filter applications by current stage name (exact match, case sensitive). Useful when you want to slice by stage without first looking up its id. Example: Phone Screen
    statusstring
    Filter by the application's lifecycle status. active returns applications still in process; rejected and hired filter by terminal state. One of: rejected, hired, converted, active. Example: rejectedone of rejectedhiredconvertedactive
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
  • greenhouse_applied_candidate_tags_listList the tags applied to Greenhouse candidates, one row per candidate and tag, filtered by candidate or tag.Read-only

    List Applied Candidate Tags

    List the tags applied to Greenhouse candidates, one row per candidate and tag, filtered by candidate or tag. Returns rows with id, candidate_id and candidate_tag_id. Use this to see a candidate's tags or everyone with a tag. Use greenhouse_candidate_tags_list for the tag names.

    Inputs

    candidate_idsstring
    Return only rows for these candidate ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    candidate_tag_idsstring
    Return only rows for these candidate tag ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: candidate_id, candidate_tag_id, created_at, id, updated_at. Example: id,candidate_id,candidate_tag_id
    idsstring
    Return only applied candidate tags with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
  • greenhouse_attachments_listList files attached to Greenhouse applications, such as resumes, cover letters and offer letters, filtered by candidate, application, or type.Read-only

    List Attachments

    List files attached to Greenhouse applications, such as resumes, cover letters and offer letters, filtered by candidate, application, or type. Returns attachments with id, application_id, candidate_id, type, filename and a short-lived download url. Use this to find a candidate's resume or documents. Use greenhouse_attachment_create to add a file.

    Inputs

    application_idsstring
    Return only rows for these application ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    candidate_idsstring
    Return only attachments whose application belongs to one of these candidates (people). Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: application_id, candidate_id, created_at, filename, id, type, updated_at, url. Example: id,application_id,candidate_id
    idsstring
    Return only attachments with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    typestring
    Filter by attachment type. resume, cover_letter, take_home_test are candidate-supplied documents; offer_packet, offer_letter, signed_offer_letter are offer documents; midfunnel_agreement and automated_agreement are e-signed documents; form_attachment is generated by Greenhouse forms; other is the free-form bucket. One of: resume, cover_letter, take_home_test, offer_packet, offer_letter, signed_offer_letter, other, form_attachment, midfunnel_agreement, automated_agreement. Example: resumeone of resumecover_lettertake_home_testoffer_packetoffer_lettersigned_offer_letterotherform_attachmentmidfunnel_agreementautomated_agreement
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
  • greenhouse_candidate_educations_listList education entries on Greenhouse candidate profiles, filtered by candidate, latest entry, or start/end date.Read-only

    List Candidate Educations

    List education entries on Greenhouse candidate profiles, filtered by candidate, latest entry, or start/end date. Returns educations with candidate_id, school, degree and discipline option ids, and start and end dates. Use this to read a candidate's education. Use greenhouse_candidate_employments_list for work history.

    Inputs

    candidate_idsstring
    Return only rows for these candidate ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    end_at_afterstring
    Filter by education end date: return records on or after this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    end_at_beforestring
    Filter by education end date: return records on or before this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: candidate_id, created_at, degree_custom_field_option_id, discipline_custom_field_option_id, end_at, end_date_month, end_date_year, id, latest, school_name_custom_field_option_id, start_at, start_date_month, start_date_year, updated_at. Example: id,candidate_id,created_at
    idsstring
    Return only candidate educations with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    latestboolean
    When true, return only each candidate's most recent education entry; when false, exclude the most recent. Omit to include the full education history. Example: true
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    start_at_afterstring
    Filter by education start date: return records on or after this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    start_at_beforestring
    Filter by education start date: return records on or before this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
  • greenhouse_candidate_employments_listList work history entries on Greenhouse candidate profiles, filtered by candidate or latest entry.Read-only

    List Candidate Employments

    List work history entries on Greenhouse candidate profiles, filtered by candidate or latest entry. Returns employments with candidate_id, company_name, title, start_date and end_date. Use this to read a candidate's work history. Use greenhouse_candidate_educations_list for education.

    Inputs

    candidate_idsstring
    Return only rows for these candidate ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: candidate_id, company_name, created_at, end_date, id, latest, start_date, title, updated_at. Example: id,candidate_id,company_name
    idsstring
    Return only candidate employments with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    latestboolean
    When true, return only each candidate's most recent employment entry; when false, exclude the most recent. Omit to include the full work history. Example: true
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
  • greenhouse_candidate_tags_listList the organization's Greenhouse candidate tag dictionary.Read-only

    List Candidate Tags

    List the organization's Greenhouse candidate tag dictionary. Returns tags with id and name. Use this to find a candidate_tag_id. Use greenhouse_applied_candidate_tags_list to see which candidates carry a tag.

    Inputs

    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: created_at, id, name, updated_at. Example: id,created_at,name
    idsstring
    Return only candidate tags with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
  • greenhouse_candidates_listList Greenhouse candidates and prospects, optionally filtered by ids, email, tag, custom field option, or created/updated time.Read-only

    List Candidates

    List Greenhouse candidates and prospects, optionally filtered by ids, email, tag, custom field option, or created/updated time. Returns candidate profiles (id, names, company, title, emails, phones, tags, custom fields, last activity), newest first, up to per_page (max 500). Use this to find a candidate or fetch one by id via ids. Use greenhouse_applications_list for a candidate's job applications.

    Inputs

    created_atstring
    Filter by when the record was created, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z
    custom_field_option_idinteger
    Return only candidates whose custom field value matches this single-select or multi-select option id. Example: 4012345002
    emailstring
    Return only candidates with this email address on their profile. Matches against any of the candidate's email addresses, case-insensitively. Example: jane.doe@example.com
    fieldsstring
    Comma-separated list of fields to include in each result, to keep responses small. Allowed values: addresses, can_email, company, created_at, custom_fields, email_addresses, first_name, id, last_activity_at, last_name, linked_user_ids, phone_numbers, preferred_name, private, social_media_addresses, tags, time_zone, title, updated_at, website_addresses. Example: id,addresses,can_email
    idsstring
    Return only candidates with these ids. Pass a comma-separated list of ids (up to 50). Example: 4012345002,4012345003
    last_activity_at_afterstring
    Filter by last-activity timestamp on the candidate's applications: return records on or after this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    last_activity_at_beforestring
    Filter by last-activity timestamp on the candidate's applications: return records on or before this value, given as an ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
    per_pageinteger
    Number of results to return, from 1 to 500. Defaults to 100. Results are ordered newest first (by id). Example: 100
    privateboolean
    Include private candidates the caller has access to. Defaults to true; set false to exclude private candidates. Example: true
    tagstring
    Filter by candidate tag name (exact match). Use the greenhouse_candidate_tags_list endpoint to discover available tag names for your organization. Example: referral
    updated_atstring
    Filter by when the record was last updated, written as operator|timestamp where operator is gte, lte, gt or lt and the timestamp is ISO 8601. Do not combine created_at and updated_at in one call. Example: gte|2026-01-01T00:00:00Z