Projects

Reject a candidate

Changed on

Reject a candidate in a project pipeline. The candidate keeps their current stage and status but is marked as rejected, and any active outreach campaigns for the candidate are stopped.

What you need to provide:

  • rejectionType (required) - who rejected the candidate: by_us (the agency), by_client, or self (the candidate withdrew).
  • rejectionReason (optional) - a predefined reason code.
  • customRejectionReasonId (optional) - the ID of one of your agency's custom rejection reasons. Deactivated reasons are rejected with 404.
  • rejectionDetails (optional) - free-text notes about the rejection (max 512 characters).

Optional fields also accept an explicit null, which is treated the same as omitting the field.

Returns 422 when:

  • The project is closed
  • The candidate is already rejected
  • The candidate sits on a legacy pipeline status that does not support rejection

To move a rejected candidate again, the rejection must be rolled back first (currently only possible in the Atlas app).

patch/api/v1/projects/{projectId}/candidates/{candidateId}/reject

Request

Path parameters

projectIdstring uuid required

Project ID

Example:550e8400-e29b-41d4-a716-446655440000
candidateIdstring uuid required

Candidate ID

Example:550e8400-e29b-41d4-a716-446655440004

Request body

rejectionType'by_us' | 'by_client' | 'self' required

Who rejected the candidate: by_us (the agency), by_client, or self (candidate withdrew)

rejectionReason'above_budget' | 'accepted_another_offer' | 'cultural_fit' | 'did_not_attend_the_interview' | 'not_available' | 'not_qualified' | 'other' | 'overqualified' | 'reference_check_failed' | 'rejected_the_offer' | 'technical_test_failed' | 'unresponsive' | 'location' | 'rejected_by_us_or_client' | 'poor_communication' | 'no_right_to_work' | 'lacks_primary_skillset' | 'not_enough_experience' | 'doesnt_have_qualification' | 'position_was_closed' | 'went_with_another_provider' | 'went_cold' | 'too_expensive' | 'not_using_agencies' | 'not_interested' | 'not_currently_hiring' | 'no_response' | 'no_reason' | 'decided_not_to_hire' | 'null' nullable

Predefined rejection reason. Optional — omit or send null, e.g. for self rejections

customRejectionReasonIdstring uuid nullable

ID of an agency-defined custom rejection reason (must be active). May be combined with rejectionReason. Omit or send null to skip

rejectionDetailsstring nullable

Free-text details about the rejection (max 512 characters). Omit or send null to skip

Example request

{
  "rejectionType": "by_us",
  "rejectionReason": "not_qualified",
  "customRejectionReasonId": "550e8400-e29b-41d4-a716-446655440005",
  "rejectionDetails": "Salary expectations above the approved band"
}

Response

Candidate rejected

status'ok' required

Example response

{
  "data": {
    "rejectionType": "by_us",
    "rejectionReason": "not_qualified",
    "rejectedAt": "2026-07-09T12:00:00.000Z"
  }
}

Changes