openapi: 3.1.0
info:
version: 1.0.0
title: Ashby API
description: Complete public API for accessing resources in your Ashby instance. Includes applications, candidates, jobs, interviews, offers, surveys, custom fields, organization metadata, files, reports, approvals, and webhooks.
contact:
name: Ashby Support
url: https://app.ashbyhq.com/support
email: support@ashbyhq.com
servers:
- url: https://api.ashbyhq.com
security:
- BasicAuth: []
components:
securitySchemes:
BasicAuth:
type: http
scheme: basic
description: HTTP Basic Auth. Send your Ashby API key as the username and leave the password blank.
WebhookSignature:
type: apiKey
in: header
name: Ashby-Signature
description: HMAC-SHA256 signature of the webhook payload, used to verify webhook authenticity.
paths:
/apiKey.info:
post:
summary: apiKey.info
description: 'Retrieve information about the API key being used to make the request.
**Requires the [`apiKeysRead`](authentication#permissions-apikeyinfo) permission.**
'
operationId: apiKeyInfo
tags:
- API Key
requestBody:
content:
application/json:
schema:
type: object
responses:
'200':
description: Responses for the apiKey.info endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: object
properties:
title:
type: string
description: The name of the API key.
example: Custom Job Board API key
createdAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
scopes:
type: array
description: List of permission scopes that this API key is authorized for.
items:
type: string
example:
- jobs:read
- candidates:read
required:
- results
- title: Error response
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
security:
- BasicAuth: []
/application.addHiringTeamMember:
post:
summary: application.addHiringTeamMember
description: "Adds an Ashby user to the hiring team at the application level. \n\n**Requires the [`candidateWrite`](authentication#permissions-applicationaddhiringteammember) permission.**\n"
operationId: applicationaddhiringteammember
tags:
- Application
requestBody:
content:
application/json:
schema:
required:
- applicationId
- teamMemberId
- roleId
properties:
applicationId:
allOf:
- description: The application to assign the user a role on.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
teamMemberId:
allOf:
- description: The id of the user to assign the role to.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
roleId:
allOf:
- description: The id of the hiring team role to assign.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
responses:
'200':
description: Responses for the application.addHiringTeamMember endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/paths/~1hiringTeam.addMember/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
required:
- results
- title: Error response
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/application.changeSource:
post:
summary: application.changeSource
operationId: applicationChangeSource
description: 'Change the source of an application.
**Requires the [`candidatesWrite`](authentication#permissions-applicationchangesource) permission.**
'
tags:
- Application
requestBody:
content:
application/json:
schema:
properties:
applicationId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the application to update the source of
sourceId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The source to set on the application. Pass null to unset an application's source.
required:
- applicationId
- sourceId
example:
applicationId: 3ae2b801-19f6-41ef-ad28-214bd731948f
sourceId: 2c6991c5-c9e2-4af8-879e-29c5a9d26509
responses:
'200':
description: Responses from the application.changeSource endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/application.changeStage:
post:
summary: application.changeStage
operationId: applicationChangeStage
description: 'Change the stage of an application
**Requires the [`candidatesWrite`](authentication#permissions-applicationchangestage) permission.**
'
tags:
- Application
requestBody:
content:
application/json:
schema:
properties:
applicationId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the application to update the stage of
interviewStageId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The interview stage to move the application to.
archiveReasonId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: "Archive Reason to set when moving to an Interview Stage with type: `Archived`. \nNote: You must pass this parameter when moving to an Interview Stage with type: `Archived`\n"
archiveEmail:
type: object
properties:
communicationTemplateId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: 'The id of the communication template to use for the email.
Note: This communication template''s intendedTypes must include: `email`.
'
sendAt:
type: string
format: date-time
description: 'The date and time to send the email as an ISO 8601 date and time string, e.g. `2025-02-24T08:27:01Z`.
If omitted, the email will be scheduled for the following morning at 9:32am in your default timezone.
If the time is in the past, the email will be sent immediately.
Note: If a timezone is not specified, timestamps will be interpreted in UTC, regardless of your timezone setting.
'
description: 'Email to send to the candidate when moving to an Interview Stage with type: `Archived`.
Note: If application is already archived, the email will not be sent.
Note: If email send fails, the application stage will not be updated. If this is the case, you can retry the request without this parameter.
Note: You may only pass this parameter if the application is moving to an Interview Stage with type: `Archived`.
'
required:
- communicationTemplateId
required:
- applicationId
- interviewStageId
example:
applicationId: 3ae2b801-19f6-41ef-ad28-214bd731948f
interviewStageId: 2c6991c5-c9e2-4af8-879e-29c5a9d26509
responses:
'200':
description: Responses from the application.changeStage endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application'
required:
- results
- allOf:
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
- type: object
properties:
errors:
type: array
items:
type: string
enum:
- invalid_input
- application_not_found
- interview_plan_not_found
- interview_stage_not_found
- archive_reason_not_found
- communication_template_not_found
- communication_template_not_allowed
description: '| Error Code | Description |
|------------|-------------|
| `invalid_input` | A parameter is the wrong type |
| `invalid_input` | Archive fields are not allowed for non-archive stages |
| `invalid_input` | Archive reason ID is required for archive stages |
| `application_not_found` | |
| `interview_plan_not_found` | |
| `interview_stage_not_found` | |
| `archive_reason_not_found` | |
| `communication_template_not_found` | |
| `communication_template_not_allowed` | Template contains unresolvable substitution tokens |
| `communication_template_not_allowed` | Template intended types does not include ''email'' |
| `communication_template_not_allowed` | [Less common] Template is archived |
| `communication_template_not_allowed` | [Less common] Template is a one-off template |
'
/application.create:
post:
summary: application.create
operationId: applicationCreate
description: 'Consider a candidate for a job (eg when sourcing a candidate for a job posting).
If you''re submitting an application as a job board, use the [`applicationForm.submit`](https://developers.ashbyhq.com/reference/applicationformsubmit) endpoint instead. See [Creating a custom careers page](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page) for details.
**Requires the [`candidatesWrite`](authentication#permissions-applicationcreate) permission.**
To set values for custom fields on Applications, use the [`customFields.setValue`](https://developers.ashbyhq.com/reference/customfieldsetvalue) endpoint.
'
tags:
- Application
requestBody:
content:
application/json:
schema:
properties:
candidateId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the candidate to consider for a job
jobId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the job to consider the candidate for
interviewPlanId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: 'The id of the interview plan to place the application in. If none is provided, the default interview plan is used.
'
interviewStageId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: "The interview stage of the interview plan (either default or provided) to place the application in. \nIf none is provided, the application is placed in the first \"Lead\" stage. \nYou can also supply the special string \"FirstPreInterviewScreen\", which will choose the first pre-interview-screen stage on the specified job's interview plan.\n"
sourceId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The source to set on the application being created.
creditedToUserId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the user the application will be credited to.
createdAt:
allOf:
- description: 'An ISO date string to set the application''s `createdAt` timestamp. When this value isn''t provided, the `createdAt` timestamp defaults to the time the call was made.
'
- $ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
applicationHistory:
allOf:
- type: array
description: An array of objects representing the application history.
items:
type: object
properties:
stageId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The ID of the interview stage for this history event. This stage must belong to the interview plan associated with the application.
stageNumber:
allOf:
- type: integer
- description: The sort order of this event. 0 is the first, the highest number will be the current stage.
enteredStageAt:
allOf:
- $ref: '#/paths/~1candidate.addEmailMessage/post/requestBody/content/application~1json/schema/properties/sentAt/allOf/0'
- description: An ISO date string representing the time the application entered this stage.
archiveReasonId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The ID of the archive reason. If the interview stage is an `Archived` stage type, this field is required.
required:
- stageId
- stageNumber
- enteredStageAt
- description: 'An array of objects representing the application history.
'
required:
- candidateId
- jobId
example:
candidateId: 3ae2b801-19f6-41ef-ad28-214bd731948f
jobId: 2c6991c5-c9e2-4af8-879e-29c5a9d26509
responses:
'200':
description: Responses from the application.create endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/applicationForm.submit:
post:
summary: applicationForm.submit
description: 'Submit an application for a job posting.
**Requires the [`candidatesWrite`](authentication#permissions-applicationformsubmit) permission.**
The Content-Type of this request must be `multipart/form-data` or `application/json`.
When using `application/json`, file fields should contain a handle string obtained from [`file.createFileUploadHandle`](https://developers.ashbyhq.com/reference/filecreatefileuploadhandle) with `fileUploadContext` set to `ApplicationForm`. This allows files to be uploaded directly to storage, bypassing the need to send file bytes through the API.
When using `multipart/form-data`, file fields should reference a file part included in the multipart request body (existing behavior).
**Important:** Please ensure that you check the response''s `success` field and display any validation errors to candidates if it is `false`. Not doing so will result in applications not being recorded, without any notification to the candidate prompting them to resubmit. For testing purposes, you can simulate a validation failure by submitting the email address `testing-fail-validation@example.com`.
**Note: The requests generated from this documentation will not work for this endpoint.**
The values accepted for each field depend on the type of field that''s being filled out:
- `Boolean` - A boolean value
- `Date` - A date string in the format YYYY-MM-DD
- `Email` - A valid email address
- `Number` - An integer
- `RichText` - We do not support submitting rich text documents via the API but we do support submitting plain text values for these fields. Plain text values must be submitted in the format `{ type: "PlainText", value: "A plain text string" }`
- `Score` - An integer between 1 and 4 submitted in the format `{ score: 4 }`
- `Phone`, `String` A string
- `ValueSelect` - A string that matches the value of one of the ValueSelect field''s selectable options
- `MultiValueSelect` - An array of strings that exist in the MultiValueSelect field''s selectable options
- `Location` - An object with the following properties: `{ country: "USA", city: "San Francisco", region: "California" }`. You may provide any combination of these properties and we will attempt to geocode the location. For best results, provide all three properties.
- `EducationHistory` - [Early Access] An array of objects with the following properties: `{ schoolName: "University of California, Berkeley", degree: "Bachelor of Science", major: "Computer Science", startDate: "2020-09-01", endDate: "2024-05-15", isCurrent: true }`. Only `schoolName` is required. We will attempt to match the school name to a known school in our database. If `isCurrent` is true, `endDate` must not be provided.
'
operationId: applicationformsubmit
tags:
- Application Form
requestBody:
content:
application/json:
schema:
type: object
required:
- jobPostingId
- applicationForm
properties:
jobPostingId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the job posting to submit an application for
applicationForm:
$ref: '#/paths/~1offer.create/post/requestBody/content/application~1json/schema/properties/offerForm'
utmData:
type: object
properties:
utm_source:
type: string
utm_campaign:
type: string
utm_medium:
type: string
utm_term:
type: string
utm_content:
type: string
tagIds:
type: array
description: The ids of the tags to apply to the candidate
items:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
allowSubmissionForUnpublishedJobPosting:
type: boolean
example: true
description: Defaults to true. If you are running a custom built careers page that is statically generated, you may want to set this to true to allow applications to be submitted in the time a job is unpublished and your careers page is refreshed. If set to false, applications submitted for unpublished job postings will return a `job_posting_not_published` error.
multipart/form-data:
schema:
type: object
required:
- jobPostingId
- applicationForm
properties:
jobPostingId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the job posting to submit an application for
applicationForm:
$ref: '#/paths/~1offer.create/post/requestBody/content/application~1json/schema/properties/offerForm'
utmData:
type: object
properties:
utm_source:
type: string
utm_campaign:
type: string
utm_medium:
type: string
utm_term:
type: string
utm_content:
type: string
tagIds:
type: array
description: The ids of the tags to apply to the candidate
items:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
allowSubmissionForUnpublishedJobPosting:
type: boolean
example: true
description: Defaults to true. If you are running a custom built careers page that is statically generated, you may want to set this to true to allow applications to be submitted in the time a job is unpublished and your careers page is refreshed. If set to false, applications submitted for unpublished job postings will return a `job_posting_not_published` error.
Please Note: we have set up limits for applications for this role. Candidates may not apply more than 2 times in any 60 day span for any job in the Application Limit Group.
Example org is a leading software company. Example org allows real-time collaboration on important example workflows. Founded in 2012 we have over 10,000 customers worldwide and are backed by fantastic investors such as Sequoia Capital.
This example role will be part of an example team and will report to the example manager. The new hire plays a critical role in various example workflows.
Experience writing good example job descriptions
Other exemplary skills
3-5 years prior experience in this role
Motivation
Great english language skills
Example org is a leading software company. Example org allows real-time collaboration on important example workflows. Founded in 2012 we have over 10,000 customers worldwide and are backed by fantastic investors such as Sequoia Capital.
Please Note: we have set up limits for applications for this role. It is in the Product Limit group. The following limits apply to applications for all jobs within this group:
\nCandidates may not apply more than 1 time in any 60 day span for any job in the Product Limit Group.
\n`\n- Code blocks - ``\n"
required:
- type
- content
required:
- jobPostingId
responses:
'200':
description: Responses for the jobPosting.update endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/paths/~1jobPosting.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.info:
post:
summary: opening.info
description: "Retrieves an opening by its UUID.\n \n**Requires the [`jobsRead`](authentication#permissions-openinginfo) permission.**"
operationId: openinginfo
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
required:
- openingId
properties:
openingId:
type: string
description: The id of the opening
responses:
'200':
description: Responses for the opening.info endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.list:
post:
summary: opening.list
description: "Lists openings.\n\nSee the [Pagination and Incremental Synchronization](/docs/pagination-and-incremental-sync) guide for detailed usage examples.\n \n**Requires the [`jobsRead`](authentication#permissions-openinglist) permission.**"
operationId: openinglist
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
properties:
createdAfter:
type: integer
format: int64
description: The API will return data after this date, which is the time since the unix epoch in milliseconds
cursor:
$ref: '#/paths/~1brand.list/post/requestBody/content/application~1json/schema/properties/cursor'
syncToken:
type: string
description: 'An opaque token representing the last time the data was successfully synced from the API. A new, updated one is returned after successfully fetching the last page of data.
'
example: jYnEBmjzR
limit:
$ref: '#/paths/~1brand.list/post/requestBody/content/application~1json/schema/properties/limit'
example:
createdAfter: 1659979196538
cursor: qA
syncToken: 6W05prn4d
limit: 25
responses:
'200':
description: Responses for the opening.list endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: array
items:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.search:
post:
summary: opening.search
description: "Searches for openings by identifier.\n \n**Requires the [`jobsRead`](authentication#permissions-openingsearch) permission.**"
operationId: openingsearch
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
required:
- identifier
properties:
identifier:
type: string
description: The identifier of the opening you want to search for
responses:
'200':
description: Responses for the opening.search endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: array
items:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.create:
post:
summary: opening.create
description: "Creates an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingcreate) permission.**\n\nTo set values of custom fields on Openings, use the [`customFields.setValue`](https://developers.ashbyhq.com/reference/customfieldsetvalue) endpoint."
operationId: openingcreate
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
properties:
identifier:
type: string
description: jobIds, targetHireDate, targetStartDate, isBackfill, employmentType,
description:
type: string
teamId:
type: string
description: The id of the department or team associated with the opening.
locationIds:
type: array
description: The ids of the locations associated with the opening.
items:
type: string
jobIds:
type: array
description: The ids of the jobs associated with the opening
items:
type: string
targetHireDate:
type: string
description: The date (in YYYY-MM-DD format) by which you intend to hire against this opening.
targetStartDate:
type: string
description: The date (in YYYY-MM-DD format) by which you intend someone hired against this opening will start employment.
isBackfill:
type: boolean
description: Whether this opening is intended to backfill a previous employee
default: false
employmentType:
type: string
description: The employment type for this opening
default: FullTime
enum:
- FullTime
- PartTime
- Intern
- Contract
- Temporary
- ''
openingState:
type: string
description: The state the opening should be created in. Defaults to `Draft`. If not Draft, additional validation will be performed.
enum:
- Draft
- Approved
- Open
- Closed
responses:
'200':
description: Responses for the opening.create endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.addJob:
post:
summary: opening.addJob
description: "Adds a job to an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingaddjob) permission.**"
operationId: openingaddjob
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
required:
- openingId
- jobId
properties:
openingId:
type: string
description: The id of the opening
jobId:
type: string
description: The id of the job to add
responses:
'200':
description: Responses for the opening.addJob endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.removeJob:
post:
summary: opening.removeJob
description: "Removes a job from an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingremovejob) permission.**"
operationId: openingremovejob
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
required:
- openingId
- jobId
properties:
openingId:
type: string
description: The id of the opening
jobId:
type: string
description: The id of the job to remove from the opening.
responses:
'200':
description: Responses for the opening.removeJob endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.addLocation:
post:
summary: opening.addLocation
description: "Adds a location to an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingaddlocation) permission.**"
operationId: openingaddlocation
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
required:
- openingId
- locationId
properties:
openingId:
type: string
description: The id of the opening
locationId:
type: string
description: The id of the location to add to the opening.
responses:
'200':
description: Responses for the opening.addLocation endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.removeLocation:
post:
summary: opening.removeLocation
description: "Removes a location from an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingremovelocation) permission.**"
operationId: openingremovelocation
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
required:
- openingId
- locationId
properties:
openingId:
type: string
description: The id of the opening
locationId:
type: string
description: The id of the location to remove from the opening.
responses:
'200':
description: Responses for the opening.removeLocation endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.setOpeningState:
post:
summary: opening.setOpeningState
description: "Sets the state of an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingsetopeningstate) permission.**"
operationId: openingsetopeningstate
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
properties:
openingId:
type: string
description: The id of the opening you want to update
openingState:
type: string
description: The new state you want to update the opening to
enum:
- Draft
- Approved
- Open
- Closed
closeReasonId:
type: string
description: The id of the close reason if you are setting the state to closed
responses:
'200':
description: Responses for the opening.setOpeningState endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.setArchived:
post:
summary: opening.setArchived
description: "Sets the archived state of an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingsetarchived) permission.**"
operationId: openingsetarchived
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
properties:
openingId:
type: string
description: The id of the opening you want to archive
archive:
type: boolean
description: The new archived state you want to update the opening to
responses:
'200':
description: Responses for the opening.setArchived endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/opening.update:
post:
summary: opening.update
description: "Updates an opening.\n \n**Requires the [`jobsWrite`](authentication#permissions-openingupdate) permission.**\n\nTo set values for custom fields on Openings, use the [`customFields.setValue`](https://developers.ashbyhq.com/reference/customfieldsetvalue) endpoint."
operationId: openingupdate
tags:
- Openings
requestBody:
content:
application/json:
schema:
type: object
properties:
openingId:
type: string
description: The openingId of the opening you want to update.
identifier:
type: string
description: jobIds, targetHireDate, targetStartDate, isBackfill, employmentType,
description:
type: string
teamId:
type: string
description: The id of the department or team associated with the opening.
targetHireDate:
type: string
description: The date (in YYYY-MM-DD format) by which you intend to hire against this opening.
targetStartDate:
type: string
description: The date (in YYYY-MM-DD format) by which you intend someone hired against this opening will start employment.
isBackfill:
type: boolean
description: Whether this opening is intended to backfill a previous employee
default: false
employmentType:
type: string
description: The employment type for this opening
default: FullTime
enum:
- FullTime
- PartTime
- Intern
- Contract
- Temporary
- ''
responses:
'200':
description: Responses for the opening.update endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/openingCreate/post/requestBody/content/application~1json/schema/properties/data/properties/opening'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offer.approve:
post:
summary: offer.approve
operationId: offerApprove
description: 'Approves an offer or a specific approval step within an offer''s approval process.
This endpoint mimics the behavior of the "Force Approve" function in the Ashby app, where an admin can override approval for a specific step or entire approval process.
**Requires the [`offersWrite`](authentication#permissions-offerapprove) permission.**
This endpoint can be used in two ways:
1. **Approve entire offer**: Call without `approvalStepId` and `userId` to approve the entire offer approval process
2. **Approve specific step**: Provide both `approvalStepId` and `userId` to approve a specific step in the approval process
When approving a specific step, the step must be the current step in the approval process and the user must be an approver for that step.
'
tags:
- Offer
requestBody:
content:
application/json:
schema:
type: object
properties:
offerVersionId:
allOf:
- description: The id of the offer version that needs approval. This can be obtained as the `entityId` from the `approval.list` endpoint.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
approvalStepId:
allOf:
- description: 'The id of the specific approval step to approve. If provided, `userId` must also be provided.
If omitted, the entire offer approval process will be approved. This can be obtained from the `approval.list` endpoint.
'
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
userId:
allOf:
- description: 'The id of the user approving the step. Required if `approvalStepId` is provided.
Must be an approver for the specified approval step.
'
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
excludeFormDefinition:
$ref: '#/paths/~1offer.info/post/requestBody/content/application~1json/schema/properties/excludeFormDefinition'
required:
- offerVersionId
responses:
'200':
description: Responses for the offer.approve endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offer.create:
post:
summary: offer.create
operationId: offerCreate
description: 'Creates a new Offer
**Requires the [`offersWrite`](authentication#permissions-offercreate) permission.**
Offer forms support a variety of field types. The values accepted for each field depend on the type of field that''s being filled out:
- `Boolean` - A boolean value.
- `Currency` - An object in the format `{ currencyCode: "USD", value: 100000 }` where currencyCode is a valid ISO 4217 currency code and value is an integer.
- `Date` - A valid ISO Date string.
- `Number` - An integer.
- `String` - A string.
- `ValueSelect` - A string that matches the value of one of the ValueSelect field''s selectable options.
- `MultiValueSelect` - An array of strings that exist in the MultiValueSelect field''s selectable options.
**Error codes:**
| Code | Description |
|---|---|
| `opening_in_use` | The opening is already in use by another offer. |
| `opening_state_invalid` | The opening has already been closed or filled by a different application.. |
'
tags:
- Offer
requestBody:
content:
application/json:
schema:
type: object
properties:
offerProcessId:
allOf:
- description: "The id of the offer process associated with the offer you're creating. \nThis value is the id included in the response of the `offerProcess.start` API.\n"
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
offerFormId:
allOf:
- description: 'The id of the form associated with the offer.
This value is the id included in the response of the `offer.start` API.
'
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
offerForm:
type: object
properties:
fieldSubmissions:
type: array
items:
properties:
path:
type: string
description: The form field's "path" value
value:
type: string
description: This is often a primitive but the value depends on the type of field being submitted. See the description above for details on the values accepted in this field.
required:
- path
- value
required:
- fieldSubmissions
excludeFormDefinition:
$ref: '#/paths/~1offer.info/post/requestBody/content/application~1json/schema/properties/excludeFormDefinition'
required:
- offerProcessId
- offerFormId
- offerForm
responses:
'200':
description: Responses for the offer.create endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offer.info:
post:
summary: offer.info
operationId: offerInfo
description: 'Returns details about a single offer by id
**Requires the [`offersRead`](authentication#permissions-offerinfo) permission.**
'
tags:
- Offer
requestBody:
content:
application/json:
schema:
type: object
properties:
offerId:
allOf:
- description: The id of the offer to fetch
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
excludeFormDefinition:
type: boolean
description: 'If true, omits the `formDefinition` field from the response. Useful for
integrations that only consume submitted offer values and don''t need the
full form schema (which can be large for orgs with many selectable values).
'
default: false
required:
- offerId
responses:
'200':
description: Responses for the offer.info endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offer.list:
post:
summary: offer.list
description: 'Get a list of all offers with their latest version.
See the [Pagination and Incremental Synchronization](/docs/pagination-and-incremental-sync) guide for detailed usage examples.
**Requires the [`offersRead`](authentication#permissions-offerlist) permission.**
'
operationId: offerList
tags:
- Offer
requestBody:
content:
application/json:
schema:
allOf:
- $ref: '#/paths/~1opening.list/post/requestBody/content/application~1json/schema'
- type: object
properties:
offerStatus:
type: array
minItems: 1
description: When supplied, only offers with provided offer-status(es) will be returned. Array must contain at least one value.
items:
allOf:
- type: string
enum:
- WaitingOnApprovalStart
- WaitingOnOfferApproval
- WaitingOnApprovalDefinition
- WaitingOnCandidateResponse
- CandidateRejected
- CandidateAccepted
- OfferCancelled
- title: OfferStatus
acceptanceStatus:
type: array
minItems: 1
description: When supplied, only offers with provided acceptance-status(es) will be returned. Array must contain at least one value.
items:
allOf:
- type: string
enum:
- Accepted
- Declined
- Pending
- Created
- Cancelled
- WaitingOnResponse
- title: AcceptanceStatus
applicationId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: If provided, only returns the offers for the application with the supplied id
approvalStatus:
type: array
minItems: 1
description: When supplied, only offers whose latest version has one of the provided approval status(es) will be returned. Array must contain at least one value.
items:
type: string
enum:
- Approved
- WaitingOnApprovals
- Declined
responses:
'200':
description: Responses for the offer.list endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.list/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: array
items:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
decidedAt:
type: string
applicationId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the application associated with the offer
acceptanceStatus:
allOf:
- $ref: '#/paths/~1offer.list/post/requestBody/content/application~1json/schema/allOf/1/properties/acceptanceStatus/items/allOf/0'
- title: AcceptanceStatus
offerStatus:
allOf:
- title: OfferStatus
- $ref: '#/paths/~1offer.list/post/requestBody/content/application~1json/schema/allOf/1/properties/offerStatus/items/allOf/0'
latestVersion:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer/allOf/1/properties/versions/items'
required:
- id
- applicationId
- acceptanceStatus
required:
- results
- title: Error response
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offer.start:
post:
summary: offer.start
operationId: offerStart
description: "The offer.start endpoint creates and returns an offer version instance that can be filled out and submitted\nusing the `offer.create` endpoint. \n\n**Requires the [`offersWrite`](authentication#permissions-offerstart) permission.**\n\nIn order to create a new offer version for a candidate with an in-progress \noffer process, you can call the `offer.start` endpoint and then call the `offer.create` endpoint to fill out the\nnewly created offer version form. \n"
tags:
- Offer
requestBody:
content:
application/json:
schema:
type: object
properties:
offerProcessId:
allOf:
- description: The ID of the offer process to start. This value is the id included in the response of the `offerProcess.start` API.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- offerProcessId
responses:
'200':
description: Responses for the offer.start endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
formDefinition:
type: object
properties:
sections:
type: array
items:
type: object
properties:
title:
type: string
descriptionHtml:
type: string
descriptionPlain:
type: string
fields:
type: array
items:
type: object
properties:
isRequired:
type: boolean
example: true
default: true
descriptionHtml:
type: string
descriptionPlain:
type: string
field:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
type:
type: string
example: String
description: The type of the form definition field.
path:
type: string
example: _systemfield_name
humanReadablePath:
type: string
example: Name
title:
type: string
example: Name
isNullable:
type: boolean
example: false
default: true
selectableValues:
type: array
items:
type: object
properties:
label:
type: string
value:
type: string
required:
- label
- value
required:
- id
- type
- path
- humanReadablePath
- title
- isNullable
required:
- isRequired
- field
required:
- fields
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offer.startApprovalProcess:
post:
summary: offer.startApprovalProcess
operationId: offerStartApprovalProcess
description: 'Starts the approval process for an offer in a "WaitingOnApprovalStart" state.
Once started, the approval is sent to the configured approvers.
The offer version ID can be obtained from the offer (e.g. `offer.info` or `offer.list` response''s `latestVersion.id`).
**Requires the [`offersWrite`](authentication#permissions-offerstartapprovalprocess) permission.**
'
tags:
- Offer
requestBody:
content:
application/json:
schema:
type: object
additionalProperties: false
properties:
offerVersionId:
allOf:
- description: The id of the offer version whose approval process should be started.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
note:
type: string
description: Optional note to attach to the approval request.
excludeFormDefinition:
$ref: '#/paths/~1offer.info/post/requestBody/content/application~1json/schema/properties/excludeFormDefinition'
required:
- offerVersionId
responses:
'200':
description: Responses for the offer.startApprovalProcess endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offer.update:
post:
summary: offer.update
operationId: offerUpdate
description: 'Updates an existing Offer
**Requires the [`offersWrite`](authentication#permissions-offerupdate) permission.**
Offer forms support a variety of field types. The values accepted for each field depend on the type of field that''s being filled out:
- `Boolean` - A boolean value.
- `Currency` - An object in the format `{ currencyCode: "USD", value: 100000 }` where currencyCode is a valid ISO 4217 currency code and value is an integer.
- `Date` - A valid ISO Date string.
- `Number` - An integer.
- `String` - A string.
- `ValueSelect` - A string that matches the value of one of the ValueSelect field''s selectable options.
- `MultiValueSelect` - An array of strings that exist in the MultiValueSelect field''s selectable options.
Calling this endpoint will create a new version of the offer and retrigger any necessary approval steps.
'
tags:
- Offer
requestBody:
content:
application/json:
schema:
type: object
properties:
offerId:
allOf:
- description: 'The id of the offer you''re updating.
'
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
offerForm:
$ref: '#/paths/~1offer.create/post/requestBody/content/application~1json/schema/properties/offerForm'
description: The form submission for the offer. Can be retrieved from `offer.info`.
excludeFormDefinition:
$ref: '#/paths/~1offer.info/post/requestBody/content/application~1json/schema/properties/excludeFormDefinition'
required:
- offerId
- offerForm
responses:
'200':
description: Responses for the offer.update endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/offerProcess.start:
post:
summary: offerProcess.start
operationId: offerProcess.start
description: 'Starts an offer process for a candidate.
**Requires the [`offersWrite`](authentication#permissions-offerprocessstart) permission.**
'
tags:
- Offer Process
requestBody:
content:
application/json:
schema:
type: object
properties:
applicationId:
allOf:
- description: The id of the application to start an offer process for
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- applicationId
responses:
'200':
description: Responses for the offerProcess.start endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: object
properties:
id:
allOf:
- description: The id of the started offer process
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
applicationId:
allOf:
- description: The id of the application the offer process was started for
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
status:
description: The status of the offer process
type: string
enum:
- WaitingOnOfferCreation
- WaitingOnApprovalStart
- WaitingOnOfferApproval
- WaitingOnCandidateResponse
- CandidateAccepted
- CandidateRejected
- OfferCancelled
required:
- id
- applicationId
- status
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/report.generate:
post:
summary: report.generate
operationId: reportGenerate
description: "> \u26A0\uFE0F Beta\n>\n> This endpoint is currently in beta and may change without notice.\n\nGenerates a new report or polls the status of an existing report generation.\n\n**Two-step process:**\n1. Call with only `reportId` to start generation \u2192 returns `requestId`\n2. Poll with both `reportId` and `requestId` every second until `status` is `complete` or `failed`\n\n**Example:**\n```\n// Step 1: Start generation\nPOST /report.generate\n{ \"reportId\": \"abc-123-def-456\" }\n\u2192 { \"requestId\": \"rep_result:12345abc\", \"status\": \"in_progress\", \"reportData\": null }\n\n// Step 2: Poll for results\nPOST /report.generate\n{ \"reportId\": \"abc-123-def-456\", \"requestId\": \"rep_result:12345abc\" }\n\u2192 { \"requestId\": \"rep_result:12345abc\", \"status\": \"complete\", \"reportData\": {...} }\n```\n\n**Rate Limiting (Per Organization):**\n- **Start generation requests** (without `requestId`): 15 requests per minute per organization\n- **Concurrent limit**:\
\ Maximum 3 report operations at once per organization (shared with [`report.synchronous`](https://developers.ashbyhq.com/reference/reportsynchronous))\n- **Polling requests** (with `requestId`): Bypass all limits\n\n**Usage Notes:**\n- If you receive a 429 error, your organization has hit its limit - wait and retry or use [`report.synchronous`](https://developers.ashbyhq.com/reference/reportsynchronous)\n- For synchronous retrieval of existing data, use [`report.synchronous`](https://developers.ashbyhq.com/reference/reportsynchronous)\n- Use this async endpoint for reports that may exceed 30 seconds\n\n**Requires the [`reportsRead`](authentication#permissions-reportgenerate) permission.**\n"
tags:
- Report
requestBody:
required: true
content:
application/json:
schema:
allOf:
- $ref: '#/paths/~1report.synchronous/post/requestBody/content/application~1json/schema'
- type: object
properties:
requestId:
type: string
description: Request ID for polling existing report generation status (optional - only used when polling)
examples:
start_generation:
summary: Standard report request
value:
reportId: f9e52a51-a075-4116-a7b8-484deba69004
start_generation_no_headers:
$ref: '#/paths/~1report.synchronous/post/requestBody/content/application~1json/examples/no_headers_request'
poll_generation:
summary: Poll generation status
value:
reportId: f9e52a51-a075-4116-a7b8-484deba69004
requestId: rep_result:12345abc
responses:
'200':
description: Responses for the report.generate endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: object
properties:
requestId:
type: string
description: Unique identifier for this report generation request
status:
type: string
enum:
- complete
- failed
- in_progress
description: Current status of the report generation
reportData:
anyOf:
- type: object
properties:
data:
type: array
items:
type: array
items:
oneOf:
- type: string
- type: number
description: Report data rows as arrays of values. When includeHeadersInData is true (default), the first row contains column headers.
columnNames:
type: array
items:
type: string
description: Column names/headers for the report data.
metadata:
type: object
properties:
updatedAt:
type: string
format: date-time
description: When the report data was last updated
title:
type: string
description: Report title
reportGeneratedAt:
type: string
format: date-time
description: ISO 8601 timestamp indicating when the report data was generated. Only present when status is complete.
cacheExpiresAt:
type: string
format: date-time
description: 'ISO 8601 timestamp indicating when the cached report data will expire (estimated).
Calculated as reportGeneratedAt + cache duration (1 hour for successful reports, 15 minutes for failed reports).
This is an estimate with typical accuracy within 1 second of actual Redis TTL expiration.
Only present when status is complete or failed.
'
required:
- updatedAt
- title
required:
- data
- columnNames
- metadata
- type: 'null'
description: Report data (only present when status is complete)
failureReason:
type:
- string
- 'null'
description: Error information if report generation failed
required:
- requestId
- status
- reportData
required:
- results
- title: Error response
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
examples:
initial_request:
summary: Report generation in progress
value:
success: true
results:
requestId: rep_result:12345abc
status: in_progress
reportData: null
failureReason: null
complete:
summary: Completed report with cache metadata
description: "When includeHeadersInData=false, the data array would be:\n```\nreportData.data: [\n [ \"Q1 2024\", \"Engineering\", 45 ],\n [ \"Q1 2024\", \"Sales\", 32 ],\n [ \"Q2 2024\", \"Engineering\", 52 ]\n]\n```\n"
value:
success: true
results:
requestId: rep_result:12345abc
status: complete
reportData:
data:
- - Timeframe
- Department
- Hired
- - Q1 2024
- Engineering
- 45
- - Q1 2024
- Sales
- 32
- - Q2 2024
- Engineering
- 52
columnNames:
- Timeframe
- Department
- Hired
metadata:
updatedAt: '2024-01-15T10:30:00Z'
title: Quarterly Hiring Report
reportGeneratedAt: '2024-01-15T14:25:33.123Z'
cacheExpiresAt: '2024-01-15T15:25:33.123Z'
failed:
summary: Failed report generation (timeout or error)
value:
success: true
results:
requestId: rep_result:12345abc
status: failed
reportData: null
failureReason: QueryTimeout
'429':
description: Rate limit or concurrent limit exceeded
content:
application/json:
schema:
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- title: Error response
- type: object
required:
- errors
- errorInfo
properties:
errors:
description: A list of error codes
type: array
items:
type: string
deprecated: true
errorInfo:
description: A single error code and additional error information
type: object
required:
- code
properties:
code:
type: string
message:
type: string
requestId:
type: string
description: Opaque identifier for the API request, which can be provided to Ashby support to help them diagnose the issue
meta:
type: object
example:
success: false
errors:
- invalid_input
errorInfo:
code: invalid_input
message: Request payload is malformed
requestId: 01JSJ8FDK5ZN4XQBZP7DBKK7ZC
examples:
rate_limit_exceeded:
summary: Rate limit exceeded (15 requests per minute per organization)
value:
success: false
errors:
- Rate limit exceeded
errorInfo:
code: rate_limit_exceeded
message: Your organization has exceeded the rate limit of 15 report requests per minute. Try again in 60 seconds.
requestId: rep_result:12345abc
concurrent_limit_exceeded:
summary: Concurrent operation limit exceeded (3 maximum per organization)
value:
success: false
errors:
- Concurrent limit exceeded
errorInfo:
code: concurrent_limit_exceeded
message: Your organization has reached the maximum of 3 concurrent report operations. Please wait for existing operations to complete or try again in 30 seconds.
requestId: rep_result:12345abc
/report.synchronous:
post:
summary: report.synchronous
operationId: reportSynchronous
description: "> \u26A0\uFE0F Beta\n>\n> This endpoint is currently in beta and may change without notice.\n\nRetrieves report data synchronously.\n\n**Timeout:** 30 seconds. If a report is timing out, use the asynchronous [`report.generate`](https://developers.ashbyhq.com/reference/reportgenerate) instead.\n\n**Rate Limiting (Per Organization):**\n- **Request limit**: 15 requests per minute per organization\n- **Concurrent limit**: Maximum 3 report operations at once per organization (shared with [`report.generate`](https://developers.ashbyhq.com/reference/reportgenerate))\n- Rate limits are shared with [`report.generate`](https://developers.ashbyhq.com/reference/reportgenerate) for starting new generations\n\n**Usage Notes:**\n- If you receive a 429 error, your organization has hit its limit - wait briefly and retry\n- For long-running reports, use [`report.generate`](https://developers.ashbyhq.com/reference/reportgenerate) for async processing\n- Concurrent limit is released when\
\ the HTTP request completes\n\n**Requires the [`reportsRead`](authentication#permissions-reportsynchronous) permission.**\n"
tags:
- Report
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reportId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The ID of the report
includeHeadersInData:
type: boolean
default: true
description: When true (default), column headers are included as the first row in the data array. When false, headers are only in the columnNames property.
required:
- reportId
examples:
standard_request:
$ref: '#/paths/~1report.generate/post/requestBody/content/application~1json/examples/start_generation'
no_headers_request:
summary: Request without headers in data
value:
reportId: f9e52a51-a075-4116-a7b8-484deba69004
includeHeadersInData: false
responses:
'200':
description: Responses for the report.synchronous endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
$ref: '#/paths/~1report.generate/post/responses/200/content/application~1json/schema/oneOf/0'
- title: Error response
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
examples:
success_response:
$ref: '#/paths/~1report.generate/post/responses/200/content/application~1json/examples/complete'
timeout_response:
$ref: '#/paths/~1report.generate/post/responses/200/content/application~1json/examples/initial_request'
'429':
description: Rate limit or concurrent limit exceeded
content:
application/json:
schema:
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
examples:
rate_limit_exceeded:
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/examples/rate_limit_exceeded'
concurrent_limit_exceeded:
$ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/examples/concurrent_limit_exceeded'
/webhook.create:
post:
summary: webhook.create
description: 'Creates a webhook setting.
**Requires the [`apiKeysWrite`](authentication#permissions-webhookcreate) scope.**
'
operationId: webhookcreate
tags:
- Webhook
requestBody:
content:
application/json:
schema:
properties:
webhookType:
type: string
enum:
- applicationSubmit
- applicationUpdate
- candidateHire
- candidateStageChange
- candidateDelete
- candidateMerge
- interviewPlanTransition
- interviewScheduleCreate
- interviewScheduleUpdate
- jobPostingUpdate
- jobPostingPublish
- jobPostingUnpublish
- offerCreate
- offerUpdate
- offerDelete
- pushToHRIS
- surveySubmit
requestUrl:
type: string
description: The URL the webhook will send requests to.
secretToken:
type: string
description: 'The secret token used to sign the webhook request. See our documentation [here](https://developers.ashbyhq.com/docs/authenticating-webhooks) for more information.
'
required:
- webhookType
- requestUrl
- secretToken
responses:
'200':
description: Responses from the webhook.create endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
enabled:
type: boolean
description: Whether or not the webhook setting is enabled.
requestUrl:
type: string
description: The URL the webhook will send requests to.
example: https://example.com/webhook
secretToken:
type: string
description: 'The secret token used to sign the webhook request. See our documentation [here](https://developers.ashbyhq.com/docs/authenticating-webhooks) for more information.
'
example: 0c2f9463f87641919f8106a2c49d7a57
webhookType:
type: string
description: The type of webhook.
$ref: '#/paths/~1webhook.create/post/requestBody/content/application~1json/schema/properties/webhookType'
required:
- id
- enabled
- requestUrl
- secretToken
- webhookType
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/webhook.info:
post:
summary: webhook.info
description: 'Retrieves information about a specific webhook setting by its ID
**Requires the [`apiKeysRead`](authentication#permissions-webhookinfo) permission.**
'
operationId: webhookInfo
tags:
- Webhook
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
webhookId:
allOf:
- description: The id of the webhook setting to retrieve.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- webhookId
responses:
'200':
description: Responses from the webhook.info endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
enabled:
type: boolean
description: Whether or not the webhook setting is enabled.
requestUrl:
type: string
description: The URL the webhook will send requests to.
example: https://example.com/webhook
webhookType:
type: string
description: The type of webhook.
$ref: '#/paths/~1webhook.create/post/requestBody/content/application~1json/schema/properties/webhookType'
required:
- id
- enabled
- requestUrl
- webhookType
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/webhook.update:
post:
summary: webhook.update
description: 'Updates a webhook setting. One of `enabled`, `requestUrl`, or `secretToken` must be provided.
**Requires the [`apiKeysWrite`](authentication#permissions-webhookcreate) permission.**
'
operationId: webhookupdate
tags:
- Webhook
requestBody:
content:
application/json:
schema:
properties:
webhookId:
allOf:
- description: The id of the webhook setting to update.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
enabled:
type: boolean
description: Whether or not the webhook is enabled.
requestUrl:
type: string
description: The URL the webhook will send requests to.
secretToken:
type: string
description: 'The secret token used to sign the webhook request. See our documentation [here](https://developers.ashbyhq.com/docs/authenticating-webhooks) for more information.
'
required:
- webhookId
responses:
'200':
description: Responses from the webhook.update endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
$ref: '#/paths/~1webhook.create/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
/webhook.delete:
post:
summary: webhook.delete
description: 'Deletes a webhook setting.
**Requires the [`apiKeysWrite`](authentication#permissions-webhookcreate) permission.**
'
operationId: webhookdelete
tags:
- Webhook
requestBody:
content:
application/json:
schema:
properties:
webhookId:
allOf:
- description: The id of the webhook setting to delete.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- webhookId
responses:
'200':
description: Responses from the webhook.delete endpoint
content:
application/json:
schema:
oneOf:
- title: Success response
allOf:
- $ref: '#/paths/~1job.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/0'
- type: object
properties:
results:
type: object
properties:
webhookId:
allOf:
- description: The id of the webhook setting that was deleted.
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- results
- $ref: '#/paths/~1report.generate/post/responses/429/content/application~1json/schema'
webhooks:
applicationSubmit:
post:
summary: applicationSubmit
description: Triggered when a candidate submits an application or when a candidate is manually added to Ashby. This webhook is not triggered for bulk imports or integration syncs.
operationId: applicationSubmitWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- applicationSubmit
data:
type: object
properties:
application:
$ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
applicationUpdate:
post:
summary: applicationUpdate
description: 'Triggered when there''s an update to an application. This includes:
- Changes to application fields (source, custom fields, etc.)
- Job transfers (when an application is moved to a different job)
- Also triggered by [candidateHire](https://developers.ashbyhq.com/reference/candidatehirewebhook) and [candidateStageChange](https://developers.ashbyhq.com/reference/candidatestagechangewebhook)
'
operationId: applicationUpdateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- applicationUpdate
data:
type: object
properties:
application:
$ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
candidateHire:
post:
summary: candidateHire
description: 'Triggered when a candidate is hired (including candidates that are hired on confidential jobs).
Includes the application and most recent accepted offer (if one exists).
Also triggers [applicationUpdate](https://developers.ashbyhq.com/reference/applicationupdatewebhook) and [candidateStageChange](https://developers.ashbyhq.com/reference/candidatestagechangewebhook)
'
operationId: candidateHireWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- candidateHire
data:
type: object
properties:
application:
$ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application'
offer:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
candidateStageChange:
post:
summary: candidateStageChange
description: Triggered when a candidate changes stages in an application. Also triggered by [candidateHire](https://developers.ashbyhq.com/reference/candidatehirewebhook)
operationId: candidateStageChangeWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- candidateStageChange
data:
type: object
properties:
application:
$ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
candidateDelete:
post:
summary: candidateDelete
description: "Triggered when a candidate is deleted. \nIncludes the deleted candidate id.\n"
operationId: candidateDeleteWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- candidateDelete
data:
type: object
properties:
candidate:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
description: The unique id of the deleted candidate
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
candidateMerge:
post:
summary: candidateMerge
description: "Triggered when a candidate is merged. \nIncludes the deleted candidate's id and merged candidate data.\n"
operationId: candidateMergeWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- candidateMerge
data:
type: object
properties:
deletedCandidate:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
description: The unique id of the deleted candidate
mergedCandidate:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
description: The unique id of the final merged candidate
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
interviewPlanTransition:
post:
summary: interviewPlanTransition
description: Triggered when a job's interview plan is switched to a different plan. Sends interview plan data and ids for the interview stage mappings. Also triggers [jobUpdate](https://developers.ashbyhq.com/reference/jobupdatewebhook)
operationId: interviewPlanTransitionWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- interviewPlanTransition
data:
type: object
properties:
jobId:
description: The id of the job for which the interview plan has been switched
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
fromInterviewPlan:
description: The interview plan the job was previously referencing
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
title:
type: string
example: Custom Interview Plan
required:
- id
- title
toInterviewPlan:
description: The interview plan the job is now referencing
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
title:
type: string
example: Engineering Interview Plan
required:
- id
- title
interviewStageMappings:
description: The mapping of a stage from the previous interview plan to a stage on the new interview plan
type: array
items:
type: object
properties:
fromInterviewStageId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
toInterviewStageId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- fromInterviewStageId
- toInterviewStageId
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
interviewScheduleCreate:
post:
summary: interviewScheduleCreate
description: The webhook is called when an interview schedule is created. Also triggers [interviewScheduleUpdate](https://developers.ashbyhq.com/reference/interviewscheduleupdatewebhook)
operationId: interviewScheduleCreateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- interviewScheduleCreate
data:
type: object
properties:
interviewSchedule:
type: object
required:
- id
- status
- applicationId
- interviewStageId
properties:
id:
type: string
description: The id of the interview schedule
status:
type: string
enum:
- NeedsScheduling
- WaitingOnCandidateBooking
- WaitingOnCandidateAvailability
- CandidateAvailabilitySubmitted
- Scheduled
- WaitingOnFeedback
- Complete
- Cancelled
- OnHold
- Unknown
description: The status of the interview schedule
applicationId:
type: string
description: The id of the application associated with the interview schedule
interviewStageId:
type: string
description: The id of the interview stage associated with the interview schedule
scheduledBy:
description: The user who scheduled this interview schedule. Null if the schedule has not been scheduled.
$ref: '#/paths/~1user.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
createdAt:
type: string
format: date-time
description: The time the interview schedule was created
updatedAt:
type: string
format: date-time
description: The time the interview schedule was last updated
interviewEvents:
type: array
description: All scheduled interview events associated with the interview schedule
items:
$ref: '#/paths/~1interviewEvent.list/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results/items'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
interviewScheduleUpdate:
post:
summary: interviewScheduleUpdate
description: The webhook is called when an interview schedule is updated, including when interviews that are part of the schedule are scheduled, updated, or cancelled. Also triggered by [interviewScheduleCreate](https://developers.ashbyhq.com/reference/interviewschedulecreatewebhook)
operationId: interviewScheduleUpdateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- interviewScheduleUpdate
data:
type: object
properties:
interviewSchedule:
allOf:
- $ref: '#/webhooks/interviewScheduleCreate/post/requestBody/content/application~1json/schema/properties/data/properties/interviewSchedule'
- type: object
properties:
candidateId:
type: string
description: The ID of the candidate associated with this interview schedule
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
jobCreate:
post:
summary: jobCreate
description: Triggered when a job is created
operationId: jobCreateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- jobCreate
data:
type: object
properties:
job:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
title:
type: string
confidential:
type: boolean
status:
$ref: '#/paths/~1job.setStatus/post/requestBody/content/application~1json/schema/properties/status/allOf/1'
employmentType:
type: string
enum:
- FullTime
- PartTime
- Intern
- Contract
- Temporary
locationId:
allOf:
- description: The id of the location of the job
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
departmentId:
allOf:
- description: The id of the department or team associated with the job
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
defaultInterviewPlanId:
allOf:
- description: "The id of the default interview plan for this job posting. \nA job cannot be opened without a default interview plan.\n"
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
interviewPlanIds:
type: array
items:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The ids of all interview plans associated with a job
customFields:
type: array
description: An array of custom fields associated with the job
items:
$ref: '#/paths/~1customField.setValue/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
jobPostingIds:
type: array
items:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The ids of all job postings associated with the job
customRequisitionId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The custom requisition id for a job
brandId:
allOf:
- description: The id of the brand to use for this job
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
hiringTeam:
type: array
items:
$ref: '#/paths/~1hiringTeam.addMember/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
author:
$ref: '#/paths/~1user.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
createdAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
updatedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
openedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
closedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
required:
- id
- title
- confidential
- status
- employmentType
- updatedAt
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
jobUpdate:
post:
summary: jobUpdate
description: Triggered when a job is updated. Also triggered by [interviewPlanTransition](https://developers.ashbyhq.com/reference/interviewplantransitionwebhook)
operationId: jobUpdateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- jobUpdate
data:
type: object
properties:
job:
$ref: '#/webhooks/jobCreate/post/requestBody/content/application~1json/schema/properties/data/properties/job'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
jobPostingUpdate:
post:
summary: jobPostingUpdate
description: Triggered when a job posting is updated. Also triggered by [jobPostingPublish](https://developers.ashbyhq.com/reference/jobpostingpublishwebhook) and [jobPostingUnpublish](https://developers.ashbyhq.com/reference/jobpostingunpublishwebhook)
operationId: jobPostingUpdateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- jobPostingUpdate
data:
type: object
properties:
jobPosting:
type: object
properties:
id:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The job posting's id
title:
type: string
example: Posting Title
description: The job posting's title
jobId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the job associated with the job posting
departmentName:
type: string
example: Engineering department
description: The name of the department associated with the job posting
teamName:
type: string
example: Data engineering team
description: 'The name of the team associated with the job posting. `teamName` and `departmentName` will
be the same if the team does not have a parent team specified.
'
locationName:
type: string
example: Springfield
description: The name of the primary location associated with the job posting
locationIds:
type: object
description: An object containing the ids of all locations associated with the job posting
properties:
primaryLocationId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
secondaryLocationIds:
type: array
items:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- primaryLocationId
- secondaryLocationIds
workplaceType:
$ref: '#/paths/~1location.create/post/requestBody/content/application~1json/schema/properties/workplaceType/allOf/1'
employmentType:
$ref: '#/webhooks/jobCreate/post/requestBody/content/application~1json/schema/properties/data/properties/job/properties/employmentType'
isListed:
type: boolean
example: true
description: Whether or not the job posting is listed
publishedDate:
type: string
example: '2021-11-19'
description: The date the job posting was published
applicationDeadline:
type: string
example: '2024-08-12T20:00:00.000Z'
format: date-time
description: The date and time when applications will no longer be accepted
externalLink:
type: string
example: https://jobs.ashbyhq.com/6eec82ac-9713-512d-ac2e-405618935375/d5a6bc97-4259-4bc5-b3fe-6d3edfd538e3
description: The external link to the job posting. Will be null if the job posting is on an internal job board.
applyLink:
type: string
example: https://jobs.ashbyhq.com/6eec82ac-9713-512d-ac2e-405618935375/d5a6bc97-4259-4bc5-b3fe-6d3edfd538e3
description: The link to apply to the job posting. Will be to the public job board if the job posting is on an external job board, or to the internal job board if the job posting is on an internal job board.
compensationTierSummary:
type: string
example: "$120K \u2013 $270K \u2022 0% \u2013 2.25% \u2022 Offers Bonus \u2022 Multiple Ranges"
description: 'A summary of *all* the job posting''s valid compensation tiers in the same format shown on
Ashby-hosted Job Boards
'
shouldDisplayCompensationOnJobBoard:
type: boolean
example: true
description: 'Whether the job posting''s settings specify that compensation should be shown to applicants
when the posting is listed among other job postings
'
updatedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
required:
- id
- title
- jobId
- departmentName
- teamName
- locationName
- locationIds
- employmentType
- isListed
- publishedDate
- applyLink
- shouldDisplayCompensationOnJobBoard
- updatedAt
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
jobPostingPublish:
post:
summary: jobPostingPublish
description: Triggered when a job posting is published. Also triggers [jobPostingUpdate](https://developers.ashbyhq.com/reference/jobpostingupdatewebhook)
operationId: jobPostingPublishWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- jobPostingPublish
data:
type: object
properties:
jobPosting:
$ref: '#/webhooks/jobPostingUpdate/post/requestBody/content/application~1json/schema/properties/data/properties/jobPosting'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
jobPostingUnpublish:
post:
summary: jobPostingUnpublish
description: Triggered when a job posting is unpublished. Also triggers [jobPostingUpdate](https://developers.ashbyhq.com/reference/jobpostingupdatewebhook)
operationId: jobPostingUnpublishWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- jobPostingUnpublish
data:
type: object
properties:
jobPosting:
$ref: '#/webhooks/jobPostingUpdate/post/requestBody/content/application~1json/schema/properties/data/properties/jobPosting'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
offerCreate:
post:
summary: offerCreate
description: Triggered when a new offer process is created for a candidate
operationId: offerCreateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- offerCreate
data:
type: object
properties:
offer:
allOf:
- $ref: '#/paths/~1offer.list/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results/items'
- type: object
properties:
versions:
type: array
items:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
startDate:
allOf:
- $ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
- description: The start date of the offer
salary:
type: object
properties:
currencyCode:
type: string
description: A valid ISO 4217 currency code
value:
type: number
description: An integer. The salary specified by the offer.
createdAt:
allOf:
- $ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
- description: The time the offer was created
openingId:
type: string
description: The id of the opening associated with the offer.
customFields:
type: array
items:
$ref: '#/paths/~1customField.setValue/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
fileHandles:
type: array
description: An array of file handles associated with the offer. If an offer letter has been generated, this array includes the file handles for the unsigned .pdf and .docx versions of the letter, as well as for the signed .pdf if it exists.
items:
$ref: '#/paths/~1candidate.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results/properties/fileHandles/items'
author:
$ref: '#/paths/~1user.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
approvalStatus:
allOf:
- type:
- string
- 'null'
enum:
- Approved
- WaitingOnApprovals
- Declined
- null
- description: The approval status of this offer version. Approved indicates this version has been approved. WaitingOnApprovals indicates approval is pending. Declined indicates this version was declined. This field is null when no approval process has been configured for the offer version.
required:
- id
- createdAt
formDefinition:
$ref: '#/paths/~1offer.start/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results/properties/formDefinition'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
offerDelete:
post:
summary: offerDelete
description: Triggered when an offer process is deleted
operationId: offerDeleteWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- offerDelete
data:
type: object
properties:
offer:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
applicationId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the application the offer was associated with.
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
offerUpdate:
post:
summary: offerUpdate
description: Triggered when an offer is updated
operationId: offerUpdateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- offerUpdate
data:
type: object
properties:
offer:
$ref: '#/webhooks/offerCreate/post/requestBody/content/application~1json/schema/properties/data/properties/offer'
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
openingCreate:
post:
summary: openingCreate
description: Triggered when a opening is created
operationId: openingCreateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- openingCreate
data:
type: object
properties:
opening:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
openedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
closedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
isArchived:
type: boolean
example: false
archivedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
closeReasonId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
openingState:
type: string
enum:
- Approved
- Closed
- Draft
- Filled
- Open
latestVersion:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
identifier:
type: string
description:
type: string
authorId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
createdAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
teamId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
jobIds:
type: array
items:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
targetHireDate:
type: string
targetStartDate:
type: string
isBackfill:
type: boolean
employmentType:
$ref: '#/webhooks/jobCreate/post/requestBody/content/application~1json/schema/properties/data/properties/job/properties/employmentType'
locationIds:
type: array
items:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
hiringTeam:
type: array
items:
$ref: '#/paths/~1hiringTeam.addMember/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
customFields:
type: array
description: An array of custom fields associated with the opening
items:
$ref: '#/paths/~1customField.setValue/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
required:
- id
- identifier
- description
- authorId
- createdAt
- jobIds
- isBackfill
- employmentType
- locationIds
- hiringTeam
- customFields
required:
- id
- isArchived
- openingState
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
pushToHRIS:
post:
summary: pushToHRIS
description: Triggered when a candidate is pushed to an HRIS system
operationId: pushToHRISWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- pushToHRIS
data:
type: object
properties:
application:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
createdAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
updatedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
status:
type: string
enum:
- Hired
- Archived
- Active
- Lead
description: The status of the application
customFields:
type: array
items:
$ref: '#/paths/~1customField.setValue/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
candidate:
type: object
description: The candidate associated with the application
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
name:
type: string
example: James
primaryEmailAddress:
type: object
properties:
value:
type: string
description: The email address or phone number of the candidate
type:
enum:
- Personal
- Work
- Other
description: The type of the contact info
isPrimary:
type: boolean
description: Whether the contact info is the primary email or phone number
required:
- value
- type
- isPrimary
example:
value: test@ashbyhq.com
type: Work
isPrimary: true
primaryPhoneNumber:
allOf:
- $ref: '#/webhooks/pushToHRIS/post/requestBody/content/application~1json/schema/properties/data/properties/application/properties/candidate/properties/primaryEmailAddress'
- example:
value: 222-222-3344
type: Work
isPrimary: true
required:
- id
- name
currentInterviewStage:
$ref: '#/paths/~1interviewStage.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
source:
$ref: '#/paths/~1source.list/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results/items'
archiveReason:
allOf:
- $ref: '#/paths/~1archiveReason.list/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results/items'
- type: object
properties:
customFields:
type: array
description: Archive detail custom field values
items:
$ref: '#/paths/~1customField.setValue/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
required:
- customFields
archivedAt:
allOf:
- $ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
- description: The timestamp an application was archived
job:
type: object
properties:
id:
type: string
example: 4071538b-3cac-4fbf-ac76-f78ed250ffdd
title:
type: string
example: First Designer
locationId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
departmentId:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
required:
- id
- title
creditedToUser:
$ref: '#/paths/~1user.info/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
hiringTeam:
type: array
items:
$ref: '#/paths/~1hiringTeam.addMember/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results'
appliedViaJobPostingId:
allOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- description: The id of the first job posting the candidate applied through. If the candidate submitted applications via multiple job postings for the same job, this will be the earliest one.
submitterClientIp:
type: string
example: 79.255.55.222
description: The IP address (can be v4 or v6) of the client that submitted the application, if it was submitted through the external job board.
submitterUserAgent:
type: string
example: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36
description: The user agent of the client that submitted the application, if it was submitted through the external job board.
required:
- id
- createdAt
- updatedAt
- candidate
- status
- currentInterviewStage
- job
- hiringTeam
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
ping:
post:
summary: ping
operationId: pingWebhook
description: Called to check that the webhook URL is live
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
properties:
action:
type: string
enum:
- ping
data:
type: object
properties:
webhookActionType:
description: "The type of action that triggered the webhook\u2014in this case, a ping"
type: string
enum:
- ping
required:
- webhookActionType
required:
- action
- data
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
signatureRequestUpdate:
post:
summary: signatureRequestUpdate
description: "Triggered on updates to requests for e-signatures: when requests are sent, cancelled, completed, or deleted.\n\nDepending on the type of request, additional context will be included in the webhook payload:\n - **Offers** - `\"relatedEntityType\"` is `\"offer\"` and `\"offerId\"` is included.\n - **Applications** - `\"relatedEntityType\"` is `\"application\"` and `\"applicationId\"` is included.\n"
operationId: signatureRequestUpdateWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- signatureRequestUpdate
data:
type: object
oneOf:
- title: Application Payload
properties:
relatedEntityType:
type: string
enum:
- application
applicationId:
type: string
format: uuid
eventType:
type: string
enum:
- sent
- cancelled
- completed
- deleted
- title: Offer Payload
properties:
relatedEntityType:
type: string
enum:
- offer
offerId:
type: string
format: uuid
offerVersionId:
type: string
format: uuid
eventType:
type: string
enum:
- sent
- cancelled
- completed
- deleted
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []
surveySubmit:
post:
summary: surveySubmit
description: "The webhook is triggered when a candidate submits a non-anonymous survey. It will not fire for anonymous survey submissions.\n\nDepending on the type of survey that was submitted, survey responses may be included in the webhook payload:\n - **Questionnaires**, **Candidate Data Consent** - Survey responses will be included in the payload.\n - **Candidate Experience** - If the submission is not anonymous, survey responses will be included in the payload. If the submission is anonymous, the webhook will not trigger.\n - **Diversity Surveys**, **EEOC Surveys** - Survey responses will never be included in the payload.\n\nIf survey responses are included in the payload, the `submittedValues` field will contain the submitted answers in an object where each key is the path of the field and the value is the value submitted for that field.\n"
operationId: surveySubmitWebhook
tags:
- Webhook Payloads
requestBody:
content:
application/json:
schema:
type: object
required:
- action
- data
properties:
action:
type: string
enum:
- surveySubmit
data:
type: object
properties:
surveySubmission:
type: object
properties:
id:
$ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
surveyFormDefinitionId:
description: The id of the survey form definition that this submission is associated with. May be null if the survey form definition has been deleted.
oneOf:
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
- type: 'null'
submittedAt:
$ref: '#/paths/~1candidate.createNote/post/requestBody/content/application~1json/schema/properties/createdAt'
candidateId:
allOf:
- description: The id of the candidate who submitted the survey
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
applicationId:
allOf:
- description: The id of the application that the survey submission is associated with
- $ref: '#/paths/~1interviewerPool.addUser/post/requestBody/content/application~1json/schema/properties/userId'
surveyType:
type: string
enum:
- CandidateDataConsent
- CandidateExperience
- Diversity
- EEOC
- Questionnaire
formDefinition:
$ref: '#/paths/~1offer.start/post/responses/200/content/application~1json/schema/oneOf/0/allOf/1/properties/results/properties/formDefinition'
submittedValues:
type: object
example:
_systemfield_name: Gob Bluth
required:
- id
- submittedAt
- candidateId
- surveyType
responses:
'200':
description: Return a 200 status to indicate that the data was received successfully
security:
- WebhookSignature: []