RoleSprig — Job Postings API avatar

RoleSprig — Job Postings API

Pricing

from $0.75 / 1,000 job results

Go to Apify Store
RoleSprig — Job Postings API

RoleSprig — Job Postings API

Extract public job postings from Greenhouse and Ashby career pages into consistent JSON for job boards, recruiting workflows, and AI agents.

Pricing

from $0.75 / 1,000 job results

Rating

0.0

(0)

Developer

Ezra Evercreech

Ezra Evercreech

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

RoleSprig

Public job listings, ready for your workflow.

Give RoleSprig one or more supported Greenhouse or Ashby public job-board URLs. It fetches the current postings and returns consistent JSON rows that are ready for job boards, recruiting workflows, automation, and AI agents.

RoleSprig is an independent tool. It is not affiliated with, endorsed by, or an official product of Greenhouse or Ashby. Greenhouse and Ashby names are used only to describe the public job-board sources currently supported.

No LLM, model API, browser, proxy, or paid search API is required at runtime.

Quick start

Supported board roots:

  • Greenhouse: https://boards.greenhouse.io/<board_token>
  • Greenhouse: https://job-boards.greenhouse.io/<board_token>
  • Ashby: https://jobs.ashbyhq.com/<job_board_name>

Only board root URLs are accepted. Individual job URLs, arbitrary hosts, credentials, query strings, fragments, and unexpected redirects are rejected.

Example input:

{
"board_urls": [
"https://job-boards.greenhouse.io/greycroft",
"https://jobs.ashbyhq.com/ramp"
],
"title_keywords": ["engineer"],
"location_keywords": ["remote"],
"max_jobs": 100,
"include_description": false
}

title_keywords and location_keywords use case-insensitive substring matching. Values inside each array are ORed; the title and location groups are ANDed. max_jobs is the maximum number of returned rows across the whole run, not per board.

include_description defaults to false. Enable it only when you need the source description text; descriptions can make the output substantially larger.

REST API example

Set your Apify token in APIFY_TOKEN, then copy and run this request. It uses the Actor's current default build and returns Dataset rows directly:

curl --fail-with-body --silent --show-error --location \
--request POST \
'https://api.apify.com/v2/acts/EpubPreflight~ats-jobs-api/run-sync-get-dataset-items?memory=256&maxTotalChargeUsd=0.00080' \
--header "Authorization: Bearer ${APIFY_TOKEN}" \
--header 'Content-Type: application/json' \
--data '{"board_urls":["https://job-boards.greenhouse.io/greycroft"],"title_keywords":[],"location_keywords":[],"max_jobs":1,"include_description":false}'

This exact versionless request was verified against the private Actor's current default build on 2026-09-05 and returned exactly one normalized Greenhouse row.

A captured verified response row from the same board and schema was:

[
{
"schema_version": 1,
"source": "greenhouse",
"board_id": "greycroft",
"job_id": "4729761005",
"title": "Executive Assistant",
"company_name": null,
"locations": ["San Francisco"],
"department": null,
"employment_type": null,
"workplace_type": null,
"salary_raw": null,
"job_url": "https://job-boards.greenhouse.io/greycroft/jobs/4729761005",
"apply_url": null,
"source_published_at": null,
"source_updated_at": "2026-09-02T13:53:31-04:00",
"fetched_at": "2026-09-05T13:05:59.736394Z",
"description_text": null
}
]

Job listings change upstream, so IDs, titles, timestamps, and available fields in later runs can differ from this captured example.

Output

Job rows are written to the default Dataset. Run diagnostics and board-level errors are written to the default Key-value store as SUMMARY.

Each job row contains:

schema_version, source, board_id, job_id, title, company_name, locations, department, employment_type, workplace_type, salary_raw, job_url, apply_url, source_published_at, source_updated_at, fetched_at, description_text.

Unavailable source fields remain null; RoleSprig does not guess them. Ashby entries with isListed: false are excluded.

Success, partial results, and failures

RoleSprig distinguishes these cases so automations do not have to treat every zero-row result the same way:

  • Success: all processed boards succeeded or were normally empty. A filter that matches zero jobs is also a successful run.
  • Partial: at least one board succeeded and at least one board failed. Successful rows are preserved, the Actor run remains SUCCEEDED, and SUMMARY.status is partial.
  • Failed: every processed source board failed. SUMMARY.status is written as failed with per-board errors, then the Actor run itself ends as FAILED.
  • No paid-row budget: if the remaining Pay-per-event budget cannot fund even one result row, RoleSprig returns successfully without starting an ATS request and marks the summary as charge-limit reached.

In Apify Console, open the run's Key-value store and inspect SUMMARY. API clients can read the same record from the run's defaultKeyValueStoreId:

curl --silent --show-error \
--header "Authorization: Bearer ${APIFY_TOKEN}" \
"https://api.apify.com/v2/key-value-stores/${STORE_ID}/records/SUMMARY"

SUMMARY.external_requests means outbound HTTP request attempts started by RoleSprig. It includes attempts that end in timeout or connection errors; it does not prove that the upstream server received every attempt.

Retry and safety behavior

  • At most two boards are requested concurrently.
  • Retryable 429 and selected 5xx responses use at most two retries.
  • A valid Retry-After value is understood as either delay-seconds or an HTTP-date.
  • A valid Retry-After of up to 10 seconds is honored. If the source asks for a longer wait, RoleSprig stops that board with RATE_LIMITED or RETRY_LATER rather than retrying earlier than requested.
  • Invalid or missing Retry-After values use bounded exponential backoff.
  • Redirects are rejected instead of followed.
  • Source responses are hard-capped at 10 MB while streaming.
  • Duplicate board inputs and duplicate (source, board_id, job_id) rows are removed.

Pricing and spending limits

The current Pay-per-event configuration is:

  • Actor start: $0.00005 per run
  • Job result: $0.00075 per returned job ($0.75 per 1,000 results)
  • Platform usage: included; no separate usage charge is passed through

The start event is charged when the Actor run starts, so a run can still incur the $0.00005 start charge even when it returns zero job rows. The per-result event is charged only for rows successfully emitted to the Dataset.

You can set Apify's maxTotalChargeUsd for each run. Before fetching source boards, RoleSprig calculates how many paid result rows the remaining budget can support. If it cannot support even one result row, no ATS request is started. Once a batch of source requests has already started, RoleSprig does not claim that a later output limit can retroactively cancel those in-flight requests.

The current prices are an initial launch hypothesis; they are not a claim of guaranteed developer margin or future pricing.

Source notes

Greenhouse list responses do not expose every normalized field, so fields such as company_name, source_published_at, employment_type, or a dedicated apply_url can be null. Greenhouse full content is requested only when include_description=true.

Current Ashby public responses expose a source job ID, job/apply URLs, workplace and employment information, published time, descriptions, and optional compensation where the source provides them. RoleSprig does not estimate missing salary or other values.

FAQ

Is RoleSprig an official Greenhouse or Ashby product?

No. RoleSprig is independent and is not affiliated with, endorsed by, or an official product of Greenhouse or Ashby.

Does RoleSprig use AI or an LLM to collect jobs?

No. Collection uses public HTTP endpoints and deterministic normalization. The JSON output can be consumed by AI agents, but RoleSprig itself does not call an LLM at runtime.

What happens if one board is down?

Other successful boards are still returned. Check SUMMARY.status=partial and the per-board error entries to see what failed.

Are descriptions always included?

No. include_description=false is the default. Turn it on only when you need source description text.

Can I limit cost?

Yes. Set Apify's per-run spending limit. RoleSprig checks the affordable result count before source fetching and stops before any ATS request when no paid row can be funded.