---
title: "Create the fit rubric for a job"
method: POST
path: "/api/v1/job/posts/{post_id}/fit_rubric"
tags: ["Job::FitRubrics"]
---

# Create the fit rubric for a job

`POST /api/v1/job/posts/{post_id}/fit_rubric`

## Request

- Base URL: `https://api.flexiple.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.flexiple.com/api/v1/job/posts/{post_id}/fit_rubric`
- Auth: HTTP bearer

## Request body

- object
  - `metrics` object[], required: The whole rubric, every metric with its levels — not a diff. The save also checks what this schema cannot: scored weights total exactly 100, one level per score, unique metric names, and at least one scored (non-mandatory) metric
    - `name` string, required
    - `scale_max` 1 | 2, required: 1 for a yes/no metric, 2 for a three-level metric (scored 0-2). Levels describe scores 1..scale_max only
    - `weight` integer: Integer percentage, 1-100. Scored (non-mandatory) metrics must total exactly 100. Omit the key entirely on a mandatory metric
    - `mandatory` boolean: Must-have gate: scale_max 1, exactly one level (score 1), and no weight key. A candidate who fails it scores 0 overall
    - `levels` object[], required: Exactly one entry per score 1..scale_max, each with a non-empty description. Never include a score 0 entry
      - `score` integer, required: 1..scale_max. Score 0 is implicit ("otherwise 0") and is never sent as a level
      - `description` string, required
  - `model` string, nullable: Optional eval model id; null uses the platform default

## Response `201`

Rubric created

- object
  - `data` object, required
    - `id` integer, required
    - `job_post_id` integer, required
    - `metrics` object[], required
      - `name` string, required
      - `scale_max` number, required
      - `weight` number: Absent on mandatory (must-have) metrics
      - `mandatory` boolean: Must-have gate; failing it zeroes the fit score
      - `levels` object[], required
        - `score` integer, required: 1..scale_max. Score 0 is implicit ("otherwise 0") and is never sent as a level
        - `description` string, required
    - `model` string, nullable
    - `status` 'awaiting_approval' | 'active', required
    - `current_version_id` integer, nullable: Current rubric version; scores whose ai_eval.rubric_version differs are stale
    - `created_at` string
    - `updated_at` string
  - `meta` object, nullable

## Other responses

- `401`: Authentication failed

---

[API](https://skmtc.dev/flexiple/apis/flexiple-platform-api-v1.md) - [All operations](https://skmtc.dev/flexiple/apis/flexiple-platform-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/flexiple/apis/flexiple-platform-api-v1/revisions/27e7987859f2?raw)
