---
title: "Create Hiring Decision"
method: POST
path: "/api/hiring-decisions"
tags: ["Hiring Decisions"]
---

# Create Hiring Decision

`POST /api/hiring-decisions`

## Request

- Base URL: `https://api.thebetterhire.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.thebetterhire.ai/api/hiring-decisions`
- Auth: HTTP bearer

Upsert a hiring decision for an application. job_position_id is derived
from the application (never client-supplied); decided_by comes from the
token. ON CONFLICT(application_id) updates the existing decision. The
mig-017 triggers handle applications.status + job_positions.filled_count.

## Request body

- HiringDecisionCreate: POST body. Mirrors the old route's destructured fields. `decision` is NOT enum-validated here on purpose — the old route only checked presence and let the DB CHECK constraint reject bad values (surfacing as a 500); preserving that avoids a contract change (422). The DB still enforces the 6 valid values.
  - `application_id` string, required
  - `decision` string, required
  - `offer_details` unknown
  - `decision_notes` string, nullable
  - `rejection_reason` string, nullable
  - `rejection_feedback` string, nullable
  - `decline_reason` string, nullable
  - `offer_expires_at` string, date-time, nullable

## Response `201`

Successful Response

- HiringDecisionRow: Full hiring_decisions row — what POST/PUT return (bare RETURNING *). Every column is declared so nothing is silently dropped when a column is added to the table.
  - `id` string, required
  - `organization_id` string, required
  - `application_id` string, required
  - `job_position_id` string, required
  - `decision` string, required
  - `decided_by` string, nullable
  - `decided_at` string, date-time, nullable
  - `offer_details` unknown
  - `offer_extended_at` string, date-time, nullable
  - `offer_expires_at` string, date-time, nullable
  - `offer_responded_at` string, date-time, nullable
  - `offer_accepted_at` string, date-time, nullable
  - `offer_declined_at` string, date-time, nullable
  - `rejected_at` string, date-time, nullable
  - `withdrawn_at` string, date-time, nullable
  - `onboarding_date` string, date-time, nullable
  - `decision_notes` string, nullable
  - `rejection_reason` string, nullable
  - `rejection_feedback` string, nullable
  - `decline_reason` string, nullable
  - `decline_notes` string, nullable
  - `feedback_shared_with_candidate` boolean, nullable
  - `candidate_added_to_talent_pool` boolean, nullable
  - `created_at` string, date-time, nullable
  - `updated_at` string, date-time, nullable
  - `deleted_at` string, date-time, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/thebetterhire/apis/interanalysis-b2b-api.md) · [All operations](https://skmtc.dev/thebetterhire/apis/interanalysis-b2b-api/llms.txt) · [OpenAPI document](https://skmtc.dev/thebetterhire/apis/interanalysis-b2b-api/revisions/c8ad03e900ea?raw)
