{"openapi":"3.1.0","info":{"title":"Advanced Data Collector API","version":"0.1.0"},"paths":{"/api/available":{"get":{"tags":["tasks"],"summary":"Get Available Tasks","description":"List tasks with status Available or Error for the user.","operationId":"get_available_tasks_api_available_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":10,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Available Tasks Api Available Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pending":{"get":{"tags":["tasks"],"summary":"Get Pending Tasks","description":"List tasks with status Pending for the user.","operationId":"get_pending_tasks_api_pending_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":10,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Pending Tasks Api Pending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/completed":{"get":{"tags":["tasks"],"summary":"Get Completed Tasks","description":"List tasks with status Completed for the user.","operationId":"get_completed_tasks_api_completed_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":10,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Completed Tasks Api Completed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/summary":{"get":{"tags":["tasks"],"summary":"Get Tasks Summary","description":"Return completed and pending task counts for the user (within current set).","operationId":"get_tasks_summary_api_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tasks Summary Api Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/{task_uid}":{"get":{"tags":["tasks"],"summary":"Get Task Detail","description":"Get full task details for a task belonging to the user's current set.","operationId":"get_task_detail_api_available__task_uid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Task Detail Api Available  Task Uid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_uid}/status":{"get":{"tags":["tasks"],"summary":"Get Task Status","description":"Compact polling endpoint for clients waiting on Celery validation.\n\nMain status: user_task_progress.task_status (Available/Pending/Completed/Error).\nerrorMessage: latest attempt's public error text (audio/photo/video uploads), if any.","operationId":"get_task_status_api_tasks__task_uid__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Task Status Api Tasks  Task Uid  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/audio_compare/{task_uid}":{"post":{"tags":["tasks"],"summary":"Submit Audio Compare","description":"Persist one rating per audio pair and mark the task Completed.\n\nThe number of ratings must equal the number of pairs the task has (any count).\nAnswers land in audio_compare_answers in the same transaction as the status\nflip, so a failed write leaves the task submittable.","operationId":"submit_audio_compare_api_available_audio_compare__task_uid__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioCompareSubmission"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Audio Compare Api Available Audio Compare  Task Uid  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/dialogue/{task_uid}/upload-url":{"post":{"tags":["tasks"],"summary":"Create Dialogue Upload Url","description":"Mint a resumable GCS upload session for this user's half of a conversation.\n\nThe object name is server-chosen (dialogue/{sessionId}/{uploadId}.wav) and the\nsession is bound to the caller's Origin — the browser PUTs the bytes directly.\nA repeat call while an attempt is open supersedes it; after /complete → 409.\n\nTwo forms (module docstring): with `sizeBytes` the recording already exists,\nso its declared length bounds the session and the duration/size rules run\nhere; without it the call has only just started and both the length and the\nrules move to /complete. Either way the caller gets a one-time complete\ntoken, which is what makes that /complete survive a cookie-less webview.","operationId":"create_dialogue_upload_url_api_available_dialogue__task_uid__upload_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DialogueUploadUrlPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Dialogue Upload Url Api Available Dialogue  Task Uid  Upload Url Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/dialogue/{task_uid}/complete":{"post":{"tags":["tasks"],"summary":"Complete Dialogue Upload","description":"Close the attempt after the client's direct-to-GCS PUT.\n\nCarries the capture metadata for an early-minted attempt (legacy clients send\n`{}` and everything is already on the row), re-runs the rules that could not\nrun at mint time against the merged result, verifies the object landed with\nexactly the reported size (422 otherwise — the attempt stays open, the client\nmay re-PUT and retry), then flips progress to Pending and dispatches the\nvalidation worker. The response is the full task payload, as\nGET /available/{taskUid} returns it.\n\nAuthorizable by the usual credentials or by the attempt's one-time complete\ntoken; the token survives a 422 → re-PUT → complete retry and dies with the\nfirst successful close.","operationId":"complete_dialogue_upload_api_available_dialogue__task_uid__complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Dialogue-Complete-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Dialogue-Complete-Token"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DialogueMetadataPayload"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Complete Dialogue Upload Api Available Dialogue  Task Uid  Complete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/dialogue/{task_uid}/report":{"post":{"tags":["tasks"],"summary":"File Dialogue Report","description":"File a complaint about the partner in `sessionId`.\n\nThe reporter is always the token uid; the target is derived from the\nsession's uploads, never taken from the client. No recording is required —\nthe complaint may be filed from the feedback screen before (or instead of)\nany upload. Duplicate per (session, reporter) → 409, which the client treats\nas success.","operationId":"file_dialogue_report_api_available_dialogue__task_uid__report_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DialogueReportPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response File Dialogue Report Api Available Dialogue  Task Uid  Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dialogue/reports/summary":{"get":{"tags":["tasks"],"summary":"Dialogue Reports Summary","description":"Caller's counters: reports received (as the reported party) and sent.","operationId":"dialogue_reports_summary_api_dialogue_reports_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dialogue Reports Summary Api Dialogue Reports Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/record/{task_uid}":{"post":{"tags":["upload"],"summary":"Upload Audio","description":"Upload audio for record or spontaneous_speech tasks.\nCreates voice record, sets status to Pending, then enqueues ASR validation via Celery.","operationId":"upload_audio_api_available_record__task_uid__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_audio_api_available_record__task_uid__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Audio Api Available Record  Task Uid  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/spontaneous_speech/{task_uid}":{"post":{"tags":["upload"],"summary":"Upload Spontaneous Speech Audio","description":"Upload audio for spontaneous_speech tasks only (same processing as /available/record).","operationId":"upload_spontaneous_speech_audio_api_available_spontaneous_speech__task_uid__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_spontaneous_speech_audio_api_available_spontaneous_speech__task_uid__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Spontaneous Speech Audio Api Available Spontaneous Speech  Task Uid  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/stub/upload/{task_uid}":{"post":{"tags":["upload"],"summary":"Media Stub Upload","description":"Upload image/video, return Pending, and validate media in the background.","operationId":"media_stub_upload_api_media_stub_upload__task_uid__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_media_stub_upload_api_media_stub_upload__task_uid__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaStubUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/video/{task_uid}/upload-url":{"post":{"tags":["upload"],"summary":"Create Video Upload Url","description":"Mint a resumable GCS upload session for one video attempt.\n\nThe object name is server-chosen (Video/<uuid>.<ext>) and the session is\nbound to the caller's Origin — the browser PUTs the bytes directly. A repeat\ncall while an attempt is open supersedes it; after /complete → 409.\nReturns the one-time complete token that lets /complete succeed without a\ncookie.","operationId":"create_video_upload_url_api_available_video__task_uid__upload_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/VideoUploadUrlPayload"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Video Upload Url Api Available Video  Task Uid  Upload Url Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/available/video/{task_uid}/complete":{"post":{"tags":["upload"],"summary":"Complete Video Upload","description":"Close the attempt after the client's direct-to-GCS PUT.\n\nA file over the task's cap, by the reported size or by what GCS holds, is\nrefused with 413 and the attempt closes with its object. Otherwise verifies\nthe object exists with exactly the reported size (422 otherwise — the\nattempt stays open, the client may re-PUT and retry with the same token),\nthen does what the multipart endpoint does after it has the bytes:\nprogress → Pending, `video_uploads` row, websocket notice, GCS provenance\nmetadata, worker dispatch. The response has the multipart endpoint's shape.","operationId":"complete_video_upload_api_available_video__task_uid__complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Video-Complete-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Video-Complete-Token"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoCompletePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaStubUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/media/containers/{task_uid}/photos":{"post":{"tags":["upload"],"summary":"Upload Set","description":"Accept the set — exactly `required` files in `close` and in `far` — store it\nand hand it to the `containers` worker.\n\nAll-or-nothing: every file is read and checked before anything is uploaded, so\na bad photo rejects the request with nothing stored and the client fixes it\nand sends all eight again. On success the task is `Pending` (or straight away\n`Error` when the GPS says this container was already sent); the verdict is\npolled at `GET /api/tasks/{task_uid}/status`.","operationId":"upload_set_api_media_containers__task_uid__photos_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_set_api_media_containers__task_uid__photos_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainersSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["upload"],"summary":"Get Containers Set","description":"The user's last submission for this task with fresh preview links: on\nreview, accepted, or rejected with the reason on every photo. Empty `items`\nif nothing was ever sent — there are no drafts to resume.","operationId":"get_containers_set_api_media_containers__task_uid__photos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_uid","in":"path","required":true,"schema":{"type":"string","title":"Task Uid"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainersStateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"post":{"tags":["auth"],"summary":"Sync User","description":"Sync authenticated user to the database.\n\nCalled by the frontend after login. In `firebase` mode it verifies the Firebase\nID token; in `dual`/`session` mode it bootstraps from the brand's session cookie\n(link-or-create). No registration bonus. Response returns phoneNumber from the\nusers.phone_number column at the top level. `uiLanguage` is the stored profile\nlocale when the country offers it, otherwise null — not the instance fallback.","operationId":"sync_user_api_auth_me_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SyncUserBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sync User Api Auth Me Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/profile":{"post":{"tags":["user"],"summary":"Save Profile","description":"Save questionnaire data; promote Approved -> ReadyForPayout (other statuses unchanged).","operationId":"save_profile_api_user_profile_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileQuestionnaireFields"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Save Profile Api User Profile Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["user"],"summary":"Edit Profile","description":"Update individual profile fields.\n\nValidated/Approved/ReadyForPayout may edit the questionnaire. Registered\nmay only pin `country` (and optionally `uiLanguage`) so consents can carry\n`_NG_` / `_KZ_` in the document filename before the questionnaire exists.","operationId":"edit_profile_api_user_profile_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfilePatchPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Edit Profile Api User Profile Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["user"],"summary":"Get Profile","description":"Return questionnaire data for current user.","operationId":"get_profile_api_user_profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Profile Api User Profile Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/status":{"get":{"tags":["user"],"summary":"User Status","description":"Return current user status used by frontend flow.","operationId":"user_status_api_user_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response User Status Api User Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/legal-consents":{"post":{"tags":["user"],"summary":"Submit Legal Consents","description":"Record legal consents and promote Registered/Validated -> Approved (or ReadyForPayout\nif the questionnaire is already filled).","operationId":"submit_legal_consents_api_user_legal_consents_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLegalConsentsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Legal Consents Api User Legal Consents Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/legal-status":{"post":{"tags":["user"],"summary":"Set Legal Status","description":"Save legal status. Cannot be changed after submission.","operationId":"set_legal_status_api_user_legal_status_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalStatusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Legal Status Api User Legal Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["user"],"summary":"Get Legal Status","description":"Return legal status fields for the current user.","operationId":"get_legal_status_api_user_legal_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Legal Status Api User Legal Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/utm":{"post":{"tags":["user"],"summary":"Set Utm","description":"Save (or overwrite) is_driver and utm; records utm_set_at timestamp.","operationId":"set_utm_api_user_utm_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UtmPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Utm Api User Utm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["user"],"summary":"Get Utm","description":"Return UTM fields for the current user.","operationId":"get_utm_api_user_utm_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Utm Api User Utm Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/points":{"get":{"tags":["user"],"summary":"Get Points","description":"Return current points balance for the authenticated user.","operationId":"get_points_api_user_points_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Points Api User Points Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/points/history":{"get":{"tags":["user"],"summary":"Get Points History Endpoint","description":"Return points transaction history for the authenticated user.","operationId":"get_points_history_endpoint_api_user_points_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Points History Endpoint Api User Points History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/points/redeem":{"post":{"tags":["user"],"summary":"Redeem Points","description":"Create redemption request for selected points amount.\nMultiple pending requests per user are allowed if balance covers each debit.","operationId":"redeem_points_api_user_points_redeem_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Test-UID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Test-Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemPointsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Redeem Points Api User Points Redeem Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reference/country":{"get":{"tags":["reference"],"summary":"Get Country Reference","description":"Public reference data for one country (no authentication).","operationId":"get_country_reference_api_reference_country_get","parameters":[{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Defaults to X-Country, then the instance country","title":"Country Code"},"description":"Defaults to X-Country, then the instance country"},{"name":"X-Country","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Country Reference Api Reference Country Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reference/countries":{"get":{"tags":["reference"],"summary":"List Countries Reference","description":"Every country this deployment accepts, for a country picker.","operationId":"list_countries_reference_api_reference_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Countries Reference Api Reference Countries Get"}}}}}}},"/api/version":{"get":{"tags":["system"],"summary":"Backend version info","description":"Returns version metadata injected at image build time via Docker build args.\n\n- **version**: set by CI as `CI_COMMIT_TAG` on tagged pipelines (e.g. `v1.4.2`),\n  or `<branch>-<short_sha>` on branch pipelines (e.g. `main-abcdef1`),\n  or `dev` for local runs without CI.\n- **commit**: full git SHA (`CI_COMMIT_SHA`); empty string if not set.\n- **build_date**: ISO-8601 UTC timestamp (`CI_PIPELINE_CREATED_AT`); empty string if not set.","operationId":"get_version_api_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionResponse"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health Public","description":"Public health check for external services and monitoring.","operationId":"health_public_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AudioCompareSubmission":{"properties":{"ratings":{"items":{"type":"integer"},"type":"array","title":"Ratings"}},"type":"object","required":["ratings"],"title":"AudioCompareSubmission"},"Body_media_stub_upload_api_media_stub_upload__task_uid__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"gps_coordinates":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gps Coordinates"},"capture_meta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capture Meta"}},"type":"object","required":["file"],"title":"Body_media_stub_upload_api_media_stub_upload__task_uid__post"},"Body_upload_audio_api_available_record__task_uid__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"gps_coordinates":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gps Coordinates"}},"type":"object","required":["file"],"title":"Body_upload_audio_api_available_record__task_uid__post"},"Body_upload_set_api_media_containers__task_uid__photos_post":{"properties":{"close":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Close"},"far":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Far"},"gps_coordinates":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gps Coordinates"},"gpsCoordinates":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gpscoordinates"}},"type":"object","required":["close","far"],"title":"Body_upload_set_api_media_containers__task_uid__photos_post"},"Body_upload_spontaneous_speech_audio_api_available_spontaneous_speech__task_uid__post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"gps_coordinates":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gps Coordinates"}},"type":"object","required":["file"],"title":"Body_upload_spontaneous_speech_audio_api_available_spontaneous_speech__task_uid__post"},"CheckboxConsentsBlock":{"properties":{"participation-offer":{"$ref":"#/components/schemas/ConsentCheckboxItem"},"personal-data":{"$ref":"#/components/schemas/ConsentCheckboxItem"},"ml-training":{"$ref":"#/components/schemas/ConsentCheckboxItem"},"privacyPolicyPresented":{"$ref":"#/components/schemas/ConsentCheckboxItem"}},"type":"object","required":["participation-offer","personal-data","ml-training","privacyPolicyPresented"],"title":"CheckboxConsentsBlock","description":"Four required consent keys as sent by the client (mixed alias styles)."},"ConsentCheckboxItem":{"properties":{"documentFileName":{"type":"string","maxLength":256,"minLength":1,"title":"Documentfilename"},"checkboxAccepted":{"type":"boolean","title":"Checkboxaccepted"}},"type":"object","required":["documentFileName","checkboxAccepted"],"title":"ConsentCheckboxItem"},"ContainersItem":{"properties":{"fileId":{"type":"string","title":"Fileid"},"group":{"type":"string","title":"Group"},"status":{"type":"string","title":"Status"},"mimeType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mimetype"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"urlExpiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Urlexpiresat"}},"type":"object","required":["fileId","group","status"],"title":"ContainersItem"},"ContainersStateResponse":{"properties":{"taskUid":{"type":"string","title":"Taskuid"},"taskStatus":{"type":"string","title":"Taskstatus"},"submissionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submissionid"},"items":{"items":{"$ref":"#/components/schemas/ContainersItem"},"type":"array","title":"Items"}},"type":"object","required":["taskUid","taskStatus","submissionId","items"],"title":"ContainersStateResponse"},"ContainersSubmitResponse":{"properties":{"message":{"type":"string","title":"Message"},"taskUid":{"type":"string","title":"Taskuid"},"taskStatus":{"type":"string","title":"Taskstatus"},"submissionId":{"type":"string","title":"Submissionid"},"items":{"items":{"$ref":"#/components/schemas/ContainersItem"},"type":"array","title":"Items"}},"type":"object","required":["message","taskUid","taskStatus","submissionId","items"],"title":"ContainersSubmitResponse"},"DialogueMetadataPayload":{"properties":{"sampleRate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Samplerate"},"channels":{"anyOf":[{"type":"integer","const":1},{"type":"null"}],"title":"Channels"},"bitsPerSample":{"anyOf":[{"type":"integer","const":16},{"type":"null"}],"title":"Bitspersample"},"sizeBytes":{"anyOf":[{"type":"integer","exclusiveMinimum":44.0},{"type":"null"}],"title":"Sizebytes"},"sessionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sessionid"},"durationSeconds":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Durationseconds"},"endReason":{"anyOf":[{"type":"string","enum":["selfStopped","partnerEnded","minDurationNotReached","connectionLost","error"]},{"type":"null"}],"title":"Endreason"},"rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Rating"},"gps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gps"},"deviceType":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Devicetype"},"inputHash":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Inputhash"},"inputLabel":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Inputlabel"},"outputHash":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Outputhash"},"outputLabel":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Outputlabel"},"topicId":{"anyOf":[{"type":"string","maxLength":128,"minLength":1},{"type":"null"}],"title":"Topicid"},"topicTitle":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"Topictitle"},"convLang":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Convlang"},"droppedFrames":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Droppedframes"},"startedAtEpochMs":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Startedatepochms"}},"type":"object","title":"DialogueMetadataPayload","description":"What one recording turned out to be. Every field is optional.\n\nThe same shape is accepted at both ends of the flow: as the tail of a legacy\nmint (where it is complete and validated on the spot) and as the body of\n/complete (where it describes the artefact that actually landed). Field\n*shape* is enforced here; whether enough of it is present is a per-endpoint\nquestion — see DialogueUploadUrlPayload and _require_complete_metadata."},"DialogueReportPayload":{"properties":{"sessionId":{"type":"string","title":"Sessionid"},"reason":{"type":"string","enum":["silent","noisy","offensive","asked_personal_data","other"],"title":"Reason"},"comment":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Comment"}},"type":"object","required":["sessionId","reason"],"title":"DialogueReportPayload"},"DialogueUploadUrlPayload":{"properties":{"sampleRate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Samplerate"},"channels":{"anyOf":[{"type":"integer","const":1},{"type":"null"}],"title":"Channels"},"bitsPerSample":{"anyOf":[{"type":"integer","const":16},{"type":"null"}],"title":"Bitspersample"},"sizeBytes":{"anyOf":[{"type":"integer","exclusiveMinimum":44.0},{"type":"null"}],"title":"Sizebytes"},"sessionId":{"type":"string","title":"Sessionid"},"durationSeconds":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Durationseconds"},"endReason":{"anyOf":[{"type":"string","enum":["selfStopped","partnerEnded","minDurationNotReached","connectionLost","error"]},{"type":"null"}],"title":"Endreason"},"rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Rating"},"gps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gps"},"deviceType":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Devicetype"},"inputHash":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Inputhash"},"inputLabel":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Inputlabel"},"outputHash":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Outputhash"},"outputLabel":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Outputlabel"},"topicId":{"anyOf":[{"type":"string","maxLength":128,"minLength":1},{"type":"null"}],"title":"Topicid"},"topicTitle":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"Topictitle"},"convLang":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Convlang"},"droppedFrames":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Droppedframes"},"startedAtEpochMs":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Startedatepochms"}},"type":"object","required":["sessionId"],"title":"DialogueUploadUrlPayload","description":"Mint request, in either of its two forms. `sessionId` is required by both."},"DriverRole":{"type":"string","enum":["driver","passenger","undefined"],"title":"DriverRole"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LegalStatusPayload":{"properties":{"isResident":{"type":"boolean","title":"Isresident"}},"type":"object","required":["isResident"],"title":"LegalStatusPayload"},"MediaStubUploadResponse":{"properties":{"message":{"type":"string","title":"Message"},"contentType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contenttype"},"sizeBytes":{"type":"integer","title":"Sizebytes"},"taskUid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskuid"},"taskStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taskstatus"},"openPalm":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Openpalm"},"gpsCoordinates":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Gpscoordinates"}},"type":"object","required":["message","contentType","sizeBytes"],"title":"MediaStubUploadResponse"},"RedeemPointsPayload":{"properties":{"amount":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount"}},"type":"object","required":["amount"],"title":"RedeemPointsPayload"},"SyncUserBody":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"authProvider":{"type":"string","title":"Authprovider","default":"email"}},"type":"object","title":"SyncUserBody","description":"Optional body for POST /me.\n\nIn mock mode provides user data that production extracts from the\nverified Firebase ID token."},"UserLegalConsentsPayload":{"properties":{"timezone":{"type":"string","maxLength":64,"minLength":1,"title":"Timezone"},"locale":{"type":"string","maxLength":16,"minLength":1,"title":"Locale"},"checkboxConsents":{"$ref":"#/components/schemas/CheckboxConsentsBlock"}},"type":"object","required":["timezone","locale","checkboxConsents"],"title":"UserLegalConsentsPayload"},"UserProfilePatchPayload":{"properties":{"gender":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Gender"},"ageGroup":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Agegroup"},"homeState":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Homestate"},"occupation":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Occupation"},"phoneNumber":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Phonenumber"},"country":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country"},"uiLanguage":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Uilanguage"},"spokenLanguages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Spokenlanguages"},"nativeLanguage":{"anyOf":[{"type":"string","maxLength":10,"minLength":2},{"type":"null"}],"title":"Nativelanguage"},"firstName":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Firstname"},"lastName":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Lastname"},"middleName":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Middlename"},"fio":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Fio"},"nationalId":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Nationalid"},"countryFields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Countryfields"}},"type":"object","title":"UserProfilePatchPayload","description":"All fields optional — only provided fields are updated."},"UserProfileQuestionnaireFields":{"properties":{"gender":{"type":"string","maxLength":100,"minLength":1,"title":"Gender"},"ageGroup":{"type":"string","maxLength":100,"minLength":1,"title":"Agegroup"},"homeState":{"type":"string","maxLength":100,"minLength":1,"title":"Homestate"},"occupation":{"type":"string","maxLength":100,"minLength":1,"title":"Occupation"},"phoneNumber":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Phonenumber"},"country":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country"},"uiLanguage":{"anyOf":[{"type":"string","maxLength":10,"minLength":2},{"type":"null"}],"title":"Uilanguage"},"spokenLanguages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Spokenlanguages"},"nativeLanguage":{"anyOf":[{"type":"string","maxLength":10,"minLength":2},{"type":"null"}],"title":"Nativelanguage"},"firstName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Firstname"},"lastName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Lastname"},"middleName":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Middlename"},"fio":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Fio"},"nationalId":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Nationalid"},"countryFields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Countryfields"}},"type":"object","required":["gender","ageGroup","homeState","occupation"],"title":"UserProfileQuestionnaireFields","description":"Questionnaire fields: names must match PROFILE_QUESTIONNAIRE_FIELDS in profile_schema."},"UtmPayload":{"properties":{"isDriver":{"$ref":"#/components/schemas/DriverRole"},"utm":{"type":"string","title":"Utm"}},"type":"object","required":["isDriver","utm"],"title":"UtmPayload"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionResponse":{"properties":{"version":{"type":"string","title":"Version"},"commit":{"type":"string","title":"Commit"},"build_date":{"type":"string","title":"Build Date"}},"type":"object","required":["version","commit","build_date"],"title":"VersionResponse"},"VideoCompletePayload":{"properties":{"sizeBytes":{"type":"integer","exclusiveMinimum":0.0,"title":"Sizebytes"},"durationSeconds":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Durationseconds"},"gps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gps"},"captureMeta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capturemeta"}},"type":"object","required":["sizeBytes"],"title":"VideoCompletePayload","description":"What landed. `sizeBytes` is the client's count of the bytes it PUT —\n/complete demands that GCS holds exactly that many."},"VideoUploadUrlPayload":{"properties":{"contentType":{"type":"string","title":"Contenttype","default":"video/mp4"},"sizeBytes":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Sizebytes"},"captureMeta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capturemeta"}},"type":"object","title":"VideoUploadUrlPayload","description":"Mint request. `sizeBytes` is only known when the recording already exists\n(a late mint); the early form, sent when the recording starts, omits it."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}