Step-by-step migration instructions
This guide includes updated read endpoints, pagination changes, recommendations for custom integrations, and a clear mapping of v1/v2 resources to their v3 equivalents. It’s designed to help you transition endpoints smoothly and efficiently.
Each table in this article is organized alphabetically and maps specific resources to their v1/v2 routes, the corresponding v3 equivalent, and any additional comments or considerations for those endpoints.
Pagination
In previous versions, pagination was implemented by passing page
and per_page
parameters. The backend would then use limit
and offset
to fetch the appropriate records. Additionally, links for next, prev, and last pages were included in the response headers. However, calculating the last page required a count of all matching records, which negatively impacted performance, especially with large datasets.
To address these performance issues, V3 introduces a cursor-based pagination system, eliminating the need for offset. This approach enhances efficiency and scalability.
Key changes in v3 pagination
No page
Parameter: The page
parameter is no longer supported. You may specify a per_page
parameter in the first request only to define the number of records per page.
Cursor-Based Links: To navigate between pages, the response headers include cursor-based links:
next
: URL for the next page (if available).prev
: URL for the previous page (if available).- Note: A
last
link is no longer provided.
Recommendations for custom integrations
We encourage users of custom integrations to adopt the Client Credentials Flow to familiarize themselves with the new authentication process in Harvest V3.
Note: The Client Credentials Flow is not available for Greenhouse partners. Partners must use the Authorization Code Grant Type.
Activity Feed | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/candidates/{id}/activity_feed |
V3 route | GET https://harvest.greenhouse.io/v3/notes |
Comments | Change in presentation of the objects where type is used as opposed to separating into various objects, for a more consistent object schema experience across all note types |
Approval Flows | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/jobs/{id}/approval_flows |
V3 route | GET https://harvest.greenhouse.io/v3/approval_flows GET https://harvest.greenhouse.io/v3/approver_groups GET https://harvest.greenhouse.io/v3/approvers GET https://harvest.greenhouse.io/v3/users |
Comments | requested_by_user_id → request_by_id priority → sort_order Deprecated approver_groups.job_id , you will have to retrieve this in the parent, approval flows objectDeprecated approver_groups.offer_id , you will have to retrieve this in the parent, approval flows objectname → user_id , all approver user related information will need to be retrieved from the users endpoint |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/approval_flows/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/approval_flows GET https://harvest.greenhouse.io/v3/approver_groups GET https://harvest.greenhouse.io/v3/approvers GET https://harvest.greenhouse.io/v3/users |
Comments | requested_by_user_id → request_by_id priority → sort_order Deprecated approver_groups.job_id , you will have to retrieve this in the parent, approval flows objectDeprecated approver_groups.offer_id , you will have to retrieve this in the parent, approval flows objectname → user_id , all approver user related information will need to be retrieved from the users endpoint |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/users/{user_id}/pending_approvals |
V3 route | GET https://harvest.greenhouse.io/v3/approval_flows GET https://harvest.greenhouse.io/v3/approver_groups GET https://harvest.greenhouse.io/v3/approvers GET https://harvest.greenhouse.io/v3/users |
Comments | Please use the status attribute in the query filters in the approvers object to view all users with pending approvals.requested_by_user_id → request_by_id priority → sort_order Deprecated approver_groups.job_id , you will have to retrieve this in the parent, approval flows objectDeprecated approver_groups.offer_id , you will have to retrieve this in the parent, approval flows objectname → user_id , all approver user related information will need to be retrieved from the users endpoint |
Candidates | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/candidates |
V3 route | GET https://harvest.greenhouse.io/v3/candidates GET https://harvest.greenhouse.io/v3/applications GET https://harvest.greenhouse.io/v3/attachments GET https://harvest.greenhouse.io/v3/candidate_educations GET https://harvest.greenhouse.io/v3/candidate_employments GET https://harvest.greenhouse.io/v3/referrers |
Comments | Deprecated photo_url Deprecated attachments , retrieve from the Attachments endpoint, by applicationDeprecated application_ids and applications [] , you can filter the Application endpoint by candidate_id Recruiter and Coordinator objects have been moved to the Applications object is_private → private For brevity, the changes in v1 Application endpoints are not reflected in this entry. Please visit the Application endpoint detail if you were retrieving application-level data from the v1 Candidate endpoint Candidate educations are retrieved via the custom field options endpoint |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/candidates/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/candidates GET https://harvest.greenhouse.io/v3/applications GET https://harvest.greenhouse.io/v3/attachments GET https://harvest.greenhouse.io/v3/candidate_educations GET https://harvest.greenhouse.io/v3/candidate_employments GET https://harvest.greenhouse.io/v3/referrers |
Comments | Deprecated photo_url Deprecated attachments , retrieve from the Attachments endpoint, by applicationDeprecated application_ids and applications [] , you can filter the Application endpoint by candidate_id Recruiter and Coordinator objects have been moved to the Applications object is_private → private For brevity, the changes in v1 Application endpoints are not reflected in this entry. Please visit the Application endpoint detail if you were retrieving application-level data from the v1 Candidate endpoint Candidate educations are retrieved via the custom field options endpoint |
Candidate Tags | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/candidates/{id}/tags |
V3 route | GET https://harvest.greenhouse.io/v3/candidates |
Comments | Available in the tags array |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/tags/candidate |
V3 route | GET https://harvest.greenhouse.io/v3/candidate_tags |
Comments | No notable changes |
Close Reasons | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/close_reasons |
V3 route | https://harvest.greenhouse.io/v3/close_reasons |
Comments | No notable changes |
Custom Field Options | |
---|---|
V1/V2 route | https://harvest.greenhouse.io/v3/custom_field_options |
V3 route | GET https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options |
Comments | priority → sort_order |
Demographic Answer Options | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/answer_options |
V3 route | GET https://harvest.greenhouse.io/v3/demographic_answer_options |
Comments | Deprecated translations: [] |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/questions/{id}/answer_options |
V3 route | GET https://harvest.greenhouse.io/v3/demographic_answer_options |
Comments | Deprecated translations: [] |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/answer_options/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/demographic_answer_options |
Comments | Deprecated translations: [] |
Demographic Answers | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/answers |
V3 route | GET https://harvest.greenhouse.io/v3/demographic_answers |
Comments | No notable changes |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/applications/{id}/demographics/answers |
V3 route | GET https://harvest.greenhouse.io/v3/demographic_answers |
Comments | No notable changes |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/answers/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/demographic_answers |
Comments | No notable changes |
Demographic Question Sets | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/question_sets |
V3 route | https://harvest.greenhouse.io/v3/demographic_question_sets |
Comments | No notable changes |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/question_sets/{id} |
V3 route | https://harvest.greenhouse.io/v3/demographic_question_sets |
Comments | Deprecated translations: [] |
Demographic Questions | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/questions |
V3 route | https://harvest.greenhouse.io/v3/demographic_questions |
Comments | Deprecated translations: [] |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/question_sets/{id}/questions |
V3 route | https://harvest.greenhouse.io/v3/demographic_questions |
Comments | Deprecated translations: [] |
*** | |
V1/V2 route | GET https://harvest.greenhouse.io/v1/demographics/questions/{id} |
V3 route | https://harvest.greenhouse.io/v3/demographic_questions |
Comments | Deprecated translations: [] |
Departments | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/departments |
V3 route | GET https://harvest.greenhouse.io/v3/departments |
Comments | Deprecated child_ids , child_department_external_ids , parent_departmental_external_id Removed render_as=tree |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/departments/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/departments |
Comments | Deprecated child_ids , child_department_external_ids , parent_departmental_external_id Removed render_as=tree |
Educations (Degrees) | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/degrees |
V3 route | GET https://harvest.greenhouse.io/v3/custom_field_options?field_key=degree |
Comments | Deprecated old endpoint to reflect candidate degrees as a custom field with multiple options |
Educations (Disciplines) | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/disciplines |
V3 route | GET https://harvest.greenhouse.io/v3/custom_field_options?field_key=discipline |
Comments | Deprecated old endpoint to reflect candidate disciplines as a custom field with multiple options |
Educations (Schools) | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/schools |
V3 route | GET https://harvest.greenhouse.io/v3/custom_field_options?field_key=school_name |
Comments | Deprecated old endpoint to reflect candidate schools as a custom field with multiple options |
Email Templates | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/email_templates |
V3 route | GET https://harvest.greenhouse.io/v3/email_templates |
Comments | cc → recipients |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/email_templates/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/email_templates |
Comments | cc → recipients |
EEOC | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/eeoc |
V3 route | GET https://harvest.greenhouse.io/v3/eeoc |
Comments | No notable changes |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/applications/{id}/eeoc |
V3 route | GET https://harvest.greenhouse.io/v3/eeoc |
Comments | No notable changes |
Future User Job Permissions | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/users/{id}/permissions/future_jobs |
V3 route | https://harvest.greenhouse.io/v3/future_job_permissions https://harvest.greenhouse.io/v3/departments https://harvest.greenhouse.io/v3/offices |
Comments | - |
Hiring Team | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/jobs/{id}/hiring_team |
V3 route | GET https://harvest.greenhouse.io/v3/job_hiring_managers GET https://harvest.greenhouse.io/v3/job_owners |
Comments | The v3 Job Owners endpoint contains recruiters, coordinators, and sourcers. |
Job Post Custom Locations | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/job_posts/{id}/custom_locations |
V3 route | https://harvest.greenhouse.io/v3/job_board_custom_locations |
Comments | Job post custom location id is now in the job board custom locations |
Jobs | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/jobs |
V3 route | GET https://harvest.greenhouse.io/v3/jobs GET https://harvest.greenhouse.io/v3/job_hiring_managers GET https://harvest.greenhouse.io/v3/job_owners GET https://harvest.greenhouse.io/v3/openings GET https://harvest.greenhouse.io/v3/users GET https://harvest.greenhouse.io/v3/close_reasons |
Comments | departments [] → department_id offices [] → office_ids [] openings.status → openings.open |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/jobs/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/jobs GET https://harvest.greenhouse.io/v3/job_hiring_managers GET https://harvest.greenhouse.io/v3/job_owners GET https://harvest.greenhouse.io/v3/openings GET https://harvest.greenhouse.io/v3/users GET https://harvest.greenhouse.io/v3/close_reasons |
Comments | departments [] → department_id offices [] → office_ids [] openings.status → openings.open |
Offers | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/offers |
V3 route | https://harvest.greenhouse.io/v3/offers https://harvest.greenhouse.io/v3/openings |
Comments | sent_at → sent_on starts_at → starts_on |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/applications/{application_id}/offers |
V3 route | https://harvest.greenhouse.io/v3/offers https://harvest.greenhouse.io/v3/openings |
Comments | sent_at → sent_on starts_at → starts_on |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/applications/{application_id}/offers/current_offer |
V3 route | https://harvest.greenhouse.io/v3/offers https://harvest.greenhouse.io/v3/openings |
Comments | Please use the current_only boolean in our query filters.sent_at → sent_on starts_at → starts_on |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/offers/{id} |
V3 route | https://harvest.greenhouse.io/v3/offers https://harvest.greenhouse.io/v3/openings |
Comments | sent_at → sent_on starts_at → starts_on |
Offices | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/offices |
V3 route | https://harvest.greenhouse.io/v3/offices |
Comments | We no longer permit rendering as a tree Deprecated child_ids primary_contact_user_id → primary_in_house_contact_id location is now flat, as opposed to the pattern in v1 offices endpoint |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/offices/{id} |
V3 route | https://harvest.greenhouse.io/v3/offices |
Comments | We no longer permit rendering as a tree Deprecated child_ids primary_contact_user_id → primary_in_house_contact_id location is now flat, as opposed to the pattern in v1 offices endpoint |
Openings | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/jobs/{job_id}/openings |
V3 route | GET https://harvest.greenhouse.io/v3/openings GET https://harvest.greenhouse.io/v3/close_reasons |
Comments | status → open (enum → boolean)priority → sort_order |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/jobs/{job_id}/openings/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/openings GET https://harvest.greenhouse.io/v3/close_reasons |
Comments | status → open (enum → boolean)priority → sort_order |
Prospect Pools | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/prospect_pools |
V3 route | https://harvest.greenhouse.io/v3/prospect_pools https://harvest.greenhouse.io/v3/prospect_pool_stages |
Comments | - |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/prospect_pools/{id} |
V3 route | https://harvest.greenhouse.io/v3/prospect_pools https://harvest.greenhouse.io/v3/prospect_pool_stages |
Comments | - |
Rejection Reasons | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/rejection_reasons |
V3 route | https://harvest.greenhouse.io/v3/rejection_reasons |
Comments | No notable changes |
Scheduled Interviews | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/scheduled_interviews |
V3 route | GET https://harvest.greenhouse.io/v3/interviews GET https://harvest.greenhouse.io/v3/users GET https://harvest.greenhouse.io/v3/interviewers |
Comments | organizer → organizer_id start.date_time → starts_at or all_day_start_on end.date_time → ends_at or all_day_end_on We have also introduced all_day_start_on and all_day_end_on for interviews that are scheduled without specified times of the day. |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/applications/{id}/scheduled_interviews |
V3 route | GET https://harvest.greenhouse.io/v3/interviews GET https://harvest.greenhouse.io/v3/users GET https://harvest.greenhouse.io/v3/interviewers |
Comments | organizer → organizer_id start.date_time → starts_at or all_day_start_on end.date_time → ends_at or all_day_end_on We have also introduced all_day_start_on and all_day_end_on for interviews that are scheduled without specified times of the day. |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/scheduled_interviews/{id} |
V3 route | GET https://harvest.greenhouse.io/v3/interviews GET https://harvest.greenhouse.io/v3/users GET https://harvest.greenhouse.io/v3/interviewers |
Comments | organizer → organizer_id start.date_time → starts_at or all_day_start_on end.date_time → ends_at or all_day_end_on We have also introduced all_day_start_on and all_day_end_on for interviews that are scheduled without specified times of the day. |
Sources | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/sources |
V3 route | GET https://harvest.greenhouse.io/v3/sources |
Comments | No notable changes |
Tracking Links | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/tracking_links/{token} |
V3 route | GET https://harvest.greenhouse.io/v3/tracking_links GET https://harvest.greenhouse.io/v3/sources GET https://harvest.greenhouse.io/v3/users GET https://harvest.greenhouse.io/v3/referrers GET https://boards-api.greenhouse.io/v1/boards/{board_token} |
Comments | job_board → job_board_id source → source_id credited_to → referrer_id Job board data is publicly available, there is no authentication required for job board endpoints. |
User Job Permissions | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/users/{id}/permissions/jobs |
V3 route | https://harvest.greenhouse.io/v3/user_job_permissions |
Comments | user_role_id → role_id |
User Roles | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/user_roles |
V3 route | GET https://harvest.greenhouse.io/v3/user_roles |
Comments | type → role_type |
Users | |
---|---|
V1/V2 route | GET https://harvest.greenhouse.io/v1/users |
V3 route | https://harvest.greenhouse.io/v3/users https://harvest.greenhouse.io/v3/user_emails https://harvest.greenhouse.io/v3/departments https://harvest.greenhouse.io/v3/offices |
Comments | disabled → deactivated primary_email_address → primary_email |
*** | *** |
V1/V2 route | GET https://harvest.greenhouse.io/v1/users/{id} |
V3 route | https://harvest.greenhouse.io/v3/users https://harvest.greenhouse.io/v3/user_emails https://harvest.greenhouse.io/v3/departments https://harvest.greenhouse.io/v3/offices |
Comments | disabled → deactivated |
[Resource] | |
---|---|
V1/V2 route | |
V3 route | |
Comments |
Updated 15 days ago