---
title: "Validate form answers against the current form contract without storing a submission."
method: POST
path: "/api/v1/forms/{formId}/submissions/validate"
tags: ["Forms"]
---

# Validate form answers against the current form contract without storing a submission.

`POST /api/v1/forms/{formId}/submissions/validate`

## Request

- Base URL: `https://commentary.dev`
- URL: `https://commentary.dev/api/v1/forms/{formId}/submissions/validate`
- Auth: HTTP bearer

## Path parameters

- `formId` string, required

## Headers

- `X-Commentary-Workspace-Id` string
- `X-Correlation-Id` string

## Request body

- FormSubmissionRequest
  - `values` object
  - `sourceContext` FormSourceContext: Embedded review context such as repository owner/repo plus prNumber or branchRef, draftReviewSessionId, filePath, documentVersionId, formInstanceId, and route.
  - `submissionId` string
  - `submissionOrigin` 'api' | 'mcp' | 'cli' | 'agent_api'
  - `agentAlias` string
  - `clientName` string

## Response `200`

Successful response.

- object
  - `ok` boolean
  - `valid` boolean
  - `diagnostics` object[]

## Other responses

- `400`: The request was invalid.
- `401`: Authentication is required.
- `403`: The token or session does not have permission for this resource.
- `404`: The resource was not found.
- `429`: The request was rate limited.

---

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