---
title: "Key History"
method: GET
path: "/v1/projects/{project_id}/keys/{key_id}/history"
tags: ["key-history"]
---

# Key History

`GET /v1/projects/{project_id}/keys/{key_id}/history`

## Request

- Base URL: `https://api.sonenta.dev`
- URL: `https://api.sonenta.dev/v1/projects/{project_id}/keys/{key_id}/history`
- Auth: none declared

Aggregate version history for a key ACROSS all languages (task 1697),
computed on translation_history (no separate store). Newest first.

`code_scan` (additive, lifecycle panel) is the scan provenance of the key —
the finding treated INTO it — or null; `items` is unchanged.

## Path parameters

- `key_id` string, required
- `project_id` string, required

## Query parameters

- `limit` integer

## Response `200`

Successful Response

- KeyHistoryOut
  - `key_uuid` string, required
  - `items` KeyHistoryEntry[], required
    - `version` integer, required
    - `value` string, required
    - `status` 'missing' | 'draft' | 'translated' | 'reviewed' | 'approved' | 'rejected', required
    - `changed_by_uuid` string, nullable, required
    - `changed_by_api_key_uuid` string, nullable
    - `change_source` string, nullable
    - `change_reason` string, nullable
    - `changed_at` string, date-time, required
    - `plural_forms` object, nullable
    - `surface` string, nullable
    - `surface_kind` string, nullable
    - `language_uuid` string, required
  - `code_scan` KeyHistoryCodeScan: Where this key came from in the SOURCE, when it originated as a hardcoded string a code scan found. Present only when a finding was marked treated INTO this (namespace, key).
    - `finding_uuid` string, required
    - `file` string, required
    - `line` integer, required
    - `first_seen_at` string, date-time, nullable: When the scan FIRST found the string — its discovery.
    - `first_seen_scan_id` string, nullable
    - `treated_at` string, date-time, nullable
    - `last_seen_at` string, date-time, nullable
    - `last_seen_scan_id` string, nullable
    - `status` string, required: new | treated | gone (gone = the string left the source).
    - `in_latest_scan` boolean, required: True if the string was still present in the project's most recent scan.

## Other responses

- `422`: Validation Error

---

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