Canvas makes use of the “Candidate” endpoint.  Specifically, we:

  1. Download the entire candidate list once a day.  We do this so we can search them.  
  2. We pull single candidate details on demand.
  3. We post attachment PDFs (type=admin_only).  This is usually the “transcript” from the conversation the user had with the candidate within our system.
  4. We post public notes when there are specific activities within Canvas we want to log within Greenhouse.  This is a workaround for not being able to add to the real “activity feed” so we post a public note instead.

Canvas makes use of the “Job” endpoint. Specifically, we:

  1. Download the entire job list once a day.  Again, we do this so we can search the job titles.
  2. We pull single jobs on demand as needed for our app.

We also configure a large array of webhooks so that our “cache” of the candidate data is updated in real-time.  Again, this is a cache for searching and we would not need the webhooks if Greenhouse provided a search API. 

To create a Harvest API key:

  • The Greenhouse user will go to their Configure tab


  • Select Dev Center > API Credential Management


  • Click Create New API Key to generate a Harvest API key for “Canvas”Screen_Shot_2020-09-22_at_5.36.30_PM.png
  • The Greenhouse user will be able to select which permissions they would like to allow the partner to utilize:

Canvas uses “Select all” to get all permissions.  This may be more than we need currently; however, we are evolving our use of the API and do not want to have to revisit permissions for each customer.


Once instructions for generating the API key, please provide steps for using the integration. 

The customer will need to provide this API key to the Canvas team.  Canvas then configures the integration on the backend with no configuration options for the end-user to manage.

Once the integration is enabled, we have additional dialogs in the application under “Add from External ATS” as shown below: 


The user can search by name for a candidate (this hits our cache of the candidate data from Greenhouse):


The user then selects the candidates they want to import and finishes the import:


The user can continue using the Canvas application as normal.

The Canvas application will post status changes and transcripts back to Greenhouse when a conversation concludes or is manually synced. (No screenshot to show this as it is fully back-end.)

We have a very similar workflow for job imports:



We do not post any data back to the job in Greenhouse.

 Demo Video

For more on the integration, please view this video: