Submit answer
Stores an answer and advances the flow. Answers 200, with the same two-body split as navigate: KYBFlowResponse while the flow runs, KYBFlowCompletedResponse once its status is COMPLETE (upper case). Only actor_id and flow_name are validated. question_name is intentionally unchecked — it is empty when the flow has already ended. The body is read with a plain json.NewDecoder, so no struct validation runs and unknown members are ignored.
Authorization
bearerAuth In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Body of POST /v1/kyb/submit-answer. Only actor_id and flow_name are checked by the handler. question_name is deliberately NOT required — it is empty when the flow has already ended, and an earlier revision of this spec marked it required. Decoded with a plain json.NewDecoder, so unknown members are ignored and no struct validation runs.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/kyb/submit-answer" \ -H "Content-Type: application/json" \ -d '{ "actor_id": "04f37679-bfbf-4906-b749-01756515cecf", "flow_name": "string", "answer": {} }'{
"flow": {
"ActorID": "f5d45287-6d16-476f-89ca-9fde3795da76",
"FlowName": "string",
"flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2",
"CurrentStep": "string",
"back": true,
"invalidate": true,
"PreviousStep": "string",
"Status": "SECTION_LIST",
"Sections": null,
"SectionStatus": {},
"progress_catalog": {
"sections": [
{
"name": "string",
"steps": [
{
"name": "string",
"title": "string",
"order": 0
}
],
"presentation": "string"
}
],
"rail_parent": {
"property1": "string",
"property2": "string"
},
"visit_only": [
"string"
]
},
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"modified_at": "2019-08-24T14:15:22Z",
"modified_by": "e8d4374d-93a1-4e98-a6c6-fdcf00c5059f",
"active": true,
"metadata": {}
},
"question": {
"name": "string",
"section": {
"name": "string",
"title": "string",
"icon": "string",
"status": "NOT_STARTED",
"show": true
},
"q": "string",
"description": "string",
"message": {
"text": "string",
"severity": "info"
},
"options": {
"save_form_data": true,
"back": true,
"show_in_progress_rail": true,
"presentation": "string",
"wizard_step": "string"
},
"schema": {},
"uiSchema": {},
"formData": {},
"custom_api": {},
"custom_function": {}
}
}{
"status": 400,
"message": "Invalid actor ID: {actorID}",
"code": "kyb_m.invalid_actor_id",
"class": "validation"
}{
"status": 401,
"message": "Unauthorized",
"code": "common.unauthorized",
"class": "business"
}{
"status": 403,
"message": "Access denied",
"code": "common.forbidden",
"class": "business"
}{
"status": 404,
"message": "Flow not found",
"code": "kyb_m.flow_not_found",
"class": "business"
}{
"status": 409,
"message": "A previous answer is still being processed, please try again",
"code": "kyb_m.flow_submit_in_progress",
"class": "business"
}{
"status": 429,
"message": "Rate limit for 203.0.113.7 to POST:/v1/kyb/navigate exceeded.",
"code": "rate_limits_m.exceeded",
"class": "temporary",
"retryable": true
}{
"status": 500,
"message": "Failed to submit the answer {answer} to the question {question}",
"code": "kyb_m.failed_to_submit_answer",
"class": "business"
}{
"overall_status": "unhealthy",
"message": "Service is shutting down",
"timestamp": "2026-08-27T15:04:05Z"
}Administratively repins an actor's kyb.flows row to a different snapshot, a different step, or both. Used to recover actors stuck on an inactive snapshot. Admin only: the handler calls requireKYBConfigAdmin, which resolves the caller and then checks Storage.IsAdminAccount. A non-admin gets 403 common.forbidden. At least one of flow_id or current_step must be present; sending neither is 400. Body validation in the handler is shape-level only; that the snapshot and step actually exist is checked inside the storage transaction, AND BOTH OF THOSE ARE 400, NOT 404. A flow_id that names no flows_config row, or one whose flow_name differs from the body's, is kyb_m.invalid_flow_id; a current_step that is not an active item of the effective snapshot is kyb_m.invalid_step. The only 404 on this route is a missing kyb.flows row for the actor. On success the flow_name's config cache is invalidated so the next navigate reads the new layout.
Description
Next Page