Skip to content
ashby-api-guide logo

Ashby API Guide

ashby-api-guide

This skill should be used when the user asks about "Ashby API", "how to use Ashby tools", "Ashby authentication", "Ashby MCP tools", "what can I do with Ashby", or needs help understanding available Ashby operations. Provides complete API documentation and tool usage guidance.

SKILL.md

Full skill instructions

Ashby API Guide

Reference guide for working with the Ashby ATS integration. This skill covers authentication, available tools, and common usage patterns.

Overview

The Ashby plugin provides ~30 MCP tools for interacting with Ashby's Applicant Tracking System (ATS). All operations use Ashby's RPC-style API where every endpoint accepts POST requests.

Authentication

Ashby uses Basic Authentication with an API key:

  1. Generate an API key in Ashby: Settings → API Keys
  2. Set the environment variable: ASHBY_API_KEY=your-api-key
  3. The MCP server handles authentication automatically

API keys have permission scopes. Common permissions needed:

  • candidatesRead / candidatesWrite - Candidate operations
  • jobsRead / jobsWrite - Job operations
  • interviewsWrite - Interview scheduling

Available Tools

Candidate Management

ToolPurposeRequired Params
candidate_createCreate new candidatename, email
candidate_searchFind by email/​nameemail or name
candidate_listList all candidates(optional) cursor, limit
candidate_infoGet candidate detailscandidateId
candidate_updateUpdate candidatecandidateId
candidate_add_noteAdd note to profilecandidateId, note
candidate_add_tagTag a candidatecandidateId, tagId
candidate_list_notesView all notescandidateId

Job Management

ToolPurposeRequired Params
job_createCreate new jobtitle
job_searchFind jobs(optional) title, status
job_listList all jobs(optional) cursor, limit
job_infoGet job detailsjobId
job_set_statusUpdate statusjobId, status

Job statuses: Open, Closed, Draft, Archived

Application Management

ToolPurposeRequired Params
application_createConsider candidate for jobcandidateId, jobId
application_listList applications(optional) jobId, candidateId, status
application_infoGet application detailsapplicationId
application_change_stageMove in pipelineapplicationId, interviewStageId
application_change_sourceUpdate attributionapplicationId, sourceId
application_updateUpdate propertiesapplicationId

Application statuses: Active, Hired, Archived

Interview Scheduling

ToolPurposeRequired Params
interview_listList interviews(optional) applicationId
interview_schedule_createSchedule interviewapplicationId, interviewerUserIds, startTime, endTime
interview_schedule_listList schedules(optional) startTimeAfter, startTimeBefore
interview_schedule_updateModify scheduleinterviewScheduleId
interview_schedule_cancelCancel interviewinterviewScheduleId

Organization

ToolPurposeRequired Params
user_listList team members(optional) includeDeactivated
user_searchFind useremail or name
department_listList departments(optional) includeArchived
location_listList locations(optional) includeArchived

Offers

ToolPurposeRequired Params
offer_createCreate offerapplicationId
offer_listList offers(optional) applicationId

Utilities

ToolPurposeRequired Params
interview_stage_listGet pipeline stages(optional) jobId
source_listGet candidate sources(optional) cursor
candidate_tag_listGet available tags(optional) cursor
archive_reason_listGet rejection reasonsnone

Common Operations

Find a Candidate

# By email (exact match)
candidate_search(email="[email protected]")

# By name (partial match)
candidate_search(name="Jane")

Create and Apply Candidate

# Step 1: Create candidate
candidate = candidate_create(
    name="Jane Smith",
    email="[email protected]"
)

# Step 2: Apply to job
application_create(
    candidateId=candidate["id"],
    jobId="target-job-id"
)

Move Candidate Through Pipeline

# Get current stage and next stage
stages = interview_stage_list(jobId="...")
next_stage_id = stages["results"][1]["id"]

# Move application
application_change_stage(
    applicationId="app-id",
    interviewStageId=next_stage_id
)

Schedule an Interview

interview_schedule_create(
    applicationId="app-id",
    interviewerUserIds=["user-1", "user-2"],
    startTime="2024-01-15T14:00:00Z",
    endTime="2024-01-15T15:00:00Z"
)

Reject a Candidate

# Get archive reasons
reasons = archive_reason_list()
reason_id = reasons["results"][0]["id"]  # e.g., "Not qualified"

# Get archived stage
stages = interview_stage_list(jobId="...")
archived_stage = next(s for s in stages["results"] if s["type"] == "Archived")

# Archive
application_change_stage(
    applicationId="app-id",
    interviewStageId=archived_stage["id"],
    archiveReasonId=reason_id
)

Response Format

All tools return JSON. Successful responses have this structure:

{
  "success": true,
  "results": { ... }  // or array for list operations
}

List operations include pagination:

{
  "success": true,
  "results": [...],
  "moreDataAvailable": true,
  "nextCursor": "cursor-string"
}

Error responses:

{
  "success": false,
  "errors": ["error_code"]
}

Pagination

List operations use cursor-based pagination:

# First page
results = candidate_list(limit=50)

# Next page (if moreDataAvailable is true)
results = candidate_list(limit=50, cursor=results["nextCursor"])

Date/​Time Format

All timestamps use ISO 8601 format:

  • 2024-01-15T14:00:00Z (UTC)
  • 2024-01-15T14:00:00-08:00 (with offset)

Error Codes

Common error codes and meanings:

CodeMeaning
invalid_inputMissing or malformed parameter
not_foundResource doesn't exist
unauthorizedPermission denied
rate_limitedToo many requests
already_existsDuplicate entry

Tips

Finding IDs

Most operations require resource IDs. Use search/​list tools first:

# Get candidate ID
candidate = candidate_search(email="...")["results"][0]
candidate_id = candidate["id"]

# Get job ID
job = job_search(title="...")["results"][0]
job_id = job["id"]

Filtering Applications

Filter by multiple criteria:

# All active apps for a specific job
application_list(jobId="...", status="Active")

# All apps for a specific candidate
application_list(candidateId="...")

Source Attribution

Always track where candidates come from:

# Get available sources
sources = source_list()

# Apply with source
application_create(
    candidateId="...",
    jobId="...",
    sourceId="linkedin-source-id"
)

Additional Resources

Reference Files

For complete API patterns:

  • references/​tool-reference.md - Full parameter details for all tools

Related Skills

  • ashby-workflows - Pipeline management and recruiting workflows