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

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

**Authentication:** Bearer Token
**Categories:** Productivity, Collaboration
**Tools:** 66: 40 read, 26 write, 0 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=WORKABLE)

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

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

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

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

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

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Workable 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: 'workable_candidate_activities_list',
  toolInput: {
    candidate_id: 'ce4da98',
  },
  connector: 'workable',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="workable_candidate_activities_list",
    tool_input={
        "candidate_id": "ce4da98",
    },
    connection_name="workable",
    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.

### `workable_candidate_activities_list`

List Candidate Activities · Read-only

List the activity stream of a candidate, such as comments, stage moves, ratings and emails.
Returns an activities array with each activity's action, body, member, stage and created_at.
Use workable_candidate_activities_list for one candidate's history. Use workable_job_activities_list for a whole job.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `actions` (`string`, optional): Only return these activity actions, comma-separated (for example comment,moved).
- `limit` (`integer`, optional): Number of activities to return per page. Workable defaults to 50. Example: 25.
- `max_id` (`string`, optional): Return activities with an ID less than or equal to this ID. Example: "2a9b4c".
- `since_id` (`string`, optional): Return activities with an ID greater than or equal to this ID. To fetch the next page, copy the since_id value from the paging.next URL of the previous response. Example: "2a9b4c".
- `updated_after` (`string`, optional): Only return activities updated at or after this date, ISO 8601. Example: "2024-01-01T00:00:00Z".

Example input: `{"candidate_id":"ce4da98"}`

### `workable_candidate_files_list`

List Candidate Files · Read-only

List the files attached to a candidate, such as resumes, cover letters and comment attachments.
Returns a files array with each file's name, type and download URL.
Use workable_candidate_files_list to fetch a candidate's documents.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".

Example input: `{"candidate_id":"ce4da98"}`

### `workable_candidate_get`

Get Candidate · Read-only

Get one candidate's full profile by ID.
Returns contact details, job and stage, resume and image URLs, education, experience, skills, tags, answers, social profiles and disqualification details.
Use workable_candidate_get for a full profile. Use workable_candidates_list to search or filter candidates.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".

Example input: `{"candidate_id":"ce4da98"}`

### `workable_candidate_offer_get`

Get Candidate Offer · Read-only

Get the offer data for a candidate.
Returns the candidate's offer, including its state, the offer document details and its fields.
Use workable_candidate_offer_get from a candidate. Use workable_offer_get when you already have the offer ID.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".

Example input: `{"candidate_id":"ce4da98"}`

### `workable_candidates_list`

List Candidates · Read-only

List candidates in the account, optionally filtered by job, pipeline stage, email, or created and updated time.
Returns a candidates array (id, name, email, stage, job shortcode, disqualified flag, created_at) and a paging.next URL when more pages exist.
Use workable_candidates_list to find candidates or look one up by email. Use workable_candidate_get for a full profile.

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

Inputs:

- `created_after` (`string`, optional): Only return candidates created after this timestamp, in ISO 8601 (e.g. 20150708T115616Z) or Unix time (e.g. 1436356721).
- `email` (`string`, optional): Only return candidates with this email address. Example: "jane.doe@example.com".
- `limit` (`integer`, optional): Number of candidates to return per page. Workable defaults to 50. Example: 25.
- `max_id` (`string`, optional): Return candidates with an ID less than or equal to this ID. Example: "2a9b4c".
- `shortcode` (`string`, optional): Only return candidates for the job with this shortcode. Get it from workable_jobs_list. Example: "GROOV005".
- `since_id` (`string`, optional): Return candidates with an ID greater than or equal to this ID. To fetch the next page, copy the since_id value from the paging.next URL of the previous response. Example: "2a9b4c".
- `stage` (`string`, optional): Only return candidates in this pipeline stage, by stage slug (for example applied, interview, offer, hired). Get slugs from workable_stages_list.
- `updated_after` (`string`, optional): Only return candidates updated after this timestamp, in ISO 8601 (e.g. 20150708T115616Z) or Unix time (e.g. 1436356721).

Example input: `{}`

### `workable_custom_attributes_list`

List Custom Attributes · Read-only

List the candidate custom attributes defined in the account.
Returns a custom_attributes array with each attribute's key, label, type and choices.
Use the key in workable_candidate_custom_attribute_update. Use workable_job_custom_attributes_list for one job.

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

Inputs: none.

Example input: `{}`

### `workable_departments_list`

List Departments · Read-only

List the account's departments.
Returns a departments array with each department's id, name and parent_id.
Use department IDs to filter the org chart or set an employee's department.

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

Inputs: none.

Example input: `{}`

### `workable_disqualification_reasons_list`

List Disqualification Reasons · Read-only

List the disqualification reasons configured for the account.
Returns a disqualification_reasons array with each reason's id and name.
Use the reason id as disqualify_reason_id in workable_candidate_disqualify.

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

Inputs: none.

Example input: `{}`

### `workable_employee_documents_list`

List Employee Documents · Read-only

List the documents stored for an employee, by document type.
Returns a documents array with each document's id, name, type, created date and download URL.
Use workable_employee_documents_list to find an employee's files. Use workable_employee_documents_add to attach new ones.
Account-level tokens must pass member_id.

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

Inputs:

- `employee_id` (`string`, required): ID of the employee. Get it from the id field of workable_employees_list. Example: "375b".
- `limit` (`integer`, optional): Number of documents to return. Workable defaults to 10.
- `member_id` (`string`, optional): ID of the Workable member whose access level is used. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `offset` (`integer`, optional): Number of documents to skip. Workable defaults to 0.
- `type` (`string`, optional): Class of documents to return: simple_employee_document (default), signature_request_employee_document, timeoff_attachment or i_9_form_document. One of: `simple_employee_document`, `signature_request_employee_document`, `timeoff_attachment`, `i_9_form_document`.

Example input: `{"employee_id":"375b"}`

### `workable_employee_fields_list`

List Employee Fields · Read-only

List the employee fields configured in the account, including custom fields, with their types, subfields and choices.
Returns an employee_fields array with each field's id, label, type, subfields, choices and permissions.
Use workable_employee_fields_list before workable_employee_create or workable_employee_update to know the field ids and value shapes.

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

Inputs:

- `member_id` (`string`, optional): ID of the Workable member whose access level is used. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{}`

### `workable_employee_get`

Get Employee · Read-only

Get one employee's full HR record by ID.
Returns personal and contact details, job, department, manager, employment, salary and custom fields that the member may view.
Use workable_employee_get for one employee. Use workable_employees_list to search.
Account-level tokens must pass member_id.

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

Inputs:

- `employee_id` (`string`, required): ID of the employee. Get it from the id field of workable_employees_list. Example: "375b".
- `member_id` (`string`, optional): ID of the Workable member whose access level is used to read the record. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{"employee_id":"375b"}`

### `workable_employees_list`

List Employees · Read-only

List the account's employees in Workable HR, with an optional text search on first name, last name and email.
Returns an employees array (id, name, email, job title, department, manager, state) and the total count.
Use workable_employees_list to browse or search employees. Use workable_employee_get for one employee's full record.

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

Inputs:

- `limit` (`integer`, optional): Number of employees to return. Workable defaults to 10. Example: 25.
- `member_id` (`string`, optional): ID of the Workable member whose access level is used to read the data. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `offset` (`integer`, optional): Number of employees to skip, for paging with limit. Workable defaults to 0.
- `order_by` (`string`, optional): Order results by division or department. One of: `division`, `department`.
- `query` (`string`, optional): Search text matched against first name, last name and email. Example: "doe".

Example input: `{}`

### `workable_employees_orgchart_get`

Get Org Chart · Read-only

Get org chart nodes for the account, optionally filtered by legal entity or department, or the direct reports of one employee.
Returns nodes, each with the employee's content, parent_id (the manager's id) and direct_reports_count.
Use workable_employees_orgchart_get for reporting lines. Use workable_employees_list for a flat employee list.

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

Inputs:

- `department_ids` (`array`, optional): Only include employees in these departments, from workable_departments_list.
- `employee_id` (`string`, optional): Return the direct reports of this employee. Required when include_manager is true.
- `include_manager` (`boolean`, optional): When true, also return the employee given in employee_id and that employee's manager.
- `legal_entity_ids` (`array`, optional): Only include employees in these legal entities. Use -1 for employees without a legal entity.

Example input: `{}`

### `workable_event_get`

Get Event · Read-only

Get one scheduled event by ID.
Returns the event's type, title, description, start and end time, attendees, candidate, job and conference details.
Use workable_event_get when you have an event ID. Use workable_events_list to find events.

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

Inputs:

- `event_id` (`string`, required): ID of the event, from workable_events_list. Example: "45a1c2".

Example input: `{"event_id":"45a1c2"}`

### `workable_events_list`

List Events · Read-only

List scheduled events such as interviews, calls and meetings, filtered by type, date range, candidate, job or member.
Returns an events array with each event's id, type, title, start and end time, attendees, candidate and job, plus paging.
Use workable_events_list to see a schedule. Use workable_event_get for one event.

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

Inputs:

- `candidate_id` (`string`, optional): Only return events for this candidate ID.
- `context` (`string`, optional): For user tokens only: user (events the user attends, default), team (events for candidates in jobs the user collaborates on) or all. One of: `user`, `team`, `all`.
- `end_date` (`string`, optional): Only return events scheduled before this date, ISO 8601. Example: "2024-06-30".
- `include_cancelled` (`boolean`, optional): Set true to include cancelled events. Workable defaults to false.
- `limit` (`integer`, optional): Number of events to return per page. Workable defaults to 50. Example: 25.
- `max_id` (`string`, optional): Return events with an ID less than or equal to this ID. Example: "2a9b4c".
- `member_id` (`string`, optional): Only return events for this member ID.
- `shortcode` (`string`, optional): Only return events for the job with this shortcode.
- `since_id` (`string`, optional): Return events with an ID greater than or equal to this ID. To fetch the next page, copy the since_id value from the paging.next URL of the previous response. Example: "2a9b4c".
- `start_date` (`string`, optional): Only return events scheduled after this date, ISO 8601. Example: "2024-06-01".
- `type` (`string`, optional): Only return events of this type: call, interview or meeting. One of: `call`, `interview`, `meeting`.

Example input: `{}`

### `workable_job_activities_list`

List Job Activities · Read-only

List the activity stream of a job across all its candidates.
Returns an activities array with each activity's action, candidate, member, stage and created_at, plus paging.
Use workable_job_activities_list for a job's history. Use workable_candidate_activities_list for one candidate.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".
- `limit` (`integer`, optional): Number of activities to return per page. Workable defaults to 50. Example: 25.
- `max_id` (`string`, optional): Return activities with an ID less than or equal to this ID. Example: "2a9b4c".
- `since_id` (`string`, optional): Return activities with an ID greater than or equal to this ID. To fetch the next page, copy the since_id value from the paging.next URL of the previous response. Example: "2a9b4c".

Example input: `{"shortcode":"GROOV005"}`

### `workable_job_application_form_get`

Get Job Application Form · Read-only

Get the application form of a job: its standard fields and custom questions.
Returns the form fields with their keys, labels, types, whether they are required and any choices.
Use workable_job_application_form_get to build an application. Use workable_job_questions_list for only the questions.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".

Example input: `{"shortcode":"GROOV005"}`

### `workable_job_custom_attributes_list`

List Job Custom Attributes · Read-only

List the candidate custom attributes that apply to one job.
Returns a custom_attributes array with each attribute's key, label, type and choices.
Use workable_job_custom_attributes_list for one job. Use workable_custom_attributes_list for all attributes in the account.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".

Example input: `{"shortcode":"GROOV005"}`

### `workable_job_get`

Get Job · Read-only

Get the full details of one job by its shortcode.
Returns the job's title, state, department, location, description, requirements, benefits, employment type, salary and URLs.
Use workable_job_get when you know the shortcode. Use workable_jobs_list to browse or find shortcodes.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".

Example input: `{"shortcode":"GROOV005"}`

### `workable_job_members_list`

List Job Members · Read-only

List the members collaborating on one job.
Returns a members array with each member's id, name, email and role on the job.
Use workable_job_members_list for a job's hiring team. Use workable_members_list for all members.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".

Example input: `{"shortcode":"GROOV005"}`

### `workable_job_questions_list`

List Job Questions · Read-only

List the application questions of a job.
Returns a questions array with each question's key, body, type, required flag and choices.
Use the question keys as question_key in the answers of workable_candidate_create.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".

Example input: `{"shortcode":"GROOV005"}`

### `workable_job_recruiters_list`

List Job Recruiters · Read-only

List the external recruiters collaborating on one job.
Returns a recruiters array with each recruiter's id, name, email and agency.
Use workable_job_recruiters_list for one job. Use workable_recruiters_list for all external recruiters.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".

Example input: `{"shortcode":"GROOV005"}`

### `workable_job_stages_list`

List Job Stages · Read-only

List the pipeline stages of one job.
Returns a stages array with each stage's slug, name, kind and position.
Use workable_job_stages_list for stage slugs to move candidates within a job. Use workable_stages_list for the account default stages.

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

Inputs:

- `shortcode` (`string`, required): The job's system-generated shortcode. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".

Example input: `{"shortcode":"GROOV005"}`

### `workable_jobs_list`

List Jobs · Read-only

List jobs in the Workable account, optionally filtered by state or by created and updated time.
Returns a jobs array (id, title, shortcode, state, department, location, url, created_at) and a paging.next URL when more pages exist.
Use workable_jobs_list to find a job's shortcode. Use workable_job_get for one job's full details.

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

Inputs:

- `created_after` (`string`, optional): Only return jobs created after this timestamp, in ISO 8601 (e.g. 20150708T115616Z) or Unix time (e.g. 1436356721).
- `include_fields` (`string`, optional): Extra fields to include in each job, comma-separated. Supported: description, full_description, requirements, benefits. Example: "description,requirements".
- `limit` (`integer`, optional): Number of jobs to return per page. Workable defaults to 50. Maximum 100. Example: 25.
- `max_id` (`string`, optional): Return jobs with an ID less than or equal to this ID. Example: "2a9b4c".
- `since_id` (`string`, optional): Return jobs with an ID greater than or equal to this ID. To fetch the next page, copy the since_id value from the paging.next URL of the previous response. Example: "2a9b4c".
- `state` (`string`, optional): Only return jobs in this state: draft, published, closed (internal or confidential) or archived. One of: `draft`, `published`, `closed`, `archived`.
- `updated_after` (`string`, optional): Only return jobs updated after this timestamp, in ISO 8601 (e.g. 20150708T115616Z) or Unix time (e.g. 1436356721).

Example input: `{}`

### `workable_legal_entities_list`

List Legal Entities · Read-only

List the account's legal entities.
Returns a legal entities array with each entity's id and name.
Use legal entity IDs to filter the org chart or set an employee's legal_entity.

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

Inputs: none.

Example input: `{}`

### `workable_members_list`

List Members · Read-only

List the account's members (users), optionally filtered by role, job, email, name or status.
Returns a members array with each member's id, name, email, role and status.
Use workable_members_list to find the member_id that write tools need with account-level tokens. Use workable_job_members_list for a job's collaborators.

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

Inputs:

- `email` (`string`, optional): Only return the member with this email address.
- `limit` (`integer`, optional): Number of members to return per page. Workable defaults to 50. Example: 25.
- `max_id` (`string`, optional): Return members with an ID less than or equal to this ID. Example: "2a9b4c".
- `name` (`string`, optional): Only return members with this exact full name.
- `role` (`string`, optional): Only return members with this recruiting role: simple, admin or reviewer. One of: `simple`, `admin`, `reviewer`.
- `shortcode` (`string`, optional): Only return members collaborating on the job with this shortcode.
- `since_id` (`string`, optional): Return members with an ID greater than or equal to this ID. To fetch the next page, copy the since_id value from the paging.next URL of the previous response. Example: "2a9b4c".
- `status` (`string`, optional): Member status filter: active (Workable default), inactive or all. One of: `active`, `inactive`, `all`.

Example input: `{}`

### `workable_offer_get`

Get Offer · Read-only

Get one offer by its ID. Works only with user-level access tokens.
Returns the offer's candidate, job, state, approvers and offer fields.
Use workable_offer_get when you have an offer ID. Use workable_candidate_offer_get to start from a candidate.

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

Inputs:

- `offer_id` (`string`, required): ID of the offer, from workable_candidate_offer_get. Example: "0a1b2c".

Example input: `{"offer_id":"0a1b2c"}`

### `workable_recruiters_list`

List Recruiters · Read-only

List the account's external recruiters, optionally only those on one job.
Returns a recruiters array with each recruiter's id, name, email and agency.
Use the recruiter id as recruiter_key when creating a candidate sourced by a recruiter.

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

Inputs:

- `shortcode` (`string`, optional): Only return recruiters collaborating on the job with this shortcode.

Example input: `{}`

### `workable_requisition_custom_attribute_choices_list`

List Requisition Custom Attribute Choices · Read-only

List the allowed choices of a dropdown or multiple_choice requisition custom attribute. Requires Workable Hiring Plan.
Returns the choices ordered by position, each with its id and label.
Get the attribute id from workable_requisition_custom_attributes_list.

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

Inputs:

- `attribute_id` (`string`, required): ID of the requisition custom attribute, from workable_requisition_custom_attributes_list.
- `limit` (`integer`, optional): Number of choices to return. Workable defaults to 50, maximum 1000.
- `offset` (`integer`, optional): Number of choices to skip. Workable defaults to 0.

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

### `workable_requisition_custom_attributes_list`

List Requisition Custom Attributes · Read-only

List the custom attributes defined for requisitions. Requires Workable Hiring Plan.
Returns each attribute's id, slug, label, type and whether it is required; choices are not included.
Use workable_requisition_custom_attribute_choices_list to get the choices of a dropdown or multiple_choice attribute.

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

Inputs: none.

Example input: `{}`

### `workable_requisition_get`

Get Requisition · Read-only

Get one requisition by its code. Requires Workable Hiring Plan.
Returns the requisition's job, department, location, owner, hiring manager, plan and start dates, salary, state, custom attributes and approval groups.
Use workable_requisition_get when you know the code. Use workable_requisitions_list to find codes.

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

Inputs:

- `code` (`string`, required): Code of the requisition, from workable_requisitions_list. Example: "REQ-001".

Example input: `{"code":"REQ-001"}`

### `workable_requisitions_list`

List Requisitions · Read-only

List the account's requisitions (approved headcount), filtered by state, job, plan date or created and updated time. Requires Workable Hiring Plan.
Returns a requisitions array (id, code, job, department, location, owner, hiring manager, plan date, salary range, state) and a paging.next URL.
Use workable_requisitions_list to browse. Use workable_requisition_get for one requisition by code.

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

Inputs:

- `created_after` (`string`, optional): Only return requisitions created after this timestamp, in ISO 8601 (e.g. 20150708T115616Z) or Unix time (e.g. 1436356721).
- `job_id` (`string`, optional): Only return requisitions for the job with this ID (the job id, not the shortcode).
- `limit` (`integer`, optional): Number of requisitions to return per page. Workable defaults to 50. Example: 25.
- `max_id` (`string`, optional): Return requisitions with an ID less than or equal to this ID. Example: "2a9b4c".
- `plan_date_from` (`string`, optional): Only return requisitions with a plan date on or after this month, in YYYY-MM format.
- `plan_date_to` (`string`, optional): Only return requisitions with a plan date on or before this month, in YYYY-MM format.
- `since_id` (`string`, optional): Return requisitions with an ID greater than or equal to this ID. To fetch the next page, copy the since_id value from the paging.next URL of the previous response. Example: "2a9b4c".
- `state` (`string`, optional): Only return requisitions in this state. One of: `processing`, `draft`, `pending`, `approved`, `open`, `filled`, `rejected`, `cancelled`, `reserved`, `on_hold`.
- `updated_after` (`string`, optional): Only return requisitions updated after this timestamp, in ISO 8601 (e.g. 20150708T115616Z) or Unix time (e.g. 1436356721).

Example input: `{}`

### `workable_review_template_get`

Get Review Template · Read-only

Get one performance review template by ID. Needs a user-level token with permission to view performance templates.
Returns the template's title and questionnaire, with sections, questions, question types and rating options.
Use workable_review_template_get when you have a template ID. Use workable_review_templates_list to find IDs.

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

Inputs:

- `template_id` (`string`, required): ID of the review template, from workable_review_templates_list.

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

### `workable_review_templates_list`

List Review Templates · Read-only

List the account's performance review templates. Needs a user-level token with permission to view performance templates.
Returns the latest, non-deleted templates, each with its id, title and questionnaire sections.
Use workable_review_templates_list to browse. Use workable_review_template_get for one template.

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

Inputs:

- `limit` (`integer`, optional): Maximum number of templates to return. All matching templates are returned when omitted.
- `offset` (`integer`, optional): Number of templates to skip, for paging.

Example input: `{}`

### `workable_stages_list`

List Stages · Read-only

List the recruitment pipeline stages configured for the account.
Returns a stages array with each stage's slug, name, kind and position.
Use workable_stages_list for account-wide stage slugs. Use workable_job_stages_list for the stages of one job.

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

Inputs: none.

Example input: `{}`

### `workable_time_entries_list`

List Time Entries · Read-only

List time tracking entries, filtered by entry type, date range, employees or worked duration.
Returns a time entries array with each entry's id, employee, type, clock-in and clock-out times, duration and note, plus paging.
Use workable_time_entries_list to review hours. With an account-level token and no employee filter, all entries are returned.

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

Inputs:

- `duration` (`integer`, optional): Worked minutes to compare against, used with duration_operator.
- `duration_operator` (`string`, optional): How to compare duration: equal, greater_than, greater_than_or_equal, less_than or less_than_or_equal. One of: `equal`, `greater_than`, `greater_than_or_equal`, `less_than`, `less_than_or_equal`.
- `employee_ids` (`array`, optional): Only return entries for these employee IDs.
- `from_date` (`string`, optional): Return entries on or after this ISO 8601 date. Example: "2024-06-01".
- `limit` (`integer`, optional): Results per page: 10, 20, 50 or 100. One of: `10`, `20`, `50`, `100`.
- `offset` (`integer`, optional): Number of entries to skip, for paging.
- `to_date` (`string`, optional): Return entries on or before this ISO 8601 date. Example: "2024-06-30".
- `types` (`array`, optional): Entry types to include: time-entry, clock-in, clock-out, ergani-clock-in, ergani-clock-out.

Example input: `{}`

### `workable_timeoff_balances_get`

Get Time Off Balances · Read-only

Get an employee's time off balances across all categories.
Returns a balances array with each category's allowance, used, pending and remaining amounts.
Use workable_timeoff_balances_get before requesting leave. Account-level tokens must pass employee_id.

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

Inputs:

- `employee_id` (`string`, optional): Employee to get balances for. Required for account-level tokens; defaults to the token's user for user tokens.

Example input: `{}`

### `workable_timeoff_categories_list`

List Time Off Categories · Read-only

List the time off categories configured in the account, such as vacation or sick leave.
Returns a categories array with each category's id, name and unit.
Use the category id in workable_timeoff_request_create or to filter workable_timeoff_requests_list.

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

Inputs: none.

Example input: `{}`

### `workable_timeoff_requests_list`

List Time Off Requests · Read-only

List time off requests from a start date, optionally filtered by end date, category, state or employee.
Returns a requests array with each request's employee, category, dates, state and approvals, plus paging details.
Use workable_timeoff_requests_list to review leave. Use workable_timeoff_balances_get for remaining balances.
With an account-level token and no employee filter, all requests in the account are returned.

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

Inputs:

- `from_date` (`string`, required): Return requests from this date, as an ISO date without timezone. Example: "2024-01-01".
- `category_ids` (`array`, optional): Only return requests in these time off categories. Get IDs from workable_timeoff_categories_list.
- `employee_id` (`string`, optional): Only return requests for this employee. Get IDs from workable_employees_list.
- `employee_ids` (`array`, optional): Only return requests for these employees; merged with employee_id when both are set.
- `limit` (`integer`, optional): Results per page: 10, 20, 50 or 100. Workable defaults to 10. One of: `10`, `20`, `50`, `100`.
- `offset` (`integer`, optional): Number of requests to skip, for paging. Workable defaults to 0.
- `states` (`array`, optional): Only return requests in these states, for example pending, approved or rejected.
- `to_date` (`string`, optional): Return requests up to this date, as an ISO date without timezone. Example: "2024-12-31".

Example input: `{"from_date":"2024-01-01"}`

### `workable_work_schedules_list`

List Work Schedules · Read-only

List the work schedules configured in the account.
Returns a work_schedules array with each schedule's id, name and working days and hours.
Use the schedule id as work_schedule when creating or updating an employee.

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

Inputs: none.

Example input: `{}`

### `workable_candidate_comment_create`

Add Candidate Comment · Write

Add a comment to a candidate's timeline, optionally with visibility rules and one attachment.
Returns 201 with the created comment.
Use workable_candidate_comment_create for notes on a candidate. Use workable_candidate_rating_create to record an evaluation.

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

Inputs:

- `body` (`string`, required): Text of the comment. Example: "Strong system design answers."
- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `member_id` (`string`, required): ID of the Workable member writing the comment. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `attachment` (`object`, optional): One file to attach, as an object with the file name and the base64-encoded content. Example: {"name": "notes.txt", "data": "SGVsbG8h"}.
- `policy` (`array`, optional): Which member roles can see the comment, as a list of roles: admin, recruiting_admin, hiring_manager, simple, reviewer, recruiter. Admins always see comments. Omit to use Workable's default visibility. Example: ["recruiter", "admin"].

Example input: `{"body":"Strong system design answers.","candidate_id":"ce4da98","member_id":"13e0eb0e"}`

### `workable_candidate_copy`

Copy Candidate to Job · Write

Copy a candidate to another job, keeping them in their current job as well.
Returns 201 with the new candidate record in the target job.
Use workable_candidate_copy to consider someone for two jobs. Use workable_candidate_relocate to move them instead.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `member_id` (`string`, required): ID of the Workable member performing the copy. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `target_job_shortcode` (`string`, required): Shortcode of the job to copy the candidate to. Example: "GROOV006".
- `target_stage` (`string`, optional): Stage slug in the target job. Example: "applied".

Example input: `{"candidate_id":"ce4da98","member_id":"13e0eb0e","target_job_shortcode":"GROOV006"}`

### `workable_candidate_create`

Create Candidate in Job · Write

Create a candidate in a specific job, optionally placing them directly in a given pipeline stage.
Returns the created candidate with its id, stage and profile fields.
Use workable_candidate_create to add someone to a job. Use workable_talent_pool_candidate_create to add someone to the talent pool without a job.

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

Inputs:

- `email` (`string`, required): Candidate's email address. Example: "jane.doe@example.com".
- `shortcode` (`string`, required): The job's system-generated shortcode of the job to add the candidate to. Get it from the shortcode field of workable_jobs_list. Example: "GROOV005".
- `address` (`string`, optional): Candidate's postal address as a single string.
- `answers` (`array`, optional): Answers to the job's application questions. Each entry has the question_key and either a body (free text) or choices (list of choice keys). Get the keys with workable_job_questions_list. Example: [{"question_key": "2128d717", "body": "Planning"}].
- `cover_letter` (`string`, optional): Candidate's cover letter as plain text.
- `disqualified` (`boolean`, optional): Set to true to create the candidate already disqualified.
- `disqualified_at` (`string`, optional): Disqualification date in YYYY-MM-DD format, used with disqualified. Defaults to now when omitted.
- `domain` (`string`, optional): Source of the candidate, for example the site the candidate came from. Example: "indeed.com".
- `education_entries` (`array`, optional): Education history. Each entry has a degree, school, field of study, and start and end dates (YYYY-MM-DD). Example: [{"degree": "B.S.", "school": "University of Chicago", "field_of_study": "Economics", "start_date": "2004-09-01", "end_date": "2007-06-30"}].
- `experience_entries` (`array`, optional): Work history. Each entry has a title, company, industry, summary, start and end dates (YYYY-MM-DD) and a current flag. Example: [{"title": "Sales Director", "company": "Vox Mobile", "start_date": "2011-03-01", "end_date": "2014-03-30", "current": false}].
- `firstname` (`string`, optional): Candidate's first name. Example: "Jane".
- `headline` (`string`, optional): One-line professional headline for the candidate. Example: "Senior Backend Engineer".
- `image_source` (`string`, optional): Where the photo came from. Use "candidate" if you want image_url populated in later API responses.
- `image_url` (`string`, optional): Public URL of the candidate's photo. Workable downloads it. Set image_source to "candidate" so later responses return image_url.
- `lastname` (`string`, optional): Candidate's last name. Example: "Doe".
- `name` (`string`, optional): Candidate's full name. Provide either name, or both firstname and lastname. Example: "Jane Doe".
- `phone` (`string`, optional): Candidate's phone number. Example: "+1-555-010-0100".
- `recruiter_key` (`string`, optional): Key of the external recruiter who sourced this candidate, from workable_recruiters_list.
- `resume` (`object`, optional): Resume file sent inline: an object with the file name and the file content encoded in base64. Use this or resume_url, not both. Example: {"name": "jane-doe.pdf", "data": "JVBERi0xLjQK..."}.
- `resume_url` (`string`, optional): Public URL of the candidate's resume (.pdf, .doc, .docx or .rtf). Workable downloads the file from this URL. Use this or resume, not both.
- `skills` (`array`, optional): Candidate's skills as a list of strings. Example: ["Go", "PostgreSQL"].
- `social_profiles` (`array`, optional): Social profiles. Each entry has a type (for example twitter or linkedin), a display name, a username and a url. Example: [{"type": "linkedin", "name": "LinkedIn", "url": "https://www.linkedin.com/in/janedoe"}].
- `sourced` (`boolean`, optional): true (default) creates the candidate as sourced (uploaded by your team). false creates them as applied, and Workable sends the candidate a 'thank you for applying' email. Default: `true`.
- `stage` (`string`, optional): Pipeline stage slug to create the candidate in. When omitted, Workable uses sourced or applied depending on the sourced flag. Get slugs from workable_job_stages_list.
- `summary` (`string`, optional): Profile summary for the candidate, as free text.
- `tags` (`array`, optional): Tags to attach to the candidate. Example: ["referral", "senior"].

Example input: `{"email":"jane.doe@example.com","shortcode":"GROOV005"}`

### `workable_candidate_custom_attribute_update`

Update Candidate Custom Attribute · Write

Set the value of one custom attribute on a candidate.
Returns 201 with the updated value.
Send the value field that matches the attribute's type. Get attribute keys and types with workable_custom_attributes_list.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `custom_attribute_key` (`string`, required): Key of the custom attribute, from workable_custom_attributes_list. Example: "years_experience".
- `checked` (`boolean`, optional): Value for a boolean attribute.
- `choices` (`array`, optional): Selected choice IDs for a dropdown or multiple_choice attribute.
- `date` (`string`, optional): Value for a date attribute, YYYY-MM-DD.
- `file` (`object`, optional): File for a file attribute, as {name, data} with base64 data. Use this or file_url.
- `file_url` (`string`, optional): URL of the file for a file attribute. Use this or file.
- `value` (`integer`, optional): Value for a numeric attribute.

Example input: `{"candidate_id":"ce4da98","custom_attribute_key":"years_experience"}`

### `workable_candidate_disqualification_revert`

Revert Candidate Disqualification · Write

Revert a candidate's disqualification so they are active in the pipeline again.
Returns the result of the revert.
Use workable_candidate_disqualification_revert after a workable_candidate_disqualify you want to undo.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `member_id` (`string`, required): ID of the Workable member reverting the disqualification. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{"candidate_id":"ce4da98","member_id":"13e0eb0e"}`

### `workable_candidate_disqualify`

Disqualify Candidate · Write

Disqualify a candidate, optionally with a reason and a note.
Returns the result of the disqualification.
Use workable_candidate_disqualify to reject or mark a candidate as withdrawn. Use workable_candidate_disqualification_revert to undo it.
Get reason IDs with workable_disqualification_reasons_list.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `member_id` (`string`, required): ID of the Workable member performing the disqualification. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `disqualify_note` (`string`, optional): Extra information about the disqualification, up to 256 characters.
- `disqualify_reason_id` (`string`, optional): ID of the disqualification reason, from workable_disqualification_reasons_list. Example: "2700d6c".
- `withdrew` (`boolean`, optional): true if the candidate withdrew; false if your team rejected them.

Example input: `{"candidate_id":"ce4da98","member_id":"13e0eb0e"}`

### `workable_candidate_move`

Move Candidate to Stage · Write

Move a candidate to another pipeline stage within the same job.
Returns 202 Accepted with no body; the move is processed asynchronously.
Use workable_candidate_move to advance or step back a candidate. Use workable_candidate_relocate to move them to a different job.
With Hiring Plan enabled, moving to a hired stage needs a requisition: set fill_reserved_requisition or pass a requisition object.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `member_id` (`string`, required): ID of the Workable member performing the move. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `target_stage` (`string`, required): Slug of the stage to move the candidate to, for example interview or hired. Get slugs from workable_job_stages_list.
- `fill_reserved_requisition` (`boolean`, optional): With Hiring Plan, set true when moving to hired to fill the requisition already reserved for this candidate.
- `requisition` (`object`, optional): With Hiring Plan, the requisition to fill when moving to hired: its code, start date (YYYY-MM-DD) and salary (amount, frequency of hour/day/week/month/year, currency_iso). Example: {"code": "REQ-1234", "start_date": "2024-01-01", "salary": {"amount": 90000, "frequency": "year", "currency_iso": "USD"}}.

Example input: `{"candidate_id":"ce4da98","member_id":"13e0eb0e","target_stage":"applied"}`

### `workable_candidate_rating_create`

Rate Candidate · Write

Add a rating (evaluation) for a candidate with a grade, a comment and an optional scorecard.
Returns 201 with the created rating.
Use workable_candidate_rating_create to add a new rating. Use workable_candidate_rating_upsert to create or update one member's rating for a stage.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `comment` (`string`, required): Comment explaining the rating. Example: "Clear communicator, strong fundamentals."
- `grade` (`integer`, required): Grade on the chosen scale. thumbs: 0 negative, 1 positive, 2 definite. stars: 0-4 (one to five stars). numbers: 0-9 (1 to 10 out of 10).
- `member_id` (`string`, required): ID of the Workable member adding the rating. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `scale` (`string`, optional): Rating scale for grade: thumbs (default), stars or numbers. One of: `thumbs`, `stars`, `numbers`.
- `score_card` (`object`, optional): Optional scorecard. It has settings (questions_rateable) and sections; each section has an id, name and traits, and each trait has an id, name, score (negative, positive or definite), note and questions. Example: {"sections": [{"id": 1, "name": "Critical Thinking", "traits": [{"id": 2, "name": "Analytical Skills", "score": "positive", "questions": []}]}]}.

Example input: `{"candidate_id":"ce4da98","comment":"Clear communicator, strong fundamentals.","grade":1,"member_id":"13e0eb0e"}`

### `workable_candidate_rating_upsert`

Create or Update Candidate Rating · Write

Create or update a member's evaluation of a candidate for a stage.
Returns the evaluation: 200 when an existing one was updated, 201 when a new one was created.
Use workable_candidate_rating_upsert to revise a rating. Use workable_candidate_rating_create to always add a new one.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `comment` (`string`, required): Comment explaining the rating. Example: "Clear communicator, strong fundamentals."
- `grade` (`integer`, required): Grade on the chosen scale. thumbs: 0 negative, 1 positive, 2 definite. stars: 0-4 (one to five stars). numbers: 0-9 (1 to 10 out of 10).
- `member_id` (`string`, required): ID of the Workable member adding the rating. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `scale` (`string`, optional): Rating scale for grade: thumbs (default), stars or numbers. One of: `thumbs`, `stars`, `numbers`.
- `score_card` (`object`, optional): Optional scorecard. It has settings (questions_rateable) and sections; each section has an id, name and traits, and each trait has an id, name, score (negative, positive or definite), note and questions. Example: {"sections": [{"id": 1, "name": "Critical Thinking", "traits": [{"id": 2, "name": "Analytical Skills", "score": "positive", "questions": []}]}]}.
- `stage_id` (`string`, optional): Stage the evaluation belongs to. Defaults to the candidate's current stage when omitted.

Example input: `{"candidate_id":"ce4da98","comment":"Clear communicator, strong fundamentals.","grade":1,"member_id":"13e0eb0e"}`

### `workable_candidate_relocate`

Move Candidate to Another Job · Write

Move a candidate from their current job to another job.
Returns 201 with the candidate record in the target job.
Use workable_candidate_relocate to change the job. Use workable_candidate_copy to keep them in both jobs. Use workable_candidate_move to change stage in the same job.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `member_id` (`string`, required): ID of the Workable member performing the relocation. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `target_job_shortcode` (`string`, required): Shortcode of the job to move the candidate to. Example: "GROOV006".
- `target_stage` (`string`, optional): Stage slug in the target job. Example: "applied".

Example input: `{"candidate_id":"ce4da98","member_id":"13e0eb0e","target_job_shortcode":"GROOV006"}`

### `workable_candidate_tags_update`

Set Candidate Tags · Write

Replace a candidate's tags with the given list.
Returns 202 Accepted.
The list replaces all existing tags; an empty list removes them all. Use workable_candidate_update to change other profile fields too.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `tags` (`array`, required): Complete list of tags the candidate should have. An empty list removes all tags. Example: ["referral", "senior"].

Example input: `{"candidate_id":"ce4da98","tags":["referral","senior"]}`

### `workable_candidate_update`

Update Candidate · Write

Update a candidate's profile fields such as name, email, phone, resume, education, experience, tags or social profiles.
Returns the updated candidate.
Fields you leave out keep their current values, but any list field you send (education, experience, tags, social profiles) replaces the existing list.
Use workable_candidate_tags_update to change only tags. Use workable_candidate_move to change the stage.

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

Inputs:

- `candidate_id` (`string`, required): ID of the candidate. Get it from the id field of workable_candidates_list or workable_candidate_get. Example: "ce4da98".
- `address` (`string`, optional): Candidate's postal address as a single string.
- `cover_letter` (`string`, optional): Candidate's cover letter as plain text.
- `education_entries` (`array`, optional): Education history. Each entry has a degree, school, field of study, and start and end dates (YYYY-MM-DD). On update this replaces all existing entries; an empty array deletes them. Example: [{"degree": "B.S.", "school": "University of Chicago", "field_of_study": "Economics", "start_date": "2004-09-01", "end_date": "2007-06-30"}].
- `email` (`string`, optional): Candidate's email address. Example: "jane.doe@example.com".
- `experience_entries` (`array`, optional): Work history. Each entry has a title, company, industry, summary, start and end dates (YYYY-MM-DD) and a current flag. On update this replaces all existing entries; an empty array deletes them. Example: [{"title": "Sales Director", "company": "Vox Mobile", "start_date": "2011-03-01", "end_date": "2014-03-30", "current": false}].
- `firstname` (`string`, optional): Candidate's first name. Example: "Jane".
- `headline` (`string`, optional): One-line professional headline for the candidate. Example: "Senior Backend Engineer".
- `image_source` (`string`, optional): Where the photo came from. Use "candidate" if you want image_url populated in later API responses.
- `image_url` (`string`, optional): Public URL of the candidate's photo. Workable downloads it. Set image_source to "candidate" so later responses return image_url.
- `lastname` (`string`, optional): Candidate's last name. Example: "Doe".
- `phone` (`string`, optional): Candidate's phone number. Example: "+1-555-010-0100".
- `resume` (`object`, optional): Resume file sent inline: an object with the file name and the file content encoded in base64. Use this or resume_url, not both. Example: {"name": "jane-doe.pdf", "data": "JVBERi0xLjQK..."}.
- `resume_url` (`string`, optional): Public URL of the candidate's resume (.pdf, .doc, .docx or .rtf). Workable downloads the file from this URL. Use this or resume, not both.
- `skills` (`array`, optional): Candidate's skills as a list of strings. Example: ["Go", "PostgreSQL"].
- `social_profiles` (`array`, optional): Social profiles. Each entry has a type (for example twitter or linkedin), a display name, a username and a url. On update this replaces all existing profiles. Example: [{"type": "linkedin", "name": "LinkedIn", "url": "https://www.linkedin.com/in/janedoe"}].
- `summary` (`string`, optional): Profile summary for the candidate, as free text.
- `tags` (`array`, optional): Tags to attach to the candidate. Example: ["referral", "senior"]. On update this replaces all existing tags; an empty array removes them.
- `texting_consent` (`string`, optional): Candidate's texting consent. One of forced or declined. One of: `forced`, `declined`.

Example input: `{"candidate_id":"ce4da98"}`

### `workable_employee_create`

Create Employee · Write

Create an employee record in Workable HR, either as a draft (to start onboarding) or as published.
Returns 201 with the created employee's id and core fields.
Use workable_employee_create for new hires. Use workable_employee_update to change an existing employee.
Get field ids and allowed values with workable_employee_fields_list first.

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

Inputs:

- `employee` (`object`, required): Employee field values, keyed by field id. Standard fields include firstname, lastname, preferred_name, work_email, job_title, hire_date, start_date, department, reports_to, legal_entity and work_schedule; composite fields such as address, phone_group or salary_group take nested objects. Get the account's field ids and shapes from workable_employee_fields_list. Example: {"firstname": "Zinedin", "lastname": "Doe", "work_email": "z.doe@example.com", "job_title": "Account Manager", "start_date": "2024-10-08T00:00:00.000Z"}.
- `state` (`string`, required): Employee state: draft to create the employee and then start onboarding, or published for an employee who has finished onboarding. One of: `draft`, `published`.
- `member_id` (`string`, optional): ID of the Workable member creating the employee. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{"employee":{"firstname":"Zinedin","lastname":"Doe","work_email":"z.doe@example.com","job_title":"Account Manager","start_date":"2024-10-08T00:00:00.000Z"},"state":"draft"}`

### `workable_employee_documents_add`

Add Employee Documents · Write

Attach one or more documents to an employee from URLs Workable can download.
Returns 201 with the created documents.
Each URL must stay downloadable for at least an hour. Use workable_employee_documents_list to see existing documents.

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

Inputs:

- `documents` (`array`, required): Documents to add. Each has a url where the file is hosted (valid for at least one hour) and a name. Example: [{"url": "https://example.com/files/contract.pdf", "name": "Employment contract"}].
- `employee_id` (`string`, required): ID of the employee. Get it from the id field of workable_employees_list. Example: "375b".
- `member_id` (`string`, optional): ID of the Workable member adding the documents. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{"documents":[{"url":"https://example.com/files/contract.pdf","name":"Employment contract"}],"employee_id":"375b"}`

### `workable_employee_update`

Update Employee · Write

Update fields on an existing employee record.
Returns the updated employee.
Only the fields you send change. For a composite field, send all of its subfields again, not only the one that changed.
Use workable_employee_fields_list to get field ids, including custom fields.

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

Inputs:

- `employee` (`object`, required): Employee field values, keyed by field id. Standard fields include firstname, lastname, preferred_name, work_email, job_title, hire_date, start_date, department, reports_to, legal_entity and work_schedule; composite fields such as address, phone_group or salary_group take nested objects. Get the account's field ids and shapes from workable_employee_fields_list. Custom fields use their field id as the key. Example: {"firstname": "Zinedina", "job_title": "Senior Account Manager"}.
- `employee_id` (`string`, required): ID of the employee. Get it from the id field of workable_employees_list. Example: "375b".
- `member_id` (`string`, optional): ID of the Workable member making the change. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{"employee":{"firstname":"Zinedina","job_title":"Senior Account Manager"},"employee_id":"375b"}`

### `workable_offer_approve`

Approve Offer · Write

Approve an offer that is waiting for the token user's approval. Works only with user-level access tokens.
Returns the updated offer.
The offer must be in a state that allows approval. Use workable_offer_reject to reject it instead.

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

Inputs:

- `offer_id` (`string`, required): ID of the offer, from workable_candidate_offer_get. Example: "0a1b2c".

Example input: `{"offer_id":"0a1b2c"}`

### `workable_offer_reject`

Reject Offer · Write

Reject an offer that is waiting for the token user's approval, with an optional reason. Works only with user-level access tokens.
Returns the updated offer.
The offer must be in a state that allows rejection. Use workable_offer_approve to approve it instead.

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

Inputs:

- `offer_id` (`string`, required): ID of the offer, from workable_candidate_offer_get. Example: "0a1b2c".
- `rejection_reason` (`string`, optional): Reason for rejecting the offer.

Example input: `{"offer_id":"0a1b2c"}`

### `workable_requisition_approve`

Approve Requisition · Write

Approve a requisition that is waiting for approval. Requires Workable Hiring Plan.
Returns the updated requisition.
The requisition must be in a state that allows approval. Use workable_requisition_reject to reject it instead.

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

Inputs:

- `code` (`string`, required): Code of the requisition, from workable_requisitions_list. Example: "REQ-001".
- `member_id` (`string`, required): ID of the Workable member approving the requisition. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{"code":"REQ-001","member_id":"13e0eb0e"}`

### `workable_requisition_create`

Create Requisition · Write

Create a requisition for planned headcount. Requires Workable Hiring Plan.
Returns the full requisition object, including its id, code and state.
Use workable_requisition_create to open headcount. Use workable_requisition_update to change one. Get member IDs with workable_members_list.

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

Inputs:

- `code` (`string`, required): Code for the new requisition. Sent to Workable as code.value. Example: "REQ-001".
- `hiring_manager_id` (`string`, required): Member ID of the hiring manager.
- `job_title` (`string`, required): Title of the job the requisition is for. Example: "Backend Engineer".
- `member_id` (`string`, required): ID of the Workable member creating the requisition. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `owner_id` (`string`, required): Member ID of the requisition owner.
- `plan_date` (`string`, required): Planned month for the hire, in YYYY-MM format. Example: "2024-06".
- `city` (`string`, optional): City of the location. Example: "Austin".
- `country_code` (`string`, optional): Two-letter ISO country code of the location. Example: "US".
- `department_id` (`string`, optional): Department ID, from workable_departments_list.
- `employment_type` (`string`, optional): Employment type: Full-time, Part-time, Contract, Temporary or Other. One of: `Full-time`, `Part-time`, `Contract`, `Temporary`, `Other`.
- `experience` (`string`, optional): Experience level: Not Applicable, Internship, Entry Level, Associate, Mid-senior Level, Director or Executive. One of: `Not Applicable`, `Internship`, `Entry Level`, `Associate`, `Mid-senior Level`, `Director`, `Executive`.
- `job_id` (`string`, optional): ID of an existing job to link the requisition to.
- `location_string` (`string`, optional): Location as a single display string. Example: "Austin, Texas, United States".
- `notes` (`string`, optional): Notes on the requisition.
- `reason` (`string`, optional): Reason for the requisition: new_hire, replacement or backfill. One of: `new_hire`, `replacement`, `backfill`.
- `requisition_attributes` (`array`, optional): Custom requisition attribute values. Each entry identifies the attribute and gives its value; get the attributes with workable_requisition_custom_attributes_list. Example from the Workable docs: [{"slug": "cost_center", "value": "Engineering"}].
- `salary_currency` (`string`, optional): Currency of the salary. Example: "USD".
- `salary_frequency` (`string`, optional): How often the salary is paid, for example year or month.
- `salary_from` (`string`, optional): Lower bound of the salary range. Example: "80000".
- `salary_to` (`string`, optional): Upper bound of the salary range. Example: "100000".
- `state_code` (`string`, optional): State or region of the location. Example: "TX".

Example input: `{"code":"REQ-001","hiring_manager_id":"<hiring_manager_id>","job_title":"Backend Engineer","member_id":"13e0eb0e","owner_id":"<owner_id>","plan_date":"2024-06"}`

### `workable_requisition_reject`

Reject Requisition · Write

Reject a requisition that is waiting for approval, with an optional reason. Requires Workable Hiring Plan.
Returns the updated requisition.
The requisition must be in a state that allows rejection. Use workable_requisition_approve to approve it instead.

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

Inputs:

- `code` (`string`, required): Code of the requisition, from workable_requisitions_list. Example: "REQ-001".
- `member_id` (`string`, required): ID of the Workable member rejecting the requisition. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `rejection_reason` (`string`, optional): Reason for the rejection.

Example input: `{"code":"REQ-001","member_id":"13e0eb0e"}`

### `workable_requisition_update`

Update Requisition · Write

Update fields on an existing requisition, such as owner, hiring manager, location, salary or plan date. Requires Workable Hiring Plan.
Returns the full updated requisition object.
Only the fields you send change. Use workable_requisition_get or workable_requisitions_list to find the requisition first.

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

Inputs:

- `member_id` (`string`, required): ID of the Workable member editing the requisition. Workable records the action under this member and requires it for account-level tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `requisition_id` (`string`, required): ID of the requisition (the id field, not the code), from workable_requisitions_list.
- `city` (`string`, optional): City of the location. Example: "Austin".
- `country_code` (`string`, optional): Two-letter ISO country code of the location. Example: "US".
- `employment_type` (`string`, optional): Employment type: Full-time, Part-time, Contract, Temporary or Other. One of: `Full-time`, `Part-time`, `Contract`, `Temporary`, `Other`.
- `experience` (`string`, optional): Experience level: Not Applicable, Internship, Entry Level, Associate, Mid-senior Level, Director or Executive. One of: `Not Applicable`, `Internship`, `Entry Level`, `Associate`, `Mid-senior Level`, `Director`, `Executive`.
- `hiring_manager_id` (`string`, optional): Member ID of the new hiring manager.
- `location_string` (`string`, optional): Location as a single display string. Example: "Austin, Texas, United States".
- `notes` (`string`, optional): Notes on the requisition.
- `owner_id` (`string`, optional): Member ID of the new owner.
- `plan_date` (`string`, optional): Planned month for the hire, in YYYY-MM format.
- `reason` (`string`, optional): Reason for the requisition: new_hire, replacement or backfill. One of: `new_hire`, `replacement`, `backfill`.
- `salary_currency` (`string`, optional): Currency of the salary. Example: "USD".
- `salary_frequency` (`string`, optional): How often the salary is paid, for example year or month.
- `salary_from` (`string`, optional): Lower bound of the salary range. Example: "80000".
- `salary_to` (`string`, optional): Upper bound of the salary range. Example: "100000".
- `state_code` (`string`, optional): State or region of the location. Example: "TX".

Example input: `{"member_id":"13e0eb0e","requisition_id":"<requisition_id>"}`

### `workable_talent_pool_candidate_create`

Create Talent Pool Candidate · Write

Create a candidate in the account's talent pool, not attached to any job.
Returns the created candidate with its id and profile fields.
Use workable_talent_pool_candidate_create for general sourcing. Use workable_candidate_create to add someone to a specific job.

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

Inputs:

- `email` (`string`, required): Candidate's email address. Example: "jane.doe@example.com".
- `address` (`string`, optional): Candidate's postal address as a single string.
- `cover_letter` (`string`, optional): Candidate's cover letter as plain text.
- `disqualified` (`boolean`, optional): Set to true to create the candidate already disqualified.
- `disqualified_at` (`string`, optional): Disqualification date in YYYY-MM-DD format, used with disqualified. Defaults to now when omitted.
- `domain` (`string`, optional): Source of the candidate, for example the site the candidate came from. Example: "indeed.com".
- `education_entries` (`array`, optional): Education history. Each entry has a degree, school, field of study, and start and end dates (YYYY-MM-DD). Example: [{"degree": "B.S.", "school": "University of Chicago", "field_of_study": "Economics", "start_date": "2004-09-01", "end_date": "2007-06-30"}].
- `experience_entries` (`array`, optional): Work history. Each entry has a title, company, industry, summary, start and end dates (YYYY-MM-DD) and a current flag. Example: [{"title": "Sales Director", "company": "Vox Mobile", "start_date": "2011-03-01", "end_date": "2014-03-30", "current": false}].
- `firstname` (`string`, optional): Candidate's first name. Example: "Jane".
- `headline` (`string`, optional): One-line professional headline for the candidate. Example: "Senior Backend Engineer".
- `image_source` (`string`, optional): Where the photo came from. Use "candidate" if you want image_url populated in later API responses.
- `image_url` (`string`, optional): Public URL of the candidate's photo. Workable downloads it. Set image_source to "candidate" so later responses return image_url.
- `lastname` (`string`, optional): Candidate's last name. Example: "Doe".
- `name` (`string`, optional): Candidate's full name. Provide either name, or both firstname and lastname. Example: "Jane Doe".
- `phone` (`string`, optional): Candidate's phone number. Example: "+1-555-010-0100".
- `recruiter_key` (`string`, optional): Key of the external recruiter who sourced this candidate, from workable_recruiters_list.
- `resume` (`object`, optional): Resume file sent inline: an object with the file name and the file content encoded in base64. Use this or resume_url, not both. Example: {"name": "jane-doe.pdf", "data": "JVBERi0xLjQK..."}.
- `resume_url` (`string`, optional): Public URL of the candidate's resume (.pdf, .doc, .docx or .rtf). Workable downloads the file from this URL. Use this or resume, not both.
- `skills` (`array`, optional): Candidate's skills as a list of strings. Example: ["Go", "PostgreSQL"].
- `social_profiles` (`array`, optional): Social profiles. Each entry has a type (for example twitter or linkedin), a display name, a username and a url. Example: [{"type": "linkedin", "name": "LinkedIn", "url": "https://www.linkedin.com/in/janedoe"}].
- `sourced` (`boolean`, optional): true (default) creates the candidate as sourced (uploaded by your team). false creates them as applied, and Workable sends the candidate a 'thank you for applying' email. Default: `true`.
- `summary` (`string`, optional): Profile summary for the candidate, as free text.
- `tags` (`array`, optional): Tags to attach to the candidate. Example: ["referral", "senior"].

Example input: `{"email":"jane.doe@example.com"}`

### `workable_time_entry_create`

Create Time Entry · Write

Create a time tracking entry for an employee: a complete entry, a clock-in or a clock-out.
Returns the created time entry.
Use type time-entry with both times for a full entry, clock-in to start a shift, or clock-out to end one. Use workable_time_entry_update to fix an entry.

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

Inputs:

- `employee_id` (`string`, required): ID of the employee the entry is for, from workable_employees_list. Example: "375b".
- `type` (`string`, required): Entry type: time-entry (complete entry), clock-in, clock-out, ergani-clock-in or ergani-clock-out. One of: `time-entry`, `clock-in`, `clock-out`, `ergani-clock-in`, `ergani-clock-out`.
- `clock_in_time` (`string`, optional): Clock-in time, ISO 8601 timestamp with a timezone designator (Z or an offset); seconds are truncated. Example: "2024-06-03T09:00:00Z".
- `clock_out_time` (`string`, optional): Clock-out time, ISO 8601 timestamp with a timezone designator (Z or an offset); seconds are truncated. Example: "2024-06-03T17:30:00Z".
- `note` (`string`, optional): Note for the entry. Supported by time-entry, clock-out and ergani-clock-out.
- `override_overlapping` (`boolean`, optional): Set true to archive any existing entries that overlap this one.

Example input: `{"employee_id":"375b","type":"time-entry"}`

### `workable_time_entry_update`

Update Time Entry · Write

Update the clock-in time, clock-out time or note of an existing time entry.
Returns the updated time entry.
Provide at least one of clock_in_time, clock_out_time or note. Get entry IDs from workable_time_entries_list.

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

Inputs:

- `employee_id` (`string`, required): ID of the employee who owns the entry. Example: "375b".
- `entry_id` (`string`, required): UUID of the time entry, from workable_time_entries_list. Example: "7d9f2a3e-1b4c-4d5e-8f6a-0b1c2d3e4f5a".
- `clock_in_time` (`string`, optional): New clock-in time, ISO 8601 timestamp with a timezone designator (Z or an offset); seconds are truncated. Example: "2024-06-03T09:00:00Z".
- `clock_out_time` (`string`, optional): New clock-out time, ISO 8601 timestamp with a timezone designator (Z or an offset); seconds are truncated. Example: "2024-06-03T17:30:00Z".
- `note` (`string`, optional): New note for the entry.
- `override_overlapping` (`boolean`, optional): Set true to archive any existing entries that overlap the updated one.

Example input: `{"employee_id":"375b","entry_id":"7d9f2a3e-1b4c-4d5e-8f6a-0b1c2d3e4f5a"}`

### `workable_timeoff_approval_update`

Approve or Reject Time Off · Write

Approve or reject a pending time off approval step.
Returns the updated approval.
Get the approval key from the pending_approvals of a request in workable_timeoff_requests_list. Account-level tokens must pass member_id and approver_id.

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

Inputs:

- `approval_key` (`string`, required): Key of the pending approval (the id in a request's pending_approvals array). Example: "9c1d".
- `state` (`string`, required): New approval state: approved or rejected. One of: `approved`, `rejected`.
- `approver_id` (`string`, optional): Approver whose pending step is acted on. Optional for user tokens (defaults to the token's member); required for account tokens.
- `member_id` (`string`, optional): ID of the Workable member performing the action. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".

Example input: `{"approval_key":"9c1d","state":"approved"}`

### `workable_timeoff_request_create`

Create Time Off Request · Write

Create a time off request for an employee in a given category and date range.
Returns the created time off request.
Use workable_timeoff_categories_list for category IDs and workable_timeoff_balances_get to check the balance first.
Account-level tokens must pass employee_id and member_id.

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

Inputs:

- `category_id` (`string`, required): Time off category ID, from workable_timeoff_categories_list. Example: "6a3f".
- `from_date` (`string`, required): First day of leave as an ISO 8601 date-time without timezone, with milliseconds: YYYY-MM-DDTHH:mm:ss.SSS. A trailing Z or offset is rejected. Example: "2024-07-01T00:00:00.000".
- `to_date` (`string`, required): Last day of leave in the same format as from_date; on or after from_date. Example: "2024-07-05T00:00:00.000".
- `employee_id` (`string`, optional): Employee the request is for. Required for account-level tokens; defaults to the token's user for user tokens.
- `half_days` (`array`, optional): Days within the range that are half days. Each entry has a date (YYYY-MM-DDTHH:mm:ss.SSS, no timezone) and half (first or second). Example: [{"date": "2024-07-05T00:00:00.000", "half": "first"}].
- `member_id` (`string`, optional): ID of the Workable member making the request. Required when the access token is an account-level token; optional for user tokens. Find member IDs with workable_members_list. Example: "13e0eb0e".
- `note` (`string`, optional): Note for the request, up to 140 characters.

Example input: `{"category_id":"6a3f","from_date":"2024-07-01T00:00:00.000","to_date":"2024-07-05T00:00:00.000"}`

## Related

Other Productivity connectors ([all 144](/agentkit/connectors/?category=productivity)):

- [Slack](/agentkit/connectors/slack/): Scalekit connector, OAuth, 96 tools
- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 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 |
