Mapping JobCannon Scores to Greenhouse Fields
Technical reference for the JobCannon result envelope, Greenhouse scorecard mapping, and how to parse dimensions and percentile ranks.
Mapping JobCannon Scores to Greenhouse Fields
When a candidate completes a JobCannon assessment, the result is returned to Greenhouse via a PATCH callback to the callback_url. This guide explains the result envelope structure and how to map scores to Greenhouse scorecard fields.
Result Envelope Structure
JobCannon returns a JSON envelope with the following shape:
{
"status": "complete",
"partner_score": 72,
"partner_profile_url": "https://app.jobcannon.io/results/[session-id]",
"partner_data": {
"assessment_name": "Big Five",
"assessment_slug": "big-five",
"completed_at": "2026-05-17T14:32:00Z",
"duration_seconds": 245,
"dimensions": [
{
"name": "Openness",
"score": 68,
"percentile": 65,
"interpretation": "above_average"
},
{
"name": "Conscientiousness",
"score": 81,
"percentile": 78,
"interpretation": "high"
},
{
"name": "Extraversion",
"score": 44,
"percentile": 32,
"interpretation": "below_average"
},
{
"name": "Agreeableness",
"score": 73,
"percentile": 70,
"interpretation": "high"
},
{
"name": "Emotional Stability",
"score": 55,
"percentile": 48,
"interpretation": "average"
}
],
"metadata": {
"candidates_percentile_rank": 65,
"faking_detected": false,
"social_desirability_scale": 32
},
"narrative": "Candidate shows strong conscientiousness (78th percentile) and agreeableness (70th), suggesting reliability and teamwork. Introversion (32nd percentile) may affect high-visibility or sales-heavy roles. Social desirability scale (32/100) indicates honest responding."
}
}
Field Mapping
Top-Level Fields
| Field | Type | Meaning ||-------|------|---------|| status | string | Always "complete" when successfully scored || partner_score | number (0–100) | Overall assessment score for Greenhouse scorecard display || partner_profile_url | string (URL) | Link to the full result on JobCannon; can be embedded in Greenhouse |Dimensions Array
Each dimension in partner_data.dimensions has:
| Field | Type | Meaning ||-------|------|---------|| name | string | Dimension name (e.g., "Openness", "Conscientiousness") || score | number (0–100) | Raw score for this dimension || percentile | number (0–100) | Percentile rank (% of population below this score) || interpretation | enum | "low", "below_average", "average", "above_average", "high" |Metadata Fields
| Field | Type | Meaning ||-------|------|---------|| candidates_percentile_rank | number (0–100) | Overall percentile (used for ranking candidates) || faking_detected | boolean | True if response patterns indicate faking/low effort || social_desirability_scale | number (0–100) | Probability of socially desirable responding (higher = more faking risk) |Parsing the Result in Greenhouse
Greenhouse scorecard fields should reference specific dimensions. Here's a TypeScript example to extract and normalize scores:
interface JobCannonResult {
status: string
partner_score: number
partner_profile_url: string
partner_data: {
dimensions: Array<{
name: string
score: number
percentile: number
interpretation: string
}>
metadata: {
candidates_percentile_rank: number
faking_detected: boolean
social_desirability_scale: number
}
}
}
function parseJobCannonResult(result: JobCannonResult) {
const dimensions = result.partner_data.dimensions.reduce((acc, dim) => {
acc[dim.name.toLowerCase().replace(/\s+/g, '_')] = {
score: dim.score,
percentile: dim.percentile,
interpretation: dim.interpretation
}
return acc
}, {} as Record<string, any>)
return {
overallScore: result.partner_score,
dimensions,
percentileRank: result.partner_data.metadata.candidates_percentile_rank,
fakingRisk: result.partner_data.metadata.social_desirability_scale,
profileUrl: result.partner_profile_url
}
}
Example: Big Five Assessment
When a candidate completes the Big Five assessment, the dimensions will always be:
**Greenhouse Scorecard Setup:**
1. Create custom scorecard questions for each dimension (or use the partner_score for a single aggregate)
2. Map each to the percentile in the dimensions array
3. Use interpretation to color-code ("high" → green, "below_average" → yellow, etc.)
Example: DISC Assessment
DISC assessments return four dimensions:
Each has its own score and percentile. Use the same parsing logic above.
Handling Edge Cases
Candidate Abandoned Assessment
If a candidate closes the browser before submitting, JobCannon will not return a result. Greenhouse will not receive a PATCH callback. **Recruiter action:** Re-send the assessment from the candidate page or move to the next screening stage.
Faking Detected (Social Desirability > 70)
JobCannon flags likely fakers. Use social_desirability_scale to adjust scorecard logic:
if (result.partner_data.metadata.social_desirability_scale > 70) {
// Flag for human review or re-test
console.warn('High faking risk; consider re-testing')
}
Score Already Posted
JobCannon idempotently PATCHes the callback URL. If you re-send to Greenhouse, it will retry the callback with the same score. No duplicate scoring.
Data Retention and GDPR
By default, JobCannon retains assessment data for 90 days post-completion. To extend or shorten:
1. **Log in to JobCannon admin** (app.jobcannon.io/admin)
2. **Go to Settings → Data Retention**
3. **Set org-wide policy** (30/60/90/365 days)
Right-to-be-forgotten requests are processed within 7 days. Email [email protected].
Percentile Interpretation
Percentiles are norm-referenced against a database of 50,000+ assessments from diverse industries. A percentile of 75 means the candidate scored higher than 75% of the database population.
**Use percentiles for:**
**Avoid using:**
EEOC Adverse Impact Analysis
The 4/5ths rule: If a protected group's selection rate is <80% of the majority group's rate, investigate bias.
**Example:**
Download aggregated adverse-impact reports from JobCannon admin (/admin/eeoc) to track by test, dimension, and demographic group.
---
**Vendor docs:** https://developers.greenhouse.io/assessment-partner-api.html#scorecard-api
**API Spec:** https://api.jobcannon.io/docs/greenhouse
**Support:** [email protected]