---
title: "Ci Post Quality Score"
method: POST
path: "/api/admin/skills/ci/quality-score"
tags: ["admin-skills-ci"]
---

# Ci Post Quality Score

`POST /api/admin/skills/ci/quality-score`

## Request

- Base URL: `https://api.tintin-x.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.tintin-x.com/api/admin/skills/ci/quality-score`
- Auth: none declared

Ingest a per-skill quality scorecard from the rate-skills CI job.

Accepts the rater's per-skill JSON shape directly (the file
`.rater-out/<slug>.json` produced by `scripts/rate_skill.py`):

    {
      "slug": "bittable-planner",
      "scores": {"description": 9, "body": 8, ...},
      "na": ["safety"],
      "composite": 8.6,
      "band": "excellent",
      "strengths": "...",
      "weaknesses": "...",
      "top_fixes": ["...", "..."],
      "blocking_issues": [],
      // optional:
      "evaluated_at": "2026-05-07T20:17:30Z",
      "source": "ci-rater",
      "metadata": {...}
    }

Behavior:
  - 404 if the skill's `slug` doesn't match a SkillDefinition row.
  - Appends a row to skill_quality_evaluations (idempotent on
    UNIQUE(skill_definition_id, evaluated_at) — re-runs of the same
    workflow run upsert).
  - Updates SkillDefinition.quality_{score,band,rated_at,findings} to
    match the latest evaluation for fast list-page rendering.

Auth: X-Admin-Key (same secret used by other CI endpoints).

## Headers

- `x-admin-key` string, nullable

## Request body

- object

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/tintin-x/apis/tintin-api.md) · [All operations](https://skmtc.dev/tintin-x/apis/tintin-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tintin-x/apis/tintin-api/revisions/8839a8d0a66c?raw)
