diff --git a/.gitignore b/.gitignore
index f6fc8c00b25..b6d9999a7a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,7 @@ spec/reports
test/tmp
test/version_tmp
tmp
-*.DS_STORE
+*.DS_Store
build/
.cache
@@ -19,4 +19,6 @@ build/
.yardoc
_yardoc
doc/
-.idea/
\ No newline at end of file
+.idea/
+
+vendor/
\ No newline at end of file
diff --git a/.ruby-version b/.ruby-version
new file mode 100644
index 00000000000..a04abec9149
--- /dev/null
+++ b/.ruby-version
@@ -0,0 +1 @@
+2.6.10
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 59ee6a441e5..49b83dc3257 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,294 @@
# Changelog
+## Version 2.13.1
+
+*January 31, 2023*
+
+* Fix Vagrantfile gem install for ruby >= 2.6 (thanks @Cyb0rk)
+* Disable file watcher in run_build() for sake of qemu on arm64 (thanks @anapsix)
+* Expand deprecated git.io links to full url in docs (thanks @judge2020)
+* Add margin to paragraph following code-block on phones (thanks @tlhunter)
+* Bump nokogiri from 1.13.4 to 1.13.9
+* Bump rouge from 3.28.0 to 3.30.0
+* Bump redcarpet from 3.5.1 to 3.6.0
+* Bump middleman from 4.4.2 to 4.4.3
+* Bump middleman-syntax from 3.2.0 to 3.3.0
+* Bump webrick from 1.7.0 to 1.8.1
+
+## Version 2.13.0
+
+*April 22, 2022*
+
+* __Drop support for ruby 2.5__
+* Bump rouge from 3.26.1 to 3.28.0
+* Formally support ruby 3.1
+* Bump nokogiri from 1.12.5 to 1.13.4
+* Build docker images for multiple architectures (e.g. `aarch64`)
+* Remove `VOLUME` declaration from Dockerfile (thanks @aemengo)
+
+The security vulnerabilities reported against recent versions of nokogiri should not affect slate users with a regular setup.
+
+## Version 2.12.0
+
+*November 04, 2021*
+
+* Bump nokogiri from 1.12.3 to 1.12.5
+* Bump ffi from 1.15.0 to 1.15.4
+* Bump rouge from 3.26.0 to 3.26.1
+* Bump middleman from 4.4.0 to 4.4.2
+* Remove unnecessary files from docker images
+
+## Version 2.11.0
+
+*August 12, 2021*
+
+* __[Security]__ Bump addressable transitive dependency from 2.7.0 to 2.8.0
+* Support specifying custom meta tags in YAML front-matter
+* Bump nokogiri from 1.11.3 to 1.12.3 (minimum supported version is 1.11.4)
+* Bump middleman-autoprefixer from 2.10.1 to 3.0.0
+* Bump jquery from 3.5.1 to 3.6.0
+* Bump middleman from [`d180ca3`](https://github.com/middleman/middleman/commit/d180ca337202873f2601310c74ba2b6b4cf063ec) to 4.4.0
+
+## Version 2.10.0
+
+*April 13, 2021*
+
+* Add support for Ruby 3.0 (thanks @shaun-scale)
+* Add requirement for Git on installing dependencies
+* Bump nokogiri from 1.11.2 to 1.11.3
+* Bump middleman from 4.3.11 to [`d180ca3`](https://github.com/middleman/middleman/commit/d180ca337202873f2601310c74ba2b6b4cf063ec)
+
+## Version 2.9.2
+
+*March 30, 2021*
+
+* __[Security]__ Bump kramdown from 2.3.0 to 2.3.1
+* Bump nokogiri from 1.11.1 to 1.11.2
+
+## Version 2.9.1
+
+*February 27, 2021*
+
+* Fix Slate language tabs not working if localStorage is disabled
+
+## Version 2.9.0
+
+*January 19, 2021*
+
+* __Drop support for Ruby 2.3 and 2.4__
+* __[Security]__ Bump nokogiri from 1.10.10 to 1.11.1
+* __[Security]__ Bump redcarpet from 3.5.0 to 3.5.1
+* Specify slate is not supported on Ruby 3.x
+* Bump rouge from 3.24.0 to 3.26.0
+
+## Version 2.8.0
+
+*October 27, 2020*
+
+* Remove last trailing newline when using the copy code button
+* Rework docker image and make available at slatedocs/slate
+* Improve Dockerfile layout to improve caching (thanks @micvbang)
+* Bump rouge from 3.20 to 3.24
+* Bump nokogiri from 1.10.9 to 1.10.10
+* Bump middleman from 4.3.8 to 4.3.11
+* Bump lunr.js from 2.3.8 to 2.3.9
+
+## Version 2.7.1
+
+*August 13, 2020*
+
+* __[security]__ Bumped middleman from 4.3.7 to 4.3.8
+
+_Note_: Slate uses redcarpet, not kramdown, for rendering markdown to HTML, and so was unaffected by the security vulnerability in middleman.
+If you have changed slate to use kramdown, and with GFM, you may need to install the `kramdown-parser-gfm` gem.
+
+## Version 2.7.0
+
+*June 21, 2020*
+
+* __[security]__ Bumped rack in Gemfile.lock from 2.2.2 to 2.2.3
+* Bumped bundled jQuery from 3.2.1 to 3.5.1
+* Bumped bundled lunr from 0.5.7 to 2.3.8
+* Bumped imagesloaded from 3.1.8 to 4.1.4
+* Bumped rouge from 3.17.0 to 3.20.0
+* Bumped redcarpet from 3.4.0 to 3.5.0
+* Fix color of highlighted code being unreadable when printing page
+* Add clipboard icon for "Copy to Clipboard" functionality to code boxes (see note below)
+* Fix handling of ToC selectors that contain punctutation (thanks @gruis)
+* Fix language bar truncating languages that overflow screen width
+* Strip HTML tags from ToC title before displaying it in title bar in JS (backup to stripping done in Ruby code) (thanks @atic)
+
+To enable the new clipboard icon, you need to add `code_clipboard: true` to the frontmatter of source/index.html.md.
+See [this line](https://github.com/slatedocs/slate/blame/main/source/index.html.md#L19) for an example of usage.
+
+## Version 2.6.1
+
+*May 30, 2020*
+
+* __[security]__ update child dependency activesupport in Gemfile.lock to 5.4.2.3
+* Update Middleman in Gemfile.lock to 4.3.7
+* Replace Travis-CI with GitHub actions for continuous integration
+* Replace Spectrum with GitHub discussions
+
+## Version 2.6.0
+
+*May 18, 2020*
+
+__Note__: 2.5.0 was "pulled" due to a breaking bug discovered after release. It is recommended to skip it, and move straight to 2.6.0.
+
+* Fix large whitespace gap in middle column for sections with codeblocks
+* Fix highlighted code elements having a different background than rest of code block
+* Change JSON keys to have a different font color than their values
+* Disable asset hashing for woff and woff2 elements due to middleman bug breaking woff2 asset hashing in general
+* Move Dockerfile to Debian from Alpine
+* Converted repo to a [GitHub template](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)
+* Update sassc to 2.3.0 in Gemfile.lock
+
+## Version 2.5.0
+
+*May 8, 2020*
+
+* __[security]__ update nokogiri to ~> 1.10.8
+* Update links in example docs to https://github.com/slatedocs/slate from https://github.com/lord/slate
+* Update LICENSE to include full Apache 2.0 text
+* Test slate against Ruby 2.5 and 2.6 on Travis-CI
+* Update Vagrantfile to use Ubuntu 18.04 (thanks @bradthurber)
+* Parse arguments and flags for deploy.sh on script start, instead of potentially after building source files
+* Install nodejs inside Vagrantfile (thanks @fernandoaguilar)
+* Add Dockerfile for running slate (thanks @redhatxl)
+* update middleman-syntax and rouge to ~>3.2
+* update middleman to 4.3.6
+
+## Version 2.4.0
+
+*October 19, 2019*
+
+- Move repository from lord/slate to slatedocs/slate
+- Fix documentation to point at new repo link, thanks to [Arun](https://github.com/slash-arun), [Gustavo Gawryszewski](https://github.com/gawry), and [Daniel Korbit](https://github.com/danielkorbit)
+- Update `nokogiri` to 1.10.4
+- Update `ffi` in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
+- Update `rack` to 2.0.7 in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
+- Update middleman to `4.3` and relax constraints on middleman related gems, thanks to [jakemack](https://github.com/jakemack)
+- Add sass gem, thanks to [jakemack](https://github.com/jakemack)
+- Activate `asset_cache` in middleman to improve cacheability of static files, thanks to [Sam Gilman](https://github.com/thenengah)
+- Update to using bundler 2 for `Gemfile.lock`, thanks to [jakemack](https://github.com/jakemack)
+
+## Version 2.3.1
+
+*July 5, 2018*
+
+- Update `sprockets` in `Gemfile.lock` to fix security warnings
+
+## Version 2.3
+
+*July 5, 2018*
+
+- Allows strikethrough in markdown by default.
+- Upgrades jQuery to 3.2.1, thanks to [Tomi Takussaari](https://github.com/TomiTakussaari)
+- Fixes invalid HTML in `layout.erb`, thanks to [Eric Scouten](https://github.com/scouten) for pointing out
+- Hopefully fixes Vagrant memory issues, thanks to [Petter Blomberg](https://github.com/p-blomberg) for the suggestion
+- Cleans HTML in headers before setting `document.title`, thanks to [Dan Levy](https://github.com/justsml)
+- Allows trailing whitespace in markdown files, thanks to [Samuel Cousin](https://github.com/kuzyn)
+- Fixes pushState/replaceState problems with scrolling not changing the document hash, thanks to [Andrey Fedorov](https://github.com/anfedorov)
+- Removes some outdated examples, thanks [@al-tr](https://github.com/al-tr), [Jerome Dahdah](https://github.com/jdahdah), and [Ricardo Castro](https://github.com/mccricardo)
+- Fixes `nav-padding` bug, thanks [Jerome Dahdah](https://github.com/jdahdah)
+- Code style fixes thanks to [Sebastian Zaremba](https://github.com/vassyz)
+- Nokogiri version bump thanks to [Grey Baker](https://github.com/greysteil)
+- Fix to default `index.md` text thanks to [Nick Busey](https://github.com/NickBusey)
+
+Thanks to everyone who contributed to this release!
+
+## Version 2.2
+
+*January 19, 2018*
+
+- Fixes bugs with some non-roman languages not generating unique headers
+- Adds editorconfig, thanks to [Jay Thomas](https://github.com/jaythomas)
+- Adds optional `NestingUniqueHeadCounter`, thanks to [Vladimir Morozov](https://github.com/greenhost87)
+- Small fixes to typos and language, thx [Emir Ribić](https://github.com/ribice), [Gregor Martynus](https://github.com/gr2m), and [Martius](https://github.com/martiuslim)!
+- Adds links to Spectrum chat for questions in README and ISSUE_TEMPLATE
+
+## Version 2.1
+
+*October 30, 2017*
+
+- Right-to-left text stylesheet option, thanks to [Mohammad Hossein Rabiee](https://github.com/mhrabiee)
+- Fix for HTML5 history state bug, thanks to [Zach Toolson](https://github.com/ztoolson)
+- Small styling changes, typo fixes, small bug fixes from [Marian Friedmann](https://github.com/rnarian), [Ben Wilhelm](https://github.com/benwilhelm), [Fouad Matin](https://github.com/fouad), [Nicolas Bonduel](https://github.com/NicolasBonduel), [Christian Oliff](https://github.com/coliff)
+
+Thanks to everyone who submitted PRs for this version!
+
+## Version 2.0
+
+*July 17, 2017*
+
+- All-new statically generated table of contents
+ - Should be much faster loading and scrolling for large pages
+ - Smaller Javascript file sizes
+ - Avoids the problem with the last link in the ToC not ever highlighting if the section was shorter than the page
+ - Fixes control-click not opening in a new page
+ - Automatically updates the HTML title as you scroll
+- Updated design
+ - New default colors!
+ - New spacings and sizes!
+ - System-default typefaces, just like GitHub
+- Added search input delay on large corpuses to reduce lag
+- We even bumped the major version cause hey, why not?
+- Various small bug fixes
+
+Thanks to everyone who helped debug or wrote code for this version! It was a serious community effort, and I couldn't have done it alone.
+
+## Version 1.5
+
+*February 23, 2017*
+
+- Add [multiple tabs per programming language](https://github.com/lord/slate/wiki/Multiple-language-tabs-per-programming-language) feature
+- Upgrade Middleman to add Ruby 1.4.0 compatibility
+- Switch default code highlighting color scheme to better highlight JSON
+- Various small typo and bug fixes
+
+## Version 1.4
+
+*November 24, 2016*
+
+- Upgrade Middleman and Rouge gems, should hopefully solve a number of bugs
+- Update some links in README
+- Fix broken Vagrant startup script
+- Fix some problems with deploy.sh help message
+- Fix bug with language tabs not hiding properly if no error
+- Add `!default` to SASS variables
+- Fix bug with logo margin
+- Bump tested Ruby versions in .travis.yml
+
+## Version 1.3.3
+
+*June 11, 2016*
+
+Documentation and example changes.
+
+## Version 1.3.2
+
+*February 3, 2016*
+
+A small bugfix for slightly incorrect background colors on code samples in some cases.
+
+## Version 1.3.1
+
+*January 31, 2016*
+
+A small bugfix for incorrect whitespace in code blocks.
+
+## Version 1.3
+
+*January 27, 2016*
+
+We've upgraded Middleman and a number of other dependencies, which should fix quite a few bugs.
+
+Instead of `rake build` and `rake deploy`, you should now run `bundle exec middleman build --clean` to build your server, and `./deploy.sh` to deploy it to Github Pages.
+
## Version 1.2
-*June 20, 2014*
+*June 20, 2015*
**Fixes:**
@@ -21,7 +307,7 @@
## Version 1.1
-*July 27th, 2014*
+*July 27, 2014*
**Fixes:**
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000000..cc17fd98d59
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@lord.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b04fc955ca5..0179f20545e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,9 +1,8 @@
-# Contributing to Slate
+# Contributing to Greenhouse's API Documentation
-Thanks for contributing to Slate! A couple of quick guidelines for submitting PRs:
+Thanks for contributing to Greenhouse's API Documentation! A couple of quick guidelines for submitting PRs:
-- Please point your pull requests at the `dev` branch, and keep your commit messages clear and informative.
+- Please point your pull requests at the `master` branch, and keep your commit messages clear and informative.
- Please make sure your contributions work in the most recent version of Chrome, Firefox, and IE.
-- If you're implementing a new feature, even if it's relatively small, it's nice to open an issue before you start so that others know what you're working on and can help make sure you're on the right track.
Thanks again! Happy coding.
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 8183c7a8b04..077ef3b18a8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,12 +1,26 @@
-FROM ubuntu:trusty
-
-RUN apt-get update
-RUN apt-get install -yq ruby ruby-dev build-essential git
-RUN gem install --no-ri --no-rdoc bundler
-ADD Gemfile /app/Gemfile
-ADD Gemfile.lock /app/Gemfile.lock
-RUN cd /app; bundle install
-ADD . /app
+FROM ruby:2.6-slim
+
+WORKDIR /srv/slate
+
EXPOSE 4567
-WORKDIR /app
-CMD ["bundle", "exec", "middleman", "server"]
+
+COPY Gemfile .
+COPY Gemfile.lock .
+
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends \
+ build-essential \
+ git \
+ nodejs \
+ && gem install bundler \
+ && bundle install \
+ && apt-get remove -y build-essential git \
+ && apt-get autoremove -y \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY . /srv/slate
+
+RUN chmod +x /srv/slate/slate.sh
+
+ENTRYPOINT ["/srv/slate/slate.sh"]
+CMD ["build"]
diff --git a/Gemfile b/Gemfile
index 3a2a2e01a82..1b7e1c5483f 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,12 +1,14 @@
+ruby '>= 2.6'
source 'https://rubygems.org'
# Middleman
-gem 'middleman', '~>3.3.10'
+gem 'middleman', '~> 4.4'
gem 'middleman-gh-pages', '~> 0.0.3'
-gem 'middleman-syntax', '~> 2.0.0'
-gem 'middleman-autoprefixer', '~> 2.4.4'
-gem 'rouge', '~> 1.9.0'
-gem 'redcarpet', '~> 3.3.1'
-
-gem 'rake', '~> 10.4.2'
-gem 'therubyracer', '~> 0.12.1', platforms: :ruby
+gem 'middleman-syntax', '~> 3.2'
+gem 'middleman-autoprefixer', '~> 3.0'
+gem 'middleman-sprockets', '~> 4.1'
+gem 'rouge', '~> 3.21'
+gem 'redcarpet', '~> 3.6.0'
+gem 'nokogiri', '~> 1.13.3'
+gem 'sass'
+gem 'webrick'
diff --git a/Gemfile.lock b/Gemfile.lock
index f9978492816..b0e5e3452a4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,140 +1,149 @@
GEM
remote: https://rubygems.org/
specs:
- activesupport (4.1.11)
- i18n (~> 0.6, >= 0.6.9)
- json (~> 1.7, >= 1.7.7)
- minitest (~> 5.1)
- thread_safe (~> 0.1)
- tzinfo (~> 1.1)
- autoprefixer-rails (5.2.0.1)
- execjs
- json
- celluloid (0.16.0)
- timers (~> 4.0.0)
- chunky_png (1.3.4)
+ activesupport (6.1.6.1)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ zeitwerk (~> 2.3)
+ addressable (2.8.1)
+ public_suffix (>= 2.0.2, < 6.0)
+ autoprefixer-rails (10.2.5.0)
+ execjs (< 2.8.0)
+ backports (3.23.0)
coffee-script (2.4.1)
coffee-script-source
execjs
- coffee-script-source (1.9.1.1)
- compass (1.0.3)
- chunky_png (~> 1.2)
- compass-core (~> 1.0.2)
- compass-import-once (~> 1.0.5)
- rb-fsevent (>= 0.9.3)
- rb-inotify (>= 0.9)
- sass (>= 3.3.13, < 3.5)
- compass-core (1.0.3)
- multi_json (~> 1.0)
- sass (>= 3.3.0, < 3.5)
- compass-import-once (1.0.5)
- sass (>= 3.2, < 3.5)
+ coffee-script-source (1.12.2)
+ concurrent-ruby (1.2.0)
+ contracts (0.16.1)
+ dotenv (2.8.1)
erubis (2.7.0)
- execjs (2.5.2)
- ffi (1.9.8)
- haml (4.0.6)
+ execjs (2.7.0)
+ fast_blank (1.0.1)
+ fastimage (2.2.6)
+ ffi (1.15.5)
+ haml (5.2.2)
+ temple (>= 0.8.0)
tilt
- hike (1.2.3)
- hitimes (1.2.2)
- hooks (0.4.0)
- uber (~> 0.0.4)
- i18n (0.7.0)
- json (1.8.3)
- kramdown (1.7.0)
- libv8 (3.16.14.7)
- listen (2.10.1)
- celluloid (~> 0.16.0)
- rb-fsevent (>= 0.9.3)
- rb-inotify (>= 0.9)
- middleman (3.3.12)
+ hamster (3.0.0)
+ concurrent-ruby (~> 1.0)
+ hashie (3.6.0)
+ i18n (1.6.0)
+ concurrent-ruby (~> 1.0)
+ kramdown (2.4.0)
+ rexml
+ listen (3.8.0)
+ rb-fsevent (~> 0.10, >= 0.10.3)
+ rb-inotify (~> 0.9, >= 0.9.10)
+ memoist (0.16.2)
+ middleman (4.4.3)
coffee-script (~> 2.2)
- compass (>= 1.0.0, < 2.0.0)
- compass-import-once (= 1.0.5)
- execjs (~> 2.0)
- haml (>= 4.0.5)
- kramdown (~> 1.2)
- middleman-core (= 3.3.12)
- middleman-sprockets (>= 3.1.2)
- sass (>= 3.4.0, < 4.0)
- uglifier (~> 2.5)
- middleman-autoprefixer (2.4.4)
- autoprefixer-rails (~> 5.2.0)
- middleman-core (>= 3.3.3)
- middleman-core (3.3.12)
- activesupport (~> 4.1.0)
- bundler (~> 1.1)
+ haml (>= 4.0.5, < 6.0)
+ kramdown (>= 2.3.0)
+ middleman-cli (= 4.4.3)
+ middleman-core (= 4.4.3)
+ middleman-autoprefixer (3.0.0)
+ autoprefixer-rails (~> 10.0)
+ middleman-core (>= 4.0.0)
+ middleman-cli (4.4.3)
+ thor (>= 0.17.0, < 2.0)
+ middleman-core (4.4.3)
+ activesupport (>= 6.1, < 7.1)
+ addressable (~> 2.4)
+ backports (~> 3.6)
+ bundler (~> 2.0)
+ contracts (~> 0.13)
+ dotenv
erubis
- hooks (~> 0.3)
- i18n (~> 0.7.0)
- listen (>= 2.7.9, < 3.0)
- padrino-helpers (~> 0.12.3)
- rack (>= 1.4.5, < 2.0)
- rack-test (~> 0.6.2)
- thor (>= 0.15.2, < 2.0)
- tilt (~> 1.4.1, < 2.0)
+ execjs (~> 2.0)
+ fast_blank
+ fastimage (~> 2.0)
+ hamster (~> 3.0)
+ hashie (~> 3.4)
+ i18n (~> 1.6.0)
+ listen (~> 3.0)
+ memoist (~> 0.14)
+ padrino-helpers (~> 0.15.0)
+ parallel
+ rack (>= 1.4.5, < 3)
+ sassc (~> 2.0)
+ servolux
+ tilt (~> 2.0.9)
+ toml
+ uglifier (~> 3.0)
+ webrick
middleman-gh-pages (0.0.3)
rake (> 0.9.3)
- middleman-sprockets (3.4.2)
- middleman-core (>= 3.3)
- sprockets (~> 2.12.1)
- sprockets-helpers (~> 1.1.0)
- sprockets-sass (~> 1.3.0)
- middleman-syntax (2.0.0)
- middleman-core (~> 3.2)
- rouge (~> 1.0)
- minitest (5.7.0)
- multi_json (1.11.1)
- padrino-helpers (0.12.5)
- i18n (~> 0.6, >= 0.6.7)
- padrino-support (= 0.12.5)
- tilt (~> 1.4.1)
- padrino-support (0.12.5)
- activesupport (>= 3.1)
- rack (1.6.4)
- rack-test (0.6.3)
- rack (>= 1.0)
- rake (10.4.2)
- rb-fsevent (0.9.5)
- rb-inotify (0.9.5)
- ffi (>= 0.5.0)
- redcarpet (3.3.1)
- ref (1.0.5)
- rouge (1.9.0)
- sass (3.4.14)
- sprockets (2.12.3)
- hike (~> 1.2)
- multi_json (~> 1.0)
- rack (~> 1.0)
- tilt (~> 1.1, != 1.3.0)
- sprockets-helpers (1.1.0)
- sprockets (~> 2.0)
- sprockets-sass (1.3.1)
- sprockets (~> 2.0)
- tilt (~> 1.1)
- therubyracer (0.12.2)
- libv8 (~> 3.16.14.0)
- ref
- thor (0.19.1)
- thread_safe (0.3.5)
- tilt (1.4.1)
- timers (4.0.1)
- hitimes
- tzinfo (1.2.2)
- thread_safe (~> 0.1)
- uber (0.0.13)
- uglifier (2.7.1)
- execjs (>= 0.3.0)
- json (>= 1.8.0)
+ middleman-sprockets (4.1.1)
+ middleman-core (~> 4.0)
+ sprockets (>= 3.0)
+ middleman-syntax (3.3.0)
+ middleman-core (>= 3.2)
+ rouge (~> 3.2)
+ mini_portile2 (2.8.0)
+ minitest (5.17.0)
+ nokogiri (1.13.9)
+ mini_portile2 (~> 2.8.0)
+ racc (~> 1.4)
+ padrino-helpers (0.15.2)
+ i18n (>= 0.6.7, < 2)
+ padrino-support (= 0.15.2)
+ tilt (>= 1.4.1, < 3)
+ padrino-support (0.15.2)
+ parallel (1.22.1)
+ parslet (2.0.0)
+ public_suffix (5.0.1)
+ racc (1.6.0)
+ rack (2.2.6.2)
+ rake (13.2.1)
+ rb-fsevent (0.11.2)
+ rb-inotify (0.10.1)
+ ffi (~> 1.0)
+ redcarpet (3.6.0)
+ rexml (3.2.5)
+ rouge (3.30.0)
+ sass (3.7.4)
+ sass-listen (~> 4.0.0)
+ sass-listen (4.0.0)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ sassc (2.4.0)
+ ffi (~> 1.9)
+ servolux (0.13.0)
+ sprockets (3.7.2)
+ concurrent-ruby (~> 1.0)
+ rack (> 1, < 3)
+ temple (0.10.0)
+ thor (1.2.1)
+ tilt (2.0.11)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ uglifier (3.2.0)
+ execjs (>= 0.3.0, < 3)
+ webrick (1.8.1)
+ zeitwerk (2.6.0)
PLATFORMS
ruby
DEPENDENCIES
- middleman (~> 3.3.10)
- middleman-autoprefixer (~> 2.4.4)
+ middleman (~> 4.4)
+ middleman-autoprefixer (~> 3.0)
middleman-gh-pages (~> 0.0.3)
- middleman-syntax (~> 2.0.0)
- rake (~> 10.4.2)
- redcarpet (~> 3.3.1)
- rouge (~> 1.9.0)
- therubyracer (~> 0.12.1)
+ middleman-sprockets (~> 4.1)
+ middleman-syntax (~> 3.2)
+ nokogiri (~> 1.13.3)
+ redcarpet (~> 3.6.0)
+ rouge (~> 3.21)
+ sass
+ webrick
+
+RUBY VERSION
+ ruby 2.7.2p137
+
+BUNDLED WITH
+ 2.2.22
diff --git a/LICENSE b/LICENSE
index 5ceddf59f68..261eeb9e9f8 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,13 +1,201 @@
-Copyright 2008-2013 Concur Technologies, Inc.
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
-Licensed under the Apache License, Version 2.0 (the "License"); you may
-not use this file except in compliance with the License. You may obtain
-a copy of the License at
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- http://www.apache.org/licenses/LICENSE-2.0
+ 1. Definitions.
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-License for the specific language governing permissions and limitations
-under the License.
\ No newline at end of file
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
index efb7e1eb8cd..f8d3640d092 100644
--- a/README.md
+++ b/README.md
@@ -1,122 +1,90 @@
-Slate
-========
+
Features
------------
-* **Clean, intuitive design** — with Slate, the description of your API is on the left side of your documentation, and all the code examples are on the right side. Inspired by [Stripe's](https://stripe.com/docs/api) and [Paypal's](https://developer.paypal.com/webapps/developer/docs/api/) API docs. Slate is responsive, so it looks great on tablets, phones, and even print.
+* **Clean, intuitive design** — With Slate, the description of your API is on the left side of your documentation, and all the code examples are on the right side. Inspired by [Stripe's](https://stripe.com/docs/api) and [PayPal's](https://developer.paypal.com/webapps/developer/docs/api/) API docs. Slate is responsive, so it looks great on tablets, phones, and even in print.
-* **Everything on a single page** — gone are the days where your users had to search through a million pages to find what they wanted. Slate puts the entire documentation on a single page. We haven't sacrificed linkability, though. As you scroll, your browser's hash will update to the nearest header, so linking to a particular point in the documentation is still natural and easy.
+* **Everything on a single page** — Gone are the days when your users had to search through a million pages to find what they wanted. Slate puts the entire documentation on a single page. We haven't sacrificed linkability, though. As you scroll, your browser's hash will update to the nearest header, so linking to a particular point in the documentation is still natural and easy.
-* **Slate is just Markdown** — when you write docs with Slate, you're just writing Markdown, which makes it simple to edit and understand. Everything is written in Markdown — even the code samples are just Markdown code blocks!
+* **Slate is just Markdown** — When you write docs with Slate, you're just writing Markdown, which makes it simple to edit and understand. Everything is written in Markdown — even the code samples are just Markdown code blocks.
-* **Write code samples in multiple languages** — if your API has bindings in multiple programming languages, you easily put in tabs to switch between them. In your document, you'll distinguish different languages by specifying the language name at the top of each code block, just like with Github Flavored Markdown!
+* **Write code samples in multiple languages** — If your API has bindings in multiple programming languages, you can easily put in tabs to switch between them. In your document, you'll distinguish different languages by specifying the language name at the top of each code block, just like with GitHub Flavored Markdown.
-* **Out-of-the-box syntax highlighting** for [almost 60 languages](http://rouge.jayferd.us/demo), no configuration required.
+* **Out-of-the-box syntax highlighting** for [over 100 languages](https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers), no configuration required.
* **Automatic, smoothly scrolling table of contents** on the far left of the page. As you scroll, it displays your current position in the document. It's fast, too. We're using Slate at TripIt to build documentation for our new API, where our table of contents has over 180 entries. We've made sure that the performance remains excellent, even for larger documents.
-* **Let your users update your documentation for you** — by default, your Slate-generated documentation is hosted in a public Github repository. Not only does this mean you get free hosting for your docs with Github Pages, but it also makes it's simple for other developers to make pull requests to your docs if they find typos or other problems. Of course, if you don't want to, you're welcome to not use Github and host your docs elsewhere!
+* **Let your users update your documentation for you** — By default, your Slate-generated documentation is hosted in a public GitHub repository. Not only does this mean you get free hosting for your docs with GitHub Pages, but it also makes it simple for other developers to make pull requests to your docs if they find typos or other problems. Of course, if you don't want to use GitHub, you're also welcome to host your docs elsewhere.
-Getting starting with Slate is super easy! Simply fork this repository, and then follow the instructions below. Or, if you'd like to check out what Slate is capable of, take a look at the [sample docs](http://tripit.github.io/slate).
+* **RTL Support** Full right-to-left layout for RTL languages such as Arabic, Persian (Farsi), Hebrew etc.
-
+Getting started with Slate is super easy! Simply press the green "use this template" button above and follow the instructions below. Or, if you'd like to check out what Slate is capable of, take a look at the [sample docs](https://slatedocs.github.io/slate/).
Getting Started with Slate
------------------------------
-### Prerequisites
-
-You're going to need:
-
- - **Linux or OS X** — Windows may work, but is unsupported.
- - **Ruby, version 1.9.3 or newer**
- - **Bundler** — If Ruby is already installed, but the `bundle` command doesn't work, just run `gem install bundler` in a terminal.
-
-### Getting Set Up
-
- 1. Fork this repository on Github.
- 2. Clone *your forked repository* (not our original one) to your hard drive with `git clone https://github.com/YOURUSERNAME/slate.git`
- 3. `cd slate`
- 4. Install all dependencies: `bundle install`
- 5. Start the test server: `bundle exec middleman server`
+To get started with Slate, please check out the [Getting Started](https://github.com/slatedocs/slate/wiki#getting-started)
+section in our [wiki](https://github.com/slatedocs/slate/wiki).
-Or use the included Dockerfile! (must install Docker first)
+We support running Slate in three different ways:
+* [Natively](https://github.com/slatedocs/slate/wiki/Using-Slate-Natively)
+* [Using Vagrant](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Vagrant)
+* [Using Docker](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Docker)
-```shell
-docker build -t slate .
-docker run -d -p 4567:4567 slate
-```
-You can now see the docs at . Whoa! That was fast!
-
-*Note: if you're using the Docker setup on OSX, the docs will be
-availalable at the output of `boot2docker ip` instead of `localhost:4567`.*
+Releasing
+---------------------------------
-Now that Slate is all set up your machine, you'll probably want to learn more about [editing Slate markdown](https://github.com/tripit/slate/wiki/Markdown-Syntax), or [how to publish your docs](https://github.com/tripit/slate/wiki/Deploying-Slate).
+1. Merge your branch to master
+2. Run `bundle exec rake publish` - this will build & push to the `gh-pages` branch
+3. Validate the changes are up on `https://developers.greenhouse.io/` - sometimes there is a few minutes lag
-Examples of Slate in the Wild
+Companies Using Slate
---------------------------------
-* [Travis-CI's API docs](http://docs.travis-ci.com/api/)
-* [Mozilla's localForage docs](http://mozilla.github.io/localForage/)
-* [Mozilla Recroom](http://mozilla.github.io/recroom/)
-* [ChaiOne Gameplan API docs](http://chaione.github.io/gameplanb2b/#introduction)
-* [Drcaban's Build a Quine tutorial](http://drcabana.github.io/build-a-quine/#introduction)
-* [PricePlow API docs](https://www.priceplow.com/api/documentation)
-* [Emerging Threats API docs](http://apidocs.emergingthreats.net/)
-* [Appium docs](http://appium.io/slate/en/master)
-* [Golazon Developer](http://developer.golazon.com)
-* [Dwolla API docs](https://docs.dwolla.com/)
-* [RozpisyZapasu API docs](http://www.rozpisyzapasu.cz/dev/api/)
-* [Codestar Framework Docs](http://codestarframework.com/documentation/)
-* [Buddycloud API](http://buddycloud.com/api)
-* [Crafty Clicks API](https://craftyclicks.co.uk/api/)
-* [Paracel API Reference](http://paracel.io/docs/api_reference.html)
-* [Switch Payments Documentation](http://switchpayments.com/docs/) & [API](http://switchpayments.com/developers/)
-* [Coinbase API Reference](https://developers.coinbase.com/api)
-* [Whispir.io API](https://whispir.github.io/api)
-* [NASA API](https://data.nasa.gov/developer/external/planetary/)
-* [CardPay API](https://developers.cardpay.com/)
-* [IBM Cloudant](https://docs-testb.cloudant.com/content-review/_design/couchapp/index.html)
-* [Bitrix basis components](http://bbc.bitrix.expert/)
-* [viagogo API Documentation](http://developer.viagogo.net/)
-* [Fidor Bank API Documentation](http://docs.fidor.de/)
-* [Market Prophit API Documentation](http://developer.marketprophit.com/)
-
-(Feel free to add your site to this list in a pull request!)
-
-Need Help? Found a bug?
+* [NASA](https://api.nasa.gov)
+* [Sony](http://developers.cimediacloud.com)
+* [Best Buy](https://bestbuyapis.github.io/api-documentation/)
+* [Travis-CI](https://docs.travis-ci.com/api/)
+* [Greenhouse](https://developers.greenhouse.io/harvest.html)
+* [WooCommerce](http://woocommerce.github.io/woocommerce-rest-api-docs/)
+* [Dwolla](https://docs.dwolla.com/)
+* [Clearbit](https://clearbit.com/docs)
+* [Coinbase](https://developers.coinbase.com/api)
+* [Parrot Drones](http://developer.parrot.com/docs/bebop/)
+* [CoinAPI](https://docs.coinapi.io/)
+
+You can view more in [the list on the wiki](https://github.com/slatedocs/slate/wiki/Slate-in-the-Wild).
+
+Questions? Need Help? Found a bug?
--------------------
-Just [submit a issue](https://github.com/tripit/slate/issues) to the Slate Github if you need any help. And, of course, feel free to submit pull requests with bug fixes or changes.
+If you've got questions about setup, deploying, special feature implementation in your fork, or just want to chat with the developer, please feel free to [start a thread in our Discussions tab](https://github.com/slatedocs/slate/discussions)!
+Found a bug with upstream Slate? Go ahead and [submit an issue](https://github.com/slatedocs/slate/issues). And, of course, feel free to submit pull requests with bug fixes or changes to the `dev` branch.
Contributors
--------------------
-Slate was built by [Robert Lord](https://lord.io) while at [TripIt](http://tripit.com).
+Slate was built by [Robert Lord](https://lord.io) while at [TripIt](https://www.tripit.com/). The project is now maintained by [Matthew Peveler](https://github.com/MasterOdin) and [Mike Ralphson](https://github.com/MikeRalphson).
Thanks to the following people who have submitted major pull requests:
- [@chrissrogers](https://github.com/chrissrogers)
- [@bootstraponline](https://github.com/bootstraponline)
- [@realityking](https://github.com/realityking)
+- [@cvkef](https://github.com/cvkef)
-Also, thanks to [Sauce Labs](http://saucelabs.com) for helping sponsor the project.
-
-Special Thanks
---------------------
-- [Middleman](https://github.com/middleman/middleman)
-- [jquery.tocify.js](https://github.com/gfranko/jquery.tocify.js)
-- [middleman-syntax](https://github.com/middleman/middleman-syntax)
-- [middleman-gh-pages](https://github.com/neo/middleman-gh-pages)
-- [Font Awesome](http://fortawesome.github.io/Font-Awesome/)
+Also, thanks to [Sauce Labs](http://saucelabs.com) for sponsoring the development of the responsive styles.
diff --git a/Vagrantfile b/Vagrantfile
new file mode 100644
index 00000000000..8a9981b8f77
--- /dev/null
+++ b/Vagrantfile
@@ -0,0 +1,47 @@
+Vagrant.configure(2) do |config|
+ config.vm.box = "ubuntu/focal64"
+ config.vm.network :forwarded_port, guest: 4567, host: 4567
+ config.vm.provider "virtualbox" do |vb|
+ vb.memory = "2048"
+ end
+
+ config.vm.provision "bootstrap",
+ type: "shell",
+ inline: <<-SHELL
+ # add nodejs v12 repository
+ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
+
+ sudo apt-get update
+ sudo apt-get install -yq ruby ruby-dev
+ sudo apt-get install -yq pkg-config build-essential nodejs git libxml2-dev libxslt-dev
+ sudo apt-get autoremove -yq
+ gem install --no-document bundler
+ SHELL
+
+ # add the local user git config to the vm
+ config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
+
+ config.vm.provision "install",
+ type: "shell",
+ privileged: false,
+ inline: <<-SHELL
+ echo "=============================================="
+ echo "Installing app dependencies"
+ cd /vagrant
+ sudo gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)"
+ bundle config build.nokogiri --use-system-libraries
+ bundle install
+ SHELL
+
+ config.vm.provision "run",
+ type: "shell",
+ privileged: false,
+ run: "always",
+ inline: <<-SHELL
+ echo "=============================================="
+ echo "Starting up middleman at http://localhost:4567"
+ echo "If it does not come up, check the ~/middleman.log file for any error messages"
+ cd /vagrant
+ bundle exec middleman server --watcher-force-polling --watcher-latency=1 &> ~/middleman.log &
+ SHELL
+end
diff --git a/config.rb b/config.rb
index 43bceaa5a43..09112f3e90f 100644
--- a/config.rb
+++ b/config.rb
@@ -1,3 +1,6 @@
+# Unique header generation
+require './lib/unique_head.rb'
+
# Markdown
set :markdown_engine, :redcarpet
set :markdown,
@@ -5,9 +8,11 @@
smartypants: true,
disable_indented_code_blocks: true,
prettify: true,
+ strikethrough: true,
tables: true,
with_toc_data: true,
- no_intra_emphasis: true
+ no_intra_emphasis: true,
+ renderer: UniqueHeadCounter
# Assets
set :css_dir, 'stylesheets'
@@ -17,6 +22,12 @@
# Activate the syntax highlighter
activate :syntax
+ready do
+ require './lib/monokai_sublime_slate.rb'
+ require './lib/multilang.rb'
+end
+
+activate :sprockets
activate :autoprefixer do |config|
config.browsers = ['last 2 version', 'Firefox ESR']
@@ -30,9 +41,23 @@
# Build Configuration
configure :build do
+ # We do want to hash woff and woff2 as there's a bug where woff2 will use
+ # woff asset hash which breaks things. Trying to use a combination of ignore and
+ # rewrite_ignore does not work as it conflicts weirdly with relative_assets. Disabling
+ # the .woff2 extension only does not work as .woff will still activate it so have to
+ # have both. See https://github.com/slatedocs/slate/issues/1171 for more details.
+ # activate :asset_hash, :exts => app.config[:asset_extensions] - %w[.woff .woff2]
+ # If you're having trouble with Middleman hanging, commenting
+ # out the following two lines has been known to help
activate :minify_css
activate :minify_javascript
- # activate :relative_assets
- # activate :asset_hash
# activate :gzip
end
+
+# Deploy Configuration
+# If you want Middleman to listen on a different port, you can set that below
+set :port, 4567
+
+helpers do
+ require './lib/toc_data.rb'
+end
diff --git a/deploy.sh b/deploy.sh
new file mode 100755
index 00000000000..9dbd7db9c72
--- /dev/null
+++ b/deploy.sh
@@ -0,0 +1,226 @@
+#!/usr/bin/env bash
+set -o errexit #abort if any command fails
+me=$(basename "$0")
+
+help_message="\
+Usage: $me [-c FILE] []
+Deploy generated files to a git branch.
+
+Options:
+
+ -h, --help Show this help information.
+ -v, --verbose Increase verbosity. Useful for debugging.
+ -e, --allow-empty Allow deployment of an empty directory.
+ -m, --message MESSAGE Specify the message used when committing on the
+ deploy branch.
+ -n, --no-hash Don't append the source commit's hash to the deploy
+ commit's message.
+ --source-only Only build but not push
+ --push-only Only push but not build
+"
+
+
+run_build() {
+ bundle exec middleman build --clean
+}
+
+parse_args() {
+ # Set args from a local environment file.
+ if [ -e ".env" ]; then
+ source .env
+ fi
+
+ # Parse arg flags
+ # If something is exposed as an environment variable, set/overwrite it
+ # here. Otherwise, set/overwrite the internal variable instead.
+ while : ; do
+ if [[ $1 = "-h" || $1 = "--help" ]]; then
+ echo "$help_message"
+ exit 0
+ elif [[ $1 = "-v" || $1 = "--verbose" ]]; then
+ verbose=true
+ shift
+ elif [[ $1 = "-e" || $1 = "--allow-empty" ]]; then
+ allow_empty=true
+ shift
+ elif [[ ( $1 = "-m" || $1 = "--message" ) && -n $2 ]]; then
+ commit_message=$2
+ shift 2
+ elif [[ $1 = "-n" || $1 = "--no-hash" ]]; then
+ GIT_DEPLOY_APPEND_HASH=false
+ shift
+ elif [[ $1 = "--source-only" ]]; then
+ source_only=true
+ shift
+ elif [[ $1 = "--push-only" ]]; then
+ push_only=true
+ shift
+ else
+ break
+ fi
+ done
+
+ if [ ${source_only} ] && [ ${push_only} ]; then
+ >&2 echo "You can only specify one of --source-only or --push-only"
+ exit 1
+ fi
+
+ # Set internal option vars from the environment and arg flags. All internal
+ # vars should be declared here, with sane defaults if applicable.
+
+ # Source directory & target branch.
+ deploy_directory=build
+ deploy_branch=gh-pages
+
+ #if no user identity is already set in the current git environment, use this:
+ default_username=${GIT_DEPLOY_USERNAME:-deploy.sh}
+ default_email=${GIT_DEPLOY_EMAIL:-}
+
+ #repository to deploy to. must be readable and writable.
+ repo=origin
+
+ #append commit hash to the end of message by default
+ append_hash=${GIT_DEPLOY_APPEND_HASH:-true}
+}
+
+main() {
+ enable_expanded_output
+
+ if ! git diff --exit-code --quiet --cached; then
+ echo Aborting due to uncommitted changes in the index >&2
+ return 1
+ fi
+
+ commit_title=`git log -n 1 --format="%s" HEAD`
+ commit_hash=` git log -n 1 --format="%H" HEAD`
+
+ #default commit message uses last title if a custom one is not supplied
+ if [[ -z $commit_message ]]; then
+ commit_message="publish: $commit_title"
+ fi
+
+ #append hash to commit message unless no hash flag was found
+ if [ $append_hash = true ]; then
+ commit_message="$commit_message"$'\n\n'"generated from commit $commit_hash"
+ fi
+
+ previous_branch=`git rev-parse --abbrev-ref HEAD`
+
+ if [ ! -d "$deploy_directory" ]; then
+ echo "Deploy directory '$deploy_directory' does not exist. Aborting." >&2
+ return 1
+ fi
+
+ # must use short form of flag in ls for compatibility with macOS and BSD
+ if [[ -z `ls -A "$deploy_directory" 2> /dev/null` && -z $allow_empty ]]; then
+ echo "Deploy directory '$deploy_directory' is empty. Aborting. If you're sure you want to deploy an empty tree, use the --allow-empty / -e flag." >&2
+ return 1
+ fi
+
+ if git ls-remote --exit-code $repo "refs/heads/$deploy_branch" ; then
+ # deploy_branch exists in $repo; make sure we have the latest version
+
+ disable_expanded_output
+ git fetch --force $repo $deploy_branch:$deploy_branch
+ enable_expanded_output
+ fi
+
+ # check if deploy_branch exists locally
+ if git show-ref --verify --quiet "refs/heads/$deploy_branch"
+ then incremental_deploy
+ else initial_deploy
+ fi
+
+ restore_head
+}
+
+initial_deploy() {
+ git --work-tree "$deploy_directory" checkout --orphan $deploy_branch
+ git --work-tree "$deploy_directory" add --all
+ commit+push
+}
+
+incremental_deploy() {
+ #make deploy_branch the current branch
+ git symbolic-ref HEAD refs/heads/$deploy_branch
+ #put the previously committed contents of deploy_branch into the index
+ git --work-tree "$deploy_directory" reset --mixed --quiet
+ git --work-tree "$deploy_directory" add --all
+
+ set +o errexit
+ diff=$(git --work-tree "$deploy_directory" diff --exit-code --quiet HEAD --)$?
+ set -o errexit
+ case $diff in
+ 0) echo No changes to files in $deploy_directory. Skipping commit.;;
+ 1) commit+push;;
+ *)
+ echo git diff exited with code $diff. Aborting. Staying on branch $deploy_branch so you can debug. To switch back to main, use: git symbolic-ref HEAD refs/heads/main && git reset --mixed >&2
+ return $diff
+ ;;
+ esac
+}
+
+commit+push() {
+ set_user_id
+ git --work-tree "$deploy_directory" commit -m "$commit_message"
+
+ disable_expanded_output
+ #--quiet is important here to avoid outputting the repo URL, which may contain a secret token
+ git push --quiet $repo $deploy_branch
+ enable_expanded_output
+}
+
+#echo expanded commands as they are executed (for debugging)
+enable_expanded_output() {
+ if [ $verbose ]; then
+ set -o xtrace
+ set +o verbose
+ fi
+}
+
+#this is used to avoid outputting the repo URL, which may contain a secret token
+disable_expanded_output() {
+ if [ $verbose ]; then
+ set +o xtrace
+ set -o verbose
+ fi
+}
+
+set_user_id() {
+ if [[ -z `git config user.name` ]]; then
+ git config user.name "$default_username"
+ fi
+ if [[ -z `git config user.email` ]]; then
+ git config user.email "$default_email"
+ fi
+}
+
+restore_head() {
+ if [[ $previous_branch = "HEAD" ]]; then
+ #we weren't on any branch before, so just set HEAD back to the commit it was on
+ git update-ref --no-deref HEAD $commit_hash $deploy_branch
+ else
+ git symbolic-ref HEAD refs/heads/$previous_branch
+ fi
+
+ git reset --mixed
+}
+
+filter() {
+ sed -e "s|$repo|\$repo|g"
+}
+
+sanitize() {
+ "$@" 2> >(filter 1>&2) | filter
+}
+
+parse_args "$@"
+
+if [[ ${source_only} ]]; then
+ run_build
+elif [[ ${push_only} ]]; then
+ main "$@"
+else
+ run_build
+ main "$@"
+fi
diff --git a/lib/custom_renderer.rb b/lib/custom_renderer.rb
new file mode 100644
index 00000000000..c2599a4de13
--- /dev/null
+++ b/lib/custom_renderer.rb
@@ -0,0 +1,22 @@
+require 'middleman-core/renderers/redcarpet'
+
+# Monkey patching middleman's markdown renderer
+
+module RedcarpetExtensions
+ def table_cell(content, alignment)
+ if content && content[0] == '*'
+ content[0] = ''
+ "
#{content}
"
+ else
+ "
#{content}
"
+ end
+ end
+end
+
+module Middleman
+ module Renderers
+ class MiddlemanRedcarpetHTML
+ prepend RedcarpetExtensions
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/monokai_sublime_slate.rb b/lib/monokai_sublime_slate.rb
new file mode 100644
index 00000000000..cd2de33172d
--- /dev/null
+++ b/lib/monokai_sublime_slate.rb
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*- #
+# frozen_string_literal: true
+
+# this is based on https://github.com/rouge-ruby/rouge/blob/master/lib/rouge/themes/monokai_sublime.rb
+# but without the added background, and changed styling for JSON keys to be soft_yellow instead of white
+
+module Rouge
+ module Themes
+ class MonokaiSublimeSlate < CSSTheme
+ name 'monokai.sublime.slate'
+
+ palette :black => '#000000'
+ palette :bright_green => '#a6e22e'
+ palette :bright_pink => '#f92672'
+ palette :carmine => '#960050'
+ palette :dark => '#49483e'
+ palette :dark_grey => '#888888'
+ palette :dark_red => '#aa0000'
+ palette :dimgrey => '#75715e'
+ palette :emperor => '#555555'
+ palette :grey => '#999999'
+ palette :light_grey => '#aaaaaa'
+ palette :light_violet => '#ae81ff'
+ palette :soft_cyan => '#66d9ef'
+ palette :soft_yellow => '#e6db74'
+ palette :very_dark => '#1e0010'
+ palette :whitish => '#f8f8f2'
+ palette :orange => '#f6aa11'
+ palette :white => '#ffffff'
+
+ style Generic::Heading, :fg => :grey
+ style Literal::String::Regex, :fg => :orange
+ style Generic::Output, :fg => :dark_grey
+ style Generic::Prompt, :fg => :emperor
+ style Generic::Strong, :bold => false
+ style Generic::Subheading, :fg => :light_grey
+ style Name::Builtin, :fg => :orange
+ style Comment::Multiline,
+ Comment::Preproc,
+ Comment::Single,
+ Comment::Special,
+ Comment, :fg => :dimgrey
+ style Error,
+ Generic::Error,
+ Generic::Traceback, :fg => :carmine
+ style Generic::Deleted,
+ Generic::Inserted,
+ Generic::Emph, :fg => :dark
+ style Keyword::Constant,
+ Keyword::Declaration,
+ Keyword::Reserved,
+ Name::Constant,
+ Keyword::Type, :fg => :soft_cyan
+ style Literal::Number::Float,
+ Literal::Number::Hex,
+ Literal::Number::Integer::Long,
+ Literal::Number::Integer,
+ Literal::Number::Oct,
+ Literal::Number,
+ Literal::String::Char,
+ Literal::String::Escape,
+ Literal::String::Symbol, :fg => :light_violet
+ style Literal::String::Doc,
+ Literal::String::Double,
+ Literal::String::Backtick,
+ Literal::String::Heredoc,
+ Literal::String::Interpol,
+ Literal::String::Other,
+ Literal::String::Single,
+ Literal::String, :fg => :soft_yellow
+ style Name::Attribute,
+ Name::Class,
+ Name::Decorator,
+ Name::Exception,
+ Name::Function, :fg => :bright_green
+ style Name::Variable::Class,
+ Name::Namespace,
+ Name::Entity,
+ Name::Builtin::Pseudo,
+ Name::Variable::Global,
+ Name::Variable::Instance,
+ Name::Variable,
+ Text::Whitespace,
+ Text,
+ Name, :fg => :white
+ style Name::Label, :fg => :bright_pink
+ style Operator::Word,
+ Name::Tag,
+ Keyword,
+ Keyword::Namespace,
+ Keyword::Pseudo,
+ Operator, :fg => :bright_pink
+ end
+ end
+ end
diff --git a/lib/multilang.rb b/lib/multilang.rb
new file mode 100644
index 00000000000..36fbe5b1f07
--- /dev/null
+++ b/lib/multilang.rb
@@ -0,0 +1,16 @@
+module Multilang
+ def block_code(code, full_lang_name)
+ if full_lang_name
+ parts = full_lang_name.split('--')
+ rouge_lang_name = (parts) ? parts[0] : "" # just parts[0] here causes null ref exception when no language specified
+ super(code, rouge_lang_name).sub("highlight #{rouge_lang_name}") do |match|
+ match + " tab-" + full_lang_name
+ end
+ else
+ super(code, full_lang_name)
+ end
+ end
+end
+
+require 'middleman-core/renderers/redcarpet'
+Middleman::Renderers::MiddlemanRedcarpetHTML.send :include, Multilang
diff --git a/lib/nesting_unique_head.rb b/lib/nesting_unique_head.rb
new file mode 100644
index 00000000000..01278371c17
--- /dev/null
+++ b/lib/nesting_unique_head.rb
@@ -0,0 +1,22 @@
+# Nested unique header generation
+require 'middleman-core/renderers/redcarpet'
+
+class NestingUniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
+ def initialize
+ super
+ @@headers_history = {} if !defined?(@@headers_history)
+ end
+
+ def header(text, header_level)
+ friendly_text = text.gsub(/<[^>]*>/,"").parameterize
+ @@headers_history[header_level] = text.parameterize
+
+ if header_level > 1
+ for i in (header_level - 1).downto(1)
+ friendly_text.prepend("#{@@headers_history[i]}-") if @@headers_history.key?(i)
+ end
+ end
+
+ return "#{text}"
+ end
+end
diff --git a/lib/toc_data.rb b/lib/toc_data.rb
new file mode 100644
index 00000000000..4a04efee26f
--- /dev/null
+++ b/lib/toc_data.rb
@@ -0,0 +1,31 @@
+require 'nokogiri'
+
+def toc_data(page_content)
+ html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content)
+
+ # get a flat list of headers
+ headers = []
+ html_doc.css('h1, h2, h3').each do |header|
+ headers.push({
+ id: header.attribute('id').to_s,
+ content: header.children,
+ title: header.children.to_s.gsub(/<[^>]*>/, ''),
+ level: header.name[1].to_i,
+ children: []
+ })
+ end
+
+ [3,2].each do |header_level|
+ header_to_nest = nil
+ headers = headers.reject do |header|
+ if header[:level] == header_level
+ header_to_nest[:children].push header if header_to_nest
+ true
+ else
+ header_to_nest = header if header[:level] < header_level
+ false
+ end
+ end
+ end
+ headers
+end
diff --git a/lib/unique_head.rb b/lib/unique_head.rb
new file mode 100644
index 00000000000..d42bab2aa9d
--- /dev/null
+++ b/lib/unique_head.rb
@@ -0,0 +1,24 @@
+# Unique header generation
+require 'middleman-core/renderers/redcarpet'
+require 'digest'
+class UniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
+ def initialize
+ super
+ @head_count = {}
+ end
+ def header(text, header_level)
+ friendly_text = text.gsub(/<[^>]*>/,"").parameterize
+ if friendly_text.strip.length == 0
+ # Looks like parameterize removed the whole thing! It removes many unicode
+ # characters like Chinese and Russian. To get a unique URL, let's just
+ # URI escape the whole header
+ friendly_text = Digest::SHA1.hexdigest(text)[0,10]
+ end
+ @head_count[friendly_text] ||= 0
+ @head_count[friendly_text] += 1
+ if @head_count[friendly_text] > 1
+ friendly_text += "-#{@head_count[friendly_text]}"
+ end
+ return "#{text}"
+ end
+end
diff --git a/pull_request_template.md b/pull_request_template.md
new file mode 100644
index 00000000000..82fb0e6356c
--- /dev/null
+++ b/pull_request_template.md
@@ -0,0 +1,9 @@
+
+
+
diff --git a/slate.sh b/slate.sh
new file mode 100755
index 00000000000..d6f1bd9d5f1
--- /dev/null
+++ b/slate.sh
@@ -0,0 +1,248 @@
+#!/usr/bin/env bash
+set -o errexit #abort if any command fails
+
+me=$(basename "$0")
+
+help_message="\
+Usage: $me [] []
+Run commands related to the slate process.
+
+Commands:
+
+ serve Run the middleman server process, useful for
+ development.
+ build Run the build process.
+ deploy Will build and deploy files to branch. Use
+ --no-build to only deploy.
+
+Global Options:
+
+ -h, --help Show this help information.
+ -v, --verbose Increase verbosity. Useful for debugging.
+
+Deploy options:
+ -e, --allow-empty Allow deployment of an empty directory.
+ -m, --message MESSAGE Specify the message used when committing on the
+ deploy branch.
+ -n, --no-hash Don't append the source commit's hash to the deploy
+ commit's message.
+ --no-build Do not build the source files.
+"
+
+
+run_serve() {
+ exec bundle exec middleman serve --watcher-force-polling
+}
+
+run_build() {
+ bundle exec middleman build --clean --watcher-disable
+}
+
+parse_args() {
+ # Set args from a local environment file.
+ if [ -e ".env" ]; then
+ source .env
+ fi
+
+ command=
+
+ # Parse arg flags
+ # If something is exposed as an environment variable, set/overwrite it
+ # here. Otherwise, set/overwrite the internal variable instead.
+ while : ; do
+ if [[ $1 = "-h" || $1 = "--help" ]]; then
+ echo "$help_message"
+ exit 0
+ elif [[ $1 = "-v" || $1 = "--verbose" ]]; then
+ verbose=true
+ shift
+ elif [[ $1 = "-e" || $1 = "--allow-empty" ]]; then
+ allow_empty=true
+ shift
+ elif [[ ( $1 = "-m" || $1 = "--message" ) && -n $2 ]]; then
+ commit_message=$2
+ shift 2
+ elif [[ $1 = "-n" || $1 = "--no-hash" ]]; then
+ GIT_DEPLOY_APPEND_HASH=false
+ shift
+ elif [[ $1 = "--no-build" ]]; then
+ no_build=true
+ shift
+ elif [[ $1 = "serve" || $1 = "build" || $1 = "deploy" ]]; then
+ if [ ! -z "${command}" ]; then
+ >&2 echo "You can only specify one command."
+ exit 1
+ fi
+ command=$1
+ shift
+ elif [ -z $1 ]; then
+ break
+ fi
+ done
+
+ if [ -z "${command}" ]; then
+ >&2 echo "Command not specified."
+ exit 1
+ fi
+
+ # Set internal option vars from the environment and arg flags. All internal
+ # vars should be declared here, with sane defaults if applicable.
+
+ # Source directory & target branch.
+ deploy_directory=build
+ deploy_branch=gh-pages
+
+ #if no user identity is already set in the current git environment, use this:
+ default_username=${GIT_DEPLOY_USERNAME:-deploy.sh}
+ default_email=${GIT_DEPLOY_EMAIL:-}
+
+ #repository to deploy to. must be readable and writable.
+ repo=origin
+
+ #append commit hash to the end of message by default
+ append_hash=${GIT_DEPLOY_APPEND_HASH:-true}
+}
+
+main() {
+ enable_expanded_output
+
+ if ! git diff --exit-code --quiet --cached; then
+ echo Aborting due to uncommitted changes in the index >&2
+ return 1
+ fi
+
+ commit_title=`git log -n 1 --format="%s" HEAD`
+ commit_hash=` git log -n 1 --format="%H" HEAD`
+
+ #default commit message uses last title if a custom one is not supplied
+ if [[ -z $commit_message ]]; then
+ commit_message="publish: $commit_title"
+ fi
+
+ #append hash to commit message unless no hash flag was found
+ if [ $append_hash = true ]; then
+ commit_message="$commit_message"$'\n\n'"generated from commit $commit_hash"
+ fi
+
+ previous_branch=`git rev-parse --abbrev-ref HEAD`
+
+ if [ ! -d "$deploy_directory" ]; then
+ echo "Deploy directory '$deploy_directory' does not exist. Aborting." >&2
+ return 1
+ fi
+
+ # must use short form of flag in ls for compatibility with macOS and BSD
+ if [[ -z `ls -A "$deploy_directory" 2> /dev/null` && -z $allow_empty ]]; then
+ echo "Deploy directory '$deploy_directory' is empty. Aborting. If you're sure you want to deploy an empty tree, use the --allow-empty / -e flag." >&2
+ return 1
+ fi
+
+ if git ls-remote --exit-code $repo "refs/heads/$deploy_branch" ; then
+ # deploy_branch exists in $repo; make sure we have the latest version
+
+ disable_expanded_output
+ git fetch --force $repo $deploy_branch:$deploy_branch
+ enable_expanded_output
+ fi
+
+ # check if deploy_branch exists locally
+ if git show-ref --verify --quiet "refs/heads/$deploy_branch"
+ then incremental_deploy
+ else initial_deploy
+ fi
+
+ restore_head
+}
+
+initial_deploy() {
+ git --work-tree "$deploy_directory" checkout --orphan $deploy_branch
+ git --work-tree "$deploy_directory" add --all
+ commit+push
+}
+
+incremental_deploy() {
+ #make deploy_branch the current branch
+ git symbolic-ref HEAD refs/heads/$deploy_branch
+ #put the previously committed contents of deploy_branch into the index
+ git --work-tree "$deploy_directory" reset --mixed --quiet
+ git --work-tree "$deploy_directory" add --all
+
+ set +o errexit
+ diff=$(git --work-tree "$deploy_directory" diff --exit-code --quiet HEAD --)$?
+ set -o errexit
+ case $diff in
+ 0) echo No changes to files in $deploy_directory. Skipping commit.;;
+ 1) commit+push;;
+ *)
+ echo git diff exited with code $diff. Aborting. Staying on branch $deploy_branch so you can debug. To switch back to main, use: git symbolic-ref HEAD refs/heads/main && git reset --mixed >&2
+ return $diff
+ ;;
+ esac
+}
+
+commit+push() {
+ set_user_id
+ git --work-tree "$deploy_directory" commit -m "$commit_message"
+
+ disable_expanded_output
+ #--quiet is important here to avoid outputting the repo URL, which may contain a secret token
+ git push --quiet $repo $deploy_branch
+ enable_expanded_output
+}
+
+#echo expanded commands as they are executed (for debugging)
+enable_expanded_output() {
+ if [ $verbose ]; then
+ set -o xtrace
+ set +o verbose
+ fi
+}
+
+#this is used to avoid outputting the repo URL, which may contain a secret token
+disable_expanded_output() {
+ if [ $verbose ]; then
+ set +o xtrace
+ set -o verbose
+ fi
+}
+
+set_user_id() {
+ if [[ -z `git config user.name` ]]; then
+ git config user.name "$default_username"
+ fi
+ if [[ -z `git config user.email` ]]; then
+ git config user.email "$default_email"
+ fi
+}
+
+restore_head() {
+ if [[ $previous_branch = "HEAD" ]]; then
+ #we weren't on any branch before, so just set HEAD back to the commit it was on
+ git update-ref --no-deref HEAD $commit_hash $deploy_branch
+ else
+ git symbolic-ref HEAD refs/heads/$previous_branch
+ fi
+
+ git reset --mixed
+}
+
+filter() {
+ sed -e "s|$repo|\$repo|g"
+}
+
+sanitize() {
+ "$@" 2> >(filter 1>&2) | filter
+}
+
+parse_args "$@"
+
+if [ "${command}" = "serve" ]; then
+ run_serve
+elif [[ "${command}" = "build" ]]; then
+ run_build
+elif [[ ${command} = "deploy" ]]; then
+ if [[ ${no_build} != true ]]; then
+ run_build
+ fi
+ main "$@"
+fi
diff --git a/source/assessment.html.md b/source/assessment.html.md
new file mode 100644
index 00000000000..722268df010
--- /dev/null
+++ b/source/assessment.html.md
@@ -0,0 +1,27 @@
+---
+title: Assessment API
+
+language_tabs:
+ - shell
+
+toc_footers:
+ - Audit Log API
+ - Harvest API
+ - Ingestion API
+ - Job Board API
+ - Onboarding API
+ - Webhooks
+
+includes:
+ - assessment/introduction
+ - assessment/list_tests
+ - assessment/send_test
+ - assessment/patch_completed_test
+ - assessment/test_status
+ - assessment/response_error
+ - assessment/errors
+
+slug: assessment
+search: true
+github_link: https://github.com/grnhse/greenhouse-api-docs/tree/master/source/includes/assessment
+---
diff --git a/source/audit-log.html.md b/source/audit-log.html.md
new file mode 100644
index 00000000000..27bf3cf649f
--- /dev/null
+++ b/source/audit-log.html.md
@@ -0,0 +1,23 @@
+---
+title: Audit Log API
+
+language_tabs:
+ - shell
+
+toc_footers:
+ - Assessment API
+ - Audit Log API
+ - Harvest API
+ - Ingestion API
+ - Job Board API
+ - Onboarding API
+ - Webhooks
+
+includes:
+ - audit-log/introduction
+ - audit-log/events
+
+slug: audit-log
+search: true
+github_link: https://github.com/grnhse/greenhouse-api-docs/tree/master/source/includes/audit-log
+---
diff --git a/source/candidate-ingestion.html.md b/source/candidate-ingestion.html.md
new file mode 100644
index 00000000000..1be907be7df
--- /dev/null
+++ b/source/candidate-ingestion.html.md
@@ -0,0 +1,27 @@
+---
+title: Candidate Ingestion API
+
+language_tabs:
+ - shell
+
+toc_footers:
+ - Assessment API
+ - Audit Log API
+ - Harvest API
+ - Job Board API
+ - Onboarding API
+ - Webhooks
+
+includes:
+ - candidate-ingestion/introduction
+ - candidate-ingestion/candidates
+ - candidate-ingestion/current_user
+ - candidate-ingestion/jobs
+ - candidate-ingestion/tracking_link
+ - candidate-ingestion/prospect_pools
+ - candidate-ingestion/errors
+
+slug: candidate-ingestion
+search: true
+github_link: https://github.com/grnhse/greenhouse-api-docs/tree/master/source/includes/candidate-ingestion
+---
diff --git a/source/fonts/lineto-akkurat-bold-s-7b5d084534971febd769e95ead265792.ttf b/source/fonts/lineto-akkurat-bold-s-7b5d084534971febd769e95ead265792.ttf
new file mode 100644
index 00000000000..c8a5c1dc653
Binary files /dev/null and b/source/fonts/lineto-akkurat-bold-s-7b5d084534971febd769e95ead265792.ttf differ
diff --git a/source/fonts/lineto-akkurat-bold-s-8f4ce91e6264ca77230354a0845be553.woff b/source/fonts/lineto-akkurat-bold-s-8f4ce91e6264ca77230354a0845be553.woff
new file mode 100644
index 00000000000..975802745b1
Binary files /dev/null and b/source/fonts/lineto-akkurat-bold-s-8f4ce91e6264ca77230354a0845be553.woff differ
diff --git a/source/fonts/lineto-akkurat-bold-s-da650f3e5d121ff3584d6d7df703def6.eot b/source/fonts/lineto-akkurat-bold-s-da650f3e5d121ff3584d6d7df703def6.eot
new file mode 100644
index 00000000000..5bf3e235240
Binary files /dev/null and b/source/fonts/lineto-akkurat-bold-s-da650f3e5d121ff3584d6d7df703def6.eot differ
diff --git a/source/fonts/lineto-akkurat-bold-s.eot b/source/fonts/lineto-akkurat-bold-s.eot
new file mode 100644
index 00000000000..5bf3e235240
Binary files /dev/null and b/source/fonts/lineto-akkurat-bold-s.eot differ
diff --git a/source/fonts/lineto-akkurat-bold-s.svg b/source/fonts/lineto-akkurat-bold-s.svg
new file mode 100644
index 00000000000..eedd69c3aa3
--- /dev/null
+++ b/source/fonts/lineto-akkurat-bold-s.svg
@@ -0,0 +1,4078 @@
+
+
+
\ No newline at end of file
diff --git a/source/fonts/lineto-akkurat-italic-s-434e19f88099658f499dbee8d1970548.ttf b/source/fonts/lineto-akkurat-italic-s-434e19f88099658f499dbee8d1970548.ttf
new file mode 100644
index 00000000000..4b6d1fc5f85
Binary files /dev/null and b/source/fonts/lineto-akkurat-italic-s-434e19f88099658f499dbee8d1970548.ttf differ
diff --git a/source/fonts/lineto-akkurat-italic-s-6fb98b3a904e84e7263caa3bf8025f8c.woff b/source/fonts/lineto-akkurat-italic-s-6fb98b3a904e84e7263caa3bf8025f8c.woff
new file mode 100644
index 00000000000..8f9bcc59657
Binary files /dev/null and b/source/fonts/lineto-akkurat-italic-s-6fb98b3a904e84e7263caa3bf8025f8c.woff differ
diff --git a/source/fonts/lineto-akkurat-italic-s-9ebac37c6822c54672623aed60390877.eot b/source/fonts/lineto-akkurat-italic-s-9ebac37c6822c54672623aed60390877.eot
new file mode 100644
index 00000000000..bb41730cf94
Binary files /dev/null and b/source/fonts/lineto-akkurat-italic-s-9ebac37c6822c54672623aed60390877.eot differ
diff --git a/source/fonts/lineto-akkurat-italic-s.eot b/source/fonts/lineto-akkurat-italic-s.eot
new file mode 100644
index 00000000000..bb41730cf94
Binary files /dev/null and b/source/fonts/lineto-akkurat-italic-s.eot differ
diff --git a/source/fonts/lineto-akkurat-italic-s.svg b/source/fonts/lineto-akkurat-italic-s.svg
new file mode 100644
index 00000000000..dadac973642
--- /dev/null
+++ b/source/fonts/lineto-akkurat-italic-s.svg
@@ -0,0 +1,4301 @@
+
+
+
\ No newline at end of file
diff --git a/source/fonts/lineto-akkurat-light-s-202faa735255e2d3b2d6f740c265f0da.eot b/source/fonts/lineto-akkurat-light-s-202faa735255e2d3b2d6f740c265f0da.eot
new file mode 100644
index 00000000000..1347b7bca20
Binary files /dev/null and b/source/fonts/lineto-akkurat-light-s-202faa735255e2d3b2d6f740c265f0da.eot differ
diff --git a/source/fonts/lineto-akkurat-light-s-60ec22fd8f6ae55d09ba61be82d581c0.woff b/source/fonts/lineto-akkurat-light-s-60ec22fd8f6ae55d09ba61be82d581c0.woff
new file mode 100644
index 00000000000..1027f6c8b66
Binary files /dev/null and b/source/fonts/lineto-akkurat-light-s-60ec22fd8f6ae55d09ba61be82d581c0.woff differ
diff --git a/source/fonts/lineto-akkurat-light-s-a0c0731e0942345305d19de3cf08e1ab.ttf b/source/fonts/lineto-akkurat-light-s-a0c0731e0942345305d19de3cf08e1ab.ttf
new file mode 100644
index 00000000000..0e4c5c47875
Binary files /dev/null and b/source/fonts/lineto-akkurat-light-s-a0c0731e0942345305d19de3cf08e1ab.ttf differ
diff --git a/source/fonts/lineto-akkurat-light-s.eot b/source/fonts/lineto-akkurat-light-s.eot
new file mode 100644
index 00000000000..1347b7bca20
Binary files /dev/null and b/source/fonts/lineto-akkurat-light-s.eot differ
diff --git a/source/fonts/lineto-akkurat-light-s.svg b/source/fonts/lineto-akkurat-light-s.svg
new file mode 100644
index 00000000000..bacb8173b9f
--- /dev/null
+++ b/source/fonts/lineto-akkurat-light-s.svg
@@ -0,0 +1,4130 @@
+
+
+
\ No newline at end of file
diff --git a/source/fonts/lineto-akkurat-regular-s-31392b316fb064a216f2712a77cb26b1.woff b/source/fonts/lineto-akkurat-regular-s-31392b316fb064a216f2712a77cb26b1.woff
new file mode 100644
index 00000000000..62ec0f22729
Binary files /dev/null and b/source/fonts/lineto-akkurat-regular-s-31392b316fb064a216f2712a77cb26b1.woff differ
diff --git a/source/fonts/lineto-akkurat-regular-s-c7a2abb9c5e4fe66bd68bcaebb3da255.ttf b/source/fonts/lineto-akkurat-regular-s-c7a2abb9c5e4fe66bd68bcaebb3da255.ttf
new file mode 100644
index 00000000000..a2fb05bea91
Binary files /dev/null and b/source/fonts/lineto-akkurat-regular-s-c7a2abb9c5e4fe66bd68bcaebb3da255.ttf differ
diff --git a/source/fonts/lineto-akkurat-regular-s-f5a56f4dcccbbb2ffe37313aa0d0cc7a.eot b/source/fonts/lineto-akkurat-regular-s-f5a56f4dcccbbb2ffe37313aa0d0cc7a.eot
new file mode 100644
index 00000000000..44211e91da7
Binary files /dev/null and b/source/fonts/lineto-akkurat-regular-s-f5a56f4dcccbbb2ffe37313aa0d0cc7a.eot differ
diff --git a/source/fonts/lineto-akkurat-regular-s.eot b/source/fonts/lineto-akkurat-regular-s.eot
new file mode 100644
index 00000000000..44211e91da7
Binary files /dev/null and b/source/fonts/lineto-akkurat-regular-s.eot differ
diff --git a/source/fonts/lineto-akkurat-regular-s.svg b/source/fonts/lineto-akkurat-regular-s.svg
new file mode 100644
index 00000000000..353310ea3bc
--- /dev/null
+++ b/source/fonts/lineto-akkurat-regular-s.svg
@@ -0,0 +1,4117 @@
+
+
+
\ No newline at end of file
diff --git a/source/fonts/slate.eot b/source/fonts/slate.eot
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.svg b/source/fonts/slate.svg
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.ttf b/source/fonts/slate.ttf
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.woff b/source/fonts/slate.woff
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.woff2 b/source/fonts/slate.woff2
old mode 100755
new mode 100644
diff --git a/source/gho.html.md b/source/gho.html.md
new file mode 100644
index 00000000000..ec9a0269bb7
--- /dev/null
+++ b/source/gho.html.md
@@ -0,0 +1,24 @@
+---
+title: Greenhouse Onboarding API
+
+language_tabs:
+ - Examples
+
+toc_footers:
+ - Assessment API
+ - Audit Log API
+ - Harvest API
+ - Ingestion API
+ - Job Board API
+ - Webhooks
+
+includes:
+ - gho/introduction
+ - gho/pagination
+ - gho/errors
+ - gho/api
+
+slug: gho
+search: true
+github_link: https://github.com/grnhse/greenhouse-api-docs/tree/master/source/includes/gho
+---
diff --git a/source/harvest.html.md b/source/harvest.html.md
new file mode 100644
index 00000000000..dc5d66688e3
--- /dev/null
+++ b/source/harvest.html.md
@@ -0,0 +1,49 @@
+---
+title: Harvest API
+
+language_tabs:
+ - shell
+ - ruby
+
+toc_footers:
+ - Assessment API
+ - Audit Log API
+ - Ingestion API
+ - Job Board API
+ - Onboarding API
+ - Webhooks
+
+includes:
+ - harvest/introduction
+ - harvest/activity_feed
+ - harvest/applications
+ - harvest/approvals
+ - harvest/candidates
+ - harvest/close_reasons
+ - harvest/custom_fields
+ - harvest/demographic_data
+ - harvest/departments
+ - harvest/education
+ - harvest/eeoc
+ - harvest/email_templates
+ - harvest/job_openings
+ - harvest/job_posts
+ - harvest/job_stages
+ - harvest/jobs
+ - harvest/offers
+ - harvest/offices
+ - harvest/prospect_pools
+ - harvest/rejection_reasons
+ - harvest/scheduled_interviews
+ - harvest/scorecards
+ - harvest/sources
+ - harvest/tags
+ - harvest/tracking_links
+ - harvest/users
+ - harvest/user_permissions
+ - harvest/user_roles
+
+slug: harvest
+search: true
+github_link: https://github.com/grnhse/greenhouse-api-docs/tree/master/source/includes/harvest
+---
diff --git a/source/images/add-stage.png b/source/images/add-stage.png
new file mode 100644
index 00000000000..028d3868e41
Binary files /dev/null and b/source/images/add-stage.png differ
diff --git a/source/images/favicons/android-chrome-144x144.png b/source/images/favicons/android-chrome-144x144.png
new file mode 100644
index 00000000000..f225472be95
Binary files /dev/null and b/source/images/favicons/android-chrome-144x144.png differ
diff --git a/source/images/favicons/android-chrome-36x36.png b/source/images/favicons/android-chrome-36x36.png
new file mode 100644
index 00000000000..154886277f2
Binary files /dev/null and b/source/images/favicons/android-chrome-36x36.png differ
diff --git a/source/images/favicons/android-chrome-48x48.png b/source/images/favicons/android-chrome-48x48.png
new file mode 100644
index 00000000000..783e314fd96
Binary files /dev/null and b/source/images/favicons/android-chrome-48x48.png differ
diff --git a/source/images/favicons/android-chrome-72x72.png b/source/images/favicons/android-chrome-72x72.png
new file mode 100644
index 00000000000..93e8c0b5fb7
Binary files /dev/null and b/source/images/favicons/android-chrome-72x72.png differ
diff --git a/source/images/favicons/android-chrome-96x96.png b/source/images/favicons/android-chrome-96x96.png
new file mode 100644
index 00000000000..fbb6e95e259
Binary files /dev/null and b/source/images/favicons/android-chrome-96x96.png differ
diff --git a/source/images/favicons/apple-touch-icon-114x114.png b/source/images/favicons/apple-touch-icon-114x114.png
new file mode 100644
index 00000000000..76924ca13f8
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-114x114.png differ
diff --git a/source/images/favicons/apple-touch-icon-120x120.png b/source/images/favicons/apple-touch-icon-120x120.png
new file mode 100644
index 00000000000..5611365ea64
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-120x120.png differ
diff --git a/source/images/favicons/apple-touch-icon-144x144.png b/source/images/favicons/apple-touch-icon-144x144.png
new file mode 100644
index 00000000000..f225472be95
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-144x144.png differ
diff --git a/source/images/favicons/apple-touch-icon-57x57.png b/source/images/favicons/apple-touch-icon-57x57.png
new file mode 100644
index 00000000000..d29e978d647
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-57x57.png differ
diff --git a/source/images/favicons/apple-touch-icon-60x60.png b/source/images/favicons/apple-touch-icon-60x60.png
new file mode 100644
index 00000000000..37572a14e5f
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-60x60.png differ
diff --git a/source/images/favicons/apple-touch-icon-72x72.png b/source/images/favicons/apple-touch-icon-72x72.png
new file mode 100644
index 00000000000..93e8c0b5fb7
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-72x72.png differ
diff --git a/source/images/favicons/apple-touch-icon-76x76.png b/source/images/favicons/apple-touch-icon-76x76.png
new file mode 100644
index 00000000000..40c11e3edac
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-76x76.png differ
diff --git a/source/images/favicons/apple-touch-icon-precomposed.png b/source/images/favicons/apple-touch-icon-precomposed.png
new file mode 100644
index 00000000000..250be504b2c
Binary files /dev/null and b/source/images/favicons/apple-touch-icon-precomposed.png differ
diff --git a/source/images/favicons/apple-touch-icon.png b/source/images/favicons/apple-touch-icon.png
new file mode 100644
index 00000000000..f225472be95
Binary files /dev/null and b/source/images/favicons/apple-touch-icon.png differ
diff --git a/source/images/favicons/browserconfig.xml b/source/images/favicons/browserconfig.xml
new file mode 100644
index 00000000000..65380f3873d
--- /dev/null
+++ b/source/images/favicons/browserconfig.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+ #da532c
+
+
+
diff --git a/source/images/favicons/favicon-16x16.png b/source/images/favicons/favicon-16x16.png
new file mode 100644
index 00000000000..f70aac90833
Binary files /dev/null and b/source/images/favicons/favicon-16x16.png differ
diff --git a/source/images/favicons/favicon-32x32.png b/source/images/favicons/favicon-32x32.png
new file mode 100644
index 00000000000..aaf493b0876
Binary files /dev/null and b/source/images/favicons/favicon-32x32.png differ
diff --git a/source/images/favicons/favicon-96x96.png b/source/images/favicons/favicon-96x96.png
new file mode 100644
index 00000000000..fbb6e95e259
Binary files /dev/null and b/source/images/favicons/favicon-96x96.png differ
diff --git a/source/images/favicons/favicon.ico b/source/images/favicons/favicon.ico
new file mode 100644
index 00000000000..09ca07b5046
Binary files /dev/null and b/source/images/favicons/favicon.ico differ
diff --git a/source/images/favicons/manifest.json b/source/images/favicons/manifest.json
new file mode 100644
index 00000000000..b61ea78afdc
--- /dev/null
+++ b/source/images/favicons/manifest.json
@@ -0,0 +1,35 @@
+{
+ "name": "Greenhouse",
+ "icons": [
+ {
+ "src": "\/android-chrome-36x36.png",
+ "sizes": "36x36",
+ "type": "image\/png",
+ "density": 0.75
+ },
+ {
+ "src": "\/android-chrome-48x48.png",
+ "sizes": "48x48",
+ "type": "image\/png",
+ "density": 1
+ },
+ {
+ "src": "\/android-chrome-72x72.png",
+ "sizes": "72x72",
+ "type": "image\/png",
+ "density": 1.5
+ },
+ {
+ "src": "\/android-chrome-96x96.png",
+ "sizes": "96x96",
+ "type": "image\/png",
+ "density": 2
+ },
+ {
+ "src": "\/android-chrome-144x144.png",
+ "sizes": "144x144",
+ "type": "image\/png",
+ "density": 3
+ }
+ ]
+}
diff --git a/source/images/favicons/mstile-144x144.png b/source/images/favicons/mstile-144x144.png
new file mode 100644
index 00000000000..ef9d7ba615f
Binary files /dev/null and b/source/images/favicons/mstile-144x144.png differ
diff --git a/source/images/favicons/mstile-150x150.png b/source/images/favicons/mstile-150x150.png
new file mode 100644
index 00000000000..bf1b7813c79
Binary files /dev/null and b/source/images/favicons/mstile-150x150.png differ
diff --git a/source/images/favicons/mstile-310x150.png b/source/images/favicons/mstile-310x150.png
new file mode 100644
index 00000000000..be90f9beb8e
Binary files /dev/null and b/source/images/favicons/mstile-310x150.png differ
diff --git a/source/images/favicons/mstile-310x310.png b/source/images/favicons/mstile-310x310.png
new file mode 100644
index 00000000000..bd5b98e6819
Binary files /dev/null and b/source/images/favicons/mstile-310x310.png differ
diff --git a/source/images/favicons/mstile-70x70.png b/source/images/favicons/mstile-70x70.png
new file mode 100644
index 00000000000..f11525fc4c1
Binary files /dev/null and b/source/images/favicons/mstile-70x70.png differ
diff --git a/source/images/favicons/safari-pinned-tab.svg b/source/images/favicons/safari-pinned-tab.svg
new file mode 100644
index 00000000000..0a07e9064ea
--- /dev/null
+++ b/source/images/favicons/safari-pinned-tab.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/source/images/gho/api-management.png b/source/images/gho/api-management.png
new file mode 100644
index 00000000000..8fcda1ef11c
Binary files /dev/null and b/source/images/gho/api-management.png differ
diff --git a/source/images/github-mark.png b/source/images/github-mark.png
new file mode 100644
index 00000000000..a4c1fcbd7f0
Binary files /dev/null and b/source/images/github-mark.png differ
diff --git a/source/images/greenhouse-developers.png b/source/images/greenhouse-developers.png
new file mode 100644
index 00000000000..10d555fb9f0
Binary files /dev/null and b/source/images/greenhouse-developers.png differ
diff --git a/source/images/logo-footer.png b/source/images/logo-footer.png
new file mode 100644
index 00000000000..d24f6fa5b37
Binary files /dev/null and b/source/images/logo-footer.png differ
diff --git a/source/images/logo-green.png b/source/images/logo-green.png
new file mode 100644
index 00000000000..1a4939d8426
Binary files /dev/null and b/source/images/logo-green.png differ
diff --git a/source/images/logo.png b/source/images/logo.png
index fa1f13da819..1977590b9a6 100644
Binary files a/source/images/logo.png and b/source/images/logo.png differ
diff --git a/source/images/prompt.png b/source/images/prompt.png
new file mode 100644
index 00000000000..f3f49f834ef
Binary files /dev/null and b/source/images/prompt.png differ
diff --git a/source/images/send-test.png b/source/images/send-test.png
new file mode 100644
index 00000000000..8ae24f36bb1
Binary files /dev/null and b/source/images/send-test.png differ
diff --git a/source/includes/_errors.md b/source/includes/_errors.md
index 56cffb34d22..7b35e92b5f3 100644
--- a/source/includes/_errors.md
+++ b/source/includes/_errors.md
@@ -1,20 +1,22 @@
# Errors
-
+
The Kittn API uses the following error codes:
Error Code | Meaning
---------- | -------
-400 | Bad Request -- Your request sucks
-401 | Unauthorized -- Your API key is wrong
-403 | Forbidden -- The kitten requested is hidden for administrators only
-404 | Not Found -- The specified kitten could not be found
-405 | Method Not Allowed -- You tried to access a kitten with an invalid method
-406 | Not Acceptable -- You requested a format that isn't json
-410 | Gone -- The kitten requested has been removed from our servers
-418 | I'm a teapot
+400 | Bad Request -- Your request is invalid.
+401 | Unauthorized -- Your API key is wrong.
+403 | Forbidden -- The kitten requested is hidden for administrators only.
+404 | Not Found -- The specified kitten could not be found.
+405 | Method Not Allowed -- You tried to access a kitten with an invalid method.
+406 | Not Acceptable -- You requested a format that isn't json.
+410 | Gone -- The kitten requested has been removed from our servers.
+418 | I'm a teapot.
429 | Too Many Requests -- You're requesting too many kittens! Slow down!
500 | Internal Server Error -- We had a problem with our server. Try again later.
-503 | Service Unavailable -- We're temporarially offline for maintanance. Please try again later.
+503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later.
diff --git a/source/includes/assessment/_errors.md b/source/includes/assessment/_errors.md
new file mode 100644
index 00000000000..9d91488b379
--- /dev/null
+++ b/source/includes/assessment/_errors.md
@@ -0,0 +1,8 @@
+# Errors
+
+Successful requests should generate a response with a 200-level status code. Unsuccessful requests should generate a response with one of the following responses:
+
+Status Code | Description
+-------------- | --------------
+401 | Unsuccessful authentication with the provided API key.
+404 | The requested resource could not be found.
diff --git a/source/includes/assessment/_introduction.md b/source/includes/assessment/_introduction.md
new file mode 100644
index 00000000000..b5831da1c65
--- /dev/null
+++ b/source/includes/assessment/_introduction.md
@@ -0,0 +1,82 @@
+# Introduction
+
+Greenhouse integrates with many candidate testing platforms, including code testing, video interviewing, personality testing, and more. We've created the Assessment Partner API to allow our customers to seemlessly integrate our Partners' assessments into their Greenhouse interview workflow. This document outlines the end-user experience with the integration and the technical details of how to implement it.
+
+### Working with Greenhouse to implement the integration
+
+To begin the integration process, please send the following information to us at partners@greenhouse.io:
+
+1. URL for your `list_tests` API call
+2. URL for your `send_test` API call
+3. URL for your `test_status` API call
+4. URL for your `response_error` API call
+5. A sample API key
+
+The Partnerships team will configure endpoint URLs for creating assessment stages and provide next steps on receiving access to a Sandbox account to test the integration. If you are building an integration for use by mutual customers, we will need documentation on the integration for the Greenhouse Help Center.
+
+## Workflow
+
+The Assessment Partner will provide an org-level API key to the customer. The organization will provide this API key to their Greenhouse Account Manager, who will input it into our system.
+
+### Selecting the Test
+
+Once Greenhouse enters the API key for the organization, a new partner interview stage will be available for use. The user can add this stage to the Hiring Plan of any job that has access to the new Assessment Partner stage. Greenhouse will then make an API call to the [List Tests endpoint](#list-tests) to determine what tests the organization has configured.
+
+
+
+### Sending the Test
+
+When a candidate reaches this Interview Stage, the user will click the "Send Test" button to send the test to the candidate via the [Send Test endpoint](#send-test). Greenhouse will send the Test ID and candidate email to the Assessment Partner, who will email the test to the candidate. The Assessment Partner will then send Greenhouse the ID for this unique test instance.
+
+
+
+### Receiving the Test Results
+
+Greenhouse will periodically poll the [Test Status endpoint](#test-status) to retrieve the candidate's test status and results. When the candidate completes the test, Greenhouse will notify the appropriate user that the test is complete. The user will be able to view the candidate's score, navigate to the partner site to see more details, and make an advance or reject decision within Greenhouse. The user will also be able to filter candidates by score and advance or reject candidates in bulk.
+
+Alternatively, Greenhouse's Assessment API now includes the ability to notify Greenhouse of completed tests via the [PATCH - Mark Test as Completed endpoint](#patch-mark-test-as-completed) to avoid long polling!
+
+**Note**: You can only update test statuses for active, unhired candidates.
+
+## Authentication
+
+Every request Greenhouse sends to a Assessment Partner’s API will utilize HTTP Basic Authentication over HTTPS. As such, we require each of the API endpoints to use HTTPS.
+
+When an organization decides to utilize a Assessment Partner’s integration, they will provide their Greenhouse Account Manager with their API key for that Assessment Partner.
+
+Greenhouse will then make all requests for the organization using that API key as the username in Basic Authentication. Greenhouse will append a : (colon) to the API token and then Base64 encode the resulting string.
+
+Upon receiving a request, the Assessment Partner should inspect the API key to determine whether the request should be permitted and which data should be returned.
+
+### Example Situation
+
+- _Assessment Partner A_ provided _Customer 1_ with an API key.
+- _Customer 1_ provided this key to Greenhouse.
+- _Assessment Partner A_ provided the following URL for its `list_tests` endpoint:
+
+ *https://www.testing-partner-a.com/api/list_tests*
+
+- Greenhouse would make the following request to retrieve the list of available tests:
+
+ *GET https://www.testing-partner-a.com/api/list_tests*
+ *Authorization: Basic < base-64-encoded-credentials >*
+
+## General considerations
+
+Unless otherwise specified, API methods generally conform to the following:
+
+- Properties without a value will use `null` instead of being undefined
+- "Snake Case" is used for attribute names (e.g. `first_name`)
+- We reserve the right to add more properties to objects, but will never change or remove them
+
+## Assessment API Change Log
+
+The timestamps below are Eastern Time.
+
+| Date | Description |
+| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
+| Oct 19, 2023 12:30:00PM | Clarified use of Assessment API for active, unhired candidates in [Introduction](#introduction) and [Test Status](#test-status) |
+| Oct 13, 2023 3:00:00PM | Added URL for `response_error` as a requirement in [Introduction](#introduction) |
+| Aug 22, 2023 3:00:00PM | Fixed URL expiry timing in [Send Test](#send-test) |
+| Aug 21, 2019 2:00:00PM | Added Change Log and General Consideration sections to the Assessment API documentation |
+| Aug 21, 2019 2:00:00PM | Added [PATCH - Mark Test as Completed](#patch-mark-test-as-completed) endpoint |
diff --git a/source/includes/assessment/_list_tests.md b/source/includes/assessment/_list_tests.md
new file mode 100644
index 00000000000..dd9fa07acd9
--- /dev/null
+++ b/source/includes/assessment/_list_tests.md
@@ -0,0 +1,41 @@
+# List Tests
+
+Greenhouse will first need to retrieve the list of tests from the Assessment Partner using the `list_tests` API endpoint. We will show the list of available tests to the user, who will to select the appropriate test for a given candidate.
+
+`GET https://www.testing-partner.com/api/list_tests`
+
+```shell
+curl 'https://www.testing-partner.com/api/list_tests'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+### Request
+
+Greenhouse will make a GET request to the `list_tests` endpoint specified by the Assessment Partner.
+
+### Response
+
+> API Response
+
+```json
+[
+ {
+ "partner_test_id": "12345",
+ "partner_test_name": "My First Test"
+ },
+ {
+ "partner_test_id": "54321",
+ "partner_test_name": "My Second Test"
+ }
+]
+```
+
+
+The Assessment Partner’s response should include a JSON payload containing a list of test objects for the organization. Each test object should contain the keys `partner_test_id` and `partner_test_name.`
+
+
+
+Property Name | Type | Required | Description
+-------------- | -------------- | -------------- | --------------
+partner_test_id | String | Yes | Identifies a test available to an organization.
+partner_test_name | String | Yes | A descriptive title for the test. We will use this value our UI as the test’s label.
diff --git a/source/includes/assessment/_patch_completed_test.md b/source/includes/assessment/_patch_completed_test.md
new file mode 100644
index 00000000000..e2ad4dda2aa
--- /dev/null
+++ b/source/includes/assessment/_patch_completed_test.md
@@ -0,0 +1,19 @@
+# PATCH - Mark Test as Completed
+
+When a candidate completes a test, send this request to the URL sent in the initial Send Test request to signal Greenhouse that the test has been completed. Upon this, Greenhouse will send a request to your Test Status endpoint.
+
+`PATCH https://app.greenhouse.io/integrations/testing_partners/take_home_tests/12345`
+
+### Request
+
+```shell
+curl -X PATCH 'https://app.greenhouse.io/integrations/testing_partners/take_home_tests/12345'
+
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+No parameters are necessary with this request.
+
+### Response
+
+The response will return only the HTTP status code.
\ No newline at end of file
diff --git a/source/includes/assessment/_response_error.md b/source/includes/assessment/_response_error.md
new file mode 100644
index 00000000000..342ce8fa256
--- /dev/null
+++ b/source/includes/assessment/_response_error.md
@@ -0,0 +1,56 @@
+# Response Error
+
+When Greenhouse receives a malformed response for any of Assessment Partner's API endpoints, we would like to report the errors to the Assessment Partner. As such, each Assessment Partner should provide an API endpoint to ingest this information.
+
+`POST https://www.testing-partner.com/api/request_errors`
+
+### Request
+
+
+```shell
+curl -X POST 'https://www.testing-partner.com/api/request_errors'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "api_call": "test_status",
+ "errors": ["partner_status is 'complete' but partner_profile url is missing"],
+ "partner_test_id" : "12345",
+ "partner_test_name": "Personality Test",
+ "partner_interview_id": "299506",
+ "candidate_email": "hpotter@hogwarts.edu"
+}
+```
+
+After receiving a malformed response, Greenhouse will provide the Assessment Partner with the details of the failed response. Each time an invalid response arrives, Greenhouse will send a POST request to the `response_error` API endpoint.
+
+The body of the request will contain as much information as Greenhouse has at the moment of failure.
+
+For example, if a `list_tests` request fails, Greenhouse can only provide the api call (in this case, ‘list_tests’) and the assorted errors (missing keys, unexpected data types, etc.). However, if a `test_status` request fails, we can provide more information (partner_test_id, partner_interview_id, etc.) that may prove useful for debugging purposes. Assessment Partners can always expect to receive `api_call` and `errors` in the JSON body.
+
+Property Name | Value | Required | Description
+-------------- | -------------- | -------------- | --------------
+api_call | String | Yes | The name of the API call that generated the malformed response.
+errors | Array | Yes | An array of strings which describe an error that prevented the response from validating.
+partner_test_id | String | No | Identifies a test available to an organization. Initially provided as a response to the [List Tests request] (#list-tests).
+partner_test_name | String | No | A human-readable string that identifies the test. Initially provided as a response to the [List Tests request] (#list-tests).
+partner_interview_id | String | No | Identifies a candidate’s test.
+candidate_email | String | No | The candidate’s email address. The test should be sent to this address.
+
+
+
+### Response
+
+> API Response
+
+```json
+{
+ "status": 200
+}
+```
+
+The response to a successful `response_errors` request should contain a response code of 200.
+
\ No newline at end of file
diff --git a/source/includes/assessment/_send_test.md b/source/includes/assessment/_send_test.md
new file mode 100644
index 00000000000..200416fcde9
--- /dev/null
+++ b/source/includes/assessment/_send_test.md
@@ -0,0 +1,58 @@
+# Send Test
+
+When a Greenhouse user sends a test to a candidate, Greenhouse will send a request to the Assessment Partner's `send_test` API endpoint. The Assessment Partner will then email the specified candidate the specified test.
+
+### Request
+
+```shell
+curl -X POST 'https://www.testing-partner.com/api/send_test'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "partner_test_id": "12345",
+ "candidate": {
+ "first_name": "Harry",
+ "last_name": "Potter",
+ "resume_url": "https://hogwarts.com/resume",
+ "phone_number": "123-456-7890",
+ "email": "hpotter@hogwarts.edu",
+ "greenhouse_profile_url": "https://app.greenhouse.io/people/17681532?application_id=26234709"
+ },
+ "url": "https://app.greenhouse.io/integrations/testing_partners/take_home_tests/12345"
+}
+```
+
+Greenhouse will initiate the process by sending a POST request to the `send_test` endpoint specified by the Assessment Partner. The body of the POST request will contain a JSON payload.
+
+| Property Name | Type | Required | Description |
+| ---------------------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------- |
+| partner_test_id | String | Yes | Identifies a test available to an organization. Initially provided as a response to the [List Tests request](#list-tests). |
+| first_name | String | Yes | The first name of the candidate. |
+| last_name | String | Yes | The last name of the candidate. |
+| resume_url | String | No | A URL to the candidate’s resume. This URL will expire 7 days after the request. |
+| phone_number | String | No | The candidate’s phone number. |
+| email | String | Yes | The candidate’s email address. The test should be sent to this address. |
+| greenhouse_profile_url | String | Yes | URL to the candidate’s Greenhouse application. Allows the partner to link back to Greenhouse. |
+| url | String | Yes | URL to which to send the [PATCH Completed Test](#patch-mark-test-as-completed) request, if using |
+
+### Response
+
+> The API Response
+
+```json
+{
+ "partner_interview_id": "98765"
+}
+```
+
+The response to the `send_test` request should contain a JSON payload in its body. This payload should be a single object that contains a single key: `partner_interview_id`.
+
+| Property Name | Type | Required | Description |
+| -------------------- | ------ | -------- | ------------------------------ |
+| partner_interview_id | String | Yes | Identifies a candidate’s test. |
+
+
diff --git a/source/includes/assessment/_test_status.md b/source/includes/assessment/_test_status.md
new file mode 100644
index 00000000000..c30a7315c35
--- /dev/null
+++ b/source/includes/assessment/_test_status.md
@@ -0,0 +1,67 @@
+# Sending Updates to Greenhouse
+
+### If you have implemented the polling option:
+
+After a successful `send_test` request, Greenhouse will check whether the test instance has been completed by polling the `test_status` endpoint hourly. We will discontinue polling the `test_status` endpoint after the candidate is marked as hired, after we receive a `partner_status` of `complete`, or after 8 weeks have passed since the test was sent.
+
+### If you have implemented the PATCH Completed Test option:
+
+After a successful `send_test` request, you can alert Greenhouse to updates of the test's status by sending a [PATCH Completed Test](#patch-mark-test-as-completed) request to the URL found in the `url` field of the `send_test` request. This will trigger a [Test Status](#test-status) request from Greenhouse. Active, unhired candidates will show the completed test status.
+
+# Test Status
+
+Tells Greenhouse the current status of a take home test.
+
+`GET https://www.testing-partner.com/api/test_status?partner_interview_id=12345`
+
+### Request
+
+```shell
+curl 'https://www.testing-partner.com/api/test_status?partner_interview_id=12345'
+
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+Greenhouse will send a `GET` request to the `test_status` endpoint provided by the Assessment Partner. The `GET` request will contain a single query string parameter: `partner_interview_id`.
+
+Parameter Name | Type | Required | Description
+-------------- | -------------- | -------------- | --------------
+partner_interview_id | String | Yes | Identifies a test instance for a candidate. Initially provided as a response to the [Send Test request] (#send-test).
+
+
+
+
+### Response
+
+> API Response
+
+```json
+{
+ "partner_status": "complete",
+ "partner_profile_url": "http://example.com/tests/12345",
+ "partner_score": 81,
+ "metadata":
+ {
+ "Started At": "10:15 AM 26 March 2014",
+ "Completed At": "10:15 AM 26 March 2014",
+ "Notes": "This candidate did extremely well!"
+ }
+
+}
+```
+
+The response to a `test_status` request should contain a JSON object in its body with up to four keys:
+`partner_status`, `partner_profile_url`, `partner_score`, and `metadata`.
+
+Property Name | Type | Required | Description
+-------------- | -------------- | -------------- | --------------
+partner_status | String | Yes | Describes the current state of the test instance. If the test has been completed and results are available, this value should be **"complete".** We will continue to poll until the status is "complete", or until 8 weeks has passed since the test was sent.
+partner_profile_url| String | Required only if status is **complete**. | URL to the candidate’s page on the Test Partner’s website.
+partner_score | Number | No | Numerical score reflecting the candidate’s performance on the test.
+metadata | Object | No | A non-nested object containing keys and values that will be displayed in our test results. All of the values must be Javascript primitives.
+
+
diff --git a/source/includes/audit-log/_events.md b/source/includes/audit-log/_events.md
new file mode 100644
index 00000000000..e8a5aeeb1f1
--- /dev/null
+++ b/source/includes/audit-log/_events.md
@@ -0,0 +1,117 @@
+# Events
+
+## The events object
+
+The events object is the audit log’s collected record of important events in Greenhouse Recruiting from the previous thirty days. A single event may return multiple results. For instance, an event and its resulting changes will return individual results that can be linked by `request.id`.
+
+### Attributes
+Attribute | Definition
+--------- | -----------
+organization_id | Your organization’s unique Greenhouse Recruiting ID
+event_time | The exact time of the event, represented in `ISO-8601` format like `2024-02-03T16:38:46.985Z`
+request.id | The ID of the request
+request.type | The name of the action taken in Greenhouse Recruiting, or the request URL if from Harvest API
+performer.id | The Greenhouse Recruiting user ID of the person who performed the change or the API key if performed via [Greenhouse API](http://developers.greenhouse.io)
+performer.type | One of the following values: `user`, `api_key`, or `greenhouse_internal`
+performer.meta | The Greenhouse Recruiting email address of the person who performed the change or the exact type of API key that performed the change
+performer.ip_address | The IP address of the person or integration that performed the change
+event.type | One of the following values: `data_change_update`, `data_change_create`, `data_change_destroy`, `harvest_access`, or `action`
+event.target_id | The ID of the element that was edited or accessed; this may be blank if the action does not target one particular ID
+event.target_type | The resource name for data changes, Harvest access, or the event action type for other actions
+event.meta | The before and after values from data change events, or other relevant data for the event such as the title of a report
+
+## GET: Retrieve events
+```shell
+HTTP request
+
+curl -X GET 'https://auditlog.us.greenhouse.io/events'
+-H "Content-Type: application/json"
+-H "Authorization: Bearer MeyJhbGci.eyJhdWQiO"
+
+{
+ "paging": {
+ "pit_id": "cmFuZG9tX3ZhbHVl",
+ "search_after": null,
+ "size": "100",
+ "next_search_after": "1685989175"
+ },
+ "hits": 2,
+ "results": [
+ {
+ "request": {
+ "id": "1234zID",
+ "type": "email_settings#create_organization_email"
+ },
+ "performer": {
+ "meta": {
+ "name": "Allison Jamie",
+ "username": "allison.j@omniva-corp.com"
+ },
+ "id": 12345,
+ "ip_address": "192.168.0.1",
+ "type": "user"
+ },
+ "organization_id": 123,
+ "event": {
+ "meta": null,
+ "target_type": "Global Email Added",
+ "type": "action"
+ },
+ "event_time": "2023-06-02T16:06:19.217Z"
+ },
+ {
+ "request": {
+ "id": "1234zID",
+ "type": "email_settings#create_organization_email"
+ },
+ "performer": {
+ "meta": {
+ "name": "Allison Jamie",
+ "username": "allison.j@omniva-corp.com"
+ },
+ "id": 12345,
+ "ip_address": "192.168.0.1",
+ "type": "user"
+ },
+ "organization_id": 123,
+ "event": {
+ "meta": {
+ "id": [
+ null,
+ 1234
+ ],
+ "value": [
+ null,
+ "johnny.c@omniva-corp.com"
+ ]
+ },
+ "target_type": "OrganizationEmail",
+ "target_id": 1234,
+ "type": "data_change_create"
+ },
+ "event_time": "2023-06-02T16:06:19.137Z"
+ }
+ ]
+}
+```
+#### HTTP request
+
+`GET https://auditlog.us.greenhouse.io/events/`
+
+#### URL Parameters
+
+Parameter | Definition
+--------- | -----------
+before_time (optional) | Use this parameter to retrieve audit log before a certain point in time, represented in `ISO-8601` format like `2024-02-03T16:38:46.985Z`. This parameter can be combined with after_time for a date range.
+after_time (optional) | Use this parameter to retrieve audit log after a certain point in time, represented in `ISO-8601` format like `2024-02-03T16:38:46.985Z`. This parameter can be combined with before_time for a date range.
+date (optional) | Use this parameter to retrieve audit log from a specific date, represented in `ISO-8601` format like `2024-02-03`.
+magic_time (optional) | Use this parameter to retrieve audit log results from a trailing range in time. This parameter takes a value in `last{#x}` where `#` is a number and `x` is seconds, minutes, hours, days, or weeks, like `last7days` or `last15minutes`.
+performer_ids (optional) | Use this parameter to retrieve audit log results matching one or more [performer IDs](https://support.greenhouse.io/hc/en-us/articles/15075283790107), which are Greenhouse Recruiting user IDs. Separate multiple IDs by a comma.
+performer_types (optional) | Use this parameter to retrieve audit log results matching one or more [performer types](https://support.greenhouse.io/hc/en-us/articles/15075283790107): `user`, `api_key`, or `greenhouse_internal`. Separate multiple performer types by a comma.
+performer_ip_addresses (optional) | Use this parameter to retrieve audit log results matching one or more [performer IP addresses](https://support.greenhouse.io/hc/en-us/articles/15075283790107). Separate multiple IP addresses by a comma.
+event_types (optional) | Use this parameter to retrieve audit log results matching one or more [event types](https://support.greenhouse.io/hc/en-us/articles/15075283790107): `data_change_update`, `data_change_create`, `data_change_destroy`, `harvest_access`, or `action`. Separate multiple event types by a comma.
+event_target_ids (optional) | Use this parameter to retrieve audit log results matching one or more [event target IDs](https://support.greenhouse.io/hc/en-us/articles/15075283790107), which reflect the element that was created, edited or accessed. Separate multiple event target IDs by a comma.
+event_target_types (optional) | Use this parameter to retrieve audit log results matching one or more [event target types](https://support.greenhouse.io/hc/en-us/articles/15075283790107). Separate multiple event target types by a comma.
+request_ids (optional) | Use this parameter to retrieve audit log results matching one or more [request IDs](https://support.greenhouse.io/hc/en-us/articles/15075283790107). A single event in audit log may return multiple results. An event and its resulting changes will return individual results that can be linked by request ID. Separate multiple request IDs by a comma.
+request_types (optional) | Use this parameter to retrieve audit log results matching one or more [request types](https://support.greenhouse.io/hc/en-us/articles/15075283790107). Separate multiple request types by a comma.
+paging (optional) | Use this parameter for [pagination](https://developers.greenhouse.io/audit-log.html#pagination). When set to `true`, we return a `pit_id` that can be used to paginate query results.
diff --git a/source/includes/audit-log/_introduction.md b/source/includes/audit-log/_introduction.md
new file mode 100644
index 00000000000..27f6b0225f7
--- /dev/null
+++ b/source/includes/audit-log/_introduction.md
@@ -0,0 +1,100 @@
+# Introduction
+Audit log offers a record of important events from the prior thirty days, providing insights to who accessed or edited information in Greenhouse Recruiting.
+
+Use audit log to empower your teams to detect and minimize the impact of incidents when they occur, scrutinize configuration edits, and ensure sensitive data is only accessed by the people who truly need it. Learn more about [what to expect with audit log](https://support.greenhouse.io/hc/en-us/articles/15074318933275).
+
+
+
+## Authentication
+Audit log uses bearer authorization over HTTPS with a valid access token. You’ll need a Harvest API key to generate an access token, returned through the Harvest endpoint [POST: Authenticate audit log](#post-authenticate-audit-log). Use the access token as your bearer to authenticate audit log API requests.
+
+### The authenticate audit log object
+The authenticate audit log object returns an access token that is valid for 24 hours, which can be used to authenticate your requests to [the events object](#the-events-object).
+
+### Attributes
+Attribute | Definition
+--------- | -----------
+access_token | A JWT (JSON web token) that’s valid for 24 hours from the time of creation.
+expires | The exact time the access token will expire in `ISO-8601` format, like `2024-02-03T16:38:46.985Z`.
+
+
+### POST: Authenticate audit log
+```shell
+HTTP request
+
+curl -X POST 'https://harvest.greenhouse.io/auth/jwt_access_token'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFmE2MWwNjdlMjQ6"
+
+{
+ "access_token": "MeyJhbGci.eyJhdWQiO",
+ "expires": 2024-02-03T16:38:46.985Z
+}
+```
+#### HTTP request
+
+`POST https://harvest.greenhouse.io/auth/jwt_access_token`
+
+
+
+## Rate limiting
+```shell
+Status: 200 OK
+X-RateLimit-Limit: 50
+X-RateLimit-Remaining: 49
+```
+
+Audit log API requests are limited to 50 per 10 seconds, as specified in the returned `X-RateLimit-Limit` header. Paginated requests are limited to 3 per 30 seconds. Check the `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers to see how many more requests are permitted until throttling kicks in. Exceeding the limit will return an `HTTP 429` response.
+
+
+
+## Pagination
+Pagination on audit log API allows for retrieving the next page from your query results. Use the `paging` [query parameter](https://developers.greenhouse.io/audit-log.html#the-events-object) to receive a `pit_id` with your results. To retrieve the next page of results, the `pit_id` should be the value of your `pit_id` header, and the `next_search_after` should be the value of your `search_after` header. Your query parameters should remain consistent with your original query. Audit log results with only one page will return `null` results on the next page.
+
+- `pit_id`. The ID from a specific [point in time (PIT)](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pit.html) in a fixed time dataset, created automatically when you run a query.
+- `search_after`. Use this parameter to retrieve audit log after a specific page in the search results when running a query with the `pit_id`.
+- `size`. The size of the requested query. This parameter has a minimum value of `100` and a maximum value of `500`.
+
+Audit log API requests are rate limited. Paginated requests are limited to 3 per 30 seconds, and overall requests are limited to 50 per 10 seconds. Exceeding the limit will result in [throttling](https://developers.greenhouse.io/audit-log.html#throttling).
+
+## Validation
+Any methods that take input will validate all parameters. Any parameter that fails validation will trigger an error response with status `HTTP 422`. The response body will be a JSON object that includes a message as well as a list of fields that failed validation.
+
+## General considerations
+
+
+Unless otherwise specified, audit log API methods generally conform to the following standards:
+
+- Properties without a value will use `null` instead of being undefined.
+- “Snake case” is used for attributes and headers, like `first_name`.
+- Timestamps are rendered in `ISO-8601` format, like `2024-02-03T16:38:46.985Z`.
+- URLs to external resources are valid for thirty days.
+- Resumes, cover letters, and other document attachments are hosted on Amazon Web Services and are provided via signed, temporary URLs. Due to the temporary nature of these resources, you should download the documents immediately after your request is made. You shouldn’t rely on these URLs to be available in future requests. In the event AWS is experiencing issues, document attachments won’t be available in audit log.
+
+## Errors
+
+| Error Code | Meaning |
+|------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| 401 | Unauthorized -- Your access token is invalid or has expired. Access tokens expire 24 hours after generation. Ensure you’re sharing a [valid access token](#authentication) in the authorization header. |
+| 403 | Forbidden -- You do not have access to that record. |
+| 404 | Not Found -- Resource not found |
+| 422 | Not processed -- We’re not able to process your request. Validate your parameters. |
+| 429 | Rate limit exceeded -- You’re being [throttled](#throttling) for exceeding our rate limit. |
+| 500 | Server Error -- We’re having a problem with our server. Give us a few minutes and try again, or check [our status page](https://status.greenhouse.io/). |
+
+## Audit Log Change Log
+
+| Date | Description |
+|-------------------------------| --------------------------------------------------------------------------------------------------------------------------------- |
+| Dec 12, 2023 | Fix bug with missing GET events in nav menu
+| Nov 7, 2023 | Removed On-Behalf-Of header from the [events object](#events) sample payload
+| Nov 6, 2023 | Updated Throttling section to Rate limiting and updated approach to rate limiting.
+| Oct 26, 2023 | Updated Pagination to reflect new approach to returning `pit_ids`.
+| July 14, 2023 | We added new query parameters to the Events endpoint, including `performer_ids`, `performer_types`, `performer_ip_addresses`, `event_types`, `event_target_ids`, `event_target_types`, `request_ids`, and `request_types`.
\ No newline at end of file
diff --git a/source/includes/candidate-ingestion/_candidates.md b/source/includes/candidate-ingestion/_candidates.md
new file mode 100644
index 00000000000..d02937715bc
--- /dev/null
+++ b/source/includes/candidate-ingestion/_candidates.md
@@ -0,0 +1,201 @@
+# Candidates
+
+## Retrieve Candidates
+
+```shell
+curl 'https://api.greenhouse.io/v1/partner/candidates'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "candidate_ids": 17681532
+}
+```
+
+>API Response
+
+
+```json
+{
+ "id": 17681532,
+ "name": "Harry Potter",
+ "external_id": "24680",
+ "applications": [
+ {
+ "id": 59724,
+ "job": "Auror",
+ "status": "Active",
+ "stage": "Application Review",
+ "profile_url": "https://app.greenhouse.io/people/17681532?application_id=26234709"
+ }
+ ]
+}
+```
+
+Retrieve a candidate's data. Note that this call will only return candidates that the current user has permission to view.
+
+`GET https://api.greenhouse.io/v1/partner/candidates`
+
+
+*scope: candidates.view*
+
+### Request Parameters
+
+The request should contain a single query parameter that specifies a comma-delimited list of candidate IDs or a single candidate ID. If you provide any candidate ids that don't exist or to which you do not have access, this endpoint will ignore them and only return the candidates that exist to this API key or Bearer token, or will return an empty response if you have only supplied one candidate ID.
+
+An empty array will be returned for "Retrieve Candidates" requests with a single candidate ID for the following use-cases:
+
+1. Permissions changes made on a Greenhouse user account associated to the email address used to authenticate the request (e.g. User has been disabled or deprovisioned).
+2. The candidate is on a job that the user account/email address doesn't have access to. Note that the user account must be at least a job admin on the job associated to the candidate ID. If added as a prospect, the user must have the permission to manage unattached prospects.
+3. The candidate profile was manually deleted by the organization.
+4. The source on the candidate profile was manually changed to a new source different from the original partner source.
+5. The candidate has been merged with another profile generating a new candidate ID.
+
+If you would like more information about why you are not able to access a specific candidate ID, please contact the customer for more details, as Greenhouse Support will not share candidate details without the permission of the organization that owns the candidate record.
+
+Query Parameter Name | Required | Description
+-------------- | -------------- | -------------- | --------------
+candidate_ids | Yes | Comma-delimited list of Candidate IDs (e.g. 123, 456)
+
+
+### Response Parameters
+
+The response will always be an array of objects, even if only one `candidate_id` is provided.
+
+Property Name | Type | Description
+------------------------ | -------------- | --------------
+id | Integer | The ID of the candidate
+external_id | String | The external ID that was provided in your initial candidate creation request. Can be null if you request the status of a candidate not associated with an external entity.
+applications[] | Array | An array containing 0 or more applications representing the jobs to which this candidate has applied. Each of the sub-elements are required for each of the applications.
+applications.id | Integer | The ID of the application.
+applications.job | String | Name of the job this application is for (e.g. "Software developer).
+applications.status | String | The candidate’s current status. Must be one of "rejected," "active," or "hired."
+applications.stage | String | The applicant’s current stage in the interview pipeline (e.g. "Recruiter Phone Screen").
+applications.profile_url | String | A URL to the candidate’s profile in Greenhouse. You must be signed in to Greenhouse to view the profile.
+
+
+
+## Post Candidates
+
+```shell
+curl -X POST 'https://api.greenhouse.io/v1/partner/candidates'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+-H "Content-Type: application/json"
+```
+
+```json
+{
+ "prospect": "true",
+ "first_name": "Harry",
+ "last_name": "Potter",
+ "company": "Hogwarts",
+ "title": "Student",
+ "resume": "https://hogwarts.com/resume",
+ "phone_numbers": [
+ {
+ "phone_number": "123-456-7890",
+ "type": "home"
+ }
+ ],
+ "emails": [
+ {
+ "email": "hpotter@hogwarts.edu",
+ "type": "other"
+ }
+ ],
+ "social_media": [
+ {
+ "url": "https://twitter.com/hp"
+ }
+ ],
+ "websites": [
+ {
+ "url": "https://harrypotter.com",
+ "type": "blog"
+ }
+ ],
+ "addresses": [
+ {
+ "address": "4 Privet Dr",
+ "type": "home"
+ }
+ ],
+ "job_id": 12345,
+ "external_id": "24680",
+ "notes": "Good at Quiddich",
+ "prospect_pool_id": 123,
+ "prospect_pool_stage_id": 456,
+ "prospect_owner_email": "prospect_owners_email@example.com"
+}
+```
+
+
+> API Response
+
+```json
+{
+"id": 12345,
+"application_id": 17681532,
+"external_id": "24680",
+"profile_url": "https://app.greenhouse.io/people/17681532?application_id=26234709"
+}
+```
+
+
+Create one or more candidates or prospects
+
+
+`POST https://api.greenhouse.io/v1/partner/candidates`
+
+
+*scope: candidates.create*
+
+
+### Request Parameters
+
+
+Property Name | Type | Required | Description
+-------------- | -------------- | -------------- | --------------
+prospect | Boolean | No | True if this candidate should be a prospect. The organization must be able to create prospects to set this field. (Default: true)
+job_id | Integer | Mixed | Required only if prospect is false. The ID of the job to which this candidate or prospect should be added.
+first_name | String | Yes
+last_name | String | Yes
+external_id | String | Yes | The unique id of this candidate in your application’s system.
+company | String | No | Candidate's current company
+title | String | No | Candidate's current title
+resume | String | No | URL to the candidate’s resume. Greenhouse will attempt to ingest the document at this URL and add it to the candidate record.
+phone_numbers[] | Array | No
+phone_numbers.phone_number | String | Mixed | Only required if phone_number is included.
+phone_numbers.type | String | Mixed | Must be "mobile", "home", "work", or "other." Only required if phone_number is included.
+emails[] | Array | No
+emails.email | String | Mixed | Note: Only required if email is included.
+emails.type | String | Mixed | Must be "personal", "work", or "other". Only required if email is included.
+addresses[] | Array | No
+addresses.address | String | Mixed | A free form block of text, which may include newlines ("\n"). Only required if addresses are included.
+addresses.type | String | Mixed | Must be "home", "work", or "other". Only required if addresses are included.
+social_media[] | Array | No
+social_media.url | String | Mixed | Note: Only required if social media urls are included.
+websites[] | Array | No
+websites.url | String | Mixed | Note: Only required if websites are included.
+websites.type | String | Mixed | Must be either “personal”, “company”, “portfolio”, “blog”, or “other”. Only required if websites are included.
+referrer | Object | No | If present, this value will be used to populate the "Who Gets Credit" field for the candidate’s application. If omitted, the "Who Gets Credit" field will be populated with the current user’s information.
+referrer.email | String | Mixed | Used to match this referrer with an existing Greenhouse user, if possible. Only required if referrer is included.
+referrer.first_name | String | Mixed | Used to create a new ‘Referrer’ in Greenhouse if referrer.email does not match an existing user. Only required if referrer is included.
+referrer.last_name | String | Mixed | Used to create a new ‘Referrer’ in Greenhouse if referrer.email does not match an existing user. Only required if referrer is included.
+notes | String | No | Free-form plain-text notes about this candidate. One way for this to be used is to send secondary information that our API can’t capture as structured data. For example: "Skills: Java, C++, Python"
+prospect_pool_id | Integer | Mixed | Used to put a prospect in the Prospect Pool with this id. Only required if prospect_pool_stage_id is included. "prospect" property must be set to true.
+prospect_pool_stage_id | Integer | No | Used to put a prospect in the Prospect Pool Stage with this id. The stage must belong to the prospect pool provided in prospect_pool_id. "prospect" property must be set to true.
+prospect_owner_email | String | No | Used to set the prospect owner for a prospect by providing a valid user's email that exists in Greenhouse. "prospect" property must be set to true.
+
+
+### Response Parameters
+
+ The API will respond with a single object if a single object was provided or an array of objects if an array was provided.
+
+Property Name | Type | Description
+-------------- | -------------- | --------------
+id | Integer | The ID of the newly created candidate in Greenhouse.
+application_id | Integer | The ID of the application implicitly created in Greenhouse.
+external_id | String | The external ID that was provided in your request.
+profile_url | String | A URL to the candidate’s profile within Greenhouse. The user must be signed into Greenhouse to view the profile.
diff --git a/source/includes/candidate-ingestion/_current_user.md b/source/includes/candidate-ingestion/_current_user.md
new file mode 100644
index 00000000000..2774086ce7f
--- /dev/null
+++ b/source/includes/candidate-ingestion/_current_user.md
@@ -0,0 +1,39 @@
+# Current User
+
+## Retrieve Current User
+
+```shell
+curl 'https://api.greenhouse.io/v1/partner/current_user'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> API Response
+
+```json
+{
+ "full_name": "Ron Weasley",
+ "first_name": "Ron",
+ "last_name": "Weasley",
+ "email": "rweasley@hogwarts.edu",
+ "id": 1234
+}
+```
+
+Retrieve details about the current user
+
+
+`GET https://api.greenhouse.io/v1/partner/current_user`
+
+
+### Request Parameters
+
+This request is simply the URL. It takes no parameters.
+
+### Response Parameters
+
+Property Name | Type | Description
+------------- | -------------- | --------------
+full_name | String | The current user's full name
+first_name | String | The current user's first name
+last_name | String | The current user's last name
+email | String | The email address associated with the current user
+id | Integer | The ID of the current user
\ No newline at end of file
diff --git a/source/includes/candidate-ingestion/_errors.md b/source/includes/candidate-ingestion/_errors.md
new file mode 100644
index 00000000000..c7bed2bcd2b
--- /dev/null
+++ b/source/includes/candidate-ingestion/_errors.md
@@ -0,0 +1,30 @@
+# Errors
+
+```json
+{
+ "errors": [
+ {
+ "message": "Your request included invalid JSON.",
+ "field": "email"
+ }
+ ]
+}
+```
+
+Successful API responses will have a 200-level HTTP status code. If there is a problem processing your request, you will receive a response with a 4xx- or 5xx-level status code as follows:
+
+Status Code | Description
+-------------- | --------------
+400 | Your request included invalid JSON.
+401 | You have not been authenticated.
+403 | You have been authenticated, but your Greenhouse user does not have permission to the resource.
+404 | The resource you requested could not be found.
+5xx | There was an error on our end. You may retry at a later time or contact support if the problem persists.
+
+### Error Properties
+
+Property Name | Type | Required | Description
+-------------- | -------------- | -------------- | --------------
+errors[] | Array | | Yes |
+errors.message | String | Yes | A message describing the error. This is for debugging purposes and is not intended to be displayed to the end-user. The exact text should not be relied on programmatically.
+errors.field | String | No | The offending field in the request that caused the error, if applicable.
diff --git a/source/includes/candidate-ingestion/_introduction.md b/source/includes/candidate-ingestion/_introduction.md
new file mode 100644
index 00000000000..5f39925f2f7
--- /dev/null
+++ b/source/includes/candidate-ingestion/_introduction.md
@@ -0,0 +1,118 @@
+# Introduction
+
+The Candidate Ingestion API enables sourcing partners with whom Greenhouse shares mutual customers to submit prospects and candidates.
+
+The API allows partners to:
+
+1. Send candidates from the partner application to Greenhouse.
+2. Retrieve the current stage and status of candidates.
+3. Retrieve jobs on which the Greenhouse user is allowed to operate.
+
+Note: The organization must be able to create prospects in order to create prospects using the Candidate Ingestion API.
+
+## Authentication
+
+This API offers two methods of authentication: OAuth 2.0 and Basic Auth.
+
+### Authentication via OAuth 2.0
+
+If the mutual customer’s users have accounts in both Greenhouse and the partner’s system, the preferred authentication method is [OAuth 2.0](https://tools.ietf.org/html/rfc6749). In this case, the partner would place an integration option on their website which would allow the user to authenticate in to Greenhouse via the partner’s application. This is similar to allowing people to register for a website using Facebook credentials. For a partner to configure this, they must supply Greenhouse with the following information:
+
+1. **Application Name**: The name of the application as it would appear in Greenhouse.
+2. **Application URL**: The URL to the primary application.
+3. **Callback URL**: This is the URL to which Greenhouse will send
+ authenticated users.
+4. **Logo Image**: This is a 128x128 image that will be included in the
+ permissions modal.
+
+When Greenhouse receives this information, we will supply the partner with a consumer key, a consumer secret, a token URL, and an authorize URL. For example:
+
+| Attribute | Example Value |
+| --------------- | ----------------------------------------- |
+| Consumer Key | bMipe4KWf987654321GrLG1Nfk1234567UshvloD |
+| Consumer Secret | LQdulabcdefghijklEZok2fE5xGzeBcDa123gNXtN |
+| Token URL | https://api.greenhouse.io/oauth/token |
+| Authorize URL | https://api.greenhouse.io/oauth/authorize |
+
+
+
+The partner should use this information to initiate an OAuth 2.0 flow in their application. Note the customer user can rescind this at any time.
+
+When the user attempts to connect with Greenhouse, they will see a prompt asking them to confirm the connection. This prompt will then associate the user’s account in the partner system with their Greenhouse account.
+
+
+
+Once the OAuth process is complete and the user grants the partner permission to access their data on Greenhouse, the partner will receive an access token. This access token must be included in the Authorization header:
+
+`Authorization: Bearer `
+
+### Authentication via Basic Auth
+
+If your users only have an account in Greenhouse and you will be submitting candidates as a partner (and not sourced by a user), you will likely want to authenticate via HTTP Basic Authentication. Users do not have to take any action to authorize your application to modify Greenhouse data. When using basic auth, you are required to set the On-Behalf-Of header for every request. The value should be the e-mail address of the user on behalf of whom you are taking action. For example:
+
+`On-Behalf-Of: john.smith@example.com`
+
+Normally, this will be a service user created specifically for this purpose. If this header is missing, or Greenhouse doesn’t recognize the address, the API will issue a _401 Unauthorized_ response. The application must also supply the API key. Via basic auth, you will include the API key as the basic auth username and nothing as the password. Since only a username needs to be provided in our case, you’ll need to append a : (colon) to the API token and then Base64 encode the resulting string. This may be included via URL:
+
+`https://:@api.greenhouse.io/v1/partners/candidates`
+
+or as an authorized header:
+
+`Authorization: Basic base64_encoded_api_key:`
+
+In all cases, the customer will have supplied the partner with a Partner API Key and a service user. Both items are required to submit candidates.
+
+### Note: Capabilities with the Ingestion API will be limited to the permissions of the On-Behalf-Of user
+
+There are four user types, **Site Admin**, **Job Admin**, **Interviewer**, and **Basic**.
+
+Site Admins have access to all jobs by default, whereas Job Admins/Interviewers are assigned to specific jobs. Job Admins/Interviewers will only be able to retrieve jobs via the API that they are assigned access to, or that are live on the company's job board. However they can add Candidates to jobs they have access to, as well as jobless Prospects to Greenhouse.
+
+Because all user permissions are job-based, in order to retrieve jobless Prospects from the API, Site Admins, Job Admins, and Interviewers need the additional Greenhouse permission to manage jobless Prospects. Otherwise, they can only add Prospects, and not retrieve them. This is true of the UI as well.
+
+Basic users have the most restrictions, since their abilities in the UI are also very limited:
+
+Basic users can:
+* *Retreive jobs* Retreive information about the current user
+* *Create prospects* on no jobs Create candidates on jobs
+
+They can't:
+* *Retreive prospects* Retreive candidates
+* Create a tracking link
+
+
+
+
+
+## OAuth Scopes
+
+If you use OAuth for authentication, there are 3 permission scopes to be aware of. Some endpoints will require a specific permission scope while others require none.
+
+- `candidates.create`: Create new candidates or prospects
+- `candidates.view`: View candidates imported via this partner
+- `jobs.view`: View my jobs.
+
+
+
+## General considerations
+
+Unless otherwise specified, API methods generally conform to the following:
+
+- Properties without a value will use `null` instead of being undefined
+- "Snake Case" is used for attribute names (e.g. `first_name`)
+- We reserve the right to add more properties to objects, but will never change or remove them
+
+## Ingestion API Change Log
+
+The timestamps below are Eastern Time.
+
+| Date | Description |
+| ----------------------- | -------------------------------------------------------------------------------------- |
+| Apr 15, 2021 03:00:00PM | Added `full_name` and `id` to the [GET current_user] response |
+| Aug 22, 2019 11:00:00AM | Added Change Log and General Consideration sections to the Ingestion API documentation |
diff --git a/source/includes/candidate-ingestion/_jobs.md b/source/includes/candidate-ingestion/_jobs.md
new file mode 100644
index 00000000000..b9e25464f00
--- /dev/null
+++ b/source/includes/candidate-ingestion/_jobs.md
@@ -0,0 +1,51 @@
+# Jobs
+
+## Retrieve Jobs
+
+```shell
+curl 'https://api.greenhouse.io/v1/partner/jobs'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> API Response
+
+```json
+[
+ {
+ "id": 146859,
+ "name": "Auror",
+ "status": "open",
+ "public": true
+ },
+ {
+ "id": 150050,
+ "name": "Professor",
+ "status": "open",
+ "public": true
+ },
+ {
+ "id": 147886,
+ "name": "Caretaker",
+ "status": "open",
+ "public": false
+ },
+]
+```
+
+Retrieve jobs that are visible for the current user, including all jobs listed on their organization’s public careers page and unpublished jobs the user can access.
+
+`GET https://api.greenhouse.io/v1/partner/jobs`
+
+*scope: jobs.view*
+
+### Request Parameters
+
+This request is simply the URL. It takes no parameters.
+
+### Response Parameters
+
+| Property Name | Type | Description
+--------------- | -------------- | --------------
+id | Integer | The ID of the job.
+name | String | The name as it appears in Greenhouse, NOT necessarily how it appears on the public job board.
+status | String | Always ‘open’.
+public | Boolean | True if this job has any job posts that are currently live on any job board.
\ No newline at end of file
diff --git a/source/includes/candidate-ingestion/_prospect_pools.md b/source/includes/candidate-ingestion/_prospect_pools.md
new file mode 100644
index 00000000000..eeecab3e73f
--- /dev/null
+++ b/source/includes/candidate-ingestion/_prospect_pools.md
@@ -0,0 +1,85 @@
+# Prospect Pools
+
+## Retrieve Prospect Pools
+
+```shell
+curl 'https://api.greenhouse.io/v1/partner/prospect_pools'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> API Response
+
+```json
+[
+ {
+ "id": 123,
+ "name": "Cold Outreach: Referred",
+ "stages": [
+ {
+ "id": 1957,
+ "name": "Not Contacted"
+ },
+ {
+ "id": 1958,
+ "name": "Contacted"
+ },
+ {
+ "id": 1959,
+ "name": "1st. Follow Up Sent"
+ },
+ {
+ "id": 1960,
+ "name": "2nd Follow Up Sent"
+ },
+ {
+ "id": 1961,
+ "name": "In Discussion"
+ }
+ ]
+ },
+ {
+ "id": 456,
+ "name": "Cold Outreach: Sourced",
+ "stages": [
+ {
+ "id": 1962,
+ "name": "Not Contacted"
+ },
+ {
+ "id": 1963,
+ "name": "Contacted"
+ },
+ {
+ "id": 1964,
+ "name": "1st. Follow Up Sent"
+ },
+ {
+ "id": 1965,
+ "name": "2nd Follow Up Sent"
+ },
+ {
+ "id": 1966,
+ "name": "In Discussion"
+ }
+ ]
+ }
+]
+```
+
+Retrieve prospect pools along with their stages for the current user's organization.
+
+`GET https://api.greenhouse.io/v1/partner/prospect_pools`
+
+_scope: prospect_pools.view_
+
+### Request Parameters
+
+This request is simply the URL. It takes no parameters.
+
+### Response Parameters
+
+| Property Name | Type | Description |
+| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| id | Integer | The ID of the prospect pool. |
+| name | String | The name of the prospect pool. |
+| stages | Object | The stages that belong to a prospect pool with the id and name of the stage. The list of stages will be ordered the same way that it is configured to be ordered in Greenhouse. |
diff --git a/source/includes/candidate-ingestion/_tracking_link.md b/source/includes/candidate-ingestion/_tracking_link.md
new file mode 100644
index 00000000000..07118899fd9
--- /dev/null
+++ b/source/includes/candidate-ingestion/_tracking_link.md
@@ -0,0 +1,50 @@
+# Tracking Link
+
+## Post Tracking Link
+
+```shell
+curl -X POST 'https://api.greenhouse.io/v1/partner/tracking_link'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+-H "Content-Type: application/json"
+```
+
+```json
+{
+ "job_id": 12345
+}
+```
+
+> API Response
+
+```json
+{
+ "tracking_link": "http://grnh.se/yvj0bj",
+ "job": "Auror",
+ "source": "Campus Recruiting",
+ "referrer": "Hermione Granger"
+}
+```
+
+Create a new tracking link for a specific job. Candidates that apply using this tracking link will automatically have their source set to your application and their referrer set to the current user.
+
+
+`POST https://api.greenhouse.io/v1/partner/tracking_link`
+
+
+### Request Parameters
+
+
+Property Name | Type | Required
+-------------- | -------------- | --------------
+job_id | Integer | Yes
+
+
+### Response Parameters
+
+
+Property Name | Type | Description
+-------------- | -------------- | --------------
+tracking_link | String | URL for newly created tracking link.
+job | String | The name of the job tied to this tracking link.
+source | String | The name of the source tied to this tracking link (e.g. the name of your application).
+referrer | String | The name of the user tied to this tracking link.
\ No newline at end of file
diff --git a/source/includes/gho/_api.md b/source/includes/gho/_api.md
new file mode 100644
index 00000000000..000c37da9b0
--- /dev/null
+++ b/source/includes/gho/_api.md
@@ -0,0 +1,2789 @@
+# Queries
+## complexityInfo \([ComplexityInfo](#complexityinfo)\)
+```graphql
+# the basic structure of the complexityInfo query
+{
+ complexityInfo {
+ score
+ maximum
+ }
+}
+```
+
+```graphql
+# Example of retriving complexity information from the employee query
+{
+ employee(id: 20) {
+ email
+ lastName
+ }
+ complexityInfo {
+ score
+ maximum
+ }
+}
+```
+
+The complexity information for the current query. By itself it doesn't tell
+us anything. This really comes in handy when paired with other queries.
+
+## contactRelationships \([\[String\]](#string)\)
+```graphql
+{
+ contactRelationships
+}
+```
+The list of valid options for the 'Contact' custom field type
+
+## countries \([\[Country\]](#country)\)
+
+```graphql
+# Request all country information for North America
+{
+ countries(countryCodes: ["USA", "CAN", "MEX"]) {
+ countryCode
+ name
+ states {
+ name
+ stateCode
+ country {
+ name
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request all country information for all countries
+{
+ countries {
+ countryCode
+ name
+ states {
+ name
+ stateCode
+ country {
+ name
+ }
+ }
+ }
+}
+```
+The list of countries
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+countryCodes | [\[String\]](#string) | |
+## customField \([CustomField](#customfield)\)
+```graphql
+# Request custom field information for a custom field
+{
+ customField(id: "system.pronouns") {
+ id
+ name
+ fieldType
+ multipleChoiceOptions
+ customFieldGroup {
+ id
+ name
+ }
+ teamCategory {
+ id
+ name
+ }
+ createdAt
+ updatedAt
+ }
+}
+```
+Information about a custom field. The argument must be the permanent field id of the custom field.
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [ID](#id) | |
+## customFields \([CustomFieldConnection](#customfieldconnection)\)
+```graphql
+# Request the first 5 custom fields after the cursor "NQ=="
+{
+ customFields(first: 5, after: "NQ==") {
+ edges {
+ node {
+ name
+ id
+ teamCategory {
+ id
+ name
+ }
+ fieldType
+ customFieldGroup {
+ id
+ name
+ }
+ multipleChoiceOptions
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request the first 5 custom fields before the cursor "MTA="
+{
+ customFields(first: 5, before: "MTA=") {
+ edges {
+ node {
+ name
+ id
+ teamCategory {
+ id
+ name
+ }
+ fieldType
+ customFieldGroup {
+ id
+ name
+ }
+ multipleChoiceOptions
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request the first 10 custom fields with the field type 'text'
+{
+ customFields(first: 10, fieldTypes: [TEXT]) {
+ edges {
+ node {
+ name
+ id
+ teamCategory {
+ id
+ name
+ }
+ fieldType
+ customFieldGroup {
+ id
+ name
+ }
+ multipleChoiceOptions
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request the first 10 customFields in the list
+{
+ customFields(first: 10) {
+ edges {
+ node {
+ name
+ id
+ teamCategory {
+ id
+ name
+ }
+ fieldType
+ customFieldGroup {
+ id
+ name
+ }
+ multipleChoiceOptions
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request the last 10 customFields in the list
+{
+ customFields(last: 10) {
+ edges {
+ node {
+ name
+ id
+ teamCategory {
+ id
+ name
+ }
+ fieldType
+ customFieldGroup {
+ id
+ name
+ }
+ multipleChoiceOptions
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request custom fields with permanent field ids "department" and "location"
+{
+ customFields(first: 2, ids: ["department", "location"]) {
+ edges {
+ node {
+ name
+ id
+ teamCategory {
+ id
+ name
+ }
+ fieldType
+ customFieldGroup {
+ id
+ name
+ }
+ multipleChoiceOptions
+ }
+ cursor
+ }
+ }
+}
+```
+
+A collection of custom fields
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [String](#string) | Returns the elements in the list that come after the specified cursor. |
+before | [String](#string) | Returns the elements in the list that come before the specified cursor. |
+fieldTypes | [\[CustomFieldType\]](#customfieldtype) | |
+first | [Int](#int) | Returns the first _n_ elements from the list. |
+ids | [\[ID\]](#id) | |
+last | [Int](#int) | Returns the last _n_ elements from the list. |
+## department \([Department](#department)\)
+```graphql
+{
+ department(id: 1) {
+ id
+ name
+ externalId
+ }
+}
+```
+A single department
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [Int](#int) | |
+## departments \([DepartmentConnection](#departmentconnection)\)
+```graphql
+# Request for the first 5 departments after cursor "NQ=="
+{
+ departments(first: 5, after: "NQ==") {
+ edges {
+ node {
+ id
+ name
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for the first 5 departments before cursor "NQ=="
+{
+ departments(first: 5, before: "NQ==") {
+ edges {
+ node {
+ id
+ name
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 10 departments in the list
+{
+ departments(first: 10) {
+ edges {
+ node {
+ id
+ name
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for the last 10 departments in the list
+{
+ departments(last: 10) {
+ edges {
+ node {
+ id
+ name
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+All departments
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [String](#string) | Returns the elements in the list that come after the specified cursor. |
+before | [String](#string) | Returns the elements in the list that come before the specified cursor. |
+first | [Int](#int) | Returns the first _n_ elements from the list. |
+last | [Int](#int) | Returns the last _n_ elements from the list. |
+## employee \([Employee](#employee)\)
+```graphql
+# Request for an employee
+{
+ employee(id: 5) {
+ about
+ createdAt
+ dateOfBirth
+ dateOfTermination
+ department {
+ id
+ name
+ externalId
+ }
+ documents {
+ id
+ file {
+ fileUrl
+ fileName
+ fileSize
+ }
+ }
+ email
+ employmentStatus
+ firstName
+ greenhouseRecruitingData {
+ applicationId
+ }
+ hrManager {
+ id
+ email
+ }
+ id
+ lastName
+ location {
+ id
+ name
+ address
+ externalId
+ }
+ manager {
+ id
+ email
+ }
+ middleName
+ otherCriteria {
+ id
+ name
+ }
+ personalEmail
+ phoneNumber
+ preferredFirstName
+ preferredLastName
+ profileImage {
+ fileUrl
+ fileName
+ fileSize
+ }
+ requiredFieldsCompletedAt
+ startDate
+ suffix
+ title
+ updatedAt
+ workCountryCode
+ }
+}
+
+```
+```graphql
+# Request an employee but limit their customFieldValues to those of specific customFields.
+# The customFieldIds argument can be used when you are interested in only getting a specific
+# customFieldValues for the employee.
+{
+ employee(id: 20) {
+ customFieldValues(customFieldIds: ["emergency_contact", "favorite_food"]) {
+ customField {
+ id
+ fieldType
+ }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Request an employee and limit their signatureRequests to those that are waiting on a signature or being processed
+{
+ employee(id: 20) {
+ signatureRequests(statuses: [WAITING_FOR_SIGNATURE, BEING_PROCESSED]) {
+ counterSigner {
+ id
+ email
+ }
+ file {
+ fileUrl
+ }
+ status
+ signatureRequestTemplate {
+ publicName
+ counterSigner {
+ id
+ email
+ }
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request an employee, limit their signatureRequests to those that are completed an request the formFields
+{
+ employee(id: 20) {
+ signatureRequests(statuses: [COMPLETED]) {
+ formFields(fieldNames: ["first_name", "last_name"])
+ }
+ }
+}
+```
+An Onboarding employee record
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [Int](#int) | |
+## employees \([EmployeeConnection](#employeeconnection)\)
+
+```graphql
+# Request employees after the cursor "NQ=="
+{
+ employees(first: 25, after: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request employees before the cursor "MTM="
+{
+ employees(first: 25, before: "MTM=") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ nodes {
+ id
+ email
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request only those employees that were createed before 12-13-2021 and after 10-01-2021. For each employee that
+# fits that criteria, return their id and work email
+{
+ employees(first: 25, createdAt: {after: "2021-10-01T00:00:00+00:00", before: "2021-12-31T00:00:00+00:00" }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+```graphql
+# Request only those employees that have a value (ANY value) set for the "favorite_food" Custom Field. For these employees, return
+# ALL of their customFieldValues.
+{
+ employees(first: 25, customFieldValues: [{id: "favorite_food"}]) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that have "Hot Dogs" or "Chicken Nuggets" set for their "favorite_food" Custom Field.
+# Because the "favorite_food" Custom Field is of type text, we provide the "textValues" argument (as opposed to
+# dateValues or idValues)
+{
+ employees(
+ first: 25,
+ customFieldValues: [{id: "favorite_food", textValues: ["Hot Dogs", "Chicken Nuggets"]}]
+ ) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ customFieldValues {
+ customField {
+ id
+ }
+ value
+ }
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that have a value set for their "favorite_food" Custom Field and "Blue" for their
+# "favorite_color" Custom Field. For each of these employees, return their ID and work email address.
+{
+ employees(
+ first: 25,
+ customFieldValues: [{id: "favorite_food"}, {id: "favorite_color", textValues: ["Blue"]}]
+ ) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request employees that have a value set for the "favorite_food" Custom Field. Return each employee's ID and
+# customFieldValues, but only return the customFieldValue for the "favorite_food" customField.
+{
+ employees(
+ first: 25,
+ customFieldValues: [{ id: "favorite_food" }]
+ ) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ customFieldValues(customFieldIds: ["favorite_food"]) {
+ customField {
+ id
+ }
+ value
+ }
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request employees that have a date value between "2017-04-13" and "2018-04-13" (exclusive) for the
+# "1_year_anniversary" Custom Field. For each of these employees, return their ID and
+# the value for the "1_year_anniversary" Custom Field (and only the value for this Custom Field).
+{
+ employees(
+ first: 25,
+ customFieldValues: [{ id: "1_year_anniversary", dateValue: { after: "2017-04-13", before: "2018-04-13" } }]
+ ) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ customFieldValues(customFieldIds: ["1_year_anniversary"]) {
+ customField {
+ id
+ }
+ value
+ }
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request employees that have Employee 35 or Employee 40 set as the value for the "mentor" Custom Field. For each of
+# these employees, return their id, work email address, and "about me" text.
+{
+ employees(
+ first: 25,
+ customFieldValues: [{id: "mentor", idValues: [35, 40]}]
+ ) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ about
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that have a dateOfBirth between 1989-12-31 and 2000-01-01.
+# These dates are exclusive (e.g. someone who was born on 1989-12-31 or 2000-01-01 would not be included.
+{
+ employees(first: 25, dateOfBirthFilter: { dateFilter: { after: "1989-12-31", before: "2000-01-01" } }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ startDate
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that have a department set (department is not null). For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, departmentFilter: { anyValue: true }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that lack a department (department is null). For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, departmentFilter: { noValue: true }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that are in specific departments. For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, departmentFilter: { departmentIds: [1, 3] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that have specific emails. For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, emailFilter: { emails: ["john.doe@example.com"] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request only those employees that have specific employment statuses. For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, employmentStatusFilter: { employmentStatuses: ["Full-time", "Part-time"] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request the first 10 employees in the list, For each employee return their id and work email
+{
+ employees(first: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+
+```graphql
+# Request only those employees that have a specific hr manager or managers. For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, hrManagerFilter: { hrManagerIds: [1, 2] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request the last 10 employees in the list, For each employee return their id and work email
+{
+ employees(last: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request only those employees that are in a specific location or locations. For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, locationFilter: { locationIds: [1, 2] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request only those employees that have a specific manager or managers. For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, managerFilter: { managerIds: [1, 2] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request only those employees that have a specific personal email or emails. For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, personalEmailFilter: { personalEmails: ["john.doe@example.com", "jon.doe2@example.com"] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+```
+
+```graphql
+# Request only those employees that have a startDate between 2017-03-25 and 2018-03-25.
+# These dates are exclusive (e.g. someone who started on 2017-03-25 or 2018-03-25 would not be included.
+{
+ employees(first: 25, startDateFilter: { dateFilter: { after: "2017-03-25", before: "2018-03-25" } }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ startDate
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that have title "Account Manager". For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, titleFilter: { titles: ["Account Manager"] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees in a specific country or countries (using workCountryCode). For each employee that fits the criteria,
+# return their id and work email
+{
+ employees(first: 25, workCountryCodeFilter: { workCountryCodes: ["USA", "CAN"] }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+
+```graphql
+# Request only those employees that were updated before 12-13-2021 and after 10-01-2021. For each employee that
+# fits that criteria, return their id and work email
+{
+ employees(first: 25, updatedAt: {after: "2021-10-01T00:00:00+00:00", before: "2021-12-31T00:00:00+00:00" }) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ email
+ }
+ }
+ }
+}
+
+```
+A collection of Onboarding employee records. The following arguments are depreacated and should be avoided as support for them will be dropped: dateOfBirth, departmentIds, emails, employmentStatuses, hrManagerIds, locationIds, managerIds, personalEmails, startDate, titles, and workCountryCodes. Each of these arguments has a newer, more powerful companion named *Filter. For example, departmentIds has been replaced by the argument departmentFilter - which allows for the specification of department IDs, but also allows for more flexibility (e.g. filtering by lack/presence of a given field - as opposed to filtering by specific values).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [String](#string) | Returns the elements in the list that come after the specified cursor. |
+before | [String](#string) | Returns the elements in the list that come before the specified cursor. |
+createdAt | [DateTimeFilter](#datetimefilter) | filter employees based on when they were created |
+customFieldValues | [\[CustomFieldValuesInput\]](#customfieldvaluesinput) | filter employees by their custom field values |
+dateOfBirthFilter | [DateOfBirthFilter](#dateofbirthfilter) | filter employees by their date of birth |
+departmentFilter | [DepartmentFilter](#departmentfilter) | filter employees by their department |
+emailFilter | [EmailFilter](#emailfilter) | filter employees by their email |
+employmentStatusFilter | [EmploymentStatusFilter](#employmentstatusfilter) | filter employees by their employment status |
+first | [Int](#int) | Returns the first _n_ elements from the list. |
+hrManagerFilter | [HrManagerFilter](#hrmanagerfilter) | filter employees by their hr manager |
+last | [Int](#int) | Returns the last _n_ elements from the list. |
+locationFilter | [LocationFilter](#locationfilter) | filter employees by their location |
+managerFilter | [ManagerFilter](#managerfilter) | filter employees by their manager |
+personalEmailFilter | [PersonalEmailFilter](#personalemailfilter) | filter employees by their personal email |
+startDateFilter | [StartDateFilter](#startdatefilter) | filter employees by their start date |
+titleFilter | [TitleFilter](#titlefilter) | filter employees by their title |
+updatedAt | [DateTimeFilter](#datetimefilter) | filter employees based on when they were last updated |
+workCountryCodeFilter | [WorkCountryCodeFilter](#workcountrycodefilter) | filter employees by their work country code |
+
+## employmentStatuses \([\[String\]](#string)\)
+
+```graphql
+{
+ employmentStatuses
+}
+```
+The list of valid options for Employment Status
+
+## location \([Location](#location)\)
+```graphql
+{
+ location(id: 1) {
+ id
+ name
+ address
+ externalId
+ }
+}
+```
+A single location
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [Int](#int) | |
+## locations \([LocationConnection](#locationconnection)\)
+```graphql
+# Request for first 10 locations after cursor "NQ=="
+{
+ locations(first: 10, after: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ address
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 10 locations before cursor "NQ=="
+{
+ locations(first: 10, before: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ address
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 10 locations in the list
+{
+ locations(first: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ address
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for last 10 locations in the list
+{
+ locations(last: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ address
+ externalId
+ }
+ cursor
+ }
+ }
+}
+```
+All locations
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [String](#string) | Returns the elements in the list that come after the specified cursor. |
+before | [String](#string) | Returns the elements in the list that come before the specified cursor. |
+first | [Int](#int) | Returns the first _n_ elements from the list. |
+last | [Int](#int) | Returns the last _n_ elements from the list. |
+## otherCriteria \([OtherCriterionConnection](#othercriterionconnection)\)
+```graphql
+# Request for first 10 other criteria after cursor "NQ=="
+{
+ otherCriteria(first: 10, after: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ createdAt
+ updatedAt
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 10 other criteria before cursor "NQ=="
+{
+ otherCriteria(first: 10, before: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ createdAt
+ updatedAt
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 10 other criteria in the list
+{
+ otherCriteria(first: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ createdAt
+ updatedAt
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for last 10 other criteria in the list
+{
+ otherCriteria(last: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ createdAt
+ updatedAt
+ }
+ cursor
+ }
+ }
+}
+```
+All other criteria
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [String](#string) | Returns the elements in the list that come after the specified cursor. |
+before | [String](#string) | Returns the elements in the list that come before the specified cursor. |
+first | [Int](#int) | Returns the first _n_ elements from the list. |
+last | [Int](#int) | Returns the last _n_ elements from the list. |
+## otherCriterion \([OtherCriterion](#othercriterion)\)
+```graphql
+{
+ otherCriterion(id: 1) {
+ id
+ name
+ createdAt
+ updatedAt
+ }
+}
+```
+A single other criterion
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [Int](#int) | |
+## rateLimit \([RateLimit](#ratelimit)\)
+```graphql
+{
+ rateLimit {
+ cost
+ limit
+ remaining
+ resetAt
+ }
+}
+```
+Information about your current API quota
+
+## team \([Team](#team)\)
+```graphql
+{
+ team(id: 1) {
+ id
+ name
+ description
+ email
+ location
+ name
+ teamCategory {
+ id
+ name
+ }
+ }
+}
+
+```
+A single team
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [Int](#int) | |
+## teamCategories \([TeamCategoryConnection](#teamcategoryconnection)\)
+```graphql
+# Request for first 5 team categories after cursor "NQ=="
+{
+ teamCategories(first: 5, after: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 5 team categories before cursor "NQ=="
+{
+ teamCategories(first: 5, before: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 5 team categories in the list
+{
+ teamCategories(first: 5) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for last 5 team categories in the list
+{
+ teamCategories(last: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ }
+ cursor
+ }
+ }
+}
+```
+All team categories
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [String](#string) | Returns the elements in the list that come after the specified cursor. |
+before | [String](#string) | Returns the elements in the list that come before the specified cursor. |
+first | [Int](#int) | Returns the first _n_ elements from the list. |
+last | [Int](#int) | Returns the last _n_ elements from the list. |
+## teamCategory \([TeamCategory](#teamcategory)\)
+```graphql
+{
+ teamCategory(id: 1) {
+ id
+ name
+ }
+}
+```
+A single team category
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [Int](#int) | |
+## teams \([TeamConnection](#teamconnection)\)
+```graphql
+# Request for first 10 teams after cursor "NQ=="
+{
+ teams(first: 10, after: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ description
+ email
+ location
+ name
+ teamCategory {
+ id
+ name
+ }
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 10 teams before cursor "NQ=="
+{
+ teams(first: 10, before: "NQ==") {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ description
+ email
+ location
+ name
+ teamCategory {
+ id
+ name
+ }
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for first 10 teams in the list
+{
+ teams(first: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ description
+ email
+ location
+ name
+ teamCategory {
+ id
+ name
+ }
+ }
+ cursor
+ }
+ }
+}
+```
+
+```graphql
+# Request for last 10 teams in the list
+{
+ teams(last: 10) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ id
+ name
+ description
+ email
+ location
+ name
+ teamCategory {
+ id
+ name
+ }
+ }
+ cursor
+ }
+ }
+}
+```
+All teams
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [String](#string) | Returns the elements in the list that come after the specified cursor. |
+before | [String](#string) | Returns the elements in the list that come before the specified cursor. |
+first | [Int](#int) | Returns the first _n_ elements from the list. |
+last | [Int](#int) | Returns the last _n_ elements from the list. |
+# Mutations
+## addDepartment \([AddDepartmentPayload](#adddepartmentpayload)\)
+```graphql
+# Create a Department
+mutation {
+ addDepartment(
+ addDepartmentInput: {
+ name: "Engineering"
+ externalId: "123"
+ }
+ ) {
+ department {
+ id
+ name
+ externalId
+ }
+ }
+}
+```
+Add a new Department
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+addDepartmentInput | [AddDepartmentInput!](#adddepartmentinput) | | Required
+## addLocation \([AddLocationPayload](#addlocationpayload)\)
+```graphql
+# Create a Location
+mutation {
+ addLocation(
+ addLocationInput: {
+ name: "Denver, CO"
+ address: "1801 Broadway, 13th Floor, Denver, CO 80202"
+ externalId: "123"
+ }
+ ) {
+ location {
+ id
+ name
+ address
+ externalId
+ }
+ }
+}
+```
+Add a new Location
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+addLocationInput | [AddLocationInput!](#addlocationinput) | | Required
+## addPendingHire \([PendingHire](#pendinghire)\)
+```graphql
+# Create a PendingHire with required information as well as a value for a text Custom Field (long text, confirmable,
+# and multiple_choice Custom Fields also take Strings as the "value").
+mutation {
+ addPendingHire(
+ pendingHireInfo: {
+ firstName: "Joe"
+ lastName: "Schmoe"
+ email: "joe123@example.com"
+ workCountryCode: "USA"
+ customFieldValues: [
+ { customFieldId: "favorite_food", value: "Egg McMuffins" }
+ ]
+ }
+ ) {
+ firstName
+ lastName
+ email
+ workCountryCode
+ customFieldValues(customFieldIds: ["favorite_food"]) {
+ customField { id }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Create a PendingHire with required information as well as a value for a Multiple Select Custom Field. These Custom
+# Fields require a JSON Array-formatted string (including escaped quotes) for the "value". Also of note, each of the
+# elements in the array must be a valid option for the given Custom Field.
+mutation {
+ addPendingHire(
+ pendingHireInfo: {
+ firstName: "Joe"
+ lastName: "Schmoe"
+ email: "joe123@example.com"
+ workCountryCode: "USA"
+ customFieldValues: [
+ { customFieldId: "required_equipment", value: "[\"Ergonomic Keyboard\", \"Standing Desk\"]" }
+ ]
+ }
+ ) {
+ firstName
+ lastName
+ email
+ workCountryCode
+ customFieldValues(customFieldIds: ["required_equipment"]) {
+ customField { id }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Create a PendingHire with required information as well as a value for a Team Custom Field. These Custom Fields
+# require an ID for the "value."
+mutation {
+ addPendingHire(
+ pendingHireInfo: {
+ firstName: "Joe"
+ lastName: "Schmoe"
+ email: "joe123@example.com"
+ workCountryCode: "USA"
+ customFieldValues: [
+ { customFieldId: "primary_social_club", value: 14 }
+ ]
+ }
+ ) {
+ firstName
+ lastName
+ email
+ workCountryCode
+ customFieldValues {
+ customField { id }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Create a PendingHire with required information as well as a value for an Address Custom Field. These Custom
+# Fields require a JSON Object-formatted string (including escaped quotes) for the "value".
+mutation {
+ addPendingHire(
+ pendingHireInfo: {
+ firstName: "Joe"
+ lastName: "Schmoe"
+ email:"joe123@example.com"
+ workCountryCode: "USA"
+ customFieldValues: [
+ {
+ customFieldId: "address",
+ value: "{\"address_line_1\":\"123 Test Street\",\"address_line_2\":\"Apartment 1\",\"city\":\"Pawnee\", \"state\":\"IN\", \"zipcode\":\"12345\",\"country\":\"USA\"}"
+ }
+ ]
+ }
+ ) {
+ firstName
+ lastName
+ email
+ workCountryCode
+ customFieldValues(customFieldIds: ["address"]) {
+ customField { id }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Create a PendingHire with required information as well as a value for a Contact Custom Field. These Custom
+# Fields require a JSON Object-formatted string (including escaped quotes) for the "value".
+mutation {
+ addPendingHire(
+ pendingHireInfo: {
+ firstName: "Joe"
+ lastName: "Schmoe"
+ email:"joe123@example.com"
+ workCountryCode: "USA"
+ customFieldValues: [
+ {
+ customFieldId: "emergency_contact",
+ value: "{\"first_name\": \"Joe\", \"last_name\": \"Schmoe\", \"email\":\"jschmoe@aol.com\", \"phone\": \"123.456.7890\", \"relationship\": \"Other\"}" }
+ ]
+ }
+ ) {
+ firstName
+ lastName
+ email
+ workCountryCode
+ customFieldValues(customFieldIds: ["emergency_contact"]) {
+ customField { id }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Create a PendingHire with required information as well as a value for a Date Custom Field. These Custom Fields
+# require a String formatted as such: YYYY-MM-DD.
+mutation {
+ addPendingHire(
+ pendingHireInfo: {
+ firstName: "Joe"
+ lastName: "Schmoe"
+ email:"joe123@example.com"
+ workCountryCode: "USA"
+ customFieldValues: [
+ { customFieldId: "fully_vested", value: "2019-12-12" }
+ ]
+ }
+ ) {
+ firstName
+ lastName
+ email
+ workCountryCode
+ customFieldValues(customFieldIds: ["fully_vested"]) {
+ customField { id }
+ value
+ }
+ }
+}
+
+```
+Add a Pending Hire to Greenhouse Onboarding
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+pendingHireInfo | [AddPendingHireInput!](#addpendinghireinput) | | Required
+## deleteDepartment \([DeleteDepartmentPayload](#deletedepartmentpayload)\)
+```graphql
+# Delete a department by the department id
+mutation {
+ deleteDepartment(deleteDepartmentInput: {id: 1}) {
+ deletedDepartmentId
+ }
+}
+```
+Delete a Department
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+deleteDepartmentInput | [DeleteDepartmentInput!](#deletedepartmentinput) | | Required
+## deleteLocation \([DeleteLocationPayload](#deletelocationpayload)\)
+```graphql
+# Delete a location by the location id
+mutation {
+ deleteLocation(deleteLocationInput: {id: 1}) {
+ deletedLocationId
+ }
+}
+```
+Delete a Location
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+deleteLocationInput | [DeleteLocationInput!](#deletelocationinput) | | Required
+## updateDepartment \([UpdateDepartmentPayload](#updatedepartmentpayload)\)
+```graphql
+# Update a department's name. Must provide the id of an existing department
+mutation {
+ updateDepartment(
+ updateDepartmentInput: {
+ id: 1
+ name: "Data Science"
+ externalId: "123"
+ }
+ ) {
+ department {
+ id
+ name
+ externalId
+ }
+ }
+}
+```
+Update a Department
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+updateDepartmentInput | [UpdateDepartmentInput!](#updatedepartmentinput) | | Required
+## updateEmployeeProfile \([Employee](#employee)\)
+```graphql
+# Update an employee's work email address, date of birth, and department. Return these fields to confirm the change.
+mutation {
+ updateEmployeeProfile(
+ id: 25,
+ employeeUpdates: {
+ email: "new_email_address@example.com"
+ dateOfBirth: "1985-04-07"
+ department: 1
+ }
+ ) {
+ email
+ dateOfBirth
+ department {
+ id
+ }
+ }
+}
+
+```
+
+```graphql
+# Update/create the value for a text, long text, confirmable, or multiple_choice Custom Field. For Custom Fields of
+# these types, provide a string for the value. Here we update the "favorite_food" Custom Field Value (a text Custom
+# Field) to "Egg McMuffins". We ask for the employee's customFieldValues, but we limit them to those that
+# belong to the "favorite_food" Custom Field. E.g. we filter out the irrelevant customFieldValues.
+mutation {
+ updateEmployeeProfile(
+ id: 20,
+ employeeUpdates: {
+ customFieldValues: [
+ { customFieldId: "favorite_food", value: "Egg McMuffins" }
+ ]
+ }
+ ) {
+ customFieldValues(customFieldIds: ["favorite_food"]) {
+ customField {
+ id
+ }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Update/create the value for a Multiple Select Custom Field. For these Custom Fields, "value" must be a string
+# representing a JSON Array (including escaped quotation marks). Also of note, each of the values of this array must
+# be one of the pre-defined values for the given Custom Field. Here, we set the "required_equipment" Custom Field Value
+# to contain "Ergonomic Keyboard" and "Standing Desk". We then request the updated Employee's value for this Custom Field
+# to confirm the change.
+mutation {
+ updateEmployeeProfile(
+ id: 20,
+ employeeUpdates: {
+ customFieldValues: [
+ { customFieldId: "required_equipment", value: "[\"Ergonomic Keyboard\", \"Standing Desk\"]" }
+ ]
+ }
+ ) {
+ customFieldValues(customFieldIds: ["required_equipment"]) {
+ customField {
+ id
+ fieldType
+ }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Update/create the value for a Team Custom Field. For Custom Fields of type "Team" we provide an ID as the
+# value. This value represents the ID of the new Team. Here we change the this employees "primary_social_club" to be
+# Team 14. These Team IDs can be found by utilizing the team query.
+mutation {
+ updateEmployeeProfile(
+ id: 20,
+ employeeUpdates: {
+ customFieldValues: [
+ { customFieldId: "primary_social_club", value: 14 }
+ ]
+ }
+ ) {
+ customFieldValues(customFieldIds: ["primary_social_club"]) {
+ customField {
+ id
+ fieldType
+ }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Update/create the value for an Address Custom Field. These Custom Fields require a String value. This String value
+# must be a JSON Object (with quotes escaped accordingly).
+mutation {
+ updateEmployeeProfile(
+ id: 20,
+ employeeUpdates: {
+ customFieldValues: [
+ {
+ customFieldId: "address",
+ value: "{\"address_line_1\":\"123 Test Street\",\"address_line_2\":\"Apartment 1\",\"city\":\"Pawnee\", \"state\":\"IN\", \"zipcode\":\"12345\",\"country\":\"USA\"}"
+ }
+ ]
+ }
+ ) {
+ customFieldValues(customFieldIds: ["address"]) {
+ customField {
+ id
+ }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Update/create the value for a Contact Custom Field. These Custom Fields require a String value. This String value
+# must be a JSON Object (with quotes escaped accordingly).
+mutation {
+ updateEmployeeProfile(
+ id: 20,
+ employeeUpdates: {
+ customFieldValues: [
+ {
+ customFieldId: "emergency_contact",
+ value: "{\"first_name\": \"Joe\", \"last_name\": \"Schmoe\", \"email\":\"jschmoe@aol.com\", \"phone\": \"123.456.7890\", \"relationship\": \"Other\"}" }
+ ]
+ }
+ ) {
+ customFieldValues(customFieldIds: ["emergency_contact"]) {
+ customField {
+ id
+ fieldType
+ }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Update/create the value for a date Custom Field. These Custom Fields require a String formatted as such: YYYY-MM-DD
+mutation {
+ updateEmployeeProfile(
+ id: 20,
+ employeeUpdates: {
+ customFieldValues: [
+ { customFieldId: "fully_vested", value: "2019-12-12" }
+ ]
+ }
+ ) {
+ customFieldValues(customFieldIds: ["fully_vested"]) {
+ customField {
+ id
+ fieldType
+ }
+ value
+ }
+ }
+}
+
+```
+
+```graphql
+# Terminate an employee. Both employment status and date of termination are required.
+# Date of termination can be in the past for immediate termination or in the future.
+mutation {
+ updateEmployeeProfile(
+ id: 20,
+ employeeUpdates: {
+ employmentStatus: "Terminated"
+ customFieldValues: {
+ customFieldId: "system.date_of_termination"
+ value: "2020-01-01"
+ }
+ }
+ ) {
+ id
+ employmentStatus
+ dateOfTermination
+ }
+}
+
+```
+Update an employee's profile
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+employeeUpdates | [UpdateEmployee!](#updateemployee) | | Required
+id | [ID!](#id) | | Required
+## updateLocation \([UpdateLocationPayload](#updatelocationpayload)\)
+```graphql
+# Update a location. Must provide the id of an existing location.
+mutation {
+ updateLocation(
+ updateLocationInput: {
+ id: 22
+ name: "San Francisco, CA"
+ address: "575 Market Street, Suite #1750, San Francisco, CA 94105"
+ externalId: "123"
+ }
+ ) {
+ location {
+ id
+ name
+ address
+ externaId
+ }
+ }
+}
+```
+Update a Location
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+updateLocationInput | [UpdateLocationInput!](#updatelocationinput) | | Required
+# Types
+## AddDepartmentPayload
+The result of running an addDepartment mutation
+
+Field | Type | Description
+--------- | ----------- | -----------
+department | [Department](#department) | The new department
+
+## AddLocationPayload
+The result of running an addLocation mutation
+
+Field | Type | Description
+--------- | ----------- | -----------
+location | [Location](#location) | The new location
+
+## ComplexityInfo
+Information about the current request's complexity. If the complexity exceeds the maxium, the request will fail
+
+Field | Type | Description
+--------- | ----------- | -----------
+maximum | [Int!](#int) |
+score | [Int!](#int) |
+
+## Country
+A country
+
+Field | Type | Description
+--------- | ----------- | -----------
+countryCode | [String!](#string) |
+name | [String!](#string) |
+states | [\[State!\]!](#state) |
+
+## CustomField
+Represents a single CustomField record for your company. CustomFields can be stored and displayed in a variety of ways. The types are described via the [CustomFieldTypes](#customfieldtypes) enum.
+
+Field | Type | Description
+--------- | ----------- | -----------
+createdAt | [DateTime!](#datetime) |
+customFieldGroup | [CustomFieldGroup](#customfieldgroup) |
+fieldType | [CustomFieldType!](#customfieldtype) | The field type determines how users input and view the data for this field.
+id | [String!](#string) | A unique identifier for this CustomField.
+multipleChoiceOptions | [\[String!\]](#string) |
+name | [String!](#string) | The name of this custom field as users would see it inside Greenhouse Onboarding.
+teamCategory | [TeamCategory](#teamcategory) |
+updatedAt | [DateTime!](#datetime) |
+
+## CustomFieldConnection
+The connection type for CustomField.
+
+Field | Type | Description
+--------- | ----------- | -----------
+edges | [\[CustomFieldEdge\]](#customfieldedge) | A list of edges.
+nodes | [\[CustomField\]](#customfield) | A list of nodes.
+pageInfo | [PageInfo!](#pageinfo) | Information to aid in pagination.
+
+## CustomFieldEdge
+An edge in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+cursor | [String!](#string) | A cursor for use in pagination.
+node | [CustomField](#customfield) | The item at the end of the edge.
+
+## CustomFieldGroup
+A Group of Custom Field
+
+Field | Type | Description
+--------- | ----------- | -----------
+id | [ID!](#id) |
+name | [String!](#string) |
+
+## CustomFieldValue
+A Custom Field Value Record
+
+Field | Type | Description
+--------- | ----------- | -----------
+createdAt | [DateTime!](#datetime) |
+customField | [CustomField!](#customfield) |
+updatedAt | [DateTime!](#datetime) |
+value | [Value](#value) | A different type of value will be stored based upon the field type of the [CustomField](#customfield). Some types have the data stored as a nested object. Note that the type is a scalar named [Value](#value). Even though it appears to be an object, you are not able to use GraphQL to determine its shape.
+valueUpdatedAt | [DateTime!](#datetime) | The time of the most recent update to this field.
+
+## DeleteDepartmentPayload
+The result of running an deleteDepartment mutation
+
+Field | Type | Description
+--------- | ----------- | -----------
+deletedDepartmentId | [ID](#id) | The ID of the department that was just deleted
+
+## DeleteLocationPayload
+The result of running an deleteLocation mutation
+
+Field | Type | Description
+--------- | ----------- | -----------
+deletedLocationId | [ID](#id) | The ID of the location that was just deleted
+
+## Department
+Represents a single department in your company. Employees may belong to zero or one department. Departments are used in a variety of ways in Greenhouse Onboarding, including permissions and onboarding plans.
+
+Field | Type | Description
+--------- | ----------- | -----------
+createdAt | [DateTime!](#datetime) |
+externalId | [String](#string) |
+id | [ID!](#id) |
+name | [String!](#string) |
+updatedAt | [DateTime!](#datetime) |
+
+## DepartmentConnection
+The connection type for Department.
+
+Field | Type | Description
+--------- | ----------- | -----------
+edges | [\[DepartmentEdge\]](#departmentedge) | A list of edges.
+nodes | [\[Department\]](#department) | A list of nodes.
+pageInfo | [PageInfo!](#pageinfo) | Information to aid in pagination.
+
+## DepartmentEdge
+An edge in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+cursor | [String!](#string) | A cursor for use in pagination.
+node | [Department](#department) | The item at the end of the edge.
+
+## Document
+Represents a single document attached to an [Employee](#employee).
+
+Field | Type | Description
+--------- | ----------- | -----------
+assignedTaskName | [String!](#string) | Name of the task the document is attached to.
+createdAt | [DateTime!](#datetime) |
+file | [File](#file) | Contains the file payload.
+id | [ID!](#id) |
+updatedAt | [DateTime!](#datetime) |
+
+## Employee
+A single Employee that works for your company. Employees have first class fields (e.g. title, start_date, email), and they also hold custom_field_values for user defined custom fields. These secondary values are held within the customFieldValues array.
+
+Field | Type | Description
+--------- | ----------- | -----------
+about | [String](#string) | A brief description of the employee. This information is displayed on both the employee's profile and is also featured prominently in the Welcome Experience for any new hires that report to this employee.
+createdAt | [DateTime!](#datetime) |
+customFieldValues | [\[CustomFieldValue!\]](#customfieldvalue) | A list of all other profile information for this employee. Administrators can configure these fields on the [Settings > Custom Fields](https://onboarding.greenhouse.io/settings/fields) page.
+dateOfBirth | [Date](#date) | Note that only administrators can see the birth year for employees
+dateOfTermination | [Date](#date) | This information is only available on terminated employees
+department | [Department](#department) |
+documents | [\[Document!\]](#document) | These are documents that came over from Greenhouse Recruiting or were attached directly to the employee profile. This does _not_ include E-Signature requests.
+email | [String](#string) | The employee's work email. They need this in order to sign in.
+employmentStatus | [String](#string) | [Valid options](#employmentstatuses-string)
+firstName | [String](#string) |
+greenhouseRecruitingData | [GreenhouseRecruitingData](#greenhouserecruitingdata) | The Greenhouse Recruiting 'hired' webhook data
+hrManager | [Employee](#employee) | The employee's HR Manager.
+id | [ID!](#id) |
+lastName | [String](#string) |
+location | [Location](#location) |
+manager | [Employee](#employee) | This employee's direct manager.
+middleName | [String](#string) |
+otherCriteria | [\[OtherCriterion!\]](#othercriterion) |
+personalEmail | [String](#string) | The employee's personal email.
+phoneNumber | [String](#string) |
+preferredFirstName | [String](#string) | This is the name that your employee prefers to go by. If this value is set, Greenhouse Onboarding will display this name everywhere in the product instead of the employee's legal name.
+preferredLastName | [String](#string) | This is the name that your employee prefers to go by. If this value is set, Greenhouse Onboarding will display this name everywhere in the product instead of the employee's legal name.
+profileImage | [File](#file) | A file containing the employee's profile image. This image is displayed in emails, reports and directory pages.
+signatureRequests | [\[SignatureRequest!\]](#signaturerequest) | These are E-Signature requests initiated through Greenhouse Onboarding. Keep in mind that these requests can be in a number of different states in their lifecycle and may not always have a signed document available to download.
+startDate | [Date](#date) |
+suffix | [String](#string) |
+title | [String](#string) | The employee's job title.
+updatedAt | [DateTime!](#datetime) |
+workCountryCode | [String!](#string) |
+
+## EmployeeConnection
+The connection type for Employee.
+
+Field | Type | Description
+--------- | ----------- | -----------
+edges | [\[EmployeeEdge\]](#employeeedge) | A list of edges.
+nodes | [\[Employee\]](#employee) | A list of nodes.
+pageInfo | [PageInfo!](#pageinfo) | Information to aid in pagination.
+
+## EmployeeEdge
+An edge in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+cursor | [String!](#string) | A cursor for use in pagination.
+node | [Employee](#employee) | The item at the end of the edge.
+
+## File
+A File record
+
+Field | Type | Description
+--------- | ----------- | -----------
+expiresAt | [DateTime](#datetime) | The time when the URL will expire. After this time, you will need to generate a new URL.
+fileName | [String](#string) | The original name of the file.
+fileSize | [Int](#int) | The file size, in bytes
+fileUrl | [String](#string) | An expiring URL you can use to download the file.
+
+## GreenhouseRecruitingData
+Greenhouse Recruiting 'Candidate hired' webhook data
+
+Field | Type | Description
+--------- | ----------- | -----------
+applicationId | [ID!](#id) | Greenhouse Recruiting application ID
+rawData | [String!](#string) | Greenhouse Recruiting 'Candidate hired' webhook payload
+
+## Location
+Represents a single location in your company. Employees may belong to zero or one location. Locations are used in a variety of ways in Greenhouse Onboarding, including permissions and onboarding plans.
+
+Field | Type | Description
+--------- | ----------- | -----------
+address | [String](#string) |
+createdAt | [DateTime](#datetime) |
+externalId | [String](#string) |
+id | [ID](#id) |
+name | [String](#string) |
+updatedAt | [DateTime](#datetime) |
+
+## LocationConnection
+The connection type for Location.
+
+Field | Type | Description
+--------- | ----------- | -----------
+edges | [\[LocationEdge\]](#locationedge) | A list of edges.
+pageInfo | [PageInfo!](#pageinfo) | Information to aid in pagination.
+
+## LocationEdge
+An edge in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+cursor | [String!](#string) | A cursor for use in pagination.
+node | [Location](#location) | The item at the end of the edge.
+
+## Mutation
+
+
+Field | Type | Description
+--------- | ----------- | -----------
+addDepartment | [AddDepartmentPayload](#adddepartmentpayload) | Add a new Department
+addLocation | [AddLocationPayload](#addlocationpayload) | Add a new Location
+addPendingHire | [PendingHire](#pendinghire) | Add a Pending Hire to Greenhouse Onboarding
+deleteDepartment | [DeleteDepartmentPayload](#deletedepartmentpayload) | Delete a Department
+deleteLocation | [DeleteLocationPayload](#deletelocationpayload) | Delete a Location
+updateDepartment | [UpdateDepartmentPayload](#updatedepartmentpayload) | Update a Department
+updateEmployeeProfile | [Employee](#employee) | Update an employee's profile
+updateLocation | [UpdateLocationPayload](#updatelocationpayload) | Update a Location
+
+## OtherCriterion
+A tag that can be used to refine on onboarding plan
+
+Field | Type | Description
+--------- | ----------- | -----------
+createdAt | [DateTime](#datetime) |
+id | [ID](#id) |
+name | [String](#string) |
+updatedAt | [DateTime](#datetime) |
+
+## OtherCriterionConnection
+The connection type for OtherCriterion.
+
+Field | Type | Description
+--------- | ----------- | -----------
+edges | [\[OtherCriterionEdge\]](#othercriterionedge) | A list of edges.
+pageInfo | [PageInfo!](#pageinfo) | Information to aid in pagination.
+
+## OtherCriterionEdge
+An edge in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+cursor | [String!](#string) | A cursor for use in pagination.
+node | [OtherCriterion](#othercriterion) | The item at the end of the edge.
+
+## PageInfo
+Information about pagination in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+endCursor | [String](#string) | When paginating forwards, the cursor to continue.
+hasNextPage | [Boolean!](#boolean) | When paginating forwards, are there more items?
+hasPreviousPage | [Boolean!](#boolean) | When paginating backwards, are there more items?
+startCursor | [String](#string) | When paginating backwards, the cursor to continue.
+
+## PendingHire
+A Pending Hire Record
+
+Field | Type | Description
+--------- | ----------- | -----------
+about | [String](#string) |
+createdAt | [DateTime](#datetime) |
+customFieldValues | [\[CustomFieldValue\]](#customfieldvalue) |
+dateOfBirth | [Date](#date) |
+department | [Department](#department) |
+email | [String](#string) |
+employmentStatus | [String](#string) | [Valid options](#employmentstatuses-string)
+firstName | [String](#string) |
+hrManager | [Employee](#employee) |
+id | [ID](#id) |
+lastName | [String](#string) |
+location | [Location](#location) |
+manager | [Employee](#employee) |
+personalEmail | [String](#string) |
+phoneNumber | [String](#string) |
+preferredFirstName | [String](#string) |
+preferredLastName | [String](#string) |
+startDate | [Date](#date) |
+title | [String](#string) |
+updatedAt | [DateTime](#datetime) |
+workCountryCode | [String](#string) |
+
+## RateLimit
+Information about your current API quota
+
+Field | Type | Description
+--------- | ----------- | -----------
+cost | [Int](#int) | The cost of this query. This amount was deducted from your previous quota.
+limit | [Int](#int) | Your quota for the given period.
+remaining | [Int](#int) | The remaining balance for your quota. Any calls that exceed this value will be throttled.
+resetAt | [DateTime](#datetime) | The time when your quota is reset to its maximum value.
+
+## SignatureRequest
+An E-Signature Request for assigned to an [Employee](#employee).
+
+Field | Type | Description
+--------- | ----------- | -----------
+counterSigner | [Employee](#employee) | The employee responsible for counter-signing this document, if applicable.
+createdAt | [DateTime](#datetime) |
+file | [File](#file) | This is available only for completed signatures.
+formFields | [\[JSON\]](#json) | An array of values entered in the e-signature document by the signer (and counter signer if applicable). This is available only for completed signatures.
+id | [ID](#id) |
+signatureRequestTemplate | [SignatureRequestTemplate!](#signaturerequesttemplate) |
+status | [SignatureRequestStatus](#signaturerequeststatus) |
+updatedAt | [DateTime](#datetime) |
+
+## SignatureRequestTemplate
+A template used when assigning signature requests.
+
+Field | Type | Description
+--------- | ----------- | -----------
+counterSigner | [Employee](#employee) | The default employee responsible for counter-signing documents created from this template, if applicable. Individual SignatureRequest objects can override the counter signer.
+createdAt | [DateTime](#datetime) |
+name | [String](#string) | The name of the template. This is the label administrators will see.
+publicName | [String](#string) | The public-facing name of the template. This is the name the new hire will see. If this is null, new hires will see the name field.
+updatedAt | [DateTime](#datetime) |
+
+## State
+A state
+
+Field | Type | Description
+--------- | ----------- | -----------
+country | [Country](#country) |
+name | [String](#string) |
+stateCode | [String](#string) |
+
+## Team
+A Team record
+
+Field | Type | Description
+--------- | ----------- | -----------
+description | [String](#string) |
+email | [String](#string) |
+id | [ID](#id) |
+location | [String](#string) |
+name | [String](#string) |
+teamCategory | [TeamCategory](#teamcategory) |
+
+## TeamCategory
+A Team Category Record
+
+Field | Type | Description
+--------- | ----------- | -----------
+id | [ID](#id) |
+name | [String](#string) |
+
+## TeamCategoryConnection
+The connection type for TeamCategory.
+
+Field | Type | Description
+--------- | ----------- | -----------
+edges | [\[TeamCategoryEdge\]](#teamcategoryedge) | A list of edges.
+pageInfo | [PageInfo!](#pageinfo) | Information to aid in pagination.
+
+## TeamCategoryEdge
+An edge in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+cursor | [String!](#string) | A cursor for use in pagination.
+node | [TeamCategory](#teamcategory) | The item at the end of the edge.
+
+## TeamConnection
+The connection type for Team.
+
+Field | Type | Description
+--------- | ----------- | -----------
+edges | [\[TeamEdge\]](#teamedge) | A list of edges.
+pageInfo | [PageInfo!](#pageinfo) | Information to aid in pagination.
+
+## TeamEdge
+An edge in a connection.
+
+Field | Type | Description
+--------- | ----------- | -----------
+cursor | [String!](#string) | A cursor for use in pagination.
+node | [Team](#team) | The item at the end of the edge.
+
+## UpdateDepartmentPayload
+The result of running an updateDepartment mutation
+
+Field | Type | Description
+--------- | ----------- | -----------
+department | [Department](#department) | The updated department
+
+## UpdateLocationPayload
+The result of running an updateLocation mutation
+
+Field | Type | Description
+--------- | ----------- | -----------
+location | [Location](#location) | The updated location
+
+# Input Objects
+## AddDepartmentInput
+The input object used to add a [Department](#department).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+externalId | [String](#string) | |
+name | [String](#string) | | Required
+
+## AddLocationInput
+The input object used to add a [Location](#location).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+address | [String](#string) | |
+externalId | [String](#string) | |
+name | [String](#string) | | Required
+
+## AddPendingHireInput
+Specify the properties of a new PendingHire
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+about | [String](#string) | |
+customFieldValues | [\[UpdateCustomFieldValue\]](#updatecustomfieldvalue) | |
+dateOfBirth | [Date](#date) | |
+department | [ID](#id) | |
+email | [String](#string) | | Required
+employmentStatus | [String](#string) | [Valid options](#employmentstatuses-string) |
+firstName | [String!](#string) | | Required
+hrManager | [ID](#id) | |
+lastName | [String!](#string) | | Required
+location | [ID](#id) | |
+manager | [ID](#id) | |
+middleName | [String](#string) | |
+personalEmail | [String](#string) | |
+phoneNumber | [String](#string) | |
+preferredFirstName | [String](#string) | |
+preferredLastName | [String](#string) | |
+startDate | [Date](#date) | |
+suffix | [String](#string) | |
+title | [String](#string) | |
+workCountryCode | [String!](#string) | | Required
+
+## CustomFieldValuesInput
+Limit employees to those that satisfy the specified CustomFieldValue criteria. Note: CustomFieldValues that belong to a CustomField with a CustomFieldType of "MASKED", are not filterable by textValues
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+dateValue | [DateFilter](#datefilter) | |
+id | [String!](#string) | | Required
+idValues | [\[Int\]](#int) | |
+textValues | [\[String\]](#string) | |
+
+## DateFilter
+Specify a range of dates using after (exclusive >), before (exclusive <), or on (exact match)
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [Date](#date) | |
+before | [Date](#date) | |
+on | [Date](#date) | |
+
+## DateOfBirthFilter
+Filter employees based on their date of birth
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+dateFilter | [DateFilter](#datefilter) | |
+noValue | [Boolean](#boolean) | |
+
+## DateTimeFilter
+Specify a range of datetimes using after (exclusive >), before (exclusive <)
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+after | [DateTime](#datetime) | |
+before | [DateTime](#datetime) | |
+
+## DeleteDepartmentInput
+The input object used to delete a [Department](#department).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [ID!](#id) | | Required
+
+## DeleteLocationInput
+The input object used to delete a [Location](#location).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+id | [ID!](#id) | | Required
+
+## DepartmentFilter
+Filter employees based on their department
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+departmentIds | [\[Int\]](#int) | |
+noValue | [Boolean](#boolean) | |
+
+## EmailFilter
+Filter employees based on their email address
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+emails | [\[String\]](#string) | |
+noValue | [Boolean](#boolean) | |
+
+## EmploymentStatusFilter
+Filter employees based on their Employment Status
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+employmentStatuses | [\[String\]](#string) | [Valid options](#employmentstatuses-string) |
+noValue | [Boolean](#boolean) | |
+
+## HrManagerFilter
+Filter employees based on their HR Manager
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+hrManagerIds | [\[Int\]](#int) | |
+noValue | [Boolean](#boolean) | |
+
+## LocationFilter
+Filter employees based on their location
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+locationIds | [\[Int\]](#int) | |
+noValue | [Boolean](#boolean) | |
+
+## ManagerFilter
+Filter employees based on their Manager
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+managerIds | [\[Int\]](#int) | |
+noValue | [Boolean](#boolean) | |
+
+## PersonalEmailFilter
+Filter employees based on their personal email address
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+noValue | [Boolean](#boolean) | |
+personalEmails | [\[String\]](#string) | |
+
+## StartDateFilter
+Filter employees based on their start date
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+dateFilter | [DateFilter](#datefilter) | |
+noValue | [Boolean](#boolean) | |
+
+## TitleFilter
+Filter employees based on their title
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+noValue | [Boolean](#boolean) | |
+titles | [\[String\]](#string) | |
+
+## UpdateCustomFieldValue
+Used to update an employee's Custom Field Value
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+customFieldId | [ID!](#id) | | Required
+value | [Value](#value) | |
+
+## UpdateDepartmentInput
+The input object used to update a [Department](#department).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+externalId | [String](#string) | |
+id | [ID!](#id) | | Required
+name | [String](#string) | |
+
+## UpdateEmployee
+The input object used to update an [Employee](#employee).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+about | [String](#string) | |
+customFieldValues | [\[UpdateCustomFieldValue\]](#updatecustomfieldvalue) | |
+dateOfBirth | [Date](#date) | |
+department | [ID](#id) | |
+email | [String](#string) | The employee's work email. They need this in order to sign in |
+employmentStatus | [String](#string) | [Valid options](#employmentstatuses-string) |
+firstName | [String](#string) | |
+hrManager | [ID](#id) | |
+lastName | [String](#string) | |
+location | [ID](#id) | |
+manager | [ID](#id) | |
+middleName | [String](#string) | |
+otherCriteria | [\[ID\]](#id) | |
+personalEmail | [String](#string) | |
+phoneNumber | [String](#string) | |
+preferredFirstName | [String](#string) | |
+preferredLastName | [String](#string) | |
+profileImage | [URL](#url) | |
+startDate | [Date](#date) | |
+suffix | [String](#string) | |
+title | [String](#string) | |
+workCountryCode | [String](#string) | |
+
+## UpdateLocationInput
+The input object used to update a [Location](#location).
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+address | [String](#string) | |
+externalId | [String](#string) | |
+id | [ID!](#id) | | Required
+name | [String](#string) | |
+
+## WorkCountryCodeFilter
+Filter employees based on their work country code
+
+Argument | Type | Description | Required
+--------- | ----------- | ----------- | -----------
+anyValue | [Boolean](#boolean) | |
+noValue | [Boolean](#boolean) | |
+workCountryCodes | [\[String\]](#string) | |
+
+# Scalars
+## Boolean
+Represents `true` or `false` values.
+
+## Date
+Representation of a date in YYYY-MM-DD format.
+
+## DateTime
+Representation of datetime in ISO8601.
+
+## Float
+Represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point).
+
+## ID
+Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"VXNlci0xMA=="`) or integer (such as `4`) input value will be accepted as an ID.
+
+## Int
+Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
+
+## JSON
+Represents untyped JSON
+
+## String
+Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.
+
+## URL
+A URL-formatted String
+
+## Value
+The actual value of a Custom Field Value. This type is capable of holding both Strings and Integers. Its content will
+depend on the fieldType of its corresponding customField.
+
+### text, long_text
+* Allowed Type(s): String
+* Must be less than 3000 chars
+
+### multiple_choice
+* Allowed Type(s): String
+* Must exactly match one of the customField's options
+
+### multiple_select
+* Allowed Type(s): String. Must be a JSON Array encoded string (with escaped quotes) e.g. `"[\"Option A\", \"Option B\"]"`
+* Each option must be a String that exactly matches one of the customField's options
+
+### team
+* Allowed Type(s): String or Integer
+* Value must be valid Team ID
+* The Team specified by the ID must have the same teamCategory as the customField
+
+### employee
+* Allowed Type(s): String or Integer
+* Provided value must be valid Employee ID
+
+### address
+* Allowed Type(s): String. Must be a JSON Object encoded string (with escaped quotes) e.g. `"{\"key\": \"value\"}"`
+* Provided value must be valid Employee ID
+* All values must be Strings
+* Must provide `address_line_1`, `city`, `state`, `country`
+* `country` must be a valid countryCode.
+* `country` must match the `workCountryCode` of the employee
+* `state` must be a valid stateCode
+* `state` must be a valid stateCode for the provided countryCode.
+
+### contact
+* Allowed Type(s): String. Must be a JSON Object encoded string (with escaped quotes) e.g. `"{\"key\": \"value\"}"`
+* All values in the JSON Object must be Strings.
+* Must provide `first_name`, `last_name`, and `relationship`
+* must provide at least one of: `email` or `phone`
+* `relationship` must be one of:
+* Child
+* Domestic Partner
+* Domestic Partner Child
+* Friend
+* Grandparent
+* Parent
+* Sibling
+* Spouse
+* Other
+
+### date
+* Allowed Type(s): String
+* Must formatted as YYYY-MM-DD
+
+### legal_name
+* Allowed Type(s): String. Must be a JSON Object encoded string (with escaped quotes) e.g. `"{\"key\": \"value\"}"`
+* All values in the JSON Object must be Strings.
+* Must provide `first_name` and `last_name`
+
+### preferred_name
+* Allowed Type(s): String. Must be a JSON Object encoded string (with escaped quotes) e.g. `"{\"key\": \"value\"}"`
+* All values in the JSON Object must be Strings.
+
+# Enums
+NOTE: Enums are unquoted in user input but quotes in API output.
+## CustomFieldType
+Possible type values for CustomFieldValues
+
+Value | Description
+--------- | ---------
+ADDRESS | Displayed as group of inputs. Stored as JSON.
+CONTACT | Displayed as group of inputs. Stored as JSON.
+COUNTRY | Displayed as a dropdown. Stored as a String.
+DATE | Displayed as a datepicker. Stored as a DateTime
+EMPLOYEE | Displayed as a dropdown of employees. Stored as an Employee ID.
+IMAGE | Displayed as an image. Stored as a File.
+LEGAL_NAME | Displayed as a group of inputs. Stored as JSON.
+LONG_TEXT | Displayed as a multiline text box. Stored as a String.
+MASKED | Displayed as a single line text field (hidden in application). Stored as a String.
+MULTIPLE_CHOICE | Displayed as a dropdown. Stored as a String.
+MULTIPLE_SELECT | Displayed as a tag field. Stored as an Array of Strings.
+PREFERRED_NAME | Displayed as a group of inputs. Stored as JSON.
+TEAM | Displayed as a dropdown of teams. Stored as a Team ID.
+TEXT | Displayed as a single line text field. Stored as a String.
+
+## SignatureRequestStatus
+Possible status values for a Signature Request
+
+Value | Description
+--------- | ---------
+BEING_PROCESSED | Document is being processed by our E-Signature Vendor.
+CANCELED | Signature request has been terminated.
+COMPLETED | Document has been successfully signed and verified.
+ERROR | Could not be completed due to an error processing the E-Signature.
+WAITING_FOR_COUNTER_SIGNATURE | Document awaiting counter-signer signature.
+WAITING_FOR_SIGNATURE | Waiting for the employee to sign the document.
+
diff --git a/source/includes/gho/_errors.md b/source/includes/gho/_errors.md
new file mode 100644
index 00000000000..60f80c1f707
--- /dev/null
+++ b/source/includes/gho/_errors.md
@@ -0,0 +1,53 @@
+## Errors and Validation
+```graphql
+{
+ employee(id: 100000000) {
+ email
+ }
+}
+```
+
+```json
+{
+ "data": {
+ "employee": null
+ },
+ "errors": [
+ {
+ "message": "Unable to find Employee with id 100000000",
+ "locations": [
+ {
+ "line": 2,
+ "column": 3
+ }
+ ],
+ "path": [
+ "employee"
+ ],
+ "errorCode": "NotFound"
+ }
+ ]
+}
+```
+Unlike REST APIs, GraphQL will return an HTTP status of 200, even in cases where there are errors. You can see an
+example of an error message to the right. The `data` and `errors` properties are siblings. It's possible for a
+request to generate a response that has _both_ `data` and `errors`. However, if there is ever an `errors` key in the response,
+the request failed (despite the return code of 200).
+
+The `message` will let you know what's wrong. The `locations` property
+has the line number and column where the error starts. In this example, it's the 2nd line, 3rd column, which
+is the start of the word `employee`. The `fields` property is a breadcrumb trail of how to get to the problem. Here,
+the problem can be found on the top-most `employee` selection.
+
+When we can, we'll also provide an `errorCode` key for every entry in the `errors` list. Here's a table of current errorCodes:
+
+Error Scenario | Error Code |
+-------------- | ---------- |
+Authentication Failure | Authentication |
+Validation Failure | Validation |
+Resource Not Found | NotFound |
+Server Error | Server |
+Rate Limit Exceeded | RateLimit|
+
+There are undefined error scenarios in which we're unable to provide a code. In these cases, refer to the contents
+of the error list.
\ No newline at end of file
diff --git a/source/includes/gho/_introduction.md b/source/includes/gho/_introduction.md
new file mode 100644
index 00000000000..ad5862ebfea
--- /dev/null
+++ b/source/includes/gho/_introduction.md
@@ -0,0 +1,190 @@
+# Introduction
+
+Our Greenhouse Onboarding API allows you to query and modify your employee, and query company information.
+
+If you are not using our Onboarding product and would like to know more,
+[please visit our site.](https://greenhouse.io/onboarding)
+
+This documentation is open source! Feel free to leave feedback as issues in the
+[GitHub repo](https://github.com/grnhse/greenhouse-api-docs) or fork it and contribute changes!
+
+## GraphQL
+
+Greenhouse Onboarding only supports [GraphQL](http://graphql.org/); we do not have a traditional REST API.
+We made the decision to use GraphQL because it allows you to:
+
+* Increase throughput by requesting only the data you are interested in.
+* Use introspection to know precisely what our schema looks like. Tools like
+[GraphiQL](https://github.com/skevy/graphiql-app) will allow you to quickly and easily explore our entire API. It even
+supports autocomplete!
+* Program against an industry-wide standard supported by a variety of tools and organizations.
+
+## General Concepts
+Term | Meaning
+---------- | -------
+Query | Similar to GET requests, queries return data (the return type is in parentheses). They can take arguments (listed in a table under the Query name).
+Mutations | Mutate data (similar to POST, PUT, PATCH, DELETE). They also return data (type in parentheses). They can also take arguments (listed in table under the Mutation name).
+Type | Each type describes an object in GHO (e.g. Employee or Department). Each type has its own set of fields which contain the information (e.g. Employee has a first name, Department contains a name).
+Input Objects | Queries and Mutations take input objects as arguments. These arguments have names and values. The value will either be a scalar or a more complex structured input.
+Scalars | The most basic data type. All types (e.g. Employee) have fields that contain scalars or other types that eventually boil down to scalars.
+Enums | ENUMs are hard-coded values. They are strings that must be a certain value. E.g. a Signature Request's "status" can only be one of [BEING_PROCESSED CANCELED COMPLETED ERROR WAITING_FOR_COUNTER_SIGNATURE WAITING_FOR_SIGNATURE].
+
+## Authentication
+
+```shell
+$ curl https://onboarding-api.greenhouse.io/graphql \
+ -X POST \
+ -u your_access_key:your_secret_key \
+ -d '{"query":"{\n rateLimit {\n limit\n }\n}"}' \
+ -H "Content-Type: application/json"
+
+...
+
+> GET /graphql HTTP/1.1
+> Host: onboarding-api.greenhouse.io
+> Authorization: Basic eW91cl9hY2Nlc3Nfa2V5OnlvdXJfdmFsdWU=
+```
+The Greenhouse Onboarding API is secured with HTTP Basic Authentication over HTTPS. Clients are required to supply
+both a username and password. Credentials can be generated inside of the Greenhouse Onboarding product on the
+[Settings > API Management screen](https://onboarding.greenhouse.io/settings/api_management). Only Super Admins can
+generate or revoke API keys. Use the `Access Key` field as the username and the `Secret Key` field as the password.
+
+
+
+Using the Greenhouse Onboarding API provides access to _all_ of your company's information. There is no way to limit
+the scope of an API key. Only share your API key with people that you trust. API keys can be revoked at any time
+on the API Management screen.
+
+## Rate Limiting
+
+```
+# When the rate limit is reached, ensuing requests will result
+# in the following response (until the next time period begins):
+{
+ "errors": [
+ {
+ "message": "Rate limit reached.",
+ "limit": 100,
+ "remaining": 0,
+ "resetAt": "2018-01-01T01:00:00Z"
+ }
+ ]
+}
+```
+
+The Greenhouse Onboarding API imposes limits on the amount of data a single client can request over time, as well as the
+complexity of individual requests. This is done to ensure our servers can always service requests as quickly as possible.
+
+### Request Limits
+
+```
+# To request the current rate limit information:
+{
+ rateLimit {
+ resetAt
+ limit
+ remaining
+ }
+}
+
+# rateLimit response:
+{
+ "data": {
+ "rateLimit": {
+ "resetAt": "2018-09-12T18:00:00Z",
+ "limit": 100,
+ "remaining": 99
+ }
+ }
+}
+```
+
+In order to ensure API stability, we limit the number of requests that can made within a given time window. Consumers can access this rate limit information by querying the `rateLimit` type (see example to the right). The number of remaining requests is indicated by the value in the `remaining` field. When this request limit has been reached, every ensuing request will fail until the next time window begins (indicated by the `resetAt` field). Then, once the next time window starts, the number of requests will be replenished (to the number indicated by the `limit` property).
+
+### Maximum Complexity
+
+```
+# Say we had the following query:
+{
+ employee(id: 25) {
+ email
+ }
+}
+
+# To request the complexity score of this query, simply
+# include complexityInfo as such:
+{
+ employee(id: 25) {
+ email
+ }
+ complexityInfo {
+ score
+ maximum
+ }
+}
+
+# The response:
+{
+ "data": {
+ "employee": {
+ "email": "email_address@example.com"
+ },
+ "complexityInfo": {
+ "score": 1,
+ "maximum": 2500
+ }
+ }
+}
+```
+
+In addition to limiting the number of requests used in a given time period, we limit the "complexity" of any given
+request. If this score exceeds our maximum, the request will be rejected and an error response will be returned.
+
+We reserve the right to adjust the complexity score of any given field at any time. However, for the time being, a
+query's complexity score can be estimated like so:
+
+* For non-connections (e.g. an employee or a department query): simply add up each field being requested.
+
+* For connections (e.g an employees or departments query): add up all requested fields and multiply by the number of
+requested records (e.g. the `first` or `last` argument)
+
+Clients can also determine a query's complexity score by requesting the `complexityInfo` object (see example to the
+right).
+
+## A Basic Request
+```graphql
+# If we wanted to retrieve the email address of the employee
+# with ID 25, the GraphQL query would look like this:
+
+{
+ employee(id: 25) {
+ email
+ }
+}
+```
+
+```graphql
+# We then pack this query into a JSON object as a string
+
+{
+ "query": "{\n employee(id: 25) {\n email\n }\n}"
+}
+```
+
+```shell
+# Here's what the final cURL request would look like
+
+curl 'https://onboarding-api.greenhouse.io/graphql' \
+ -X POST \
+ -u your_access_key:your_secret_key \
+ -d '{"query":"{\n employee(id: 25) {\n email\n }\n}"}' \
+ -H 'content-type: application/json'
+
+# and here's what the response would look like
+
+{"data":{"employee":{"email":"employee_25_email@example.com"}}}
+```
+
+GraphQL requests are simply POSTs made to our API endpoint. In its most simple form, the request payload consists of a
+JSON object with a single key: "query". The corresponding value for the "query" key is the GraphQL query itself, and it
+is expressed as a string.
\ No newline at end of file
diff --git a/source/includes/gho/_pagination.md b/source/includes/gho/_pagination.md
new file mode 100644
index 00000000000..a189cd8ccf4
--- /dev/null
+++ b/source/includes/gho/_pagination.md
@@ -0,0 +1,64 @@
+## Pagination
+
+```graphql
+{
+ employees(first: 2, after: "NQ==") { # Please fetch the next 2 records, starting after the "NQ==" cursor
+ pageInfo {
+ endCursor
+ hasNextPage
+ }
+ edges {
+ node {
+ email
+ }
+ }
+ }
+}
+
+# Returns:
+
+{
+ "data": {
+ "employees": {
+ "pageInfo": {
+ "endCursor": "MTA=",
+ "hasNextPage": true
+ },
+ "edges": [
+ {
+ "node": {
+ "email": "kima@example.com"
+ }
+ },
+ {
+ "node": {
+ "email": "omar@example.com"
+ }
+ }
+ ]
+ }
+ }
+}
+
+```
+
+For performance reasons, some result sets will be limited in size. For example, when requesting employee profile
+information we limit the number of employees returned in a single query. The API will return a "page" of
+records along with an object that describes how to get the next page.
+
+We are using the pagination system recommended by the [GraphQL documentation](http://graphql.org/learn/pagination/).
+Paginated connections return the following pieces of information:
+
+* `edges`: You'll find your records in here.
+* `pageInfo`: This has information about the current page.
+
+To fetch the next page of information, pass the `endCursor` value into the `after` filter on the
+connection. To the right you can see an example on how to fetch employees via the
+[employees](#employees-employeeconnection) connection.
+
+When requesting a paginated resource, you will always need to provide a value for either the `first` or `last` arguments.
+You'll use these arguments to specify the number of records that should be included on a page. If you provide a value larger
+than our maximum of 25, you will receive the maximum of 25 records.
+
+As a general rule, we attempt to avoid nested sets of pagination. For example, the list of CustomFieldValue records
+for each employee will be a simple array instead of another paginated connection.
\ No newline at end of file
diff --git a/source/includes/harvest/_activity_feed.md b/source/includes/harvest/_activity_feed.md
new file mode 100644
index 00000000000..6b9ce8d84cd
--- /dev/null
+++ b/source/includes/harvest/_activity_feed.md
@@ -0,0 +1,178 @@
+# Activity Feed
+
+## The activity feed object
+The activity feed is the list of activities on a candidate's profile, including interviews, notes, and emails.
+
+```json
+{
+ "notes": [
+ {
+ "id": 123456,
+ "created_at": "2014-03-26T20:11:40Z",
+ "body": "Very mysterious.",
+ "user": {
+ "id": 512,
+ "first_name": "Sayid",
+ "last_name": "Jarrah",
+ "name": "Sayid Jarrah",
+ "employee_id": "12345"
+ },
+ "private": false,
+ "visiblity": "public",
+ "visibility": "public"
+ }
+ ],
+ "emails": [
+ {
+ "id": 234675,
+ "created_at": "2014-04-01T15:55:06Z",
+ "subject": "Regarding your application",
+ "body": "Hey John, just wanted to touch base!",
+ "to": "john.locke@example.com",
+ "from": "boone.carlyle@example.com",
+ "cc": "sam.smith@example.com",
+ "user": {
+ "id": 214,
+ "first_name": "Boone",
+ "last_name": "Carlyle",
+ "name": "Boone Carlyle",
+ "employee_id": "67890"
+ }
+ }
+ ],
+ "activities": [
+ {
+ "id": 6756789,
+ "created_at": "2014-04-01T15:55:29Z",
+ "subject": "Candidate Rejected",
+ "body": "Reason: Lacking hustle\n\nThis candidate turned out to be problematic for us...",
+ "user": {
+ "id": 214,
+ "first_name": "Boone",
+ "last_name": "Carlyle",
+ "name": "Boone Carlyle",
+ "employee_id": "67890"
+ }
+ },
+ {
+ "id": 6757869,
+ "created_at": "2014-03-26T20:26:38Z",
+ "subject": "Candidate Stage Change",
+ "body": "John Locke was moved into Recruiter Phone Screen for Accounting Manager on 03/27/2014 by Boone Carlyle",
+ "user": {
+ "id": 214,
+ "first_name": "Boone",
+ "last_name": "Carlyle",
+ "name": "Boone Carlyle",
+ "employee_id": "67890"
+ }
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The internal Greenhouse ID of the activity feed note.
+| note | An array of notes associated with this candidate.
+| email | An array of emails sent to and from this candidate.
+| activity | An array of events associated with this candidate.
+| visibility* | The visibility setting on the note. One of `admin_only`, `public`, or `private`.
+
+\* - Due to a legacy typo, the response includes the same value as `visiblity`. It is safe to ignore this value, but it is maintained for backward compatibility.
+
+
+
+## GET: Retrieve Activity Feed
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/candidates/{id}/activity_feed'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "notes": [
+ {
+ "id": 12345,
+ "created_at": "2014-03-26T20:11:40Z",
+ "body": "Very mysterious.",
+ "user": {
+ "id": 512,
+ "first_name": "Sayid",
+ "last_name": "Jarrah",
+ "name": "Sayid Jarrah",
+ "employee_id": "12345"
+ },
+ "private": false,
+ "visiblity": "public",
+ "visibility": "public"
+ }
+ ],
+ "emails": [
+ {
+ "id": 234675,
+ "created_at": "2014-04-01T15:55:06Z",
+ "subject": "Regarding your application",
+ "body": "Hey John, just wanted to touch base!",
+ "to": "john.locke@example.com",
+ "from": "boone.carlyle@example.com",
+ "cc": "sam.smith@example.com",
+ "user": {
+ "id": 214,
+ "first_name": "Boone",
+ "last_name": "Carlyle",
+ "name": "Boone Carlyle",
+ "employee_id": "67890"
+ }
+ }
+ ],
+ "activities": [
+ {
+ "id": 6756789,
+ "created_at": "2014-04-01T15:55:29Z",
+ "subject": "Candidate Rejected",
+ "body": "Reason: Lacking hustle\n\nThis candidate turned out to be problematic for us...",
+ "user": {
+ "id": 214,
+ "first_name": "Boone",
+ "last_name": "Carlyle",
+ "name": "Boone Carlyle",
+ "employee_id": "67890"
+ }
+ },
+ {
+ "id": 6757869,
+ "created_at": "2014-03-26T20:26:38Z",
+ "subject": "Candidate Stage Change",
+ "body": "John Locke was moved into Recruiter Phone Screen for Accounting Manager on 03/27/2014 by Boone Carlyle",
+ "user": {
+ "id": 214,
+ "first_name": "Boone",
+ "last_name": "Carlyle",
+ "name": "Boone Carlyle",
+ "employee_id": "67890"
+ }
+ }
+ ]
+}
+```
+
+Retrieve a candidate's activity feed.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/candidates/{id}/activity_feed`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the candidate whose activity feed you want to retrieve.
+
+
+[See noteworthy response attributes.](#the-activity-feed-object)
\ No newline at end of file
diff --git a/source/includes/harvest/_applications.md b/source/includes/harvest/_applications.md
new file mode 100644
index 00000000000..0b5ccca1867
--- /dev/null
+++ b/source/includes/harvest/_applications.md
@@ -0,0 +1,1616 @@
+# Applications
+
+## The application object
+
+Applications associate [candidates](#candidates) with [jobs](#jobs). There are 2 kinds of applications: candidates and prospects. Candidate applications always have exactly 1 job. Prospect applications can have 0 or more jobs.
+
+```json
+{
+ "id": 985314,
+ "candidate_id": 978031,
+ "prospect": false,
+ "applied_at": "2016-03-26T20:11:39.000Z",
+ "rejected_at": "2016-08-17T21:08:29.686Z",
+ "last_activity_at": "2016-08-27T16:13:15.000Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 1871,
+ "public_name": "Happy Hour"
+ },
+ "credited_to": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "rejection_reason": {
+ "id": 8,
+ "name": "Lacking skill(s)/qualification(s)",
+ "type": {
+ "id": 1,
+ "name": "We rejected them"
+ }
+ },
+ "rejection_details": {
+ "custom_fields": {
+ "custom_rejection_question_field": "Not a good fit"
+ },
+ "keyed_custom_fields": {
+ "custom_rejection_question_field": {
+ "name": "Was this candidate a good fit?",
+ "type": "short_text",
+ "value": "Not a good fit."
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 123,
+ "name": "Accounting Manager"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "rejected",
+ "current_stage": {
+ "id": 62828,
+ "name": "Recruiter Phone Screen"
+ },
+ "answers": [
+ {
+ "question": "Why do you want to work for us?",
+ "answer": "I heard you're awesome!"
+ },
+ {
+ "question": "How did you hear about this job?",
+ "answer": "From a former colleague."
+ }
+ ],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "bio": "This is a bio",
+ "birthday": "1992-01-27"
+ },
+ "keyed_custom_fields": {
+ "date_of_birth": {
+ "name": "Birthday",
+ "type": "date",
+ "value": "1992-01-27"
+ },
+ "bio": {
+ "name": "Bio",
+ "type": "long_text",
+ "value": "This is a bio"
+ }
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | Application ID |
+| prospect | If `true`, this is a prospect application which means that the associated person is a prospect and has not yet applied for this job.
+| status | One of: `active`, `rejected`, `hired`, `converted`.
+| jobs | An array containing the [job](#jobs) that the candidate applied for.
+| job_post_id | The ID of the job post through which the candidate applied. This value is null if the application was created through other means, e.g. manually adding candidates or importing candidates through sourcing integrations
+| candidate_id | The ID of the [candidate](#candidates) who is applying for this job.
+| current_stage | The current [stage](#job-stages) that this application is in.
+| credited_to.id | The ID of the user who will receive credit for this application.
+| location | The contents of the location question on a job post.
+| answers | The answers provided to the questions in the job post for this application. Array contains the text value of the question and answer. Answers are always plaintext strings. Booleans will return `Yes` or `No`.
+| custom_fields | Contains a hash of the custom fields configured for this resource. The properties in this hash reflect the active custom fields as of the time this method is called.
+| keyed_custom_fields | This contains the same information as custom_fields but formatted in a different way that includes more information. This will tell you the type of custom field data to expect, the text name of custom field, and the value. The key of this hash is the custom field's immutable field key, which will not change even if the name of the custom field is changed in Greenhouse.
+| prospective_department | The [department](#the-department-object) that this prospect application is being considered for. |
+| prospective_office | The [office](#the-office-object) that this prospect application is being considered for. |
+
+
+## GET: List Applications
+
+```shell
+curl -X GET 'https://harvest.greenhouse.io/v1/applications'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 69306314,
+ "candidate_id": 57683957,
+ "prospect": false,
+ "applied_at": "2017-09-29T12:56:05.244Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-29T13:00:28.038Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 2,
+ "public_name": "Jobs page on your website"
+ },
+ "credited_to": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 107761,
+ "name": "UX Designer - Boston"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "active",
+ "current_stage": {
+ "id": 767358,
+ "name": "Application Review"
+ },
+ "answers": [
+ {
+ "question": "How did you hear about this job?",
+ "answer": "Online Research"
+ },
+ {
+ "question": "Website",
+ "answer": "mytestwebsite.com"
+ }
+ ],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "application_custom_test": "Option 1"
+ },
+ "keyed_custom_fields": {
+ "application_custom_test": {
+ "name": "Application Custom Test",
+ "type": "single_select",
+ "value": "Option 1"
+ }
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+},
+{
+ "id": 69306509,
+ "candidate_id": 57683957,
+ "prospect": true,
+ "applied_at": "2017-09-29T13:00:04.058Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-29T13:08:19.111Z",
+ "location": null,
+ "source": {
+ "id": 100674,
+ "public_name": "Campus Job Fair"
+ },
+ "credited_to": {
+ "id": 566819,
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "name": "Bob Smith",
+ "employee_id": "ABC12345"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 224587,
+ "name": "Product Manager "
+ },
+ {
+ "id": 109322,
+ "name": "Web Developer "
+ }
+ ],
+ "job_post_id": null,
+ "status": "hired",
+ "current_stage": null,
+ "answers": [
+ {
+ "question": "How did you hear about this job?",
+ "answer": "Online Research"
+ },
+ {
+ "question": "Website",
+ "answer": "mytestwebsite.com"
+ }
+ ],
+ "prospective_office": {
+ "primary_contact_user_id": null,
+ "parent_id": null,
+ "name": "New York",
+ "location": {
+ "name": "New York, NY"
+ },
+ "id": 59213,
+ "external_id": null,
+ "child_ids": []
+ },
+ "prospective_department": {
+ "parent_id": null,
+ "name": "Marketing",
+ "id": 9024,
+ "external_id": null,
+ "child_ids": []
+ },
+ "prospect_detail": {
+ "prospect_pool": {
+ "id": 227,
+ "name": "Opted In: In-Person Event"
+ },
+ "prospect_stage": {
+ "id": 826,
+ "name": "In Discussion"
+ },
+ "prospect_owner": {
+ "id": 92120,
+ "name": "Greenhouse Admin"
+ }
+ },
+ "custom_fields": {
+ "application_custom_test": "Option 1"
+ },
+ "keyed_custom_fields": {
+ "application_custom_test": {
+ "name": "Application Custom Test",
+ "type": "single_select",
+ "value": "Option 1"
+ }
+ },
+ "attachments": [
+ {
+ "filename": "Jack_Smith_Offer_Packet_09_27_2020.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+ }
+]
+```
+List all of an organization's applications.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving applications will improve. This will remove `last` from the `link` response header.
+| created_before | Return only applications that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only applications that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| last_activity_after | Return only applications where 'last_activity_at' is at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| job_id | If supplied, only return applications that involve this job. Will return both candidates and prospects.
+| status | If supplied, only return applications that match this status. Accepted values are active, converted, hired, and rejected. If anything else is used, an empty response will be returned rather than an error.
+
+
+[See noteworthy response attributes.](#the-application-object)
+
+## GET: Retrieve Application
+
+```shell
+curl -X GET 'https://harvest.greenhouse.io/v1/applications/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "id": 69306314,
+ "candidate_id": 57683957,
+ "prospect": false,
+ "applied_at": "2017-09-29T12:56:05.244Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-29T13:00:28.038Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 2,
+ "public_name": "Jobs page on your website"
+ },
+ "credited_to": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 107761,
+ "name": "UX Designer - Boston"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "active",
+ "current_stage": {
+ "id": 767358,
+ "name": "Application Review"
+ },
+ "answers": [
+ {
+ "question": "How did you hear about this job?",
+ "answer": "Online Research"
+ },
+ {
+ "question": "Website",
+ "answer": "mytestwebsite.com"
+ }
+ ],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "application_custom_test": "Option 1"
+ },
+ "keyed_custom_fields": {
+ "application_custom_test": {
+ "name": "Application Custom Test",
+ "type": "single_select",
+ "value": "Option 1"
+ }
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+}
+
+```
+
+Retrieve an application by its `id`.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications/{id}`
+
+### URL parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the application to retrieve
+
+
+[See noteworthy response attributes.] (#the-application-object)
+
+## DELETE: Delete Application
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/applications/{id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "message": "Application 29622362 has been deleted."
+}
+```
+
+Delete an application by `id`. Note that only candidate applications can be deleted, you cannot delete a prospect application.
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/applications/{id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+
+[See noteworthy response attributes.] (#the-candidate-object)
+
+## POST: Add Application to Candidate/Prospect
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/candidates/{id}/applications'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> To create a prospect application for jobs 123 and 456:
+
+```json
+{
+ "prospect": "true",
+ "job_ids": [123, 456],
+ "prospective_office_id": 58319,
+ "prospective_department_id": 9021,
+ "prospect_pool_id": 1640,
+ "prospect_pool_stage_id": 7594,
+ "prospect_owner_id": 107468
+}
+```
+
+> To create a prospect application on no jobs:
+
+```json
+{
+ "prospect": "true"
+}
+```
+
+> To create a candidate application:
+
+```json
+{
+ "job_id": 266926,
+ "source_id": 7,
+ "initial_stage_id": 2708728,
+ "referrer": {
+ "type": "id",
+ "value": 770
+ },
+ "attachments": [{
+ "filename": "resume.pdf",
+ "type": "resume",
+ "content": "MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6...",
+ "content_type": "application/pdf"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 38776620,
+ "candidate_id": 15803530,
+ "prospect": false,
+ "applied_at": "2016-11-08T19:50:49.746Z",
+ "rejected_at": null,
+ "last_activity_at": "2016-11-04T19:46:40.377Z",
+ "source": {
+ "id": 7,
+ "public_name": "Indeed"
+ },
+ "credited_to": {
+ "id": 770,
+ "first_name": "Moon",
+ "last_name": "Colorado",
+ "name": "Moon Colorado",
+ "employee_id": null
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 266926,
+ "name": "Construction Project Manager"
+ }
+ ],
+ "job_post_id": null,
+ "status": "active",
+ "current_stage": {
+ "id": 1945557,
+ "name": "Application Review"
+ },
+ "answers": [],
+ "custom_fields": {
+ "birthday": "1992-01-27",
+ "bio": "This is my bio"
+ },
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ }
+}
+```
+
+
+Create a new application for an existing candidate or prospect.
+
+The new application can be a candidate application or a prospect application, depending on the `"prospect"` parameter which defaults to `"false"`. The JSON body parameters differ depending on whether you are creating a prospect application or a candidate application. The main difference is that prospect applications can be considered for zero, one, or multiple jobs.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/candidates/{id}/applications`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters for Candidate application
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- | -----------
+job_id | Yes | integer | The ID of the job you want to create an application to for this candidate
+source_id | No | integer | The id of the source to be credited for this application
+initial_stage_id | No | integer | The ID of the job stage this application will be created in.
+referrer | No | object | An object representing the referrer
+referrer[type] | No | string | A string representing the type of referrer: 'id', 'email', or 'outside'
+referrer[value] | No | string | The id of the user who made the referral (not the referrer id)
+attachments | No | array | An array of attachments to be uploaded to this application. See [Add Attachment] (#post-add-attachment) for parameters.
+
+### JSON Body Parameters for Prospect application
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- |
+prospect | Yes | boolean | Set to `"true"` in order to create a prospect application.
+job_ids | No | array | An optional array of Job IDs to consider this prospect for.
+source_id | No | integer | The id of the source to be credited for this application
+referrer | No | object | An object representing the referrer
+referrer[type] | No | string | A string representing the type of referrer: 'id', 'email', or 'outside'
+referrer[value] | No | string | The id of the user who made the referral (not the referrer id)
+prospect_pool_id | No | integer | Prospect Pool ID.
+prospect_pool_stage_id | No | integer | Prospect Pool Stage ID. `prospect_pool_id` is required, and the prospect pool stage must belong to the given prospect pool.
+prospect_owner_id | No | integer |User ID of the prospect owner.
+prospective_department_id | No | integer | Department ID to consider this prospect for.
+prospective_office_id | No | integer | Office ID to consider this prospect for. `prospective_department_id` is required in order to set a prospective office.
+
+## PATCH: Update Application
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/applications/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "source_id": 16,
+ "referrer": {
+ "type": "id",
+ "value": 123
+ }
+}
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 69306314,
+ "candidate_id": 57683957,
+ "prospect": false,
+ "applied_at": "2017-09-29T12:56:05.244Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-29T13:00:28.038Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 2,
+ "public_name": "Jobs page on your website"
+ },
+ "credited_to": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 107761,
+ "name": "UX Designer - Boston"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "active",
+ "current_stage": {
+ "id": 767358,
+ "name": "Application Review"
+ },
+ "answers": [
+ {
+ "question": "How did you hear about this job?",
+ "answer": "Online Research"
+ },
+ {
+ "question": "Website",
+ "answer": "mytestwebsite.com"
+ }
+ ],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "application_custom_test": "Option 1"
+ },
+ "keyed_custom_fields": {
+ "application_custom_test": {
+ "name": "Application Custom Test",
+ "type": "single_select",
+ "value": "Option 1"
+ }
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+}
+```
+
+
+
+Update this application. The response is populated with the application's information which will reflect its new state. You can update applications whose status is `active`, `rejected`, or `hired`.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/applications/{id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- | -----------
+source_id | No | integer | The ID of the application's source
+referrer | No | object | An object representing the referrer
+referrer[type] | No | string | A string representing the type of referrer: 'id', 'email', or 'outside'
+referrer[value] | No | string | The id of the user who made the referral (not the referrer id)
+custom_fields[] | No | custom_field | Array of hashes containing new application custom field values. Passing an empty array does nothing. [Click here](#custom-field-parameters) for more information on structuring custom field data for edit requests.
+prospect_pool_id | No | integer | The ID of the prospect pool for the application
+prospect_stage_id | No | integer | The ID of the prospect pool stage for the application
+rejection_details | No | object | An object representing the rejection details of a rejected application. **Note:** Rejection details can't be updated if the application has not been rejected.
+rejection_details[custom_fields[]] | No | custom_field | Array of hashes containing new rejection detail custom field values. Passing an empty array does nothing. [Click here](#custom-field-parameters) for more information on structuring custom field data for edit requests.
+
+## POST: Advance Application
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/applications/{id}/advance'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "from_stage_id": 123
+}
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 69306314,
+ "candidate_id": 57683957,
+ "prospect": false,
+ "applied_at": "2017-09-29T12:56:05.244Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-29T13:00:28.038Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 2,
+ "public_name": "Jobs page on your website"
+ },
+ "credited_to": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 107761,
+ "name": "UX Designer - Boston"
+ }
+ ],
+ "job_post_id": null,
+ "status": "active",
+ "current_stage": {
+ "id": 456,
+ "name": "Phone Interview"
+ },
+ "answers": [
+ {
+ "question": "How did you hear about this job?",
+ "answer": "Online Research"
+ },
+ {
+ "question": "Website",
+ "answer": "mytestwebsite.com"
+ }
+ ],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "application_custom_test": "Option 1"
+ },
+ "keyed_custom_fields": {
+ "application_custom_test": {
+ "name": "Application Custom Test",
+ "type": "single_select",
+ "value": "Option 1"
+ }
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+}
+```
+
+Move this application to the next stage. The response is populated with the application's information which will reflect its new state. Note that only applications in the `active` state can be advanced.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/applications/{id}/advance`
+
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+from_stage_id | Yes | integer | The ID of the job stage this application is currently in.
+
+
+## POST: Move Application (Different Job)
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/applications/{id}/transfer_to_job'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "new_job_id": 123456,
+ "new_stage_id": 234567
+}
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 69306314,
+ "candidate_id": 57683957,
+ "prospect": false,
+ "applied_at": "2017-09-29T12:56:05.244Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-29T13:00:28.038Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 2,
+ "public_name": "Jobs page on your website"
+ },
+ "credited_to": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 123456,
+ "name": "UX Designer - Boston"
+ }
+ ],
+ "job_post_id": null,
+ "status": "active",
+ "current_stage": {
+ "id": 234567,
+ "name": "Application Review"
+ },
+ "answers": [
+ {
+ "question": "How did you hear about this job?",
+ "answer": "Online Research"
+ },
+ {
+ "question": "Website",
+ "answer": "mytestwebsite.com"
+ }
+ ],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "application_custom_test": "Option 1"
+ },
+ "keyed_custom_fields": {
+ "application_custom_test": {
+ "name": "Application Custom Test",
+ "type": "single_select",
+ "value": "Option 1"
+ }
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+}
+```
+
+Move this application to any stage on a different job. If new_stage_id is omitted, the initial stage of the new job will be selected. Prospect applications can't be moved in this way.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/applications/{id}/transfer_to_job`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- | -----------
+new_job_id | Yes | integer | The ID of the job to which this application should be transferred
+new_stage_id | No | integer | The stage on the destination job this application should be placed in. If this is omitted, the application will be sent to the job's initial stage
+
+
+
+[See noteworthy response attributes.] (#the-application-object)
+
+## POST: Move Application (Same Job)
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/applications/{id}/move'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "from_stage_id": 1,
+ "to_stage_id": 2
+}
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 48206478,
+ "candidate_id": 36952451,
+ "prospect": false,
+ "applied_at": "2017-02-01T14:26:02.282Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-02-01T14:51:12.670Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 33,
+ "public_name": "Glassdoor"
+ },
+ "credited_to": null,
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 211706,
+ "name": "Community Manager - New York"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "active",
+ "current_stage": {
+ "id": 1551142,
+ "name": "Offer"
+ },
+ "answers": [
+ {
+ "question": "How many years experience do you have?",
+ "answer": "2-4"
+ },
+ {
+ "question": "Can do you the travel required for this job?",
+ "answer": "Yes"
+ }
+ ],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "current_title": "Community Manager",
+ "requires_visa_sponsorship?": false
+ },
+ "keyed_custom_fields": {
+ "current_title": {
+ "name": "Current Title",
+ "type": "short_text",
+ "value": "Community Manager"
+ },
+ "requires_visa_sponsorship_": {
+ "name": "Requires visa sponsorship?",
+ "type": "boolean",
+ "value": false
+ }
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+}
+```
+
+Move this application from one stage to another. An application can only be moved between stages on the same job. The response is populated with the application’s information which will reflect its new state. Note that only applications in the `active` state can be moved.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/applications/{id}/move`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- | -----------
+from_stage_id | Yes | integer | The ID of the job stage this application is currently in.
+to_stage_id | Yes | integer | The ID of the job stage this application should be moved to.
+
+
+
+[See noteworthy response attributes.] (#the-application-object)
+
+## PATCH: Convert Prospect To Candidate
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/applications/{id}/convert_prospect'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "job_id": 123456,
+ "initial_stage_id": 234567
+}
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "success": true,
+ "old_application_id": 1234321,
+ "new_application_id": 43234323,
+ "new_job_id": 123456,
+ "new_stage_id": 234567
+}
+```
+
+Converts a prospect application to a candidate on a job. If a non-prospect application is provided, an error will be returned.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/applications/{id}/convert_prospect`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- | -----------
+job_id | Yes | integer | The ID of the job this prospect will become a candidate on.
+initial_stage_id | No | integer | The stage on the destination job this application should be placed in. If this is omitted, the application will be sent to the job's initial stage
+
+## POST: Add Attachment to Application
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/applications/{id}/attachments'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "filename" : "resume.pdf",
+ "type" : "resume",
+ "content" : "R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs...",
+ "content_type" : "application/pdf"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "filename": "resume.pdf",
+ "url": "https://prod.s3.amazonaws.com/...",
+ "type": "resume",
+ "content_type": "application/pdf"
+}
+```
+
+Post an attachment to an application by the application `id`.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/applications/{id}/attachments`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+filename | Yes | string | Name of the file
+type | Yes | string | One of: ["resume", "cover_letter", "other", "take_home_test", "offer_letter", "signed_offer_letter"]. For type `take_home_test`, there must be an outstanding test on the application. For type `offer_letter`, there must be an existing offer on the application, and this action will retrigger the approvals process. For type `signed_offer_letter`, there must be an approved, sent offer letter.
+content | No | string | Base64 encoded content of the attachment (if you are providing content, you do not need to provide url). String must be UTF-8 encoded.
+url | No | string | Url of the attachment (if you are providing the url, you do not need to provide the content.) _Please note, shareable links from cloud services such as Google Drive will result in a corrupted file. Please use machine accessbile URLs._
+visibility | No | string | One of: ["public", "private", "admin_only"]. This only applies when attachment type is "other", and will be ignored for all other attachment types. If not supplied, type "other" documents will default to `admin_only`. Resumes, cover letters, and take home tests will always be `public`. Offer letters and signed offer letters will always be `private`.
+content_type | Yes* | string | The content-type of the document you are sending. When using a URL, this generally isn't needed, as the responding server will deliver a content type. This should be included for encoded content. Accepted content types are:
+
+\* \- content_type is required for when uploading a document unless you are uploading using a URL.
+
+
+## POST: Add Candidate
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/candidates'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "first_name": "John",
+ "last_name": "Locke",
+ "company": "The Tustin Box Company",
+ "title": "Customer Success Representative",
+ "is_private": false,
+ "phone_numbers": [
+ {
+ "value": "555-1212",
+ "type": "mobile"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "123 Fake St.",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "john.locke+work@example.com",
+ "type": "work"
+ },
+ {
+ "value": "john.locke@example.com",
+ "type": "personal"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "johnlocke.example.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "linkedin.example.com/john.locke"
+ },
+ {
+ "value": "@johnlocke"
+ }
+ ],
+ "educations": [
+ {
+ "school_id": 459,
+ "discipline_id": 940,
+ "degree_id": 1230,
+ "start_date": "2001-09-15T00:00:00.000Z",
+ "end_date": "2004-05-15T00:00:00.000Z"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2012-08-15T00:00:00.000Z",
+ "end_date": "2016-05-15T00:00:00.000Z"
+ }
+ ],
+ "tags": [
+ "Walkabout",
+ "Orientation"
+ ],
+ "applications": [
+ {
+ "job_id": 215725
+ },
+ {
+ "job_id": 185289
+ }
+ ]
+}
+```
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 57683957,
+ "first_name": "John",
+ "last_name": "Locke",
+ "company": "The Tustin Box Company",
+ "title": "Customer Success Representative",
+ "created_at": "2017-09-28T13:27:54.735Z",
+ "updated_at": "2017-09-28T13:27:55.229Z",
+ "last_activity": "2017-09-28T13:27:55.213Z",
+ "is_private": false,
+ "photo_url": null,
+ "attachments": [],
+ "application_ids": [
+ 69201605,
+ 69201604
+ ],
+ "phone_numbers": [
+ {
+ "value": "555-1212",
+ "type": "mobile"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "123 Fake St.",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "john.locke@example.com",
+ "type": "personal"
+ },
+ {
+ "value": "john.locke+work@example.com",
+ "type": "work"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "johnlocke.example.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "@johnlocke"
+ },
+ {
+ "value": "linkedin.example.com/john.locke"
+ }
+ ],
+ "recruiter": null,
+ "coordinator": null,
+ "can_email": true,
+ "tags": [
+ "Orientation",
+ "Walkabout"
+ ],
+ "applications": [
+ {
+ "id": 69201605,
+ "candidate_id": 57683957,
+ "prospect": false,
+ "applied_at": "2017-09-28T13:27:54.873Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-28T13:27:55.213Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": null,
+ "credited_to": null,
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 185289,
+ "name": "Product Specialist"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "active",
+ "current_stage": {
+ "id": 1355395,
+ "name": "Application Review"
+ },
+ "answers": [],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "attachments": []
+ },
+ {
+ "id": 69201604,
+ "candidate_id": 57683957,
+ "prospect": false,
+ "applied_at": "2017-09-28T13:27:54.812Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-28T13:27:55.213Z",
+ "location": null,
+ "source": null,
+ "credited_to": null,
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 215725,
+ "name": "Operations Manger "
+ }
+ ],
+ "job_post_id": 456,
+ "status": "active",
+ "current_stage": {
+ "id": 1579673,
+ "name": "Application Review"
+ },
+ "answers": [],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "attachments": []
+ }
+ ],
+ "educations": [
+ {
+ "id": 561226,
+ "school_name": "Siena College",
+ "discipline": "Computer Science",
+ "degree": "Bachelor's Degree"
+ }
+ ],
+ "employments": [
+ {
+ "id": 8485064,
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2012-08-15T00:00:00.000Z",
+ "end_date": "2016-05-15T00:00:00.000Z"
+ }
+ ],
+ "custom_fields": {
+ "desired_salary": null,
+ "work_remotely": null,
+ "graduation_year": null
+ },
+ "keyed_custom_fields": {
+ "desired_salary": null,
+ "work_remotely": null,
+ "graduation_year_1": null
+ }
+}
+```
+
+Create a new candidate.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/candidates`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+first_name | Yes | string | The candidate's first name
+last_name | Yes | string | The candidate's last name
+company | No | string | The candidate's company
+title | No | string | The candidate's title
+phone_numbers[] | No | phone_number | Array of phone numbers. Passing an empty array will clear all.
+addresses[] | No | address | Array of addresses. Passing an empty array will clear all.
+email_addresses[] | No | email_address | Array of email addresses. Passing an empty array will clear all.
+website_addresses[] | No | website_address | Array of website addresses. Passing an empty array will clear all.
+social_media_addresses[] | No | social_media_address | Array of social media addresses. Passing an empty array will clear all.
+educations | No | Array | An array of education records. See [Add Education] (#post-add-education) for parameters.
+employments | No | Array | An array of employment records. See [Add Employment] (#post-add-employment) for parameters.
+tags[] | No | string | Array of tags as strings. Passing an empty array will clear all.
+custom_fields[] | No | custom_field | Array of hashes containing new custom field values. Passing an empty array does nothing.
+recruiter | No | Object | An object representing the candidate's recruiter
+recruiter[id] | No | Integer | The ID of the recruiter - either id or email must be present.
+recruiter[email] | No | String | The email of the recruiter - either id or email must be present.
+coordinator | No | Object | An object representing the candidate's coordinator
+coordinator[id] | No | Integer | The ID of the coordinator - either id or email must be present.
+coordinator[email] | No | String | The email of the coordinator - either id or email must be present.
+custom_fields | No | Array | Array of custom field value objects - See "Custom Field Parameters" under [Edit candidate] (#patch-edit-candidate) for parameters.
+activity_feed_notes | No | Array | An array of activity feed objects. See [Add Note] (#post-add-note) for parameters.
+applications | Yes | Array | An array of application objects. At least one required. See [Add Application] (#post-add-application-to-candidate-prospect) for parameters.
+
+
+
+[See noteworthy response attributes.] (#the-candidate-object)
+
+
+
+## POST: Add Note
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/candidates/{id}/activity_feed/notes'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```
+{
+ "user_id": "158108",
+ "body": "John Locke was moved into Recruiter Phone Screen for Accounting Manager on 03/27/2014 by Boone Carlyle",
+ "visibility": "admin_only"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 226809052,
+ "created_at": "2015-07-17T16:29:31Z",
+ "body": "John Locke was moved into Recruiter Phone Screen for Accounting Manager on 03/27/2014 by Boone Carlyle",
+ "user": {
+ "id": 214,
+ "first_name": "Boone",
+ "last_name": "Carlyle",
+ "name": "Boone Carlyle",
+ "employee_id": null
+ },
+ "private": false,
+ "visiblity": "admin_only",
+ "visibility": "admin_only"
+}
+```
+
+Create a candidate note.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/candidates/{id}/activity_feed/notes`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+user_id | Yes | integer | The ID of the user creating the note
+body | Yes | string | Note body
+visibility* | Yes | string | One of: `"admin_only"`, `"private"`, `"public"`
+
+\* - Due to a legacy typo, the response includes the same value as `visiblity`. It is safe to ignore this value, but it is maintained for backward compatibility.
+
+
+## POST: Add E-mail Note
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/candidates/{id}/activity_feed/emails'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```
+{
+ "user_id": "214",
+ "to": "candidate@example.com",
+ "from": "recruiter@example.com",
+ "cc": ["manager@example.com"],
+ "subject": "Interview Scheduled",
+ "body": "An interview has been scheduled for tomorrow."
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 226809053,
+ "created_at": "2015-07-17T16:29:31Z",
+ "subject": "Interview Scheduled",
+ "body": "An interview has been scheduled for tomorrow.",
+ "to": "candidate@example.com",
+ "from": "recruiter@example.com",
+ "cc": [
+ "manager@example.com"
+ ],
+ "user": {
+ "id": 214,
+ "first_name": "Donald",
+ "last_name": "Johnson",
+ "name": "Donald Johnson",
+ "employee_id": "12345"
+ }
+}
+```
+
+Create a candidate e-mail note.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/candidates/{id}/activity_feed/emails`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+user_id | Yes | integer | The ID of the user creating the note
+to | Yes | string | This is a free text field that is meant to be an e-mail address. E-mail format will not be validated.
+from | Yes | string | This is a free text field that is meant to be an e-mail address. E-mail format will not be validated.
+cc | No | Array | This is meant to be an array of e-mail addresses. E-mail format will not be validated.
+subject | Yes | string | The subject line of the e-mail.
+body | Yes | string | The body of the e-mail.
+
+
+## POST: Add Education
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/candidates/{id}/educations'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "school_id": 459,
+ "discipline_id": 940,
+ "degree_id": 1230,
+ "start_date": "2001-09-15T00:00:00.000Z",
+ "end_date": "2004-05-15T00:00:00.000Z"
+}
+```
+
+> The above command returns a JSON response with a 201 status, structured like this:
+
+```json
+{
+ "id": 5690098,
+ "school_name": "Siena College",
+ "discipline": "Computer Science",
+ "degree": "Bachelor's Degree",
+ "start_date": "2001-09-15T00:00:00.000Z",
+ "end_date": "2004-05-15T00:00:00.000Z"
+}
+```
+
+Create a new education record
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/candidates/{id}/educations`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+school_id | No | integer | The ID of the college attended; from the GET schools endpoint
+discipline_id | No | integer | The ID of the discipline of the candidate's education; from the GET disciplines endpoint.
+degree_id | No | integer | The type of degree received; from the GET degrees endpoint
+start_month | No | integer | The month the candidate began attendance. Must be between 1-12.
+start_year | No | integer | The year the candidate began attendance. Must be between 1900-2100.
+start_date | No | DateTime | The date the candidate began attendance. Timestamp must be in in [ISO-8601] (#general-considerations) format.*
+end_month | No | integer | The month the candidate finished attendance. Must be between 1-12.
+end_year | No | integer | The year the candidate finished attendance. Must be between 1900-2100.
+end_date | No | DateTime | The date the candidate finished attendance. Timestamp must be in in [ISO-8601] (#general-considerations) format.*
+
+* - Note that start_date and end_date accept an [ISO-8601] (#general-considerations) timestamp in accordance with Harvest's standard timestamp rules, but only Month and Year will be displayed on the candidate profile in Greenhouse. The "latest education" will be updated automatically. Day and time information in these timestamps will be recorded but not referenced in Greenhouse.
+* - Note that you can either have start_date, or start_month and start_year.
+* - Note that you can either have end_date, or end_month and end_year.
+
+## DELETE: Remove Education From Candidate
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/candidates/{candidate_id}/educations/{education_id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "success": true,
+ "message": "Education ID 2002247 destroyed."
+}
+```
+
+Delete an education record by candidate and education id.
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/candidates/{candidate_id}/educations/{education_id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+## POST: Add Employment
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/candidates/{id}/employments'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```
+{
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2001-09-15T00:00:00.000Z",
+ "end_date": "2004-05-15T00:00:00.000Z"
+}
+```
+
+> The above command returns a JSON response with a 201 status, structured like this:
+
+```json
+{
+ "id": 5690098,
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2001-09-15T00:00:00.000Z",
+ "end_date": "2004-05-15T00:00:00.000Z"
+}
+```
+
+Create a new employment record
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/candidates/{id}/employments`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+company_name | Yes | String | A free text field indicating an employer's name
+title | Yes | String | A free text field indicating the candidate's title while at the employer.
+start_date | Yes | DateTime | The date the candidate began at employer. Timestamp must be in in [ISO-8601] (#general-considerations) format.*
+end_date | No | DateTime | The date the candidate finished at employer. Timestamp must be in in [ISO-8601] (#general-considerations) format.* An empty end_date indicates current employment.
+
+* - Note that start_date and end_date accept an [ISO-8601] (#general-considerations) timestamp in accordance with Harvest's standard timestamp rules, but time will be ignored in the context of employment. The "latest employment" will be updated automatically.
+
+
+## DELETE: Remove Employment From Candidate
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/candidates/{candidate_id}/employments/{employment_id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "success": true,
+ "message": "Employment ID 823384 destroyed."
+}
+```
+
+Delete an employment record by candidate and employment id.
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/candidates/{candidate_id}/employments/{employment_id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+## POST: Add Prospect
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/prospects'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "first_name": "John",
+ "last_name": "Locke",
+ "company": "The Tustin Box Company",
+ "title": "Customer Success Representative",
+ "is_private": false,
+ "phone_numbers": [
+ {
+ "value": "555-1212",
+ "type": "mobile"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "123 Fake St.",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "john.locke+work@example.com",
+ "type": "work"
+ },
+ {
+ "value": "john.locke@example.com",
+ "type": "personal"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "johnlocke.example.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "linkedin.example.com/john.locke"
+ },
+ {
+ "value": "@johnlocke"
+ }
+ ],
+ "educations": [
+ {
+ "school_id": 459,
+ "discipline_id": 940,
+ "degree_id": 1230,
+ "start_date": "2001-09-15T00:00:00.000Z",
+ "end_date": "2004-05-15T00:00:00.000Z"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2012-08-15T00:00:00.000Z",
+ "end_date": "2016-05-15T00:00:00.000Z"
+ }
+ ],
+ "tags": [
+ "Walkabout",
+ "Orientation"
+ ],
+ "application": {
+ "job_ids": [123, 456, 789],
+ "source_id": 1234,
+ "referrer": {
+ "type": "id",
+ "value": 770
+ },
+ "custom_fields": [],
+ "attachments": []
+ }
+}
+```
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 29843268,
+ "first_name": "John",
+ "last_name": "Locke",
+ "company": "The Tustin Box Company",
+ "title": "Customer Success Representative",
+ "is_private": false,
+ "created_at": "2016-12-21T19:45:01.467Z",
+ "updated_at": "2016-12-21T19:45:01.907Z",
+ "last_activity": "2016-12-21T19:45:01.867Z",
+ "photo_url": null,
+ "attachments": [],
+ "application_ids": [
+ 38776657
+ ],
+ "phone_numbers": [
+ {
+ "value": "555-1212",
+ "type": "mobile"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "123 Fake St.",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "john.locke@example.com",
+ "type": "personal"
+ },
+ {
+ "value": "john.locke+work@example.com",
+ "type": "work"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "johnlocke.example.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "@johnlocke"
+ },
+ {
+ "value": "linkedin.example.com/john.locke"
+ }
+ ],
+ "recruiter": null,
+ "coordinator": null,
+ "can_email": true,
+ "tags": [
+ "Orientation",
+ "Walkabout"
+ ],
+ "applications": [
+ {
+ "id": 38776657,
+ "candidate_id": 29843268,
+ "prospect": true,
+ "applied_at": "2016-12-21T19:45:01.757Z",
+ "rejected_at": null,
+ "last_activity_at": "2016-12-21T19:45:01.867Z",
+ "source": null,
+ "location": null,
+ "credited_to": null,
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [],
+ "job_post_id": null,
+ "status": "active",
+ "current_stage": null,
+ "answers": [],
+ "prospective_office": {
+ "primary_contact_user_id": null,
+ "parent_id": null,
+ "name": "New York",
+ "location": {
+ "name": "New York, NY"
+ },
+ "id": 59213,
+ "external_id": null,
+ "child_ids": []
+ },
+ "prospective_department": {
+ "parent_id": null,
+ "name": "Marketing",
+ "id": 9024,
+ "external_id": null,
+ "child_ids": []
+ },
+ "prospect_detail": {
+ "prospect_pool": {
+ "id": 227,
+ "name": "Opted In: In-Person Event"
+ },
+ "prospect_stage": {
+ "id": 826,
+ "name": "In Discussion"
+ },
+ "prospect_owner": {
+ "id": 92120,
+ "name": "Greenhouse Admin"
+ }
+ },
+ "custom_fields": {
+ "test": "A test value"
+ },
+ "keyed_custom_fields": {
+ "test": {
+ "name": "Test",
+ "type": "long_text",
+ "value": "A test value"
+ }
+ }
+ }
+ ],
+ "educations": [
+ {
+ "id": 561226,
+ "school_name": "Siena College",
+ "discipline": "Computer Science",
+ "degree": "Bachelor's Degree"
+ }
+ ],
+ "employments": [
+ {
+ "id": 8485064,
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2012-08-15T00:00:00.000Z",
+ "end_date": "2016-05-15T00:00:00.000Z"
+ }
+ ],
+ "custom_fields": {
+ "current_salary": "$123,000",
+ "desired_salary": "$150,000"
+ },
+ "keyed_custom_fields": {
+ "current_salary": {
+ "name": "Current salary",
+ "type": "short_text",
+ "value": "$123,000"
+ },
+ "desired_salary": {
+ "name": "Desired salary",
+ "type": "short_text",
+ "value": "$150,000"
+ }
+ }
+}
+```
+
+Create a new prospect. The difference between a prospect and a candidate is that a prospect can be on no jobs or many jobs. A prospect application cannot be added to a job stage. When a prospect is ready to be added to a job stage, they can be converted to a candidate in Greenhouse. Alternatively, you can add a candidate application to a prospect's profile by using the [Add Candidate Application] (#post-add-candidate-application) endpoint. The organization must be able to create prospects to set this field.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/prospects`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+first_name | Yes | string | The prospect's first name
+last_name | Yes | string | The prospect's last name
+company | No | string | The prospect's company
+title | No | string | The prospect's title
+phone_numbers[] | No | phone_number | Array of phone numbers. Passing an empty array will clear all.
+addresses[] | No | address | Array of addresses. Passing an empty array will clear all.
+email_addresses[] | No | email_address | Array of email addresses. Passing an empty array will clear all.
+website_addresses[] | No | website_address | Array of website addresses. Passing an empty array will clear all.
+social_media_addresses[] | No | social_media_address | Array of social media addresses. Passing an empty array will clear all.
+tags[] | No | string | Array of tags as strings. Passing an empty array will clear all.
+custom_fields[] | No | custom_field | Array of hashes containing new custom field values. Passing an empty array does nothing.
+recruiter | No | Object | An object representing the prospect's recruiter
+recruiter[id] | No | Integer | The ID of the recruiter - either id or email must be present.
+recruiter[email] | No | String | The email of the recruiter - either id or email must be present.
+coordinator | No | Object | An object representing the prospect's coordinator
+coordinator[id] | No | Integer | The ID of the coordinator - either id or email must be present.
+coordinator[email] | No | String | The email of the coordinator - either id or email must be present.
+custom_fields | No | Array | Array of custom field value objects - See "Custom Field Parameters" under [Edit candidate] (#patch-edit-candidate) for parameters.
+activity_feed_notes | No | Array | An array of activity feed objects. See [Add Note] (#post-add-note) for parameters.
+application | No | Hash | Unlike a candidate application, a prospect application can contain zero or multiple job IDs because a prospect in Greenhouse Recruiting can be attached to zero or many jobs. If your request doesn’t contain an application object, the prospect will be created with a single, jobless application. If your request includes an application object, the `source_id`, `referrer`, `custom_fields`, and `attachments` parameters must match the format of the [Add Application] (#post-add-application) endpoint.
+application[job_ids] | No | Array | This element is unique to the prospects endpoint. This contains an array of job ids to which the prospect will be assigned. Note that even if the application object is included, this may still be blank or omitted and the request will create a jobless prospect. A normal use case for this would be creating a jobless prospect but still wanting to attach their resume or identify their source.
+
+
+
+[See noteworthy response attributes.] (#the-candidate-object)
+
+## PUT: Anonymize Candidate
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/candidates/{id}/anonymize?fields={field_names}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 53883394,
+ "first_name": "Anonymized",
+ "last_name": "53883394",
+ "company": null,
+ "title": null,
+ "created_at": "2017-08-15T03:31:46.591Z",
+ "updated_at": "2017-09-28T13:36:04.725Z",
+ "last_activity": "2017-09-28T13:31:37.929Z",
+ "is_private": false,
+ "photo_url": null,
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_28_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet"
+ }
+ ],
+ "application_ids": [
+ 69201279
+ ],
+ "phone_numbers": [],
+ "addresses": [
+ {
+ "value": "123 City Street\nNew York, Ny 10001",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [],
+ "website_addresses": [
+ {
+ "value": "mysite.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [],
+ "recruiter": {
+ "id": 92120,
+ "first_name": "Greenhouse",
+ "last_name": "Admin",
+ "name": "Greenhouse Admin",
+ "employee_id": null
+ },
+ "coordinator": null,
+ "can_email": true,
+ "tags": [
+ "Python",
+ "Ruby"
+ ],
+ "applications": [
+ {
+ "id": 69201279,
+ "candidate_id": 53883394,
+ "prospect": false,
+ "applied_at": "2017-09-28T13:21:22.749Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-28T13:31:37.929Z",
+ "location": null,
+ "source": {
+ "id": 7,
+ "public_name": "Indeed"
+ },
+ "credited_to": {
+ "id": 566993,
+ "first_name": "Jane",
+ "last_name": "Smith",
+ "name": "Jane Smith",
+ "employee_id": null
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 213967,
+ "name": "Head of Product"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "active",
+ "current_stage": {
+ "id": 1567309,
+ "name": "Application Review"
+ },
+ "answers": [],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "attachments": [
+ {
+ "filename": "John_Locke_Offer_Packet_09_27_2017.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "offer_packet",
+ "created_at": "2020-09-27T18:45:27.137Z"
+ }
+ ]
+ }
+ ],
+ "educations": [
+ {
+ "id": 561227,
+ "school_name": "University of Michigan - Ann Arbor",
+ "degree": "Bachelor's Degree",
+ "discipline": "Computer Science"
+ }
+ ],
+ "employments": [
+ {
+ "id": 8485064,
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2012-08-15T00:00:00.000Z",
+ "end_date": "2016-05-15T00:00:00.000Z"
+ }
+ ],
+ "custom_fields": {
+ "desired_salary": null,
+ "work_remotely": null,
+ "graduation_year": null
+ },
+ "keyed_custom_fields": {
+ "desired_salary": null,
+ "work_remotely": null,
+ "graduation_year_1": null
+ }
+}
+```
+
+Anonymize the data associated with a candidate.
+
+### HTTP Request
+
+`PUT https://harvest.greenhouse.io/v1/candidates/{id}/anonymize?fields={field_names}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+fields | Yes | comma-delimited string | The set of field names that should be anonymized on the candidate from the following list: full_name, current_company, current_title, tags, phone_numbers, emails, social_media_links, websites, addresses, location, custom_candidate_fields, source, recruiter, coordinator, attachments, application_questions, referral_questions, notes, rejection_notes, email_addresses, activity_items, innotes, inmails, rejection_reason, scorecards_and_interviews, offers, credited_to, headline, all_offer_versions, follow_up_reminders, custom_application_fields, education, employment, candidate_stage_data, prospect_owner, custom_rejection_question_fields, touchpoints, prospect_pool_and_stage, prospect_jobs, prospect_offices, prospect_offices_and_departments, and third_party_integrations
+
+
+## PUT: Merge Candidates
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/candidates/merge'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "primary_candidate_id": 73821,
+ "duplicate_candidate_id": 839283
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 55961742,
+ "first_name": "Justin",
+ "last_name": "Locke",
+ "company": "The Tustin Box Company",
+ "title": "Customer Success Representative",
+ "created_at": "2017-09-07T22:54:06.629Z",
+ "updated_at": "2017-09-28T13:41:43.655Z",
+ "last_activity": "2017-09-28T13:41:43.631Z",
+ "is_private": false,
+ "photo_url": null,
+ "attachments": [
+ {
+ "filename": "Justin Locke resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ },
+ {
+ "filename": "Justin Locke cover leter.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "cover_letter"
+ }
+ ],
+ "application_ids": [
+ 67398864
+ ],
+ "phone_numbers": [
+ {
+ "value": "222-555-4608",
+ "type": "home"
+ }
+ ],
+ "addresses": [],
+ "email_addresses": [
+ {
+ "value": "justin.locke@example.com",
+ "type": "personal"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "example.com",
+ "type": "other"
+ }
+ ],
+ "social_media_addresses": [],
+ "recruiter": null,
+ "coordinator": null,
+ "can_email": true,
+ "tags": [
+ "Comp Sci"
+ ],
+ "applications": [
+ {
+ "id": 67398864,
+ "candidate_id": 55961742,
+ "prospect": false,
+ "applied_at": "2017-09-07T23:00:25.746Z",
+ "rejected_at": null,
+ "last_activity_at": "2017-09-28T13:41:43.631Z",
+ "location": {
+ "address": "New York, New York, USA"
+ },
+ "source": {
+ "id": 7,
+ "public_name": "Indeed"
+ },
+ "credited_to": {
+ "id": 92121,
+ "first_name": "Jane",
+ "last_name": "Smith",
+ "name": "Jane Smith",
+ "employee_id": "456"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "jobs": [
+ {
+ "id": 213967,
+ "name": "Product Manager"
+ }
+ ],
+ "job_post_id": 123,
+ "status": "active",
+ "current_stage": {
+ "id": 1567309,
+ "name": "Application Review"
+ },
+ "answers": [],
+ "prospective_office": null,
+ "prospective_department": null,
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "attachments": [
+ {
+ "filename": "Justin Locke resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ },
+ {
+ "filename": "Justin Locke cover leter.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "cover_letter"
+ }
+ ]
+ }
+ ],
+ "educations": [
+ {
+ "id": 561227,
+ "school_name": "University of Michigan - Ann Arbor",
+ "degree": "Bachelor's Degree",
+ "discipline": "Computer Science"
+ }
+ ],
+ "employments": [
+ {
+ "id": 8485064,
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "2012-08-15T00:00:00.000Z",
+ "end_date": "2016-05-15T00:00:00.000Z"
+ }
+ ],
+ "custom_fields": {
+ "desired_salary": "120K",
+ "work_remotely": true,
+ "graduation_year": "2018"
+ },
+ "keyed_custom_fields": {
+ "desired_salary": {
+ "name": "Desired Salary",
+ "type": "short_text",
+ "value": "120K"
+ },
+ "work_remotely": {
+ "name": "Work Remotely",
+ "type": "boolean",
+ "value": true
+ },
+ "graduation_year_1": {
+ "name": "Graduation Year",
+ "type": "single_select",
+ "value": "2018"
+ }
+ }
+}
+```
+
+Merge two candidates into one.
+
+### HTTP Request
+
+`PUT https://harvest.greenhouse.io/v1/candidates/merge`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+primary\_candidate\_id | Yes | integer | The id of the first candidate that will be merged. This candidate will also be the result of the merge.
+duplicate\_candidate\_id | Yes | integer | The id of the second candidate that will be merged. ***This candidate will cease to exist after the merge is complete.***
diff --git a/source/includes/harvest/_close_reasons.md b/source/includes/harvest/_close_reasons.md
new file mode 100644
index 00000000000..3aa92d68ac3
--- /dev/null
+++ b/source/includes/harvest/_close_reasons.md
@@ -0,0 +1,55 @@
+# Close Reasons
+
+When closing an opening, it is possible to designate the reason the opening is being closed. This might be "Filled" or "Cancelled" or some other reason. These reasons are configured in Greenhouse.
+
+## The close reason object
+
+```json
+{
+ "id": 230,
+ "name": "Hired"
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The close reason's unique identifier. This is the ID that would be used in POST or PATCH statements involving close reasons. |
+| name | The name of the close reason |
+
+## GET: List Close Reasons
+
+List all of an organization's close reasons.
+
+```shell
+curl -X GET 'https://harvest.greenhouse.io/v1/close_reasons'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 365,
+ "name": "Hired"
+ },
+ {
+ "id": 366,
+ "name": "Backfill"
+ },
+ {
+ "id": 367,
+ "name": "Order cancelled"
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/close_reasons`
+
+
+
+[See noteworthy response attributes.](#the-close-reason-object)
\ No newline at end of file
diff --git a/source/includes/harvest/_custom_fields.md b/source/includes/harvest/_custom_fields.md
new file mode 100644
index 00000000000..23ae7b38416
--- /dev/null
+++ b/source/includes/harvest/_custom_fields.md
@@ -0,0 +1,659 @@
+# Custom Fields
+
+An organization's custom_fields.
+
+## The custom field object
+
+```json
+{
+ "id": 123456,
+ "name": "Seniority Level",
+ "field_type": "job",
+ "priority": 1,
+ "value_type": "single_select",
+ "private": true,
+ "required": false,
+ "require_approval": true,
+ "trigger_new_version": false,
+ "name_key": "custom_field_name",
+ "description": "Seniority of this role",
+ "expose_in_job_board_api": true,
+ "api_only": false,
+ "offices": [
+ {
+ "id": 11915,
+ "name": "New York",
+ "location": {
+ "name": "New York, New York, United States"
+ },
+ "primary_contact_user_id": null,
+ "parent_id": null,
+ "parent_office_external_id": null,
+ "child_ids": [],
+ "child_office_external_ids": [],
+ "external_id": null
+ }
+ ],
+ "departments": [],
+ "template_token_string": "{{SENIORITY}}",
+ "custom_field_options": [
+ {
+ "id": 123,
+ "name": "Junior",
+ "priority": 1,
+ "external_id": "jr"
+ },
+ {
+ "id": 234,
+ "name": "Senior",
+ "priority": 2,
+ "external_id": null
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The custom field's unique identifier |
+| name | The field's name in Greenhouse |
+| active | Boolean value which is false if the custom field has been deleted, true otherwise. |
+| field_type | One of job, candidate, application, offer, opening, rejection_question, referral_question, or user_attribute. This is also included in the URL as an argument, which will return only custom fields that match the given type.
+| priority | Numeric field used for ordering in Greenhouse.
+| value_type | One of short_text, long_text, yes_no, single_select, multi_select, currency, currency_range, number, number_range, date, url, or user. For the user_attribute field type, only the following value types are supported currently: single_select, multi_select, yes_no, and user
+| private | Boolean value to say if this field is private in Greenhouse.
+| required | The object this field exists on can not be saved if this value is not set.
+| require_approval | Only applicable to job and opening custom fields, changes to this fields requires an approval flow in Greenhouse to be re-done.
+| trigger_new_version | Only applicable to offer custom fields, changes to this field creates a new offer version.
+| name_key | Listed as "immutable field key" in Greenhouse, this value is based of the name of the field when it is created and does not change as the field's name is later updated.
+| custom_field_options | For single_select and multi_select field_types, this is the list of options for that select.
+| custom_field_options.priority | Numeric value used for ordering the custom field options.
+| custom_field_options.external_id | String value, the external_id for the custom field option
+| description | The custom field's description
+| expose_in_job_board_api | Boolean. Only relevant for Job custom fields. If true, then the field will be shown in the Job Board API.
+| api_only | Boolean. Only relevant for Job custom fields. If true, this custom field can only be edited from the API.
+| offices | Only relevant for Job, Opening, and Offer custom fields. If this custom field only applies to a subset of offices, then this list contains each office. Otherwise, if the list is empty, it applies to all offices.
+| departments | Only relevant for Job, Opening, and Offer custom fields. If this custom field only applies to a subset of departments, then this list contains each department. Otherwise, if the list is empty, it applies to all departments.
+| template_token_string | Token string used in email and offer document templates
+
+## GET: List Custom Fields
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/custom_fields/{field_type}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123456,
+ "name": "Custom Field Name",
+ "active": true,
+ "field_type": "job",
+ "priority": 1,
+ "value_type": "single_select",
+ "private": true,
+ "required": false,
+ "require_approval": true,
+ "trigger_new_version": false,
+ "name_key": "custom_field_name",
+ "description": "Field description",
+ "expose_in_job_board_api": false,
+ "api_only": false,
+ "offices": [],
+ "departments": [],
+ "template_token_string": "{{FIELD1}}",
+ "custom_field_options": [
+ {
+ "id": 123,
+ "name": "Name One",
+ "priority": 1,
+ "external_id": "name-one"
+ },
+ {
+ "id": 234,
+ "name": "Name Two",
+ "priority": 2,
+ "external_id": null
+ }
+ ]
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/custom_fields/{field_type}`
+
+### URL parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *field_type | Returns only custom fields of this type. For example, if “offer” is included in the URL as the field_type, the endpoint will only return custom fields with the “offer” field type. One of: `offer`, `candidate`, `application`, `job`, `rejection_question`, `referral_question`, `user_attribute`.
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| include_inactive | When `true`, include inactive custom fields. Otherwise excludes inactive custom fields. Defaults to `false`.
+
+
+[See noteworthy response attributes.](#the-custom-field-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: Retrieve Custom Field
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/custom_field/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 123456,
+ "name": "Custom Field Name",
+ "active": true,
+ "field_type": "job",
+ "priority": 1,
+ "value_type": "single_select",
+ "private": true,
+ "required": false,
+ "require_approval": true,
+ "trigger_new_version": false,
+ "name_key": "custom_field_name",
+ "description": "Field description",
+ "expose_in_job_board_api": false,
+ "api_only": false,
+ "offices": [],
+ "departments": [],
+ "template_token_string": "{{FIELD1}}",
+ "custom_field_options": [
+ {
+ "id": 123,
+ "name": "Name One",
+ "priority": 1,
+ "external_id": "name-one"
+ },
+ {
+ "id": 234,
+ "name": "Name Two",
+ "priority": 2,
+ "external_id": null
+ }
+ ]
+}
+```
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/custom_field/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the custom field to retrieve
+
+
+[See noteworthy response attributes.](#the-custom-field-object)
+
+## The custom field options object
+
+Refers to the options available for single-select and multi-select custom fields.
+
+```json
+{
+ "id": 123456,
+ "name": "Option A",
+ "priority": 0,
+ "external_id": "option-a"
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| priority | Numeric field used for ordering in Greenhouse.
+| external_id | String field, the external_id for the custom field option.
+
+
+## POST: Create Custom Field
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/custom_fields/'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "name": "Custom Field Name",
+ "field_type": "application",
+ "value_type": "single_select",
+ "private": false,
+ "generate_email_token": true,
+ "required": false,
+ "require_approval": false,
+ "expose_in_job_board_api": true,
+ "api_only": false,
+ "trigger_new_version": false,
+ "office_ids": [123, 456],
+ "department_ids": [567, 890],
+ "custom_field_options": [
+ {
+ "name": "Name One",
+ "priority": 1,
+ "external_id": "name-one"
+ },
+ {
+ "name": "Name Two",
+ "priority": 2,
+ "external_id": null
+ }
+ ]
+}
+```
+
+> If successful, the above command returns a 201 response code along with a JSON representation of the newly created custom field. The JSON structure looks like this:
+
+```json
+[
+ {
+ "id": 123456,
+ "name": "Custom Field Name",
+ "active": true,
+ "field_type": "job",
+ "priority": 1,
+ "value_type": "single_select",
+ "private": true,
+ "required": false,
+ "require_approval": true,
+ "trigger_new_version": false,
+ "name_key": "custom_field_name",
+ "description": "Field description",
+ "expose_in_job_board_api": false,
+ "api_only": false,
+ "offices": [],
+ "departments": [],
+ "template_token_string": "{{FIELD1}}",
+ "custom_field_options": [
+ {
+ "id": 123,
+ "name": "Name One",
+ "priority": 1,
+ "external_id": "name-one"
+ },
+ {
+ "id": 234,
+ "name": "Name Two",
+ "priority": 2,
+ "external_id": null
+ }
+ ]
+ }
+]
+```
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/custom_fields`
+
+### JSON Body Parameters
+
+| Attribute | Type | Required | Description |
+|-----------|-------------|-------------|-------------|
+| name | string | yes | The field's name in Greenhouse |
+| description | string | no | The field's description in Greenhouse |
+| field_type | string | yes | One of job, candidate, application, offer, opening, rejection_question, referral_question, user_attribute.
+| value_type | string | yes | One of short_text, long_text, yes_no, single_select, multi_select, currency, currency_range, number, number_range, date, url, or user. For the user_attribute field type, only the following value types are supported currently: single_select, multi_select, yes_no, and user
+| private | boolean | no | Boolean value to say if this field is private in Greenhouse. Defaults to false if not provided for non-offer custom fields. For offer custom fields, private is always true.
+| required | boolean | no | Boolean value to determine if this field must be filled out in order to save the custom field. Only used for job, offer, and opening type custom fields. Defaults to false.
+| require_approval | boolean | no | Boolean value to determine if changes to this custom field triggers re-approvals. Only used for job and opening custom fields. Defaults to false.
+| trigger_new_version | boolean | no | Boolean value to determine if changes to this field triggers the automatic creation of a new offer version. Only used in offer custom fields. Defaults to false.
+| expose_in_job_board_api | boolean | no | Boolean value to determine if this custom field and its value will be provied in the Job Board API response for this job. These fields are included in the metadata section of the Job Board API response. Only used in job custom fields. Defaults to false.
+| api_only | boolean | no | Boolean value to determine if updates to this custom field may only be made via Harvest. Only used in job custom fields. Defaults to false. If this feature is not available for your organization, attempting to create a field with this set to true will return an API Error.
+office_ids | Array of integers | no | If included, this custom field is only displayed on objects associated with these offices. This is only used for job, opening, and offer custom fields. If not included, custom field will be shown for all offices.
+department_ids | Array of integers | no | If included, this custom field is only displayed on objects associated with these departments. This is only used for job, opening, and offer custom fields. If not included, custom field will be shown for all departments.
+| custom_field_options | array of Custom Field Options | yes for some field_type | For single_select and multi_select field_types, this is the list of options for that select.
+| custom_field_options.name | string | yes | The name of the new custom field option.
+| custom_field_options.priority | integer | yes | Numeric value used for ordering the custom field options.
+| custom_field_options.external_id | string | no | The external_id for the custom field. Used for integrating with external HRIS.
+| generate_email_token | boolean | no | If this is sent as true, a default `template_token_string` will be generated for the new Custom Field.
+
+
+## PATCH: Update Custom Field
+
+This endpoint updates an existing custom field.
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/custom_fields/{id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkeODyN2VhZmEMWRjMzc1YZjMqmUwNjsdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "name": "New Name",
+ "description": "New description",
+ "private": false,
+ "template_token_string": "token123"
+}
+```
+
+> If the update is successful, the above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123456,
+ "name": "New Name",
+ "active": true,
+ "field_type": "job",
+ "priority": 1,
+ "value_type": "single_select",
+ "private": false,
+ "required": false,
+ "require_approval": true,
+ "trigger_new_version": false,
+ "name_key": "custom_field_name",
+ "description": "New description",
+ "expose_in_job_board_api": false,
+ "api_only": false,
+ "offices": [],
+ "departments": [],
+ "template_token_string": "{{token123}}",
+ "custom_field_options": [
+ {
+ "id": 123,
+ "name": "Name One",
+ "priority": 1,
+ "external_id": "name-one"
+ },
+ {
+ "id": 234,
+ "name": "Name Two",
+ "priority": 2,
+ "external_id": null
+ }
+ ]
+ }
+]
+```
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/custom_fields/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the custom field to update
+
+### JSON Body Parameters
+
+This endpoint accepts the same JSON body parameters as the [Create Custom Field endpoint](#post-create-custom-field). There is one exception - instead of the `generate_email_token` field which is used during creation, the `template_token_string` field can be used to set or change the template token on an existing custom field.
+
+| Attribute | Type | Required | Description |
+|-----------|-------------|-------------|-------------|
+| template_token_string | string | no | Sets the template token which is used in email and offer document templates.
+
+## DELETE: Delete Custom Field
+
+This endpoint deletes a custom field. Note that custom fields are soft-deleted in order to maintain historical data. Soft-deleted custom fields will be hidden to users but will continue to be returned in the API with their `active` flag set to `false`.
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/custom_fields/{id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkeODyN2VhZmEMWRjMzc1YZjMqmUwNjsdlMjQ6"
+```
+
+> If the deletion is successful, the above command returns JSON structured like this:
+
+```json
+{
+ "success": "Custom Field ID 12345 has been deleted."
+}
+```
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/custom_fields/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the custom field to delete
+
+## GET: List Custom Field Options
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options'
+-H "On-Behalf-Of: {greenhouse user ID}" -H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123456,
+ "name": "Option A",
+ "priority": 0,
+ "external_id": "option-a"
+ },
+ {
+ "id": 123457,
+ "name": "Option B",
+ "priority": 1,
+ "external_id": "option-b"
+ },
+ {
+ "id": 123458,
+ "name": "Option C",
+ "priority": 2,
+ "external_id": null
+ }
+]
+```
+Given a single select or multi select custom field, return all its options.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| type | One of all, active, or inactive. Inactive returns only custom field options that have been deleted. Active is the default and returns all custom field options currently active. All returns both active and inactive. If this isn't included, active fields will be returned.
+
+
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+
+## POST: Create Custom Field Options
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "options": [
+ {"name": "Option A", "priority": 5, "external_id": "3z84k11"},
+ {"name": "Option B", "priority": 6, "external_id": "bmlpk1"},
+ {"name": "Option C", "priority": 7, "external_id": "32290"}
+ ]
+}
+```
+
+> The above returns a success message on success with a 201 response.
+
+```
+{
+ "success": true
+}
+```
+
+Add additional options to a single select or multi select custom field.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+| options | Yes | array | An array of one or many new custom field options.
+| name | Yes | string | The name of the new custom field option. If a new field is added with the same name as an existing custom field option in this custom field, it will be ignored. No error will be raised in this case.
+| priority | Yes | integer | This is used to order the custom fields in Greenhouse.
+| external_id | No | string | The external_id for the custom field. Used for integrating with external HRIS.
+
+
+**This returns a 201 on success. It does not return the objects created.
+
+
+## PATCH: Update Custom Field Options
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "options": [
+ {
+ "id": 123,
+ "name": "Option A",
+ "priority": 5,
+ "external_id": "3z84k11"
+ },
+ {
+ "id": 234,
+ "name": "Option B",
+ "priority": 6,
+ "external_id": null
+ },
+ {
+ "id": 345,
+ "name": "Option C",
+ "priority": 7,
+ "external_id": "32290"
+ }
+ ]
+}
+```
+
+> The above request returns a JSON success message.
+
+```
+{
+ "success": true
+}
+```
+
+Update the names or priorities of existing options in a single select or multi select custom field.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+| options | Yes | array | An array of one or many new custom field options.
+| id | Yes | integer | The ID of the custom field option that will be updated.
+| name | No | string | If included, the custom field option with this ID will be updated to this name. This can not duplicate the name of any other option in this field or any option in this request.
+| priority | No | integer | If included, The custom field option with this ID will be updated with this value.
+| external_id | No | string | If included, the custom field option will update its external_id with this value. Passing `null` will clear the external_id.
+
+
+## DELETE: Remove Custom Field Options
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options'
+ -H "On-Behalf-Of: {greenhouse user ID}"
+ -H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "option_ids": [
+ 85709, 85710
+ ]
+}
+```
+
+> The above request is idempotent. It will return a message with a 200 response and a message stating how many of the IDs were deleted and how many were not found.
+
+```
+{
+ "message": "3 option(s) deleted. 1 option(s) not found."
+}
+```
+
+Destroy custom field options
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/custom_field/{id}/custom_field_options`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+option_ids | Yes | array | An array of the custom field option ids to be removed.
+
+
+
+\* Note this does not return a list of option_ids that were not found. It only returns a number of options that were not processed. If you were to run the same exact command twice in a row, the only difference would be that on the second run, the message would inform you that an ID was not found.
diff --git a/source/includes/harvest/_demographic_data.md b/source/includes/harvest/_demographic_data.md
new file mode 100644
index 00000000000..15262fe3c34
--- /dev/null
+++ b/source/includes/harvest/_demographic_data.md
@@ -0,0 +1,663 @@
+# Demographic Data
+
+Demographic questions and answers submitted during the application process. For more information on Greenhouse Inclusion, please visit [https://www.greenhouse.io/inclusion](https://www.greenhouse.io/inclusion).
+
+
+## The Demographic Question Set object
+
+```json
+{
+ "id": 1991,
+ "title": "Question Set",
+ "description": "
Questions for candidates
",
+ "active": true
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The demographic question set's unique identifier |
+| title | The title of the demographic question set
+| description | The demographic question set's description. This is a rich text field which may contain HTML.
+| active | If `false`, the demographic question set has been deleted.
+
+## The Demographic Question object
+
+```json
+{
+ "id": 123,
+ "active": true,
+ "demographic_question_set_id": 456,
+ "name": "What is your favorite color?",
+ "translations": [
+ {
+ "language": "en",
+ "name": "What is your favorite color?"
+ }
+ ],
+ "required": true,
+ "answer_type": "multi_value_multi_select"
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The demographic question's unique identifier |
+| demographic_question_set_id | The demographic question set that this belongs to
+| name | The question text
+| translations.language | Translations have been deprecated but are kept for backwards compatibility. Only `en` (English) is supported at this time.
+| translations.name | Translations have been deprecated but are kept for backwards compatibility. This value will be the same as `name` above.
+| active | If `false`, the question has been deleted.
+| required | If `true`, the question must be filled out by the applicant.
+| answer_type | The type of answer that can be provided for the question. Value will be either `multi_value_single_select` or `multi_value_multi_select`.
+
+## The Demographic Answer Option object
+
+```json
+{
+ "id": 456,
+ "free_form": false,
+ "active": true,
+ "name": "Blue",
+ "demographic_question_id": 123,
+ "translations": [
+ {
+ "language": "en",
+ "name": "Blue"
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The demographic answer option's unique identifier |
+| name | The answer option text
+| translations.language | Translations have been deprecated but are kept for backwards compatibility. Only `en` (English) is supported at this time.
+| translations.name | Translations have been deprecated but are kept for backwards compatibility. This value will be the same as `name` above.
+| active | If `false`, the answer option has been deleted.
+| free_form | If `true`, the answer option allows free-form user input.
+| demographic_question_id | The demographic question for which the answer option belongs to.
+
+## The Demographic Answer object
+
+```json
+{
+ "id": 51,
+ "free_form_text": "12am",
+ "application_id": 107594341,
+ "demographic_question_id": 25,
+ "demographic_answer_option_id": 106,
+ "created_at": "2019-04-29T18:46:03.707Z",
+ "updated_at": "2019-04-29T18:46:03.707Z"
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The demographic answer's unique identifier |
+| free_form_text | If the selected answer option is free-form, this is the value given by the user. Otherwise `null`.
+| application_id | The application for which the demographic question was answered
+| demographic_question_id | The demographic question which was answered.
+| demographic_answer_option_id | The demographic answer option which was selected.
+
+## GET: List Demographic Question Sets
+
+List all of an organization's demographic question sets.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/question_sets'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 1991,
+ "title": "Question Set A",
+ "description": "
",
+ "active": true
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/question_sets`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+
+
+[See noteworthy response attributes.](#the-demographic-question-set-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: Retrieve Demographic Question Set
+
+Retrieve a demographic question set by its `id`.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/question_sets/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 1991,
+ "title": "Question Set",
+ "description": "
Questions for candidates
",
+ "active": true
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/question_sets/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the demographic question set you want to retrieve.
+
+
+[See noteworthy response attributes.](#the-demographic-question-set-object)
+
+
+## GET: List Demographic Questions
+
+List all of an organization's demographic questions.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/questions'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "active": true,
+ "demographic_question_set_id": 456,
+
+ "name": "What is your favorite color?",
+ "translations": [
+ {
+ "language": "en",
+ "name": "What is your favorite color?"
+ }
+ ],
+ "required": true
+ },
+ {
+ "id": 897,
+ "active": true,
+ "demographic_question_set_id": 555,
+ "name": "Pizza or pasta?",
+ "translations": [
+ {
+ "language": "en",
+ "name": "Pizza or pasta?"
+ }
+ ],
+ "required": false
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/questions`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+
+
+[See noteworthy response attributes.](#the-demographic-question-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: List Demographic Questions For Demographic Question Set
+
+List all of the demographic questions for a demographic question set.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/question_sets/{id}/questions'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "active": true,
+ "demographic_question_set_id": 456,
+ "name": "What is your favorite color?",
+ "translations": [
+ {
+ "language": "en",
+ "name": "What is your favorite color?"
+ }
+ ],
+ "required": true
+ },
+ {
+ "id": 897,
+ "active": true,
+ "demographic_question_set_id": 555,
+ "name": "Pizza or pasta?",
+ "translations": [
+ {
+ "language": "en",
+ "name": "Pizza or pasta?"
+ }
+ ],
+ "required": false
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/question_sets/{id}/questions`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the demographic question set for which you want to retrieve demographic questions
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+
+
+[See noteworthy response attributes.](#the-demographic-question-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: Retrieve Demographic Question
+
+Retrieve a demographic question by its `id`.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/questions/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 123,
+ "active": true,
+ "demographic_question_set_id": 456,
+ "name": "What is your favorite color?",
+ "translations": [
+ {
+ "language": "en",
+ "name": "What is your favorite color?"
+ }
+ ],
+ "required": true
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/questions/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the demographic question you want to retrieve.
+
+
+[See noteworthy response attributes.](#the-demographic-question-object)
+
+
+## GET: List Demographic Answer Options
+
+List all of an organization's demographic answer options.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/answer_options'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 456,
+ "free_form": false,
+ "active": true,
+ "name": "Blue",
+ "demographic_question_id": 123,
+ "translations": [
+ {
+ "language": "en",
+ "name": "Blue"
+ }
+ ]
+ },
+ {
+ "id": 789,
+ "free_form": true,
+ "active": true,
+ "name": "Other",
+ "demographic_question_id": 123,
+ "translations": [
+ {
+ "language": "en",
+ "name": "Other"
+ }
+ ]
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/answer_options`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+
+
+[See noteworthy response attributes.](#the-demographic-answer-option-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: List Demographic Answer Options For Demographic Question
+
+List all of the demographic answer options for a demographic question.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/questions/{id}/answer_options'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 456,
+ "free_form": false,
+ "active": true,
+ "name": "Blue",
+ "demographic_question_id": 123,
+ "translations": [
+ {
+ "language": "en",
+ "name": "Blue"
+ }
+ ]
+ },
+ {
+ "id": 789,
+ "free_form": true,
+ "active": true,
+ "name": "Other",
+ "demographic_question_id": 123,
+ "translations": [
+ {
+ "language": "en",
+ "name": "Other"
+ }
+ ]
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/questions/{id}/answer_options`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the demographic question for which you want to retrieve demographic answer options.
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+
+
+[See noteworthy response attributes.](#the-demographic-answer-option-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: Retrieve Demographic Answer Option
+
+Retrieve a demographic answer option by its `id`.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/answer_options/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 456,
+ "free_form": false,
+ "active": true,
+ "name": "Blue",
+ "demographic_question_id": 123,
+ "translations": [
+ {
+ "language": "en",
+ "name": "Blue"
+ }
+ ]
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/answer_options/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the demographic answer option you want to retrieve.
+
+
+[See noteworthy response attributes.](#the-demographic-answer-option-object)
+
+## GET: List Demographic Answers
+
+List all of an organization's demographic answers.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/answers'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "free_form_text": "12am",
+ "application_id": 787,
+ "demographic_question_id": 25,
+ "demographic_answer_option_id": 106,
+ "created_at": "2019-04-29T18:46:03.707Z",
+ "updated_at": "2019-04-29T18:46:03.707Z"
+ },
+ {
+ "id": 456,
+ "free_form_text": null,
+ "application_id": 783,
+ "demographic_question_id": 29,
+ "demographic_answer_option_id": 109,
+ "created_at": "2017-01-29T15:09:46.806Z",
+ "updated_at": "2017-01-29T15:09:46.806Z"
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/answers`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *created_before | Return only answers created before this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+| *created_after | Return only answers created at or after this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+| *updated_before | Return only answers updated before this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+| *updated_after | Return only answers updated at or after this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+
+
+[See noteworthy response attributes.](#the-demographic-answer-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: List Demographic Answers For Application
+
+List all of the demographic answers for an application.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/applications/{id}/demographics/answers'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "free_form_text": "12am",
+ "application_id": 787,
+ "demographic_question_id": 25,
+ "demographic_answer_option_id": 106,
+ "created_at": "2019-04-29T18:46:03.707Z",
+ "updated_at": "2019-04-29T18:46:03.707Z"
+ },
+ {
+ "id": 456,
+ "free_form_text": null,
+ "application_id": 787,
+ "demographic_question_id": 29,
+ "demographic_answer_option_id": 109,
+ "created_at": "2017-01-29T15:09:46.806Z",
+ "updated_at": "2017-01-29T15:09:46.806Z"
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications/{id}/demographics/answers`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the application for which you want to retrieve demographic answers.
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *created_before | Return only answers created before this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+| *created_after | Return only answers created at or after this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+| *updated_before | Return only answers updated before this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+| *updated_after | Return only answers updated at or after this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+
+
+[See noteworthy response attributes.](#the-demographic-answer-object)
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: Retrieve Demographic Answer
+
+Retrieve a demographic answer by its `id`.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/demographics/answers/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 123,
+ "free_form_text": "12am",
+ "application_id": 787,
+ "demographic_question_id": 25,
+ "demographic_answer_option_id": 106,
+ "created_at": "2019-04-29T18:46:03.707Z"
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/demographics/answers/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the demographic answer you want to retrieve.
+
+
+[See noteworthy response attributes.](#the-demographic-answer-object)
diff --git a/source/includes/harvest/_departments.md b/source/includes/harvest/_departments.md
new file mode 100644
index 00000000000..5b62f64548c
--- /dev/null
+++ b/source/includes/harvest/_departments.md
@@ -0,0 +1,385 @@
+# Departments
+
+## The department object
+
+An organization's departments.
+
+> With `render_as=list` (default)
+
+```json
+{
+ "id": 12345,
+ "name": "Technology",
+ "parent_id": 12345,
+ "parent_department_external_id": "parent-1",
+ "child_ids": [
+ 34065,
+ 25908
+ ],
+ "child_department_external_ids": [
+ "child-1",
+ "child-2"
+ ],
+ "external_id": "89076"
+}
+```
+
+> With `render_as=tree`
+
+```json
+{
+ "id": 12345,
+ "name": "Technology",
+ "children": [
+ {
+ "id": 34065,
+ "name": "Design",
+ "children": [],
+ "external_id": "32526"
+ },
+ {
+ "id": 25908,
+ "name": "Engineering",
+ "children": [
+ {
+ "id": 14510,
+ "name": "Third-Level Department",
+ "children": [
+ {
+ "id": 14502,
+ "name": "Strategy",
+ "children": [],
+ "external_id": null
+ }
+ ],
+ "external_id": "56735"
+ }
+ ],
+ "external_id": "47658"
+ }
+ ],
+ "external_id": "26758"
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The department's unique identifier |
+| name | The department's name
+| external_id | An arbitrary ID provided by an external source; does not map to another entity in Greenhouse.
+| parent_department_external_id | The external_id of this department's parent.
+| parent_department_child_ids | the external_ids of this department's children. Note the order of this array may not match the order of the child_ids array. If there are five children and none of them have parent ids, this array will contain five null indices.
+
+## GET: List Departments
+
+List all of an organization's departments.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/departments'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this, with `render_as=list` (default)
+
+```json
+[
+ {
+ "id": 12345,
+ "name": "Technology",
+ "parent_id": null,
+ "parent_department_external_id": "",
+ "child_ids": [
+ 34065,
+ 25908
+ ],
+ "child_department_external_ids": [
+ "child-1",
+ "child-2"
+ ],
+ "external_id": "89076"
+ },
+ {
+ "id": 67890,
+ "name": "Administration",
+ "parent_id": 54647,
+ "parent_department_external_id": "parent-1",
+ "child_ids": [],
+ "child_department_external_ids": [],
+ "external_id": null
+ }
+]
+```
+
+> With `render_as=tree`
+
+```json
+[
+ {
+ "id": 12345,
+ "name": "Technology",
+ "children": [
+ {
+ "id": 34065,
+ "name": "Design",
+ "children": [],
+ "external_id": "32526"
+ },
+ {
+ "id": 25908,
+ "name": "Engineering",
+ "children": [
+ {
+ "id": 14510,
+ "name": "Third-Level Department",
+ "children": [],
+ "external_id": "56735"
+ }
+ ],
+ "external_id": "47658"
+ }
+ ],
+ "external_id": "26758"
+ }
+ {
+ "id": 67890,
+ "name": "Administration",
+ "parent_id": 54647,
+ "child_ids": [],
+ "external_id": null
+ }
+]
+```
+
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/departments`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving departments will improve. This will remove `last` from the `link` response header.
+| render_as | This parameter defines how to represent the list of departments. The default value is 'list', which returns a flat list of departments. If this is set to 'tree', departments are represented in a tree-like structure where they may include sub-departments as `children`.
+| external_id | If supplied, only return department(s) with that external ID.
+
+
+[See noteworthy response attributes.](#the-department-object)
+
+## GET: Retrieve Department
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/departments/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+> With `render_as=list` (default)
+
+```json
+{
+ "id": 12345,
+ "name": "Technology",
+ "parent_id": null,
+ "parent_department_external_ids": "",
+ "child_ids": [
+ 34065,
+ 25908
+ ],
+ "child_department_external_ids": [
+ "child-1",
+ "child-2"
+ ],
+ "external_id": "89076"
+}
+```
+
+> With `render_as=tree`
+
+```json
+{
+ "id": 12345,
+ "name": "Technology",
+ "children": [
+ {
+ "id": 34065,
+ "name": "Design",
+ "children": [],
+ "external_id": "32526"
+ },
+ {
+ "id": 25908,
+ "name": "Engineering",
+ "children": [
+ {
+ "id": 14510,
+ "name": "Third-Level Department",
+ "children": [],
+ "external_id": "56735"
+ }
+ ],
+ "external_id": "47658"
+ }
+ ],
+ "external_id": "26758"
+}
+{
+ "id": 67890,
+ "name": "Administration",
+ "parent_id": 54647,
+ "child_ids": [],
+ "external_id": null
+}
+```
+
+Retrieve a department by its `id`.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/departments/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the department to retrieve
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| render_as | This parameter defines how to represent the list of departments. The default value is 'list', which returns a flat list of departments. If this is set to 'tree', departments are represented in a tree-like structure where they may include sub-departments as `children`.
+
+
+[See noteworthy response attributes.](#the-department-object)
+
+## PATCH: Edit Department
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/departments/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```
+{
+ "name": "Engineering",
+ "external_id": "EXTERNAL_ID_1234"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 45644,
+ "name": "Engineering",
+ "parent_id": null,
+ "parent_department_external_id": "",
+ "child_ids": [
+ 34065,
+ 25908
+ ],
+ "child_department_external_ids": [
+ "child-1",
+ "child-2"
+ ],
+ "external_id": "EXTERNAL_ID_1234"
+}
+```
+
+Edit a department's basic information.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/departments/{id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+name | Yes | string | The department's name. If included, this cannot be blank.
+external_id* | No | string | The department's external ID. If included, this must be unique to this department within the organization.
+
+\* - If the external id feature is not enabled for your organization, attempting to edit this field will raise an API Error.
+
+
+## POST: Add Department
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/departments
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```
+{
+ "name": "A New Department",
+ "parent_id": 12345,
+ "external_id": "456454"
+}
+
+or
+
+{
+ "name": "A New Department",
+ "external_parent_id": "parent-1",
+ "external_id": "456454"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 34535,
+ "name": "A New Department",
+ "parent_id": 12345,
+ "parent_department_external_ids": "parent-1",
+ "child_ids": [],
+ "child_department_external_ids": [],
+ "external_id": "456454"
+}
+```
+
+Create a new department
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/departments`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes. Must be a user who can create departments.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- | -----------
+name | yes | string | The name of your new department. Must be less than 255 characters and unique within your organization.
+parent_id* | no | number | The department id for the new department to be nested under. If this isn't included, the department will be created at the top level.
+external_parent_id** | no | string | The external id of the parent departments. This may be used instead of parent_id. Only one of this or parent_id may be populated. If both are included, it will raise an error.
+external_id** | no | string | The external_id for the office.
+
+\* - The tiered department feature is available only for customers with the Advanced or Expert Greenhouse Recruiting package. Use of this field will return an error for other Greenhouse Recruiting customers.
+
+\** - The external_id feature is available only for customers with the Expert Greenhouse Recruiting package. Use of this field will return an error for other Greenhouse Recruiting customers.
diff --git a/source/includes/harvest/_education.md b/source/includes/harvest/_education.md
new file mode 100644
index 00000000000..03163fd6c0c
--- /dev/null
+++ b/source/includes/harvest/_education.md
@@ -0,0 +1,113 @@
+#Education
+
+These endpoints are used to manage the list of education fields in Greenhouse.
+
+## The education objects
+
+Each of the education objects contain an `id`, `name`, and `priority`. When ordering occurs, the items are organized by their priority number.
+```
+{
+ "id": 1234,
+ "name": "Siena College",
+ "priority": 1
+}
+```
+
+## GET: List Degrees
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/degrees'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "name": "Bachelor's Degree",
+ "priority": 0
+ },
+ {
+ "id": 234,
+ "name": "Master's Degree",
+ "priority": 1
+ }
+]
+```
+
+List all this organization's degree levels.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/degrees`
+
+This endpoint retrieves all the degree and/or education levels for this organization, sorted by priority.
+
+[See education object.](#the-education-objects)
+
+## GET: List Disciplines
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/disciplines'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "name": "Accounting",
+ "priority": 0
+ },
+ {
+ "id": 234,
+ "name": "Biology",
+ "priority": 1
+ }
+]
+```
+
+List all this organization's disciplines.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/disciplines`
+
+This endpoint retrieves all the disciplines for this organization, sorted by priority.
+
+[See education object.](#the-education-objects)
+
+## GET: List Schools
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/schools'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "name": "Siena College",
+ "priority": 0
+ },
+ {
+ "id": 234,
+ "name": "Union College",
+ "priority": 1
+ }
+]
+```
+
+List all this organization's schools.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/schools`
+
+This endpoint retrieves all the schools for this organization, sorted by priority.
+
+[See education object.](#the-education-objects)
diff --git a/source/includes/harvest/_eeoc.md b/source/includes/harvest/_eeoc.md
new file mode 100644
index 00000000000..2f061ba7a09
--- /dev/null
+++ b/source/includes/harvest/_eeoc.md
@@ -0,0 +1,188 @@
+# EEOC
+
+## The EEOC object
+
+Every application may have zero or one EEOC object.
+
+```json
+{
+ "application_id": 286,
+ "candidate_id": 406,
+ "race": {
+ "id": 7,
+ "description": "Two or More Races"
+ },
+ "gender": {
+ "id": 1,
+ "description": "Male"
+ },
+ "veteran_status": {
+ "id": 3,
+ "message": "I don't wish to answer"
+ },
+ "disability_status": {
+ "id": 1,
+ "description": "Yes, I have a disability, or have a history/record of having a disability"
+ },
+ "submitted_at": "2017-01-29T15:09:46.806Z"
+}
+```
+
+### Noteworthy attributes
+| Attribute | Description |
+|-----------|-------------|
+| application_id | Application ID |
+| candidate_id | The ID of the [candidate](#candidates) who is applying for the job associated with this application.
+|race|See the EEOC Reference below
+|gender|See the EEOC Reference below
+|veteran_status|See the EEOC Reference below
+|disability_status|See the EEOC Reference below
+|submitted_at| The timestamp in [ISO-8601] (#general-considerations) at which the EEOC data was submitted.
+
+
+
+### EEOC Reference
+
+### Race
+
+| description |
+|------|
+|American Indian or Alaskan Native
+|Asian
+|Black or African American
+|Hispanic or Latino
+|White
+|Native Hawaiian or Other Pacific Islander
+|Two or More Races
+|Decline To Self Identify
+
+### Gender
+| description |
+|-----------|
+|Male
+|Female
+|Decline To Self Identify
+
+### Veteran Status
+| description |
+|-----------|
+|I am not a protected veteran
+|I identify as one or more of the classifications of a protected veteran
+|I don't wish to answer
+
+### Disability Status
+| description |
+|-----------|
+|Yes, I have a disability, or have a history/record of having a disability
+|No, I don’t have a disability, or a history/record of having a disability
+|I don't wish to answer
+
+## GET: List EEOC
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/eeoc'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "application_id": 286,
+ "candidate_id": 406,
+ "race": {
+ "id": 7,
+ "description": "Two or More Races"
+ },
+ "gender": {
+ "id": 1,
+ "description": "Male"
+ },
+ "veteran_status": {
+ "id": 3,
+ "message": "I don't wish to answer"
+ },
+ "disability_status": {
+ "id": 1,
+ "description": "Yes, I have a disability, or have a history/record of having a disability"
+ },
+ "submitted_at": "2017-01-29T15:09:46.806Z"
+ },
+ {
+ "application_id": 287,
+ "candidate_id": 342,
+ "race": {
+ "id": 7,
+ "description": "Two or More Races"
+ },
+ "gender": {
+ "id": 2,
+ "description": "Female"
+ },
+ "veteran_status": null,
+ "disability_status": {
+ "id": 1,
+ "description": "Yes, I have a disability, or have a history/record of having a disability"
+ },
+ "submitted_at": "2017-01-30T17:10:32.432Z"
+ }
+]
+```
+
+List all of an organization's EEOC data.
+
+### HTTP Request
+`GET https://harvest.greenhouse.io/v1/eeoc`
+
+### Query string parameters
+Parameter | Description
+--------- | -----------
+*per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+*submitted_before | Return only EEOC data submitted before this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+*submitted_after | Return only EEOC data submitted at or after this timestamp. Timestamp must be in [ISO-8601] (#general-considerations) format.
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## GET: Retrieve EEOC Data for Application
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/applications/{id}/eeoc'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command returns JSON structured like this:
+
+```json
+{
+ "application_id": 286,
+ "candidate_id": 406,
+ "race": {
+ "id": 7,
+ "description": "Two or More Races"
+ },
+ "gender": {
+ "id": 1,
+ "description": "Male"
+ },
+ "veteran_status": {
+ "id": 3,
+ "message": "I don't wish to answer"
+ },
+ "disability_status": {
+ "id": 1,
+ "description": "Yes, I have a disability, or have a history/record of having a disability"
+ },
+ "submitted_at": "2017-01-29T15:09:46.806Z"
+}
+```
+
+Retrieve an application's EEOC data by an application ID.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications/{id}/eeoc`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the application whose EEOC data you want to retrieve.
diff --git a/source/includes/harvest/_email_templates.md b/source/includes/harvest/_email_templates.md
new file mode 100644
index 00000000000..db0069ca5e9
--- /dev/null
+++ b/source/includes/harvest/_email_templates.md
@@ -0,0 +1,151 @@
+# Email Templates
+
+An organization's email templates.
+
+## The email template object
+
+```json
+{
+ "id": 48765,
+ "name": "Default Scorecard Reminder",
+ "description": "To be sent to an interviewer when their scorecard is due.",
+ "default": true,
+ "updated_at": "2018-06-01T17:04:13.598Z",
+ "created_at": "2015-11-18T22:26:32.154Z",
+ "type": "scorecard_reminder",
+ "from": null,
+ "cc": [
+ "example.user@example.com"
+ ],
+ "body": null,
+ "html_body": "
Hello,
\r\n
Please help us keep our hiring on track!
\r\n
Send in your feedback now for the interview you conducted earlier today with {{CANDIDATE_NAME}}.
\r\n
It's easy - just visit the following link to fill out your scorecard online: {{SCORECARD_LINK}}
\r\n
Thanks, {{ORGANIZER_NAME}}
",
+ "user": null
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The email template's unique identifier |
+| type | One of: `new_candidate`, `weekly_status`, `daily_recruiting`, `stage_transition`, `new_scorecard`, `new_referral`, `agency_candidate_status`, `agency_candidate_stage`, `take_home_test_email`, `candidate_auto_reply`, `candidate_rejection`, `scorecard_reminder`, `interviewer_invite`, `candidate_email`, `team_email`, `none`, `extending_offer`, `new_agency_submission`, `non_admin_welcome`, `job_admin_welcome`, `site_admin_welcome`, `prospect_referral_receipt`, `candidate_referral_receipt`, `candidate_availability_request`, `candidate_availability_confirmation`
+| from | The user who is set to send the email. If the from address can change based on which user took an action in Greenhouse (e.g. scorecard reminders sent from the person who scheduled the interview), this field will be `null`.
+| body | The plain text body of the e-mail (may be `null`).
+| user | The user this template belongs to. If null, this is an 'organization wide' template available to everyone.
+| html_body | The body of the e-mail with html styling code (may be `null`).
+
+## GET: List Email Templates
+
+List all of an organization's email templates.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/email_templates/'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 48765,
+ "name": "Default Scorecard Reminder",
+ "description": "To be sent to an interviewer when their scorecard is due.",
+ "default": true,
+ "updated_at": "2018-06-01T17:04:13.598Z",
+ "created_at": "2015-11-18T22:26:32.154Z",
+ "type": "scorecard_reminder",
+ "from": null,
+ "cc": [
+ "example.user@example.com"
+ ],
+ "body": null,
+ "html_body": "
Hello,
\r\n
Please help us keep our hiring on track!
\r\n
Send in your feedback now for the interview you conducted earlier today with {{CANDIDATE_NAME}}.
\r\n
It's easy - just visit the following link to fill out your scorecard online: {{SCORECARD_LINK}}
Please let me know if you're still interested in {{JOB_NAME}}.
Thank you!
{{MY_SIGNATURE}}",
+ "user": {
+ "id": 297349,
+ "first_name": "Jane",
+ "last_name": "Smith",
+ "name": "Jane Smith",
+ "employee_id": "12345"
+ }
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/email_templates`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving email templates will improve. This will remove `last` from the `link` response header.
+| created_before | Return only email templates that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only email templates that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only email templates that were updated before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only email templates that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+
+
+
+[See noteworthy response attributes.](#the-email-template-object)
+
+## GET: Retrieve Email Template
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/email_templates/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 48765,
+ "name": "Default Scorecard Reminder",
+ "description": "To be sent to an interviewer when their scorecard is due.",
+ "default": true,
+ "updated_at": "2018-06-01T17:04:13.598Z",
+ "created_at": "2015-11-18T22:26:32.154Z",
+ "type": "scorecard_reminder",
+ "from": null,
+ "cc": [
+ "example.user@example.com"
+ ],
+ "body": null,
+ "html_body": "
Hello,
\r\n
Please help us keep our hiring on track!
\r\n
Send in your feedback now for the interview you conducted earlier today with {{CANDIDATE_NAME}}.
\r\n
It's easy - just visit the following link to fill out your scorecard online: {{SCORECARD_LINK}}
\r\n
Thanks, {{ORGANIZER_NAME}}
",
+ "user": null
+}
+```
+
+Retrieve an email template by its `id`.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/email_templates/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the email template to retrieve
+
+
+
+[See noteworthy response attributes.](#the-email-template-object)
\ No newline at end of file
diff --git a/source/includes/harvest/_introduction.md b/source/includes/harvest/_introduction.md
new file mode 100644
index 00000000000..ccf5225eb74
--- /dev/null
+++ b/source/includes/harvest/_introduction.md
@@ -0,0 +1,254 @@
+# Introduction
+
+```
+ _ _ _
+ | |__ ___| | | ___
+ | '_ \ / _ \ | |/ _ \
+ | | | | __/ | | (_) |
+ |_| |_|\___|_|_|\___/ _
+ __ _____ _ __| | __| |
+ \ \ /\ / / _ \| '__| |/ _` |
+ \ V V / (_) | | | | (_| |
+ \_/\_/ \___/|_| |_|\__,_|
+```
+
+With Harvest, you have access to most of your Greenhouse data!
+
+The Harvest API was designed to allow our customers to export their data from Greenhouse. However, it can also be used to...
+
+1. Update candidate information.
+2. Add attachments to candidate profiles.
+3. Advance, move, and reject applications.
+
+We have usage examples for cURL (and soon, Ruby)! You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.
+
+This documentation is open source! Feel free to leave feedback as issues in the [GitHub repo](https://github.com/grnhse/greenhouse-api-docs) or fork it and contribute changes!
+
+## Authentication
+
+> To authorize, use this code:
+
+```ruby
+require 'base64'
+api_token = 'a7183e1b7e9ab09b8a5cfa87d1934c3c'
+credential = Base64.strict_encode64(api_token + ':')
+# => "YTcxODNlMWI3ZTlhYjA5YjhhNWNmYTg3ZDE5MzRjM2M6"
+
+headers = {
+ "Authorization" => "Basic " + credential
+}
+```
+
+```shell
+# Note the trailing colon after the username (API token):
+$ curl https://harvest.greenhouse.io/v1/candidates/ -u a7183e1b7e9ab09b8a5cfa87d1934c3c:
+...
+
+> GET /v1/candidates/ HTTP/1.1
+> Host: harvest.greenhouse.io
+> Authorization: Basic YTcxODNlMWI3ZTlhYjA5YjhhNWNmYTg3ZDE5MzRjM2M6
+
+...
+```
+
+Harvest uses Basic Auth over HTTPS for authentication. The username is your Greenhouse API token and the password should be blank. Unauthenticated requests will return an HTTP 401 response.
+
+Harvest API keys can be obtained in Greenhouse. In order to create a Harvest API key, a user must be granted the "Can manage ALL organization's API Credentials" in the "Developer permission" section. That user can then go Configure >> Dev Center >> API Credential Management. From there, you can create a Harvest API key and choose which endpoints it may access.
+
+**Important Note:** Users with Harvest API keys may access all the data in the endpoint. Access to data in Harvest is binary: everything or nothing. Harvest API keys should be given to internal developers with this understanding and to third parties with caution. Each key should only be allowed to access the endpoints it absolutely needs.
+
+### Authorization header
+
+> Your `Authorization` header should look like this:
+
+```
+Authorization: Basic YTcxODNlMWI3ZTlhYjA5YjhhNWNmYTg3ZDE5MzRjM2M6
+```
+
+Most HTTP clients will automatically use a given username and password to generate the required Authorization header. However, you may need to explicity set this header. The header has the following format:
+
+`Authorization: Basic `
+
+Since only a username needs to be provided in our case, you'll need to append a `:` (colon) to your Greenhouse API token and then Base64 encode the resulting string.
+
+
+
+### Setting credentials with cURL
+
+If you're making test API requests with cURL you can use the `-u` flag to set the username and password (which is blank). cURL will automatically generate the `Authorization` header.
+
+### Setting permissions for API Keys
+
+You can specify which API endpoints your API keys have access to from the Greenhouse Dev Center. This will allow you to permit or deny access to each endpoint individually. Any API keys created before January 18th, 2017 will have full permissions to all API endpoints that existed at that time, but any new API keys created after that point will need to be explicitly granted the required endpoint permissions.
+
+To add or remove endpoint permissions on an API key, go to the Dev Center in Greenhouse, click "API Credential Management," then click "Manage Permissions" next to your Harvest API Key. From there, check or uncheck permissions for any endpoints.
+
+## Rate limiting
+
+```
+Status: 200 OK
+X-RateLimit-Limit: 50
+X-RateLimit-Remaining: 49
+```
+
+Harvest API requests for approved Greenhouse partners and customer-built custom integrations are limited to the amount specified in the returned `X-RateLimit-Limit` header, per 10 seconds. Unlisted vendors may be subject to additional rate limits.
+
+Exceeding the limit will return an `HTTP 429` response. Status requests for approved integrations can be checked using the `X-RateLimit-Remaining` header. In the `HTTP 429` response, the `X-RateLimit-Reset` header is the timestamp indicating when you can try again while the `Retry-After` header is the number of seconds indicating when you can try again.
+
+## Pagination
+
+> Example paging header
+
+```
+Link: ; rel="next",
+; rel="last"
+```
+
+API methods that return a collection of results are always paginated. Paginated results will include a `Link` (see [RFC-5988](https://tools.ietf.org/html/rfc5988)) response header with the following information.
+
+- `next`. The corresponding URL is the link to the next page.
+- `prev`. The corresponding URL is the link to the previous page.
+- `last`. The corresponding URL is the link to the last page. Will not be returned if the query param `skip_count` is `true`.
+
+Note that when this header is not set, there is only one page, the first page, of results.
+
+As of February 2017, we are transitioning to a new method for paging while maintaining backwards compatibility. Currently, the new method _only_ supports providing a `next` link and is used by the following endpoints:
+
+- [GET: List EEOC](#get-list-eeoc)
+- [GET: List User Roles](#get-list-user-roles)
+- [GET: List Custom Fields](#get-list-custom-fields)
+- [GET: List Custom Field Options](#get-list-custom-field-options)
+- [GET: List Job Openings](#get-list-job-openings)
+- [GET: List Approvals For Job](#get-list-approvals-for-job)
+- [GET: Pending Approvals For User](#get-pending-approvals-for-user)
+- [GET: List Demographic Questions](#get-list-demographic-questions)
+- [GET: List Demographic Answer Options](#get-list-demographic-answer-options)
+- [GET: List Demographic Answer Options For Demographic Question](#get-list-demographic-answer-options-for-demographic-question)
+- [GET: List Demographic Answers](#get-list-demographic-answers)
+- [GET: List Demographic Answers for Application](#get-list-demographic-answers-for-application)
+
+
+
+## Validation
+
+```json
+{
+ "message": "Validation error",
+ "errors": [
+ {
+ "message": "Must be one of: candidate, prospect",
+ "field": "type"
+ }
+ ]
+}
+```
+
+Methods that take input will validate all parameters. Any parameter that fails validation will trigger an error response with status `HTTP 422`. The response body will be a JSON object that includes a message as well as a list of fields that failed validation.
+
+## General considerations
+
+Unless otherwise specified, API methods generally conform to the following:
+
+- Properties without a value will use `null` instead of being undefined
+- "Snake Case" is used for attribute names (e.g. `first_name`)
+- Timestamps are rendered in ISO-8601 format (e.g. `2016-02-03T16:38:46.985Z)
+- URLs to external resources are valid for 7 days
+- We reserve the right to add more properties to objects, but will never change or remove them
+- Custom Fields on the [application object](#applications) are only available to customers with Enterprise-level accounts
+- Resumes, cover letters, and other document attachments in Greenhouse are hosted on Amazon Web Services and are provided via signed, temporary URLs. Due to the ephemeral nature of these resource links, users should download these documents immediately after the request is made and should not rely on these URLs to be available for future requests. In the event AWS S3 is experiencing issues, document attachments will not be available in Harvest.
+
+## Errors
+
+| Error Code | Meaning |
+| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 401 | Unauthorized – Ensure you’re using a valid Harvest API key with the correct permissions in the `Authorization` header (Basic Auth). |
+| 403 | Forbidden -- You don't have access to that record. |
+| 404 | Not Found -- Resource not found. |
+| 422 | Not processed – We're not able to process your request. Validate your parameters. |
+| 429 | Rate limit exceeded – You're being [throttled](https://developers.greenhouse.io/harvest.html#throttling) for exceeding our rate limit. |
+| 500 | Server error – We're having a problem with our server. Give us a few minutes and try again, or check [our status page](https://status.greenhouse.io/) |
+
+## Harvest Change Log
+
+The timestamps below are Eastern Time.
+
+| Date | Description |
+|-------------------------------| --------------------------------------------------------------------------------------------------------------------------------- |
+| Aug 7, 2024 7:00:00AM | Replaced 'web hook' with webhook
+| Jul 10, 2024 7:00:00AM | Updated [The job object](#the-job-object) `openings[].opened_at` and [The job opening object](#job-openings) `opened_at` param descriptions
+| Jul 9, 2024 9:00:00AM | Updated [POST: Reject Application](#post-reject-application) `rejection_email.send_email_at` param documentation to indicate the time zone
+| Jun 8, 2024 3:10:00PM | Add ability to update custom fields in rejection details to [PATCH: Update Application](#patch-update-application)
+| Jun 13, 2024 5:00:00PM | Updated [Introduction - Pagination](#pagination) `last` param, and all list endpoint documentation using old pagination to include `skip_count` param
+| Jun 13, 2024 5:00:00PM | Updated [Introduction - Pagination](#pagination) `last` param, and all list endpoint documentation using old pagination to include `skip_count` param
+| Apr 12, 2024 9:30:00AM | Updated sample response in the [GET: List Offices](#get-list-offices) and [GET: Retrieve Office](#get-retrieve-office) documentation
+| Mar 25, 2024 9:15:00AM | Updated `job_id` description in the [GET: List Candidates](#get-list-candidates) section
+| Mar 21, 2024 3:15:00PM | Updated description in the [Rate-Limiting](#rate-limiting) section
+| Feb 23 2024 1:00:00PM | Updated description of the application parameter in the [POST: Add Prospect](#post-add-prospect) documentation
+| Dec 11, 2023 4:00:00PM | Added a Note to [PATCH: Update Current Offer](#patch-update-current-offer) documentation
+| Nov 15, 2023 12:45:00PM | Added `job_post_custom_location_id` field to Job Post response object and updated sample response
+| Nov 13, 2023 11:09:00AM | Update error status code message.
+| Oct 30, 2023 3:20:00PM | Removed language indicating [PUT: Anonymize Candidate](#put-anonymize-candidate) is restricted to Expert Tier
+| Oct 12, 2023 2:15:00PM | Updated Throttling section to Rate limiting and updated description
+| Aug 22, 2023 3:00:00PM | Included `active` attribute in the [Job Stage Object](#the-job-stage-object)
+| Aug 22, 2023 3:00:00PM | Fixed URL expiry timing in [General Considerations](#general-considerations) and the [Candidate Object](#the-candidate-object)
+| May 15, 2023 12:00:00PM | Added ability to update closed openings in the [Edit Openings Endpoint](#patch-edit-openings)
+| April 12, 2023 3:00:00PM | Modified format of request links for [POST: Scheduled Interviews](#post-scheduled-interviews) and [PATCH: Scheduled Interviews](#patch-scheduled-interviews).
+| March 7, 2023 10:00:00AM | Modified `intenal` querystring parameter on [job post](#job-posts) GET requests to work in the reverse manner. When included in a request and set to `false`, the response will only include external job posts.
+| February 28, 2023 12:00:00PM | Added `internal` querystring paramater to [job post](#job-posts) GET requests to return only internal job posts. When included in a request and set to `true`, the response will only include internal job posts.
+| November 21, 2022 12:00:00PM | Deprecated version 1 of the [DELETE: Destroy Openings](#delete-destroy-openings) endpoint. Only v2 is available going forward.
+| November 9, 2022 04:00:00PM | The `full_content` querystring parameter has been modified on [job post](#job-posts) GET requests to return Pay Transparency ranges (if present). When included in a request, the "content" or "internal_content" fields will return a concatenated string that includes the Board-level introduction, the Post-level description, pay transparency ranges, and the Board-level conclusion.
+| October 18, 2022 12:00:00PM | Added ability to create and update User Attributes to the [Users](#users) endpoints
+| September 22, 2022 12:00:00PM | Updated [DELETE: Destroy Openings](#delete-destroy-openings) to a v2 endpoint. The v1 endpoint will be deprecated in a future release. Users and partners should switch over to the v2 endpoint as soon as possible to avoid issues with your integration.
+| September 12, 2022 12:00:00PM | Added `created_at` field for application's attachments object.
+| September 9, 2022 12:00:00PM | Added [PATCH: Convert Prospect To Candidate](#patch-convert-prospect-to-candidate) endpoint to allow conversion of a prospect application to a candidate application on a selected job.
+| August 1, 2022 12:00:00PM | Making `content_type` required for attachments unless uploading using a URL.
+| May 18, 2021 12:00:00PM | Added `video_conferencing_url` to Scheduled Interview object.
+| May 3, 2021 05:00:00PM | Added `priority` to Job Stages object.
+| May 3, 2021 04:00:00PM | Added `job_post_id` field to application's response object.
+| April 21, 2021 11:00:00AM | Added ability to change external_id for custom field options.
+| April 13, 2021 01:00:00PM | Added ability to change user permission level to basic.
+| September 28, 2020 12:00:00PM | "Required" field added to Demographic Questions.
+| September 23, 2020 03:00:00PM | Attachments have been added at the application level. Previously, an aggregation of all attachments on all applications was included at the candidate level and not at all in the applications endpoint. Now, the applications endpoint includes attachments specific to each application and the candidates endpoint includes attachments in each application specific to that application.
+| September 10, 2020 05:00:00PM | A new querystring parameter has been added to [job post](#job-posts) GET requests to return Board-level Introductions and Conclusions (if present). When included in a request, the "content" or "internal_content" fields will return a concatenated string that includes the Board-level introduction, the Post-level description, and the Board-level conclusion. |
+| May 28, 2020 05:00:00PM | Candidate photos have been removed from Greenhouse and will no longer be accepted as a field to be anonymized in [PUT Anonymize Candidates](#put-anonymize-candidate) |
+| May 5, 2020 12:00:00PM | Added "interview_step" field to the scorecards response. This provides the "ID" of the existing "interview" field. The "name" sub-element of the "interview_step" element should match the current "interview" element. The "interview" field is maintained for backward compatibility.
+| Apr 22, 2020 09:00:00AM | Added external_id as field to the [Custom Field Option object](#the-custom-field-options-object). |
+| Apr 13, 2020 09:00:00AM | The V1 endpoints for [PATCH: Edit User], [PATCH: Disable User], and [PATCH: Enable User] have been deprecated. Users should move to the V2 endpoints as soon as convenient. This change was made to take advantage of additional ways to look up users in Greenhouse. |
+| Apr 12, 2020 09:00:00AM | V1 of [PATCH: Update Job Post] has been deprecated. Updating a job post's status has been extracted to [PATCH: Update Job Post Status], while updating all other properties remains on [PATCH: Update Job Post]. The new endpoint more accurately reflects the permissions required by the On-Behalf-Of user to access and edit the Job Post's properties. |
+| Apr 5, 2020 09:00:00AM | Added V2 of [POST: Scheduled Interviews](#post-scheduled-interviews) and [PATCH: Scheduled Interviews](#patch-scheduled-interviews). Deprecated V1. |
+| Jan 30, 2020 05:30:00PM | Added ability to update custom field values in a [PATCH: Job Openings](#patch-edit-openings) request |
+| Jan 30, 2020 05:30:00PM | Added ability to re-open a closed job opening in a [PATCH: Job Openings](#patch-edit-openings) request |
+| Jan 15, 2020 04:00:00PM | Added ability to update a rejection reason on a rejected application. [PATCH: Update Rejection Reason](#patch-update-rejection-reason) |
+| Dec 20, 2019 04:00:00PM | Added ability to assign custom field values in a [POST: Job Openings](#post-create-new-openings) request |
+| Nov 26, 2019 11:00:00 AM | Updated the error response text to be more descriptive when attempting to delete a required custom field |
+| Nov 26, 2019 11:00:00 AM | Added ability to update custom fields on an application's current offer via [PATCH: Update Current Offer](#patch-update-current-offer) |
+| Nov 12, 2019 10:00:00 AM | Added a v2 version of [PATCH: Edit User](#patch-edit-user-v2), [PATCH: Disable User](#patch-disable-user-v2), and [PATCH: Enable User](#patch-enable-user-v2)
+| Oct 7, 2019 03:00:00 PM | Added custom fields to openings on organizations with this option enabled. [GET: Openings](#get-list-job-openings)
+| Oct 1, 2019 11:00:00AM | Added ability to filter offers by start_date with starts_before and starts_after. [GET: Offers](#get-list-offers) |
+| Sep 18, 2019 01:00:00PM | Added ability to create prospect applications for existing candidates/prospects [POST: Add Application to Candidate/Prospect](#post-add-application-to-candidate-prospect) |
+| Aug 12, 2019 05:00:00PM | Prospect post data will return in Job Posts endpoints. |
+| Jul 31, 2019 01:00:00PM | Added ability to filter demographic data answers by created_at and updated_at dates [GET: Demographic Answers](#get-list-demographic-answers) |
+| Jul 17, 2019 01:00:00PM | Added ability to update the current offer on an application via [PATCH: Update Current Offer](#patch-update-current-offer) |
+| Jul 17, 2019 01:00:00PM | Added ability to post new attachments to applications via [POST: Add Attachment to Application](#post-add-attachment-to-application) |
+| Jun 26, 2019 12:00:00PM | Added ability to create new Offices linked by external parent ids to [POST: Add Office](#post-add-office). |
+| Jun 26, 2019 12:00:00PM | Added ability to create new Departments linked by external parent ids to [POST: Add Department](#post-add-department). |
+| Jun 26, 2019 12:00:00PM | Added child and parent office external IDs to the [Office object](#the-office-object). |
+| Jun 26, 2019 12:00:00PM | Added child and parent department external IDs to the [Department object](#the-department-object). |
+| Jun 12, 2019 02:00:00PM | Added `prospective_department` and `prospective_office` to the [Application object](#the-application-object). |
+| Jun 7, 2019 02:00:00PM | Added default interviewers and estimated duration to the [Job Stage object](#the-job-stage-object) |
+| May 24, 2019 01:00:00PM | Added ability to set location on job posts via office and custom location id via [PATCH: Update Job Post](#patch-update-job-post) |
+| May 24, 2019 01:00:00PM | Added `schedulable` field to [Job Stages Endpoints](#job-stages) |
+| May 24, 2019 01:00:00PM | Added `first_published_at` field to [Job Posts Endpoints](#job-posts) |
+| May 15, 2019 05:00:00PM | Added ability to change prospect pool and stage via [PATCH: Update Application](#patch-update-application) |
+| May 15, 2019 03:15:00PM | Added `opening` field to [Offers](#offers). |
+| May 7, 2019 03:30:00PM | Added [Demographic Data endpoints](#demographic-data) |
+| Apr 8 , 2019 04:00:00PM | Added `interviewer` to [Scorecard object](#the-scorecard-object) |
+| Mar 18, 2019 03:30:00PM | Added ability to delete a Candidate Tag via [DELETE: Destroy a Candidate Tag](#delete-destroy-a-candidate-tag) |
+| Mar 6, 2019 02:15:00PM | Added `linked_candidate_ids` to [Users Endpoints](#users) |
+| Feb 28, 2019 02:34:00PM | Added `primary_email_address` to [Users Endpoints](#users) |
+| Feb 28, 2019 12:30:00PM | Added `updated_at` to [Jobs Endpoints](#jobs) |
+| Feb 13, 2019 03:30:00PM | Added ability to create new candidate tags via [POST: Add New Candidate Tag](#post-add-new-candidate-tag) |
+| Feb 1, 2019 11:28:00AM | Added partial response (HTTP Status code 202) to [POST: Create Job](#post-create-job) |
+| Jan 8, 2019 12:00:00PM | Added `can_email` flag to [Candidates Endpoints](#the-candidate-object) |
diff --git a/source/includes/harvest/_job_openings.md b/source/includes/harvest/_job_openings.md
new file mode 100644
index 00000000000..474e0d682ef
--- /dev/null
+++ b/source/includes/harvest/_job_openings.md
@@ -0,0 +1,419 @@
+# Job Openings
+
+This endpoint is used to managing openings on jobs.
+
+## The job opening object
+
+```json
+[
+ {
+ "id": 123,
+ "opening_id": "OPENED-1",
+ "status": "open",
+ "opened_at": "2015-11-19T19:53:32.565Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null,
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 123,
+ "opening_id": "CLOSED-1",
+ "status": "closed",
+ "opened_at": "2015-11-19T19:53:32.565Z",
+ "closed_at": "2015-12-14T19:53:32.565Z",
+ "application_id": 65565,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ },
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ }
+]
+```
+
+### Noteworthy Attributes
+
+| Attribute | Description |
+--------- | -----------
+| id | The opening's unique identifier |
+| opening_id | This is a text string used to identify the opening. This is defined by the users and may be null. |
+| status | Either "open" or "closed" |
+| opened_at | This is the date and time this opening was opened. |
+| closed_at | This is when the opening was closed; usually via the opening being filled. This should be null for opened openings. |
+| application_id | The application that was used to fill this opening. This should only be set on a closed opening, null otherwise. |
+| custom_fields | These are the custom fields that are specific to openings. This index, along with keyed_custom_fields, may not be included if your organization does not have access to custom fields on openings.
+
+## GET: List Job Openings
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/jobs/{job_id}/openings' -H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "opening_id": "OPENED-1",
+ "status": "open",
+ "opened_at": "2015-11-19T19:53:32.565Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null,
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 123,
+ "opening_id": "CLOSED-1",
+ "status": "closed",
+ "opened_at": "2015-11-19T19:53:32.565Z",
+ "closed_at": "2015-12-14T19:53:32.565Z",
+ "application_id": 65565,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ },
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ }
+]
+```
+
+List all of a job's openings
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/jobs/{job_id}/openings`
+
+### URL Paramters
+
+| Parameter | Description |
+--------- | -----------
+| job_id | The ID of the job for which you want to retrieve openings.
+
+### Querystring Parameters
+
+| Parameter | Description |
+--------- | -----------
+| status | May contain either "opened" or "closed"; when set will return only open or closed openings, respectively. Returns all openings if this isn't set or set to an unrecognized value. |
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+[See noteworthy response attributes.](#the-job-opening-object)
+
+## GET: Single Opening For Job
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/jobs/{job_id}/openings/{id}' -H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```
+{
+ "id": 123,
+ "opening_id": "OPENED-1",
+ "status": "open",
+ "opened_at": "2015-11-19T19:53:32.565Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null,
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+}
+```
+
+Retrieve the information for a single opening.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/jobs/{job_id}/openings/{id}`
+
+### URL Parameters
+
+| Parameter | Description |
+--------- | -----------
+| job_id | The ID of the job for which you want to retrieve openings.
+| id | The ID of the opening you want to retrieve. Note: this is NOT the `opening_id` which is mutable and defined by Greenhouse users, but the `id` of an opening, which is unique to that opening and not mutable. |
+
+
+[See noteworthy response attributes.](#the-job-opening-object)
+
+## DELETE: Destroy Openings
+
+``` shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/jobs/{job_id}/openings'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "ids": [123, 456, 789]
+}
+```
+
+### HTTP Request
+
+**DEPRECATED** ~~`DELETE https://harvest.greenhouse.io/v1/jobs/{job_id}/openings`~~
+
+`DELETE https://harvest.greenhouse.io/v2/jobs/{job_id}/openings`
+
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+ids | yes | Array | An array of opening ids to delete. Important to note that these are not `opening_id` from the other endpoints, but the unique `id` identifier.
+
+**Notes**: The v1 version of this endpoint has been deprecated because it allowed integrations to delete open or filled openings that were otherwise prevented by data validations in the Greenhouse Recruiting UI.
+
+The v2 version of this endpoint only allows closed, unfilled openings to be deleted and respects data validation rules as they exist in Greenhouse Recruiting. When the v1 endpoint is deprecated, some integrations may experience errors if they relied on deleting active or filled openings. Since the behavior adheres to the data validation guidelines established in Greenhouse Recruiting, Greenhouse does not consider these issues a breaking change.
+
+In the v2 version, response messages will include both IDs that were successfully deleted and any IDs that could not be deleted. Failed deletions can occur for a number of reasons, including the following examples:
+- The provided ID does not exist
+- The provided ID leads to an opening tied to an application or offer
+- The opening is currently open for applications
+
+If the organization has deactivated the ability to destroy openings or if the On-Behalf-Of User does not have the ability to edit the given job, a 403 error will be returned.
+
+The v1 endpoint has been deactivated as of 11/21/2022. Customers or partners should begin using the v2 endpoint.
+
+API keys that were granted access to the v1 endpoint will automatically have access to the v2 endpoint.
+
+
+> The above returns a JSON response, structured like this
+
+```
+{
+ "success": true
+ "deleted_ids": [123, 456],
+ "failed_ids": [789]
+}
+```
+
+
+## PATCH: Edit Openings
+
+``` shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/jobs/{job_id}/openings/{d}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "opening_id": "abc-123",
+ "status": "closed",
+ "close_reason_id": 1234,
+ "custom_fields": [ { "id": 123, "value": "some value" } ]
+}
+```
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/jobs/{job_id}/openings/{id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+job_id | The ID of the job on which to add new openings.
+id | The ID of the opening. Note this is the immutable internal id, and not the free-text "opening_id" from the JSON body.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+opening_id | no | string | This is a string that contains an opening_id. This may be a blank string. Changing an opening_id may re-trigger approvals. For approvals to start recruiting, this will reset approvals only if the job is in draft mode. If the job is open for hiring, these approvals will not reset. For official job approvals, this will reset approvals only if the job is open.
+status | no | string | Accepts either "open" or "closed". This can be used to close an open opening with the word "closed" or to open a closed opening with the word "open". Official job approvals will be reset when opening a closed opening only if the Permission Policy named "Reopening a job with approval should require reapproval" is toggled on. If the last opening is closed, it will close the hiring plan.
+close_reason_id | no | integer | When closing, you may provide a close_reason_id. Providing a close_reason_id without closing the opening will return an error.
+custom_fields | no | array | Array of custom field objects containing updated values for custom fields on the opening. See the "Custom Field Object Parameters" section below for more details. Note: updating a custom field may reset official job approvals if this option is selected in the custom field settings page.
+
+**Note**: If the job is closed at the same time the opening_id is changed, approvals will be ignored in favor of closing the opening.
+
+### Custom Field Object Parameters
+
+The custom field parameter structure is different in the PATCH method than in GET methods and responses. Certain types of custom fields require different elements to be included. See below for the description of each item in a custom field element and what is required depending on the type.
+
+Parameter | Required for | Description
+---------- | -------------- | ----------------
+id | all | The custom field ID for this particular custom field. One of this or `name_key` is required.
+name_key | all | The name key for this custom field. This can be found in Greenhouse while editing custom options as `Immutable Field Key`. One of this or `id` is required.
+value | all | The new custom field value. In most cases this will be a string or a number. In the case of single-select or multi-select custom fields, this will be a custom field option ID or an array of custom field option IDs, respectively. In the case of single-select fields, this can also be a string that matches an existing option's name exactly. See the [Custom Field Object for more details](#the-custom-field-object).
+min_value | number_range, currency range | The minimum value for a range. Must be less than max_value.
+max_value | number_range, currency_range | The maximum value for a range. Must be greater than min_value
+unit | currency | This contains the currency unit for a currency custom field. It is only required when updating a currency custom field. This should accept any 3-character currency code from the ISO-4217 standard.
+delete_value | n/a | When this element is included with a value of "true" (note, string true, not boolean true) the custom field value will be removed from Greenhouse. Note that updating a custom field value to nil or a blank string will not work, as validations require these to be non-blank values. Required custom fields cannot be deleted and attempting to delete them will cause the request to fail.
+
+> The above returns a JSON response, structured like this:
+
+```
+{
+ "success": "true"
+}
+```
+
+## POST: Create New Openings
+
+``` shell
+curl -X POST 'https://harvest.greenhouse.io/v1/jobs/{job_id}/openings'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "openings": [
+ {
+ "opening_id": "abc-123",
+ "custom_fields": [ { "id": 123, "value": "some value" } ]
+ },
+ {"opening_id": null}
+ ]
+}
+```
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/jobs/{job_id}/openings`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+job_id | The ID of the job on which to add new openings.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+openings | yes | Array | This an array of hashes, which can contain an opening ID and custom fields.
+openings.opening_id | yes | Array | This is a string that contains an opening_id. One new opening will be created for each hash element in the array. Opening ID is not required to have a string value and may be null. Greenhouse has an internal limit of 100 open openings. If you attempt to create more than 100 openings in a single request, or if this request would create more than 100 open openings, the request will fail.
+openings.custom_fields[] | No | Array | Array of custom field objects containing new custom field values. Passing an empty array does nothing. If you have any required custom fields configured for openings, they must be supplied for each new opening, or the request will fail. See the "Custom Field Object Parameters" section below for more details.
+
+**Note**: Adding new openings may re-trigger approvals. For approvals to start recruiting, this will reset approvals only if the job is in draft mode. If the job is open for hiring, these approvals will not reset. For official job approvals, this will reset approvals only if the job is open.
+
+### Custom Field Object Parameters
+
+The custom field parameter structure is different in the POST method than in GET methods and responses. Certain types of custom fields require different elements to be included. See below for the description of each item in a custom field element and what is required depending on the type.
+
+Parameter | Required for | Description
+---------- | -------------- | ----------------
+id | all | The custom field ID for this particular custom field. One of this or `name_key` is required.
+name_key | all | The name key for this custom field. This can be found in Greenhouse while editing custom options as `Immutable Field Key`. One of this or `id` is required.
+value | all | The new custom field value. In most cases this will be a string or a number. In the case of single-select or multi-select custom fields, this will be a custom field option ID or an array of custom field option IDs, respectively. In the case of single-select fields, this can also be a string that matches an existing option's name exactly. See the [Custom Field Object for more details](#the-custom-field-object).
+| min_value | number_range, currency range | The minimum value for a range. Must be less than max_value.
+| max_value | number_range, currency_range | The maximum value for a range. Must be greater than min_value
+unit | currency | This contains the currency unit for a currency custom field. It is only required when updating a currency custom field. This should accept any 3-character currency code from the ISO-4217 standard.
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "openings": [
+ {
+ "id": 123456,
+ "opening_id": "abc-123",
+ "open_date": "2017-10-02T19:53:32.565Z"
+ },
+ {
+ "id": 123457,
+ "opening_id": null,
+ "open_date": "2017-10-02T19:53:32.565Z"
+ }
+ ]
+}
+```
diff --git a/source/includes/harvest/_job_posts.md b/source/includes/harvest/_job_posts.md
new file mode 100644
index 00000000000..b3ef2741bf3
--- /dev/null
+++ b/source/includes/harvest/_job_posts.md
@@ -0,0 +1,1054 @@
+# Job Posts
+
+Describes the online job posts for an organization's jobs (as seen on the Job Board).
+
+## The job post object
+
+```json
+{
+ "id": 123,
+ "title": "Software Engineer",
+ "location": {
+ "id": 123456,
+ "name": "New York, NY",
+ "office_id": null,
+ "job_post_custom_location_id": 303145,
+ "job_post_location_type": {
+ "id": 1,
+ "name": "Free Text"
+ }
+ },
+ "internal": true,
+ "external": false,
+ "active": true,
+ "live": true,
+ "first_published_at": "2023-04-03T18:06:18Z",
+ "job_id": 1234,
+ "content": "
"
+ },
+ {
+ "required": true,
+ "private": false,
+ "label": "How did you hear about this job?",
+ "name": "question_56789",
+ "type": "short_text",
+ "values": [],
+ "description": null
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | Job post ID
+| active | If `false`, this job post has been deleted.
+| live | If `true`, this job post status is set to live.
+| first_published_at | Timestamp when this job post was first set to live.
+| internal | If `true`, this job post has been posted (or is *to be posted*) on an internal job board.
+| external | If `true`, this job post has been posted (or is *to be posted*) on an external job board.
+| job_id | The ID of the [job](#jobs) that this job post is for. Indicates a prospect post if null.
+| content | The text of the job post as posted to the external job board.
+| internal_content | The text of the job post if posted to the internal job board, if different than the external job board.
+| demographic_question_set_id | The demographic question set associated with this job post
+| questions | An array of questions associated with this job post.
+| questions.name | When submitting applications through the Job Board API, this is the name of the POST parameter used to submit questions. Custom questions are prefixed with "question_" while Greenhouse standard application questions have a consistent name for every job post.
+
+## GET: List Job Posts
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/job_posts'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "title": "Software Engineer",
+ "location": {
+ "id": 123456,
+ "name": "New York, NY",
+ "office_id": null,
+ "job_post_custom_location_id": 303145,
+ "job_post_location_type": {
+ "id": 1,
+ "name": "Free Text"
+ }
+ },
+ "internal": true,
+ "external": false,
+ "active": true,
+ "live": true,
+ "first_published_at": "2023-04-03T18:06:18Z",
+ "job_id": 1234,
+ "content": "
"
+ },
+ {
+ "required": true,
+ "private": false,
+ "label": "How did you hear about this job?",
+ "name": "question_56789",
+ "type": "short_text",
+ "values": [],
+ "description": null
+ }
+ ]
+ }
+]
+```
+
+List all of an organization's job posts.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/job_posts`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving job posts will improve. This will remove `last` from the `link` response header.
+| created_before | Return only job posts that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only job posts that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only job posts that were updated before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only job posts that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| live | If `true`, return only live job posts.
+| active | If `true`, only return active job posts. If `false`, only return deleted job posts. When omitted, return both active and deleted job posts.
+| full_content | If `true`, returns the board introduction, description, pay transparency ranges, and board conclusion as one `content` or `internal_content` element. When omitted, only returns the post's editable description.
+| internal | If `true`, only return internal job posts. If `false`, only return external job posts. When omitted, return both internal and external job posts.
+
+
+[See noteworthy response attributes.](#the-job-post-object)
+
+## GET: Retrieve Job Post
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/job_posts/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 123,
+ "title": "Software Engineer",
+ "location": {
+ "id": 123456,
+ "name": "New York, NY",
+ "office_id": null,
+ "job_post_custom_location_id": 303145,
+ "job_post_location_type": {
+ "id": 1,
+ "name": "Free Text"
+ }
+ },
+ "internal": true,
+ "external": false,
+ "active": true,
+ "live": true,
+ "first_published_at": "2023-04-03T18:06:18Z",
+ "job_id": 1234,
+ "content": "
"
+ },
+ {
+ "required": true,
+ "private": false,
+ "label": "How did you hear about this job?",
+ "name": "question_56789",
+ "type": "short_text",
+ "values": [],
+ "description": null
+ }
+ ]
+ }
+```
+
+Retrieve the corresponding job post for a given Job ID.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/jobs/{id}/job_post`
+
+### URL parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the job whose job post you want to retrieve
+
+### Querystring parameters
+
+Parameter | Description
+--------- | -----------
+| content | If present, will return the text of the job post as posted to the external job board.
+| questions | If present, will return an array of questions associated with this job post.
+| full_content | If `true`, returns the board introduction, description, pay transparency ranges, and board conclusion as one `content` or `internal_content` element. When omitted, only return the post's editable description.
+
+
+
+[See noteworthy response attributes.](#the-job-post-object)
+
+
+## GET: Retrieve Custom Locations for Job Post
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/job_posts/{id}/custom_locations'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 1234,
+ "value": "Boston",
+ "active": true,
+ "greenhouse_job_board_id": 111,
+ "created_at": "2019-05-15T15:19:53.617Z",
+ "updated_at": "2019-05-15T15:19:53.617Z"
+ },
+ {
+ "id": 2321,
+ "value": "New York",
+ "active": true,
+ "greenhouse_job_board_id": 111,
+ "created_at": "2019-05-15T15:53:35.586Z",
+ "updated_at": "2019-05-15T15:53:35.586Z"
+ },
+ {
+ "id": 4215,
+ "value": "San Francisco",
+ "active": true,
+ "greenhouse_job_board_id": 111,
+ "created_at": "2019-05-15T15:19:53.617Z",
+ "updated_at": "2019-05-15T15:19:53.617Z"
+ }
+ ]
+```
+
+List all the custom location options available for a given job post ID
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/job_posts/{id}/custom_locations`
+
+### URL parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the job post whose custom location options you want to retrieve
+
+## PATCH: Update Job Post
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v2/job_posts/{id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "title": "New Job Title",
+ "location": "NYC",
+ "content": "
My exciting new job post!
Check it out!
"
+}
+```
+> The above returns a JSON response on success:
+
+```json
+{
+ "success": true
+}
+```
+
+Update some properties of a job post.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v2/job_posts/{id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+title | No | string | The new title for this job post.
+location | No | string | The new location for this job post. This is just a plain text string.
+location.office_id | No | integer | The new location for this job post. This will be set by an office ID. Only acceptable if the job board location configuration is limited to offices.
+location.custom_location_id | No | integer | The new location for this job post. This will be set by a custom location ID. Only acceptable if the job board location configuration is limited to a custom list.
+content | No | string | The new body of the job post. This will replace the entire existing job post body.
+
+**Important Note**: Due to JSON restrictions, the HTML body of the new job post should be a single line, with no newline characters and with all double quotes escaped. If your job posts require significant formatting, we recommend using Greenhouse's job post editor to make changes.
+
+The V1 version of this endpoint was deprecated on 4/12/2020. To more correctly reflect job post permissions in Greenhouse Recruiting, updating the status of a job post was extracted into its own endpoint. We considered changing access permission to a job post a breaking change, so this V2 endpoint was created. Usage of this endpoint is the same as the V1 endpoint except it does not support updating status. To update status, use the Update Job Post Status endpoint below. The access permission in that endpoint is the same as the previous access permission in the V1 endpoint.
+
+## PATCH: Update Job Post Status
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v2/job_posts/{id}/status'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "status": "live", (or "offline")
+}
+```
+> The above returns a JSON response on success:
+
+```json
+{
+ "success": true
+}
+```
+
+Update the status of a job post to "live" or "offline."
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v2/job_posts/{id}/status`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+status | Yes | string | One of 'live' or 'offline'
+
+The ability to update a job post's status is on a different permission than the other properties of a job post. To reflect this in Harvest, status was separated into its own endpoint in V2. Updating status on the V1 endpoint is deprecated.
diff --git a/source/includes/harvest/_job_stages.md b/source/includes/harvest/_job_stages.md
new file mode 100644
index 00000000000..789d7ccc563
--- /dev/null
+++ b/source/includes/harvest/_job_stages.md
@@ -0,0 +1,391 @@
+# Job Stages
+
+An organization's job stages.
+
+## The job stage object
+
+```json
+{
+ "id": 72200,
+ "name": "Face to Face",
+ "created_at": "2016-10-22T05:31:37.263Z",
+ "updated_at": "2016-10-22T05:31:37.263Z",
+ "active": true,
+ "job_id": 98765,
+ "priority": 0,
+ "interviews": [
+ {
+ "id": 6001,
+ "name": "Cultural Fit Interview",
+ "schedulable": true,
+ "estimated_minutes": 30,
+ "default_interviewer_users": [
+ {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ }
+ ],
+ "interview_kit": {
+ "id": 9123,
+ "content": "
Purpose
Determine whether or not the candidate would be a strong fit.",
+ "questions": [
+ {
+ "id": 11052,
+ "question": "Is this person really a good fit?"
+ }
+ ]
+ }
+ },
+ {
+ "id": 6002,
+ "name": "Executive Interview",
+ "schedulable": true,
+ "estimated_minutes": 60,
+ "default_interviewer_users": [
+ {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ }
+ ],
+ "interview_kit": {
+ "id": 9124,
+ "content": "
Purpose
See if they can work with the boss.",
+ "questions": [
+ {
+ "id": 11053,
+ "question": "What's their favorite color?"
+ },
+ {
+ "id": 11054,
+ "question": "Do they really want to work here?"
+ }
+ ]
+ }
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The job stage's unique identifier |
+| name | The name for this job stage |
+| active | One of `true` or `false`: `true` - The job stage is active `false` - The job stage was deleted |
+| job_id | The job that this stage belongs to |
+| priority| Numeric field used for ordering, with the lowest values ordered first. For example, priority 0 indicates the first stage on a job
+| interviews | An array of interview steps associated with this job stage. Each Step contains: `id` - The step's unique identifier `name` - The name of this interview step `schedulable` - True / False value for whether this step can be scheduled `interview_kit` - Details about the interview, including unique ID, interview prep content, and custom interview questions |
+
+
+## GET: List Job Stages
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/job_stages'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 6001,
+ "name": "Cultural Fit Interview",
+ "created_at": "2015-11-22T05:31:37.263Z",
+ "updated_at": "2015-11-22T05:31:37.263Z",
+ "job_id": 12345,
+ "priority": 0,
+ "interviews": [
+ {
+ "id": 7890,
+ "name": "Cultural Fit Interview",
+ "schedulable": true,
+ "estimated_minutes": 30,
+ "default_interviewer_users": [
+ {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ }
+ ],
+ "interview_kit": {
+ "id": 9124,
+ "content": "
Determine whether or not the candidate would be a strong fit.",
+ "questions": [
+ {
+ "id": 11053,
+ "question": "What's their favorite color?"
+ },
+ {
+ "id": 11054,
+ "question": "Do they really want to work here?"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+```
+
+List all of an organization's job stages.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/job_stages`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving job stages will improve. This will remove `last` from the `link` response header.
+| created_before | Return only job stages that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only job stages that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only job stages that were updated before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only job stages that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+
+
+[See noteworthy response attributes.](#the-job-stages-object)
+
+## GET: List Job Stages for Job
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/jobs/{id}/stages'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 72200,
+ "name": "Face to Face",
+ "created_at": "2015-11-22T05:31:37.263Z",
+ "updated_at": "2015-11-22T05:31:37.263Z",
+ "job_id": 146218,
+ "priority": 0,
+ "interviews": [
+ {
+ "id": 6001,
+ "name": "Cultural Fit Interview",
+ "schedulable": true,
+ "estimated_minutes": 30,
+ "default_interviewer_users": [
+ {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ }
+ ],
+ "interview_kit": {
+ "id": 9128,
+ "content": "
Purpose
Determine whether or not the candidate would be a strong fit.",
+ "questions": [
+ {
+ "id": 11052,
+ "question": "Is this person really a good fit?"
+ }
+ ]
+ }
+ },
+ {
+ "id": 6002,
+ "name": "Executive Interview",
+ "schedulable": true,
+ "created_at": "2015-11-22T05:31:37.263Z",
+ "updated_at": "2015-11-22T05:31:37.263Z",
+ "job_id": 146219,
+ "estimated_minutes": 60,
+ "default_interviewer_users": [
+ {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ }
+ ],
+ "interview_kit": {
+ "id": 9129,
+ "content": "
Purpose
See if they can work with the boss.",
+ "questions": [
+ {
+ "id": 11053,
+ "question": "What's their favorite color?"
+ },
+ {
+ "id": 11054,
+ "question": "Do they really want to work here?"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "id": 72199,
+ "name": "Offer",
+ "created_at": "2015-11-22T05:31:37.263Z",
+ "updated_at": "2015-11-22T05:31:37.263Z",
+ "job_id": 146220,
+ "priority": 1,
+ "interviews": []
+ },
+ {
+ "id": 72194,
+ "name": "Application Review",
+ "created_at": "2015-11-22T05:31:37.263Z",
+ "updated_at": "2015-11-22T05:31:37.263Z",
+ "job_id": 146221,
+ "priority": 2,
+ "interviews": [
+ {
+ "id": 8004,
+ "name": "Application Review",
+ "schedulable": false,
+ "interview_kit": {
+ "id": 9130,
+ "content": null,
+ "questions": []
+ }
+ }
+ ]
+ }
+]
+```
+
+Retrieve the stages for the specified job id.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/jobs/{id}/stages`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+| id | The ID of the job whose job stages you want to retrieve.
+
+### Querystring parameters
+
+Parameter | Description
+--------- | -----------
+| created_before | Return only job stages that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only job stages that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only job stages that were updated before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only job stages that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+
+
+[See noteworthy response attributes.](#the-job-stage-object)
+
+## GET: Retrieve Job Stage
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/job_stages/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 6001,
+ "name": "Cultural Fit Interview",
+ "created_at": "2015-11-22T05:31:37.263Z",
+ "updated_at": "2015-11-22T05:31:37.263Z",
+ "job_id": 12345,
+ "priority": 1,
+ "interviews": [
+ {
+ "id": 7890,
+ "name": "Cultural Fit Interview",
+ "schedulable": true,
+ "estimated_minutes": 30,
+ "default_interviewer_users": [
+ {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ }
+ ],
+ "interview_kit": {
+ "id": 9127,
+ "content": "
Purpose
Determine whether or not the candidate would be a strong fit.",
+ "questions": [
+ {
+ "id": 11052,
+ "question": "Is this person really a good fit?"
+ }
+ ]
+ }
+ }
+ ]
+ }
+```
+
+Retreieve a job stage by its `id`.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/job_stages/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the job stage to retrieve
+
+
+
+[See noteworthy response attributes.](#the-job-stages-object)
diff --git a/source/includes/harvest/_jobs.md b/source/includes/harvest/_jobs.md
new file mode 100644
index 00000000000..729ab037664
--- /dev/null
+++ b/source/includes/harvest/_jobs.md
@@ -0,0 +1,1625 @@
+# Jobs
+
+## The job object
+
+An organization's jobs.
+
+```json
+{
+ "id": 6404,
+ "name": "Archaeologist",
+ "requisition_id": "abc123",
+ "notes": "
Resistance to electro-magnetic radiation a plus!
",
+ "confidential": false,
+ "status": "closed",
+ "created_at": "2013-12-10T14:42:58Z",
+ "opened_at": "2013-12-11T14:42:58Z",
+ "closed_at": "2013-12-12T14:42:58Z",
+ "updated_at": "2013-12-12T14:42:58Z",
+ "is_template": false,
+ "copied_from_id": 2345,
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Second-Level department",
+ "parent_id": 25908,
+ "child_ids": [14510],
+ "external_id": "12345"
+ }
+ ],
+ "offices": [
+ {
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 150893,
+ "parent_id": 50849,
+ "child_ids": [50852, 50891],
+ "external_id": "15679"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k",
+ "salary_range": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "Full-Time"
+ },
+ "salary_range": {
+ "name": "Salary Range",
+ "type": "currency_range",
+ "value": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ }
+ },
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "id": 84275,
+ "first_name": "Kaylee",
+ "last_name": "Prime",
+ "name": "Kaylee Prime",
+ "employee_id": "13636"
+ },
+ {
+ "id": 169779,
+ "first_name": "Hank",
+ "last_name": "Hollandaise",
+ "name": "Hank Hollandaise",
+ "employee_id": "34537"
+ }
+ ],
+ "recruiters": [
+ {
+ "id": 81111,
+ "first_name": "Samuel",
+ "last_name": "Skateboard",
+ "name": "Samuel Skateboard",
+ "employee_id": "34531",
+ "responsible": false
+ },
+ {
+ "id": 153448,
+ "first_name": "Stegosaurus",
+ "last_name": "Heels",
+ "name": "Stegosaurus Heels",
+ "employee_id": "45748",
+ "responsible": true
+ }
+ ],
+ "coordinators": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327",
+ "responsible": true
+ },
+ {
+ "id": 177046,
+ "first_name": "Mirandella",
+ "last_name": "Lager",
+ "name": "Mirandella Lager",
+ "employee_id": "43626",
+ "responsible": false
+ }
+ ],
+ "sourcers": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327"
+ }
+ ]
+ },
+ "openings": [
+ {
+ "id": 123,
+ "opening_id": "3-1",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.736Z",
+ "closed_at": "2017-11-20T23:14:14.736Z",
+ "application_id": 45678,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ }
+ },
+ {
+ "id": 124,
+ "opening_id": "3-2",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.739Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ {
+ "id": 125,
+ "opening_id": null,
+ "status": "open",
+ "opened_at": "2016-02-03T20:00:00.000Z",
+ "closed_at": null,
+ "application_id": null
+ },
+ {
+ "id": 126,
+ "opening_id": "2-4",
+ "status": "closed",
+ "opened_at": "2016-02-03T16:38:46.985Z",
+ "closed_at": "2016-02-03T16:39:09.811Z",
+ "application_id": 1232,
+ "close_reason": {
+ "id": 689,
+ "name": "Hired"
+ }
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| id | The job's unique identifier |
+| requisition_id | An arbitrary ID provided by an external source; does not map to another entity within Greenhouse. |
+| status | One of `open`, `closed`, `draft`. |
+| confidential | One of `true`, `false`. If the job is confidential or not. |
+| departments | An array containing the [department](#departments) which this job belongs to. |
+| offices | An array containing the [offices](#offices) this job is associated with. |
+| hiring_team | Lists the names and User IDs of the hiring managers, recruiters, coordinators and sourcers associated with this job. For recruiters and coordinators, there is a `responsible` boolean flag which indicates that the user is the responsible recruiter or coordinator for this job. |
+| custom_fields | Contains any custom job fields which have been defined by your organization. |
+| keyed_custom_fields | This contains the same information as custom_fields but formatted in a different way that includes more information. This will tell you the type of custom field data to expect, the text name of custom field, and the value. The key of this hash is the custom field's immutable field key, which will not change even if the name of the custom field is changed in Greenhouse. |
+| openings | Lists the openings associated with this job. |
+| openings[].opening_id | Custom identifier set by an organization. Can be `null`. |
+| openings[].status | One of: `["open", "closed"]` |
+| openings[].opened_at | Timestamp when the opening was opened. |
+| openings[].closed_at | Timestamp when the opening was closed. An opening is closed when it is filled or removed. |
+| openings[].application_id | If the opening is closed and a candidate was hired to fill the opening, this is the ID of the candidate's application. Otherwise, null. |
+| openings[].close_reason | If the opening is closed, it may or may not have a reason for the closure. This contains the id and name of the close reason. |
+| is_template | Is this job designated as a template used to create other jobs. This may be true, false, or null. Null is an indication this job was created before template job feature.
+|
+| copied_from_id | If this job was copied from another job, this field contains the id of the source job.
+
+## GET: List Jobs
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/jobs'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+[
+ {
+ "id": 6404,
+ "name": "Archaeologist",
+ "requisition_id": "abc123",
+ "notes": "
Resistance to electro-magnetic radiation a plus!
",
+ "confidential": false,
+ "status": "closed",
+ "created_at": "2013-12-10T14:42:58Z",
+ "opened_at": "2013-12-11T14:42:58Z",
+ "closed_at": "2013-12-12T14:42:58Z",
+ "updated_at": "2013-12-12T14:42:58Z",
+ "is_template": false,
+ "copied_from_id": 2345,
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Second-Level department",
+ "parent_id": 25908,
+ "child_ids": [14510],
+ "external_id": "12345"
+ }
+ ],
+ "offices": [
+ {
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 150893,
+ "parent_id": 50849,
+ "child_ids": [50852, 50891],
+ "external_id": "15679"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k",
+ "salary_range": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "Full-Time"
+ },
+ "salary_range": {
+ "name": "Salary Range",
+ "type": "currency_range",
+ "value": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ }
+ },
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "id": 84275,
+ "first_name": "Kaylee",
+ "last_name": "Prime",
+ "name": "Kaylee Prime",
+ "employee_id": "13636"
+ },
+ {
+ "id": 169779,
+ "first_name": "Hank",
+ "last_name": "Hollandaise",
+ "name": "Hank Hollandaise",
+ "employee_id": "34537"
+ }
+ ],
+ "recruiters": [
+ {
+ "id": 81111,
+ "first_name": "Samuel",
+ "last_name": "Skateboard",
+ "name": "Samuel Skateboard",
+ "employee_id": "34531",
+ "responsible": false
+ },
+ {
+ "id": 153448,
+ "first_name": "Stegosaurus",
+ "last_name": "Heels",
+ "name": "Stegosaurus Heels",
+ "employee_id": "45748",
+ "responsible": true
+ }
+ ],
+ "coordinators": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327",
+ "responsible": true
+ },
+ {
+ "id": 177046,
+ "first_name": "Mirandella",
+ "last_name": "Lager",
+ "name": "Mirandella Lager",
+ "employee_id": "43626",
+ "responsible": false
+ }
+ ],
+ "sourcers": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327"
+ }
+ ]
+ },
+ "openings": [
+ {
+ "id": 123,
+ "opening_id": "3-1",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.736Z",
+ "closed_at": "2017-11-20T23:14:14.736Z",
+ "application_id": 45678,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ }
+ },
+ {
+ "id": 124,
+ "opening_id": "3-2",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.739Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ {
+ "id": 125,
+ "opening_id": null,
+ "status": "open",
+ "opened_at": "2016-02-03T20:00:00.000Z",
+ "closed_at": null,
+ "application_id": null
+ },
+ {
+ "id": 126,
+ "opening_id": "2-4",
+ "status": "closed",
+ "opened_at": "2016-02-03T16:38:46.985Z",
+ "closed_at": "2016-02-03T16:39:09.811Z",
+ "application_id": 1232,
+ "close_reason": {
+ "id": 689,
+ "name": "Hired"
+ }
+ }
+ ]
+ }
+]
+```
+
+List all of an organization's jobs.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/jobs`
+
+### Querystring parameters
+
+| Parameter | Description |
+| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100. |
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects. |
+| *skip_count | If `true`, the performance of retrieving jobs will improve. This will remove `last` from the `link` response header. |
+| created_before | Return only jobs that were created before this timestamp. Timestamp must be in in [ISO-8601](#general-considerations) format. |
+| created_after | Return only jobs that were created at or after this timestamp. Timestamp must be in in [ISO-8601](#general-considerations) format. |
+| updated_before | Return only jobs that were updated before this timestamp. Timestamp must be in in [ISO-8601](#general-considerations) format. |
+| updated_after | Return only jobs that were updated at or after this timestamp. Timestamp must be in in [ISO-8601](#general-considerations) format. |
+| requisition_id | If included, will return only the jobs that match the given requisition_id |
+| opening_id | If included, will return only the jobs that contain at least one opening with the given opening_id. |
+| status | One of 'open', 'closed', or 'draft'. If included, will only return jobs with that status. |
+| department_id | If included, will return only the jobs in this specific department. |
+| external_department_id | This may be used instead of department_id and represents the ID of the department in an external system. |
+| office_id | If included, will return only the jobs in this specific office. |
+| external_office_id | This may be used instead of office_id and represents the ID of the office in an external system. |
+| custom_field_option_id | The job contains a custom field with this custom_field_option_id selected. Option IDs can be retrieved from the [GET Custom Field Options endpoint](#the-custom-field-options-object). |
+
+
+[See noteworthy response attributes.](#the-job-object)
+
+## GET: Retrieve Job
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/jobs/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 6404,
+ "name": "Archaeologist",
+ "requisition_id": "abc123",
+ "notes": "
Resistance to electro-magnetic radiation a plus!
",
+ "confidential": false,
+ "status": "closed",
+ "created_at": "2013-12-10T14:42:58Z",
+ "opened_at": "2013-12-11T14:42:58Z",
+ "closed_at": "2013-12-12T14:42:58Z",
+ "updated_at": "2013-12-12T14:42:58Z",
+ "is_template": false,
+ "copied_from_id": 2345,
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Second-Level department",
+ "parent_id": 25908,
+ "child_ids": [14510],
+ "external_id": "12345"
+ }
+ ],
+ "offices": [
+ {
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 150893,
+ "parent_id": 50849,
+ "child_ids": [50852, 50891],
+ "external_id": "15679"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k",
+ "salary_range": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "Full-Time"
+ },
+ "salary_range": {
+ "name": "Salary Range",
+ "type": "currency_range",
+ "value": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ }
+ },
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "id": 84275,
+ "first_name": "Kaylee",
+ "last_name": "Prime",
+ "name": "Kaylee Prime",
+ "employee_id": "13636"
+ },
+ {
+ "id": 169779,
+ "first_name": "Hank",
+ "last_name": "Hollandaise",
+ "name": "Hank Hollandaise",
+ "employee_id": "34537"
+ }
+ ],
+ "recruiters": [
+ {
+ "id": 81111,
+ "first_name": "Samuel",
+ "last_name": "Skateboard",
+ "name": "Samuel Skateboard",
+ "employee_id": "34531",
+ "responsible": false
+ },
+ {
+ "id": 153448,
+ "first_name": "Stegosaurus",
+ "last_name": "Heels",
+ "name": "Stegosaurus Heels",
+ "employee_id": "45748",
+ "responsible": true
+ }
+ ],
+ "coordinators": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327",
+ "responsible": true
+ },
+ {
+ "id": 177046,
+ "first_name": "Mirandella",
+ "last_name": "Lager",
+ "name": "Mirandella Lager",
+ "employee_id": "43626",
+ "responsible": false
+ }
+ ],
+ "sourcers": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327"
+ }
+ ]
+ },
+ "openings": [
+ {
+ "id": 123,
+ "opening_id": "3-1",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.736Z",
+ "closed_at": "2017-11-20T23:14:14.736Z",
+ "application_id": 45678,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ }
+ },
+ {
+ "id": 124,
+ "opening_id": "3-2",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.739Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ {
+ "id": 125,
+ "opening_id": null,
+ "status": "open",
+ "opened_at": "2016-02-03T20:00:00.000Z",
+ "closed_at": null,
+ "application_id": null
+ },
+ {
+ "id": 126,
+ "opening_id": "2-4",
+ "status": "closed",
+ "opened_at": "2016-02-03T16:38:46.985Z",
+ "closed_at": "2016-02-03T16:39:09.811Z",
+ "application_id": 1232,
+ "close_reason": {
+ "id": 689,
+ "name": "Hired"
+ }
+ }
+ ]
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/jobs/{id}`
+
+### URL Parameters
+
+| Parameter | Description |
+| --------- | ----------------------------- |
+| id | The ID of the job to retrieve |
+
+
+[See noteworthy response attributes.](#the-job-object)
+
+## PATCH: Update Job
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/jobs/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "name": "New job name",
+ "requisition_id": "1",
+ "notes": "Here are some notes",
+ "team_and_responsibilities": "Info",
+ "how_to_sell_this_job": "the snacks",
+ "office_ids": [1556],
+ "external_office_ids": ["office-1"],
+ "department_id": 74,
+ "external_department_id": "dept-1",
+ "custom_fields": [
+ {
+ "id": 1234,
+ "value": "Some new value"
+ },
+ {
+ "name_key": "salary_range",
+ "min_value": 100000,
+ "max_value": 150000,
+ "unit": "USD"
+ },
+ {
+ "id": 5678,
+ "delete_value": "true"
+ }
+ ]
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 6404,
+ "name": "New job name",
+ "requisition_id": "1",
+ "notes": "Here are some notes",
+ "confidential": false,
+ "status": "closed",
+ "created_at": "2013-12-10T14:42:58Z",
+ "opened_at": "2013-12-11T14:42:58Z",
+ "closed_at": "2013-12-12T14:42:58Z",
+ "updated_at": "2013-12-12T14:42:58Z",
+ "is_template": false,
+ "copied_from_id": 2345,
+ "departments": [
+ {
+ "id": 74,
+ "name": "Second-Level department",
+ "parent_id": 25908,
+ "child_ids": [14510],
+ "external_id": "dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 1556,
+ "name": "San Francisco",
+ "location": {
+ "name": "San Francisco, United States"
+ },
+ "primary_contact_user_id": 150893,
+ "parent_id": 50849,
+ "child_ids": [50852, 50891],
+ "external_id": "office-1"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k",
+ "salary_range": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "Full-Time"
+ },
+ "salary_range": {
+ "name": "Salary Range",
+ "type": "currency_range",
+ "value": {
+ "min_value": 70000,
+ "max_value": 90000,
+ "unit": "USD"
+ }
+ }
+ },
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "id": 84275,
+ "first_name": "Kaylee",
+ "last_name": "Prime",
+ "name": "Kaylee Prime",
+ "employee_id": "13636"
+ },
+ {
+ "id": 169779,
+ "first_name": "Hank",
+ "last_name": "Hollandaise",
+ "name": "Hank Hollandaise",
+ "employee_id": "34537"
+ }
+ ],
+ "recruiters": [
+ {
+ "id": 81111,
+ "first_name": "Samuel",
+ "last_name": "Skateboard",
+ "name": "Samuel Skateboard",
+ "employee_id": "34531",
+ "responsible": false
+ },
+ {
+ "id": 153448,
+ "first_name": "Stegosaurus",
+ "last_name": "Heels",
+ "name": "Stegosaurus Heels",
+ "employee_id": "45748",
+ "responsible": true
+ }
+ ],
+ "coordinators": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327",
+ "responsible": true
+ },
+ {
+ "id": 177046,
+ "first_name": "Mirandella",
+ "last_name": "Lager",
+ "name": "Mirandella Lager",
+ "employee_id": "43626",
+ "responsible": false
+ }
+ ],
+ "sourcers": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327"
+ }
+ ]
+ },
+ "openings": [
+ {
+ "id": 123,
+ "opening_id": "3-1",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.736Z",
+ "closed_at": "2017-11-20T23:14:14.736Z",
+ "application_id": 45678,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ },
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 124,
+ "opening_id": "3-2",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.739Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null,
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 125,
+ "opening_id": null,
+ "status": "open",
+ "opened_at": "2016-02-03T20:00:00.000Z",
+ "closed_at": null,
+ "application_id": null,
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 126,
+ "opening_id": "2-4",
+ "status": "closed",
+ "opened_at": "2016-02-03T16:38:46.985Z",
+ "closed_at": "2016-02-03T16:39:09.811Z",
+ "application_id": 1232,
+ "close_reason": {
+ "id": 689,
+ "name": "Hired"
+ },
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ }
+ ]
+}
+```
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/jobs/{id}`
+
+### Headers
+
+| Header | Description |
+| ------------ | -------------------------------------------------------------------- |
+| On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes. |
+
+### URL Parameters
+
+| Parameter | Description |
+| --------- | ----------------------------- |
+| id | The ID of the job to retrieve |
+
+### JSON Body Parameters
+
+| Parameter | Required | Type | Description |
+| ------------------------- | -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| name | No | string | The job's name |
+| notes | No | string | Notes on the hiring plan |
+| anywhere | No | boolean | Boolean value indicating where the job can be done anywhere |
+| requisition_id\* | No | string | The id of the requisition corresponding to this job posting, if applicable |
+| team_and_responsibilities | No | string | A description of the team the candidate would join and their responsibilities |
+| how_to_sell_this_job | No | string | A description for the recruiter of the desirable aspects of the job |
+| custom_fields | No | custom_field | Array of hashes containing new custom field values. Passing an empty array does nothing. |
+| office_ids | No | Array | Replace the current offices for this job with new offices. If your organization requires at least one office, trying to set this to blank will return an error. |
+| external_office_ids | No | Array | This may be used instead of office_ids and represents the ID of the office in an external system. If this is used, office_id must be blank and vice versa. |
+| department_id\* | No | number | Replace the current department for this job with a different department. |
+| external_department_id\* | No | string | This may be used instead of department_id and represents the ID of the department in an external system. If used, department_id must be blank and vice versa. |
+
+- - Updates to these fields may re-trigger approvals. For approvals to start recruiting, this will reset approvals only if the job is in draft mode. If the job is open for hiring, these approvals will not reset. For official job approvals, this will reset approvals only if the job is open.
+
+### Custom Field Parameters
+
+The custom field parameter structure is different in the PATCH method than in GET methods and responses. Certain type of custom fields require different elements to be included, while deleting a field requires a specific argument. What follows is the description of each item in a custom field element and what is required depending on the type.
+
+| Parameter | Required for | Description |
+| ------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| id | all | The custom field id for this particular custom field. One of this or name_key is required. |
+| name_key | all | The field key for this custom field. This can be found in Greenhouse while editing custom options as "Immutable Field Key" This or id is required for all custom field elements. |
+| value | all | The value field contains the new custom field value. In most cases this will be a string or a number. In the case of single-select or multi-select custom fields, this will be a custom field option id or an array of custom field option ids, respectively. In the case of user custom fields, this will be the Greenhouse user ID. Value is only not used for range type custom fields. |
+| min_value | number_range, currency range | This contains the minimum value that is allowable for this custom field. Must be less than max_value |
+| max_value | number_range, currency_range | This contains the maximum value that is allowable for this custom field. Must be greater than min_value |
+| unit | currency, currency_range | This contains the currency unit for a currency custom field. It is only required when updating a currency custom field. This should accept any 3-character currency code from the ISO-4217 standard. |
+| delete_value | n/a | When this element is included with a value of "true" (note, string true, not boolean true) the custom field value will be removed from Greenhouse. Note that updating a custom field value to nil or a blank string will not work, as validations require these to be non-blank values. |
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 112746,
+ "name": "new name",
+ "requisition_id": 2,
+ "notes": "Looking for the best!",
+ "confidential": false,
+ "status": "open",
+ "is_template": false,
+ "copied_from_id": 2345,
+ "created_at": "2015-09-10T19:01:46.078Z",
+ "opened_at": "2015-09-10T19:01:46.078Z",
+ "updated_at": "2018-12-12T14:42:58Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 74,
+ "name": "Guideshops",
+ "parent_id": null,
+ "child_ids": [],
+ "external_id": "EXTERNAL_ID_1234"
+ }
+ ],
+ "offices": [
+ {
+ "id": 1556,
+ "name": "San Diego",
+ "location": {
+ "name": "San Diego, CA, United States"
+ },
+ "primary_contact_user_id": 12345,
+ "parent_id": null,
+ "child_ids": [],
+ "external_id": "ABC456"
+ }
+ ],
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "id": 84275,
+ "first_name": "Kaylee",
+ "last_name": "Prime",
+ "name": "Kaylee Prime",
+ "employee_id": "13636"
+ },
+ {
+ "id": 169779,
+ "first_name": "Hank",
+ "last_name": "Hollandaise",
+ "name": "Hank Hollandaise",
+ "employee_id": "34537"
+ }
+ ],
+ "recruiters": [
+ {
+ "id": 81111,
+ "first_name": "Samuel",
+ "last_name": "Skateboard",
+ "name": "Samuel Skateboard",
+ "employee_id": "34531",
+ "responsible": false
+ },
+ {
+ "id": 153448,
+ "first_name": "Stegosaurus",
+ "last_name": "Heels",
+ "name": "Stegosaurus Heels",
+ "employee_id": "45748",
+ "responsible": true
+ }
+ ],
+ "coordinators": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327",
+ "responsible": true
+ },
+ {
+ "id": 177046,
+ "first_name": "Mirandella",
+ "last_name": "Lager",
+ "name": "Mirandella Lager",
+ "employee_id": "43626",
+ "responsible": false
+ }
+ ],
+ "sourcers": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327"
+ }
+ ]
+ },
+ "openings": [
+ {
+ "id": 123,
+ "opening_id": "3-1",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.736Z",
+ "closed_at": "2017-11-20T23:14:14.736Z",
+ "application_id": 45678,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ },
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 124,
+ "opening_id": "3-2",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.739Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null,
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 125,
+ "opening_id": null,
+ "status": "open",
+ "opened_at": "2016-02-03T20:00:00.000Z",
+ "closed_at": null,
+ "application_id": null,
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ },
+ {
+ "id": 126,
+ "opening_id": "2-4",
+ "status": "closed",
+ "opened_at": "2016-02-03T16:38:46.985Z",
+ "closed_at": "2016-02-03T16:39:09.811Z",
+ "application_id": 1232,
+ "close_reason": {
+ "id": 689,
+ "name": "Hired"
+ },
+ "custom_fields": {
+ "employment_type": "Full-Time",
+ "maximum_budget": "$81.5k"
+ },
+ "keyed_custom_fields": {
+ "employment_type": {
+ "name": "Time type",
+ "type": "single_select",
+ "value": "Full-Time"
+ },
+ "budget": {
+ "name": "Maximum Budget",
+ "type": "short_text",
+ "value": "$81.5k"
+ }
+ }
+ }
+ ]
+}
+```
+
+
+[See noteworthy response attributes.](#the-job-object)
+
+## POST: Create Job
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/jobs'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "template_job_id": 12345,
+ "number_of_openings": 2,
+ "job_post_name": "External Name That Appears On Job Boards",
+ "job_name": "Internal Name That Appears On Hiring Plans",
+ "department_id": 123,
+ "office_ids": [234, 345],
+ "requisition_id": "abc-123",
+ "opening_ids": ["abc-123-1", "abc-123-2"]
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 112746,
+ "name": "Internal Name That Appears On Hiring Plans",
+ "requisition_id": "abc-123",
+ "notes": "Looking for the best!",
+ "confidential": false,
+ "status": "open",
+ "is_template": false,
+ "copied_from_id": 12345,
+ "created_at": "2015-09-10T19:01:46.078Z",
+ "opened_at": "2015-09-10T19:01:46.078Z",
+ "updated_at": "2015-09-10T19:01:46.078Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 123,
+ "name": "Guideshops",
+ "parent_id": null,
+ "child_ids": [52461, 34065, 25908],
+ "external_id": "EXTERNAL_ID_1234"
+ }
+ ],
+ "offices": [
+ {
+ "id": 234,
+ "name": "San Diego",
+ "location": {
+ "name": "San Diego, CA, United States"
+ },
+ "primary_contact_user_id": 25463,
+ "parent_id": 50850,
+ "child_ids": [24719],
+ "external_id": "abc13425"
+ },
+ {
+ "id": 345,
+ "name": "New York",
+ "location": {
+ "name": "New York, NY, United States"
+ },
+ "parent_id": null,
+ "child_ids": [],
+ "external_id": "13432"
+ }
+ ],
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "id": 84275,
+ "first_name": "Kaylee",
+ "last_name": "Prime",
+ "name": "Kaylee Prime",
+ "employee_id": "13636"
+ },
+ {
+ "id": 169779,
+ "first_name": "Hank",
+ "last_name": "Hollandaise",
+ "name": "Hank Hollandaise",
+ "employee_id": "34537"
+ }
+ ],
+ "recruiters": [
+ {
+ "id": 81111,
+ "first_name": "Samuel",
+ "last_name": "Skateboard",
+ "name": "Samuel Skateboard",
+ "employee_id": "34531",
+ "responsible": false
+ },
+ {
+ "id": 153448,
+ "first_name": "Stegosaurus",
+ "last_name": "Heels",
+ "name": "Stegosaurus Heels",
+ "employee_id": "45748",
+ "responsible": true
+ }
+ ],
+ "coordinators": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327",
+ "responsible": true
+ },
+ {
+ "id": 177046,
+ "first_name": "Mirandella",
+ "last_name": "Lager",
+ "name": "Mirandella Lager",
+ "employee_id": "43626",
+ "responsible": false
+ }
+ ],
+ "sourcers": [
+ {
+ "id": 122635,
+ "first_name": "Teddy",
+ "last_name": "Pizzazz",
+ "name": "Teddy Pizzazz",
+ "employee_id": "47327"
+ }
+ ]
+ },
+ "openings": [
+ {
+ "id": 123,
+ "opening_id": "3-1",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.736Z",
+ "closed_at": "2017-11-20T23:14:14.736Z",
+ "application_id": 45678,
+ "close_reason": {
+ "id": 678,
+ "name": "Hired - Backfill"
+ }
+ },
+ {
+ "id": 124,
+ "opening_id": "3-2",
+ "status": "open",
+ "opened_at": "2015-11-20T23:14:14.739Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ {
+ "id": 125,
+ "opening_id": null,
+ "status": "open",
+ "opened_at": "2016-02-03T20:00:00.000Z",
+ "closed_at": null,
+ "application_id": null
+ },
+ {
+ "id": 126,
+ "opening_id": "2-4",
+ "status": "closed",
+ "opened_at": "2016-02-03T16:38:46.985Z",
+ "closed_at": "2016-02-03T16:39:09.811Z",
+ "application_id": 1232,
+ "close_reason": {
+ "id": 689,
+ "name": "Hired"
+ }
+ }
+ ]
+}
+```
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/jobs`
+
+### Headers
+
+| Header | Description |
+| ------------ | -------------------------------------------------------------------- |
+| On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes. |
+
+### JSON Body Parameters
+
+| Parameter | Required | Type | Description |
+| ---------------------- | -------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| template_job_id | Yes | Number | This is the job we will use to generate the new job. The new job will receive most of the settings of the template job. The On-Behalf-Of user must have access to this job. |
+| number_of_openings | Yes | Number | The number of openings that will be created for this job. |
+| job_post_name | No | String | This will be the name on the new job post. If this is not included, the job post names in the base job will be copied. |
+| job_name | No | String | This is the internal name of the new job. If this is not included, the name of the new job will be "Copy Of (the template job's name)" |
+| department_id | No | Number | The department of the new job. This should be a department id from the Departments endpoint. If this element is omitted, the new job will receive the department of the template job. If this element is included but blank, it will create the job with no departments. If the organization requires jobs to have a department, this case will return a 422 response. |
+| external_department_id | No | String | This may be used instead of department_id and represents the ID of the department in an external system. If this is used, department_id must be blank and vice versa. |
+| office_ids | No | Array[Numbers] | The offices of the new job. These should be office ids from the Offices endpoint. If this element is omitted, the new job will receive the offices of the template job. If this element is included but blank, it will create the job with no offices. If the organization requires jobs to have an office, this case will return a 422 response. |
+| external_office_ids | No | Array[Srings] | This may be used instead of office_ids and represents the IDs of the offices in an external system. If this is used, office_ids must be blank and vice versa. |
+| requisition_id | No | String | A requisition id for this job. |
+| opening_ids | No | Array[Strings] | An array of opening ids for the new job. If this is included, the number of opening ids in this array must match the number_of_openings element. |
+
+## GET: Hiring Team
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/jobs/{id}/hiring_team'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "hiring_managers": [
+ { "user_id": 11, "active": true },
+ { "user_id": 12, "active": false }
+ ],
+ "recruiters": [
+ { "user_id": 13, "active": false, "responsible": false },
+ { "user_id": 14, "active": true, "responsible": false },
+ { "user_id": 15, "active": true, "responsible": true }
+ ],
+ "coordinators": [
+ { "user_id": 16, "active": false, "responsible": false },
+ { "user_id": 17, "active": true, "responsible": false },
+ { "user_id": 18, "active": true, "responsible": true }
+ ],
+ "sourcers": [
+ { "user_id": 19, "active": true },
+ { "user_id": 20, "active": false }
+ ]
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/jobs/{id}/hiring_team`
+
+### URL Parameters
+
+| Parameter | Description |
+| --------- | ----------------------------- |
+| id | The ID of the job to retrieve |
+
+### Notable Response Parameters
+
+| Parameter | Type | Description |
+| ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| active | boolean | This flag informs you if the user still has access to the job in question. In the case where a former hiring team member loses permission to the job, that member may still have historical information related to the job so the relationship is maintained. |
+| responsible | boolean | This flag only exists for recruiters or coordinators and tells you if the team member has been designated as the "responsible" member for future candidates on the job. This is analogous to the "responsible_for_future_candidates" field on the PUT hiring team endpoint. It is unrelated to active or inactive candidates, which trigger an in the moment migration and are not stored on the hiring team. |
+
+
+
+## PUT: Replace Hiring Team
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/jobs/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "hiring_managers": [
+ {
+ "user_id": 1234
+ },
+ {
+ "user_id": 2345
+ }
+ ],
+ "sourcers": [
+ {
+ "user_id": 3456
+ },
+ {
+ "user_id": 4567
+ }
+ ],
+ "recruiters": [
+ {
+ "user_id": 5678,
+ "responsible_for_future_candidates": true,
+ "responsible_for_active_candidates": true,
+ "responsible_for_inactive_candidates": true
+ },
+ {
+ "user_id": 6789,
+ "responsible_for_future_candidates": false,
+ "responsible_for_active_candidates": false,
+ "responsible_for_inactive_candidates": false
+ }
+ ],
+ "coordinators": [
+ {
+ "user_id": 7890,
+ "responsible_for_future_candidates": true,
+ "responsible_for_active_candidates": false,
+ "responsible_for_inactive_candidates": false
+ },
+ {
+ "user_id": 8901,
+ "responsible_for_future_candidates": false,
+ "responsible_for_active_candidates": false,
+ "responsible_for_inactive_candidates": false
+ }
+ ]
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "success": true
+}
+```
+
+### HTTP Request
+
+`PUT https://harvest.greenhouse.io/v1/jobs/{id}/hiring_team`
+
+### JSON Body Parameters
+
+There are four types of hiring team members, represented by the four hashes sent in the JSON body. If any of these types are not included, hiring team members of that type will not be changed. If an empty list is provided for any of the four types, all users will be removed.
+
+Note that this PUT method REPLACES the existing members of the hiring team. For each element included in the JSON request body, the existing hiring team members in Greenhouse will be removed and replaced with the current members. _This includes the removal of disabled and inactive users, who can never be re-added._ For more granular control over additions and removals, use the POST or DELETE methods on this endpoint. Also, this process is transactional: if there is one failure, no elements will be updated. Finally, if you have a Hiring Team Updated webhook configured, you will receive one webhook notification per element, so you may receive up to four webhook notifications when this endpoint is used.
+
+| Parameter | Required | Type | Description |
+| ----------------------------------- | -------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------- |
+| responsible_for_future_candidates | Yes for coordinator or recruiter | boolean | The user becomes the responsible person for all new candidates. Only one user in the group of users may be designated as responsible. |
+| responsible_for_active_candidates | Yes for coordinator or recruiter | boolean | The user becomes the responsible person for all existing candidates with active applications |
+| responsible_for_inactive_candidates | Yes for coordinator or recruiter | boolean | The user becomes the responsible person for all hired and rejected candidates |
+
+On success, this will return a 200 response code with a success message in the JSON body.
+
+## POST: Add Hiring Team Members
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/jobs/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "hiring_managers": [
+ {
+ "user_id": 1234
+ },
+ {
+ "user_id": 2345
+ }
+ ],
+ "sourcers": [
+ {
+ "user_id": 3456
+ },
+ {
+ "user_id": 4567
+ }
+ ],
+ "recruiters": [
+ {
+ "user_id": 5678,
+ "responsible_for_future_candidates": true,
+ "responsible_for_active_candidates": true,
+ "responsible_for_inactive_candidates": true
+ },
+ {
+ "user_id": 6789,
+ "responsible_for_future_candidates": false,
+ "responsible_for_active_candidates": false,
+ "responsible_for_inactive_candidates": false
+ }
+ ],
+ "coordinators": [
+ {
+ "user_id": 7890,
+ "responsible_for_future_candidates": true,
+ "responsible_for_active_candidates": false,
+ "responsible_for_inactive_candidates": false
+ },
+ {
+ "user_id": 8901,
+ "responsible_for_future_candidates": false,
+ "responsible_for_active_candidates": false,
+ "responsible_for_inactive_candidates": false
+ }
+ ]
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "success": true
+}
+```
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/jobs/{id}/hiring_team`
+
+### JSON Body Parameters
+
+This method adds new hiring team members. If a user is designated as "responsible_for_future_candidates" and a responsible user already exists, the new user will become the responsible user and the old user will no longer be responsible. This endpoint is transactional, if any items fail to add, the entire request will fail and no changes will be made. Finally, if you have a Hiring Team Updated webhook configured, you will receive one webhook notification per element, so you may receive up to four webhook notifications when this endpoint is used.
+
+| Parameter | Required | Type | Description |
+| ----------------------------------- | -------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------- |
+| responsible_for_future_candidates | Yes for coordinator or recruiter | boolean | The user becomes the responsible person for all new candidates. Only one user in the group of users may be designated as responsible. |
+| responsible_for_active_candidates | Yes for coordinator or recruiter | boolean | The user becomes the responsible person for all existing candidates with active applications |
+| responsible_for_inactive_candidates | Yes for coordinator or recruiter | boolean | The user becomes the responsible person for all hired and rejected candidates |
+
+On success, this will return a 200 response code with a success message in the JSON body.
+
+## DELETE: Remove Hiring Team Member
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/jobs/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "hiring_managers": [1234, 2345],
+ "sourcers": [3456, 4567],
+ "recruiters": [5678, 6789],
+ "coordinators": [7890, 8901]
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "success": true
+}
+```
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/jobs/{id}/hiring_team`
+
+### JSON Body Parameters
+
+This method removes hiring team members with the designated user ids from the designated type. If a user id is provided that does not exist in the hiring team of that type, it will be ignored and no error will be raised. Disabled and inactive users can be removed with this endpoint, but you will be unable to re-add them. If you have a Hiring Team Updated webhook configured, you will receive one webhook notification per element, so you may receive up to four webhook notifications when this endpoint is used.
+
+On success, this will return a 200 response code with a success message in the JSON body.
diff --git a/source/includes/harvest/_offers.md b/source/includes/harvest/_offers.md
new file mode 100644
index 00000000000..8ded0ef3bbd
--- /dev/null
+++ b/source/includes/harvest/_offers.md
@@ -0,0 +1,699 @@
+# Offers
+
+## The offer object
+
+An organization's offers.
+
+```json
+{
+ "id": 1142785,
+ "version": 1,
+ "application_id": 91081818,
+ "job_id": 84593,
+ "candidate_id": 7328851,
+ "opening": {
+ "id": 2586842,
+ "opening_id": "4-7",
+ "status": "open",
+ "opened_at": "2019-05-22T20:58:51.697Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ "created_at": "2018-06-06T20:23:10.378Z",
+ "updated_at": "2018-06-06T20:23:43.388Z",
+ "sent_at": "2018-06-07",
+ "resolved_at": "2018-06-06T20:23:43.387Z",
+ "starts_at": "2018-07-20",
+ "status": "accepted",
+ "custom_fields": {
+ "employment_type": "Contractor",
+ "favorite_station": "The Swan",
+ "best_seasons": null,
+ "start_date": "2004-09-21",
+ "willing_to_negotiate": null,
+ "salary": "Around $100k",
+ "notes": "This is a note field"
+ },
+ "keyed_custom_fields": {
+ "time_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Contractor"
+ },
+ "favorite_station": {
+ "name": "Favorite Station",
+ "type": "single_select",
+ "value": "The Swan"
+ },
+ "best_seasons": {
+ "name": "Best seasons",
+ "type": "multi_select",
+ "value": null
+ },
+ "start_date": {
+ "name": "Start Date",
+ "type": "date",
+ "value": "2004-09-21"
+ },
+ "will_negotiate": {
+ "name": "Willing to negotiate",
+ "type": "yes_no",
+ "value": null
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "short_text",
+ "value": "Around $100k"
+ },
+ "notes": {
+ "name": "Notes",
+ "type": "long_text",
+ "value": "This is a note field"
+ }
+ }
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The offer's unique identifier |
+| version | The version number of this offer. When an existing offer is updated, a new one is typically created with an incremented version.
+| application_id | The ID of the associated [application](#applications).
+| created_at | Date whe this offer was created.
+| resolved_at | Date when this offer was resolved (e.g. when it was accepted, rejected).
+| sent_at | Date when this offer was sent to the candidate.
+| starts_at | Date when the candidate starts. This is the date value entered in the default Start Date field on candidate's Offer Details. This is the first field on their Offer Details, above the custom fields.
+| status | One of: `unresolved`, `accepted`, `rejected`, `deprecated`.
+| custom_fields | Contains a hash of the custom fields configured for this resource. The properties in this hash reflect the active custom fields as of the time this method is called.
+| keyed_custom_fields | This contains the same information as custom_fields but formatted in a different way that includes more information. This will tell you the type of custom field data to expect, the text name of custom field, and the value. The key of this hash is the custom field's immutable field key, which will not change even if the name of the custom field is changed in Greenhouse.
+| opening | The [Job Opening](#job-openings) associated with the offer. `null` if none.
+
+## GET: List Offers
+
+All offers made by an organization ordered by application_id.
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/offers'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 1142785,
+ "version": 1,
+ "application_id": 91081818,
+ "job_id": 84593,
+ "candidate_id": 7328851,
+ "opening": {
+ "id": 2586842,
+ "opening_id": "4-7",
+ "status": "open",
+ "opened_at": "2019-05-22T20:58:51.697Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ "created_at": "2018-06-06T20:23:10.378Z",
+ "updated_at": "2018-06-06T20:23:43.388Z",
+ "sent_at": "2018-06-07",
+ "resolved_at": "2018-06-06T20:23:43.387Z",
+ "starts_at": "2018-07-20",
+ "status": "accepted",
+ "custom_fields": {
+ "employment_type": "Contractor",
+ "favorite_station": "The Swan",
+ "best_seasons": null,
+ "start_date": "2004-09-21",
+ "willing_to_negotiate": null,
+ "salary": "Around $100k",
+ "notes": "This is a note field"
+ },
+ "keyed_custom_fields": {
+ "time_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Contractor"
+ },
+ "favorite_station": {
+ "name": "Favorite Station",
+ "type": "single_select",
+ "value": "The Swan"
+ },
+ "best_seasons": {
+ "name": "Best seasons",
+ "type": "multi_select",
+ "value": null
+ },
+ "start_date": {
+ "name": "Start Date",
+ "type": "date",
+ "value": "2004-09-21"
+ },
+ "will_negotiate": {
+ "name": "Willing to negotiate",
+ "type": "yes_no",
+ "value": null
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "short_text",
+ "value": "Around $100k"
+ },
+ "notes": {
+ "name": "Notes",
+ "type": "long_text",
+ "value": "This is a note field"
+ }
+ }
+},
+ {
+ "id": 1142765,
+ "version": 1,
+ "application_id": 91078894,
+ "job_id": 837749,
+ "candidate_id": 7327285,
+ "opening": null,
+ "created_at": "2018-06-06T20:21:15.639Z",
+ "updated_at": "2018-06-06T20:21:29.796Z",
+ "sent_at": null,
+ "resolved_at": null,
+ "starts_at": "2018-06-30",
+ "status": "deprecated",
+ "custom_fields": {
+ "employment_type": "Part-Time",
+ "favorite_station": "The Looking Glass",
+ "best_seasons": ["Season 1", "Season 2"],
+ "start_date": "2014-05-01",
+ "willing_to_negotiate": true,
+ "salary": {
+ "value": 42000,
+ "currency": "EUR"
+ },
+ "notes": "Very excited to start working with this candidate"
+ },
+ "keyed_custom_fields": {
+ "time_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Part-Time"
+ },
+ "favorite_station": {
+ "name": "Favorite Station",
+ "type": "single_select",
+ "value": "The Looking Glass"
+ },
+ "best_seasons": {
+ "name": "Best seasons",
+ "type": "multi_select",
+ "value": ["Season 1", "Season 2"]
+ },
+ "start_date": {
+ "name": "Start Date",
+ "type": "date",
+ "value": "2014-05-01"
+ },
+ "will_negotiate": {
+ "name": "Willing to negotiate",
+ "type": "yes_no",
+ "value": true
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "currency",
+ "value": {
+ "value": 42000,
+ "currency": "EUR"
+ }
+ },
+ "notes": {
+ "name": "Notes",
+ "type": "long_text",
+ "value": "Very excited to start working with this candidate"
+ }
+ }
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/offers`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving offers will improve. This will remove `last` from the `link` response header.
+| created_before | Return only offers that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only offers that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only offers that were updated at or before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only offers that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| resolved_after | Return only offers that were resolved at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| resolved_before | Return only offers that were resolved at or before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| status | Return only offers that have a particular status. One of: `unresolved`, `accepted`, `rejected`, `deprecated`.
+| sent_after | Return only offers that have been sent on or after the provided date. Date must be in YYYY-MM-DD format.
+| sent_before | Return only offers that have been sent on or before the provided date. Date must be in YYYY-MM-DD format.
+| starts_after | Return only offers whose start date has been set to on or after the provided date. Date must be in YYYY-MM-DD format.
+| starts_before | Return only offers whose start date has been set to on or before the provided date. Date must be in the YYYY-MM-DD format.
+
+
+[See noteworthy response attributes.](#the-offer-object)
+
+
+## GET: List Offers for Application
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/applications/{application_id}/offers'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 1142785,
+ "version": 1,
+ "application_id": 91078894,
+ "job_id": 837749,
+ "candidate_id": 7327285,
+ "opening": {
+ "id": 2586842,
+ "opening_id": "4-7",
+ "status": "open",
+ "opened_at": "2019-05-22T20:58:51.697Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ "created_at": "2018-06-06T20:23:10.378Z",
+ "updated_at": "2018-06-06T20:23:43.388Z",
+ "sent_at": "2018-06-07",
+ "resolved_at": "2018-06-06T20:23:43.387Z",
+ "starts_at": "2018-07-20",
+ "status": "accepted",
+ "custom_fields": {
+ "employment_type": "Contractor",
+ "favorite_station": "The Swan",
+ "best_seasons": null,
+ "start_date": "2004-09-21",
+ "willing_to_negotiate": null,
+ "salary": "Around $100k",
+ "notes": "This is a note field"
+ },
+ "keyed_custom_fields": {
+ "time_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Contractor"
+ },
+ "favorite_station": {
+ "name": "Favorite Station",
+ "type": "single_select",
+ "value": "The Swan"
+ },
+ "best_seasons": {
+ "name": "Best seasons",
+ "type": "multi_select",
+ "value": null
+ },
+ "start_date": {
+ "name": "Start Date",
+ "type": "date",
+ "value": "2004-09-21"
+ },
+ "will_negotiate": {
+ "name": "Willing to negotiate",
+ "type": "yes_no",
+ "value": null
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "short_text",
+ "value": "Around $100k"
+ },
+ "notes": {
+ "name": "Notes",
+ "type": "long_text",
+ "value": "This is a note field"
+ }
+ }
+},
+ {
+ "id": 1142765,
+ "version": 1,
+ "application_id": 91078894,
+ "job_id": 837749,
+ "candidate_id": 7327285,
+ "opening": null,
+ "created_at": "2018-06-06T20:21:15.639Z",
+ "updated_at": "2018-06-06T20:21:29.796Z",
+ "sent_at": null,
+ "resolved_at": null,
+ "starts_at": "2018-06-30",
+ "status": "deprecated",
+ "custom_fields": {
+ "employment_type": "Part-Time",
+ "favorite_station": "The Looking Glass",
+ "best_seasons": ["Season 1", "Season 2"],
+ "start_date": "2014-05-01",
+ "willing_to_negotiate": true,
+ "salary": {
+ "value": 42000,
+ "currency": "EUR"
+ },
+ "notes": "Very excited to start working with this candidate"
+ },
+ "keyed_custom_fields": {
+ "time_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Part-Time"
+ },
+ "favorite_station": {
+ "name": "Favorite Station",
+ "type": "single_select",
+ "value": "The Looking Glass"
+ },
+ "best_seasons": {
+ "name": "Best seasons",
+ "type": "multi_select",
+ "value": ["Season 1", "Season 2"]
+ },
+ "start_date": {
+ "name": "Start Date",
+ "type": "date",
+ "value": "2014-05-01"
+ },
+ "will_negotiate": {
+ "name": "Willing to negotiate",
+ "type": "yes_no",
+ "value": true
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "currency",
+ "value": {
+ "value": 42000,
+ "currency": "EUR"
+ }
+ },
+ "notes": {
+ "name": "Notes",
+ "type": "long_text",
+ "value": "Very excited to start working with this candidate"
+ }
+ }
+ }
+]
+```
+
+List the offers associated with an application. Greenhouse keeps offer history as updates are made over time.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications/{application_id}/offers`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+application_id | ID of the application whose offers you want to retrieve
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving application offers will improve. This will remove `last` from the `link` response header.
+
+
+[See noteworthy response attributes.](#the-offer-object)
+
+
+## GET: Retrieve Current Offer for Application
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/applications/{application_id}/offers/current_offer'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "id": 1142768,
+ "version": 2,
+ "application_id": 91078894,
+ "job_id": 837749,
+ "candidate_id": 7327285,
+ "opening": {
+ "id": 2586842,
+ "opening_id": "4-7",
+ "status": "open",
+ "opened_at": "2019-05-22T20:58:51.697Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ "created_at": "2018-06-06T20:21:29.911Z",
+ "updated_at": "2018-06-06T20:24:30.707Z",
+ "sent_at": "2018-06-06",
+ "resolved_at": null,
+ "starts_at": "2018-06-30",
+ "status": "unresolved",
+ "custom_fields": {
+ "employment_type": "Contractor",
+ "favorite_station": "The Swan",
+ "best_seasons": null,
+ "start_date": null,
+ "willing_to_negotiate": null,
+ "salary": "$123,000",
+ "notes": "This is a note field"
+ },
+ "keyed_custom_fields": {
+ "time_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Contractor"
+ },
+ "favorite_station": {
+ "name": "Favorite Station",
+ "type": "single_select",
+ "value": "The Swan"
+ },
+ "best_seasons": {
+ "name": "Best seasons",
+ "type": "multi_select",
+ "value": null
+ },
+ "start_date": {
+ "name": "Start Date",
+ "type": "date",
+ "value": null
+ },
+ "will_negotiate": {
+ "name": "Willing to negotiate",
+ "type": "yes_no",
+ "value": null
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "currency",
+ "value": "$123,000"
+ },
+ "notes": {
+ "name": "Notes",
+ "type": "long_text",
+ "value": "This is a note field"
+ }
+ }
+}
+```
+
+Fetch the current offer for an application.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications/{application_id}/offers/current_offer`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+application_id | ID of the application whose current offer you want to retrieve
+
+
+[See noteworthy response attributes.](#the-offer-object)
+
+## GET: Retrieve Offer
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/offers/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "id": 1142785,
+ "version": 1,
+ "application_id": 91081818,
+ "job_id": 84593,
+ "candidate_id": 7328851,
+ "opening": {
+ "id": 2586842,
+ "opening_id": "4-7",
+ "status": "open",
+ "opened_at": "2019-05-22T20:58:51.697Z",
+ "closed_at": null,
+ "application_id": null,
+ "close_reason": null
+ },
+ "created_at": "2018-06-06T20:23:10.378Z",
+ "updated_at": "2018-06-06T20:23:43.388Z",
+ "sent_at": "2018-06-07",
+ "resolved_at": "2018-06-06T20:23:43.387Z",
+ "starts_at": "2018-07-20",
+ "status": "accepted",
+ "custom_fields": {
+ "employment_type": "Contractor",
+ "favorite_station": "The Swan",
+ "best_seasons": null,
+ "start_date": "2004-09-21",
+ "willing_to_negotiate": null,
+ "salary": "Around $100k",
+ "notes": "This is a note field"
+ },
+ "keyed_custom_fields": {
+ "time_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Contractor"
+ },
+ "favorite_station": {
+ "name": "Favorite Station",
+ "type": "single_select",
+ "value": "The Swan"
+ },
+ "best_seasons": {
+ "name": "Best seasons",
+ "type": "multi_select",
+ "value": null
+ },
+ "start_date": {
+ "name": "Start Date",
+ "type": "date",
+ "value": "2004-09-21"
+ },
+ "will_negotiate": {
+ "name": "Willing to negotiate",
+ "type": "yes_no",
+ "value": null
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "short_text",
+ "value": "Around $100k"
+ },
+ "notes": {
+ "name": "Notes",
+ "type": "long_text",
+ "value": "This is a note field"
+ }
+ }
+}
+```
+
+Retrieve an offer by its ID.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/offers/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of the offer to retrieve
+
+
+[See noteworthy response attributes.](#the-offer-object)
+
+## PATCH: Update Current Offer
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/applications/{id}/offers/current_offer'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "start_date": "2018-03-15",
+ "sent_at": "2018-06-27",
+ "created_at": "2017-09-29T12:56:05Z",
+ "custom_fields": [
+ {
+ "id": 1234,
+ "value": "Some new value"
+ },
+ {
+ "name_key": "single_select_field_name",
+ "value": 12345
+ },
+ {
+ "id": 5678,
+ "delete_value": "true"
+ }
+ ]
+}
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "success": true
+}
+```
+
+Update the current offer on the given application. The response will only tell you if the update succeeded.
+
+**Note**: You can't update offers on hired candidates.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/applications/{id}/offers/current_offer`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Description
+--------- | ----------- | -----------
+start_date | No | The day the candidate will start. A date string, formatted like "YYYY-MM-DD". For compatibility, this will also accept an ISO timestamp, but the time will be ignored.
+sent_at | No | The date the offer is sent. A date string, formatted like "YYYY-MM-DD". For compatibility, this will also accept an ISO timestamp, but the time will be ignored.
+created_at | No | The date the offer was created. An ISO time-string formatted like "YYYY-MM-DDTHH:MM:SSZ"
+custom_fields[] | No | Array of hashes containing new custom field values. Passing an empty array does nothing.
+
+### Custom Field Parameters
+
+The custom field parameter structure is different in the PATCH method then in GET methods and responses. Certain types of custom fields require different elements to be included, while deleting a field requires a specific argument. What follows is the description of each item in a custom field element and what is required depending on the type.
+
+Parameter | Required for | Description
+---------- | -------------- | ----------------
+id | all | The custom field id for this particular custom field. One of this or name_key is required.
+name_key | all | The field key for this custom field. This can be found in Greenhouse while editing custom options as "Immutable Field Key" This or id is required for all custom field elements.
+value | all | The value field contains the new custom field value. In most cases this will be a string or a number. In the case of single-select or multi-select custom fields, this will be a custom field option id or an array of custom field option ids, respectively. In the case of single-select fields, this can also be a string that matches an existing option value name exactly.
+unit | currency | This contains the currency unit for a currency custom field. It is only required when updating a currency custom field. This should accept any 3-character currency code from the ISO-4217 standard.
+delete_value | n/a | When this element is included with a value of "true" (note, string true, not boolean true) the custom field value will be removed from Greenhouse. Note that updating a custom field value to nil or a blank string will not work, as validations require these to be non-blank values.
diff --git a/source/includes/harvest/_offices.md b/source/includes/harvest/_offices.md
new file mode 100644
index 00000000000..7d649677e51
--- /dev/null
+++ b/source/includes/harvest/_offices.md
@@ -0,0 +1,440 @@
+# Offices
+
+## The office object
+
+An organization’s offices.
+
+> With `render_as=list` (default)
+
+```json
+{
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 485538,
+ "parent_id": 50849,
+ "parent_office_external_id": "parent-1",
+ "child_ids": [
+ 50891,
+ 50852
+ ],
+ "child_office_external_ids": [
+ "child-1",
+ "child-2"
+ ],
+ "external_id": "12345"
+}
+```
+
+> With `render_as=tree`
+
+```json
+{
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 485538,
+ "external_id": "12345",
+ "children": [
+ {
+ "id": 50891,
+ "name": "Utica",
+ "location": {
+ "name": "Utica, New York, United States"
+ },
+ "primary_contact_user_id": 336474,
+ "external_id": "45647",
+ "children": []
+ },
+ {
+ "id": 50852,
+ "name": "New York City",
+ "location": {
+ "name": "New York, New York, United States"
+ },
+ "primary_contact_user_id": 676259,
+ "external_id": "67890",
+ "children": []
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The office's unique identifier |
+| name | The office's name |
+| location | The office's location |
+| external_id | An arbitrary ID provided by an external source; does not map to another entity in Greenhouse.
+| parent_office_external_id | The external_id of this office's parent.
+| parent_office_child_ids | the external_ids of this office's children. Note the order of this array may not match the order of the child_ids array. If there are five children and none of them have parent ids, this array will contain five null indices.
+
+## GET: List Offices
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/offices'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+> With `render_as=list` (default)
+
+```json
+[
+ {
+ "id": 50891,
+ "name": "Utica",
+ "location": {
+ "name": "Utica, New York, United States"
+ },
+ "primary_contact_user_id": 336474,
+ "parent_id": 47012,
+ "parent_office_external_id": "parent-1",
+ "child_ids": [],
+ "child_office_external_ids": [],
+ "external_id": "45647"
+ },
+ {
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 485538,
+ "parent_id": 50849,
+ "parent_office_external_id": "parent-2",
+ "child_ids": [
+ 50891,
+ 50852
+ ],
+ "child_office_external_ids": [
+ "child-office-1",
+ ""
+ ],
+ "external_id": "12345"
+ },
+ {
+ "id": 50852,
+ "name": "New York City",
+ "location": {
+ "name": "New York, New York, United States"
+ },
+ "primary_contact_user_id": 676259,
+ "parent_id": 47012,
+ "parent_office_external_id": "parent-1",
+ "child_ids": [],
+ "child_office_external_ids": [],
+ "external_id": "67890"
+ }
+]
+```
+
+> With `render_as=tree`
+
+```json
+[
+ {
+ "id": 50891,
+ "name": "Utica",
+ "location": {
+ "name": "Utica, New York, United States"
+ },
+ "primary_contact_user_id": 336474,
+ "external_id": "45647",
+ "children": [
+ {
+ "id": 12345,
+ "name": "Child-office-1",
+ "location": {
+ "name": "Rome, New York, United States"
+ },
+ "primary_contact_user_id": 95313,
+ "external_id": "Rome-NY",
+ "children": [
+ {
+ "id": 54321,
+ "name": "Child-office-1-2",
+ "location": {
+ "name": "Syracuse, New York, United States"
+ },
+ "primary_contact_user_id": 95313,
+ "external_id": "Syracuse-NY",
+ "children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 50852,
+ "name": "New York",
+ "location": {
+ "name": "New York City, New York, United States"
+ },
+ "primary_contact_user_id": 5659415,
+ "external_id": "NYC-123",
+ "children": [
+ {
+ "id": 4020460005,
+ "name": "Child-office-2",
+ "location": {
+ "name": "New York City, New York, United States"
+ },
+ "primary_contact_user_id": 567863,
+ "external_id": "Manhattan",
+ "children": []
+ }
+ ]
+ }
+]
+```
+
+List all of an organization's offices.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/offices`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving offices will improve. This will remove `last` from the `link` response header.
+| render_as | This parameter defines how to represent the list of offices. The default value is 'list', which returns a flat list of offices. If this is set to 'tree', offices are represented in a tree-like structure where they may include sub-offices as `children`
+| external_id | If supplied, only return office(s) with that external ID.
+
+
+[See noteworthy response attributes.] (#the-office-object)
+
+
+## GET: Retrieve Office
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/offices/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 485538,
+ "parent_id": 50849,
+ "parent_office_external_id": "parent-1",
+ "child_ids": [
+ 50891,
+ 50852
+ ],
+ "child_office_external_ids": [
+ "child-office-1",
+ ""
+ ],
+ "external_id": "12345"
+}
+```
+
+> With `render_as=tree`
+
+```json
+{
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 485538,
+ "external_id": "12345",
+ "children": [
+ {
+ "id": 50891,
+ "name": "Utica",
+ "location": {
+ "name": "Utica, New York, United States"
+ },
+ "primary_contact_user_id": 336474,
+ "external_id": "45647",
+ "children": []
+ },
+ {
+ "id": 50852,
+ "name": "New York City",
+ "location": {
+ "name": "New York, New York, United States"
+ },
+ "primary_contact_user_id": 676259,
+ "external_id": "67890",
+ "children": []
+ }
+ ]
+}
+```
+
+Retrieve an office by its ID.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/offices/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the office to retrieve
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| render_as | This parameter defines how to represent the list of offices. The default value is 'list', which returns a flat list of offices. If this is set to 'tree', offices are represented in a tree-like structure where they may include sub-offices as `children`
+
+
+[See noteworthy response attributes.] (#the-office-object)
+
+## PATCH: Edit Office
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/offices/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```
+{
+ "name": "Research and Development",
+ "location": "New York, NY",
+ "external_id": "1234567890"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 50891,
+ "name": "Utica",
+ "location": {
+ "name": "Utica, New York, United States"
+ },
+ "primary_contact_user_id": 336474,
+ "parent_id": 47012,
+ "parent_office_external_id": "parent-1",
+ "child_ids": [],
+ "child_office_external_id": [],
+ "external_id": "45647"
+}
+```
+
+Edit an office’s basic information.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/offices/{id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+name | Yes | string | The office’s name. If included, this cannot be blank.
+location | No | string | The office’s location.
+external_id* | No | string | The office’s external ID. If included, this must be unique to this office within the organization.
+
+\* - If the external id feature is not enabled for your organization, attempting to edit this field will raise an API Error.
+
+
+## POST: Add Office
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/offices'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "name": "Brooklyn",
+ "parent_id": 47012,
+ "primary_contact_user_id": 336474,
+ "location": "Brooklyn, NY"
+}
+
+or
+
+{
+ "name": "Brooklyn",
+ "external_parent_id": "parent-1",
+ "primary_contact_user_id": 336474,
+ "location": "Brooklyn, NY"
+}
+
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 58028,
+ "name": "Brooklyn",
+ "location": {
+ "name": "Brooklyn, NY"
+ },
+ "primary_contact_user_id": 336474,
+ "parent_id": 47012,
+ "parent_office_external_id": "parent-1",
+ "child_ids": [],
+ "child_office_external_id": [],
+ "external_id": null
+}
+```
+
+Create a new office
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/offices`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes. Must be a user who can create offices.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | ----------- | -----------
+`name` | yes | string | The name of your new office. Must be less than 255 characters and unique within your organization.
+`location` | no | string | This is a text representation of the office's location. This is free-form text. It is not geo-located.
+`primary_contact_user_id` | no | number | The id of the user who will be the primary in-house contact for this office. This user must be a site-admin.
+`parent_id`* | no | number | The office id for the new office to be nested under. If this isn't included, the office will be created at the top level.
+`external_parent_id`** | no | string | The external id for the parent office. This can be used instead of parent_id, but only one of this or parent_id may be included. If both are included, this will fail.
+`external_id`** | no | string | The external_id for the office.
+
+\* - The tiered office feature is available only for customers with the Advanced or Expert Greenhouse Recruiting package. Use of this field will return an error for other Greenhouse Recruiting customers.
+
+\** - The external_id feature is available only for customers with the Expert Greenhouse Recruiting package. Use of this field will return an error for other Greenhouse Recruiting customers.
diff --git a/source/includes/harvest/_prospect_pools.md b/source/includes/harvest/_prospect_pools.md
new file mode 100644
index 00000000000..c1de7f4e399
--- /dev/null
+++ b/source/includes/harvest/_prospect_pools.md
@@ -0,0 +1,153 @@
+# Prospect Pools
+
+## The prospect pools object
+
+An organization's prospect pools.
+
+```json
+{
+ "id": 25,
+ "name": "Cold Outreach: Sourced",
+ "active": true,
+ "prospect_stages": [
+ {
+ "id": 85,
+ "name": "Discussed"
+ },
+ {
+ "id": 86,
+ "name": "Had email listed on their blog"
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The pool's unique identifier |
+| active | true or false. False means the pool is hidden from view in Greenhouse.
+
+## GET: List Prospect Pools
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/prospect_pools'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+[
+ {
+ "id": 25,
+ "name": "Cold Outreach: Sourced",
+ "active": true,
+ "prospect_stages": [
+ {
+ "id": 85,
+ "name": "Discussed"
+ },
+ {
+ "id": 86,
+ "name": "Had email listed on their business card"
+ },
+ {
+ "id": 87,
+ "name": "Had email listed on their blog"
+ },
+ {
+ "id": 88,
+ "name": "Not Contacted"
+ }
+ ]
+ },
+ {
+ "id": 26,
+ "name": "Opted In: Referral",
+ "active": false,
+ "prospect_stages": [
+ {
+ "id": 90,
+ "name": "1st. Follow Up Sent"
+ },
+ {
+ "id": 91,
+ "name": "2nd Follow Up Sent"
+ },
+ {
+ "id": 92,
+ "name": "In Discussion"
+ },
+ {
+ "id": 93,
+ "name": "Discussed"
+ },
+ {
+ "id": 94,
+ "name": "Had email listed on their github profile"
+ }
+ ]
+ }
+]
+```
+
+List all of an organization's prospect pools.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/prospect_pools`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving prospect pools will improve. This will remove `last` from the `link` response header.
+
+
+[See noteworthy response attributes.](#the-prospect-pool-object)
+
+
+## GET: Retrieve Prospect Pool
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/prospect_pools/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 25,
+ "name": "Cold Outreach: Sourced",
+ "active": true,
+ "prospect_stages": [
+ {
+ "id": 85,
+ "name": "Discussed"
+ },
+ {
+ "id": 86,
+ "name": "Had email listed on their blog"
+ }
+ ]
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/prospect_pools/{id}`
+
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the prospect pool to retrieve
+
+
+[See noteworthy response attributes.](#the-prospect-pool-object)
\ No newline at end of file
diff --git a/source/includes/harvest/_rejection_reasons.md b/source/includes/harvest/_rejection_reasons.md
new file mode 100644
index 00000000000..72778c12a75
--- /dev/null
+++ b/source/includes/harvest/_rejection_reasons.md
@@ -0,0 +1,80 @@
+# Rejection Reasons
+
+## The rejection reason object
+
+Represents rejection reasons configured by an organization under the Custom Options section of Greenhouse.
+
+```json
+{
+ "id": 262,
+ "name": "Missing resume",
+ "type": {
+ "id": 1,
+ "name": "We rejected them"
+ }
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The rejection reason's unique identifier
+| name | The rejection reason's name
+| type | An object containing the type ID and the rejection reason type, which will be one of "We rejected them", "They rejected us", and "None Specified". Note that type IDs may vary across organizations.
+
+## GET: List Rejection Reasons
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/rejection_reasons'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 262,
+ "name": "Missing resume",
+ "type": {
+ "id": 1,
+ "name": "We rejected them"
+ }
+ },
+ {
+ "id": 280,
+ "name": "Not in NYC",
+ "type": {
+ "id": 1,
+ "name": "We rejected them"
+ }
+ },
+ {
+ "id": 230,
+ "name": "Hiring Freeze",
+ "type": {
+ "id": 2,
+ "name": "None specified"
+ }
+ }
+]
+```
+
+List all of an organization's rejection reasons.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/rejection_reasons`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving rejection reasons will improve. This will remove `last` from the `link` response header.
+| include_defaults | When included and set to true, this will also return Greenhouse's default rejection reasons which are included automatically in each account.
+
+
+[See noteworthy response attributes.] (#the-rejection-reason-object)
diff --git a/source/includes/harvest/_scheduled_interviews.md b/source/includes/harvest/_scheduled_interviews.md
new file mode 100644
index 00000000000..52fef7a2734
--- /dev/null
+++ b/source/includes/harvest/_scheduled_interviews.md
@@ -0,0 +1,579 @@
+# Scheduled Interviews
+
+## The Scheduled Interview object
+
+Interviews that have been scheduled for the specified application. Note that all-day interviews will have a start and end date with no specified time.
+
+```json
+{
+ "id": 9128481,
+ "application_id": 4684156,
+ "external_event_id": "event123",
+ "start": {
+ "date_time": "2014-03-26T22:15:00.000Z"
+ },
+ "end": {
+ "date_time": "2014-03-26T22:30:00.000Z"
+ },
+ "location": "Big Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "awaiting_feedback",
+ "created_at": "2016-02-10T14:31:51.019Z",
+ "updated_at": "2016-05-23T20:43:11.679Z",
+ "interview": {
+ "id": 7001,
+ "name": "Culture Fit"
+ },
+ "organizer": {
+ "id": 2000,
+ "first_name": "Jack",
+ "last_name": "Shepard",
+ "name": "Jack Shepard",
+ "employee_id": "12345"
+ },
+ "interviewers": [
+ {
+ "id": 4080,
+ "employee_id": "employee123",
+ "name": "Kate Austen",
+ "email": "kate.austen@example.com",
+ "response_status": "needs_action",
+ "scorecard_id": 11274
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|------------------------|-------------|
+| id | The scheduled interview's unique identifier
+| start | A date_time value if this interview has a precise start time, or a date value if this is an all-day event.
+| end | A date_time value if this interview has a precise start time, or a date value if this is an all-day event.
+| location | The location of the interview.
+| video_conferencing_url | The URL used for video interviews, such as Zoom, Google Meets, or Microsoft Teams.
+| status | One of: `scheduled`, `awaiting_feedback`, `complete`
+| organizer | The [user](#users) who is the organizer for this interview
+| interviewers | An array containing the [users](#users) who have interviews with this candidate, including, if applicable, the ID of the scorecard they completed. This object will also contain the interviewer's `response_status` which indicates how they've responded to the interview invitation (one of `needs_action`, `declined`, `tentative`, or `accepted`).
+
+## GET: List Scheduled Interviews
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/scheduled_interviews'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+
+[
+ {
+ "id": 9128481,
+ "application_id": 4684156,
+ "external_event_id": "event123",
+ "start": {
+ "date_time": "2014-03-26T22:15:00.000Z"
+ },
+ "end": {
+ "date_time": "2014-03-26T22:30:00.000Z"
+ },
+ "location": "Big Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "awaiting_feedback",
+ "created_at": "2016-02-10T14:31:51.019Z",
+ "updated_at": "2016-05-23T20:43:11.679Z",
+ "interview": {
+ "id": 7001,
+ "name": "Culture Fit"
+ },
+ "organizer": {
+ "id": 2000,
+ "first_name": "Jack",
+ "last_name": "Shepard",
+ "name": "Jack Shepard",
+ "employee_id": "12345"
+ },
+ "interviewers": [
+ {
+ "id": 4080,
+ "employee_id": "employee123",
+ "name": "Kate Austen",
+ "email": "kate.austen@example.com",
+ "response_status": "needs_action",
+ "scorecard_id": 11274
+ }
+ ]
+ },
+ {
+ "id": 9128482,
+ "application_id": 432905,
+ "external_event_id": "event456",
+ "start": {
+ "date": "2017-08-22"
+ },
+ "end": {
+ "date": "2017-08-23"
+ },
+ "location": "Small Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "complete",
+ "interview": {
+ "id": 7002,
+ "name": "Whiteboarding Challenge"
+ },
+ "organizer": {
+ "id": 2000,
+ "first_name": "Jack",
+ "last_name": "Shepard",
+ "name": "Jack Shepard",
+ "employee_id": "12345"
+ },
+ "interviewers": [
+ {
+ "id": 3412,
+ "employee_id": "employee456",
+ "name": "Charlie Pace",
+ "email": "youalleverybody@example.com",
+ "response_status": "needs_action",
+ "scorecard_id": null
+ }
+ ]
+ }
+]
+```
+
+List all of an organization's scheduled interviews.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/scheduled_interviews`
+
+### Optional querystring Parameters
+
+Timestamps must be in in [ISO-8601](#general-considerations) format.
+
+Parameter | Description
+--------- | -----------
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving scheduled interviews will improve. This will remove `last` from the `link` response header.
+| created_before | Only return scheduled interviews that were created before this timestamp.
+| created_after | Only return scheduled interviews that were created at or after this timestamp.
+| updated_before | Only return scheduled interviews that were updated before this timestamp.
+| updated_after | Only return scheduled interviews that were updated at or after this timestamp.
+| starts_before | Only return scheduled interviews scheduled to start before this timestamp.
+| starts_after | Only return scheduled interviews scheduled to start at or after this timestamp.
+| ends_before | Only return scheduled interviews scheduled to end before this timestamp.
+| ends_after | Only return scheduled interviews scheduled to end at or after this timestamp.
+| external_event_id | Only return the scheduled interview that has the specified `external_event_id`.
+| actionable | Only certain scheduled interviews can be updated/deleted. They must have been created through Harvest, have a status of "scheduled" or "awaiting feedback," and belong to an active application. When set to true, this filter will return only scheduled interviews that meet those criteria.
+
+
+## GET: List Scheduled Interviews for Application
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/applications/{id}/scheduled_interviews'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 9128481,
+ "application_id": 4684156,
+ "external_event_id": "event123",
+ "start": {
+ "date_time": "2014-03-26T22:15:00.000Z"
+ },
+ "end": {
+ "date_time": "2014-03-26T22:30:00.000Z"
+ },
+ "location": "Big Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "awaiting_feedback",
+ "created_at": "2016-02-10T14:31:51.019Z",
+ "updated_at": "2016-05-23T20:43:11.679Z",
+ "interview": {
+ "id": 7001,
+ "name": "Culture Fit"
+ },
+ "organizer": {
+ "id": 2000,
+ "first_name": "Jack",
+ "last_name": "Shepard",
+ "name": "Jack Shepard",
+ "employee_id": "12345"
+ },
+ "interviewers": [
+ {
+ "id": 4080,
+ "employee_id": "employee123",
+ "name": "Kate Austen",
+ "email": "kate.austen@example.com",
+ "response_status": "needs_action",
+ "scorecard_id": 11274
+ }
+ ]
+ },
+ {
+ "id": 9128482,
+ "application_id": 4684156,
+ "external_event_id": "event456",
+ "start": {
+ "date": "2017-08-22"
+ },
+ "end": {
+ "date": "2017-08-23"
+ },
+ "location": "Small Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "complete",
+ "interview": {
+ "id": 7002,
+ "name": "Whiteboarding Challenge"
+ },
+ "organizer": {
+ "id": 2000,
+ "first_name": "Jack",
+ "last_name": "Shepard",
+ "name": "Jack Shepard",
+ "employee_id": "12345"
+ },
+ "interviewers": [
+ {
+ "id": 3412,
+ "employee_id": "employee456",
+ "name": "Charlie Pace",
+ "email": "youalleverybody@example.com",
+ "response_status": "needs_action",
+ "scorecard_id": null
+ }
+ ]
+ }
+]
+```
+
+Interviews that have been scheduled for this application.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications/{id}/scheduled_interviews`
+
+### Querystring Parameters
+
+Parameter | Description
+--------- | -----------
+| id | ID of the application to retrieve
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving application scheduled interviews will improve. This will remove `last` from the `link` response header.
+| created_before | Return only scheduled interviews that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only scheduled interviews that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only scheduled interviews that were updated before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only scheduled interviews that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| external_event_id | Only return the scheduled interview that has the specified `external_event_id`.
+| actionable | Only certain scheduled interviews can be updated/deleted. They must have been created through Harvest, have a status of "scheduled" or "awaiting feedback," and belong to an active application. When set to true, this filter will return only scheduled interviews that meet those criteria.
+
+
+[See noteworthy response attributes.] (#the-scheduled-interview-object)
+
+## GET: Retrieve Scheduled Interview
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/scheduled_interviews/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "id": 9128481,
+ "application_id": 4684156,
+ "external_event_id": "event123",
+ "start": {
+ "date_time": "2014-03-26T22:15:00.000Z"
+ },
+ "end": {
+ "date_time": "2014-03-26T22:30:00.000Z"
+ },
+ "location": "Big Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "awaiting_feedback",
+ "created_at": "2016-02-10T14:31:51.019Z",
+ "updated_at": "2016-05-23T20:43:11.679Z",
+ "interview": {
+ "id": 7001,
+ "name": "Culture Fit"
+ },
+ "organizer": {
+ "id": 2000,
+ "first_name": "Jack",
+ "last_name": "Shepard",
+ "name": "Jack Shepard",
+ "employee_id": "12345"
+ },
+ "interviewers": [
+ {
+ "id": 4080,
+ "employee_id": "employee123",
+ "name": "Kate Austen",
+ "email": "kate.austen@example.com",
+ "response_status": "needs_action",
+ "scorecard_id": 11274
+ }
+ ]
+}
+```
+
+Retrieve an interview by its ID.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/scheduled_interviews/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the scheduled interview to retrieve
+
+## POST: Create Scheduled Interview
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/scheduled_interviews'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "application_id": 102717462,
+ "interview_id": 8055374,
+ "interviewers": [
+ { "user_id": 102361, "response_status": "accepted" },
+ { "email": "lucius.barbarossa.46444@example.com", "response_status": "declined" }
+ ],
+ "start": "2018-12-12T13:15:00Z",
+ "end": "2018-12-12T14:15:00Z",
+ "external_event_id": "external_event_id_1",
+ "location": "Big Conference Room"
+}
+```
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 109170954,
+ "application_id": 102717457,
+ "external_event_id": "external_event_id_1",
+ "start": {
+ "date_time": "2018-12-12T13:15:00.000Z"
+ },
+ "end": {
+ "date_time": "2018-12-12T14:15:00.000Z"
+ },
+ "location": "Big Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "scheduled",
+ "created_at": "2018-10-17T19:22:07.302Z",
+ "updated_at": "2018-12-03T20:45:14.320Z",
+ "interview": {
+ "id": 8055374,
+ "name": "Executive Interview"
+ },
+ "organizer": {
+ "id": 102361,
+ "first_name": "Champ",
+ "last_name": "Telluride",
+ "name": "Champ Telluride",
+ "employee_id": null
+ },
+ "interviewers": [
+ {
+ "id": 102361,
+ "employee_id": null,
+ "name": "Champ Telluride",
+ "email": "champ.telluride.102361@example.com",
+ "response_status": "accepted",
+ "scorecard_id": null
+ },
+ {
+ "id": 46444,
+ "employee_id": "AAA1",
+ "name": "Lucius Barbarossa",
+ "email": "lucius.barbarossa.46444@example.com",
+ "response_status": "declined",
+ "scorecard_id": null
+ }
+ ]
+}
+```
+
+Create a new Scheduled Interview.
+
+[See noteworthy response attributes.] (#the-scheduled-interview-object)
+
+### HTTP Request
+
+[DEPRECATED] ~~`POST https://harvest.greenhouse.io/v1/scheduled_interviews`~~
+
+`POST https://harvest.greenhouse.io/v2/scheduled_interviews`
+
+Greenhouse deprecated the V1 endpoint on April 5th, 2020. The V2 endpoint was released so the validations performed by Harvest matched the validations performed when creating an interview in the Greenhouse application. Specifically, Greenhouse allows the addition of users with e-mail addresses that do not match any users in the organization and users who do not otherwise have permission to see the job, both of which Harvest prevented. Changing the validations in this way was considered a breaking change and a second version of the endpoint was released. The V1 endpoint should not be used as it is no longer supported and will be removed in a future release.
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Will become the interview organizer. The user must have permission to manage the associcated application.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+application_id | Yes | integer | The id of the application for which we will scheduled an interview.
+interview_id | Yes | integer | The id of the interview we'd like to schedule. This id can be found in the [job stage object](#the-job-stage-object). It refers to an interview type (e.g. "Executive Interview" or "On-site Interview") that is associated with a hiring plan's interview step. This differs from a "Scheduled Interview" which refers to an instantiated interview that is associated with an application, interviewers, start time, etc.
+interviewers[] | Yes | interviewer | Array of interviewers. Each must specify a user by user_id, email, or employee_id. Each must include a response status (one of needs_action, declined, tentative, or accepted).
+start | Yes | string | A datetime specifying when the interview starts. Must be provided in [ISO-8601](#general-considerations) format (e.g. 2018-11-05T13:12:14Z).
+end | Yes | string | A datetime specifying when the interview ends. Must be provided in [ISO-8601](#general-considerations) format (e.g. 2018-11-05T13:12:14Z).
+external_event_id | Yes | string | A unique identifer for this interview.
+location| No | string | A textual description of the location of the interview.
+
+
+
+## PATCH: Update Scheduled Interview
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/scheduled_interviews/{id}'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "interviewers": [
+ { "user_id": 102361, "response_status": "needs_action" },
+ { "email": "lucius.barbarossa.46444@example.com", "response_status": "declined" }
+ ],
+ "start": "2018-11-12T13:15:00Z",
+ "end": "2018-11-12T14:15:00Z",
+ "external_event_id": "external_event_id_0",
+ "location": "Dunder Mifflin, Scranton"
+}
+```
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "id": 109170954,
+ "application_id": 102717457,
+ "external_event_id": "external_event_id_0",
+ "start": {
+ "date_time": "2018-12-12T13:15:00.000Z"
+ },
+ "end": {
+ "date_time": "2018-12-12T14:15:00.000Z"
+ },
+ "location": "Big Conference Room",
+ "video_conferencing_url": "http://example.com",
+ "status": "scheduled",
+ "created_at": "2018-10-17T19:22:07.302Z",
+ "updated_at": "2018-12-03T20:45:14.320Z",
+ "interview": {
+ "id": 8055374,
+ "name": "Executive Interview"
+ },
+ "organizer": {
+ "id": 102361,
+ "first_name": "Champ",
+ "last_name": "Telluride",
+ "name": "Champ Telluride",
+ "employee_id": null
+ },
+ "interviewers": [
+ {
+ "id": 102361,
+ "employee_id": null,
+ "name": "Champ Telluride",
+ "email": "champ.telluride.102361@example.com",
+ "response_status": "accepted",
+ "scorecard_id": null
+ },
+ {
+ "id": 46444,
+ "employee_id": "AAA1",
+ "name": "Lucius Barbarossa",
+ "email": "lucius.barbarossa.46444@example.com",
+ "response_status": "declined",
+ "scorecard_id": null
+ }
+ ]
+}
+```
+
+Update a Scheduled Interview. Note that only Scheduled Interviews created through Harvest can be updated. Additionally, you can
+only update Scheduled Interviews in the following statues: Scheduled, Awaiting Feedback.
+
+[See noteworthy response attributes.] (#the-scheduled-interview-object)
+
+### HTTP Request
+
+DEPRECATED ~~`PATCH https://harvest.greenhouse.io/v1/scheduled_interviews/{id}`~~
+
+`PATCH https://harvest.greenhouse.io/v2/scheduled_interviews/{id}`
+
+Greenhouse deprecated the V1 endpoint on April 5th, 2020. The V2 endpoint was released so the validations performed by Harvest matched the validations performed when updating an interview in the Greenhouse application. Specifically, Greenhouse allows the addition of users with e-mail addresses that do not match any users in the organization and users who do not otherwise have permission to see the job, both of which Harvest prevented. Changing the validations in this way was considered a breaking change and a second version of the endpoint was released. The V1 endpoint should not be used as it is no longer supported and will be removed in a future release.
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Will become the interview organizer. The user must have permission to manage the associated application.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+interviewers[] | No | interviewer | Array of interviewers. Each must specify a user by user_id, email, or employee_id. Each must include a response status (one of needs_action, declined, tentative, or accepted).
+start | No | string | A datetime specifying when the interview starts. Must be provided in [ISO-8601](#general-considerations) format (e.g. 2018-11-05T13:12:14Z).
+end | No | string | A datetime specifying when the interview ends. Must be provided in [ISO-8601](#general-considerations) format (e.g. 2018-11-05T13:12:14Z).
+external_event_id | No | string | A unique identifer for this interview.
+location| No | string | A textual description of the location of the interview.
+
+## Delete: Remove Scheduled Interview
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/scheduled_interviews/{id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above returns a JSON response, structured like this:
+
+```json
+{
+ "message": "Interview 109170954 has been deleted."
+}
+```
+
+Delete a Scheduled Interview by `id`. Note that only Scheduled Interviews created through harvest can be deleted. Additionally, you can
+only delete Scheduled Interviews in the following statues: Scheduled, Awaiting Feedback.
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/scheduled_interviews/{id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
\ No newline at end of file
diff --git a/source/includes/harvest/_scorecards.md b/source/includes/harvest/_scorecards.md
new file mode 100644
index 00000000000..e19f0880314
--- /dev/null
+++ b/source/includes/harvest/_scorecards.md
@@ -0,0 +1,772 @@
+# Scorecards
+
+All submitted scorecards ordered by candidate.
+
+## The scorecard object
+
+```json
+{
+ "id": 123,
+ "updated_at": "2016-08-22T19:52:38.384Z",
+ "created_at": "2016-08-22T19:52:38.384Z",
+ "interview": "Application Review",
+ "interview_step": {
+ "id": 432,
+ "name": "Application Review"
+ },
+ "candidate_id": 1234,
+ "application_id": 3456,
+ "interviewed_at": "2016-08-18T16:00:00.000Z",
+ "submitted_by": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "interviewer": {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ },
+ "submitted_at": "2014-03-26T21:59:51Z",
+ "overall_recommendation": "yes",
+ "attributes": [
+ {
+ "name": "Communication",
+ "type": "Skills",
+ "note": "What a great communicator!",
+ "rating": "yes"
+ },
+ {
+ "name": "Adaptable",
+ "type": "Skills",
+ "note": null,
+ "rating": "yes"
+ },
+ {
+ "name": "Relationship Manager",
+ "type": "Skills",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Project Management",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Problem Solver",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "no"
+ },
+ {
+ "name": "Analytical",
+ "type": "Skills",
+ "note": null,
+ "rating": "definitely_not"
+ }
+ ],
+ "ratings": {
+ "definitely_not": [
+ "Analytical"
+ ],
+ "no": [
+ "Problem Solver"
+ ],
+ "mixed": [
+ "Relationship Manager",
+ "Project Management"
+ ],
+ "yes": [
+ "Communication",
+ "Adaptable"
+ ],
+ "strong_yes": []
+ },
+ "questions": [
+ {
+ "id": null,
+ "question": "Key Take-Aways",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": null,
+ "question": "Private Notes",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": 1234567,
+ "question": "Does the candidate have experience designing APIs?",
+ "answer": "Yes"
+ },
+ {
+ "id": 1234568,
+ "question": "Which team would you suggest for this candidate?",
+ "answer": "Alpha Team"
+ },
+ {
+ "id": 1234569,
+ "question": "Where would the candidate be willing to work?",
+ "answer": "London, Dubai, San Diego"
+ }
+ ]
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The scorecard's unique identifier |
+| candidate_id | The ID of the [candidate](#candidates) whom this scorecard was written for.
+| submitted_by | The [user](#users) who submitted this scorecard. Note that this user may not necessarily be the the interviewer, since scorecards can be submitted on behalf of other users.
+| interviewer | The [user](#users) who interviewed the candidate.
+| overall_recommendation | One of: `definitely_not`, `no`, `yes`, `strong_yes`, `no_decision`
+| attributes | Array containing the attributes of the Scorecard. Describes each attribute's name, type, rating (can be "no_decision"), and an optional note.
+
+## GET: List Scorecards
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/scorecards'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 123,
+ "updated_at": "2016-08-22T19:52:38.384Z",
+ "created_at": "2016-08-22T19:52:38.384Z",
+ "interview": "Application Review",
+ "interview_step": {
+ "id": 432,
+ "name": "Application Review"
+ },
+ "candidate_id": 1234,
+ "application_id": 3456,
+ "interviewed_at": "2016-08-18T16:00:00.000Z",
+ "submitted_by": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "interviewer": {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ },
+ "submitted_at": "2014-03-26T21:59:51Z",
+ "overall_recommendation": "yes",
+ "attributes": [
+ {
+ "name": "Communication",
+ "type": "Skills",
+ "note": "What a great communicator!",
+ "rating": "yes"
+ },
+ {
+ "name": "Adaptable",
+ "type": "Skills",
+ "note": null,
+ "rating": "yes"
+ },
+ {
+ "name": "Relationship Manager",
+ "type": "Skills",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Project Management",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Problem Solver",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "no"
+ },
+ {
+ "name": "Analytical",
+ "type": "Skills",
+ "note": null,
+ "rating": "definitely_not"
+ }
+ ],
+ "ratings": {
+ "definitely_not": [
+ "Analytical"
+ ],
+ "no": [
+ "Problem Solver"
+ ],
+ "mixed": [
+ "Relationship Manager",
+ "Project Management"
+ ],
+ "yes": [
+ "Communication",
+ "Adaptable"
+ ],
+ "strong_yes": []
+ },
+ "questions": [
+ {
+ "id": null,
+ "question": "Key Take-Aways",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": null,
+ "question": "Private Notes",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": 1234567,
+ "question": "Does the candidate have experience designing APIs?",
+ "answer": "Yes"
+ },
+ {
+ "id": 1234568,
+ "question": "Which team would you suggest for this candidate?",
+ "answer": "Alpha Team"
+ },
+ {
+ "id": 1234569,
+ "question": "Where would the candidate be willing to work?",
+ "answer": "London, Dubai, San Diego"
+ }
+ ]
+ },
+ {
+ "id": 3414169,
+ "updated_at": "2016-01-08T19:07:08.295Z",
+ "created_at": "2016-01-08T19:07:08.295Z",
+ "interview": "Behavioral Phone Interview",
+ "interview_step": {
+ "id": 433,
+ "name": "Behavioral Phone Interview"
+ },
+ "candidate_id": 14271904,
+ "application_id": 23558552,
+ "interviewed_at": "2016-01-08T17:00:00.000Z",
+ "submitted_by": {
+ "id": 158104,
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "name": "Dane Doe",
+ "employee_id": "034509364"
+ },
+ "interviewer": {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ },
+ "submitted_at": "2016-01-08T19:07:08.295Z",
+ "overall_recommendation": "no",
+ "attributes": [
+ {
+ "name": "Communication",
+ "type": "Skills",
+ "note": "What a great communicator!",
+ "rating": "yes"
+ },
+ {
+ "name": "Adaptable",
+ "type": "Skills",
+ "note": null,
+ "rating": "yes"
+ },
+ {
+ "name": "Relationship Manager",
+ "type": "Skills",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Project Management",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Problem Solver",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "no"
+ },
+ {
+ "name": "Analytical",
+ "type": "Skills",
+ "note": null,
+ "rating": "definitely_not"
+ }
+ ],
+ "ratings": {
+ "definitely_not": [
+ "Analytical"
+ ],
+ "no": [
+ "Problem Solver"
+ ],
+ "mixed": [
+ "Relationship Manager",
+ "Project Management"
+ ],
+ "yes": [
+ "Communication",
+ "Adaptable"
+ ],
+ "strong_yes": []
+ },
+ "questions": [
+ {
+ "id": null,
+ "question": "Key Take-Aways",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": null,
+ "question": "Private Notes",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": 1234567,
+ "question": "Does the candidate have experience designing APIs?",
+ "answer": "Yes"
+ },
+ {
+ "id": 1234568,
+ "question": "Which team would you suggest for this candidate?",
+ "answer": "Alpha Team"
+ },
+ {
+ "id": 1234569,
+ "question": "Where would the candidate be willing to work?",
+ "answer": "London, Dubai, San Diego"
+ }
+ ]
+ }
+]
+```
+
+List all of an organization's scorecards.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/scorecards`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving scorecards will improve. This will remove `last` from the `link` response header.
+| created_before | Return only scorecards that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only scorecards that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only scorecards that were updated before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only scorecards that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+
+
+[See noteworthy response attributes.] (#the-scorecard-object)
+
+## GET: List Scorecards for Application
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/applications/{id}/scorecards'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 211231,
+ "updated_at": "2016-08-22T19:52:38.384Z",
+ "created_at": "2016-08-22T19:52:38.384Z",
+ "interview": "Application Review",
+ "interview_step": {
+ "id": 432,
+ "name": "Application Review"
+ },
+ "candidate_id": 2131415,
+ "application_id": 23558552,
+ "interviewed_at": "2016-08-18T16:00:00.000Z",
+ "submitted_by": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "interviewer": {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ },
+ "submitted_at": "2014-03-26T21:59:51Z",
+ "overall_recommendation": "yes",
+ "attributes": [
+ {
+ "name": "Communication",
+ "type": "Skills",
+ "note": "What a great communicator!",
+ "rating": "yes"
+ },
+ {
+ "name": "Adaptable",
+ "type": "Skills",
+ "note": null,
+ "rating": "yes"
+ },
+ {
+ "name": "Relationship Manager",
+ "type": "Skills",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Project Management",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Problem Solver",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "no"
+ },
+ {
+ "name": "Analytical",
+ "type": "Skills",
+ "note": null,
+ "rating": "definitely_not"
+ }
+ ],
+ "ratings": {
+ "definitely_not": [
+ "Analytical"
+ ],
+ "no": [
+ "Problem Solver"
+ ],
+ "mixed": [
+ "Relationship Manager",
+ "Project Management"
+ ],
+ "yes": [
+ "Communication",
+ "Adaptable"
+ ],
+ "strong_yes": []
+ },
+ "questions": [
+ {
+ "id": null,
+ "question": "Key Take-Aways",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": null,
+ "question": "Private Notes",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": 1234567,
+ "question": "Does the candidate have experience designing APIs?",
+ "answer": "Yes"
+ },
+ {
+ "id": 1234568,
+ "question": "Which team would you suggest for this candidate?",
+ "answer": "Alpha Team"
+ },
+ {
+ "id": 1234569,
+ "question": "Where would the candidate be willing to work?",
+ "answer": "London, Dubai, San Diego"
+ }
+ ]
+ },
+ {
+ "id": 3414169,
+ "updated_at": "2016-01-08T19:07:08.295Z",
+ "created_at": "2016-01-08T19:07:08.295Z",
+ "interview": "Behavioral Phone Interview",
+ "interview_step": {
+ "id": 433,
+ "name": "Behavioral Phone Interview"
+ },
+ "candidate_id": 14271904,
+ "application_id": 23558552,
+ "interviewed_at": "2016-01-08T17:00:00.000Z",
+ "submitted_by": {
+ "id": 158104,
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "name": "Dane Doe",
+ "employee_id": "034509364"
+ },
+ "interviewer": {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ },
+ "submitted_at": "2016-01-08T19:07:08.295Z",
+ "overall_recommendation": "no",
+ "attributes": [
+ {
+ "name": "Communication",
+ "type": "Skills",
+ "note": "What a great communicator!",
+ "rating": "yes"
+ },
+ {
+ "name": "Adaptable",
+ "type": "Skills",
+ "note": null,
+ "rating": "yes"
+ },
+ {
+ "name": "Relationship Manager",
+ "type": "Skills",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Project Management",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Problem Solver",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "no"
+ },
+ {
+ "name": "Analytical",
+ "type": "Skills",
+ "note": null,
+ "rating": "definitely_not"
+ }
+ ],
+ "ratings": {
+ "definitely_not": [
+ "Analytical"
+ ],
+ "no": [
+ "Problem Solver"
+ ],
+ "mixed": [
+ "Relationship Manager",
+ "Project Management"
+ ],
+ "yes": [
+ "Communication",
+ "Adaptable"
+ ],
+ "strong_yes": []
+ },
+ "questions": [
+ {
+ "id": null,
+ "question": "Key Take-Aways",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": null,
+ "question": "Private Notes",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": 1234567,
+ "question": "Does the candidate have experience designing APIs?",
+ "answer": "Yes"
+ },
+ {
+ "id": 1234568,
+ "question": "Which team would you suggest for this candidate?",
+ "answer": "Alpha Team"
+ },
+ {
+ "id": 1234569,
+ "question": "Where would the candidate be willing to work?",
+ "answer": "London, Dubai, San Diego"
+ }
+ ]
+ }
+]
+```
+
+List all submitted scorecards for the requested application.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/applications/{id}/scorecards`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | ID of application whose scorecards you want to retrieve.
+
+
+[See noteworthy response attributes.] (#the-scorecard-object)
+
+## GET: Retrieve Scorecard
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/scorecards/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 211231,
+ "updated_at": "2016-08-22T19:52:38.384Z",
+ "created_at": "2016-08-22T19:52:38.384Z",
+ "interview": "Application Review",
+ "interview_step": {
+ "id": 432,
+ "name": "Application Review"
+ },
+ "candidate_id": 2131415,
+ "application_id": 23558552,
+ "interviewed_at": "2016-08-18T16:00:00.000Z",
+ "submitted_by": {
+ "id": 4080,
+ "first_name": "Kate",
+ "last_name": "Austen",
+ "name": "Kate Austen",
+ "employee_id": "12345"
+ },
+ "interviewer": {
+ "id": 821,
+ "first_name": "Robert",
+ "last_name": "Robertson",
+ "name": "Robert Robertson",
+ "employee_id": "100377"
+ },
+ "submitted_at": "2014-03-26T21:59:51Z",
+ "overall_recommendation": "yes",
+ "attributes": [
+ {
+ "name": "Communication",
+ "type": "Skills",
+ "note": "What a great communicator!",
+ "rating": "yes"
+ },
+ {
+ "name": "Adaptable",
+ "type": "Skills",
+ "note": null,
+ "rating": "yes"
+ },
+ {
+ "name": "Relationship Manager",
+ "type": "Skills",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Project Management",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "mixed"
+ },
+ {
+ "name": "Problem Solver",
+ "type": "Qualifications",
+ "note": null,
+ "rating": "no"
+ },
+ {
+ "name": "Analytical",
+ "type": "Skills",
+ "note": null,
+ "rating": "definitely_not"
+ }
+ ],
+ "ratings": {
+ "definitely_not": [
+ "Analytical"
+ ],
+ "no": [
+ "Problem Solver"
+ ],
+ "mixed": [
+ "Relationship Manager",
+ "Project Management"
+ ],
+ "yes": [
+ "Communication",
+ "Adaptable"
+ ],
+ "strong_yes": []
+ },
+ "questions": [
+ {
+ "id": null,
+ "question": "Key Take-Aways",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": null,
+ "question": "Private Notes",
+ "answer": "Seems like a decent candidate."
+ },
+ {
+ "id": 1234567,
+ "question": "Does the candidate have experience designing APIs?",
+ "answer": "Yes"
+ },
+ {
+ "id": 1234568,
+ "question": "Which team would you suggest for this candidate?",
+ "answer": "Alpha Team"
+ },
+ {
+ "id": 1234569,
+ "question": "Where would the candidate be willing to work?",
+ "answer": "London, Dubai, San Diego"
+ }
+ ]
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/scorecards/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the scorecard to retrieve
+
+
+[See noteworthy response attributes.] (#the-scorecard-object)
diff --git a/source/includes/harvest/_sources.md b/source/includes/harvest/_sources.md
new file mode 100644
index 00000000000..e36c3a70703
--- /dev/null
+++ b/source/includes/harvest/_sources.md
@@ -0,0 +1,71 @@
+# Sources
+
+## The source object
+
+An organization's sources.
+
+```json
+{
+ "id": 632,
+ "name": "Other",
+ "type": {
+ "id": 5,
+ "name": "Prospecting"
+ }
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The source's unique identifier |
+| type.name | One of: `attend_events`, `referrals`, `third_party_boards`, `candidate_search`, `other`, `social_media`, `company_marketing`, `agencies`, `prospecting`
+
+## GET: List Sources
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/sources'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 632,
+ "name": "Other",
+ "type": {
+ "id": 5,
+ "name": "Prospecting"
+ }
+ },
+ {
+ "id": 928,
+ "name": "Destiny",
+ "type": {
+ "id": 7,
+ "name": "Supernatural Means"
+ }
+ }
+]
+```
+
+Lists an organization's sources, grouped by strategy.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/sources`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-------------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving sources will improve. This will remove `last` from the `link` response header.
+
+
+[See noteworthy response attributes.] (#the-source-object)
+
diff --git a/source/includes/harvest/_tags.md b/source/includes/harvest/_tags.md
new file mode 100644
index 00000000000..de164886427
--- /dev/null
+++ b/source/includes/harvest/_tags.md
@@ -0,0 +1,230 @@
+# Tags
+
+Some resource types allow tags to be assigned to them. Tags are useful for grouping resources. Currently, only candidates can be tagged from the Harvest API.
+
+## The candidate tag object
+
+```json
+{
+ "id": 230,
+ "name": "New York"
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The candidate tag's unique identifier |
+| name | The name of the tag |
+
+## GET: List Candidate Tags
+
+List all of an organization's candidate tags.
+
+```shell
+curl -X GET 'https://harvest.greenhouse.io/v1/tags/candidate'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 365,
+ "name": "Ruby"
+ },
+ {
+ "id": 366,
+ "name": "Rails"
+ },
+ {
+ "id": 367,
+ "name": "Junior"
+ }
+]
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/tags/candidate`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-------------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving candidate tags will improve. This will remove `last` from the `link` response header.
+
+
+
+[See noteworthy response attributes.](#the-candidate-tag-object)
+
+## POST: Add New Candidate Tag
+
+Add a new candidate tag to this organization
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/tags/candidate'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "name": "New tag name"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 123456,
+ "name": "New tag name"
+}
+```
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/tags/candidate`
+
+Name is required and case insensitive. If a tag is supplied that already exists in Greenhouse with any combination of casing, a 200 response code will be returned. If the tag does not exist in Greenhouse, a 201 response code will be returned. The JSON response structure will be the same regardless of the success response code.
+
+## DELETE: Destroy a candidate tag
+
+Removes a candidate tag from this organization
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/tags/candidate/{tag id}'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+### HTTP Request
+
+`DELETE 'https://harvest.greenhouse.io/v1/tags/candidate/{tag id}`
+
+This endpoint creates an asynchronous job to remove this tag from all candidates to whom it is applied before removing the tag itself from Greenhouse. This data cannot be recovered. Due to the number of candidates that may have any given tag, it may take up to 24 hours for this job to process completely. A success message from this endpoint only states a deletion job has been enqueued, not that the job has been completed.
+
+## GET: List tags applied to candidate
+
+```shell
+curl -X GET 'https://harvest.greenhouse.io/v1/candidates/{id}/tags'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+[
+ {
+ "id": 239759,
+ "name": "Don't have a job open for them now"
+ }
+]
+```
+
+Retrieve the list of tags applied to a given candidate
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/candidates/{id}/tags`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the candidate whose tags you want to retrieve
+
+
+
+[See noteworthy response attributes.](#the-candidate-tag-object)
+
+## DELETE: Remove tag from candidate
+
+```shell
+curl -X DELETE 'https://harvest.greenhouse.io/v1/candidates/{candidate_id}/tags/{tag_id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "message": "Tag 365 has been removed from candidate 29555013"
+}
+```
+
+Remove a tag from a candidate
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/candidates/{candidate_id}/tags/{tag_id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+candidate_id | The ID of the candidate to whom you want to apply the tag
+tag_id | The ID of the tag you wish to apply
+
+
+
+[See noteworthy response attributes.](#the-candidate-tag-object)
+
+### JSON Body Parameters
+
+No body parameters.
+
+## PUT: Add a candidate tag
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/candidates/{candidate_id}/tags/{tag_id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "message": "Tag 365, 'Ruby', has been applied to candidate 29555013"
+}
+```
+
+Apply a tag to a given candidate
+
+### HTTP Request
+
+`PUT https://harvest.greenhouse.io/v1/candidates/{candidate_id}/tags/{tag_id}`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+candidate_id | The ID of the candidate to whom you want to apply the tag
+tag_id | The ID of the tag you wish to apply
+
+
+
+[See noteworthy response attributes.](#the-candidate-tag-object)
+
+### JSON Body Parameters
+
+No body parameters.
diff --git a/source/includes/harvest/_tracking_links.md b/source/includes/harvest/_tracking_links.md
new file mode 100644
index 00000000000..f2097ce03e3
--- /dev/null
+++ b/source/includes/harvest/_tracking_links.md
@@ -0,0 +1,107 @@
+# Tracking Links
+
+Tracking Links are URLs which allow users to track the source and/or referrer of candidates who applied through the link. Greenhouse generates Tracking Links by appending a token to the end of a job post or job boad URL. These tokens represent a combination of source_id and/or referrer_id, and can link back to a job post, job board, or job.
+
+## The tracking link object
+
+```json
+{
+ "id": 6004841,
+ "token": "tnch4u",
+ "created_at": "2012-10-07T15:06:35.975Z",
+ "updated_at": "2016-09-27T17:52:56.533Z",
+ "related_post_id": 1,
+ "related_post_type": "SocialMediaPost",
+ "job_id": 12314,
+ "job_post_id": 124263,
+ "job_board": {
+ "id": 8578,
+ "company_name": "Business Corp",
+ "url_token": "businessco"
+ },
+ "source": {
+ "id": 4,
+ "public_name": "Twitter"
+ },
+ "credited_to": {
+ "id": 1,
+ "first_name": "Some",
+ "last_name": "Employee",
+ "name": "Some Employee",
+ "employee_id": "ABC12345"
+ }
+}
+```
+
+### Noteworthy attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The tracking link's unique identifier |
+| token | The token present in the url |
+| related_post_id | If there is an associated social media post, the Greenhouse ID for that post |
+| related_post_type | Will be "SocialMediaPost" if the link was posted through the social network sharing feature, otherwise this value will be `null` |
+| job_id | The job associated with this tracking link |
+| job_post_id | The job post associated with this tracking link |
+| job_board | The job board associated with this tracking link |
+| source | The source of the job (recruiter, social media site, etc) |
+| credited_to | The employee credited with a referral for this tracking link |
+
+## JSON Schema
+
+To view the JSON Schema definition for the Tracking Link object, please [click here](/schemas/tracking_links.json). This will tell you all of the valid types and definitions, as well as expected fields in the response.
+
+
+## GET: Tracking Link Data for Token
+
+Retrieve the specific tracking link data for the supplied token.
+
+```shell
+curl -X GET 'https://harvest.greenhouse.io/v1/tracking_links/{token}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 6004841,
+ "token": "tnch4u",
+ "created_at": "2012-10-07T15:06:35.975Z",
+ "updated_at": "2016-09-27T17:52:56.533Z",
+ "related_post_id": 1,
+ "related_post_type": "SocialMediaPost",
+ "job_id": 12314,
+ "job_post_id": 124263,
+ "job_board": {
+ "id": 8578,
+ "company_name": "Business Corp",
+ "url_token": "businessco"
+ },
+ "source": {
+ "id": 4,
+ "public_name": "Twitter"
+ },
+ "credited_to": {
+ "id": 1,
+ "first_name": "Some",
+ "last_name": "Employee",
+ "name": "Some Employee",
+ "employee_id": "ABC12345"
+ }
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/tracking_links/{token}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+token | The token you want to retrieve the data for
+
+
+
+[See noteworthy response attributes.](#the-tracking-link-object)
diff --git a/source/includes/harvest/_user_permissions.md b/source/includes/harvest/_user_permissions.md
new file mode 100644
index 00000000000..6072ea01441
--- /dev/null
+++ b/source/includes/harvest/_user_permissions.md
@@ -0,0 +1,354 @@
+# User Permissions
+
+## The job permission object
+
+The user role a user has for a job.
+
+```json
+{
+ "id": 382934,
+ "job_id": 9192,
+ "user_role_id": 123
+}
+```
+
+### Noteworthy Attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The job permission's unique identifier |
+| job_id | The ID of the job the user has permission for|
+| user\_role\_id | The ID of the user role the user has for the job|
+
+
+## GET: List Job Permissions
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/users/{id}/permissions/jobs'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 7879576,
+ "job_id": 80722,
+ "user_role_id": 4730
+ },
+ {
+ "id": 7879577,
+ "job_id": 83475,
+ "user_role_id": 4730
+ },
+ {
+ "id": 7879579,
+ "job_id": 146048,
+ "user_role_id": 4730
+ },
+ {
+ "id": 7879580,
+ "job_id": 87904,
+ "user_role_id": 4730
+ },
+ {
+ "id": 7879582,
+ "job_id": 116958,
+ "user_role_id": 4730
+ },
+ {
+ "id": 7879583,
+ "job_id": 82318,
+ "user_role_id": 4730
+ }
+]
+```
+
+List the job permissions for a given user.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/users/{id}/permissions/jobs`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the user whose job permissions to retrieve
+
+Note: This endpoint is only intended for use with Job Admin and/or Interviewer users, as these roles are assigned on a per job basis. Users that are Site Admins have permissions on all public jobs and will return an empty array. Basic users cannot be assigned to any jobs and will also return an empty array.
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## DELETE: Remove a Job Permission
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/users/{id}/permissions/jobs'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "job_permission_id": 27207466
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "message": "Job Permission 321231 has been deleted."
+}
+```
+
+Removes a user's job permission.
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/users/{id}/permissions/jobs`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+job\_permission\_id | Yes | integer | The ID of the job permission
+
+## PUT: Add a Job Permission
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/users/{id}/permissions/jobs'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "job_id": "150056",
+ "user_role_id": "16229"
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 42906871,
+ "job_id": 150056,
+ "user_role_id": 16229
+}
+```
+
+Creates a job permission with a specific user role for a given user.
+
+### HTTP Request
+
+`PUT https://harvest.greenhouse.io/v1/users/{id}/permissions/jobs`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+job_id | Yes | integer | The ID of the job
+user\_role\_id | Yes | integer | The ID of the user role
+
+Note: This endpoint does not support assigning a user role to a user for a confidential job.
+
+### Response
+
+Adding a job permission to a regular user returns status 201.
+Adding a job permission to a site admin user has no effect, and returns 204.
+
+## The future job permission object
+
+The user role a user will get when a job with the specified criteria is created.
+
+```json
+{
+ "id": 87819,
+ "office_id": 29192,
+ "external_office_id": "ex-office-1",
+ "department_id": 23425,
+ "external_department_id": "ex-dept-1",
+ "user_role_id": 4730
+}
+```
+
+### Noteworthy Attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The future job permission's unique identifier |
+| office_id | The ID of the office of the job |
+| external_office_id | The ID of the office in an external system. This is set by users and has no bearing on any other object in Greenhouse. If not set in Greenhouse, this will be null. |
+| department_id | The ID of the department of the job|
+| external_department_id | The ID of the department in an external system. This is set by users and has no bearing on any other object in Greenhouse. If not set in Greenhouse, this will be null. |
+| user\_role\_id | The ID of the user role that will be granted |
+
+
+## GET: List Future Job Permissions
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/users/{id}/permissions/future_jobs'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 87819,
+ "office_id": 24141,
+ "external_office_id": "ex-office-1",
+ "department_id": 12315,
+ "external_department_id": "ex-dept-1",
+ "user_role_id": 4730
+ },
+ {
+ "id": 92834,
+ "office_id": 8232,
+ "external_office_id": "ex-office-2",
+ "department_id": 12315,
+ "external_department_id": "ex-dept-2",
+ "user_role_id": 4730
+ },
+ {
+ "id": 82129,
+ "office_id": 8232,
+ "external_office_id": "ex-office-2",
+ "department_id": 92921,
+ "external_department_id": null,
+ "user_role_id": 4730
+ }
+]
+```
+
+List the permissions that will be granted to the user when a job is created in a particular Department/Office combination.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/users/{id}/permissions/future_jobs`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the user whose future job permissions to retrieve
+
+This endpoint supports pagination. See the [Pagination](#pagination) section for more detail.
+
+## DELETE: Remove a Future Job Permission
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/users/{id}/permissions/future_jobs'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "future_job_permission_id": 427600
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```
+{
+ "message": "Future Job Permission 639234 has been deleted."
+}
+```
+
+Removes a user's future job permission.
+
+### HTTP Request
+
+`DELETE https://harvest.greenhouse.io/v1/users/{id}/permissions/future_jobs`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+future\_job\_permission\_id | Yes | integer | The ID of the future job permission
+
+## PUT: Add a Future Job Permission
+
+```shell
+curl -X PUT 'https://harvest.greenhouse.io/v1/users/{id}/permissions/future_jobs'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "office_id": 58028,
+ "department_id": 45644,
+ "user_role_id": 7607
+}
+```
+
+> The above command returns a JSON response, structured like this:
+
+```
+{
+ "id": 9283,
+ "office_id": 281921,
+ "external_office_id": "ex-office-1",
+ "department_id": 61921,
+ "external_department_id": "ex-dept-1",
+ "user_role_id": 91821
+}
+```
+
+Creates a future job permission with a specific user role for a given user.
+
+### HTTP Request
+
+`PUT https://harvest.greenhouse.io/v1/users/{id}/permissions/future_jobs`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+office_id | No | integer | The ID of the office. Set to null to include all offices.
+external_office_id | No | string | An ID that represents the office in an external system. This may be used instead of office_id. If included, office_id must be blank, and vice versa.
+department_id | No | integer | The ID of the department. Set to null to include all departments.
+external_department_id | No | string | This may be used instead of department_id. If included, department_id must be blank, and vice versa.
+user\_role\_id | Yes | integer | The ID of the user role
+
+### Response
+
+Adding a future job permission to a regular user returns status 201.
+Adding a future job permission to a site admin user has no effect, and returns 204.
diff --git a/source/includes/harvest/_user_roles.md b/source/includes/harvest/_user_roles.md
new file mode 100644
index 00000000000..a2eb894814f
--- /dev/null
+++ b/source/includes/harvest/_user_roles.md
@@ -0,0 +1,54 @@
+# User Roles
+
+## The user role object
+
+The roles that can be assigned to a user.
+
+```json
+{
+ "id": 4729,
+ "type": "interviewer",
+ "name": "Interviewer"
+}
+```
+
+### Noteworthy Attributes
+
+| Attribute | Description |
+|-----------|-------------|
+| id | The user role ID |
+| type | The type of role. Will be `interviewer` or `job_admin`.|
+| name | The name of the role
+
+## GET: List User Roles
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/user_roles'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 4729,
+ "type": "interviewer",
+ "name": "Interviewer"
+ },
+ {
+ "id": 4730,
+ "type": "job_admin",
+ "name": "Standard"
+ },
+ {
+ "id": 4731,
+ "type": "job_admin",
+ "name": "Private"
+ }
+]
+```
+
+List the organization's roles that can be assigned to a user.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/user_roles`
\ No newline at end of file
diff --git a/source/includes/harvest/_users.md b/source/includes/harvest/_users.md
new file mode 100644
index 00000000000..ad2401602d5
--- /dev/null
+++ b/source/includes/harvest/_users.md
@@ -0,0 +1,923 @@
+# Users
+
+## The user object
+
+An organization's Greenhouse users.
+
+
+```json
+{
+ "id": 112,
+ "name": "Juliet Burke",
+ "first_name": "Juliet",
+ "last_name": "Burke",
+ "primary_email_address": "juliet.burke@example.com",
+ "updated_at": "2016-11-17T16:13:48.888Z",
+ "created_at": "2015-11-18T22:26:32.243Z",
+ "disabled": false,
+ "site_admin": true,
+ "emails": [
+ "juliet.burke@example.com",
+ "other.woman@example.com"
+ ],
+ "employee_id": "221",
+ "linked_candidate_ids": [123, 654],
+ "offices": [
+ {
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 150893,
+ "parent_id": 50849,
+ "parent_office_external_id": "14679",
+ "child_ids": [50852, 50891],
+ "child_office_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Second-Level department",
+ "parent_id": 25908,
+ "parent_department_external_id": "13473",
+ "child_ids": [50852, 50891],
+ "child_department_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ]
+}
+```
+
+### Noteworthy Attributes
+
+| Attribute | Description |
+|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| id | The user's unique identifier |
+| site_admin | If `true`, this user is a site admin, which means the user has full permissions on all non-private jobs. |
+| primary_email_address | The e-mail address this user has designated as his or her primary e-mail address. This value should always also be in the emails array. |
+| linked_candidate_ids[] | Contains the IDs of candidate records containing this user's personal applications. In other words, the records containing this user's personal interview records and information. |
+| offices | An array containing the [offices](#offices) this user is associated with. |
+| departments | An array containing the [department](#departments) which this user is associated with. |
+| custom_fields | Contains a hash of the custom fields configured for this resource. The properties in this hash reflect the active custom fields as of the time this method is called. |
+| keyed_custom_fields | This contains the same information as custom_fields but formatted in a different way that includes more information. This will tell you the type of custom field data to expect, the text name of custom field, and the value. The key of this hash is the custom field’s immutable field key, which will not change even if the name of the custom field is changed in Greenhouse. |
+
+## GET: List Users
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/users'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+[
+ {
+ "id": 112,
+ "name": "Juliet Burke",
+ "first_name": "Juliet",
+ "last_name": "Burke",
+ "primary_email_address": "juliet.burke@example.com",
+ "updated_at": "2016-11-17T16:13:48.888Z",
+ "created_at": "2015-11-18T22:26:32.243Z",
+ "disabled": false,
+ "site_admin": true,
+ "emails": [
+ "juliet.burke@example.com",
+ "other.woman@example.com"
+ ],
+ "employee_id": "221",
+ "linked_candidate_ids": [123, 654],
+ "offices": [
+ {
+ "id": 47012,
+ "name": "New York",
+ "location": {
+ "name": "New York, United States"
+ },
+ "primary_contact_user_id": 150893,
+ "parent_id": 50849,
+ "parent_office_external_id": "14679",
+ "child_ids": [50852, 50891],
+ "child_office_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Research & Development",
+ "parent_id": 25908,
+ "parent_department_external_id": "13473",
+ "child_ids": [50852, 50891],
+ "child_department_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ]
+ },
+ {
+ "id": 712,
+ "name": "John Doe",
+ "first_name": "John",
+ "last_name": "Doe",
+ "primary_email_address": "john.doe@example.com",
+ "updated_at": "2016-11-03T18:05:47.361Z",
+ "created_at": "2015-11-18T22:27:11.111Z",
+ "disabled": false,
+ "site_admin": true,
+ "emails": [
+ "john.doe@example.com"
+ ],
+ "employee_id": "700",
+ "linked_candidate_ids": [789, 1022],
+ "offices": [
+ {
+ "id": 47013,
+ "name": "San Francisco",
+ "location": {
+ "name": "San Francisco, California"
+ },
+ "primary_contact_user_id": 150894,
+ "parent_id": 50850,
+ "parent_office_external_id": "14680",
+ "child_ids": [50852, 50891],
+ "child_office_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Marketing",
+ "parent_id": 25908,
+ "parent_department_external_id": "13473",
+ "child_ids": [50852, 50891],
+ "child_department_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ]
+ }
+]
+```
+
+List all of an organization's Greenhouse users. If the querystring param `user_attributes=true` is passed, the response will also include custom field and keyed custom field values. If the param is not passed, these values will not be displayed.
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/users`
+
+### Querystring parameters
+
+| Parameter | Description |
+|-----------------|-------------|
+| *per_page | Return up to this number of objects per response. Must be an integer between 1 and 500. Defaults to 100.
+| *page | A cursor for use in pagination. Returns the n-th chunk of `per_page` objects.
+| *skip_count | If `true`, the performance of retrieving users will improve. This will remove `last` from the `link` response header.
+| employee_id | Return only users that match this employee id.
+| created_before | Return only users that were created before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| created_after | Return only users that were created at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_before | Return only users that were updated before this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| updated_after | Return only users that were updated at or after this timestamp. Timestamp must be in in [ISO-8601] (#general-considerations) format.
+| email | Return a single user who has this e-mail address as their primary e-mail or a secondary e-mail.
+| user_attributes | When `true`, include user attributes. Otherwise excludes user attributes. Defaults to `false`.
+
+
+[See noteworthy response attributes.] (#the-user-object)
+
+## GET: Retrieve User
+
+```shell
+curl 'https://harvest.greenhouse.io/v1/users/{id}'
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+```json
+{
+ "id": 112,
+ "name": "Juliet Burke",
+ "first_name": "Juliet",
+ "last_name": "Burke",
+ "primary_email_address": "juliet.burke@example.com",
+ "updated_at": "2016-11-17T16:13:48.888Z",
+ "created_at": "2015-11-18T22:26:32.243Z",
+ "disabled": false,
+ "site_admin": true,
+ "emails": [
+ "juliet.burke@example.com",
+ "other.woman@example.com"
+ ],
+ "employee_id": "221",
+ "linked_candidate_ids": [123, 654],
+ "offices": [
+ {
+ "id": 47013,
+ "name": "San Francisco",
+ "location": {
+ "name": "San Francisco, California"
+ },
+ "primary_contact_user_id": 150894,
+ "parent_id": 50850,
+ "parent_office_external_id": "14680",
+ "child_ids": [50852, 50891],
+ "child_office_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Marketing",
+ "parent_id": 25908,
+ "parent_department_external_id": "13473",
+ "child_ids": [50852, 50891],
+ "child_department_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "custom_fields": {
+ "equipment": "Laptop",
+ "shirt_size": "M",
+ "hiring_specialties": [
+ "Engineers",
+ "Executives"
+ ],
+ "trained_for_interviews": true,
+ "recruiting_partner": {
+ "name": "Johnny Recruiter",
+ "email": "johnny@example.com",
+ "user_id": 4000000000
+ }
+ },
+ "keyed_custom_fields": {
+ "equipment": {
+ "name": "Equipment",
+ "type": "short_text",
+ "value": "Laptop"
+ },
+ "shirt_size": {
+ "name": "Shirt Size",
+ "type": "single_select",
+ "value": "M"
+ },
+ "hiring_specialties": {
+ "name": "Hiring Specialties",
+ "type": "multi_select",
+ "value": [
+ "Engineers",
+ "Executives"
+ ]
+ },
+ "trained_for_interviews": {
+ "name": "Trained for interviews",
+ "type": "boolean",
+ "value": true
+ },
+ "recruiting_partner": {
+ "name": "Recruiting Partner",
+ "type": "user",
+ "value": {
+ "name": "Johnny Recruiter",
+ "email": "johnny@example.com",
+ "user_id": 4000000000
+ }
+ }
+ }
+}
+```
+
+### HTTP Request
+
+`GET https://harvest.greenhouse.io/v1/users/{id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+id | The ID of the user to retrieve
+
+### Querystring Parameters
+Parameter | Description
+--------- | -----------
+employee_id | The Employee ID of the user to retrieve
+
+
+[See noteworthy response attributes.] (#the-user-object)
+
+## PATCH: Edit User
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v2/users/'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "user": {
+ "email": "test@example.com"
+ },
+ "payload": {
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "employee_id": "ABC12345",
+ "office_ids": [12345, 67890],
+ "department_ids": [12345, 67890],
+ "custom_fields": [
+ {
+ "id": 1234,
+ "value": "Some new value"
+ },
+ {
+ "name_key": "custom_field_name_key",
+ "value": "Some new value"
+ },
+ {
+ "id": 5678,
+ "delete_value": "true"
+ }
+ ]
+ }
+}
+```
+> The user element must contain one of 'employee_id', 'email', or 'user_id', but not more than one.
+
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "success": "true"
+}
+```
+
+Edit a user's basic information. You may look up a user via their Greenhouse user id, their internal employee id, or their e-mail address in Greenhouse. Any of the e-mail addresses tied to the user's account can be used. The user information must be provided in a JSON body. Only one of user_id, employee_id (if available), or e-mail address may be provided. Employee id or e-mail address must be a string. User ID must be a number.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v2/users/`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+| Parameter | Required | Type | Description |
+|-------------------------|----------|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| first_name | No | string | The user's new first name. If included, this cannot be blank. |
+| last_name | No | string | The user's new last name. If included, this cannot be blank. |
+| employee_id* | No | string | The user's external employee id. If included, this cannot be blank, nor can it match any other employee-id for a user in this organization. |
+| office_ids | No | Array | Replace the current offices for this user with new offices. An empty array will remove all offices on this user. |
+| external_office_ids | No | Array | This may be used instead of `office_ids` and represents the ID of the office in an external system. If this is used, `office_ids` must be blank and vice versa. |
+| department_ids | No | Array | Replace the current departments for this user with new departments. An empty array will remove all departments on this user. |
+| external_department_ids | No | Array | This may be used instead of `department_ids` and represents the ID of the department in an external system. If used, `department_ids` must be blank and vice versa. |
+| custom_fields | No | custom_field | Array of hashes containing new custom field values. Passing an empty array does nothing. |
+
+\* - If the employee_id feature is not enabled for your organization, attempting to edit this field will raise an API Error. The "employee_id" element exists in both the "user" element as a look-up mechanism and in the "payload" element as a patching mechanism.
+
+### Custom Field Parameters
+
+The custom field parameter structure is different in the PATCH method than in GET methods and responses. Certain type of custom fields require different elements to be included, while deleting a field requires a specific argument. What follows is the description of each item in a custom field element and what is required depending on the type.
+
+| Parameter | Required for | Description |
+| ------------ | ---------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| id | all | The custom field id for this particular custom field. One of this or name_key is required. |
+| name_key | all | The field key for this custom field. This can be found in Greenhouse while editing custom options as "Immutable Field Key". This or id is required for all custom field elements. |
+| value | all | The value field contains the new custom field value. In most cases this will be a string or a number. In the case of single-select or multi-select custom fields, this will be a custom field option id or an array of custom field option ids, respectively. |
+| delete_value | n/a | When this element is included with a value of `"true"` (note, string true, not boolean true) the custom field value will be removed from Greenhouse. Note that updating a custom field value to nil or a blank string will not work, as validations require these to be non-blank values. |
+
+\* At this time, user attributes only supports the following field types: single_select, multi_select, yes_no, and user
+
+## PATCH: Disable User
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v2/users/disable'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "user": {"email": "test@example.com"}
+}
+```
+> or
+```json
+{
+ "user": {"user_id": 11234}
+}
+```
+> or
+```json
+{
+ "user": {"employee_id": "user-123"}
+}
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "id": 11234,
+ "name": "Bob Smith",
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "primary_email_address": "test@example.com",
+ "updated_at": "2017-03-23T18:58:27.796Z",
+ "created_at": "2016-04-28T15:28:16.440Z",
+ "disabled": true,
+ "site_admin": false,
+ "emails": [
+ "bob@email.org"
+ ],
+ "employee_id": "user-123",
+ "linked_candidate_ids": [123, 654],
+ "offices": [
+ {
+ "id": 47013,
+ "name": "San Francisco",
+ "location": {
+ "name": "San Francisco, California"
+ },
+ "primary_contact_user_id": 150894,
+ "parent_id": 50850,
+ "parent_office_external_id": "14680",
+ "child_ids": [50852, 50891],
+ "child_office_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Marketing",
+ "parent_id": 25908,
+ "parent_department_external_id": "13473",
+ "child_ids": [50852, 50891],
+ "child_department_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "custom_fields": {
+ "equipment": "Laptop",
+ "shirt_size": "M",
+ "hiring_specialties": [
+ "Engineers",
+ "Executives"
+ ],
+ "trained_for_interviews": true,
+ "recruiting_partner": {
+ "name": "Johnny Recruiter",
+ "email": "johnny@example.com",
+ "user_id": 4000000000
+ }
+ },
+ "keyed_custom_fields": {
+ "equipment": {
+ "name": "Equipment",
+ "type": "short_text",
+ "value": "Laptop"
+ },
+ "shirt_size": {
+ "name": "Shirt Size",
+ "type": "single_select",
+ "value": "M"
+ },
+ "hiring_specialties": {
+ "name": "Hiring Specialties",
+ "type": "multi_select",
+ "value": [
+ "Engineers",
+ "Executives"
+ ]
+ },
+ "trained_for_interviews": {
+ "name": "Trained for interviews",
+ "type": "boolean",
+ "value": true
+ },
+ "recruiting_partner": {
+ "name": "Recruiting Partner",
+ "type": "user",
+ "value": {
+ "name": "Johnny Recruiter",
+ "email": "johnny@example.com",
+ "user_id": 4000000000
+ }
+ }
+ }
+}
+```
+
+Disable a user. This endpoint allows you to disable a user via their Greenhouse user id, their internal employee id, or their e-mail address in Greenhouse. Any of the e-mail addresses tied to the user's account can be used. The user information must be provided in a JSON body. Only one of user_id, employee_id (if available), or e-mail address may be provided. Employee id or e-mail address must be a string. User ID must be a number. It is safe to call this method on a user that is currently disabled. If the user is already disabled, nothing happens.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v2/users/disable`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+## PATCH: Enable User
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v2/users/enable'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "user": {"email": "test@example.com"}
+}
+```
+> or
+```json
+{
+ "user": {"user_id": 11234}
+}
+```
+> or
+```json
+{
+ "user": {"employee_id": "user-123"}
+}
+```
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 253528,
+ "name": "Bob Smith",
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "primary_email_address": "bob@email.org",
+ "updated_at": "2017-03-23T18:58:27.796Z",
+ "created_at": "2016-04-28T15:28:16.440Z",
+ "disabled": false,
+ "site_admin": false,
+ "emails": [
+ "bob@email.org"
+ ],
+ "employee_id": "221",
+ "linked_candidate_ids": [123, 654],
+ "offices": [
+ {
+ "id": 47013,
+ "name": "San Francisco",
+ "location": {
+ "name": "San Francisco, California"
+ },
+ "primary_contact_user_id": 150894,
+ "parent_id": 50850,
+ "parent_office_external_id": "14680",
+ "child_ids": [50852, 50891],
+ "child_office_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Marketing",
+ "parent_id": 25908,
+ "parent_department_external_id": "13473",
+ "child_ids": [50852, 50891],
+ "child_department_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "custom_fields": {
+ "equipment": "Laptop",
+ "shirt_size": "M",
+ "hiring_specialties": [
+ "Engineers",
+ "Executives"
+ ],
+ "trained_for_interviews": true,
+ "recruiting_partner": {
+ "name": "Johnny Recruiter",
+ "email": "johnny@example.com",
+ "user_id": 4000000000
+ }
+ },
+ "keyed_custom_fields": {
+ "equipment": {
+ "name": "Equipment",
+ "type": "short_text",
+ "value": "Laptop"
+ },
+ "shirt_size": {
+ "name": "Shirt Size",
+ "type": "single_select",
+ "value": "M"
+ },
+ "hiring_specialties": {
+ "name": "Hiring Specialties",
+ "type": "multi_select",
+ "value": [
+ "Engineers",
+ "Executives"
+ ]
+ },
+ "trained_for_interviews": {
+ "name": "Trained for interviews",
+ "type": "boolean",
+ "value": true
+ },
+ "recruiting_partner": {
+ "name": "Recruiting Partner",
+ "type": "user",
+ "value": {
+ "name": "Johnny Recruiter",
+ "email": "johnny@example.com",
+ "user_id": 4000000000
+ }
+ }
+ }
+}
+```
+
+Enable a user. You may enable a user via their Greenhouse user id, their internal employee id, or their e-mail address in Greenhouse. Any of the e-mail addresses tied to the user's account can be used. The user information must be provided in a JSON body. Only one of user_id, employee_id (if available), or e-mail address may be provided. Employee id or e-mail address must be a string. User ID must be a number. It is safe to call this method on a user that is currently enabled. If the user is already enabled, nothing happens.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v2/users/enable`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+
+## PATCH: Change user permission level
+
+```shell
+curl -X PATCH 'https://harvest.greenhouse.io/v1/users/permission_level'
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "user": {"email": "test@example.com"},
+ "level": "basic"
+}
+```
+> or
+```json
+{
+ "user": {"user_id": 11234},
+ "level": "basic"
+}
+```
+> or
+```json
+{
+ "user": {"employee_id": "user-123"},
+ "level": "basic"
+}
+```
+
+> The above command returns JSON structured like this:
+
+```json
+{
+ "success": true
+}
+```
+
+Changes the permissions user level, i.e. Site Admin, Job Admin, Basic user
+
+This endpoint will only convert the user to a Basic user. Other permission levels are not supported due to security constraints. This means changing the user permission level is not reversible through this endpoint.
+
+When converting a user’s permission level to Basic, any previously assigned job-based, developer, or user-specific permissions will be removed. Note that this will remove the user from assigned roles on any jobs, e.g. Recruiter or Coordinator. This will also remove the user from any outstanding approval flows.
+
+### HTTP Request
+
+`PATCH https://harvest.greenhouse.io/v1/users/permission_level`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+user | Yes | object | An object containing one of email, user_id, or employee_id fields.
+email | No | string | The email address associated with the user. One of email, user_id, or employee_id is required.
+user_id | No | string | The ID of the user. One of email, user_id, or employee_id is required.
+employee_id | No | string | The external employee_id of the user. One of email, user_id, or employee_id is required.
+level | Yes | string | The permission level to be assigned to the user. The only accepted value is “basic”. Other permission levels are not accepted due to security constraints.
+
+Note: This endpoint accepts users with Job Admin or Site Admin permission levels. Basic users will be ignored and will return a 200 response.
+
+
+## POST: Add User
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/users'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "email": "bob@email.org",
+ "send_email_invite": true,
+ "employee_id": "ABC12345",
+ "office_ids": [47013],
+ "department_ids": [25907],
+ "custom_fields": [
+ {
+ "name_key": "shirt_size",
+ "value": "Medium"
+ },
+ {
+ "id": 12345,
+ "value": "Laptop"
+ }
+ ]
+}
+```
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 253818,
+ "name": "Bob Smith",
+ "first_name": "Bob",
+ "last_name": "Smith",
+ "primary_email_address": "bob@email.org",
+ "updated_at": "2018-06-07T22:12:31.303Z",
+ "created_at": "2016-04-28T19:10:46.688Z",
+ "disabled": false,
+ "site_admin": false,
+ "emails": [
+ "bob@email.org"
+ ],
+ "employee_id": "ABC12345",
+ "linked_candidate_ids": [123, 654],
+ "offices": [
+ {
+ "id": 47013,
+ "name": "San Francisco",
+ "location": {
+ "name": "San Francisco, California"
+ },
+ "primary_contact_user_id": 150894,
+ "parent_id": 50850,
+ "parent_office_external_id": "14680",
+ "child_ids": [50852, 50891],
+ "child_office_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "departments": [
+ {
+ "id": 25907,
+ "name": "Marketing",
+ "parent_id": 25908,
+ "parent_department_external_id": "13473",
+ "child_ids": [50852, 50891],
+ "child_department_external_ids": ["13473", "123473"],
+ "external_id": "15679"
+ }
+ ],
+ "custom_fields": {
+ "equipment": "Laptop",
+ "shirt_size": "Medium"
+ },
+ "keyed_custom_fields": {
+ "equipment": {
+ "name": "Equipment",
+ "type": "short_text",
+ "value": "Laptop"
+ },
+ "shirt_size": {
+ "name": "Shirt Size",
+ "type": "single_select",
+ "value": "Medium"
+ }
+ }
+}
+```
+
+
+Create a new user with Basic permissions.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/users`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+| Parameter | Required | Type | Description |
+|-------------------------|----------|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| first_name | Yes | string | The user's first name |
+| last_name | Yes | string | The user's last name |
+| email | Yes | string | The user's email address. Must be a valid email address. |
+| send_email_invite* | No | boolean | If true, an email will be sent to the user alerting them of any new job permissions that have been assigned to them. Emails are never sent when permissions are removed. If false, nothing happens. Default is false. |
+| employee_id | No | string | The user's external employee id. |
+| office_ids | No | Array | The office value(s) associated with a user. Must be a valid set of office IDs. Passing an empty array does nothing. |
+| external_office_ids | No | Array | This may be used instead of `office_ids` and represents the ID of the office in an external system. If this is used, `office_ids` must be blank and vice versa. |
+| department_ids | No | Array | The department value(s) associated with a user. Must be a valid set of department IDs. Passing an empty array does nothing. |
+| external_department_ids | No | Array | This may be used instead of `department_ids` and represents the ID of the department in an external system. If this is used, `department_ids` must be blank and vice versa. |
+| custom_fields | No | custom_field | Array of hashes containing new custom field values. Passing an empty array does nothing. |
+
+\* - A newly created user will not be able to login until they create a password via the invitation link or configured in an SSO system.
+
+\** - The employee_id feature is available only for customers with the Advanced and Expert Greenhouse Recruiting package. Use of this field will return an error for other Greenhouse Recruiting customers.
+
+### Custom Field Parameters
+
+The custom field parameter structure is different in the POST method than in GET methods and responses. Certain type of custom fields require different elements to be included. What follows is the description of each item in a custom field element and what is required depending on the type.
+
+| Parameter | Required for | Description |
+| ------------ | ---------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| id | all | The custom field id for this particular custom field. One of this or name_key is required. |
+| name_key | all | The field key for this custom field. This can be found in Greenhouse while editing custom options as "Immutable Field Key". This or id is required for all custom field elements. |
+| value | all | The value field contains the new custom field value. In most cases this will be a string or a number. In the case of single-select or multi-select custom fields, this will be a custom field option id or an array of custom field option ids, respectively. |
+
+
+\* At this time, user attributes only supports the following field types: single_select, multi_select, yes_no, and user
+
+
+## POST: Add E-mail Address To User
+
+```shell
+curl -X POST 'https://harvest.greenhouse.io/v1/users/{id}/email_addresses'
+-H "Content-Type: application/json"
+-H "On-Behalf-Of: {greenhouse user ID}"
+-H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6"
+```
+
+> The above command takes a JSON request, structured like this:
+
+```json
+{
+ "email": "bob@email.org",
+ "send_verification": true
+}
+```
+> The above command returns a JSON response, structured like this:
+
+```json
+{
+ "id": 898318,
+ "user_id": 253818,
+ "email": "bob@email.org",
+ "verified": "false"
+}
+```
+
+Creates a new unverified e-mail address on the given user. The address will not be considered verified until the user receives the verification e-mail and clicks on the link to verify the address. There is no method in the API to verify an e-mail address. This endpoint is also used to re-send a verification e-mail. The request body to do this is exactly the same. If an unverified e-mail is received with send_verification set to true, Greenhouse will attempt to re-send the verification e-mail. If you attempt this with a verified e-mail, nothing occurs.
+
+### HTTP Request
+
+`POST https://harvest.greenhouse.io/v1/users/{id}/email_addresses`
+
+### Headers
+
+Header | Description
+--------- | -----------
+On-Behalf-Of | ID of the user issuing this request. Required for auditing purposes.
+
+### JSON Body Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+email | Yes | string | The user's email address. Must be a valid email address.
+send_verification | No | boolean | If true, an email will be sent to the user to verify this e-mail address. If false, nothing happens. Default is false.
+
+There are 3 successful response states for this endpoint.
+
+* 201: A new e-mail address was received and created. This will be the response code regardless of the verification setting.
+* 200: An e-mail was generated for an unverified e-mail address. This is the case if we attempt to re-send a verification e-mail to an unverified e-mail address.
+* 204: A request was made which caused Greenhouse to do nothing. This will occur if you attempt to re-send a verification e-mail to an address that has already been verified or if you make a follow-up request to an unverified e-mail with send_verification set to false.
diff --git a/source/includes/job-board/_applications.md b/source/includes/job-board/_applications.md
new file mode 100644
index 00000000000..97482d2eb2b
--- /dev/null
+++ b/source/includes/job-board/_applications.md
@@ -0,0 +1,309 @@
+# Applications
+
+## Submit an application
+
+> This endpoint can take a multipart form-data POST. You should use this if you need to upload a resume or cover letter.
+
+```html
+
+
+```
+
+> cURL equivalent:
+
+```
+curl -X POST \
+ -H "Content-Type: multipart/form-data" \
+ -H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6" \
+ -F "first_name=Sammy" \
+ -F "last_name=McSamson" \
+ -F "email=sammy@example.com" \
+ -F "phone=3337778888" \
+ -F "location=110 5th Ave New York, NY, 10011" \
+ -F "latitude=40.7376671" \
+ -F "longitude=-73.9929196" \
+ -F "resume=@/path/to/resume/ADA084551.pdf" \
+ -F "cover_letter=@/path/to/coverletter/blah.pdf" \
+ -F "educations[][school_name_id]=5417077" \
+ -F "educations[][degree_id]=5494452"\
+ -F "educations[][discipline_id]=5494865" \
+ -F "educations[][start_date][month]=8" \
+ -F "educations[][start_date][year]=2012" \
+ -F "educations[][end_date][month]=5" \
+ -F "educations[][end_date][year]=2016" \
+ -F "employments[][company_name]=Business Co" \
+ -F "employments[][title]=Sales Manager" \
+ -F "employments[][start_date][month]=1" \
+ -F "employments[][start_date][year]=2016" \
+ -F "employments[][end_date][month]=2" \
+ -F "employments[][end_date][year]=2018" \
+ -F "employments[][current]=false"
+ -F "mapped_url_token=token12345" \
+ -F "question_12349_url=http://dropbox.com/dl/attachment.pdf" \
+ -F "question_12349_url_filename=attachment.pdf" \
+ -F "question_12350_content=SGVsbG8sIHdvcmxkIQo=" \
+ -F "question_12350_content_filename=something_else.txt" \
+ -F "demographic_answers[][question_id]=87" \
+ -F "demographic_answers[][answer_options][][answer_option_id]=194" \
+ -F "demographic_answers[][question_id]=88" \
+ -F "demographic_answers[][answer_options][][answer_option_id]=212" \
+ -F "demographic_answers[][answer_options][][text]=Free-form Answer" \
+ -F "data_compliance[gdpr_consent_given]=true" \ # `gdpr_consent_given` to be deprecated. Use if your organization doesn't have single-purpose consent configured, otherwise use separate values for processing and retention
+ -F "data_compliance[gdpr_processing_consent_given]=true" \
+ -F "data_compliance[gdpr_retention_consent_given]=true" \
+ "https://boards-api.greenhouse.io/v1/boards/very_awesome_inc/jobs/127817"
+```
+
+> or, you can POST a JSON encoded body (with `Content-Type: application/json`):
+
+```
+curl -X POST \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Basic MGQwMzFkODIyN2VhZmE2MWRjMzc1YTZjMmUwNjdlMjQ6" \
+ -d '{
+ "first_name": "Sammy",
+ "last_name": "McSamson",
+ "email": "sammy@example.com",
+ "phone": "3337778888",
+ "location": "110 5th Ave New York, NY, 10011",
+ "latitude": "40.7376671",
+ "longitude": "-73.9929196",
+ "resume_text": "I have many years of experience as an expert basket weaver...",
+ "cover_letter_text": "I have a very particular set of skills, skills I have acquired over a very long career. Skills that make me...",
+ "gender": 2,
+ "race": 4,
+ "veteran_status": 3,
+ "disability_status": 3,
+ "question_12345": "Here is some short text for the first question",
+ "question_12346": 1,
+ "question_12347": 5869311,
+ "question_12348": [5869319,5869317],
+ "question_12349_url": "http://dropbox.com/dl/attachment.pdf",
+ "question_12349_url_filename": "attachment.pdf",
+ "question_12350_content": "SGVsbG8sIHdvcmxkIQo=",
+ "question_12350_content_filename": "something_else.txt",
+ "educations": [
+ {
+ "school_name_id" : "1403524",
+ "degree_id": "1403534",
+ "discipline_id": "1403605",
+ "start_date": { "month": "1", "year": "1989"},
+ "end_date": { "month": "2", "year": "1990"}
+ },
+ {
+ "school_name_id" : "1401063",
+ "degree_id": "1403525",
+ "discipline_id": "1403608",
+ "start_date": { "month": "1", "year": "2011"},
+ "end_date": { "month": "2", "year": "2012"}
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Business Co.",
+ "title": "Sales Manager",
+ "start_date": {
+ "month": "1",
+ "year": "2016"
+ },
+ "end_date": {
+ "month": "2",
+ "year": "2018"
+ },
+ "current": "false"
+ }
+ ],
+ "mapped_url_token":"token12345",
+ "demographic_answers":[
+ {
+ "question_id": 87,
+ "answer_options": [
+ {
+ "answer_option_id": 194
+ }
+ ]
+ },
+ {
+ "question_id": 88,
+ "answer_options": [
+ {
+ "answer_option_id": 212,
+ "text": "Free-form Answer"
+ }
+ ]
+ }
+ ]
+ },
+ "data_compliance": {
+ "gdpr_consent_given": true, // To be deprecated. Use if your organization doesn't have single-purpose consent configured, otherwise use separate values for processing and retention
+ "gdpr_processing_consent_given": true
+ "gdpr_retention_consent_given": true
+ }' \
+ "https://boards-api.greenhouse.io/v1/boards/very_awesome_inc/jobs/127817"
+```
+
+Use this endpoint to submit a new application. This endpoint accepts a multipart form POST representing a job application. Application forms are job-specific and will be constructed via the "questions" array available via the [Job method](#retrieve-a-job). Please see the [Job method](#retrieve-a-job) documentation for instructions on submitting location information through the API.
+
+Note that when submitting an application through this method, Greenhouse will not confirm the inclusion of required fields. Validation for required fields must be done on the client side, as Greenhouse will not reject applications that are missing required fields.
+
+
+
+
+
+### HTTP Request
+
+`POST https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs/{id}`
+
+Parameter | Description
+ --------- | -----------
+ board_token | Job Board URL token. If you're submitting an application for a job post on an internal job board, use `"internal"`.
+ id | Job post ID. Both internal and external job posts are allowed.
+
+### Request Headers
+
+Parameter | Description
+--------- | -----------
+Authorization | This header should include a basic authorization with a **Base64 encoded** API key
+Content-Type | Required if the request contains an attachment
+
+### Request Parameters
+
+Parameter | Description
+--------- | -----------
+*mapped_url_token | If present, the `gh_src` URL parameter, which is used to indicate the referral source of this application.
+first_name | Applicant's first name
+last_name | Applicant's last name
+email | Applicant's email address
+*phone | Applicant's phone number
+*location | Applicant's street address
+*latitude | Applicant's home latitude. This is a *hidden* field and should not be exposed directly to the applicant.
+*longitude | Applicant's home longitude. This is a *hidden* field and should not be exposed directly to the applicant.
+*resume | *Please see below for details.*
+*cover_letter | *Please see below for details.*
+*educations | An array of education objects. Each education object should have five fields: `school_name_id`, `degree_id`, `discipline_id`, `start_date`, and `end_date`. You can get the `school_name_id`, `degree_id`, `discipline_id` from our [List Schools](#list-schools), [List Degrees](#list-degrees), and [List Disciplines](#list-disciplines) endpoints. `start_date` and `end_date` will use a hash of month and year.
+*employments | An array of employments objects. Each employment object should have: `company_name`, `title`, `start_date`, and `current` (must be `true` or `false`). If `current` is `false`, must have `end_date`. `start_date` and `end_date` will use a hash of month and year.
+*demographic_answers | An array of demographic answer objects, applicable only if your organization has Greenhouse Inclusion and demographic questions are enabled on the job post. Each object must have a `question_id` field. The `answer_options` field is an array of objects, one for each `answer_option_id` the candidate selected. For answer options which support free-form responses, a `text` field may also be supplied with the candidate's hand-typed answer. Note that these questions are always optional, so the `answer_options` array may be empty, null, or omitted if the candidate did not make any selections.
+*data_compliance | An object representing a candidate’s answers to required data compliance questions. This field is dependent on your organization’s [privacy and compliance configuration](https://support.greenhouse.io/hc/en-us/articles/360061849112-GDPR-features-overview). If your organization doesn’t have single-purpose consent configured, use `{"gdpr_consent_given": true}`. Otherwise use separate consent values, like `{"gdpr_processing_consent_given":true}` or `{gdpr_retention_consent_given":false.}`.
+
+### Submitting Attachments
+
+We support 4 methods of uploading attachments when submitting a candidate application:
+
+1. Submit the attachment via direct upload using multipart/form-data.
+2. Submit the attachment via direct upload using application/json.
+3. Submit a path to the attachment on an external server.
+4. Submit the plaintext file contents.
+
+
+
+**Resume Attachments**
+
+Method | Content-Type | Required Fields | Example
+--------- | ----------- | ----------- | -----------
+Direct upload | multipart/form-data | "resume" | "resume": "@/Users/UserName/Documents/resume.pdf" *(this example is specific to cURL)*
+Direct upload | application/json | "resume_content", "resume_content_filename" | "resume_content": "SGVsbG8sIHdvcmxkIQo=", "resume_content_filename": "resume.pdf"
+Path to file on external server | multipart/form-data *or* application/json | "resume_url", "resume_url_filename" | "resume_url": "https://example.com/resume.pdf", "resume_url_filename": "resume.pdf"
+Plaintext file contents | multipart/form-data *or* application/json | "resume_text" | "resume_text": "This is my awesome resume!"
+
+
+
+**Cover Letter Attachments**
+
+Method | Content-Type | Required Fields | Example
+--------- | ----------- | ----------- | -----------
+Direct upload | multipart/form-data | "cover_letter" | "cover_letter": "@/Users/UserName/Documents/coverletter.pdf" *(this example is specific to cURL)*
+Direct upload | application/json | "cover_letter_content", "cover_letter_content_filename" | "cover_letter_content": "SGVsbG8sIHdvcmxkIQo=", "cover_letter_content_filename": "coverletter.pdf"
+Path to file on external server | multipart/form-data *or* application/json | "cover_letter_url", "cover_letter_url_filename" | "cover_letter_url": "https://example.com/coverletter.pdf", "cover_letter_url_filename": "coverletter.pdf"
+Plaintext file contents | multipart/form-data *or* application/json | "cover_letter_text" | "cover_letter_text": "This is my awesome cover letter!"
+
+
+
+**Custom Question Attachments**
+
+Method | Content-Type | Required Fields | Example
+--------- | ----------- | ----------- | -----------
+Direct upload | multipart/form-data | "question_12345" | "question_12345": "@/Users/UserName/Documents/attachment.pdf" *(this example is specific to cURL)*
+Direct upload | application/json | "question_12345_content", "question_12345_content_filename" | "question_12345_content": "SGVsbG8sIHdvcmxkIQo=", "question_12345_content_filename": "attachment.pdf"
+Path to file on external server | multipart/form-data *or* application/json | "question_12345_url", "question_12345_url_filename" | "question_12345_url": "https://example.com/attachment.pdf", "question_12345_url_filename": "attachment.pdf"
+
+### Collecting Applicant Location
+
+Here is the suggested workflow for populating `location`, `latitude` and `longitude`:
+
+1. The applicant begins typing a location in your `location` text box.
+2. As the applicant types, your app makes a call to the [Google Places Autocomplete API](https://developers.google.com/maps/documentation/javascript/places-autocomplete)
+to retrieve suggested location names (e.g. New York, NY, United States)
+and the `place_id` associated with each location (e.g. `ChIJOwg_06VPwokRYv534QaPC8g`).
+3. Your app displays the suggested location names to the applicant.
+4. The applicant selects a suggested location.
+5. Your app uses the `place_id` from the previous API call to retrieve the latitude and
+longitude for the selected location using the [Google Place Details API](https://developers.google.com/maps/documentation/javascript/places#place_details).
+6. Your app populates the hidden `latitude` and `longitude` fields with the result of
+this API call.
+
+Note that all 3 fields must be included. If only `location` is sent and `latitude` and `longitude` are omitted, `location` will be ignored entirely.
+
+### Validations on POST Requests
+
+**Job validations:**
+
+* The job must be live and published
+* The job board must be live and published
+* The job post ID must exist on the job board with the supplied board_token
+
+**Field validations:**
+
+* `first_name`, `last_name`, and `email` fields are required
+* `first_name`, `last_name`, and `email` fields cannot be greater than 255 characters long
+* `first_name`, `last_name`, and `phone` fields must not contain a URL
+* `email` field must contain a valid email address
+* `educations` object must contain valid `school_name_id`, `degree_id`, `discipline_id`, `start_date`, and `end_date`
+* `employments` object must contain `company_name`, `title`, `start_date` and `current` (must be `true` or `false`). If *current=false*, must contain `end_date`
+* `start_date` must be before `end_date`
+* Field values must match the field type specified on the job post question
+
+**Attachments:**
+
+* Must be a supported file type (pdf, doc, docx, txt, rtf)
+* File size must be > 0 bytes
+
diff --git a/source/includes/job-board/_boards.md b/source/includes/job-board/_boards.md
new file mode 100644
index 00000000000..005dd777364
--- /dev/null
+++ b/source/includes/job-board/_boards.md
@@ -0,0 +1,22 @@
+# Job Boards
+
+## Retrieve job board
+
+```json
+{
+ "name": "Your Organization",
+ "content": "
...
"
+}
+```
+
+Returns your organization's name and job board content.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
diff --git a/source/includes/job-board/_degrees.md b/source/includes/job-board/_degrees.md
new file mode 100644
index 00000000000..481dae160f2
--- /dev/null
+++ b/source/includes/job-board/_degrees.md
@@ -0,0 +1,57 @@
+# Degrees
+
+## List Degrees
+```json
+{
+ "items": [
+ {
+ "id": 1403525,
+ "text": "High School"
+ },
+ {
+ "id": 1403526,
+ "text": "Associate's Degree"
+ },
+ {
+ "id": 1403527,
+ "text": "Bachelor's Degree"
+ },
+ {
+ "id": 1403528,
+ "text": "Master's Degree"
+ },
+ {
+ "id": 1403529,
+ "text": "Master of Business Administration (M.B.A.)"
+ },
+ {
+ "id": 1403534,
+ "text": "Other"
+ }
+ ],
+ "meta": {
+ "total_count": 6,
+ "per_page": 30
+ }
+}
+
+```
+
+Returns a list of all of your organization's degrees.
+
+### HTTP Request
+
+`GET https://api.greenhouse.io/v1/boards/{board_token}/education/degrees`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+term | No | string | A string returns any degrees containing this string in their name.
+page | No | string | A cursor for use in pagination. Returns the n-th chunk of objects (30 per page).
diff --git a/source/includes/job-board/_departments.md b/source/includes/job-board/_departments.md
new file mode 100644
index 00000000000..deb051417dd
--- /dev/null
+++ b/source/includes/job-board/_departments.md
@@ -0,0 +1,235 @@
+# Departments
+
+## List departments
+
+> With `render_as=list` (default)
+
+```json
+{
+ "departments":[
+ {
+ "id":77777,
+ "name":"R & D",
+ "jobs":[
+ ],
+ "parent_id":null,
+ "child_ids":[
+ 33333
+ ]
+ },
+ {
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ],
+ "parent_id":77777,
+ "child_ids":[
+ ]
+ },
+ {
+ "id":22222,
+ "name":"Account Management",
+ "jobs":[
+ ],
+ "parent_id":null,
+ "child_ids":[
+ ]
+ },
+ ]
+}
+```
+
+> With `render_as=tree`
+
+```json
+{
+ "departments":[
+ {
+ "id":77777,
+ "name":"R & D",
+ "jobs":[
+ ],
+ "children":[
+ {
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ],
+ "children":[
+ ]
+ },
+ ]
+ },
+ {
+ "id":22222,
+ "name":"Account Management",
+ "jobs":[
+ ],
+ "children":[
+ ]
+ },
+ ]
+}
+```
+
+Returns a list of your organization's departments and jobs.
+
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/departments`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+render_as | No | string | This parameter defines how to represent the list of departments. The default value is 'list'.
+
+Allowed `render_as` values:
+
+| Value | Description |
+|-------|--------------|
+| list | (Default). The departments are returned as a list of objects and they include `parent_id` and `child_ids`. |
+| tree | The departments are returned as a list of trees with `children`. |
+
+## Retrieve a department
+
+> With `render_as=list` (default)
+
+```json
+{
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ],
+ "parent_id":null,
+ "child_ids":[
+ 77777
+ ]
+}
+```
+
+> With `render_as=tree`
+
+```json
+{
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ],
+ "children":[
+ {
+ "id":77777,
+ "name":"Mobile Development",
+ "jobs":[
+ ],
+ "children":[
+ ]
+ }
+ ]
+}
+```
+
+Returns a list of jobs for a given `department_id`.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/departments/{department_id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+department_id | ID of the department to retrieve
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+render_as | No | string | This parameter defines how to represent the list of departments. The default value is 'list'.
+
+Allowed `render_as` values:
+
+| Value | Description |
+|-------|--------------|
+| list | (Default).
+| tree | The children departments are returned as a tree. |
diff --git a/source/includes/job-board/_educations.md b/source/includes/job-board/_educations.md
new file mode 100644
index 00000000000..01400c25452
--- /dev/null
+++ b/source/includes/job-board/_educations.md
@@ -0,0 +1,220 @@
+# Educations
+This is a list of endpoints which can be used to populate Education data for candidate applications. Instructions for posting applications that include Education information can be found under [Applications](#submit-an-application).
+
+## List Degrees
+```json
+{
+ "items": [
+ {
+ "id": 5494452,
+ "text": "High School"
+ },
+ {
+ "id": 5494478,
+ "text": "Associate's Degree"
+ },
+ {
+ "id": 5494516,
+ "text": "Bachelor's Degree"
+ },
+ {
+ "id": 5494551,
+ "text": "Master's Degree"
+ },
+ {
+ "id": 5494580,
+ "text": "Master of Business Administration (M.B.A.)"
+ },
+ {
+ "id": 5494607,
+ "text": "Juris Doctor (J.D.)"
+ },
+ {
+ "id": 5494638,
+ "text": "Doctor of Medicine (M.D.)"
+ },
+ {
+ "id": 5494662,
+ "text": "Doctor of Philosophy (Ph.D.)"
+ },
+ {
+ "id": 5494689,
+ "text": "Engineer's Degree"
+ },
+ {
+ "id": 5494710,
+ "text": "Other"
+ }
+ ],
+ "meta": {
+ "total_count": 10,
+ "per_page": 100
+ }
+}
+
+```
+
+Returns a list of all of your organization's degrees.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/education/degrees`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+term | No | string | Returns any degrees containing this string in their name.
+page | No | string | A cursor for use in pagination. Returns the n-th chunk of objects (100 per page).
+
+## List Disciplines
+```json
+{
+ "items": [
+ {
+ "id": 5494865,
+ "text": "Accounting"
+ },
+ {
+ "id": 5494892,
+ "text": "African Studies"
+ },
+ {
+ "id": 5494917,
+ "text": "Agriculture"
+ },
+ {
+ "id": 5494940,
+ "text": "Anthropology"
+ },
+ {
+ "id": 5494964,
+ "text": "Applied Health Services"
+ },
+ {
+ "id": 5495009,
+ "text": "Architecture"
+ },
+ {
+ "id": 5495033,
+ "text": "Art"
+ },
+ {
+ "id": 5495051,
+ "text": "Asian Studies"
+ },
+ {
+ "id": 5495074,
+ "text": "Biology"
+ },
+ {
+ "id": 5495101,
+ "text": "Business"
+ }
+ ],
+ "meta": {
+ "total_count": 71,
+ "per_page": 100
+ }
+}
+```
+
+Returns a list of all of your organization's disciplines.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/education/disciplines`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+term | No | string | Returns any disciplines containing this string in their name.
+page | No | string | A cursor for use in pagination. Returns the n-th chunk of objects (100 per page).
+
+
+## List Schools
+
+
+```json
+{
+ "items": [
+ {
+ "id": 5417077,
+ "text": "Abraham Baldwin Agricultural College"
+ },
+ {
+ "id": 5417117,
+ "text": "Academy of Art University"
+ },
+ {
+ "id": 5417156,
+ "text": "Acadia University"
+ },
+ {
+ "id": 5417194,
+ "text": "Adams State University"
+ },
+ {
+ "id": 5417217,
+ "text": "Adelphi University"
+ },
+ {
+ "id": 5417245,
+ "text": "Adrian College"
+ },
+ {
+ "id": 5417295,
+ "text": "Adventist University of Health Sciences"
+ },
+ {
+ "id": 5417331,
+ "text": "Agnes Scott College"
+ },
+ {
+ "id": 5417366,
+ "text": "AIB College of Business"
+ },
+ {
+ "id": 5417384,
+ "text": "Alaska Pacific University"
+ }
+ ],
+ "meta": {
+ "total_count": 2464,
+ "per_page": 100
+ }
+}
+```
+
+Returns a list of all of your organization's schools.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/education/schools`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+term | No | string | Returns any schools containing this string in their name.
+page | No | string | A cursor for use in pagination. Returns the n-th chunk of objects (100 per page).
+
diff --git a/source/includes/job-board/_introduction.md b/source/includes/job-board/_introduction.md
new file mode 100644
index 00000000000..1ea5419b1d3
--- /dev/null
+++ b/source/includes/job-board/_introduction.md
@@ -0,0 +1,25 @@
+# Introduction
+
+With our Job Board API, you will have easy access to a simple JSON representation of your company's offices, departments, and published jobs. Since we give you access to the raw data, you can build careers pages with a unique look and feel, construct department-level pages, and more!
+
+
+We support JSONP callbacks, and have a POST method which can be used to build your own online job application form.
+
+## JSONP
+```html
+
+```
+
+To call a method via JSONP (http://en.wikipedia.org/wiki/JSONP), insert the script tag below into your HTML document with an appropriate method URL and provide your own method name in the "callback" querystring parameter. NOTE: The callback name may only contain numbers, letters, underscore, and period.
+
+## Authentication
+
+
+Only the application submission endpoint
+(`POST https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs/{id}`) requires Basic Auth. The Job Board API Key must be **Base64 encoded** before it can be used to post applications.
+[Read more](#submit-an-application).
diff --git a/source/includes/job-board/_jobs.md b/source/includes/job-board/_jobs.md
new file mode 100644
index 00000000000..4d9ee33566a
--- /dev/null
+++ b/source/includes/job-board/_jobs.md
@@ -0,0 +1,328 @@
+# Jobs
+
+## List jobs
+
+```json
+{
+ "jobs": [
+ {
+ "id":127817,
+ "internal_job_id":144381,
+ "title":"Vault Designer",
+ "updated_at":"2016-01-14T10:55:28-05:00",
+ "requisition_id": "50",
+ "location":{
+ "name":"NYC"
+ },
+ "absolute_url":"https://boards.greenhouse.io/vaulttec/jobs/127817",
+ "metadata":null
+ }
+ ],
+ "meta": {
+ "total": 1
+ }
+}
+```
+
+> When `?content=true`:
+
+```json
+{
+ "jobs": [
+ {
+ "id":127817,
+ "internal_job_id":144381,
+ "title":"Vault Designer",
+ "updated_at":"2016-01-14T10:55:28-05:00",
+ "requisition_id": "50",
+ "location":{
+ "name":"NYC"
+ },
+ "absolute_url":"https://boards.greenhouse.io/vaulttec/jobs/127817",
+ "metadata":null,
+ "content":"This is the job description. <p>Any HTML included through the hosted job application editor will be automatically converted into corresponding HTML entitites.</p>",
+ "departments":[
+ {
+ "id":13583,
+ "name":"Department of Departments",
+ "parent_id":null,
+ "child_ids":[
+ 13585
+ ]
+ }
+ ],
+ "offices":[
+ {
+ "id":8304,
+ "name":"East Coast",
+ "location":"United States",
+ "parent_id":null,
+ "child_ids":[
+ 8787
+ ]
+ },
+ {
+ "id":8787,
+ "name":"New York City",
+ "location":"New York, NY, United States",
+ "parent_id":8304,
+ "child_ids":[
+ ]
+ }
+ ]
+ }
+ ],
+ "meta": {
+ "total": 1
+ }
+}
+```
+
+Returns the list of all job posts. The `id` field contains the unique identifier for the job post, while `internal_job_id` contains the unique identifier for the job itself. Any job custom fields you have selected to be exposed in the job board API will be shown in the `metadata` attribute.
+
+
+
+Prospect posts include a null value for `internal_job_id`
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+### Optional Querystring Parameters
+
+Parameter | Description
+--------- | -----------
+content | If set to `true`, include the full post description, department, and office of each job post.
+
+## Retrieve a job
+
+```json
+{
+ "id":44444,
+ "title":"Product Engineer",
+ "updated_at":"2013-07-02T19:39:23Z",
+ "requisition_id": "50",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "content":"This is the job description. <p>Any HTML included through the hosted job application editor will be automatically converted into corresponding HTML entitites.</p>",
+ "absolute_url":"http://your.co/careers?gh_jid=444444",
+ "internal_job_id":55555,
+ "location_questions": [
+ {
+ "label": "Location",
+ "fields": [
+ {
+ "name": "location",
+ "type": "input_text",
+ "values": []
+ }
+ ],
+ "required": true
+ },
+ {
+ "label": "Latitude",
+ "fields": [
+ {
+ "name": "latitude",
+ "type": "input_hidden",
+ "values": []
+ }
+ ],
+ "required": true
+ },
+ {
+ "label": "Longitude",
+ "fields": [
+ {
+ "name": "longitude",
+ "type": "input_hidden",
+ "values": []
+ }
+ ],
+ "required": true
+ },
+ ],
+ "questions":[
+ {
+ "required":true,
+ "label":"First Name",
+ "fields":[
+ {
+ "name":"first_name",
+ "type":"input_text"
+ }
+ ]
+ },
+ {
+ "required":true,
+ "label":"Resume",
+ "fields":[
+ {
+ "name":"resume",
+ "type":"input_file"
+ },
+ {
+ "name":"resume_text",
+ "type":"textarea"
+ }
+ ]
+ },
+ {
+ "required":false,
+ "label":"Do you like apples?",
+ "fields":[
+ {
+ "name":"question_2222",
+ "type":"multi_value_single_select",
+ "values":[
+ {
+ "value":0,
+ "label":"No"
+ },
+ {
+ "value":1,
+ "label":"Yes"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "metadata":[
+ {
+ "id":12345,
+ "name":"Field Name",
+ "value_type":"text",
+ "value":"Some value"
+ }
+ ],
+ "data_compliance": [
+ {
+ "type": "gdpr",
+ "requires_consent": true,
+ // To be deprecated. Use if your organization doesn't have single-purpose consent configured, otherwise use separate values for processing and retention
+ "requires_processing_consent": true,
+ "requires_retention_consent": true,
+ "retention_period": 12345
+ }
+ ],
+ "pay_input_ranges": [
+ {
+ "min_cents":5000000,
+ "max_cents":7500000,
+ "currency_type":"USD",
+ "title":"NYC Salary Range",
+ "blurb":"In order to provide transparency..."
+ }
+ ]
+}
+```
+
+> When demographic questions are enabled:
+
+```json
+{
+ "id": 44444,
+ "title": "Product Engineer",
+ ...
+ "demographic_questions": {
+ "header": "Diversity and Inclusion at Acme Corp.",
+ "description": "
Acme Corp. is dedicated to...
",
+ "questions": [
+ {
+ "id": 1,
+ "label": "Favorite Color",
+ "required": false,
+ "type":"multi_value_multi_select",
+ "answer_options": [
+ {
+ "id": 100,
+ "label": "Red",
+ "free_form": false
+ },
+ {
+ "id": 101,
+ "label": "Green",
+ "free_form": false
+ },
+ {
+ "id": 102,
+ "label": "Blue",
+ "free_form": false
+ },
+ {
+ "id": 102,
+ "label": "Prefer to Type My Own",
+ "free_form": true
+ }
+ ]
+ }
+ ]
+ }
+}
+```
+
+Returns a job post. Setting the questions querystring parameter to
+`"true"` will include the list of job application fields; these fields
+can be used to dynamically construct your own job application form.
+
+Any job custom fields you have selected to be exposed in the job board API will be shown in the `metadata` attribute.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs/{job_id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+job_id | ID of the job to retrieve
+
+### Querystring Parameters
+
+Parameter | Description
+--------- | -----------
+*questions | If set to `true`, include additional fields in the response:
- `questions`: An array of custom questions defined for this job post - `location_questions`: An array of questions used to capture the applicant's location (included only if the job post has the location configured as "optional" or "required") - `compliance`: An array of questions used by government contractors to capture applicant information to comply with EEOC regulations (included only if the job post has EEOC questions enabled) - `demographic_questions`: An object containing demographic questions and related information (included only if your organization has Greenhouse Inclusion, and the job post has demographic questions enabled)
+*pay_transparency | If set to `true`, include an array of `pay_input_ranges` with the pay range information defined for this job post.
+
+### Questions / Location Questions / Compliance
+
+Possible field types:
+
+| Type | How to represent |
+|------|------------------|
+| input_file | Represent with an input of type file |
+| input_text | Represent with an input of type text |
+| input_hidden | Represent with an input of type hidden |
+| textarea | Represent with a textarea |
+| multi_value_single_select | Can be represented as either a set of radio buttons or a select
+| multi_value_multi_select | Can be represented as either a set of checkboxes or a multi-select
+
+Please note that it is possible for multiple fields to be aggregated beneath a single question. The "Resume" field is a prime example, with both an input_file and textarea type accepted. If marked as required, then we expect at least one of these fields to contain a valid value when your form is submitted to the [application submission](#applications) endpoint.
+
+### Demographic Questions
+
+| Type | How to represent |
+|------|------------------|
+| multi_value_single_select | Can be represented as either a set of radio buttons or a select
+| multi_value_multi_select | Can be represented as either a set of checkboxes or a multi-select
+
+For organizations using Greenhouse Inclusion, the response may contain demographic questions. Each question contains an array of answer options that may be rendered based on the question 'type' defined in the table above. The candidate must select an answer option for questions with `required` set to `true`. If an answer option is selected that has `free_form` set to `true`, the candidate must be allowed to type a free-form response. This free-form response is only required if no other answer options have been selected by the candidate.
+
+### Data Compliance
+
+For organizations with GDPR rules configured and operating with a legal basis of explicit consent, the response may contain data_compliance objects. These objects will include whether a response is required and the data retention period in days as configured by the appropriate rule.
+
+### Board-level Introductions and Conclusions
+
+For organizations with Default Descriptions authored on the Job Board, the `content` field will include the Board-level Introduction, Post-level Description, and Board-level Conclusion as a single concatenated string.
diff --git a/source/includes/job-board/_offices.md b/source/includes/job-board/_offices.md
new file mode 100644
index 00000000000..3eded47fbb9
--- /dev/null
+++ b/source/includes/job-board/_offices.md
@@ -0,0 +1,264 @@
+# Offices
+
+## List offices
+
+> With `render_as=list` (default)
+
+```json
+{
+ "offices":[
+ {
+ "id":10201,
+ "name":"West Coast",
+ "departments":[
+ ],
+ "child_ids":[
+ 11111
+ ]
+ },
+ {
+ "id":11111,
+ "name":"San Francisco",
+ "departments":[
+ {
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ],
+ "parent_id":null,
+ "child_ids":[
+ ]
+ },
+ {
+ "id":22222,
+ "name":"Account Management",
+ "jobs":[
+
+ ],
+ "parent_id":null,
+ "child_ids":[
+ ]
+ },
+ ],
+ "parent_id":10201,
+ "child_ids":[
+ ]
+ },
+ ]
+}
+```
+> With `render_as=tree`
+
+```json
+{
+ "offices":[
+ {
+ "id":10201,
+ "name":"West Coast",
+ "departments":[
+ ],
+ "children":[
+ {
+ "id":11111,
+ "name":"San Francisco",
+ "departments":[
+ {
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ],
+ "children":[
+ ]
+ },
+ {
+ "id":22222,
+ "name":"Account Management",
+ "jobs":[
+
+ ],
+ "children":[
+ ]
+ },
+ ]
+ "children":[
+ ]
+ },
+ ]
+ },
+ ]
+}
+```
+
+Returns a list of all of your organization's departments and jobs, grouped by office.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/offices`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+render_as | No | string | This parameter defines how to represent the list of offices. The default value is 'list'.
+
+Allowed `render_as` values:
+
+| Value | Description |
+|-------|--------------|
+| list | (Default). The offices are returned as a list of objects and they include `parent_id` and `child_ids`. |
+| tree | The offices are returned as a list of trees with `children`. |
+
+## Retrieve an office
+
+> With `render_as=list` (default)
+
+```json
+{
+ "id":11111,
+ "name":"San Francisco",
+ "departments":[
+ {
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ]
+ },
+ {
+ "id":22222,
+ "name":"Account Management",
+ "jobs":[]
+ }
+ ],
+ "parent_id":10201,
+ "child_ids":[
+ ]
+}
+```
+
+> With `render_as=tree`
+
+```json
+{
+ "id":11111,
+ "name":"San Francisco",
+ "departments":[
+ {
+ "id":33333,
+ "name":"Engineering",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Product Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Mobile Engineer - iOS",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ]
+ },
+ {
+ "id":22222,
+ "name":"Account Management",
+ "jobs":[]
+ }
+ ],
+ "children":[
+ ]
+}
+```
+
+Returns a list of your organization's departments and jobs for the given `office_id`.
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/offices/{office_id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+office_id | ID of the office to retrieve
+
+### Querystring Parameters
+
+Parameter | Required | Type | Description
+--------- | ----------- | ----------- | -----------
+render_as | No | string | This parameter defines how to represent the list of offices. The default value is 'list'.
+
+Allowed `render_as` values:
+
+| Value | Description |
+|-------|--------------|
+| list | (Default).
+| tree | The children offices are returned as a tree. |
diff --git a/source/includes/job-board/_sections.md b/source/includes/job-board/_sections.md
new file mode 100644
index 00000000000..8c94ee9ecf5
--- /dev/null
+++ b/source/includes/job-board/_sections.md
@@ -0,0 +1,104 @@
+# Prospect Post Sections
+
+## List sections
+
+```json
+{
+ "sections":[
+ {
+ "id":14128,
+ "name":"Don't see a job you like?",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Product Manager",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ]
+ },
+ {
+ "id":85764,
+ "name":"General Application",
+ "jobs":[
+ {
+ "id":888888,
+ "title":"Prospect",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=888888"
+ }
+ ]
+ }
+ ]
+}
+```
+
+Returns a list of your organization’s sections and prospect posts. Prospect posts can be listed under a specific department or section. To view all prospect posts, list jobs and filter results by null `internal_job_id`
+
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/sections`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+
+## Retrieve a section
+
+```json
+{
+ "id":14128,
+ "name":"Don't see a job you like?",
+ "jobs":[
+ {
+ "id":44444,
+ "title":"Engineer",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=444444"
+ },
+ {
+ "id":55555,
+ "title":"Product Manager",
+ "location":{
+ "name":"San Francisco, CA"
+ },
+ "updated_at":"2013-07-02T19:39:23Z",
+ "absolute_url":"http://your.co/careers?gh_jid=55555"
+ }
+ ]
+}
+```
+
+Returns a list of prospect posts for a given `section_id`
+
+### HTTP Request
+
+`GET https://boards-api.greenhouse.io/v1/boards/{board_token}/sections/{section_id}`
+
+### URL Parameters
+
+Parameter | Description
+--------- | -----------
+board_token | Job Board URL token
+section_id | ID of the section to retrieve
diff --git a/source/includes/webhooks/_application_events.md b/source/includes/webhooks/_application_events.md
new file mode 100644
index 00000000000..c0410a55c3b
--- /dev/null
+++ b/source/includes/webhooks/_application_events.md
@@ -0,0 +1,703 @@
+# Application Events
+
+## Application created
+
+```json
+{
+ "action": "new_candidate_application",
+ "payload": {
+ "application": {
+ "id": 71980812,
+ "rejected_at": null,
+ "prospect": false,
+ "status": "active",
+ "applied_at": "2017-10-27T14:44:43Z",
+ "last_activity_at": "2017-10-27T14:44:42Z",
+ "url": "http://app.greenhouse.io/people/60304594?application_id=71980812",
+ "source": {
+ "id": 16,
+ "name": "LinkedIn (Prospecting)"
+ },
+ "credited_to": {
+ "id": 92120,
+ "email": "test123@example.com",
+ "name": "Greenhouse Admin",
+ "employee_id": "123ABC"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "current_stage": {
+ "id": 2944102,
+ "name": "Preliminary Phone Screen",
+ "interviews": [
+ {
+ "id": 4368004,
+ "name": "Preliminary Screening Call",
+ "status": "to_be_scheduled",
+ "interview_kit": {
+ "url": "http://app.greenhouse.io/guides/4368142/people/60304594?application_id=71980812",
+ "content": "
Directions on how to conduct this interview.
",
+ "questions": [
+ {
+ "id": 3136352,
+ "question": "Could you tell me about your previous experience?"
+ },
+ {
+ "id": 3136353,
+ "question": "Why do you want to work with us?"
+ }
+ ]
+ },
+ "interviewers": []
+ }
+ ]
+ },
+ "prospect_detail": {
+ "prospect_pool": null,
+ "prospect_stage": null,
+ "prospect_owner": null
+ },
+ "custom_fields": {
+ "application_custom_test": {
+ "name": "Application Custom Test",
+ "type": "single_select",
+ "value": null
+ },
+ "custom_boolean_test": {
+ "name": "Custom Boolean Test",
+ "type": "boolean",
+ "value": null
+ }
+ },
+ "candidate": {
+ "id": 60304594,
+ "first_name": "Jane",
+ "last_name": "Smith",
+ "title": "Manager",
+ "company": "Current Company Co.",
+ "created_at": "2017-10-27T14:44:42Z",
+ "external_id": null,
+ "photo_url": null,
+ "url": "http://app.greenhouse.io/people/60304594",
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "555-555-5555",
+ "type": "mobile"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "person@work.com",
+ "type": "work"
+ },
+ {
+ "value": "person@example.com",
+ "type": "personal"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "123 Test Street\nNew York, NY 10001",
+ "type": "home"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "mysite.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "socialmedia.com"
+ }
+ ],
+ "educations": [
+ {
+ "school_name": "Stanford University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Computer Science",
+ "start_date": "09/15/2007",
+ "end_date": "05/15/2011"
+ }
+ ],
+ "employments": [],
+ "recruiter": {
+ "id": 92121,
+ "email": "employee@test.com",
+ "name": "Betty Smith",
+ "employee_id": "123ABC"
+ },
+ "coordinator": {
+ "id": 92427,
+ "email": "user@example.com",
+ "name": "Bonnie Bonnet",
+ "employee_id": "456DEF"
+ },
+ "attachments": [
+ {
+ "filename": "Test Cover Letter.docx",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "cover_letter"
+ },
+ {
+ "filename": "Test Resume.docx",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ }
+ ],
+ "tags": [
+ "Ruby",
+ "Comp Sci"
+ ],
+ "custom_fields": {
+ "date_test": {
+ "name": "Date Test",
+ "type": "date",
+ "value": ""
+ },
+ "desired_salary": {
+ "name": "Desired Salary",
+ "type": "short_text",
+ "value": null
+ },
+ "graduation_year_1": {
+ "name": "Graduation Year",
+ "type": "single_select",
+ "value": null
+ },
+ "work_remotely": {
+ "name": "Work Remotely",
+ "type": "boolean",
+ "value": null
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 274075,
+ "name": "Data Scientist",
+ "requisition_id": "ABC",
+ "notes": null,
+ "confidential": false,
+ "job_post_id": 263533,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2016-07-14T17:21:30Z",
+ "opened_at": "2016-07-20T16:00:00Z",
+ "closed_at": null,
+ "url": "http://app.greenhouse.io/sdash/274075",
+ "departments": [
+ {
+ "id": 8717,
+ "name": "Data Science",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 16478,
+ "name": "London",
+ "location": "London, United Kingdom",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "user_id": 92913,
+ "employee_id": "123ABC"
+ }
+ ],
+ "sourcers": [
+ {
+ "user_id": 92427,
+ "employee_id": null
+ }
+ ],
+ "recruiters": [
+ {
+ "user_id": 92427,
+ "employee_id": null
+ }
+ ],
+ "coordinators": [
+ {
+ "user_id": 92427,
+ "employee_id": "DEFG123"
+ }
+ ]
+ },
+ "custom_fields": {
+ "date_test": {
+ "name": "Date Test",
+ "type": "date",
+ "value": "2017-10-27"
+ },
+ "employment_type": {
+ "name": "Employment",
+ "type": "single_select",
+ "value": "Full-time"
+ },
+ "replacement_role_": {
+ "name": "Replacement Role",
+ "type": "boolean",
+ "value": true
+ },
+ "salary_range_2": {
+ "name": "Salary Range",
+ "type": "currency_range",
+ "value": {
+ "unit": null,
+ "min_value": "10000.0",
+ "max_value": "10000.0"
+ }
+ },
+ "test_field_1": {
+ "name": "Test Short Text Field",
+ "type": "short_text",
+ "value": "test"
+ },
+ "test_user_field": {
+ "name": "Test User Field",
+ "type": "user",
+ "value": {
+ "user_id": 117730,
+ "name": "Job Admin",
+ "email": "asegal+jobadmin@greenhouse.io",
+ "employee_id": "user-abc"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+The New Candidate Application event occurs when a new application is created for a candidate.
+
+See webhook [common attributes](#common-attributes).
+
+## Application deleted
+
+This webhook only fires when individual applications are destroyed. This occurs when the Harvest API delete endpoint is used, when a candidate is removed from a specific job, or when two duplicate candidates on the same job are merged together. This will not fire when a candidate is deleted. A candidate being deleted implies all their applications have been deleted with them.
+
+```json
+{
+ "action": "delete_application",
+ "payload": {
+ "application": {
+ "id": 46194062,
+ "candidate_id": 37031511,
+ "job_id": 371417,
+ "created_at": "2013-03-22T00:00:00Z",
+ "source_id": 2,
+ "candidate_rejection_reason_id": null,
+ "rejection_note_id": 123,
+ "rejected_at": "2014-04-22T01:00:00Z",
+ "referrer_id": 158104,
+ "prospect": false,
+ "rejected_by_user_id": 158103
+ }
+ }
+}
+```
+
+### Noteworthy response attributes
+
+| Attribute | Note |
+|------------|--------|
+| `rejected_by_user_id` | The Greenhouse user who rejected this application, if the application is rejected. |
+
+## Application updated
+
+```json
+{
+ "action": "application_updated",
+ "payload": {
+ "application": {
+ "id": 22202940,
+ "rejected_at": null,
+ "prospect": false,
+ "prospect_detail": {
+ "prospect_owner": null,
+ "prospect_pool": null,
+ "prospect_stage": null
+ },
+ "status": "active",
+ "applied_at": "2015-12-03T06:31:26Z",
+ "last_activity_at": "2015-12-03T06:31:26Z",
+ "url": "https://app.greenhouse.io/people/13857579?application_id=22202940",
+ "source": {
+ "id":2,
+ "name": "Jobs page on your website"
+ },
+ "credited_to": {
+ "id": 3695,
+ "email": "beauregard.blacksmith.3695@example.com",
+ "name": "Beauregard Blacksmith",
+ "employee_id": "123ABC"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "current_stage": {
+ "id": 711020,
+ "name": "Application Review",
+ "interviews": [
+ {
+ "id": 1063685,
+ "name": "Application Review",
+ "status": "collect_feedback",
+ "interview_kit": {
+ "url": "http://app.greenhouse.io/guides/1063859/people/13857579",
+ "content": "",
+ "questions":[]
+ },
+ "interviewers": []
+ }
+ ]
+ },
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example"
+ }
+ },
+ "candidate": {
+ "id": 13857579,
+ "first_name": "Hank",
+ "last_name": "Von Diablo",
+ "title": null,
+ "company": null,
+ "created_at": "2015-12-03T06:31:26Z",
+ "external_id": null,
+ "photo_url": null,
+ "url": "https://app.greenhouse.io/people/13857579",
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "330-281-8004",
+ "type": "other "
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "hank.von diablo.13857579@example.com",
+ "type": "personal"
+ }
+ ],
+ "addresses": [],
+ "website_addresses": [
+ {
+ "value": "http://www.example.com/",
+ "type": "other"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "https://twitter.com/TheRock"
+ }
+ ],
+ "educations": [],
+ "recruiter":null,
+ "coordinator": null,
+ "attachments":[],
+ "tags":[],
+ "custom_fields": {
+ "current_salary": {
+ "name": "Current Salary",
+ "type": "short_text",
+ "value": null
+ },
+ "desired_salary": {
+ "name": "Desired Salary",
+ "type": "short_text",
+ "value":null
+ }
+ }
+ },
+ "jobs": []
+ }
+ }
+}
+
+
+```
+
+The Application Updated event occurs when an application is updated.
+
+See webhook [common attributes](#common-attributes).
+
+## Offer created
+
+This webhook fires when creating a new offer in Greenhouse. This may also fire when changing an offer if the change causes a new version to be created. When bulk creating offers, this will fire per offer created.
+
+```json
+{
+ "action": "offer_created",
+ "payload": {
+ "id": 12345,
+ "application_id": 234556,
+ "job_id": 45678,
+ "user_id": 67890,
+ "version": 1,
+ "sent_on": "2013-03-22",
+ "resolved_at": "2013-03-25T00:00:00Z",
+ "start_date": "04/15/2013",
+ "notes": "Vacation scheduled 4/20 - 4/23",
+ "offer_status": "Accepted",
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example"
+ }
+ }
+ }
+}
+```
+
+## Offer approved
+
+This webhook fires when an offer requires approval and the approval is received.
+
+```json
+{
+ "action": "offer_approved",
+ "payload": {
+ "id": 12345,
+ "application_id": 234556,
+ "job_id": 45678,
+ "user_id": 67890,
+ "version": 1,
+ "sent_on": "2013-03-22",
+ "resolved_at": "2013-03-25T00:00:00Z",
+ "start_date": "04/15/2013",
+ "notes": "Vacation scheduled 4/20 - 4/23",
+ "offer_status": "Accepted",
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example"
+ }
+ }
+ }
+}
+```
+
+## Offer updated
+
+This webhook fires when an offer is updated. In some cases, an offer may be changed without generating a new version. In that case, this will fire by itself. If a change causes a new offer version to be generated, this will fire on the old version with the update to deprecate this offer and also a new "create" webhook will fire for the new version. This webhook should also fire when a person is hired, which marks the offer as "accepted."
+
+```json
+{
+ "action": "offer_updated",
+ "payload": {
+ "id": 12345,
+ "application_id": 234556,
+ "job_id": 45678,
+ "user_id": 67890,
+ "version": 2,
+ "sent_on": "2013-03-22",
+ "resolved_at": "2013-03-25T00:00:00Z",
+ "start_date": "04/15/2013",
+ "notes": "Vacation scheduled 4/20 - 4/23",
+ "offer_status": "Deprecated",
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example"
+ }
+ }
+ }
+}
+```
+
+## Offer deleted
+
+This webhook only fires when offers are deleted from the Greenhouse system. This only happens when the "Delete" link is clicked on an individual offer or when the anonymize candidate process is run with the "all_offer_versions" option selected. This will not fire individually when an application is deleted.
+
+```json
+{
+ "action": "offer_deleted",
+ "payload": {
+ "offer": {
+ "id": 506406,
+ "application_id": 46194062,
+ "offering_user_id": 158104,
+ "offer_status": "Created",
+ "version": 1,
+ "sent_on": "2013-03-22",
+ "resolved_at": "2013-03-25T00:00:00Z",
+ "notes": "These are notes on the offer.",
+ "job_id": 371417
+ }
+}
+```
+
+### Noteworthy response attributes
+
+| Attribute | Note |
+|------------|--------|
+| `offer_status` | One of Created, Accepted, Rejected, or Deprecated. |
+| `version` | This is the version of the offer in Greenhouse. New versions are triggered when certain fields are updated. |
+| `sent_on` | When the offer was sent to the candidate |
+| `resolved_at` | When this version was either accepted, rejected, or deprecated (a new version was made) |
+
+
+## Prospect created
+
+```json
+{
+ "action": "new_prospect_application",
+ "payload": {
+ "application": {
+ "id": 979554,
+ "rejected_at": null,
+ "prospect": true,
+ "status": "active",
+ "applied_at": "2014-12-02T23:10:16Z",
+ "last_activity_at": "2014-12-02T23:10:16Z",
+ "url": "https://app.greenhouse.io/people/968190?application_id=979554",
+ "source": {
+ "id": 13,
+ "public_name": "Referral"
+ },
+ "credited_to": {
+ "id": 2622,
+ "email": "carl.buddha.2622@example.com",
+ "name": "Carl Buddha",
+ "employee_id": "123ABC"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "current_stage": null,
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": null
+ }
+ },
+ "candidate": {
+ "id": 968190,
+ "first_name": "Trisha",
+ "last_name": "Troy",
+ "title": null,
+ "company": null,
+ "created_at": "2014-12-02T23:10:16Z",
+ "external_id": null,
+ "photo_url": null,
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "123456",
+ "type": "other"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "t.troy@example.com",
+ "type": "personal"
+ }
+ ],
+ "addresses": [],
+ "website_addresses": [],
+ "social_media_addresses": [],
+ "educations": [
+ {
+ "school_name": "Harvard University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Information Systems",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "recruiter": {
+ "id": 3128,
+ "email": "alicia.flopple.3128@example.com",
+ "name": "Alicia Flopple",
+ "employee_id": "456DEF"
+ },
+ "coordinator": null,
+ "attachments": [
+ {
+ "filename": "resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ }
+ ],
+ "tags": [
+ "Import from Previous ATS"
+ ],
+ "custom_fields": {
+ "favorite_color": {
+ "name": "Favorite Color",
+ "type": "short_text",
+ "value": "Blue"
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 371417,
+ "name": "Designer",
+ "requisition_id": null,
+ "notes": "Digital and print",
+ "confidential": false,
+ "job_post_id": 54321,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2013-10-02T22:59:29Z",
+ "opened_at": "2015-01-23T00:25:04Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 237,
+ "name": "Community",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 54,
+ "name": "New York",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full Time"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+The New Prospect Application event occurs when a new prospect application is created.
+
+See webhook [common attributes](#common-attributes).
+
diff --git a/source/includes/webhooks/_candidate_events.md b/source/includes/webhooks/_candidate_events.md
new file mode 100644
index 00000000000..93581368047
--- /dev/null
+++ b/source/includes/webhooks/_candidate_events.md
@@ -0,0 +1,1170 @@
+# Candidate Events
+
+## Candidate deleted
+
+This webhook will fire when a candidate or prospect is deleted from Greenhouse. This occurs when the Harvest delete candidate methods are used, when a candidate is merged into another candidate, when a candidate is deleted in the application, and once for each candidate in a bulk delete operation. Deleting a candidate will cause other deletes within Greenhouse but we will not fire an individual webhook for those deletions. In the case of the applications that this delete causes, we will include an array of those Application IDs that will be removed from Greenhouse.
+
+```json
+{
+ "action": "delete_candidate",
+ "payload": {
+ "person": {
+ "id": 37031511,
+ "first_name": "Jack",
+ "last_name": "Sparrow",
+ "company": "Pirate Shipping",
+ "title": "Captain",
+ "created_at": "2013-03-22T00:00:00Z",
+ "headline": "Eager to find a new commission",
+ "is_private": false,
+ "recruiter_user_id": 123,
+ "coordinator_user_id": 456,
+ "can_email": false,
+ "deleted_application_ids": [
+ 46196263,
+ 46196258
+ ]
+ }
+ }
+}
+```
+
+### Noteworthy response attributes
+
+| Attribute | Note |
+|------------|--------|
+| `is_private` | True or false; if this candidate has been marked private in Greenhouse. |
+| `recruiter_user_id` | The Greenhouse user_id of this candidate's recruiter |
+| `coordinator_user_id` | The Greenhouse user_id of this candidate's coordinator |
+| `can_email` | True or false; if this candidate can be e-mailed. |
+| `application_ids` | This is an array containing the Greenhouse application IDs that will be deleted as a consequence of this candidate being deleted |
+| `deleted_application_ids` | In many merge cases, this section will be blank, as applications will have been merged into the new candidate. |
+
+## Candidate hired
+
+```json
+{
+ "action": "hire_candidate",
+ "payload": {
+ "application": {
+ "id": 46194062,
+ "opening": {
+ "opening_id": "1234-56",
+ "custom_fields": []
+ },
+ "credited_to": {
+ "id": 158104,
+ "email": "bob_johnson1@localhost.com",
+ "name": "Robert Johnson",
+ "employee_id": "123ABC"
+ },
+ "source": {
+ "id": 25,
+ "public_name": "Monster"
+ },
+ "url": "https://app.greenhouse.io/people/35897443?application_id=46194062",
+ "candidate": {
+ "id": 35897443,
+ "first_name": "Johnny",
+ "last_name": "Smith",
+ "title": "Previous Title",
+ "external_id": "12345",
+ "url": "https://app.greenhouse.io/people/35897443",
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "518-555-1212",
+ "type": "work"
+ },
+ {
+ "value": "212-555-1212",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "personal@example.com",
+ "type": "personal"
+ },
+ {
+ "value": "work@example.com",
+ "type": "work"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "455 Broadway New York, NY 10280",
+ "type": "home"
+ }
+ ],
+ "educations": [
+ {
+ "school_name": "Harvard University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Information Systems",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "recruiter": {
+ "id": 55,
+ "email": "bob_johnson@localhost.com",
+ "name": "Bob Johnson",
+ "employee_id": "456DEF"
+ },
+ "coordinator": {
+ "id": 56,
+ "email": "bob_johnson_approver1@localhost.com",
+ "name": "Robert J Approver",
+ "employee_id": "789GHI"
+ },
+ "attachments": [
+ {
+ "filename": "resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ }
+ ],
+ "custom_fields": {
+ "desired_level": {
+ "name": "Desired Level",
+ "type": "short_text",
+ "value": "Senior"
+ },
+ "favorite_programming_language": {
+ "name": "Favorite Programming Language",
+ "type": "short_text",
+ "value": "Rails"
+ }
+ }
+ },
+ "job": {
+ "id": 323753,
+ "name": "Developer",
+ "open_date": "2014-11-20T22:49:14Z",
+ "close_date": "2014-11-25T22:49:14Z",
+ "requisition_id": null,
+ "departments": [
+ {
+ "id": 7,
+ "name": "Technology",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 13,
+ "name": "New York City",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ },
+ {
+ "id": 14,
+ "name": "St. Louis",
+ "location": null,
+ "external_id": null
+ }
+ ],
+ "custom_fields": {
+ "approved": {
+ "name": "Approved",
+ "type": "boolean",
+ "value": true
+ },
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full-time"
+ },
+ "salary_range": {
+ "name": "SalaryRange",
+ "type": "currency_range",
+ "value": {
+ "unit": "USD",
+ "min_value": "10000.0",
+ "max_value": "20000.0"
+ }
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 323753,
+ "name": "Developer",
+ "requisition_id": null,
+ "confidential": false,
+ "opened_at": "2014-11-20T22:49:14Z",
+ "closed_at": "2014-11-25T22:49:14Z",
+ "departments": [
+ {
+ "id": 7,
+ "name": "Technology",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 13,
+ "name": "New York City",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ },
+ {
+ "id": 14,
+ "name": "St. Louis",
+ "location": null,
+ "external_id": null
+ }
+ ],
+ "custom_fields": {
+ "approved": {
+ "name": "Approved",
+ "type": "boolean",
+ "value": true
+ },
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full-time"
+ },
+ "salary_range": {
+ "name": "SalaryRange",
+ "type": "currency_range",
+ "value": {
+ "unit": "USD",
+ "min_value": "10000.0",
+ "max_value": "20000.0"
+ }
+ }
+ }
+ }
+ ],
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example123"
+ }
+ },
+ "offer": {
+ "id": 506409,
+ "version": 2,
+ "created_at": "2014-11-20T22:49:14Z",
+ "sent_at": "2014-11-10",
+ "resolved_at": "2014-11-20T22:49:14Z",
+ "starts_at": "2015-01-23",
+ "custom_fields": {
+ "salary": {
+ "name": "Salary",
+ "type": "currency",
+ "value": {
+ "amount": 80000,
+ "unit": "USD"
+ }
+ },
+ "seasons": {
+ "name": "Seasons",
+ "type": "multi_select",
+ "value": [
+ "Season 1",
+ "Season 2"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+The Hire Candidate event occurs when an offer is accepted. This is triggered by clicking the "Accept Offer" button on the candidate's Private tab.
+
+### Noteworthy attributes
+
+See webhook [common attributes](#common-attributes).
+
+| Attribute | Note |
+|-----------|------|
+| `application.offer.id` | Unique Greenhouse identifier of the offer. Information not included in the webhook can be retrieved via [Harvest API - GET Offers](/harvest.html#offers)
+| `application.offer.created_at` | Date when this offer was drafted.
+| `application.offer.sent_on` | Date when this offer was sent to the candidate.
+| `application.offer.resolved_at` | Date the offer was accepted.
+| `application.offer.starts_at` | The candidate's start date. Expected format is YYYY-MM-DD
+| `application.job` | Deprecated. Use `application.jobs[]` instead
+| `application.job.close_date` | Deprecated. Use `application.jobs[].closed_at` instead.
+| `application.job.open_date` | Deprecated. Use `application.jobs[].opened_at` instead.
+| `application.opening.custom_fields` | This element may be omitted if the organization does not have custom fields for openings enabled.
+
+## Candidate merged
+
+This webhook will fire when a candidate or prospect is merged with another candidate. This process should fire for regular manual merges and auto-merges. It will also fire per candidate for a bulk merge. This webhook supersedes the candidate deleted webhook. If both candidate deleted and candidate merged are configured on your site, only the candidate merged webhook will fire when candidate records are removed via merge. If a candidate deleted webhook is configured but candidate merged is not, then the candidate deleted webhook will fire when a candidate record is deleted via merge. The payload for a candidate merged webhook matches the payload for candidate deleted except it contains the ID of the winning candidate record.
+
+```json
+{
+ "action": "merge_candidate",
+ "payload": {
+ "person": {
+ "id": 37031511,
+ "first_name": "Jack",
+ "last_name": "Sparrow",
+ "company": "Pirate Shipping",
+ "title": "Captain",
+ "created_at": "2013-03-22T00:00:00Z",
+ "headline": "Eager to find a new commission",
+ "is_private": false,
+ "recruiter_user_id": 123,
+ "coordinator_user_id": 456,
+ "can_email": false,
+ "new_candidate_id": 457456
+ }
+ }
+}
+```
+
+### Noteworthy response attributes
+
+| Attribute | Note |
+|------------|--------|
+| `new_candidate_id` | The ID of the candidate to whom this candidate has been merged |
+
+## Candidate stage change
+
+```json
+{
+ "action": "candidate_stage_change",
+ "payload": {
+ "application": {
+ "id": 265277,
+ "rejected_at": null,
+ "prospect": false,
+ "status": "active",
+ "applied_at": "2013-03-22T00:00:00Z",
+ "last_activity_at": "2015-02-09T16:38:36Z",
+ "url": "https://app.greenhouse.io/people/265772?application_id= 265277",
+ "source": {
+ "id": 31,
+ "name": "Agency"
+ },
+ "credited_to": {
+ "id": 15,
+ "email": "ada@example.com",
+ "name": "Ada Lacey",
+ "employee_id": "123ABC"
+ },
+ "rejection_reason": null,
+ "rejection_details": null,
+ "current_stage": {
+ "id": 71416,
+ "name": "Assessment",
+ "interviews": [
+ {
+ "id": 113101,
+ "name": "Assessment",
+ "status": "to_be_scheduled",
+ "interview_kit": {
+ "url": "https://app.greenhouse.io/guides/113153/people/265772",
+ "content": "Assess their skills",
+ "questions": []
+ },
+ "interviewers": [
+ {
+ "id": 2622,
+ "display_name": "Carl Buddha",
+ "status": "tentative"
+ }
+ ]
+ }
+ ]
+ },
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example"
+ }
+ },
+ "candidate": {
+ "id": 265772,
+ "first_name": "Giuseppe",
+ "last_name": "Hurley",
+ "title": "Great Person",
+ "company": null,
+ "created_at": "2013-10-04T01:24:44Z",
+ "external_id": "241b399ce4b0fd1c84e5528d",
+ "photo_url": null,
+ "url": "https://app.greenhouse.io/people/265772",
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "330-281-8004",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "giuseppe.hurley@example.com",
+ "type": "personal"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "123 Fake St.",
+ "type": "home"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "ghurley.example.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "linkedin.example.com/ghurley"
+ }
+ ],
+ "educations": [
+ {
+ "school_name": "Harvard University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Information Systems",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "recruiter": {
+ "id": 3128,
+ "email": "alicia.flopple.3128@example.com",
+ "name": "Alicia Flopple",
+ "employee_id": "789GHI"
+ },
+ "coordinator": {
+ "id": 3128,
+ "email": "alicia.flopple.3128@example.com",
+ "name": "Alicia Flopple",
+ "employee_id": "789GHI"
+ },
+ "attachments": [
+ {
+ "filename": "resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ },
+ {
+ "filename": "cover_letter.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "cover_letter"
+ },
+ {
+ "filename": "portfolio.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "attachment"
+ }
+ ],
+ "tags": [
+ "Import from Previous ATS"
+ ],
+ "custom_fields": {
+ "favorite_color": {
+ "name": "Favorite Color",
+ "type": "short_text",
+ "value": "Blue"
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 3485,
+ "name": "Designer",
+ "requisition_id": null,
+ "notes": "Digital and print",
+ "confidential": false,
+ "job_post_id": 553282,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2013-10-02T22:59:29Z",
+ "opened_at": "2015-01-23T00:25:04Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 237,
+ "name": "Community",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 54,
+ "name": "New York",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full Time"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+### Noteworthy response attributes
+
+See webhook [common attributes](#common-attributes).
+
+| Attribute | Note |
+|-----------|------|
+| `application.current_stage.interviews[].interviewers.status` | One of: `needs_action`, `declined`, `tentative`, `accepted`
+| `application.current_stage.interviews[].status` | One of: `to_be_scheduled`, `scheduled`, `awaiting_feedback`, `complete`, `skipped`, `collect_feedback`, `to_be_sent`, `sent`, `received`
+
+## Candidate unhired
+
+```json
+{
+ "action": "unhire_candidate",
+ "payload": {
+ "application": {
+ "id": 265293,
+ "rejected_at": null,
+ "prospect": false,
+ "status": "active",
+ "applied_at": "2013-03-22T00:00:00Z",
+ "last_activity_at": "2015-03-18T20:28:09Z",
+ "url": "https://app.greenhouse.io/people/265788?application_id=265293",
+ "source": {
+ "id": 27,
+ "public_name": "LinkedIn"
+ },
+ "credited_to": null,
+ "rejection_reason": null,
+ "rejection_details": null,
+ "current_stage": {
+ "id": 678901,
+ "name": "Application Review",
+ "interviews": [
+ {
+ "id": 989099,
+ "name":"Application Review",
+ "status": "collect_feedback",
+ "interview_kit": {
+ "url": "http://app.greenhouse.io/guides/67656/people/265788",
+ "content": "",
+ "questions": []
+ },
+ "interviewers": []
+ }
+ ]
+ },
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": null
+ }
+ },
+ "candidate": {
+ "id": 265788,
+ "first_name": "Hector",
+ "last_name": "Porter",
+ "title": null,
+ "company": null,
+ "created_at": "2013-10-04T01:24:48Z",
+ "external_id": null,
+ "photo_url": null,
+ "url": "https://app.greenhouse.io/people/265788",
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "330-281-8004",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "hector.porter.265788@example.com",
+ "type": "personal"
+ }
+ ],
+ "addresses": [],
+ "website_addresses": [],
+ "social_media_addresses": [],
+ "educations": [
+ {
+ "school_name": "Harvard University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Information Systems",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "recruiter": null,
+ "coordinator": null,
+ "attachments": [
+ {
+ "filename": "resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ }
+ ],
+ "tags": [
+ "Import from Previous ATS"
+ ],
+ "custom_fields": {
+ "favorite_color": {
+ "name": "Favorite Color",
+ "type": "short_text",
+ "value": "Blue"
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 371417,
+ "name": "Designer",
+ "requisition_id": null,
+ "notes": "Digital and print",
+ "confidential": false,
+ "job_post_id": 54321,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2013-10-02T22:59:29Z",
+ "opened_at": "2015-01-23T00:25:04Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 14501,
+ "name": "Community",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 9099,
+ "name": "New York",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full Time"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+This webhook only fires when the "Unhire" button is clicked in Greenhouse. This button is only available on the candidate profile page after a candidate has been hired.
+
+See webhook [common attributes](#common-attributes).
+
+## Candidate/Prospect rejected
+
+```json
+{
+ "action": "reject_candidate",
+ "payload": {
+ "application": {
+ "id": 265293,
+ "rejected_at": "2015-02-11T15:50:41Z",
+ "prospect": false,
+ "status": "rejected",
+ "applied_at": "2013-03-22T00:00:00Z",
+ "last_activity_at": "2015-02-11T15:50:41Z",
+ "url": "https://app.greenhouse.io/people/265788?application_id=265293",
+ "source": {
+ "id": 27,
+ "public_name": "LinkedIn"
+ },
+ "credited_to": null,
+ "rejection_reason": {
+ "id": 14,
+ "name": "Too Junior",
+ "type": {
+ "id": 3,
+ "name": "Wrong skill set"
+ }
+ },
+ "rejection_details": {
+ "custom_fields": {
+ "custom_rejection_question_field": {
+ "name": "Custom Rejection Question Field",
+ "type": "short_text",
+ "value": "Example"
+ }
+ }
+ },
+ "current_stage": {
+ "id": 2708728,
+ "name": "Offer",
+ "interviews": []
+ },
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example123"
+ }
+ },
+ "candidate": {
+ "id": 265788,
+ "first_name": "Hector",
+ "last_name": "Porter",
+ "title": null,
+ "company": null,
+ "created_at": "2013-10-04T01:24:48Z",
+ "external_id": null,
+ "photo_url": null,
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "330-281-8004",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "hector.porter.265788@example.com",
+ "type": "personal"
+ }
+ ],
+ "addresses": [],
+ "website_addresses": [],
+ "social_media_addresses": [],
+ "educations": [
+ {
+ "school_name": "Harvard University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Information Systems",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "recruiter": null,
+ "coordinator": null,
+ "attachments": [
+ {
+ "filename": "resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ }
+ ],
+ "tags": [
+ "Imported"
+ ],
+ "custom_fields": {
+ "favorite_color": {
+ "name": "Favorite Color",
+ "type": "short_text",
+ "value": "Blue"
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 371417,
+ "name": "Designer",
+ "requisition_id": null,
+ "notes": "Digital and print",
+ "confidential": false,
+ "job_post_id": 54321,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2013-10-02T22:59:29Z",
+ "opened_at": "2015-01-23T00:25:04Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 237,
+ "name": "Community",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 9099,
+ "name": "New York",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full Time"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+The Reject Candidate event occurs when a prospect or candidate is rejected for a position. When candidates are rejected via a bulk action, a webhook will fire once for each candidate or prospect rejected.
+
+See webhook [common attributes](#common-attributes).
+
+## Candidate/Prospect unrejected
+
+```json
+{
+ "action": "unreject_candidate",
+ "payload": {
+ "application": {
+ "id": 265293,
+ "rejected_at": null,
+ "prospect": false,
+ "status": "active",
+ "applied_at": "2013-03-22T00:00:00Z",
+ "last_activity_at": "2015-02-11T15:50:41Z",
+ "url": "https://app.greenhouse.io/people/265788?application_id=265293",
+ "source": {
+ "id": 27,
+ "public_name": "LinkedIn"
+ },
+ "credited_to": null,
+ "rejection_reason": null,
+ "rejection_details": null,
+ "current_stage": {
+ "id": 2708728,
+ "name": "Offer",
+ "interviews": []
+ },
+ "custom_fields": {
+ "custom_application_field": {
+ "name": "Custom Application Field",
+ "type": "short_text",
+ "value": "Example123"
+ }
+ },
+ "candidate": {
+ "id": 265788,
+ "first_name": "Hector",
+ "last_name": "Porter",
+ "title": null,
+ "company": null,
+ "created_at": "2013-10-04T01:24:48Z",
+ "external_id": null,
+ "photo_url": null,
+ "is_private": false,
+ "can_email": true,
+ "phone_numbers": [
+ {
+ "value": "330-281-8004",
+ "type": "home"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "hector.porter.265788@example.com",
+ "type": "personal"
+ }
+ ],
+ "addresses": [],
+ "website_addresses": [],
+ "social_media_addresses": [],
+ "educations": [
+ {
+ "school_name": "Harvard University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Information Systems",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "recruiter": null,
+ "coordinator": null,
+ "attachments": [
+ {
+ "filename": "resume.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ }
+ ],
+ "tags": [
+ "Imported"
+ ],
+ "custom_fields": {
+ "favorite_color": {
+ "name": "Favorite Color",
+ "type": "short_text",
+ "value": "Blue"
+ }
+ }
+ },
+ "jobs": [
+ {
+ "id": 371417,
+ "name": "Designer",
+ "requisition_id": null,
+ "notes": "Digital and print",
+ "confidential": false,
+ "job_post_id": 54321,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2013-10-02T22:59:29Z",
+ "opened_at": "2015-01-23T00:25:04Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 237,
+ "name": "Community",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 9099,
+ "name": "New York",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "custom_fields": {
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full Time"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+The Unreject Candidate event occurs when a prospect or candidate is unrejected.
+
+See webhook [common attributes](#common-attributes).
+
+## Candidate/Prospect updated
+
+```json
+{
+ "action": "update_candidate",
+ "payload": {
+ "candidate": {
+ "id": 15696179,
+ "first_name": "Ronald",
+ "last_name": "Ronnie",
+ "title": "Director of Strategic Initiatives",
+ "company": "Example",
+ "created_at": "2016-08-23T17:51:27Z",
+ "external_id": "946aa514658",
+ "photo_url": null,
+ "url": "https://app.greenhouse.io/people/15696179",
+ "phone_numbers": [
+ {
+ "value": "911",
+ "type": "mobile"
+ }
+ ],
+ "email_addresses": [
+ {
+ "value": "123456email@email.com",
+ "type": "work"
+ }
+ ],
+ "addresses": [
+ {
+ "value": "99-99 5th Ave.\nNew York, NY 101-11",
+ "type": "home"
+ }
+ ],
+ "website_addresses": [
+ {
+ "value": "google.com",
+ "type": "personal"
+ }
+ ],
+ "social_media_addresses": [
+ {
+ "value": "@ronaldronnie99999"
+ }
+ ],
+ "educations": [
+ {
+ "school_name": "Harvard University",
+ "degree": "Bachelor's Degree",
+ "discipline": "Information Systems",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "employments": [
+ {
+ "company_name": "Greenhouse",
+ "title": "Engineer",
+ "start_date": "01/01/2012",
+ "end_date": "01/01/2016"
+ }
+ ],
+ "recruiter": {
+ "id": 169779,
+ "email": "hank.hollandaise.169779@example.com",
+ "name": "Hank Hollandaise",
+ "employee_id": "123ABC"
+ },
+ "coordinator": {
+ "id": 83637,
+ "email": "sterling.kang.83637@example.com",
+ "name": "Sterling Kang",
+ "employee_id": "456DEF"
+ },
+ "attachments": [
+ {
+ "filename": "resumeA.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ },
+ {
+ "filename": "resumeB.pdf",
+ "url": "https://prod-heroku.s3.amazonaws.com/...",
+ "type": "resume"
+ }
+ ],
+ "tags": [
+ "foo",
+ "File Import"
+ ],
+ "custom_fields": {
+ "current_salary": {
+ "name": "Current Salary",
+ "type": "short_text",
+ "value": null
+ },
+ "desired_salary": {
+ "name": "Desired Salary",
+ "type": "short_text",
+ "value": null
+ }
+ }
+ }
+ }
+}
+```
+
+The Candidate or Prospect Updated event occurs when a candidate or prospect's standard field or custom field is updated. For instance, an update to a candidate's first name would trigger this event.
+
+See webhook [common attributes](#common-attributes).
+
+## Candidate anonymized
+
+This webhook will fire when a particular candidate receives an anonymize event. Anonymize events may occur from the [Anonymize Endpoint](#put-anonymize-candidate) in Harvest or may be configured in the GDPR page in the Greenhouse application. An anonymize webhook consists of the action type, the id of the candidate who had properties anonymized, and the information that was anonymized.
+
+```json
+{
+ "action": "candidate_anonymized",
+ "payload": {
+ "candidate_id": 37031511,
+ "anonymized_fields": ["full_name", "current_title"]
+ }
+}
+```
+
+### Anonymized Fields
+
+A list of possible anonymized fields are provided. If the item in "attribute" is received in the anonymized_fields array, the corresponding changes in notes have been applied in Greenhouse. Note that some of these fields may not be accessible via other webhooks or via Harvest.
+
+| Attribute | Anonymize Process |
+|------------|--------|
+| `activity_items` | Destroy all items in the candidate's activity feed of type "activity". In Harvest's Activity Feed endpoint, these are items in the `activities` section. |
+| `addresses` | Destroy all values from `candidate.addresses` |
+| `all_offer_versions` | For each of this candidate's applications, destroy all offers. (For legacy reasons, this will also raise an [Offer Deleted](#offer-deleted) webhook if one is configured.) |
+| `application_questions` | For each of this candidate's applications, destroy all values from `application.answers`. |
+| `attachments` | Destroy all attachments on this candidate and all their associated applications. |
+| `candidate_stage_data` | For each of this candidate's applications, set the `created_at` time to now, remove the candidate from the current stage, destroy all stage transition information, and set the candidate back to the first stage. |
+| `coordinator` | Set `candidate.coordinator` to null |
+| `credited_to` | For each of this candidate's application, destroy `application.credited_to`. |
+| `custom_application_fields` | For each of this candidate's applications, destroy `application.custom_fields`. |
+| `custom_candidate_fields` | Destroy all values from `candidate.custom_fields` |
+| `custom_rejection_question_fields` | For each of this candidate's application, destroy all custom fields on rejection details. |
+| `current_company` | Set `candidate.company` to null. |
+| `current_title` | Set `candidate.title` to null. |
+| `education` | Remove all values from `candidate.educations` |
+| `email_addresses` | Destroy all values from `candidate.email_addresses` |
+| `employment` | Remove all values from `candidate.employments` |
+| `emails` | Destroy record of any e-mails sent to this candidate via Greenhouse. |
+| `follow_up_reminders` | Destroy any follow-up reminders configured on this person. |
+| `full_name` | Set `candidate.first_name` to "Anonymized" and `candidate.last_name` to the `candidate.id`. |
+| `headline` | Set the candidate's headline to null. |
+| `inmails` | Destroy record of any LinkedIn Inmails synced to this candidate from LinkedIn. |
+| `innotes` | Destroy record of any LinkedIn Innotes synced to this candidate from LinkedIn. |
+| `location` | For each of this candidate's applications, set `application.location` to null. |
+| `notes` | Destroy all notes on this candidate. |
+| `offers` | Destroy all information on all offers on any of this candidate's applications without destroying that an offer was made. |
+| `phone_numbers` | Remove all values from `candidate.phone_numbers` |
+| `prospect_jobs` | Remove all associations between this prospect and jobs. |
+| `prospect_offices` | Remove all associations between this prospect and offices. |
+| `prospect_offices_and_departments` | Remove all associations between this prospect and departments. |
+| `prospect_owner` | For each of this candidate's prospect applications, destroy the prospect owner. |
+| `prospect_pool_and_stage` | For each of this candidate's application, destroy the prospect pool and the prospect pool stage. |
+| `recruiter` | Set `candidate.recruiter` to null |
+| `referral_questions` | Destroy all referral answers for this candidate. |
+| `rejection_notes` | Destroy all notes specifically related to this candidate's rejection. |
+| `rejection_reasons` | Set `rejection_reason` on all candidate applications to null. |
+| `scorecards_and_interviews` | Destroy all scorecards with this candidate id and all interviews with any application from this candidate id |
+| `social_media_links` | Remove all values from `candidate.social_media_addresses` |
+| `source` | Remove `application.source` in all this candidate's applications. |
+| `tags` | Remove all values from `candidate.tags` |
+| `third_party_integrations` | Disconnect the candidate's profile from the LinkedIn CSA and RSC integrations. |
+| `touchpoints` | Destroy all touchpoints on the candidate, all the candidate's applications, and any notes associated with touchpoints. |
+| `websites` | Remove all values from `candidate.website_addresses` |
diff --git a/source/includes/webhooks/_interview_events.md b/source/includes/webhooks/_interview_events.md
new file mode 100644
index 00000000000..18408c9bf8a
--- /dev/null
+++ b/source/includes/webhooks/_interview_events.md
@@ -0,0 +1,35 @@
+# Interview Events
+
+## Interview deleted
+
+This webhook fires when a scheduled interview is cancelled or the interview is deleted directly. This webhook will not fire if an interview is deleted because a candidate, application, or hiring plan is deleted.
+
+```json
+{
+ "action": "interview_deleted",
+ "payload": {
+ "interview": {
+ "id": 31087450
+ }
+ }
+}
+```
+## Scorecard deleted
+
+This webhook only fires when individual scorecards are destroyed. This occurs when the Harvest API delete endpoint is used, or when the delete scorecard link is used in the application. This will not fire when a candidate or application is deleted. A candidate being deleted implies all their scorecards have been deleted with them. An application being deleted does not cause scorecards to be deleted.
+
+```json
+{
+ "action": "scorecard_deleted",
+ "payload": {
+ "scorecard": {
+ "id": 6036088,
+ "candidate_id": 29843272,
+ "interviewed_at": "2016-12-28T17:00:00.000Z",
+ "created_at": "2016-12-28T22:58:03.552Z",
+ "updated_at": "2016-12-28T22:58:03.552Z",
+ "scorecard_status": "complete"
+ }
+ }
+}
+```
diff --git a/source/includes/webhooks/_introduction.md b/source/includes/webhooks/_introduction.md
new file mode 100644
index 00000000000..4eaa71915ff
--- /dev/null
+++ b/source/includes/webhooks/_introduction.md
@@ -0,0 +1,217 @@
+# Introduction
+
+## What is a webhook?
+
+A webhook is a simple event-notification system. When an event occurs in Greenhouse, a payload of JSON data containing information about the event is sent via POST to a specified endpoint URL over HTTPS.
+
+Each delivery will include a `Greenhouse-Event-ID` header. This will contain an unique id associated with this delivery.
+
+## Creating a webhook
+
+Webhooks have three components. A name, an endpoint URL, and a secret key.
+
+
+- **Name**: The name is simply a reference for you. It can contain any string value.
+- **Endpoint URL**: This is the URL to which we will send the POST data when the event occurs. This must be a valid URL and must be https. When the webhook is saved or updated, we will attempt to ping this URL with a payload containing some configuration settings for the webhook. If this ping fails, we will create the webhook in a disabled state and notify you that the ping has failed.
+- **Secret Key**: This secret key will be used to generate a signature header that you may use to verify the hook data was sent from Greenhouse. The secret key will be used in conjunction with the webhook's payload to generate a digital signature.
+
+## Advanced settings
+
+Advanced settings allow customers with certain other security needs to use webhooks for their system. In most cases, users will not need to configure these.
+
+- Basic authentication username / password: These credentials are supplied if the webhook request needs to authenticate at the destination with HTTP Basic Authorization. These credentials will be encoded in to a HTTP Authorization header. See RFC 2617 for additional details.
+- Additional Headers: This textarea should contain any additional HTTP headers that will allow the POST request access to your environment. These headers will be included exactly as pasted, but may not include the following headers already reserved by Greenhouse: Content-Type, Content-Length, Greenhouse-Event-ID, Authorization, User-Agent, and Signature. Please consult with your technology department before including anything in this field.
+
+## Authentication
+
+```
+Signature: sha256 37d2725109df92747ffcee59833a1d1262d74b9703fa1234c789407218b4a4ef
+```
+
+> To compute the HMAC digest in Ruby:
+
+```ruby
+digest = OpenSSL::Digest.new('sha256')
+signature = OpenSSL::HMAC.hexdigest(digest, secret_key, body)
+```
+
+> To compute the HMAC digest in PHP:
+
+```php
+= 5.1.2 and PECL hash >= 1.1
+ $signature = hash_hmac('sha256', $body, $secret_key);
+?>
+```
+
+> The `body` variable in the above code samples refers to the entire content of the JSON response. Not just the `payload` attribute.
+
+Greenhouse uses a digital signature which is generated using the secret key entered when creating a webhook and the body of the webhook's request. This data is contained within the Signature header.
+
+The header contains: the SHA algorithm used to generate the signature, a space, and the signature. To verify the request came from Greenhouse, compute the HMAC digest using your secret key and the body and compare it to the signature portion (after the space) contained in the header. If they match, you can be sure the webhook was sent from Greenhouse.
+
+Important note on Unicode: Greenhouse will escape Unicode characters when they are encoded as JSON before computing the signature. For example, if the job post content is `
hello
`, the webhook body will represent it as `\u003cp\u003ehello\u003c/p\u003e`. When we compute the signature, we use the string exactly as it appears in the body, including the escaped unicode. Be sure to duplicate this process on the receiving end so the signatures match.
+
+
+## Common Attributes
+
+Currently, Webhooks for all event types include these common attributes:
+
+| Attribute | Note |
+|-----------|------|
+| `application.id` | Unique Greenhouse identifier of the application. Information not included in the webhook can be retrieved via [Harvest API - GET Applications](/harvest.html#applications)
+| `application.credited_to` | If populated and a Greenhouse user, the user's Greenhouse ID, e-mail address, and Employee ID (if available) will be provided. If populated and not a Greenhouse user, just the name will be provided.
+| `application.status` | One of: `rejected`, `hired`, `active`
+| `application.candidate.id` | Unique Greenhouse identifier of the candidate. Information not included in the webhook can be retrieved via [Harvest API - GET Candidates](/harvest.html#candidates)
+| `application.candidate.phone_numbers[].type` | One of: `home`, `work`, `mobile`, `skype`, `other`
+| `application.candidate.addresses[].type` | Application Candidate Addresses Type
+| `application.candidate.email_addresses[].type` | One of: `personal`, `work`, `other`
+| `application.candidate.attachments[].type` | One of: `cover_letter`, `offer_packet`, `resume`, `take_home_test`, `offer_letter`, `signed_offer_letter`
Note: Attachments expire in 7 days.
+| `application.candidate.external_id` | An arbitrary ID provided by an external source; does not map to another entity in Greenhouse.
+| `application.prospect` | If true, this is a prospect application which means that the associated person is a prospect and has not yet applied for this job. (Only prospects will have non-null values for `prospect_owner`, `prospect_pool`, or `prospect_stage` under `prospect_detail`) |
+| `application.prospect_detail.prospect_owner` | The user responsible for keeping track of the prospect. Either null or a user's `id` and `name` |
+| `application.prospect_detail.prospect_pool` | The current prospect pool of a prospect. Either null or a pool's `id` and `name` |
+| `application.prospect_detail.prospect_stage` | The current prospect stage of a prospect. Either null or a stage's `id` and `name` |
+| `application.jobs[]` | Candidates will have one job. Prospects will have 0 or more jobs.
+| `application.jobs[].id` | Unique Greenhouse identifier of the job. Information not included in the webhook can be retrieved via [Harvest API - GET Jobs](/harvest.html#jobs)
+| `application.jobs[].requisition_id` | An arbitrary ID provided by an external source; does not map to another entity in Greenhouse.
+| `application.opening.opening_id` | This is an external opening id that may be defined for an HRIS system. This does not reference anything else in Greenhouse and may be blank.
+| `custom_fields` | Contains a hash map/associative array. The key of the hash map is an immutable key; which is an underscore-slugged version of the custom field's name at creation time. The exported properties reflect the active values of the custom field at the time of the export. All custom fields, public and private, will be exported. If a field exists but does not have a value, it will be exported with a value of null for singular values and empty arrays for multiple values. *Important Note*: If a custom field is created with the name `Salary` the key will be `salary`. If later the name of this custom field is changed to `Wage` or `Bonus`, the key will remain `salary`.
+| `custom_fields[].type` | One of: `short_text`, `long_text`, `boolean`, `single_select`, `multi_select`, `currency`, `currency_range`, `number`, `number_range`, `date`, `url`, or `user`.
+
+## Custom Fields
+
+```json
+ {
+ "custom_fields": {
+ "short_text_field": {
+ "name": "Short Text Field",
+ "type": "short_text",
+ "value": "A text string with fewer than 255 characters."
+ },
+ "long_text_field": {
+ "name": "Long Text Field",
+ "type": "long_text",
+ "value": "A text string of any length."
+ },
+ "boolean_field": {
+ "name": "Boolean Field",
+ "type": "boolean",
+ "value": true (or false)
+ },
+ "single_select": {
+ "name": "Single Select Field",
+ "type": "single_select",
+ "value": "The text of selected custom field option."
+ },
+ "multi_select": {
+ "name": "Multi Select Field",
+ "type": "multi_select",
+ "value": [
+ "An array containing the text of",
+ "all the selected",
+ "custom field options"
+ ]
+ },
+ "currency_field": {
+ "name": "Currency Field",
+ "type": "currency",
+ "value": {
+ "amount": 80000,
+ "unit": "USD"
+ }
+ },
+ "compensation_field": {
+ "name": "Compensation Field",
+ "type": "currency",
+ "value": {
+ "amount": 80000,
+ "unit": "USD"
+ },
+ "compensation_type": "base",
+ "frequency": "annually",
+ "rationale": "base rationale"
+ },
+ "currency_range_field": {
+ "name": "Currency Range Field",
+ "type": "currency_range",
+ "value": {
+ "min_value": 80000,
+ "max_value": 150000,
+ "unit": "USD"
+ }
+ },
+ "number_field": {
+ "name": "Number Field",
+ "type": "number",
+ "value": 125
+ },
+ "number_range_field": {
+ "name": "Number Range Field",
+ "type": "number_range",
+ "value": {
+ "min_value": 80000,
+ "max_value": 150000
+ }
+ },
+ "date_field": {
+ "name": "Date Field",
+ "type": "date",
+ "value": "YYYY-MM-DD"
+ },
+ "url_field": {
+ "name": "URL Field",
+ "type": "url",
+ "value": "https://www.thisisjustatextvalue.com"
+ },
+ "user_field": {
+ "name": "User Field",
+ "type": "user",
+ "value": {
+ "user_id": 94354,
+ "name": "Ben Smith",
+ "email": "ben@example.com",
+ "employee_id": "bs0615"
+ }
+ }
+ }
+ }
+```
+
+Custom fields may be attached to several objects within the Greenhouse Recruiting system. These fields may appear on candidates, applications, offers, and other objects in the system. These fields share several properties and are always indicated in webhooks by the "custom_fields" element. However, the "value" attribute of custom fields are different depending on the "type" attribute, so you must check the "type" attribute in order to predict what will be included in the value "attribute". As described in the previous section, the type attribute will be one of short_text, long_text, boolean, single_select, multi_select, currency, currency_range, number, number_range, date, url, or user. An example of each of these fields' expected value format are provided.
+
+Compensation Field is a special type of `currency` custom field. If a currency field is marked as a compensation field, three additional fields will be included: `compensation_type`, `rationale`, `frequency`
+
+## Disabled webhooks
+
+If a webhook is disabled, it will not trigger when the event occurs. Webhooks become disabled automatically if a ping event fails on create or update. They need to be manually re-enabled if this occurs.
+
+## Retry policy
+
+In the event of a failed webhook request (due to timeout, a non HTTP 200 response, or network issues), Greenhouse will attempt a maximum of 6 retries according to the formula on the right:
+
+This formula increases the amount of time between each retry, while assigning a random number of seconds to avoid consistent failures from overload or contention.
+
+Greenhouse will attempt 6 retries over the course of 15 hours.
+
+```ruby
+RETRY_DELAY_MINUTES = [1, 15, 60, 120, 240, 480]
+
+sidekiq_retry_in do |index, _exception|
+ seconds_delay = (RETRY_DELAY_MINUTES[index] || RETRY_DELAY_MINUTES.last) * 60
+ offset = rand(30) * (index + 1)
+
+ seconds_delay + offset
+end
+```
+
+The table below outlines the estimated wait time for each retry request, assuming that rand(30) always returns 0.
+
+| Retry number | Next Retry in | Total waiting time |
+| ------------ | ------------- | ------------------ |
+| 1 | 1m | 0h 1m |
+| 2 | 15m | 0h 16m |
+| 3 | 60m | 1h 16m |
+| 4 | 120m | 3h 16m |
+| 5 | 240m | 7h 16m |
+| 6 | 480m | 15h 16m |
diff --git a/source/includes/webhooks/_job_events.md b/source/includes/webhooks/_job_events.md
new file mode 100644
index 00000000000..bc4e43e26ee
--- /dev/null
+++ b/source/includes/webhooks/_job_events.md
@@ -0,0 +1,505 @@
+# Job Events
+
+## Job created
+
+```json
+{
+ "action": "job_created",
+ "payload": {
+ "job": {
+ "id": 371417,
+ "name": "Software Engineer",
+ "requisition_id": null,
+ "notes": "Looking for the best!",
+ "confidential": false,
+ "job_post_id": 2154,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2016-10-20T18:16:32Z",
+ "opened_at": "2016-10-20T18:16:32Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 7,
+ "name": "Technology",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 13,
+ "name": "New York City",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ },
+ {
+ "id": 14,
+ "name": "St. Louis",
+ "location": null,
+ "external_id": null
+ }
+ ],
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "user_id": 1234,
+ "employee_id": "abc-123"
+ }
+ ],
+ "sourcers": [],
+ "recruiters": [
+ {
+ "user_id": 2345,
+ "employee_id": null
+ },
+ {
+ "user_id": 3456,
+ "employee_id": "abc-234"
+ }
+ ],
+ "coordinators": []
+ },
+ "openings": [
+ {
+ "id": 1234,
+ "opening_id": "abc-1",
+ "custom_fields": []
+ },
+ {
+ "id": 1235,
+ "opening_id": "abc-2",
+ "custom_fields": []
+ }
+ ],
+ "custom_fields": {
+ "approved": {
+ "name": "Approved",
+ "type": "boolean",
+ "value": true
+ },
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": "Full-time"
+ },
+ "salary_range": {
+ "name": "SalaryRange",
+ "type": "currency_range",
+ "value": {
+ "unit": "USD",
+ "min_value": "10000.0",
+ "max_value": "20000.0"
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+The Job Created event is triggered when a new job is created from scratch or copied from another job.
+
+| Attribute | Note |
+|-----------|------|
+| `hiring_team` | Field contains the Greenhouse users responsible for this job. Each field contains the user's Greenhouse user id and the user's external employee id from the customer's system. The employee id will be null if it has not been set in Greenhouse.
+| `openings` | Field contains all the openings in this job. The custom field element on each opening may be omitted if the organization does not have custom fields on openings enabled.
+
+## Job deleted
+
+This webhook only fires when jobs are deleted from the Greenhouse system. This only happens when a job is closed and then the "Delete" button is clicked from the Job Dashboard.
+
+```json
+{
+ "action": "job_deleted",
+ "payload": {
+ "job": {
+ "id": 209256,
+ "name": "Project Manager"
+ }
+ }
+}
+```
+
+### Noteworthy response attributes
+
+| Attribute | Note |
+|------------|--------|
+| `id` | The internal Greenhouse Job id |
+| `name` | The name of the job that was deleted |
+
+## Job updated
+
+```json
+{
+ "action": "job_updated",
+ "payload": {
+ "job": {
+ "id": 100445,
+ "name": "Assistant Store Manager, NYC",
+ "requisition_id": null,
+ "notes": "
Looking for the best!<\/p>",
+ "confidential": false,
+ "job_post_id": 88010,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2015-08-11T23:02:09Z",
+ "opened_at": "2015-08-11T23:02:09Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 74,
+ "name": "Guideshops",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 104,
+ "name": "New York",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "user_id": 1234,
+ "employee_id": "abc-123"
+ }
+ ],
+ "sourcers": [],
+ "recruiters": [
+ {
+ "user_id": 2345,
+ "employee_id": null
+ },
+ {
+ "user_id": 3456,
+ "employee_id": "abc-234"
+ }
+ ],
+ "coordinators": []
+ },
+ "openings": [
+ {
+ "id": 1234,
+ "opening_id": "abc-1",
+ "custom_fields": []
+ },
+ {
+ "id": 1235,
+ "opening_id": "abc-2",
+ "custom_fields": []
+ }
+ ],
+ "custom_fields": {
+ "bonus": {
+ "name": "Bonus",
+ "type": "short_text",
+ "value": null
+ },
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": null
+ },
+ "options": {
+ "name": "Options",
+ "type": "short_text",
+ "value": null
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "short_text",
+ "value": null
+ }
+ }
+ }
+ }
+}
+```
+
+The Job Updated event is triggered any time one or more of the following fields are changed for a job: Internal Job Name, Department, Office, Level, Open Date, Status, Notes, Team and Responsibilities, and How To Sell This Job. Changes to custom fields on a job will also trigger this webhook.
+
+
+| Attribute | Note |
+|-----------|------|
+| `hiring_team` | Field contains the Greenhouse users responsible for this job. Each field contains the user's Greenhouse user id and the user's external employee id from the customer's system. The employee id will be null if it has not been set in Greenhouse.
+| `openings` | Field contains all the openings in this job. The custom field element on each opening may be omitted if the organization does not have custom fields on openings enabled.
+
+## Job Approved
+
+```json
+{
+ "action": "job_approved",
+ "payload": {
+ "approval_flow": {
+ "approval_flow_type": "open_job"
+ },
+ "job": {
+ "id": 100445,
+ "name": "Assistant Store Manager, NYC",
+ "requisition_id": null,
+ "notes": "
Looking for the best!<\/p>",
+ "confidential": false,
+ "job_post_id": 88010,
+ "status": "open",
+ "created_by_id": 273555,
+ "created_at": "2015-08-11T23:02:09Z",
+ "opened_at": "2015-08-11T23:02:09Z",
+ "closed_at": null,
+ "departments": [
+ {
+ "id": 74,
+ "name": "Guideshops",
+ "external_id": "ex-dept-1"
+ }
+ ],
+ "offices": [
+ {
+ "id": 104,
+ "name": "New York",
+ "location": "New York, NY",
+ "external_id": "ex-office-1"
+ }
+ ],
+ "hiring_team": {
+ "hiring_managers": [
+ {
+ "user_id": 1234,
+ "employee_id": "abc-123"
+ }
+ ],
+ "sourcers": [],
+ "recruiters": [
+ {
+ "user_id": 2345,
+ "employee_id": null
+ },
+ {
+ "user_id": 3456,
+ "employee_id": "abc-234"
+ }
+ ],
+ "coordinators": []
+ },
+ "openings": [
+ {
+ "id": 1234,
+ "opening_id": "abc-1",
+ "custom_fields": []
+ },
+ {
+ "id": 1235,
+ "opening_id": "abc-2",
+ "custom_fields": []
+ }
+ ],
+ "custom_fields": {
+ "bonus": {
+ "name": "Bonus",
+ "type": "short_text",
+ "value": null
+ },
+ "employment_type": {
+ "name": "Employment Type",
+ "type": "single_select",
+ "value": null
+ },
+ "options": {
+ "name": "Options",
+ "type": "short_text",
+ "value": null
+ },
+ "salary": {
+ "name": "Salary",
+ "type": "short_text",
+ "value": null
+ }
+ }
+ }
+ }
+}
+```
+
+The Job Approved event is triggered when the final approval is received in a Greenhouse job's approval flow. "Approvals to start recruiting" will be identified as "approval_flow_type": "open_job" while "Official job approval" will be identified as "approval_flow_type": "offer_job".
+
+## Job Post created
+
+This webhook fires when a job post or prospect post is created. This occurs when a new job post or prospect post is added from the job set up.
+
+If `job_id` **is** present in the payload, the payload represents a new **job post**.
+
+If `job_id` **is not** present, the payload represents a new **prospect post**.
+
+
+```json
+{
+ "action": "job_post_created",
+ "payload": {
+ "id": 1815002,
+ "title": "A Cool Job",
+ "location": "New York, NY",
+ "content": "
Hey, this is a neat job. You should apply!
",
+ "internal_content": null,
+ "updated_at": "2017-10-12T15:06:32.691Z",
+ "job_id": 1842002,
+ "external": true,
+ "internal": false,
+ "live": false,
+ "questions": [
+ {
+ "required": false,
+ "private": false,
+ "label": "LinkedIn Profile",
+ "type": "input_text",
+ "values": []
+ },
+ {
+ "required": false,
+ "private": false,
+ "label": "Website",
+ "type": "input_text",
+ "values": []
+ },
+ {
+ "required": false,
+ "private": false,
+ "label": "How did you hear about this job?",
+ "type": "input_text",
+ "values": []
+ }
+ ]
+ }
+}
+```
+
+## Job Post updated
+
+This webhook fires when a job post or prospect post is updated via the "Edit Job Post" page. It also fires when the live status of the job changes from on to off or vice-versa.
+
+If `job_id` **is** present in the payload, the payload represents an updated **job post**.
+
+If `job_id` **is not** present, the payload represents an updated **prospect post**.
+
+```json
+{
+ "action": "job_post_updated",
+ "payload": {
+ "id": 1813002,
+ "title": "A Cool Job",
+ "location": "At a Cool Place",
+ "content": "
Come work for us!
",
+ "internal_content": null,
+ "updated_at": "2017-10-12T18:29:08.399Z",
+ "job_id": 1842002,
+ "external": true,
+ "internal": false,
+ "live": false,
+ "questions": [
+ {
+ "required": false,
+ "private": false,
+ "label": "LinkedIn Profile",
+ "type": "input_text",
+ "values": []
+ },
+ {
+ "required": false,
+ "private": false,
+ "label": "Website",
+ "type": "input_text",
+ "values": []
+ },
+ {
+ "required": false,
+ "private": false,
+ "label": "How did you hear about this job?",
+ "type": "input_text",
+ "values": []
+ }
+ ]
+ }
+}
+```
+
+## Job Post deleted
+
+This webhook fires when a job post or prospect post is deleted. This occurs when the delete link is clicked on a post. Only posts that are not live may be deleted. This will not fire if a job itself is deleted; a job being deleted implies all of its posts have been deleted with them.
+
+If `job_id` **is** present in the payload, the payload represents a deleted **job post**.
+
+If `job_id` **is not** present, the payload represents a deleted **prospect post**.
+
+```json
+{
+ "action": "job_post_deleted",
+ "payload": {
+ "job_post": {
+ "id": 258341,
+ "job_id": 284999,
+ "title": "Software Engineer",
+ "location": "Dallas",
+ "content": "
A pretty interesting job post!
",
+ "updated_at": "2017-01-19T20:01:53.146Z",
+ "internal_content": null,
+ "questions": [
+ {
+ "required": false,
+ "private": false,
+ "label": "LinkedIn Profile",
+ "type": "input_text",
+ "values": []
+ },
+ {
+ "required": false,
+ "private": false,
+ "label": "Website",
+ "type": "input_text",
+ "values": []
+ },
+ {
+ "required": false,
+ "private": false,
+ "label": "How did you hear about this job?",
+ "type": "input_text",
+ "values": []
+ },
+ {
+ "required": true,
+ "private": true,
+ "label": "Are you a cool engineer?",
+ "type": "multi_value_single_select",
+ "values": [
+ "Yes",
+ "No",
+ "As a cucumber"
+ ]
+ }
+ ],
+ "external": true,
+ "internal": false,
+ "live": false
+ }
+ }
+}
+```
+## Job Stage deleted
+
+This webhook only fires when interview stages on a job are removed. This occurs when the remove stage link is used in the Job Setup section of the application. This will not fire when a job is deleted. A job being deleted implies all of its stages have been deleted with them.
+
+```json
+{
+ "action": "job_interview_stage_deleted",
+ "payload": {
+ "job_interview_stage": {
+ "id": 430608,
+ "job_id": 60453,
+ "created_at": "2015-03-11T13:25:25.313Z",
+ "updated_at": "2016-08-16T09:29:33.650Z",
+ "name": "Phone Screen",
+ "active": true
+ }
+ }
+}
+```
diff --git a/source/includes/webhooks/_organization_events.md b/source/includes/webhooks/_organization_events.md
new file mode 100644
index 00000000000..9e4a5fa2d87
--- /dev/null
+++ b/source/includes/webhooks/_organization_events.md
@@ -0,0 +1,66 @@
+# Organization Events
+
+## Department deleted
+
+This webhook fires when departments are deleted from the Greenhouse system from the Configure » Organization screen. This only happens when the "Remove" button is clicked after clicking the "X" next to an office name.
+
+```json
+{
+ "action": "department_deleted",
+ "payload": {
+ "department": {
+ "id": 106,
+ "name": "Creative",
+ "child_ids": [
+ 23328
+ ],
+ "parent_id": 5,
+ "external_id": "ex-office-1"
+ }
+ }
+}
+```
+
+### Noteworthy response attributes
+
+| Attribute | Note |
+|------------|--------|
+| `id` | The Greenhouse id for the department |
+| `name` | The name of the department deleted |
+| `child_ids` | Any former child department ids (this includes all descendants); will be [] if empty |
+| `parent_id` | The department's parent department id; will be null if empty |
+
+## Office deleted
+
+This webhook fires when offices are deleted from the Greenhouse system from the Configure » Organization screen. This only happens when the "Remove" button is clicked after clicking the "X" next to an office name.
+
+```json
+{
+ "action": "office_deleted",
+ "payload": {
+ "office": {
+ "id": 16492,
+ "name": "New York",
+ "location": {
+ "name": "New York, NY"
+ },
+ "child_ids": [
+ 123,
+ 456
+ ],
+ "parent_id": 789,
+ "external_id": "ex-dep-1"
+ }
+ }
+}
+```
+
+### Noteworthy response attributes
+
+| Attribute | Note |
+|------------|--------|
+| `id` | The Greenhouse id for the office |
+| `name` | The name of the office deleted |
+| `location` | The location for the office |
+| `child_ids` | Any former child office ids; will be [] if empty |
+| `parent_id` | The office's parent office id; will be null if empty |
diff --git a/source/includes/webhooks/_other_events.md b/source/includes/webhooks/_other_events.md
new file mode 100644
index 00000000000..bfd3ee2c2f1
--- /dev/null
+++ b/source/includes/webhooks/_other_events.md
@@ -0,0 +1,2 @@
+# Other Events
+
diff --git a/source/index.html.md b/source/index.html.md
new file mode 100644
index 00000000000..adee8b2a2f4
--- /dev/null
+++ b/source/index.html.md
@@ -0,0 +1,35 @@
+---
+layout: home
+---
+
+