# Table of Contents - [candidate.addProject](#candidate-addproject) - [Ashby](#ashby) - [Dedicated Partner Job Feeds](#dedicated-partner-job-feeds) - [Common Payload Data](#common-payload-data) - [Authenticating Webhooks](#authenticating-webhooks) - [Getting Started with Ashby](#getting-started-with-ashby) - [Setting up Webhooks](#setting-up-webhooks) - [Creating a Custom Careers Page](#creating-a-custom-careers-page) - [Ashby Job Postings API](#ashby-job-postings-api) - [Related Webhooks](#related-webhooks) - [Retries](#retries) --- # candidate.addProject ShellNodeRubyPHPPython : Click `Try It!` to start a request and see the response here! --- # Ashby ### Documentation * [Getting Started with Ashby](https://developers.ashbyhq.com/docs/getting-started) * [Creating a Custom Careers Page](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page) * [Dedicated Partner Job Feeds](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds) * [View More…](https://developers.ashbyhq.com/docs/getting-started) ### Webhooks * [Setting up Webhooks](https://developers.ashbyhq.com/docs/setting-up-webhooks) * [Common Payload Data](https://developers.ashbyhq.com/docs/common-payload-data) * [Authenticating Webhooks](https://developers.ashbyhq.com/docs/authenticating-webhooks) * [View More…](https://developers.ashbyhq.com/docs/setting-up-webhooks) --- # Dedicated Partner Job Feeds Ashby can provision a dedicated job posting feed for a partner interested in ingesting job postings. Once the integration is live, Ashby customers can opt-in to sharing their jobs with the partner's service by enabling the partner's integration in the Admin section of the Ashby app. After this is done, all of their published job postings will be published to the feed for the partner to ingest. The schema of the feed is fixed, but the format can be in JSON or XML formats. The data provided in JSON and XML feeds is identical between the feeds and is updated hourly. > 📘 > > Interested? > > > ----------------- > > If you are interested in obtaining a dedicated feed, contact [\[email protected\]](https://developers.ashbyhq.com/cdn-cgi/l/email-protection#771e190312100516031e1819043716041f150e1f065914181a) Job Posting Schema [](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds#job-posting-schema) ------------------------------------------------------------------------------------------------------------- Job postings are provided in a flat list | Parameter | Type | Description | Required? | | --- | --- | --- | --- | | `id` | String | A UUID of the job posting. | Yes | | `organizationId` | String | A UUID of the organization. | Yes | | `organizationName` | String | The name of the organization in Ashby. | Yes | | `title` | String | The title of the job posting. | Yes | | `departmentName` | String | The department of the job posting. | Yes | | `teamName` | String | The team of the job posting. | No | | `descriptionPlain` | String | The job posting description in plain text . | Yes | | `descriptionHtml` | String | HTML block of the job posting description. | Yes | | `employmentType` | String | The type of employment. Will be one of the following: `FullTime`, `PartTime`, `Intern`, `Contract`, or `Temporary`. | Yes | | `externalLink` | String | A link to the application form. | Yes | | `updatedAt` | String | The UTC date time in GMT of when this job post was last updated. | Yes | | `publishedAt` | String | The UTC date time in GMT of when this job post was published. | Yes | | `locations` | Array | An array of locations that this posting is assigned to (see below for location schema). | Yes | | `compensationTiers` | Array | An array of compensation tiers (see below for compensation schema). | No | Location Schema [](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds#location-schema) ------------------------------------------------------------------------------------------------------- Location follows Place as defined by [schema.org](https://schema.org/Place) . In particular, the `postalAddress` schema. | Parameter | Type | Description | Required? | | --- | --- | --- | --- | | `locationName` | String | The name of the location. | Yes | | `address` | Object | The address of the location (see below for address schema). | No | | `isRemote` | Boolean | Indicates if this job posting is eligible for remote work. | Yes | | `isPrimaryLocation` | Boolean | Indicates in this is the primary location if there are multiple locations for this posting. There can only be one primary location per posting. | Yes | ### Address Schema [](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds#address-schema) Address follows the `postalAddress` as defined at [schema.org](https://schema.org/PostalAddress) . | Parameter | Type | Description | Required? | | --- | --- | --- | --- | | `addressCountry` | String | The country of the location. This is NOT guaranteed to be a county code. | No | | `addressRegion` | String | The region (state, province, etc) of the location. | No | | `addressLocality` | String | The locality (city, town, village, etc.) of the location. | No | | `postalCode` | String | The postal code of the location. | No | | `postOfficeBoxNumber` | String | The PO box number of the location. | No | | `streetAddress` | String | The street address of the location. | No | Compensation Schema [](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds#compensation-schema) --------------------------------------------------------------------------------------------------------------- Ashby provides a rich set of compensation data comprising of `compensationTiers`. Each tier consists of a `title`, an array of `components` and an `additionalInformation` field. ### Compensation Tier Schema [](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds#compensation-tier-schema) | Parameter | Type | Description | Required? | | --- | --- | --- | --- | | `title` | String | The title of the tier. | Yes | | `components` | Array | The components that make up this compensation tier. They detail salary, commission, equity, and bonus structure. | Yes | | `additionalInformation` | String | Any additional information that may be necessary to understand the tier. | No | ### Compensation Component Schema [](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds#compensation-component-schema) Each tier will have between 1 and 4 components that detail salary, commission, equity, and bonus structure. | Parameter | Type | Description | Required? | | --- | --- | --- | --- | | `compensationType` | String | The type of compensation. Possible values are `Salary`, `EquityPercentage`, `EquityCashValue`, `Bonus`, and `Commission` | Yes | | `summary` | String | A generated summary of the component. Example: "Base Salary $70K – $100K" | No | | `Interval` | String | The period on which this compensation is given. Possible values are `NONE`, `1 TIME`, `1 HOUR`, `1 DAY`, `1 WEEK`, `2 WEEK`, `0.5 MONTH`, `1 MONTH`, `2 MONTH`, `3 MONTH`, `6 MONTH`, and `1 YEAR` | Yes | | `minValue` | Number | The minimum of this compensation range. | Yes | | `maxValue` | Number | The maximum of this compensation range. | Yes | | `currencyCode` | String | The currency code this compensation component is paid in. Applied to all types except `EquityPercentage`, | No | Meta Schema [](https://developers.ashbyhq.com/docs/dedicated-partner-job-feeds#meta-schema) ----------------------------------------------------------------------------------------------- Ashby also provides a meta object that contains additional information and context. At the moment, the only provided metadata is for organizations as outlined below. | Parameter | Type | Description | Required? | | --- | --- | --- | --- | | `id` | String | A UUID of the organization (matches `organizationId` in the job posting entry). | Yes | | `name` | String | The name of the organization in Ashby (matches `organizationName` in job posting entry) | Yes | | `link` | String | A link to the organization's website. | Yes | | `jobBoardLink` | String | A link to the Ashby job board of the organization. | Yes | Updated over 1 year ago * * * --- # Common Payload Data All webhook payloads contain the following fields: `webhookActionId`: a unique identifier for this event. It will be the same across retries for a single event and across webhook payloads if you have more than one webhook configured for the same event. `action`: The type of webhook event this payload is for. `data`: The actual payload data specific to this webhook. For example: JSON `{ "webhookActionId": "75395d87-4044-4dc4-bc29-0cec185e5f06", "action": "candidateStageChange", "data": {...} }` Updated over 1 year ago * * * --- # Authenticating Webhooks If you provide a secret token, this will be used to create a digest of the JSON payload sent with a webhook request. The digest will be included in the request under the `Ashby-Signature` http header. It will look like this: `Ashby-Signature: sha256=f3124911d2956f10aa3a49c43a88bdf13bba846e94f0ae2bd7c034f90239bd04` The part before the `=` indicates the algorithm that was used to compute the hash digest. Computing and comparing digests [](https://developers.ashbyhq.com/docs/authenticating-webhooks#computing-and-comparing-digests) =================================================================================================================================== To compute the digest of your payload, you want to use the _raw payload_ (i.e. whole request body, json string) before it has been parsed by something like `JSON.parse`. Here are some rough examples of how to compute it (note that these code examples are only for illustration). Python `import hmac import hashlib secret = b'8b943c474f5d1e1712f13e1a870b485c9b6b2b57' # get this from the request header: signature = "sha256=f3124911d2956f10aa3a49c43a88bdf13bba846e94f0ae2bd7c034f90239bd04" payload = b'{...}' def check_signature(signature_from_header, raw_payload): h = hmac.new(secret, raw_payload, hashlib.sha256) digest = h.hexdigest() # note that in reality you may want to use a secure digest compare function here: return 'sha256={}'.format(digest) == signature_from_header` And in Node: JavaScript `const crypto = require("crypto"); const secret = "8b943c474f5d1e1712f13e1a870b485c9b6b2b57"; function checkSignature(signatureFromHeader, rawPayload) { const hmac = crypto.createHmac("sha256", secret); hmac.update(rawPayload); const digest = hmac.digest("hex"); return "sha256=" + digest === signatureFromHeader; }` Updated over 1 year ago * * * --- # Getting Started with Ashby The best place to start is with the [reference introduction](https://developers.ashbyhq.com/reference/introduction) , and then look through the guide on [creating a custom careers page](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page) . Updated over 1 year ago * * * --- # Setting up Webhooks A webhook is a way to notify you when certain events happen in Ashby. Webhooks allow for real-time integration with Ashby's platform, enabling automated responses to events like candidate status changes, job posting updates, or interview scheduling. For a full list of events that trigger webhooks, see the list of webhook payloads in our [API reference](https://developers.ashbyhq.com/reference/applicationsubmitwebhook) . Webhooks are configured in Ashby under the Admin panel, by going to Admin > Integrations > Webhooks. Create a new webhook by clicking the "New" button or edit/delete an existing webhook by clicking on it in the list. Webhook configuration [](https://developers.ashbyhq.com/docs/setting-up-webhooks#webhook-configuration) =========================================================================================================== To set up a webhook, you need to configure your **payload url**, the **webhook event type**, and (optionally), a **secret token**. Webhook Type [](https://developers.ashbyhq.com/docs/setting-up-webhooks#webhook-type) ----------------------------------------------------------------------------------------- This is the type of event that you want to receive webhooks for. You can choose the event type from a dropdown when configuring a new webhook. Request URL [](https://developers.ashbyhq.com/docs/setting-up-webhooks#request-url) --------------------------------------------------------------------------------------- This is the url that webhook requests will be sent to. You can configure different urls for different webhooks, or create multiple webhooks for the same event to "fan out" requests to different urls. Secret Token [](https://developers.ashbyhq.com/docs/setting-up-webhooks#secret-token) ----------------------------------------------------------------------------------------- You can provide a secret token that will be used by Ashby to cryptographically sign all webhook requests. The signature will be sent with the request in an `Ashby-Signature` http header. By computing a digest of the payload using your secret token, you can compare it to the signature sent with the request to be sure that it was generated by Ashby using the token you provided. Although you don't have to provide this token, it's strongly encouraged that you do so in order to protect yourself against malicious parties sending bogus webhooks to your server. Ping webhooks [](https://developers.ashbyhq.com/docs/setting-up-webhooks#ping-webhooks) =========================================================================================== When you create or edit a webhook, a "ping" webhook with some basic data about the webhook configuration will be sent to your endpoint. If your server does not respond to the request, or responds with an error code (any code >400), the webhook will still be created but in a **disabled** state, where requests will not be sent. After fixing your server endpoint, you can go back to the webhook and check the "enabled" box and click the "Update" button to create a new ping request. If this is successful, your webhook will be enabled. Updated 4 months ago * * * --- # Creating a Custom Careers Page There are 3 main steps to using Ashby's API to create a fully functioning careers page. **Step 1** Get a list of open job postings using the [jobPosting.list](https://developers.ashbyhq.com/reference/jobpostinglist) endpoint. **Step 2** For each job posting in the list, use the [jobPosting.info](https://developers.ashbyhq.com/reference/jobpostinginfo) endpoint to get details about a particular job posting, including a specification of the application form. These application form specifications will allow you to programmatically build forms (for example, HTML forms) that your applicants can fill out. **Step 3** Using these application forms, you can send applications to Ashby using the [applicationForm.submit](https://developers.ashbyhq.com/reference/applicationformsubmit) and [surveySubmission.create](https://developers.ashbyhq.com/reference/surveysubmissioncreate) endpoints. 1\. Get all open jobs [](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page#1-get-all-open-jobs) ==================================================================================================================== Use the [jobPosting.list](https://developers.ashbyhq.com/reference/jobpostinglist) endpoint to get a list of your organization's open job postings. You can use this list to create a main careers page that lists opportunities. See the guide on [pagination and incremental synchronization](https://developers.ashbyhq.com/docs/pagination-and-incremental-sync) for detailed instructions on how to fetch all available data from the endpoint. 2\. Get detailed info about a specific job posting [](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page#2-get-detailed-info-about-a-specific-job-posting) ============================================================================================================================================================================== Use the [jobPosting.info](https://developers.ashbyhq.com/reference/jobpostinginfo) endpoint to get detailed information about a particular job posting, including a specification of the form used to submit applications. You can also use the `job` expand parameter with [jobPosting.info](https://developers.ashbyhq.com/reference/jobpostinginfo) to return job data including custom fields. Form definitions [](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page#form-definitions) ------------------------------------------------------------------------------------------------------------ A form definition looks like this: JSON `{ "fields": [ { "field": { "id": "afc7d3c7-5616-423a-b0db-261888f6f10b", "type": "String", "path": "_systemfield_name", "humanReadablePath": "Name", "title": "Name", "isNullable": false }, "isRequired": true }, { "field": { "id": "1c23a4e4-d40a-4574-a3b9-8ec4318421ec", "type": "Email", "path": "_systemfield_email", "humanReadablePath": "Email", "title": "Email", "isNullable": false }, "isRequired": true }, { "field": { "id": "fe05b423-e580-4c4b-8a67-32d354bdfe91", "type": "File", "path": "_systemfield_resume", "humanReadablePath": "Resume", "title": "Resume", "isNullable": false }, "isRequired": true } ] }` Each field in `fields` describes a field that should be in the resulting form, for example a text box or file input. Each field includes its title, a unique id, whether it's a required part of the form, and its type. The field type can be one of the following values: `"String"`, `"Email"`, `"File"`, `"Date"`, `"Number"`, `"Boolean"`, `"LongText"`, `"ValueSelect"` (a single-option select field), `"MultiValueSelect"` (select multiple values), `"Phone"`, `"Score"`, and `"SocialLink"`. For example, for a `"String"` field you'll likely want an `` element in your HTML form. For a `"File"`, a file selector, etc. 3\. Submit the application [](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page#3-submit-the-application) ============================================================================================================================== Job postings have 2 types of forms: 1. The _application_ form. This is the form that is used to submit applications for a job posting. This includes global questions. 2. Additional _survey_ forms. These are optional forms that can be configured to collect additional information from applicants, such as [EEOC questions](https://ashbyhq.notion.site/EEOC-Surveys-4ae4d3c62b234c83b91052b9839aae24) . Submit the core application form [](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page#submit-the-core-application-form) -------------------------------------------------------------------------------------------------------------------------------------------- When a candidate submits an application for a job posting, you should send the application data to the [applicationForm.submit](https://developers.ashbyhq.com/reference/applicationformsubmit) endpoint. This endpoint requires that request bodies be `Content-Type: multipart/form-data`. This is to support file uploads (for example, resumes) along with other data for the application. Suppose, for example, your application form includes a name field, an email field, and resume file field. Each of these fields in the form definition will have a `path` property (see the example above). This path property is used internally by Ashby to identify the individual fields. A submission to the [applicationForm.submit](https://developers.ashbyhq.com/reference/applicationformsubmit) endpoint for this form might look like this (leaving out the auth header for clarity): cURL `curl --request POST 'https://api.ashbyhq.com/applicationForm.submit' \ --header 'Content-Type: multipart/form-data' \ --form 'applicationForm={"fieldSubmissions":[{"path":"_systemfield_name","value":"Monty Api"},{"path":"_systemfield_email","value":"[[email protected]](https://developers.ashbyhq.com/cdn-cgi/l/email-protection) "},{"path":"_systemfield_resume","value":"resume_1"}]}' \ --form 'resume_1=@/path/to/file' \ --form 'jobPostingId=26a4281b-4ab2-4829-b664-7c43d7dbd409' \ --form 'utmData={ "utm_source": "whatever", "utm_campaign": "something" }'` The `applicationForm` field's value is a JSON string that encodes the applicant's response to each question on the form, identified by the `path` that was returned on the form definition. The `jobPostingId` field holds the value of the id for the job posting this application is for. Note the `value` for the file field: `"resume_1"`. This value matches another key in this request form: this identifies the file that is being uploaded as a response to the `_systemfield_resume` question. Note that the identifier `resume_1` can be any string you want - it just has to be unique in the request form. The value of the `resume_1` parameter is the actual binary of the file being uploaded (note in this example we use a cURL utility `@` that allows specifying a local file path. See the endpoint documentation for an example of using Node to get the file data). Finally, the `utmData` parameter is the only optional one here. If you have UTM data that you'd like attached to this application, you can include it here in a JSON-encoded string. After sending this request, if it's successful you'll receive a response that includes both the original form definition as well as an array of the recorded responses. ### Common errors [](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page#common-errors) If there is a problem with the form (for example, if "name" is required but not provided), the response will contain a list of errors. If the application was blocked due to configured application limits (eg too many applications submitted for a single candidate), the response will contain a `blocked` property with a value of `true`. If so, do not attempt to submit any surveys, if any. Note that the candidate should not be informed that they were blocked unless the response also contains a `blockMessageForCandidateHtml` property. Submit additional survey forms [](https://developers.ashbyhq.com/docs/creating-a-custom-careers-page#submit-additional-survey-forms) ---------------------------------------------------------------------------------------------------------------------------------------- After submitting the application form, you can submit additional survey forms using the [surveySubmission.create](https://developers.ashbyhq.com/reference/surveysubmissioncreate) endpoint. Each survey form has its own form definition, which is returned in the `surveyFormDefinitions` field of the [jobPosting.info](https://developers.ashbyhq.com/reference/jobpostinginfo) response. Survey forms must be submitted after the application, as each survey form submission requires an `applicationId` and `candidateId` which are only generated after a successful application. 1. First, query the [application.info](https://developers.ashbyhq.com/reference/applicationinfo) endpoint to get the `applicationId` and `candidateId`. 2. Then, use the [surveySubmission.create](https://developers.ashbyhq.com/reference/surveysubmissioncreate) endpoint to submit the survey form. A submission to the [surveySubmission.create](https://developers.ashbyhq.com/reference/surveysubmissioncreate) endpoint might look like this (leaving out the auth header for clarity): cURL `curl --request POST \ --url 'https://api.ashbyhq.com/surveySubmission.create' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data ' { "candidateId": "e9ed20fd-d45f-4aad-8a00-a19bfba0083e", "applicationId": "e9ed20fd-d45f-4aad-8a00-a19bfba0083e", "surveyFormDefinitionId": "e9ed20fd-d45f-4aad-8a00-a19bfba0083e", "submittedValues": {_systemfield_data_consent_ack: ["data_consent_ack"]}, } '` Updated 2 days ago * * * --- # Ashby Job Postings API Introduction [](https://developers.ashbyhq.com/docs/public-job-posting-api#introduction) -------------------------------------------------------------------------------------------- This API allows you to get data for all currently published Job Postings for your organization. If you host your own careers page, you can use this data to populate it. Optionally, you can add `includeCompensation=true` as a query parameter to include compensation data in the response. Example [](https://developers.ashbyhq.com/docs/public-job-posting-api#example) ---------------------------------------------------------------------------------- **Request:** `curl https://api.ashbyhq.com/posting-api/job-board/{JOB_BOARD_NAME}?includeCompensation=true` **Response:** JavaScript `{ "apiVersion": "1", "jobs": [ { "title": "Product Manager", "location": "Houston, TX", "secondaryLocations": [ { "location": "San Francisco" "address": { "addressLocality": "San Francisco", "addressRegion": "California", "addressCountry": "USA" } } ] "department": "Product", "team": "Growth", "isListed": true, "isRemote": true, "descriptionHtml": "
Join our team
", "descriptionPlain": "Join our team", "publishedAt": "2021-04-30T16:21:55.393+00:00", "employmentType": "FullTime", "address": { "postalAddress": { "addressLocality": "Houston", "addressRegion": "Texas", "addressCountry": "USA" } }, "jobUrl": "https://jobs.ashbyhq.com/example_job", "applyUrl": "https://jobs.ashbyhq.com/example/apply" }, ], "compensation": { "compensationTierSummary": "$81K – $87K • 0.5% – 1.75% • Offers Bonus", "scrapeableCompensationSalarySummary": "$81K - $87K", "compensationTiers": [ { "id": "cedc8928-e850-47e8-a510-e412f61d068a", "tierSummary": "Estimated based on experience $81K – $87K • 0.5% – 1.75% • Offers Bonus", "title": "Zone A", "additionalInformation": null, "components": [ { "id": "5d131ad4-6b3a-4f01-938e-511c60bd0398", "summary": "0.5% – 1.75%", "compensationType": "EquityPercentage", "interval": "NONE", "currencyCode": null, "minValue": 0.5, "maxValue": 1.75 }, { "id": "5c8de1b0-52d6-41d7-8ae3-671ee74c745a", "summary": "Estimated based on experience $81K – $87K", "compensationType": "Salary", "interval": "1 YEAR", "currencyCode": "USD", "minValue": 81000, "maxValue": 87000 }, { "id": "5f881813-f164-4b91-b652-fd713627e810", "summary": "Offers Bonus", "compensationType": "Bonus", "interval": "1 YEAR", "currencyCode": "USD", "minValue": null, "maxValue": null } ] } ], "summaryComponents": [ { "compensationType": "EquityPercentage", "interval": "NONE", "currencyCode": null, "minValue": 0.5, "maxValue": 1.75 }, { "compensationType": "Salary", "interval": "1 YEAR", "currencyCode": "USD", "minValue": 81000, "maxValue": 87000 }, { "compensationType": "Bonus", "interval": "1 YEAR", "currencyCode": "USD", "minValue": null, "maxValue": null } ] } }` How to find your jobs page name [](https://developers.ashbyhq.com/docs/public-job-posting-api#how-to-find-your-jobs-page-name) ---------------------------------------------------------------------------------------------------------------------------------- Your request must include your organization's Ashby jobs page name in the URL path. To find this name, you can go to your Ashby hosted job board. The final part of the URL path will be the jobs page name. Eg, `https://jobs.ashbyhq.com/Ashby` - "Ashby" is the jobs page name. To find your Ashby hosted job board, in the app head to 'Admin', then to Theme (Job Board). From there, click on the 'Job Board' button in the top-right corner to be taken to your job board.  API [](https://developers.ashbyhq.com/docs/public-job-posting-api#api) -------------------------------------------------------------------------- **Request URL** `GET https://api.ashbyhq.com/posting-api/job-board/{JOB_BOARD_NAME}?includeCompensation={true/false}` If the request is successful, the response body will be JSON with the following fields. Note that where some piece of this data is missing in Ashby, it will also be missing in this response (for example, if the job's location does not have a country, the country field will be empty). | **Field** | **Data type** | **Description** | | --- | --- | --- | | `apiVersion` | string | which version of the api generated this response (currently "1"). | | `jobs` | list | List of jobs | | `jobs[].title` | string | Job's title | | `jobs[].location` | string | Job's location | | `jobs[].secondaryLocations` | list | Job's secondary locations | | `jobs[].secondaryLocations[].location` | string | Job's secondary location | | `jobs[].secondaryLocations[].address` | object | | | `secondaryLocations[].address.addressLocality` | string | City associated with the job's secondary location | | `secondaryLocations[].address.addressRegion` | string | State/province associated with the job's secondary location | | `secondaryLocations[].address.addressCountry` | string | Country associated with the job's secondary location | | `jobs[].department` | string | Job's department | | `jobs[].team` | string | Job's immediate team | | `jobs[].isRemote` | boolean | Whether the job is remote | | `jobs[].descriptionHtml` | string | Description of the job formatted as html | | `jobs[].descriptionPlain` | string | Description of the job formatted as plain text | | `jobs[].publishedAt` | string | ISO DateTime when the job was last published | | `jobs[].employmentType` | string | An enum representing the type of employment, which will be one of the following values: "FullTime", "PartTime", "Intern", "Contract", or "Temporary". | | `jobs[].address` | object | | | `jobs[].address.postalAddress` | object | | | `postalAddress.addressLocality` | string | City associated with the job's location | | `postalAddress.addressRegion` | string | State/province associated with the job's location | | `postalAddress.addressCountry` | string | | | `jobs[].jobUrl` | string | URL of the Ashby hosted page for this job | | `jobs[].applyUrl` | string | URL for the Ashby page where candidates can apply for this job | | `jobs[].isListed` | boolean | Should this job be listed in the list of postings on your job board. If false, this listing should only be available via direct link. | | `jobs[].compensation` | object | Job's compensation information. Included if includeCompensation query parameter is true | | `compensation.compensationTierSummary` | string | Summary of compensation tiers | | `compensation.scrapeableCompensationSalarySummary` | string | Scrapeable salary compensation summary | | `compensation.compensationTiers[]` | object | Job's compensation tiers | | `compensation.summaryComponents[]` | object | Job 's summary components | If there is additional data you'd like to have included in this response but currently is not, please reach out to us and let us know. Updated 4 months ago * * * --- # Related Webhooks Some actions trigger other, related webhooks. For example, when a `candidateStageChange` event occurs, it also triggers an `applicationUpdate` webhook. Here's a list of webhook types that trigger additional webhooks: * `candidateStageChange` triggers: * `applicationUpdate` * `jobPostingPublish` and `jobPostingUnpublish` trigger: * `jobPostingUpdate` * `interviewScheduleCreate` triggers: * `interviewScheduleUpdate` * `candidateHire` triggers: * `applicationUpdate` * `candidateStageChange` * `interviewPlanTransition` triggers: * `jobUpdate` These webhooks are generated with the same `webhookActionId` to indicate they represent the same underlying event. This helps you correlate related webhook notifications. Updated 4 months ago * * * --- # Retries Ashby will retry failed webhook requests using exponential backoff with a maximum of 10 attempts. Retry Schedule [](https://developers.ashbyhq.com/docs/retries#retry-schedule) --------------------------------------------------------------------------------- When a webhook request fails (non-2xx response), the next attempt is scheduled using: **Delay = (2^attempt\_number - 1) × 10 seconds** | Attempt | Delay | | --- | --- | | 1st retry | 10 seconds | | 2nd retry | 30 seconds | | 3rd retry | 70 seconds | | 4th retry | 150 seconds | _Note: These are minimum delays - actual retry times may be slightly longer._ Non-Retryable Status Codes [](https://developers.ashbyhq.com/docs/retries#non-retryable-status-codes) --------------------------------------------------------------------------------------------------------- Requests that return the following HTTP status codes will **not** be retried: * `401 Unauthorized` * `403 Forbidden` * `404 Not Found` * `405 Method Not Allowed` * `410 Gone` All other error responses (5xx, timeouts, etc.) will be retried according to the schedule above. Updated 14 days ago * * * ---