Closed beta · run Worlds on your machineBrowse worlds →
Docs menu · Greenhouse API

Worlds / Hr and identity

Greenhouse API

A local Greenhouse with jobs, candidates, applications, interview stages, scorecards and offers. Test the recruiting agent that moves applications, rejects with the right reason and drafts offers for approval.

Base path
/v1
Auth
API key over HTTP basic auth (Harvest API), the world key
Endpoints
14
Status
Active today

This reference previews the surface the Greenhouse world serves in the closed beta. Paths mirror the public Greenhouse API; the exact subset is confirmed when your workflow is scoped.

Connect

The run gives your agent these bindings. Keep your SDK; change only where it sends requests.

bindingmeaning
WORLDS_GREENHOUSE_URLThis world's origin followed by /v1
WORLDS_API_KEYThe world key, accepted wherever Greenhouse expects a credential
WORLDS_WORLD_IDThe isolated world's identity
js · fetch
const base = process.env.WORLDS_GREENHOUSE_URL;
const auth = Buffer.from(process.env.WORLDS_API_KEY + ":").toString("base64");

const res = await fetch(base + "/v1/candidates?per_page=20", {
  headers: { Authorization: "Basic " + auth },
});

const candidates = await res.json();

API reference

Candidates

People in the hiring pipeline.

  • GET/v1/candidatesList candidates
  • POST/v1/candidatesAdd a candidate
  • GET/v1/candidates/{id}Get a candidate
  • PATCH/v1/candidates/{id}Edit a candidate
Fields · 6
idintegerCandidate id
first_namestringFirst name
last_namestringLast name
email_addressesarrayEmail addresses
applicationsarrayApplications from this candidate
tagsarrayTags

Applications

A candidate's application to a job and where it stands.

  • GET/v1/applicationsList applications
  • GET/v1/applications/{id}Get an application
  • POST/v1/applications/{id}/advanceMove an application to the next stage
  • POST/v1/applications/{id}/rejectReject an application
Fields · 5
idintegerApplication id
candidate_idintegerCandidate
statusstringactive, rejected or hired
current_stageobjectStage the application is in
jobsarrayJobs applied to

Jobs

Open and closed roles.

  • GET/v1/jobsList jobs
  • GET/v1/jobs/{id}Get a job
  • GET/v1/jobs/{id}/stagesList a job's stages
Fields · 5
idintegerJob id
namestringJob name
statusstringopen, closed or draft
departmentsarrayDepartments
openingsarrayOpenings on the job

Scorecards and interviews

Interview feedback left by the hiring team.

  • GET/v1/scorecardsList scorecards
  • GET/v1/applications/{id}/scorecardsList scorecards for an application
  • GET/v1/scheduled_interviewsList scheduled interviews
Fields · 5
idintegerScorecard id
overall_recommendationstringdefinitely_not through strong_yes
interviewstringInterview name
submitted_byobjectInterviewer
submitted_atdatetimeSubmission time

Test workflow

  1. Prepare. Select the Greenhouse setup for your workflow and review its starting records, including candidates, applications, jobs.
  2. Connect. Configure your agent with this world's URL and key using the SDK example. Check that it reaches the intended API before running a test.
  3. Define. Describe the task, expected final changes and records that must stay untouched. Keep expected outcomes separate from the agent's instructions.
  4. Run and inspect. Use the dashboard or your workflow's generated CLI setup. Review final records and changes, then rerun from the same starting setup with the relevant failure conditions. Use Deployment and CI to automate the same workflow.

What to verify

  • app 4410 moved to Onsite
  • app 4392 moved to Offer
  • app 4401 still in Onsite
  • No rejections sent
  • Lia Torres offer still pending approval

Test file

A task file names the jobs, the policy your agent is given and what the grader reads back from the world's final state. The agent never sees the expected outcomes.

yaml · worlds/tasks.yaml
# worlds/tasks.yaml · Greenhouse
version: 2
connector: greenhouse
seed: greenhouse-starter
mode: isolated
policy: >
  Review the Senior Backend Engineer pipeline. Advance anyone whose scorecards
  are all in and positive. Leave candidates with missing scorecards where they
  are.
tasks:
  - id: advance-applications-after-scorecards-are-in
    prompt: Advance applications after scorecards are in
  - id: reject-candidates-with-a-rejection-reason-and-email-template
    prompt: Reject candidates with a rejection reason and email template
  - id: create-an-offer-and-send-it-for-approval
    prompt: Create an offer and send it for approval
expected:
  - app 4410 moved to Onsite
  - app 4392 moved to Offer
  - app 4401 still in Onsite
  - No rejections sent
  - Lia Torres offer still pending approval
scenarios:
  - rate-limited
  - missing-user-header
  - validation-error

See Tasks and outcomes for every field, and Deployment and CI to run the file on every pull request.

Failure conditions

Each one fires before the handler, at the same step on every run.

conditionwhat the agent sees
rate-limitedHarvest returns 429 past the request window
missing-user-headerWrites without On-Behalf-Of return 403
validation-errorA reject without a rejection_reason_id returns 422
webhook-twiceThe candidate stage change webhook arrives two times

Starting data

Start each run from the same records and relationships. The overview below describes the Greenhouse starter; use the setup supplied for your workflow when preparing your own snapshot.

RecordsStarting setup
jobs8 open jobs with hiring teams and interview plans
candidates150, some with applications to more than one job
applicationsSpread across Application Review, Phone Screen, Onsite and Offer
scorecardsSubmitted and missing scorecards with overall recommendations
offers3 offers, one waiting on approval

The record shapes below reuse this world's API field definitions. They show illustrative values and placeholders, not an importable seed. API responses and seed input can differ; include all required records and references in the accepted import format for your workflow.

Candidates records

Candidates

People in the hiring pipeline.

FieldTypeMeaning / relationship
idintegerCandidate id
first_namestringFirst name
last_namestringLast name
email_addressesarrayEmail addresses
applicationsarrayApplications from this candidate
tagsarrayTags
json · illustrative record shape
{
  "id": 1,
  "first_name": "<First name>",
  "last_name": "<Last name>",
  "email_addresses": [],
  "applications": [],
  "tags": []
}

See candidates operations

Applications records

Applications

A candidate's application to a job and where it stands.

FieldTypeMeaning / relationship
idintegerApplication id
candidate_idintegerCandidate
statusstringactive, rejected or hired
current_stageobjectStage the application is in
jobsarrayJobs applied to
json · illustrative record shape
{
  "id": 1,
  "candidate_id": 1,
  "status": "<active, rejected or hired>",
  "current_stage": {},
  "jobs": []
}

See applications operations

Jobs records

Jobs

Open and closed roles.

FieldTypeMeaning / relationship
idintegerJob id
namestringJob name
statusstringopen, closed or draft
departmentsarrayDepartments
openingsarrayOpenings on the job
json · illustrative record shape
{
  "id": 1,
  "name": "<Job name>",
  "status": "<open, closed or draft>",
  "departments": [],
  "openings": []
}

See jobs operations

Scorecards and interviews records

Scorecards and interviews

Interview feedback left by the hiring team.

FieldTypeMeaning / relationship
idintegerScorecard id
overall_recommendationstringdefinitely_not through strong_yes
interviewstringInterview name
submitted_byobjectInterviewer
submitted_atdatetimeSubmission time
json · illustrative record shape
{
  "id": 1,
  "overall_recommendation": "<definitely_not through strong_yes>",
  "interview": "<Interview name>",
  "submitted_by": {},
  "submitted_at": "<Submission time>"
}

See scorecards and interviews operations

See the Greenhouse world in the catalog