Organization isolation
A key cannot read templates, invitations, or results belonging to another organization.
MyCulture Client API
Discover assessments, invite candidates, reconcile progress, retrieve versioned results, and receive retryable signed events—without adopting another ATS’s data model.
Base URL
https://api.myculture.ai/api/v1
Preview access is enabled per organization. Each key is limited to an organization, environment, and explicit set of permissions.
The integration lifecycle
Template
Read only the active templates belonging to your organization.
Invitation
Use an idempotency key so retries never produce duplicate invitations.
Progress
Reconcile invitations or consume assessment.started.
Ready
assessment.result_ready fires after every selected module has finished.
Result
Read versioned scores, profiles, benchmarks, dimensions, and narrative.
Quickstart
Store the key in a backend secret manager. MyCulture keys are never safe to expose in a browser or mobile application.
curl "https://api.myculture.ai/api/v1/assessment-templates?limit=25" \ --header "Authorization: Bearer $MYCULTURE_API_KEY" \ --header "Accept: application/json"const response = await fetch( "https://api.myculture.ai/api/v1/assessment-templates?limit=25", { headers: { Authorization: `Bearer ${process.env.MYCULTURE_API_KEY}` } } ); const page = await response.json();import os import requests response = requests.get( "https://api.myculture.ai/api/v1/assessment-templates", headers={"Authorization": f"Bearer {os.environ['MYCULTURE_API_KEY']}"}, params={"limit": 25}, ) response.raise_for_status() page = response.json()
application/json{
"data": [{
"id": "tpl_culture_alignment",
"name": "Culture Alignment",
"sections": ["values_and_traits", "acceptable_behaviors"],
"status": "active"
}],
"pagination": { "next_page_token": null, "has_more": false }
}
Authentication
Send the key as a Bearer token or in X-API-Key. Both forms resolve to the same scoped credential.
A key cannot read templates, invitations, or results belonging to another organization.
Keys identify their environment with an mc_live_ or mc_test_ prefix.
Permissions separate template reads, invitation writes, result reads, and webhook management.
MyCulture stores a one-way hash, not the raw key. Rotate a key if the original value is lost or exposed.
Endpoint reference
The neutral resources below are the client integration contract. Database collection names and Greenhouse fields are deliberately absent.
/assessment-templatesReturns active templates owned by the authenticated organization. Use the opaque next_page_token to continue through large sets.
limitinteger1–100; defaults to 25.page_tokenstringOpaque token from the preceding response./invitationsCreates a unique assessment and candidate URL. Set send_email to false when your own system will deliver the link.
Generate a unique key for the business action and reuse it when retrying. MyCulture returns the original result for 24 hours instead of creating a duplicate.
{
"assessment_template_id": "tpl_culture_alignment",
"candidate": {
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.com",
"external_id": "candidate_4821"
},
"client_reference": "application_9017",
"send_email": true
}{
"id": "inv_f4J9…",
"assessment_id": "asmt_w8N2…",
"assessment_template_id": "tpl_culture_alignment",
"status": "invited",
"assessment_url": "https://app.myculture.ai/assessment-test/…",
"email_status": "queued",
"client_reference": "application_9017"
}/invitation-batchesInvite up to 100 candidates in one request. Each item succeeds or fails independently, so one invalid candidate does not hide the invitations that were created.
Store each returned invitation ID together with your client_reference or candidate.external_id. Both fields can be used to list the matching invitation or result later.
/invitations/{invitationId}Returns candidate progress separately from result_status. A completed assessment can legitimately report result_status: processing while evaluator modules finish.
/assessment-results/{assessmentId}Returns the immutable integration snapshot only after result_status becomes ready. Every result and section includes a schema version.
overall_scorescore|nullValue, percent scale, and semantic score kind.sections[].scorescore|nullModule-level score when one is meaningful.sections[].dimensionsarrayNamed dimension scores produced by that module.sections[].narrativestring|nullSupported generated summary, when available.sections[].dataobjectTyped module details such as a profile, benchmark, or scoring version.{
"assessment_id": "asmt_w8N2…",
"status": "ready",
"schema_version": "2026-08-05",
"overall_score": { "value": 84, "scale": "percent", "kind": "composite" },
"sections": [{
"key": "human_skills",
"schema_version": "2026-08-05",
"score": { "value": 81.2, "scale": "percent", "kind": "ability" },
"dimensions": [{
"key": "communication",
"name": "Communication",
"score": { "value": 88, "scale": "percent", "kind": "ability" }
}],
"narrative": "Strong collaboration…"
}],
"ready_at": "2026-08-05T09:15:00.000Z"
}Lifecycle events
Create a public HTTPS endpoint through POST /webhook-endpoints. The signing secret is returned once.
Keep the returned whsec_… value in your server-side secret manager.
Compute HMAC-SHA256 over timestamp.raw_body and compare it with X-MyCulture-Signature.
Return a 2xx response and persist X-MyCulture-Delivery. Failed deliveries retry with backoff.
Use assessment.completed to update candidate progress. Wait for assessment.result_ready before beginning downstream decisions. Inspect attempts through GET /webhook-deliveries and replay a delivery when your system recovers.
Result contract
The API translates module-specific storage into one versioned public structure.
Included when produced
Never returned
Errors
400Query or page token is invalid.Correct the parameter; do not retry unchanged.401 / 403Key is invalid or lacks the required permission.Check the key and its scopes.404Resource is absent from your organization.Verify the identifier and environment.409Assessment or result processing is incomplete, or an idempotent request conflicts.Check result_status; retry only when the state changes.422JSON body failed validation.Use the field-level details to correct it.429 / 500Temporary capacity or service failure.Retry with exponential backoff and jitter.{
"error": {
"code": "validation_error",
"message": "The request body is invalid.",
"details": [{ "field": "candidate.email", "message": "Must be a valid email address." }],
"request_id": "64d6fda4-…"
}
}ATS compatibility
The existing Greenhouse Assessment Partner endpoints remain available for Greenhouse installations. New direct integrations should use the neutral Client API.
The Client API does not rename or remove the Greenhouse endpoints. Both surfaces use MyCulture’s assessment services while keeping their external contracts separate.
Private preview
We’ll confirm permissions, issue a scoped key, and validate one complete invitation-to-result flow before production access.