agentleFS
apideck-librariesapideck-libraries/api-skills/skills/greenhouse/SKILL.md

greenhouse

Skill4 starsChanged 3 months agoApache-2.0View on GitHub

Greenhouse integration via Apideck's ATS unified API — same methods work across every connector in ATS, switch by changing `serviceId`. Use when the user wants to read, write, or sync jobs, applicants, and applications in Greenhouse. Routes through Apideck with serviceId "greenhouse".

  • Reads credentials

2 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Apideck-managed credentials: not available — Greenhouse requires each integration to run on its own Greenhouse-issued partner credentials, …

    line 38
  2. Distinctive:

    Every record the integration creates or updates is attributed in Greenhouse to the user who authorized the connection, so have consumers …

    line 51
  3. Very specific:

    When an endpoint isn't covered by the ATS unified API, use Apideck's Proxy to call Greenhouse directly — Apideck injects auth headers and …

    line 178

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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

At a glance

  • Implementation difficulty: involved — Partnership Required + Harvest V3 Integration Review
  • Vendor partnership required: yes (Greenhouse Integration Partner Program) — Apply through the Greenhouse Integration Partner Program; joining provides Harvest API access and a sandbox for development. No self-service developer signup.
  • Apideck-managed credentials: not available — Greenhouse requires each integration to run on its own Greenhouse-issued partner credentials, entered once in the Apideck Dashboard.
  • Account type required: An active Greenhouse account with a Harvest V3 partner integration provisioned.
  • Consumer access level: Site Admin (or a Site-Admin service account) — Harvest V3 list endpoints return 403 for any other user; the connection runs with that user's permissions.
  • Sandbox: available — Sandbox and demo organizations are granted during partner onboarding; no self-service developer sandbox. Greenhouse accounts include one on Pro plans only.
  • Costs: Greenhouse publishes no fee for the Integration Partner Program or Harvest API access; consumers pay for their own Greenhouse plan. No free trial.
  • Rate limits: Fixed 30-second window; no published ceiling — the X-RateLimit-* response headers are authoritative. Exceeding it returns HTTP 429 with Retry-After.
  • Authentication: Authorization Code Grant against Harvest V3.
  • Webhooks: Virtual webhooks — Apideck polls Greenhouse and emits ats.applicant.created, ats.applicant.updated, ats.job.created, and ats.job.updated.

Important to know:

  • Greenhouse shuts down Harvest V1 and V2 on August 31, 2026. Connections created with the older API-key authentication stop working on that date — Greenhouse must sign off on your V3 review, and every existing consumer must re-authorize through the V3 OAuth flow, before then.
  • Refresh tokens rotate on every use and idle-expire after 24 hours. A connection that goes a full day without activity cannot refresh itself and must be re-authorized from Vault, which makes low-traffic or seasonal integrations especially prone to dropping out.
  • Every record the integration creates or updates is attributed in Greenhouse to the user who authorized the connection, so have consumers authorize deliberately — Greenhouse offers Site-Admin-only service accounts as a dedicated authorizing identity.

Facts synced from Apideck's connector metadata API — GET /connector/connectors/greenhouse (overview field) is the live, authoritative version.

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:

  1. Which Apideck unified API covers Greenhouse (ATS)
  2. The correct serviceId to pass on every call (greenhouse)
  3. 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, or apideck-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 entityApideck ATS resource
Jobjobs
Candidateapplicants
Applicationapplications
Job Post (external posting)exposed via jobs[].job_posts[]
Stage (pipeline stage)exposed via jobs[].stages[]
Scorecard / Interviewuse Proxy
Offerexposed 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-Of user 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 applicants and discriminates via applicant.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 source is a structured object; Apideck flattens to applicant.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

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.