Validate Response
Check a response body against a form's live version without storing it, with POST /v2/admin/forms/{formId}/responses/validate.
Run every check that Submit Response runs, without storing anything. Use it in tests, in CI, or before a bulk import, to confirm that your answer keys and values match the form's live version.
The request is the same as Submit Response: same headers, same path parameter, same request body. Idempotency-Key is not used here, because nothing is stored.
Authentication
Admin (secret) API key
Request body format
Examples
curl -X POST 'https://api.encatch.com/engage-product/encatch/api/v2/admin/forms/3f8a2c1e-7b4d-4e9a-9c61-2d5f8e0b7a14/responses/validate' \
-H 'X-Api-Key: YOUR_ADMIN_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"status": "completed",
"externalId": "order-48213",
"answers": {
"how-likely-are-you-to-recommend-us": 9,
"what-did-you-like-most": ["fast-delivery", "easy-checkout"],
"anything-we-could-improve": "Tracking updates could be more frequent."
}
}'Success response
Validate answers 200 whenever it can read the request, whether or not the body is valid. Problems with the form or the answers are listed in invalidParams. Each entry uses the same codes a submit returns, such as api_channel_disabled, form_not_found, invalid_option, or out_of_range.
{
"valid": true,
"invalidParams": [],
"resolved": {
"formId": "3f8a2c1e-7b4d-4e9a-9c61-2d5f8e0b7a14",
"formVersion": 1792148391723,
"language": "en",
"submittedAt": "2026-10-19T07:06:00Z",
"answerCount": 3
}
}true when Submit Response would accept this body right now.
Every problem found. The array is empty when valid is true.
The field, for example formId, submittedAt, or answers.<key>.
Stable machine-readable code; see Error codes.
Human-readable. The wording may change, so match on code.
What a submit would record, when the body is valid.
The form's UUID
The live version the answers were checked against
The response language
The time the response would be recorded with
Number of answered questions
Errors
Validate returns an error status only when the request itself cannot be checked:
| Status | When |
|---|---|
400 | Body is not valid JSON or a field has the wrong type (malformed_body), unknown top-level field (unsupported_field), or formId in the body differs from the path (form_id_mismatch) |
401 | Missing or unknown API key (gateway, no code) |
403 | Not an admin key (gateway, no code) |
413 | Body larger than 100 KB (body_too_large) |
429 | Admin API rate limit reached |
Try it in the dashboard
Distribution → API → Standard API → Send a response → Try it calls this endpoint with an editable example body for the form. It runs as a test key, so the usage quota is not checked. Copy as curl turns the body into a submit command.
Related
Was this page helpful?
POSTSubmit Response
Store a form response from your backend with POST /v2/admin/forms/{formId}/responses, using the Standard body.
POSTUpload File
Upload a file for a file upload, signature, or video and audio question with POST /v2/admin/forms/{formId}/uploads, then reference its fileId in a response.
