# Workable

> Manage hiring on Workable: job postings, candidates, pipeline stages, notes and ratings.

App · Jobs & Hiring · 20 actions. Web page: https://docs.lodol.com/docs/integrations/workable

## Actions

### Comment on a candidate

Add a note to a candidate's timeline.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- Acting team member (`member_id`, text, required): The Workable team member this is recorded as being done by. Workable requires one on every candidate action that appears in the timeline.
- Note (`body`, text, required): The text of the note.
- Visible to (`policy`, list): Limit the note to these roles. Leave blank to use the account's default visibility. One or more of: `admin`, `recruiting_admin` (Recruiting admin), `hiring_manager` (Hiring manager), `simple`, `reviewer`, `recruiter`.

**Outputs**

- `candidate_id` (text): The candidate the note was added to.
- `commented` (true/false): True when Workable accepted the note.
- `policy` (list): The roles the note was limited to, if any.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidate_id": "3fc9a80f",
  "commented": true,
  "policy": [],
  "status": "success"
}
```

### Create a candidate

Add a candidate to a job on Workable.

**Inputs**

- Job code (`shortcode`, text, required): The job's shortcode -- the short code at the end of its Workable web address. Use 'List jobs' to find one.
- Full name (`name`, text, required): The candidate's full name.
- Email (`email`, text, required): The candidate's email address.
- Headline (`headline`, text): A one-line summary, such as their current title.
- Summary (`summary`, text): A longer summary of the candidate.
- Phone (`phone`, text): The candidate's phone number.
- Address (`address`, text): The candidate's address.
- Cover letter (`cover_letter`, text): The candidate's cover letter.
- Resume URL (`resume_url`, text): A link to the candidate's resume.
- Skills (`skills`, list): The candidate's skills.
- Sourced by us (`sourced`, true/false): On (the default) files them as sourced by your team. Off files them as having applied themselves, which places them in a different pipeline stage. Default: `true`.

**Outputs**

- `candidate` (object): The candidate that was created.
- `candidate_id` (text): The new candidate's id.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidate": {
    "email": "jordan@example.com",
    "id": "3fc9a80f",
    "name": "Jordan Vale",
    "stage": "Sourced"
  },
  "candidate_id": "3fc9a80f",
  "status": "success"
}
```

### Disqualify a candidate

Reject a candidate, optionally recording why. This can be undone with 'Revert a disqualification'.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- Acting team member (`member_id`, text, required): The Workable team member this is recorded as being done by. Workable requires one on every candidate action that appears in the timeline.
- Reason (`disqualification_reason_id`, text): The rejection reason to record. Leave blank to disqualify without one.

**Outputs**

- `candidate_id` (text): The candidate that was disqualified.
- `disqualified` (true/false): True when Workable accepted the disqualification.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidate_id": "3fc9a80f",
  "disqualified": true,
  "status": "success"
}
```

### Get a candidate

Get one candidate's full profile.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.

**Outputs**

- `candidate` (object): The candidate's profile.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidate": {
    "email": "jordan@example.com",
    "id": "3fc9a80f",
    "name": "Jordan Vale",
    "stage": "Applied",
    "tags": [
      "referral"
    ]
  },
  "status": "success"
}
```

### Get a job

Get the full details of one job posting.

**Inputs**

- Job code (`shortcode`, text, required): The job's shortcode -- the short code at the end of its Workable web address. Use 'List jobs' to find one.

**Outputs**

- `job` (object): The job posting.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "job": {
    "id": "1F8C9A",
    "shortcode": "A1B2C3D4E5",
    "state": "published",
    "title": "Product Designer"
  },
  "status": "success"
}
```

### Get job application form

Get the application form for a job, which fields it asks for and which are required.

**Inputs**

- Job code (`shortcode`, text, required): The job's shortcode -- the short code at the end of its Workable web address. Use 'List jobs' to find one.

**Outputs**

- `application_form` (object): The job's application form configuration.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "application_form": {
    "form_fields": [
      {
        "key": "phone",
        "label": "Phone",
        "required": "true"
      }
    ],
    "questions": []
  },
  "status": "success"
}
```

### List candidate activity

List a candidate's activity timeline: stage moves, notes and ratings.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- Updated after (`updated_after`, date): Only return activity on or after this date.
- Maximum results (`limit`, number): How many results to return per page (1-100). Defaults to 50. From 1 to 100.

**Outputs**

- `activities` (list): The candidate's activity, newest first.
- `count` (number): How many activities were returned.
- `paging` (object): Cursor for the next page, when there is one.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "activities": [
    {
      "action": "comment",
      "body": "Strong portfolio.",
      "created_at": "2026-01-14T10:22:05Z",
      "id": "aa11bb"
    }
  ],
  "count": 1,
  "paging": {},
  "status": "success"
}
```

### List candidates

List candidates, optionally narrowed to one job, one pipeline stage or one email address.

**Inputs**

- Job code (`shortcode`, text): Only return candidates on this job. Leave blank for candidates across every job.
- Stage (`stage`, text): Only return candidates currently in this stage.
- Email (`email`, text): Only return candidates with this email address.
- Created after (`created_after`, date): Only return candidates created on or after this date.
- Updated after (`updated_after`, date): Only return candidates updated on or after this date.
- Maximum results (`limit`, number): How many results to return per page (1-100). Defaults to 50. From 1 to 100.

**Outputs**

- `candidates` (list): The candidates that matched.
- `count` (number): How many candidates were returned.
- `paging` (object): Cursor for the next page, when there is one.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidates": [
    {
      "email": "jordan@example.com",
      "id": "3fc9a80f",
      "name": "Jordan Vale",
      "stage": "Applied"
    }
  ],
  "count": 1,
  "paging": {},
  "status": "success"
}
```

### List departments

List the departments configured on your Workable account.

**Inputs**: None.

**Outputs**

- `count` (number): How many departments were returned.
- `departments` (list): The account's departments.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "count": 1,
  "departments": [
    {
      "id": "3f0c1e",
      "name": "Design",
      "parent_id": null
    }
  ],
  "status": "success"
}
```

### List job hiring team

List the team members assigned to a job.

**Inputs**

- Job code (`shortcode`, text, required): The job's shortcode -- the short code at the end of its Workable web address. Use 'List jobs' to find one.

**Outputs**

- `count` (number): How many members were returned.
- `members` (list): The job's hiring team.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "count": 1,
  "members": [
    {
      "email": "dana@example.com",
      "id": "13e0eb0e",
      "name": "Dana Reeve",
      "role": "admin"
    }
  ],
  "status": "success"
}
```

### List job questions

List the application questions asked on a job.

**Inputs**

- Job code (`shortcode`, text, required): The job's shortcode -- the short code at the end of its Workable web address. Use 'List jobs' to find one.

**Outputs**

- `count` (number): How many questions were returned.
- `questions` (list): The job's application questions.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "count": 1,
  "questions": [
    {
      "body": "Why do you want this role?",
      "id": "9A8B7C",
      "required": true,
      "type": "free_text"
    }
  ],
  "status": "success"
}
```

### List jobs

List the job postings on your Workable account.

**Inputs**

- Status (`state`, text): Only return jobs in this state. Leave blank for all. One of: `draft`, `published`, `archived`, `closed`.
- Include extra fields (`include_fields`, list): Long-form fields to include with each job. These are omitted by default because they are large. One or more of: `description`, `full_description` (Full description), `requirements`, `benefits`.
- Created after (`created_after`, date): Only return jobs created on or after this date.
- Updated after (`updated_after`, date): Only return jobs updated on or after this date.
- Maximum results (`limit`, number): How many results to return per page (1-100). Defaults to 50. From 1 to 100.

**Outputs**

- `count` (number): How many jobs were returned.
- `jobs` (list): The jobs that matched.
- `paging` (object): Cursor for the next page, when there is one.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "count": 1,
  "jobs": [
    {
      "department": "Design",
      "id": "1F8C9A",
      "shortcode": "A1B2C3D4E5",
      "state": "published",
      "title": "Product Designer"
    }
  ],
  "paging": {},
  "status": "success"
}
```

### List pipeline stages

List the recruiting pipeline stages on the account, with the slug each one is addressed by when moving a candidate.

**Inputs**: None.

**Outputs**

- `count` (number): How many stages were returned.
- `stages` (list): The account's pipeline stages, in order.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "count": 1,
  "stages": [
    {
      "kind": "sourced",
      "name": "Sourced",
      "position": 0,
      "slug": "sourced"
    }
  ],
  "status": "success"
}
```

### List rejection reasons

List the rejection reasons configured on the account, with the id each one is addressed by when disqualifying a candidate.

**Inputs**: None.

**Outputs**

- `count` (number): How many reasons were returned.
- `disqualification_reasons` (list): The account's configured rejection reasons.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "count": 1,
  "disqualification_reasons": [
    {
      "candidate_withdrew": false,
      "description": "Not enough experience",
      "id": "7c2a11",
      "position": 0
    }
  ],
  "status": "success"
}
```

### List team members

List the members of your Workable account.

**Inputs**

- Role (`role`, text): Only return members with this recruiting role. One of: `simple`, `admin`, `reviewer`.
- Status (`status`, text): Only return members with this status. One of: `active`, `inactive`, `all`.
- Email (`email`, text): Only return the member with this email address.
- Maximum results (`limit`, number): How many results to return per page (1-100). Defaults to 50. From 1 to 100.

**Outputs**

- `count` (number): How many members were returned.
- `members` (list): The members that matched.
- `paging` (object): Cursor for the next page, when there is one.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "count": 1,
  "members": [
    {
      "active": true,
      "email": "dana@example.com",
      "id": "13e0eb0e",
      "name": "Dana Reeve"
    }
  ],
  "paging": {},
  "status": "success"
}
```

### Move a candidate to a stage

Move a candidate to a different stage of the pipeline.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- Acting team member (`member_id`, text, required): The Workable team member this is recorded as being done by. Workable requires one on every candidate action that appears in the timeline.
- Move to stage (`target_stage`, text, required): The pipeline stage to move the candidate into.

**Outputs**

- `candidate_id` (text): The candidate that was moved.
- `moved` (true/false): True when Workable accepted the move.
- `stage` (text): The stage the candidate is now in.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidate_id": "3fc9a80f",
  "moved": true,
  "stage": "interview",
  "status": "success"
}
```

### Rate a candidate

Leave a 1-5 rating, with an optional comment.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- Acting team member (`member_id`, text, required): The Workable team member this is recorded as being done by. Workable requires one on every candidate action that appears in the timeline.
- Rating (`grade`, number, required): The rating to leave, from 1 (worst) to 5 (best). From 1 to 5.
- Comment (`comment`, text): An optional comment to leave with the rating.

**Outputs**

- `candidate_id` (text): The candidate that was rated.
- `grade` (number): The rating that was left.
- `rated` (true/false): True when Workable accepted the rating.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidate_id": "3fc9a80f",
  "grade": 4,
  "rated": true,
  "status": "success"
}
```

### Revert a disqualification

Put a disqualified candidate back into the pipeline.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- Acting team member (`member_id`, text, required): The Workable team member this is recorded as being done by. Workable requires one on every candidate action that appears in the timeline.

**Outputs**

- `candidate_id` (text): The candidate that was reinstated.
- `reverted` (true/false): True when Workable accepted the reversal.
- `status` (text): Status of the action execution ("success" on success).

**Example output**

```json
{
  "candidate_id": "3fc9a80f",
  "reverted": true,
  "status": "success"
}
```

### Set candidate tags

Set the tags on a candidate. This replaces their existing tags: any tag you leave out is removed, and an empty list clears them all.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- Tags (`tags`, list): The complete set of tags the candidate should end up with. To add one, include the existing tags too.

**Outputs**

- `candidate_id` (text): The candidate whose tags were set.
- `status` (text): Status of the action execution ("success" on success).
- `tags` (list): The tags the candidate now has.

**Example output**

```json
{
  "candidate_id": "3fc9a80f",
  "status": "success",
  "tags": [
    "referral",
    "design"
  ]
}
```

### Update a candidate

Change a candidate's profile details. Only the fields you fill in are changed.

**Inputs**

- Candidate (`candidate_id`, text, required): The id of the candidate. Use 'List candidates' to find one -- the id also appears in the candidate's Workable web address.
- First name (`firstname`, text): The candidate's first name.
- Last name (`lastname`, text): The candidate's last name.
- Email (`email`, text): The candidate's email address.
- Headline (`headline`, text): A one-line summary, such as their current title.
- Summary (`summary`, text): A longer summary of the candidate.
- Phone (`phone`, text): The candidate's phone number.
- Address (`address`, text): The candidate's address.
- Cover letter (`cover_letter`, text): The candidate's cover letter.

**Outputs**

- `candidate` (object): The candidate after the update.
- `status` (text): Status of the action execution ("success" on success).
- `updated_fields` (list): The names of the fields that were changed.

**Example output**

```json
{
  "candidate": {
    "headline": "Senior Product Designer",
    "id": "3fc9a80f",
    "name": "Jordan Vale"
  },
  "status": "success",
  "updated_fields": [
    "headline"
  ]
}
```
