Ashby · Arazzo Workflow

Ashby Sync a Job Posting to a Careers Site

Version 1.0.0

Resolve the job board, list its live postings, read one in full, and update its copy.

1 workflow 2 source APIs 1 provider
View Spec View on GitHub ATSRecruitingTalent AcquisitionSourcingCRMSchedulingAnalyticsHiringHR TechArtificial IntelligenceArazzoWorkflows

Provider

ashby-hq

Workflows

job-posting-sync
Resolve a job board, pull its live postings, read one, and update its copy.
Lists job boards, lists the listed-only postings on the chosen board, reads a posting with its job expanded, and updates the posting's title and description.
4 steps inputs: description, jobBoardId, jobPostingId, title outputs: jobBoards, postingId, postings, previousDescriptionHtml, updatedTitle
1
listJobBoards
List the organization's job boards. Resolving the board explicitly matters because the posting calls silently default to the primary external board when no board id is supplied, which is rarely what a multi-brand careers site wants.
2
listPostings
List the postings on the chosen board, filtered to listed postings only so unlisted or draft postings never reach a public careers site.
3
readPosting
Read the full posting with its job expanded. The list above returns summaries; the complete description and compensation detail only come back from this call, which is why a careers-site sync cannot be built on the listing alone.
4
updatePosting
Write updated copy back to the posting. Only the supplied fields change; the rest of the posting is left intact.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Ashby Sync a Job Posting to a Careers Site
  summary: Resolve the job board, list its live postings, read one in full, and update its copy.
  description: >-
    Teams running their own careers site pull postings from Ashby rather than
    using the hosted board, and the two calls that matter are the listing and the
    per-posting read — the list is a summary, and the full description only comes
    back from jobPosting.info. This workflow resolves the board explicitly rather
    than relying on the primary-board default, lists the postings that are
    actually live, reads one in full, and writes updated copy back. Every step
    spells out its request inline so the flow can be read and executed without
    opening the underlying OpenAPI description.
  version: 1.0.0
  x-realizes-capability-ids:
  - BC-300.10
  x-capability-derivation:
    method: 'deterministic join: sourceDescriptions -> per-tag OpenAPI -> tag/capability edge. No classification at this step.'
    min_confidence: 0.7
    sources:
    - capability_id: BC-300.10
      capability_name: Talent Acquisition Management
      spec: ashby-hq-job-posting-api-openapi.yml
      confidence: 0.9
    model: Turbo EA Capabilities by Vincent Verdet — Turbo EA, https://github.com/vincentmakes/turbo-ea-capabilities, CC BY 4.0
sourceDescriptions:
- name: jobBoardApi
  url: ../openapi/ashby-hq-job-board-api-openapi.yml
  type: openapi
- name: jobPostingApi
  url: ../openapi/ashby-hq-job-posting-api-openapi.yml
  type: openapi
workflows:
- workflowId: job-posting-sync
  summary: Resolve a job board, pull its live postings, read one, and update its copy.
  description: >-
    Lists job boards, lists the listed-only postings on the chosen board, reads a
    posting with its job expanded, and updates the posting's title and
    description.
  inputs:
    type: object
    required:
    - jobBoardId
    - jobPostingId
    properties:
      jobBoardId:
        type: string
        description: >-
          The id of the job board to sync from. Resolve this from the
          listJobBoards step output.
      jobPostingId:
        type: string
        description: >-
          The id of the posting to read and update. Resolve this from the
          listPostings step output.
      title:
        type: string
        description: A new title for the job posting.
      description:
        type: string
        description: New description copy for the job posting.
  steps:
  - stepId: listJobBoards
    description: >-
      List the organization's job boards. Resolving the board explicitly matters
      because the posting calls silently default to the primary external board
      when no board id is supplied, which is rarely what a multi-brand careers
      site wants.
    operationId: jobBoardList
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      jobBoards: $response.body#/results
  - stepId: listPostings
    description: >-
      List the postings on the chosen board, filtered to listed postings only so
      unlisted or draft postings never reach a public careers site.
    operationId: jobPostingList
    requestBody:
      contentType: application/json
      payload:
        jobBoardId: $inputs.jobBoardId
        listedOnly: true
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      postings: $response.body#/results
  - stepId: readPosting
    description: >-
      Read the full posting with its job expanded. The list above returns
      summaries; the complete description and compensation detail only come back
      from this call, which is why a careers-site sync cannot be built on the
      listing alone.
    operationId: jobPostingInfo
    requestBody:
      contentType: application/json
      payload:
        jobPostingId: $inputs.jobPostingId
        jobBoardId: $inputs.jobBoardId
        expand:
        - job
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      postingId: $response.body#/results/id
      postingTitle: $response.body#/results/title
      descriptionHtml: $response.body#/results/descriptionHtml
      isListed: $response.body#/results/isListed
  - stepId: updatePosting
    description: >-
      Write updated copy back to the posting. Only the supplied fields change;
      the rest of the posting is left intact.
    operationId: jobPostingUpdate
    requestBody:
      contentType: application/json
      payload:
        jobPostingId: $inputs.jobPostingId
        title: $inputs.title
        description: $inputs.description
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      postingId: $response.body#/results/id
      updatedTitle: $response.body#/results/title
  outputs:
    jobBoards: $steps.listJobBoards.outputs.jobBoards
    postings: $steps.listPostings.outputs.postings
    postingId: $steps.updatePosting.outputs.postingId
    updatedTitle: $steps.updatePosting.outputs.updatedTitle
    previousDescriptionHtml: $steps.readPosting.outputs.descriptionHtml

Work with this as data

Every workflow here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for arazzo workflows

4 MCP tools reach this
  • find_arazzoBrowse and filter every workflow in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This workflow
curl "https://apis.io/api/v1/arazzo/ashby-hq-job-posting-sync-workflow"
All arazzo workflows
curl "https://apis.io/api/v1/arazzo?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.