Skip to main content

Greenhouse

This page contains the setup guide and reference information for the Greenhouse source connector.

Prerequisites

The connector authenticates to Greenhouse Harvest v3 with OAuth 2.0 Authorization Code through Airbyte's registered Greenhouse partner application. You don't create, request, or register a Greenhouse OAuth application of your own: Greenhouse issues Harvest v3 partner credentials only to integration partners, not to Greenhouse customers, and doesn't permit customers to connect through their own applications. Airbyte supplies the client ID and client secret during the consent flow.

To set up the source, you need:

  • An Airbyte Cloud workspace. The consent flow relies on Airbyte's partner credentials, which are only available in Airbyte Cloud.
  • A Greenhouse user who is a Site Admin to approve the consent flow.

The consent flow requests these scopes; approve all of them:

  • harvest:applications:list
  • harvest:approval_flows:list
  • harvest:candidate_tags:list
  • harvest:candidates:list
  • harvest:close_reasons:list
  • harvest:custom_field_options:list
  • harvest:custom_fields:list
  • harvest:demographic_answer_options:list
  • harvest:demographic_answers:list
  • harvest:demographic_question_sets:list
  • harvest:demographic_questions:list
  • harvest:departments:list
  • harvest:eeoc:list
  • harvest:email_templates:list
  • harvest:interviews:list
  • harvest:job_interview_stages:list
  • harvest:job_posts:list
  • harvest:jobs:list
  • harvest:notes:list
  • harvest:offers:list
  • harvest:offices:list
  • harvest:openings:list
  • harvest:prospect_pools:list
  • harvest:rejection_reasons:list
  • harvest:scorecards:list
  • harvest:sources:list
  • harvest:user_job_permissions:list
  • harvest:user_roles:list
  • harvest:users:list

Harvest v3 rejects requests to its list endpoints from any user who isn't a Site Admin, and the connector fails the sync with a configuration error. A missing scope produces the same failure for the streams that depend on it, so grant every scope in the list unless you plan to leave the corresponding streams disabled. Grant harvest:users:list in every case: the connection check reads the users stream, so the source fails to set up without it even if you never sync that stream.

Set up the Greenhouse connector in Airbyte

  1. Log into your Airbyte Cloud account.
  2. Click Sources and then click + New source.
  3. On the Set up the source page, select Greenhouse from the Source type dropdown.
  4. Enter the name for the Greenhouse connector.
  5. Click Authenticate, sign in to Greenhouse as a Site Admin, and approve the requested scopes. Airbyte fills in its partner application's client ID and client secret and stores the resulting refresh token. You don't enter any Greenhouse credentials yourself.
  6. Optionally enter a Start date in UTC using the format YYYY-MM-DDTHH:MM:SSZ. Records updated before this date will not be replicated. If omitted, the connector replicates all history.
  7. Optionally change Number of concurrent threads. The connector syncs with 2 threads by default and accepts 1 to 8. All threads share one Greenhouse rate limit, so raise this only if your Greenhouse account can absorb more API traffic, and lower it to 1 if syncs fail with rate-limit errors.
  8. Click Set up source.
warning

Greenhouse refresh tokens expire after approximately 24 hours of non-use and rotate on every refresh. Set connections to sync more often than once a day. A connection left paused, turned off, or failing for more than 24 hours requires re-running the consent flow from the source settings. See Troubleshooting for the error this produces.

Supported sync modes

The Greenhouse source connector supports the following sync modes:

Supported Streams

The table lists the stream names as they appear in Airbyte, with the Harvest v3 endpoint each one reads. Start date applies only to the incremental streams. Full refresh streams always read everything the endpoint returns, and the five child streams pull parent IDs over your full Greenhouse history, so their coverage doesn't depend on Start date either. demographics_answer_options, demographics_questions, and demographics_question_sets are full refresh because Harvest v3 exposes no date filter on those endpoints.

StreamSync modeNotes
activity_feedFull refreshNotes for each candidate in candidates
applicationsIncremental (updated_at)
approvalsFull refresh
candidatesIncremental (updated_at)
close_reasonsFull refresh
custom_field_optionsFull refreshEvery custom field option in the account
custom_fieldsFull refresh
degreesFull refreshCustom field options for the degree field
demographics_answer_optionsFull refresh
demographics_answersIncremental (updated_at)
demographics_answers_answer_optionsFull refreshAnswer options for each question in demographics_questions
demographics_question_setsFull refresh
demographics_question_sets_questionsFull refreshQuestions in each set in demographics_question_sets
demographics_questionsFull refresh
departmentsFull refresh
disciplinesFull refreshCustom field options for the discipline field
eeocIncremental (submitted_at)
email_templatesIncremental (updated_at)
interviewsIncremental (updated_at)
job_postsIncremental (updated_at)Includes deleted posts
job_stagesIncremental (updated_at)
jobsIncremental (updated_at)
jobs_openingsFull refreshOpenings for each job in jobs
offersIncremental (updated_at)
officesFull refresh
prospect_poolsFull refresh
rejection_reasonsFull refreshIncludes the reasons Greenhouse ships with
schoolsFull refreshCustom field options for the school_name field
scorecardsIncremental (updated_at)
sourcesFull refresh
tagsFull refreshCandidate tags
user_permissionsFull refreshJob permissions for each user in users
user_rolesFull refresh
usersIncremental (updated_at)Includes integration service users

Performance considerations

Greenhouse rate limits Harvest v3 in fixed 30-second windows. Each response reports your remaining allowance in X-RateLimit-Remaining and the time the current window resets in X-RateLimit-Reset. Greenhouse doesn't publish a fixed request ceiling for Harvest v3, and it applies different allowances to custom and partner integrations, so the connector holds itself to a conservative 50 requests per window, tracks those headers, and waits for the Retry-After interval when Greenhouse returns 429. Because every thread draws on the same window, syncing many streams at a high Number of concurrent threads is a common cause of rate-limit errors. Lower that value before creating an issue about rate limits.

The connector requests 500 records per page, the Harvest v3 maximum, and then follows the cursor links Greenhouse returns, so large accounts still page through many requests per stream.

Limitations

  • job_posts includes job posts that were deleted in Greenhouse. Harvest v3 excludes deleted posts by default, and the connector requests both active and deleted posts. Filter on active downstream if you only want live posts.
  • eeoc replicates on submitted_at. A correction to an EEOC response after submission doesn't change submitted_at, so incremental syncs never re-read it. Refresh the stream if you need corrections to land.
  • custom_field_options reads every custom field option in your account, which makes it a superset of degrees, disciplines, and schools. Those three streams read the same Greenhouse endpoint filtered to one field key and share the same primary keys, so enabling all four writes the same option rows to four destination tables. Enable only the ones you need.
  • users includes integration service users, which Greenhouse hides by default. Service accounts have no email address, so primary_email is empty for those records.
  • rejection_reasons includes the default reasons Greenhouse ships with, not only the ones your organization added.

Troubleshooting

Sync fails with a configuration error asking you to re-authenticate

The connector can't renew its access token because Greenhouse rejected the refresh token. Starting with version 1.0.1, the connector reports this as a configuration error instead of a system error. The Greenhouse error code in the sync log tells you what to fix:

  • invalid_grant: the refresh token expired or was invalidated. This happens when the connection hasn't synced for more than about 24 hours, or when another tool used the same refresh token, which causes Greenhouse to issue a new one that Airbyte never receives. Open the source settings, click Authenticate, and complete the consent flow again to store a new refresh token. Run the consent flow separately for each Airbyte source; don't reuse one refresh token across sources or other tools.
  • invalid_client or unauthorized_client: Greenhouse rejected the partner application credentials Airbyte used for the refresh, or that application isn't allowed to use the refresh token grant. Open the source settings, click Authenticate, and complete the consent flow again. If the error persists, contact Airbyte support; there are no credentials for you to correct on your side.

Sync fails with a 403 configuration error on a stream

The authorizing user isn't a Site Admin, or the consent flow didn't include the scope for that stream. Compare the scopes in Prerequisites with the ones you approved, then re-run the consent flow as a Site Admin.

Migration from Harvest v1 before the v1/v2 sunset

Version 1.0.0 migrates the 33 streams carried over from 0.8.1 from Harvest v1 to Harvest v3 and adds the new custom_field_options stream, for 34 streams in total, because Greenhouse has scheduled the end of support for Harvest v1 and v2 together on 2026-08-31. It also replaces API-key authentication with OAuth Authorization Code authentication for every deployment and introduces an optional Start date that preserves the previous full-history behavior when omitted. We recommend creating a new connection on 1.0.0 rather than refreshing the existing one; see the upgrade paths before upgrading.

IP allow list

If you use Airbyte Cloud and your organization restricts access to specific IPs, add the Airbyte Cloud IP addresses to your allow list.

Reference

Config fields reference

Field
Type
Property name
object
credentials
integer
num_workers
string
start_date

Changelog

Expand to review
VersionDatePull RequestSubject
1.0.22026-09-0285306Clarify in the spec that OAuth credentials come from Airbyte's Greenhouse partner application and must not be requested from Greenhouse
1.0.12026-09-0285300Surface expired or rotated refresh tokens (invalid_grant) as a re-authenticate config error instead of a system error
1.0.02026-08-2884846Breaking migration from Harvest v1 to Harvest v3 with OAuth. See the migration guide.
0.8.12026-08-1884641Update dependencies
0.8.02026-08-1283811Send pagination page-size parameters only on first-page requests and use fully-qualified per-stream URLs in preparation for the Harvest v3 migration.
0.7.332026-08-1183956Update dependencies
0.7.322026-07-2883194Update to CDK 7.23.8 (fixes AirbyteCustomCodeNotPermittedError for bundled custom components) and remove the temporary Cloud version override
0.7.312026-07-281082Roll Cloud back to 0.7.29 — 0.7.30 is built on SDM 7.23.7, which breaks bundled custom components
0.7.302026-07-2882944Update dependencies
0.7.292026-07-2182444Update dependencies
0.7.282026-07-1481887Update dependencies
0.7.272026-06-3081129Update dependencies
0.7.262026-06-2380487Update dependencies
0.7.252026-06-1679888Update dependencies
0.7.242026-06-0979354Update dependencies
0.7.232026-06-0278766Update dependencies
0.7.222026-05-1578119Set the default concurrency to 2 and expose the number of concurrent threads as a user-configurable option.
0.7.22-rc.32026-05-1278052Reduce default_concurrency to 3 for concurrency tuning after rate-limit failures at higher settings.
0.7.22-rc.22026-05-0878006Concurrency tuning iteration: bump default_concurrency to 5
0.7.22-rc.12026-05-0677826Start concurrency tuning at default_concurrency=4 (Path A) and enable progressive rollout
0.7.212026-04-2877287Update dependencies
0.7.202026-04-2176637Update dependencies
0.7.192026-03-3175729Update dependencies
0.7.182026-03-1774919Update dependencies
0.7.172026-03-1074688Update dependencies
0.7.162026-03-0374176Update dependencies
0.7.152026-02-1073107Update dependencies
0.7.142026-02-0372661Update dependencies
0.7.132026-01-2071894Update dependencies
0.7.122026-01-1471700Update dependencies
0.7.112025-12-1870503Update dependencies
0.7.102025-11-2570056Update dependencies
0.7.92025-11-1869420Update dependencies
0.7.82025-10-2968823Update dependencies
0.7.72025-10-2168226Update dependencies
0.7.62025-10-1467896Update dependencies
0.7.52025-10-0767399Update dependencies
0.7.42025-09-3066408Update dependencies
0.7.32025-09-0965896Update dependencies
0.7.22025-08-2864973Update dependencies
0.7.12025-08-2665510Fix custom migrations to reference DeclarativeStream Pydantic model instead of runtime component
0.7.02025-07-0762830Promoting release candidate 0.7.0-rc.1 to a main version.
0.7.0-rc.12025-06-2947283Migrate to Manifest-only
0.6.12025-03-2253800Update dependencies
0.6.02025-03-1455774Promoting release candidate 0.6.0-rc.1 to a main version.
0.6.0-rc.12025-03-1454702Update to latest airbyte-cdk, remove custom cursors.
0.5.322025-02-0152724Update dependencies
0.5.312025-01-2551842Update dependencies
0.5.302025-01-1151214Update dependencies
0.5.292024-12-2850632Update dependencies
0.5.282024-12-2150109Update dependencies
0.5.272024-12-1449248Starting with this version, the Docker image is now rootless. Please note that this and future versions will not be compatible with Airbyte versions earlier than 0.64
0.5.262024-12-1248996Update dependencies
0.5.252024-10-2947110Update dependencies
0.5.242024-10-2347306Add 'job_post_id' to applications stream scehma
0.5.232024-10-1246828Update dependencies
0.5.222024-10-0546506Update dependencies
0.5.212024-09-2846159Update dependencies
0.5.202024-09-2145834Update dependencies
0.5.192024-09-1745625Change check stream
0.5.182024-09-1445476Update dependencies
0.5.172024-09-0745229Update dependencies
0.5.162024-08-3144755Update dependencies
0.5.152024-08-1744246Update dependencies
0.5.142024-08-1043595Update dependencies
0.5.132024-08-0343160Update dependencies
0.5.122024-07-2742816Update dependencies
0.5.112024-07-2042240Update dependencies
0.5.102024-07-1341787Update dependencies
0.5.92024-07-1041215Update dependencies
0.5.82024-07-1039601Move spec to manifest, fix readme
0.5.72024-07-0640882Update dependencies
0.5.62024-06-2540451Update dependencies
0.5.52024-06-2239968Update dependencies
0.5.42024-06-0639247[autopull] Upgrade base image to v1.2.2
0.5.32024-04-1936640Updating to 0.80.0 CDK
0.5.22024-04-1236640schema descriptions
0.5.12024-03-1235988Unpin CDK version
0.5.02024-02-2035465Per-error reporting and continue sync on stream failures
0.4.52024-02-0935077Manage dependencies with Poetry.
0.4.42023-11-2932397Increase test coverage and migrate to base image
0.4.32023-09-2030648Update candidates.json
0.4.22023-08-0228969Update CDK version
0.4.12023-06-2827773Update following state breaking changes
0.4.02023-04-2625332Add new streams: ActivityFeed, Approvals, Disciplines, Eeoc, EmailTemplates, Offices, ProspectPools, Schools, Tags, UserPermissions, UserRoles
0.3.12023-03-0623231Publish using low-code CDK Beta version
0.3.02022-10-1918154Extend Users stream schema
0.2.112022-09-2717239Always install the latest version of Airbyte CDK
0.2.102022-09-0516338Implement incremental syncs & fix SATs
0.2.92022-08-2215800Bugfix to allow reading sentry.yaml and schemas at runtime
0.2.82022-08-1015344Migrate connector to config-based framework
0.2.72022-04-1511941Correct Schema data type for Applications, Candidates, Scorecards and Users
0.2.62021-11-087607Implement demographics streams support. Update SAT for demographics streams
0.2.52021-09-226377Refactor the connector to use CDK. Implement additional stream support
0.2.42021-09-156238Add identification of accessible streams for API keys with limited permissions