Build on the Goodfit API
Read interview scores into your own systems, and get a webhook when anything changes. The REST API covers jobs, applications, candidates and reports, with an OpenAPI 3.1 spec.
BASE=https://apidocs.goodfit.so/api/v1
curl -G "$BASE/applications/$APP_ID/report" \
-H "x-api-key: $GOODFIT_API_KEY" \
-d verbosity=summary{
"data": {
"candidate": { "name": "Maya Torres" },
"job": { "title": "Customer Support Agent" },
"assessments": [{
"type": "voice",
"score": 8,
"maxScore": 10,
"skills": [{
"name": "Calming an upset customer",
"score": 9,
"quote": "I'd say sorry first, then check the order.",
"at": "03:12"
},
{ "name": "Clear explanations", "score": 8 },
{ "name": "Product knowledge", "score": 7 }]
}],
"reportLink": "https://dashboard.goodfit.so/…"
}
}Authenticate with an x-api-key header. Every endpoint returns JSON, and every error returns an error code and a message.
MTMaya Torres
Customer Support Agent · AI interview
8.0 /10
- Calming an upset customer9/10
“I’d say sorry first, then check the order.” ▶ 03:12
- Clear explanations8/10
- Product knowledge7/10
What you can read and change with the API
Jobs
Create, update and list roles
Push jobs from your HRIS, send stage changes back to your ATS, and feed your careers page from the same job list.
- GET /v1/jobs
- POST /v1/jobs
- PATCH /v1/jobs/{id}
- GET /v1/jobs/{jobId}/pipeline
Applications
Read scores and move candidates
Read interview and test scores, the full report and notes. Move candidates between stages, add notes, and start your own automations when a candidate moves stage.
- GET /v1/applications
- GET /v1/applications/{id}/report
- POST /v1/applications/{id}/notes
- POST /v1/applications/{id}/advance
Candidates
Copy candidate records
Pull candidates into your data warehouse or other tools. Add a candidate by inviting them to a job with POST /v1/applications.
- GET /v1/candidates
- GET /v1/candidates/{id}
- GET /v1/candidates/{id}/resume
Claude (MCP)
Ask Claude about your candidates
Connect Goodfit to Claude Code or Claude Desktop from the API Keys page. Claude can then call the same endpoints with your key, so you can ask about candidates in plain English.
- claude mcp add --transport http goodfit …
Webhooks for 17 hiring events, signed with HMAC-SHA256
Add an endpoint and choose your events. Goodfit sends a signed JSON payload each time one happens. Every attempt is logged, failed deliveries retry on their own, and you can retry any delivery with one call.
- HMAC-SHA256 signed, in
X-Webhook-Signature - Automatic retries with backoff for about 20 hours
- Retry any delivery without re-triggering the event that caused it
- A separate signing secret for each endpoint
All 17 events
- job.created
- job.updated
- job.closed
- application.created
- application.status_changed
- application.stage_advanced
- application.pipeline_completed
- application.rejected
- application.hired
- application.deleted
- assessment.started
- assessment.completed
- assessment.evaluated
- candidate.created
- prescreening.submitted
- prescreening.passed
- prescreening.failed
Versioned endpoints, an OpenAPI spec and keys for each organization
API keys for each organization
Create and revoke keys from the dashboard. Each key only sees its own organization's data.
OpenAPI 3.1 spec
Machine-readable spec at /api/v1/openapi.json. Generate clients in any language without us shipping an SDK per stack.
Versioned endpoints
Path-versioned endpoints (/v1/). Breaking changes go through a deprecation window with advance notice. Backwards-compatible additions ship continuously.
FAQ
Questions developers ask us
How do I get an API key?
Is there an OpenAPI spec?
How are webhooks secured?
What are the rate limits?
Can I use the API to build a custom careers page?
Where do I report bugs or request endpoints?
How much does Goodfit cost?
Does this work with the ATS we already use?
Is candidate data safe?
Start building with Goodfit
Create a key in your Goodfit dashboard and make your first call in a few minutes. The docs list every endpoint and event.