Errors

The error format and every error code the API returns.

Every error uses the same envelope:

{
  "error": {
    "code": "validation_error",
    "message": "The request body contains invalid fields.",
    "details": [
      { "field": "address.countryCode", "message": "must be equal to one of the allowed values" }
    ]
  }
}
FieldDescription
codeMachine-readable and stable. Use it in your code.
messageHuman-readable, for developers. Wording may change; do not parse it.
detailsPresent for field-level failures. One entry per field, with field and message.

New codes may be added at any time. Treat an unknown code by its HTTP status.

Status codes

StatusMeaning
400The request cannot be processed as sent: invalid JSON, cursor, version, language, or filter value.
401Authentication failed.
404The resource does not exist, or belongs to another company.
422The request is well-formed but fails validation or a business rule.
429Rate limit exceeded.
500An unexpected error on JOIN's side. The message is always generic.

Error codes

Platform

CodeStatusCauseWhat to do
authentication_required401No Authorization: Bearer header.Send the token.
token_invalid401Token malformed, unknown, revoked, or the plan has no API access.Check the token in Settings → Developer → API tokens.
malformed_json400The body is not valid JSON.Fix the request body.
cursor_invalid400The cursor is invalid or expired.Restart from the first page.
filter_invalid400A filter value could not be resolved. details names the filter.Correct the filter.
unsupported_api_version400The Join-Version header names a version the API does not serve.Omit the header or send a supported version.
unsupported_language400The language parameter is not one of nl, en, fr, de, it, es.Send a supported language.
validation_error422One or more fields are missing, of the wrong type, or out of range. details lists them.Correct the fields named in details.
not_found404The path does not exist.Check the URL.
rate_limit_exceeded429The token exceeded a rate limit.Wait for Retry-After seconds.
unknown500Unexpected server error.Retry with backoff; contact support if it persists.

Not found

CodeStatus
application_not_found404
candidate_not_found404
job_not_found404
note_not_found404
office_not_found404

Business rules

CodeStatusEndpointCause
application_already_exists422Create an applicationThe candidate already has an application on this job.
candidate_blocked422Create an applicationThe candidate is blocked by your company.
job_archived422Create an applicationThe job is archived.
stage_not_in_pipeline422Move an applicationThe stage is not part of the job's pipeline. Use a stage from GET /v3/jobs/{jobId}/pipeline.
application_rejected422Move an applicationThe application is rejected. Un-reject it in JOIN first.
note_limit_reached422Create a candidate noteThe candidate already has 50 notes.
office_default_required422Update an officeThe default office cannot be set to isDefault: false. Make another office the default.
office_is_default422Delete an officeThe default office cannot be deleted.
office_referenced_by_active_jobs422Delete an officeActive jobs use this office.
job_limit_reached422Create or update a jobPublishing would exceed the company's active-job limit.
salary_visibility_restricted422Create or update a jobThe job's country requires a public salary.
custom_questions_not_in_plan422Create or update a jobCustom screening questions require the Advanced or Enterprise plan.

Retrying

StatusRetry?
429Yes, after Retry-After seconds.
500Yes, with exponential backoff. A POST may already have succeeded: check before retrying a create.
400, 401, 404, 422No. The same request fails again until it is changed.