Docs

Errors and limits

Every error code the API returns, and the request limits and caps that apply.

This page is generated from the error registry and the limit settings, so it matches what the API does.

Error format

Every failure has the same shape. API concepts shows an example.

FieldMeaning
typeThe class of failure. It matches the HTTP status.
codeThe specific reason. Branch on code, never on message.
messageA sentence for people. It can change.
paramThe field or parameter at fault, or null.
requestIdThe same value as the X-Request-Id header. Quote it to support.
docUrlA link to the code on this page.

Some errors add a field. existingId is the ID of the record that already exists, on a duplicate. matchedOn says what matched. price and maxCredits are on price_exceeds_max.

Request limits

LimitValue
Requests per key600 reads and 120 writes per minute
Requests per workspace1,200 reads and 240 writes per minute
Requests per IP address600 per minute; 30 per minute for invalid keys
Request body64 KB of JSON
Page size1 to 100, 25 by default
Idempotency keysReplay for 24 hours

Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset for the tightest window. A 429 or 503 also carries Retry-After in seconds. Wait at least that long before you retry.

Caps

CapValueWhat happens at the cap
Reports running at once50 per workspace, shared with the appNew reports from the API wait as queued and start when there is room. The app refuses instead.
Resume file size10 MB, PDF or DOCXinvalid_parameter
Files waiting to be attached100 per workspace; each expires after 24 hourstoo_many_pending_files
Webhook endpoints5 per workspacewebhook_endpoint_limit
Searches120 per minute per key, on top of the request limitsrate_limit_exceeded
Talent searchesOne running at a time for a job; a finished one is reused for 7 days unless you send refreshThe existing search is returned with reused: true
Test events5 per minute per endpointrate_limit_exceeded
Invitation emails3 per interview per hour, including resends from the appresend_limit_exceeded
Events feed and delivery history30 daysevent_cursor_expired for an old cursor
Active API keys10 per workspaceRevoke one before you create another

Invalid request

Type invalid_request.

CodeHTTPReturned by
invalid_request400draftJobCandidateKits, releaseJobCandidateKits, turnOnJobForwardingAddress, resolveIdentityReview
auto_invite_apply_not_allowed400setJobAutoInvite
max_credits_required400setJobAutoInvite
invalid_json40037 endpoints
invalid_content_type40037 endpoints
request_body_too_large40037 endpoints
unknown_field400100 endpoints
invalid_cursor40016 endpoints
invalid_idempotency_key40032 endpoints
method_not_allowed405any endpoint
invalid_parameter422100 endpoints
file_not_uploaded422createCandidate, setCandidateResume, createReport
file_rejected422createCandidate, setCandidateResume, createReport
file_expired422createCandidate, setCandidateResume, createReport
candidate_resume_missing422createReport
candidate_resume_failed422createReport
candidate_email_missing422createInterview
unknown_event_type400createWebhookEndpoint, updateWebhookEndpoint, listWebhookDeliveries, listEvents
invalid_webhook_url400createWebhookEndpoint, updateWebhookEndpoint
event_cursor_expired410listEvents
unprocessable_request422any endpoint
version_not_available422updateOrganizationSettings
final_round_unsupported422putFinalRound
final_round_invalid_selection422putFinalRound
candidate_kit_unsupported422draftCandidateKit, redraftCandidateKit
candidate_kit_no_email422releaseCandidateKit
candidate_kit_empty422releaseCandidateKit
candidate_kit_invalid_edit422updateCandidateKit
interviewer_not_member422putFinalRound
external_is_member422putFinalRound
scorecard_invalid_item422putFinalRoundScorecard
scorecard_incomplete422putFinalRoundScorecard
scorecard_reason_required422putFinalRoundScorecard

invalid_request

HTTP 400. The request is invalid.

auto_invite_apply_not_allowed

HTTP 400. applyToExisting is only allowed when the save switches the rule on or loosens it. Send it with a rule that is off, or with criteria that are no stricter than the current ones.

max_credits_required

HTTP 400. Applying an invite rule to existing reports can spend credits. Send maxCredits, at least the credits in the preview's applyQuote.

invalid_json

HTTP 400. The request body is not valid JSON.

invalid_content_type

HTTP 400. Send the request body as application/json.

request_body_too_large

HTTP 400. The request body is larger than 64 KB.

unknown_field

HTTP 400. The request contains a field that this endpoint does not accept.

invalid_cursor

HTTP 400. The cursor is invalid, expired or belongs to a different query.

invalid_idempotency_key

HTTP 400. The Idempotency-Key header must be 1 to 255 visible ASCII characters.

method_not_allowed

HTTP 405. This endpoint does not support this HTTP method.

invalid_parameter

HTTP 422. A parameter is missing or has an invalid value.

file_not_uploaded

HTTP 422. The file has not been uploaded yet. PUT the file to the upload URL, then try again.

file_rejected

HTTP 422. The uploaded file is not a valid PDF or DOCX resume.

file_expired

HTTP 422. The file expired before it was attached. Upload it again.

candidate_resume_missing

HTTP 422. The candidate has no resume. Add one with PUT /v1/candidates/{id}/resume, then create the report.

candidate_resume_failed

HTTP 422. Probb could not read the candidate's resume. Replace it with PUT /v1/candidates/{id}/resume, then create the report.

candidate_email_missing

HTTP 422. Probb has no email address for this candidate. Send email, or add one to the candidate.

unknown_event_type

HTTP 400. The event type is not one of the event types in the webhook events reference.

invalid_webhook_url

HTTP 400. Use an HTTPS URL on port 443, on the public Internet, without credentials or a fragment.

event_cursor_expired

HTTP 410. The cursor is older than the 30 days events are kept, so events may have been missed. Start again without after.

unprocessable_request

HTTP 422. The request cannot be processed in the current state.

version_not_available

HTTP 422. This version is not available to the organization. Choose one from available in the organization settings.

final_round_unsupported

HTTP 422. A final round cannot be prepared from this report. reason says why: the report's analysis has not finished, its version has no final-round support, it has no requirements, or it is not linked to a saved candidate and job.

final_round_invalid_selection

HTTP 422. The requirements, questions or assignments do not make a valid final round. Preview the report to see its requirement keys.

candidate_kit_unsupported

HTTP 422. Candidate feedback cannot be drafted from this report. reason says why: the report's analysis has not finished, its version has no feedback support, it has no requirements, or it is not linked to a saved candidate and job.

candidate_kit_no_email

HTTP 422. The candidate has no email address on file, so the feedback cannot be emailed. Release it with channel: link and share the link yourself, or add the address to the candidate first.

candidate_kit_empty

HTTP 422. There is nothing to send: every section is off or every item is removed. Turn a section on or restore an item with PATCH /v1/reports/{id}/candidate-kit.

candidate_kit_invalid_edit

HTTP 422. The edit cannot be applied. reason says why: the item is not in the draft, an item is repeated, the text is empty or too long, or the note is too long.

interviewer_not_member

HTTP 422. Every interviewer must be a member of the organisation. Viewers may interview.

external_is_member

HTTP 422. An address in externals belongs to a member of the organization. Give that person to assignments by user ID instead.

scorecard_invalid_item

HTTP 422. An entry names an item that is not part of your assignment. Use the key of the requirements and questions in your part of the final round.

scorecard_incomplete

HTTP 422. A scorecard needs every item rated (not_covered counts) and an overall lean before it can be submitted. unrated says how many items are missing a rating.

scorecard_reason_required

HTTP 422. Changing a submitted scorecard needs a revisionReason of 1 to 500 characters.

Authentication

Type authentication.

CodeHTTPReturned by
authentication_required401every endpoint
invalid_api_key401every endpoint

authentication_required

HTTP 401. Send your API key as a Bearer token in the Authorization header.

invalid_api_key

HTTP 401. The API key is invalid, expired or revoked.

Permission

Type permission.

insufficient_scope

HTTP 403. This API key does not have the scope this endpoint requires.

api_access_disabled

HTTP 403. API access is turned off for this organisation. An organisation admin can turn it on in Settings, Developer.

webhooks_not_enabled

HTTP 403. Outbound webhooks are turned off for this organisation. An organisation admin can turn them on in Settings, Developer.

auto_invite_admin_required

HTTP 403. Only an admin or owner can switch a rule to invite automatically, change its wait, raise its cap or edit a rule that invites. Use a key created by an admin, with the auto_invite:manage scope.

permission_denied

HTTP 403. You do not have permission to do this.

not_an_interviewer

HTTP 403. The key's owner is not an interviewer on this final round, so there is no scorecard for them to fill in.

candidate_feedback_disabled

HTTP 403. An admin turned off candidate feedback in Settings. Drafting, editing and sending are refused until it is turned on again with PATCH /v1/organization/settings; reading a draft and revoking a link still work, and links already released keep working until revoked or expired.

Not found

Type not_found.

route_not_found

HTTP 404. No endpoint matches this path.

resource_not_found

HTTP 404. The resource was not found.

candidate_not_found

HTTP 404. The candidate was not found.

job_not_found

HTTP 404. The job was not found.

report_not_found

HTTP 404. The report was not found.

interview_not_found

HTTP 404. The interview was not found.

integrity_issue_not_found

HTTP 404. The report has no data integrity finding with that ID.

follow_up_not_found

HTTP 404. The report has no follow-up question with that ID.

final_round_not_found

HTTP 404. No final round has been prepared for this report.

external_interviewer_not_found

HTTP 404. The final round has no outside interviewer with that assignment ID.

auto_invite_rule_not_found

HTTP 404. This job has no auto-invite rule. Set one with PUT /v1/jobs/{id}/auto-invite.

auto_invite_evaluation_not_found

HTTP 404. One or more of the auto-invite items were not found on this job.

candidate_kit_not_found

HTTP 404. No candidate feedback has been drafted for this report.

decision_not_found

HTTP 404. No decision has been recorded for this candidate and job.

talent_search_not_found

HTTP 404. The talent search was not found.

activity_not_found

HTTP 404. The activity was not found.

file_not_found

HTTP 404. The file was not found or has expired.

webhook_endpoint_not_found

HTTP 404. The webhook endpoint was not found.

webhook_delivery_not_found

HTTP 404. The webhook delivery was not found.

event_not_found

HTTP 404. The event was not found or is past its retention period.

resume_not_found

HTTP 404. This candidate has no resume file to download.

Conflict

Type conflict.

CodeHTTPReturned by
idempotency_key_reused40932 endpoints
idempotency_request_in_progress40932 endpoints
resource_conflict409setCandidateResume
revision_mismatch412updateCandidate, updateJob, updateWebhookEndpoint
candidate_exists409createCandidate, updateCandidate
job_exists409createJob, updateJob
report_exists409createReport
final_round_exists409putFinalRound
final_round_locked409putFinalRound
final_round_cancelled409putFinalRoundScorecard
final_round_completed409cancelFinalRound
final_round_not_active409resendFinalRoundExternalLink
external_resend_too_soon409resendFinalRoundExternalLink
external_link_not_active409any endpoint
candidate_kit_warnings409releaseCandidateKit
candidate_kit_not_released409releaseCandidateKit, revokeCandidateKit
scorecard_submitted409putFinalRoundScorecard
scorecard_not_submitted409any endpoint
already_decided409resolveIdentityReview
auto_invite_not_pending409approveJobAutoInvite, dismissJobAutoInvite
auto_invite_not_held409cancelJobAutoInvite
auto_invite_not_restorable409restoreJobAutoInvite
job_closed40911 endpoints
job_not_indexed409createTalentSearch
report_not_reviewable409reviewReport
report_not_completed409createInterview
interview_exists409createInterview
interview_in_progress409createInterview
interview_not_resendable409resendInterview
interview_not_cancellable409cancelInterview
interview_scoring_not_failed409retryInterviewScoring
merge_work_in_progress409mergeCandidates, mergeJobs
merge_not_ready409mergeCandidates, mergeJobs
integrity_issue_already_resolved409resolveReportIntegrityIssue
integrity_issue_not_resolved409reopenReportIntegrityIssue
webhook_endpoint_limit409createWebhookEndpoint
webhook_endpoint_paused409testWebhookEndpoint
secret_rotation_in_progress409rotateWebhookSecret
delivery_not_retryable409retryWebhookDelivery
file_already_attached409createCandidate, setCandidateResume, createReport
too_many_pending_files409createFile

idempotency_key_reused

HTTP 409. This Idempotency-Key was already used with a different request body or by a different API key.

idempotency_request_in_progress

HTTP 409. A request with this Idempotency-Key is still being processed. Retry shortly.

resource_conflict

HTTP 409. The request conflicts with the current state of the resource.

revision_mismatch

HTTP 412. The resource changed since you read it. Fetch it again and retry with the new revision.

candidate_exists

HTTP 409. A candidate with this external ID or email already exists. Its ID is in existingId; send allowDuplicate to create another with the same email.

job_exists

HTTP 409. A job with this external ID already exists. Its ID is in existingId.

report_exists

HTTP 409. A report for this candidate and job, or with this external ID, already exists. Its ID is in existingId.

final_round_exists

HTTP 409. A final round already exists for this report. Its ID is in existingId.

final_round_locked

HTTP 409. An interviewer has already submitted a scorecard, so this final round can no longer be changed.

final_round_cancelled

HTTP 409. This final round was cancelled. Send it again with PUT to prepare it afresh.

final_round_completed

HTTP 409. This final round is complete and cannot be cancelled.

final_round_not_active

HTTP 409. This final round is complete or cancelled, so outside interviewers' links no longer open.

external_resend_too_soon

HTTP 409. An invitation went out in the last minute. Wait a minute before sending another.

HTTP 409. The link is revoked or has expired. Send a new link first.

candidate_kit_warnings

HTTP 409. Some of the feedback's wording reads like a score, a rejection reason or a teammate's name. Edit it, or send the request again with acknowledgeWarnings: true once a person has seen it. GET /v1/reports/{id}/candidate-kit lists the warnings.

candidate_kit_not_released

HTTP 409. This candidate feedback has not been released, or its link was revoked, so there is no link to revoke or repeat.

scorecard_submitted

HTTP 409. This scorecard is already submitted. Send a revisionReason to change it.

scorecard_not_submitted

HTTP 409. This scorecard has not been submitted yet, so there is nothing to revise.

already_decided

HTTP 409. Someone already decided on this identity review. List the open ones with GET /v1/identity-reviews.

auto_invite_not_pending

HTTP 409. One or more of these items are not waiting for approval. List the queue with GET /v1/jobs/{id}/auto-invite/evaluations?outcome=queued.

auto_invite_not_held

HTTP 409. One or more of these items are not waiting to be invited automatically. List the held invites with GET /v1/jobs/{id}/auto-invite/evaluations?outcome=held.

auto_invite_not_restorable

HTTP 409. One or more of these items cannot be put back: only candidates dismissed by the same user in the last few minutes can be restored.

job_closed

HTTP 409. The job is closed, so it takes no new reports. Reopen it first with POST /v1/jobs/{id}/reopen.

job_not_indexed

HTTP 409. The job is still being prepared for talent search. Try again in a few minutes.

report_not_reviewable

HTTP 409. Only a report that needs review can be reviewed, and this one does not.

report_not_completed

HTTP 409. Only a completed report can be interviewed against. Wait for report.completed, or review it first if it needs review.

interview_exists

HTTP 409. This report already has an interview. Its ID is in existingId; send replaceExisting to replace it.

interview_in_progress

HTTP 409. An interview the candidate is taking cannot be replaced.

interview_not_resendable

HTTP 409. The invitation can only be re-sent while the candidate has not started and the interview has not expired, failed or been cancelled.

interview_not_cancellable

HTTP 409. Only an interview the candidate has not started can be cancelled.

interview_scoring_not_failed

HTTP 409. Only an interview whose scoring failed can be retried. This one is being scored or was scored.

merge_work_in_progress

HTTP 409. Probb is still working on one of these records (reading a resume, preparing a profile or job, analysing, or searching talent). Merge once the work has finished.

merge_not_ready

HTTP 409. One of these records cannot be merged yet: it is still being added, or (for jobs) it is closed. Finish adding it or reopen the job, then merge.

integrity_issue_already_resolved

HTTP 409. This data integrity finding has already been reviewed.

integrity_issue_not_resolved

HTTP 409. This data integrity finding is already open.

webhook_endpoint_limit

HTTP 409. The organisation already has 5 webhook endpoints. Delete one before adding another.

webhook_endpoint_paused

HTTP 409. The webhook endpoint is paused. Set its status to active with PATCH /v1/webhook-endpoints/{id}.

secret_rotation_in_progress

HTTP 409. The previous secret is still valid from the last rotation. Rotate again when its 24-hour overlap has ended.

delivery_not_retryable

HTTP 409. Only a finished delivery whose event is still retained can be retried, and only while its endpoint is active.

file_already_attached

HTTP 409. This file is already attached to a candidate. Upload it again to reuse it.

too_many_pending_files

HTTP 409. The organisation has 100 files waiting to be attached. Attach them or wait for them to expire after 24 hours.

Payment required

Type payment_required.

insufficient_credits

HTTP 402. The organisation does not have enough credits for this action.

quota_exceeded

HTTP 402. The organisation's monthly limit has been reached.

price_exceeds_max

HTTP 402. The current price is higher than the maxCredits you allowed. It is in the price field.

quote_exceeds_max_credits

HTTP 402. Applying the rule to existing reports could cost more than the maxCredits you allowed. The most it could cost is in the credits field.

Rate limit

Type rate_limit.

CodeHTTPReturned by
rate_limit_exceeded429every endpoint
resend_limit_exceeded429resendInterview

rate_limit_exceeded

HTTP 429. Too many requests. Retry after the time in the Retry-After header.

resend_limit_exceeded

HTTP 429. This invitation was already re-sent 3 times in the last hour. Try again later.

Server error

Type api_error.

CodeHTTPReturned by
api_error500every endpoint
service_unavailable503every endpoint
inbox_unavailable5038 endpoints
maintenance_mode50360 endpoints

api_error

HTTP 500. Something went wrong on our side. Retry, and contact support if it persists.

service_unavailable

HTTP 503. The service is temporarily unavailable. Retry shortly.

inbox_unavailable

HTTP 503. Email forwarding is not set up on this deployment, so there are no forwarding addresses or inbound emails.

maintenance_mode

HTTP 503. Probb is read-only for maintenance. Reads still work; retry writes later.

On this page

Error formatRequest limitsCapsInvalid requestinvalid_requestauto_invite_apply_not_allowedmax_credits_requiredinvalid_jsoninvalid_content_typerequest_body_too_largeunknown_fieldinvalid_cursorinvalid_idempotency_keymethod_not_allowedinvalid_parameterfile_not_uploadedfile_rejectedfile_expiredcandidate_resume_missingcandidate_resume_failedcandidate_email_missingunknown_event_typeinvalid_webhook_urlevent_cursor_expiredunprocessable_requestversion_not_availablefinal_round_unsupportedfinal_round_invalid_selectioncandidate_kit_unsupportedcandidate_kit_no_emailcandidate_kit_emptycandidate_kit_invalid_editinterviewer_not_memberexternal_is_memberscorecard_invalid_itemscorecard_incompletescorecard_reason_requiredAuthenticationauthentication_requiredinvalid_api_keyPermissioninsufficient_scopeapi_access_disabledwebhooks_not_enabledauto_invite_admin_requiredpermission_deniednot_an_interviewercandidate_feedback_disabledNot foundroute_not_foundresource_not_foundcandidate_not_foundjob_not_foundreport_not_foundinterview_not_foundintegrity_issue_not_foundfollow_up_not_foundfinal_round_not_foundexternal_interviewer_not_foundauto_invite_rule_not_foundauto_invite_evaluation_not_foundcandidate_kit_not_founddecision_not_foundtalent_search_not_foundactivity_not_foundfile_not_foundwebhook_endpoint_not_foundwebhook_delivery_not_foundevent_not_foundresume_not_foundConflictidempotency_key_reusedidempotency_request_in_progressresource_conflictrevision_mismatchcandidate_existsjob_existsreport_existsfinal_round_existsfinal_round_lockedfinal_round_cancelledfinal_round_completedfinal_round_not_activeexternal_resend_too_soonexternal_link_not_activecandidate_kit_warningscandidate_kit_not_releasedscorecard_submittedscorecard_not_submittedalready_decidedauto_invite_not_pendingauto_invite_not_heldauto_invite_not_restorablejob_closedjob_not_indexedreport_not_reviewablereport_not_completedinterview_existsinterview_in_progressinterview_not_resendableinterview_not_cancellableinterview_scoring_not_failedmerge_work_in_progressmerge_not_readyintegrity_issue_already_resolvedintegrity_issue_not_resolvedwebhook_endpoint_limitwebhook_endpoint_pausedsecret_rotation_in_progressdelivery_not_retryablefile_already_attachedtoo_many_pending_filesPayment requiredinsufficient_creditsquota_exceededprice_exceeds_maxquote_exceeds_max_creditsRate limitrate_limit_exceededresend_limit_exceededServer errorapi_errorservice_unavailableinbox_unavailablemaintenance_mode