greenhouse
Greenhouse (via Apideck)
Access Greenhouse through Apideck's ATS unified API — one of 11 ATS connectors that share the same method surface. Code you write here ports to Workday, Lever, Workable and 7 other ATS connectors by changing a single serviceId string. Apideck handles auth, pagination, rate limiting, and retries so you don't write per-tenant Greenhouse plumbing.
Quick facts
- Apideck serviceId:
greenhouse - Unified API: ATS
- Auth type: basic
- Apideck setup guide: Connection guide
- Gotchas: page
- Greenhouse docs: https://developers.greenhouse.io
- Homepage: https://www.greenhouse.io/
When to use this skill
Activate this skill when the user explicitly wants to work with Greenhouse — for example, "list open jobs in Greenhouse" or "move an applicant through stages in Greenhouse". This skill teaches the agent:
- Which Apideck unified API covers Greenhouse (ATS)
- The correct
serviceIdto pass on every call (greenhouse) - Greenhouse-specific auth and coverage caveats
For the full method surface (parameters, pagination, filtering), use your language SDK skill:
apideck-node,apideck-python,apideck-dotnet,apideck-java,apideck-go,apideck-php, orapideck-rest
For the raw OpenAPI spec:
Minimal example (TypeScript)
import { Apideck } from "@apideck/unify";
const apideck = new Apideck({
apiKey: process.env.APIDECK_API_KEY,
appId: process.env.APIDECK_APP_ID,
consumerId: "your-consumer-id",
});
// List applicants in Greenhouse
const { data } = await apideck.ats.applicants.list({
serviceId: "greenhouse",
});
Portable across 11 ATS connectors
The Apideck ATS unified API exposes the same methods for every connector in its catalog. Switching from Greenhouse to another ATS connector is a one-string change — no rewrite, no new SDK.
// Today — Greenhouse
await apideck.ats.applicants.list({ serviceId: "greenhouse" });
// Tomorrow — same code, different connector
await apideck.ats.applicants.list({ serviceId: "workday" });
await apideck.ats.applicants.list({ serviceId: "lever" });
This is the compounding advantage of using Apideck over integrating Greenhouse directly: code against the unified ATS API once, gain access to every connector in it. New connectors Apideck adds become available to your app without code changes.
Greenhouse via Apideck ATS
Greenhouse is the reference enterprise ATS connector on Apideck. Strong coverage for jobs, candidates, and applications.
Entity mapping
| Greenhouse entity | Apideck ATS resource |
|---|---|
| Job | jobs |
| Candidate | applicants |
| Application | applications |
| Job Post (external posting) | exposed via jobs[].job_posts[] |
| Stage (pipeline stage) | exposed via jobs[].stages[] |
| Scorecard / Interview | use Proxy |
| Offer | exposed as applications[].offers[] |
Coverage highlights
- ✅ Full CRUD on jobs and applicants
- ✅ Applications — create, list, update stage
- ✅ Attachments on applicants (resumes, cover letters)
- ✅ Moving candidates through pipeline stages via
application.current_stage - ⚠️ Scorecards and interview kits — read-only in Greenhouse's API; use Proxy
- ❌ User management — use Proxy (Greenhouse Users endpoint)
- ❌ Custom fields on applications — use Proxy with the Greenhouse custom field endpoints
Greenhouse-specific auth notes
- Auth type: API key — user pastes their Greenhouse key into the Vault modal.
- Key type matters: Greenhouse keys are either Harvest (read/write, full coverage) or Job Board (public-facing, read-only). Apideck needs a Harvest key for anything beyond reading published jobs. If the user provides a Job Board key, writes will 403 — direct them to generate a Harvest key in Greenhouse admin.
- On-Behalf-Of user: some Greenhouse writes (moving applications, rejecting candidates) require an
On-Behalf-Ofuser header. This is configured on the connection in the Apideck dashboard — the user picks which Greenhouse user Apideck acts as.
Common Greenhouse quirks handled by Apideck
- Candidate vs. Prospect — Greenhouse distinguishes these by whether they're attached to an Application. Apideck exposes both under
applicantsand discriminates viaapplicant.is_prospect. - Multiple applications per candidate — a Greenhouse candidate can apply to N jobs. Apideck surfaces this as
applicant.applications[]. - Timestamps — Greenhouse uses ISO 8601 with Z. Apideck passes through unchanged.
- Source tracking — Greenhouse's
sourceis a structured object; Apideck flattens toapplicant.source.name.
Example: create a candidate and an application in one flow
// 1. Create the candidate
const { data: applicant } = await apideck.ats.applicants.create({
serviceId: "greenhouse",
applicant: {
first_name: "Jordan",
last_name: "Lee",
emails: [{ email: "jordan@example.com", type: "personal" }],
},
});
// 2. Create an application for a job
const { data: application } = await apideck.ats.applications.create({
serviceId: "greenhouse",
application: {
applicant_id: applicant.data.id,
job_id: "job_4001",
source: { name: "Referral" },
},
});
Example: move an application to the next stage
await apideck.ats.applications.update({
serviceId: "greenhouse",
id: "app_123",
application: { current_stage: { id: "stage_phone_screen" } },
});
Escape hatch: Proxy API
When an endpoint isn't covered by the ATS unified API, use Apideck's Proxy to call Greenhouse directly — Apideck injects auth headers and handles token refresh. Set x-apideck-downstream-url to the target endpoint on Greenhouse's own API:
curl 'https://unify.apideck.com/proxy' \
-H "Authorization: Bearer ${APIDECK_API_KEY}" \
-H "x-apideck-app-id: ${APIDECK_APP_ID}" \
-H "x-apideck-consumer-id: ${CONSUMER_ID}" \
-H "x-apideck-service-id: greenhouse" \
-H "x-apideck-downstream-url: <target endpoint on Greenhouse>" \
-H "x-apideck-downstream-method: GET"
See Greenhouse's API docs for available endpoints.
Sibling connectors
Other ATS connectors that share this unified API surface (same method signatures, just change serviceId):
workday, lever, workable (beta), bullhorn-ats (beta), teamtailor (beta), freshteam, jobadder (beta), recruitee, and 2 more.
See also
- Apideck connection guide for Greenhouse
- ATS OpenAPI spec · API Explorer
apideck-connector-coverage— programmatic coverage checksapideck-best-practices— architecture, Vault, pagination, error handlingapideck-node— TypeScript / Node SDK patterns- Greenhouse official docs
More from apideck-libraries/api-skills
apideck-connector-coverage
Check Apideck connector API coverage before building integrations. Use when determining which operations a connector supports, comparing connector capabilities, or diagnosing why an API call fails with a specific connector. Teaches agents to query the Connector API for real-time coverage data.
18apideck-best-practices
Best practices for building Apideck integrations. Covers authentication patterns, pagination, error handling, connection management with Vault, webhook setup, and common pitfalls. Use when designing or reviewing any Apideck integration regardless of language.
18apideck-rest
Apideck Unified REST API reference for any language. Use when building integrations with accounting software (QuickBooks, Xero, NetSuite), CRMs (Salesforce, HubSpot, Pipedrive), HRIS platforms (Workday, BambooHR), file storage (Google Drive, Dropbox, Box), ATS systems (Greenhouse, Lever), e-commerce, or any of Apideck's 200+ connectors using direct HTTP calls. Covers authentication headers, CRUD operations, cursor-based pagination, filtering, sorting, error handling, rate limiting, pass-through parameters, and webhooks. Language-agnostic — works with curl, fetch, axios, httpx, or any HTTP client.
16apideck-portman
API contract testing with Portman by Apideck. Use when generating Postman collections from OpenAPI specs, writing contract tests, variation tests, integration tests, fuzz testing, or setting up CI/CD API test pipelines. Portman converts OpenAPI 3.x specs into Postman collections with auto-generated test suites.
14apideck-node
Apideck Unified API integration patterns for TypeScript and Node.js. Use when building integrations with accounting software (QuickBooks, Xero, NetSuite), CRMs (Salesforce, HubSpot, Pipedrive), HRIS platforms (Workday, BambooHR), file storage (Google Drive, Dropbox, Box), ATS systems (Greenhouse, Lever), e-commerce, or any of Apideck's 200+ connectors. Covers the @apideck/unify SDK, authentication, CRUD operations, pagination, filtering, webhooks, and Vault connection management.
14apideck-codegen
Generate typed API clients from Apideck OpenAPI specs using code generators. Use when the user wants to generate custom SDK clients, typed models, API stubs, or server scaffolding from Apideck's published OpenAPI specifications. Covers openapi-generator, Speakeasy, and Postman import workflows.
14