---
title: "Explicit \"Save exam\" for the custom exam step (PAW-740): persists the narrative responses like the autosave PATCH, then runs the binding interpreter so bound fields emit real vitals and physical-exam findings. This is the single semantic commit point — the debounced autosave keeps persisting narrative JSON but never interprets. Binding failures never block the save; they come back as per-field results."
method: POST
path: "/Recordings/{id}/exam/save"
tags: ["Recordings"]
---

# Explicit "Save exam" for the custom exam step (PAW-740): persists the narrative responses like the autosave PATCH, then runs the binding interpreter so bound fields emit real vitals and physical-exam findings. This is the single semantic commit point — the debounced autosave keeps persisting narrative JSON but never interprets. Binding failures never block the save; they come back as per-field results.

`POST /Recordings/{id}/exam/save`

## Request

- Base URL: `https://api.clinicos.vet/backend/business`
- URL: `https://api.clinicos.vet/backend/business/Recordings/{id}/exam/save`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/docs/Recordings/:id/exam/save/post.ts> (a function with typed inputs; its response is checked against the schema)

## Path parameters

- `id` string, required

## Request body

- SaveCustomExamRequest: Body of the explicit "Save exam" action (PAW-740, locked: runtime semantics). Persists the narrative response JSON exactly like the autosave PATCH, then runs the binding interpreter — the single semantic commit point. Narrative autosave never interprets.
  - `customExamTemplateId` string, nullable
  - `customExamTemplateVersion` union
    - integer
    - string, int32
  - `customExamResponseJson` string, nullable

## Response `200`

OK

- SaveCustomExamResponse
  - `fieldResults` ExamEmissionFieldResult[]: One entry per bound field the interpreter had something to say about. Binding failures never block the save: the narrative record is persisted regardless, and error fields simply degrade to narrative-with-a-flag.
    - `fieldId` string, required: Empty string for template-level problems (e.g. pinned version unavailable).
    - `status` string, required: "emitted" | "frozen" | "error".
    - `message` string, nullable

## Other responses

- `404`: Not Found

## Changes

- **2026-08-07** `a905bde4e796`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/Recordings/:id/exam/save/post.md)

---

[API](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1.md) - [All operations](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/revisions/099cf36186e0?raw)
