Greenhouse
Deeper Signals is a Greenhouse Assessment Partner. Recruiters send a Deeper Signals assessment from the candidate's application like any other test; the candidate takes it on the Deeper Signals platform; Greenhouse shows the status and scores on the application and, through the Harvest API, receives the PDF reports as attachments.
How it works
- Greenhouse lists the available tests. Each test is a Deeper Signals hiring campaign flagged as ATS-enabled.
- When a recruiter sends a test, Deeper Signals finds or creates the candidate (matched by e-mail), adds them to the campaign and e-mails the invitation. Tags from the job's Deeper Signals Tags custom field become groups on the candidate.
- When the candidate completes all assessments of the campaign, Deeper Signals notifies Greenhouse through the completion URL and uploads the PDF reports to the application through Harvest.
- Greenhouse polls the status endpoint and shows the result, a link to the candidate's profile and the scores as metadata.
Prerequisites
| Where | What |
|---|---|
| Greenhouse | Admin rights to enable an Assessment Partner and, for attachments, to create a Harvest API key (or approve the Deeper Signals OAuth app). |
| Greenhouse | Optional: a job custom field Deeper Signals Tags (short text, comma-separated). Deeper Signals creates it when you connect Harvest with an API key. |
| Deeper Signals | An account administrator; API access enabled on the account by Deeper Signals. |
Setup
1. Create the integration in Deeper Signals
In the admin app open Settings → Integrations → Greenhouse and create the integration. Deeper Signals generates an API token; copy it. (API: POST /admin/integrations/greenhouse/{account}/create, the token is in apiKey.token of the response.)
2. Enable the partner in Greenhouse
In Greenhouse go to Configure → Dev Center → Partner Credentials, choose Deeper Signals as assessment partner and paste the API token as the partner API key. Greenhouse uses it on every call to Deeper Signals.
3. Connect Harvest (for PDF attachments)
Either
- API key: create a Harvest API key in Greenhouse and enter the client key and secret in Deeper Signals. Deeper Signals validates them and creates the Deeper Signals Tags custom field. (API:
POST /admin/integrations/greenhouse/{atsIntegration}with{"authType": "access_key", "clientKey": "...", "accessKey": "..."}.) - OAuth: choose Connect with Greenhouse; you are sent to Greenhouse to approve the Deeper Signals app with these scopes:
harvest:applications:list,harvest:jobs:list,harvest:custom_fields:create,harvest:custom_fields:list,harvest:attachments:create,harvest:attachments:destroy,harvest:attachments:list. Tokens are refreshed automatically. (API: same endpoint with{"authType": "oauth2"}returnsauth_url;GET .../oauth-checkreports whether the connection is still valid.)
Without Harvest the integration still works, but no PDFs are attached and tags are not read.
4. Choose the tests
Every hiring campaign with ATS-enabled switched on appears as a test in Greenhouse. If none is enabled, Deeper Signals creates a campaign called Greenhouse - Default with the account's default hiring reports. Create one campaign per role profile if different jobs need different assessments.
5. Choose which PDFs are attached
Settings → Integrations → Report mapping decides, per assessment, which reports are rendered and attached (and whether the summary and competency reports are included). Without a mapping the account's default report is used; a disabled mapping attaches nothing. (API: GET|PUT /admin/integrations/report-mappings/{account}.)
Runtime contract
Greenhouse calls these endpoints with the partner API token (X-TOKEN, or Authorization: Basic with the token as user name).
| Endpoint | Purpose |
|---|---|
GET /integration/greenhouse/assessments-list | [{ "partner_test_id", "partner_test_name" }] — the ATS-enabled campaigns. |
POST /integration/greenhouse/assessment-send | Body: partner_test_id, candidate.{first_name,last_name,email,greenhouse_profile_url}, sent_by, url (completion URL). Returns { "partner_interview_id" }. |
GET /integration/greenhouse/assessment-status?partner_interview_id= | partner_status, partner_profile_url, metadata. |
POST /integration/greenhouse/report-error | Greenhouse reports a problem; logged for support. |
{
"partner_test_id": "123",
"sent_by": "recruiter@example.com",
"url": "https://app.greenhouse.io/partner/complete/...",
"candidate": {
"first_name": "Ada", "last_name": "Lovelace", "email": "ada@example.com",
"greenhouse_profile_url": "https://app.greenhouse.io/people/987?application_id=654"
}
}
{
"partner_status": "complete",
"partner_profile_url": "https://app.deepersignals.com/admin/users/user/5?account=examplecorp&tab=Reports",
"metadata": {
"Core Drivers-> Drive": 74.83,
"Competency-> Collaboration": 4,
"Campaign Job Match Score": 81.5
}
}
partner_status is complete once every assessment of the campaign is done; before that it is the participant status (UNUSED, SIGNED_UP, IN_PROGRESS, COMPLETED).
Outbound, Deeper Signals calls PATCH {completion URL} once, then Harvest v3 POST attachments on the application (type: other, visibility: admin_only, one PDF per mapped report, plus summary and competency PDFs when all assessments are complete) and GET applications/GET jobs to read the tags field.
Limitations
- Results are pushed when the candidate completes all assessments of the campaign; partial progress is only visible through the status endpoint.
- The profile URL opens the Deeper Signals admin app and requires a Deeper Signals login.
- The
greenhouse_profile_urlmust containapplication_id; sends without it fail. - One Greenhouse integration per Deeper Signals account.