Ashby · Arazzo Workflow

Ashby Run an Offer from Start to Approval

Version 1.0.0

Start an offer process, open an offer version, fill and create it, run approvals, and read the result.

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

Provider

ashby-hq

Workflows

offer-process
Start, fill, submit, and approve an offer for an application.
Starts an offer process on an application, creates an offer version to obtain the offer form definition, submits the filled offer form, starts the approval process, force approves it, and reads the offer back.
6 steps inputs: applicationId, approvalNote, approverUserId, fieldSubmissions outputs: latestVersion, offerId, offerProcessId, offerStatus, offerVersionId
1
startOfferProcess
Start the offer process on the application. This is the container every later call hangs off; its id is required by offer.start and offer.create.
2
openOfferVersion
Create an offer version instance and return its form definition. This is the step that hands back the field paths the offer form must be filled with — offer.create cannot be composed without reading it first.
3
submitOffer
Submit the filled offer form against the version opened above. The fieldSubmissions paths must match the form definition or Ashby rejects the offer.
4
startApproval
Start the approval process for the submitted offer version, routing it to whoever the organization's approval definition names.
5
approveOffer
Approve the offer version. This mirrors the "Force Approve" behavior in the Ashby app, where an admin can override the approval chain, so it should be wired only to callers entitled to do that.
6
readOffer
Read the offer back to confirm its final status. The form definition is excluded here because the caller already has it from openOfferVersion and it is a large payload.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Ashby Run an Offer from Start to Approval
  summary: Start an offer process, open an offer version, fill and create it, run approvals, and read the result.
  description: >-
    The offer chain is the most sequenced surface in the Ashby API and the one
    where ids are least guessable: offerProcess.start yields the process id,
    offer.start yields the offer version and its form definition, offer.create
    submits that form, and only then can an approval process be started and
    approved. Each id comes from the previous response, so the order here is not
    a convenience — it is the contract. This workflow walks the whole chain and
    reads the finished offer 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-offer-process-api-openapi.yml
      confidence: 0.85
    model: Turbo EA Capabilities by Vincent Verdet — Turbo EA, https://github.com/vincentmakes/turbo-ea-capabilities, CC BY 4.0
sourceDescriptions:
- name: offerApi
  url: ../openapi/ashby-hq-offer-api-openapi.yml
  type: openapi
- name: offerProcessApi
  url: ../openapi/ashby-hq-offer-process-api-openapi.yml
  type: openapi
workflows:
- workflowId: offer-process
  summary: Start, fill, submit, and approve an offer for an application.
  description: >-
    Starts an offer process on an application, creates an offer version to obtain
    the offer form definition, submits the filled offer form, starts the approval
    process, force approves it, and reads the offer back.
  inputs:
    type: object
    required:
    - applicationId
    - fieldSubmissions
    properties:
      applicationId:
        type: string
        description: The id of the application to start an offer process for.
      fieldSubmissions:
        type: array
        description: >-
          The completed offer form fields, each an object with a path and a
          value. The paths must come from the form definition returned by the
          openOfferVersion step.
        items:
          type: object
          properties:
            path:
              type: string
              description: The form field's path value.
            value:
              type: string
              description: The value for the field, typed per the field definition.
      approvalNote:
        type: string
        description: A note to attach when starting the approval process.
      approverUserId:
        type: string
        description: >-
          The id of the user to approve as. Omit to approve as the API key user.
  steps:
  - stepId: startOfferProcess
    description: >-
      Start the offer process on the application. This is the container every
      later call hangs off; its id is required by offer.start and offer.create.
    operationId: offerProcess.start
    requestBody:
      contentType: application/json
      payload:
        applicationId: $inputs.applicationId
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      offerProcessId: $response.body#/results/id
      processStatus: $response.body#/results/status
  - stepId: openOfferVersion
    description: >-
      Create an offer version instance and return its form definition. This is
      the step that hands back the field paths the offer form must be filled with
      — offer.create cannot be composed without reading it first.
    operationId: offerStart
    requestBody:
      contentType: application/json
      payload:
        offerProcessId: $steps.startOfferProcess.outputs.offerProcessId
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      offerFormId: $response.body#/results/id
      formSections: $response.body#/results/formDefinition/sections
  - stepId: submitOffer
    description: >-
      Submit the filled offer form against the version opened above. The
      fieldSubmissions paths must match the form definition or Ashby rejects the
      offer.
    operationId: offerCreate
    requestBody:
      contentType: application/json
      payload:
        offerProcessId: $steps.startOfferProcess.outputs.offerProcessId
        offerFormId: $steps.openOfferVersion.outputs.offerFormId
        offerForm:
          fieldSubmissions: $inputs.fieldSubmissions
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      offerId: $response.body#/results/id
      offerVersionId: $response.body#/results/latestVersion/id
      offerStatus: $response.body#/results/offerStatus
  - stepId: startApproval
    description: >-
      Start the approval process for the submitted offer version, routing it to
      whoever the organization's approval definition names.
    operationId: offerStartApprovalProcess
    requestBody:
      contentType: application/json
      payload:
        offerVersionId: $steps.submitOffer.outputs.offerVersionId
        note: $inputs.approvalNote
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      offerId: $response.body#/results/id
      offerStatus: $response.body#/results/offerStatus
  - stepId: approveOffer
    description: >-
      Approve the offer version. This mirrors the "Force Approve" behavior in the
      Ashby app, where an admin can override the approval chain, so it should be
      wired only to callers entitled to do that.
    operationId: offerApprove
    requestBody:
      contentType: application/json
      payload:
        offerVersionId: $steps.submitOffer.outputs.offerVersionId
        userId: $inputs.approverUserId
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      offerId: $response.body#/results/id
      offerStatus: $response.body#/results/offerStatus
  - stepId: readOffer
    description: >-
      Read the offer back to confirm its final status. The form definition is
      excluded here because the caller already has it from openOfferVersion and
      it is a large payload.
    operationId: offerInfo
    requestBody:
      contentType: application/json
      payload:
        offerId: $steps.submitOffer.outputs.offerId
        excludeFormDefinition: true
    successCriteria:
    - condition: $statusCode == 200
    - condition: $response.body#/success == true
    outputs:
      offerId: $response.body#/results/id
      offerStatus: $response.body#/results/offerStatus
      latestVersion: $response.body#/results/latestVersion
  outputs:
    offerProcessId: $steps.startOfferProcess.outputs.offerProcessId
    offerId: $steps.readOffer.outputs.offerId
    offerVersionId: $steps.submitOffer.outputs.offerVersionId
    offerStatus: $steps.readOffer.outputs.offerStatus
    latestVersion: $steps.readOffer.outputs.latestVersion

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-offer-process-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.