---
title: "Create Job Role"
method: POST
path: "/api/job-roles/"
tags: ["Job Roles"]
---

# Create Job Role

`POST /api/job-roles/`

## 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/job-roles/`
- Auth: HTTP bearer

Create a new job role

Requires: admin or recruiter role

## Request body

- BackendRoutersJobRolesJobRoleCreateRequest: Create job role request
  - `title` string, required
  - `department` string, nullable
  - `description` string, nullable
  - `location_type` string, nullable
  - `location` string, nullable
  - `employment_type` string, nullable
  - `experience_level` string, required
  - `min_years_experience` integer, nullable
  - `max_years_experience` integer, nullable
  - `jd_text` string, nullable
  - `job_description_url` string, nullable
  - `use_manual_competencies` boolean
  - `custom_competencies` CompetencyItem[], nullable
    - `name` string, required
    - `description` string, required
    - `importance` integer, required
    - `evaluation_criteria` string, nullable
  - `quality_score` integer, nullable
  - `hiring_company_display` string, nullable
  - `hiring_company_pronounce` string, nullable
  - `hiring_company_visibility` string, nullable
  - `assessment_plan` AssessmentPlan: Ordered assessment rounds for a role. Empty `rounds` on update means "clear the plan" (stored as NULL, the pre-plan sentinel — mig 097).
    - `rounds` AssessmentRound[]
      - `round_id` string, required
      - `kind` string, required
      - `skill_id` string, nullable
      - `label` string, required
  - `tag` string, nullable
  - `default_framework_code` string, nullable

## Response `201`

Successful Response

- BackendRoutersJobRolesJobRoleResponse: Job role response
  - `id` string, required
  - `organization_id` string, required
  - `title` string, required
  - `department` string, nullable, required
  - `description` string, nullable, required
  - `location_type` string, nullable, required
  - `location` string, nullable, required
  - `employment_type` string, nullable, required
  - `experience_level` string, nullable, required
  - `min_years_experience` integer, nullable
  - `max_years_experience` integer, nullable
  - `jd_file_url` string, nullable, required
  - `jd_file_name` string, nullable, required
  - `jd_text` string, nullable, required
  - `job_description_url` string, nullable, required
  - `competencies_config` object, required
  - `use_manual_competencies` boolean, required
  - `status` string, required
  - `created_by` string, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, nullable, required
  - `interview_count` integer, nullable
  - `candidate_count` integer, nullable
  - `quality_score` integer, nullable
  - `hiring_company_display` string, nullable
  - `hiring_company_pronounce` string, nullable
  - `hiring_company_visibility` string, nullable
  - `assessment_plan` object, nullable
  - `tag` string, nullable
  - `default_framework_code` string, 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)
