{"openapi":"3.1.0","info":{"title":"Laxmi API v2","description":"Speech + expense extraction for the Laxmi apps. Send X-Device-Id on every call.","version":"2.0.0"},"paths":{"/v2/health":{"get":{"tags":["health"],"summary":"Health","description":"Liveness plus what is installed. Loads no model.","operationId":"health_v2_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v2/admin/language-requests":{"get":{"tags":["admin"],"summary":"Language Requests","description":"Demand per language, most unique devices first: what to add next.","operationId":"language_requests_v2_admin_language_requests_get","security":[{"AdminKey":[]}],"parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"min_devices","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Hide languages below this many devices","default":1,"title":"Min Devices"},"description":"Hide languages below this many devices"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageDemandSummary"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/training-data":{"get":{"tags":["admin"],"summary":"Training Data","description":"NLU events for training: transcript, model / Gemini output, and what the user saved.","operationId":"training_data_v2_admin_training_data_get","security":[{"AdminKey":[]}],"parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"with_result_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only events the user saved a result for","default":true,"title":"With Result Only"},"description":"Only events the user saved a result for"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO datetime","title":"Since"},"description":"ISO datetime"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingData"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/reviews":{"get":{"tags":["admin"],"summary":"Review List","description":"Results the user edited, with old (model) and new (user) values. Only approved ones are used for training.","operationId":"review_list_v2_admin_reviews_get","security":[{"AdminKey":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["pending","approved","rejected","skipped"],"type":"string"},{"type":"null"}],"description":"Empty: every status","title":"Status"},"description":"Empty: every status"},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"field","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only results where this field was edited (amount, category, merchant, note, spent_at, language, transcript)","title":"Field"},"description":"Only results where this field was edited (amount, category, merchant, note, spent_at, language, transcript)"},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"enum":["online","offline"],"type":"string"},{"type":"null"}],"title":"Channel"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"enum":["model","gemini","rules"],"type":"string"},{"type":"null"}],"description":"Who produced what the user saw","title":"Source"},"description":"Who produced what the user saw"},{"name":"suggestion","in":"query","required":false,"schema":{"anyOf":[{"enum":["gold","silver","skip"],"type":"string"},{"type":"null"}],"description":"What the automatic rules think","title":"Suggestion"},"description":"What the automatic rules think"},{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Device Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Search the transcript and notes","title":"Q"},"description":"Search the transcript and notes"},{"name":"order","in":"query","required":false,"schema":{"enum":["newest","oldest"],"type":"string","default":"newest","title":"Order"}},{"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"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewList"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/reviews/{event_id}":{"get":{"tags":["admin"],"summary":"Review Detail","description":"One edited result: every field (model / user / approved), the rules' check, the full change history, and the\ntraining label it has now (if any).","operationId":"review_detail_v2_admin_reviews__event_id__get","security":[{"AdminKey":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Review Decide","description":"Approve (optionally with corrected values: they are what training uses), reject, skip, or reset to pending.\nEvery value the admin changes is added to the history.","operationId":"review_decide_v2_admin_reviews__event_id__post","security":[{"AdminKey":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unprocessable Entity"}}}},"/v2/admin/reviews/bulk":{"post":{"tags":["admin"],"summary":"Review Bulk","description":"The same decision for many results. approve uses what each user saved, unchanged.","operationId":"review_bulk_v2_admin_reviews_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkReviewDecision"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkReviewResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable Entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"AdminKey":[]}]}},"/v2/admin/nlu-models":{"get":{"tags":["admin"],"summary":"Nlu Models","description":"Installed NLU versions (manifest, evaluation, served / offered to apps), the version served, whether .env pins\nit, the rollback target, and the switch history.","operationId":"nlu_models_v2_admin_nlu_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"AdminKey":[]}]}},"/v2/admin/nlu-models/try":{"post":{"tags":["admin"],"summary":"Nlu Models Try","description":"Run one transcript through several versions side by side (raw model output, before the server's checks and\nGemini). Nothing is saved and nothing is switched.","operationId":"nlu_models_try_v2_admin_nlu_models_try_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelTryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable Entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"AdminKey":[]}]}},"/v2/admin/nlu-models/rollback":{"post":{"tags":["admin"],"summary":"Nlu Models Rollback","description":"Go back to the version served before the current one (checked first, like a switch).","operationId":"nlu_models_rollback_v2_admin_nlu_models_rollback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelSwitchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"AdminKey":[]}]}},"/v2/admin/nlu-models/{version}/check":{"post":{"tags":["admin"],"summary":"Nlu Models Check","description":"Files, sha256, loads, valid JSON on sample phrases: what a switch requires. Changes nothing.","operationId":"nlu_models_check_v2_admin_nlu_models__version__check_post","security":[{"AdminKey":[]}],"parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/nlu-models/{version}/activate":{"post":{"tags":["admin"],"summary":"Nlu Models Activate","description":"Serve this version: checked first, then latest.json points at it. The server and the apps (GET /v2/models)\nfollow on their next call, no restart. 409 when .env pins the version or a check fails.","operationId":"nlu_models_activate_v2_admin_nlu_models__version__activate_post","security":[{"AdminKey":[]}],"parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelSwitchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Conflict"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/asr-models":{"get":{"tags":["admin"],"summary":"Asr Models State","description":"Speech models: the ONNX packs (per language; what apps download), the multilingual .nemo model, which engine\neach language uses, and the .nemo files the packs are exported from. Loads nothing.","operationId":"asr_models_state_v2_admin_asr_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"AdminKey":[]}]}},"/v2/admin/asr-models/{language}/check":{"post":{"tags":["admin"],"summary":"Asr Models Check","description":"Every file of the language's ONNX pack: present, and its size and sha256 match manifest.json.","operationId":"asr_models_check_v2_admin_asr_models__language__check_post","security":[{"AdminKey":[]}],"parameters":[{"name":"language","in":"path","required":true,"schema":{"type":"string","title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/lexicon":{"get":{"tags":["admin"],"summary":"Lexicon","description":"Per category: the item words per language, the English words used inside gu / hi speech, the shops, and the\nkeywords the rules match; plus the sentence patterns, date phrases and currency words the training data is\nbuilt from. Edited in the files, never here.","operationId":"lexicon_v2_admin_lexicon_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"AdminKey":[]}]}},"/v2/admin/lexicon/try":{"post":{"tags":["admin"],"summary":"Lexicon Try","description":"What the rules alone make of a sentence: category, the keyword that matched, and the amount they read.\nThis is the fallback path, not the NLU model (use /v2/admin/nlu-models/try for that).","operationId":"lexicon_try_v2_admin_lexicon_try_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LexiconTryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable Entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"AdminKey":[]}]}},"/v2/asr/transcribe":{"post":{"tags":["voice"],"summary":"Transcribe","description":"Audio -> text.","operationId":"transcribe_v2_asr_transcribe_post","security":[{"AppKey":[]}],"parameters":[{"name":"x-device-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable per-install id","title":"X-Device-Id"},"description":"Stable per-install id"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_transcribe_v2_asr_transcribe_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsrResult"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unprocessable Entity"}}}},"/v2/voice/parse":{"post":{"tags":["voice"],"summary":"Voice Parse","description":"Audio -> text -> expense. On 422 no_expense_found the body still carries the transcript.","operationId":"voice_parse_v2_voice_parse_post","security":[{"AppKey":[]}],"parameters":[{"name":"x-device-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable per-install id","title":"X-Device-Id"},"description":"Stable per-install id"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_voice_parse_v2_voice_parse_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceParseResponse"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unprocessable Entity"}}}},"/v2/nlu/parse":{"post":{"tags":["nlu"],"summary":"Parse","description":"Transcript -> expense JSON: ONNX model, checked by the rules, Gemini fallback within budget.","operationId":"parse_v2_nlu_parse_post","security":[{"AppKey":[]}],"parameters":[{"name":"x-device-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable per-install id","title":"X-Device-Id"},"description":"Stable per-install id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NluParseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NluParseResponse"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unprocessable Entity"}}}},"/v2/nlu/results":{"post":{"tags":["nlu"],"summary":"Results","description":"What the user saved, in one call for both cases:\nonline (entry has event_id from a server parse) and offline (parsed on the device; send the transcript too).\nIdempotent on entry id: re-sending the same batch after a timeout is safe. Never calls Gemini.","operationId":"results_v2_nlu_results_post","security":[{"AppKey":[]}],"parameters":[{"name":"x-device-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable per-install id","title":"X-Device-Id"},"description":"Stable per-install id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResultsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResultsResponse"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unprocessable Entity"}}}},"/v2/models":{"get":{"tags":["models"],"summary":"List Models","description":"Everything the app can download for offline use. Call on start: download a model when update_available.","operationId":"list_models_v2_models_get","security":[{"AppKey":[]}],"parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["asr","nlu"],"type":"string"},{"type":"null"}],"description":"Only this kind of model","title":"Type"},"description":"Only this kind of model"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only models for this language","title":"Lang"},"description":"Only models for this language"},{"name":"installed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the app has, e.g. asr-gu@20260911.115542,nlu@1.1.0 -> update_available per model","title":"Installed"},"description":"What the app has, e.g. asr-gu@20260911.115542,nlu@1.1.0 -> update_available per model"},{"name":"max_nlu_schema","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Newest NLU output schema this app build understands","title":"Max Nlu Schema"},"description":"Newest NLU output schema this app build understands"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/models/{model_id}/files/{filename}":{"get":{"tags":["models"],"summary":"Download","description":"One model file. HEAD and Range are supported, so downloads can resume.","operationId":"download_v2_models__model_id__files__filename__get","security":[{"AppKey":[]}],"parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"NLU only","title":"Version"},"description":"NLU only"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/octet-stream":{}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/languages":{"get":{"tags":["languages"],"summary":"List Languages","description":"Every language: offered now, offline pack, server speech model, and (with X-Device-Id) requested by me.","operationId":"list_languages_v2_languages_get","security":[{"AppKey":[]}],"parameters":[{"name":"x-device-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable per-install id","title":"X-Device-Id"},"description":"Stable per-install id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageList"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/languages/requests":{"post":{"tags":["languages"],"summary":"Request Language","description":"A user asks for a language. Nothing is recorded for a language that is already offered.","operationId":"request_language_v2_languages_requests_post","security":[{"AppKey":[]}],"parameters":[{"name":"x-device-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable per-install id","title":"X-Device-Id"},"description":"Stable per-install id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageRequestCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageRequestResponse"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unprocessable Entity"}}}},"/v2/user-data":{"delete":{"tags":["privacy"],"summary":"Delete User Data","description":"Deletes this device's audio files, speech + NLU events, training labels and language requests.","operationId":"delete_user_data_v2_user_data_delete","security":[{"AppKey":[]}],"parameters":[{"name":"x-device-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stable per-install id","title":"X-Device-Id"},"description":"Stable per-install id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteUserDataResponse"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Service Unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AsrResult":{"properties":{"transcript":{"type":"string","title":"Transcript"},"romanized":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Romanized","description":"Transcript in Latin script, when romanize=true"},"language":{"type":"string","title":"Language"},"engine":{"type":"string","enum":["onnx","nemo","stub"],"title":"Engine"},"model_version":{"type":"string","title":"Model Version"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"asr_event_id":{"type":"string","title":"Asr Event Id"}},"type":"object","required":["transcript","language","engine","model_version","confidence","asr_event_id"],"title":"AsrResult"},"Body_transcribe_v2_asr_transcribe_post":{"properties":{"audio":{"type":"string","contentMediaType":"application/octet-stream","title":"Audio"},"language":{"type":"string","title":"Language","description":"gu, hi, mr, ... (ISO code or name)"},"engine":{"type":"string","enum":["auto","onnx","nemo"],"title":"Engine","description":"auto: the ONNX pack if the language has one, else .nemo","default":"auto"},"romanize":{"type":"boolean","title":"Romanize","description":"Also return the transcript in Latin script","default":false},"consent_store_audio":{"type":"boolean","title":"Consent Store Audio","description":"Keep the audio for training (needs X-Device-Id)","default":false}},"type":"object","required":["audio","language"],"title":"Body_transcribe_v2_asr_transcribe_post"},"Body_voice_parse_v2_voice_parse_post":{"properties":{"audio":{"type":"string","contentMediaType":"application/octet-stream","title":"Audio"},"language":{"type":"string","title":"Language","description":"gu, hi, mr, ... (ISO code or name)"},"engine":{"type":"string","enum":["auto","onnx","nemo"],"title":"Engine","default":"auto"},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$","title":"Currency","default":"INR"},"reference_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Date","description":"YYYY-MM-DD, the user's local today"},"client_datetime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Datetime"},"consent_store_audio":{"type":"boolean","title":"Consent Store Audio","default":false}},"type":"object","required":["audio","language"],"title":"Body_voice_parse_v2_voice_parse_post"},"BulkReviewDecision":{"properties":{"event_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"minItems":1,"title":"Event Ids"},"action":{"type":"string","enum":["approve","reject","skip","reset"],"title":"Action","description":"approve uses what each user saved, unchanged"},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note"},"reviewer":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Reviewer"}},"type":"object","required":["event_ids","action"],"title":"BulkReviewDecision"},"BulkReviewResult":{"properties":{"updated":{"items":{"type":"string"},"type":"array","title":"Updated"},"not_found":{"items":{"type":"string"},"type":"array","title":"Not Found"}},"type":"object","required":["updated","not_found"],"title":"BulkReviewResult"},"DeleteUserDataResponse":{"properties":{"device_id":{"type":"string","title":"Device Id"},"deleted":{"additionalProperties":{"type":"integer"},"type":"object","title":"Deleted"}},"type":"object","required":["device_id","deleted"],"title":"DeleteUserDataResponse"},"ErrorResponse":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["code","message"],"title":"ErrorResponse"},"ExpenseFields":{"properties":{"amount":{"type":"number","minimum":0.0,"title":"Amount","description":"Major units: 25.0 = ₹25. 0 = no amount was said (ask the user)"},"category":{"type":"string","enum":["Food & Drink","Groceries","Transport","Fuel","Rent","Bills","Health","Shopping","Entertainment","Education","Travel","Personal Care","Gifts/Donations","Investments","Misc"],"title":"Category"},"merchant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"spent_at":{"type":"string","title":"Spent At","description":"YYYY-MM-DD"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","required":["amount","category","spent_at"],"title":"ExpenseFields"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","const":"ok","title":"Status","default":"ok"},"asr_onnx_languages":{"items":{"type":"string"},"type":"array","title":"Asr Onnx Languages","description":"Languages with an installed ONNX pack"},"asr_nemo_enabled":{"type":"boolean","title":"Asr Nemo Enabled","description":"The multilingual .nemo model is configured and its file exists"},"nlu_model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nlu Model Version","description":"NLU model version served (null: none installed)"},"gemini_enabled":{"type":"boolean","title":"Gemini Enabled"}},"type":"object","required":["asr_onnx_languages","asr_nemo_enabled","nlu_model_version","gemini_enabled"],"title":"HealthResponse"},"LanguageDemand":{"properties":{"language":{"type":"string","title":"Language"},"name":{"type":"string","title":"Name"},"devices":{"type":"integer","title":"Devices"},"requests":{"type":"integer","title":"Requests"},"first_requested_at":{"type":"string","title":"First Requested At"},"last_requested_at":{"type":"string","title":"Last Requested At"}},"type":"object","required":["language","name","devices","requests","first_requested_at","last_requested_at"],"title":"LanguageDemand"},"LanguageDemandSummary":{"properties":{"total_devices":{"type":"integer","title":"Total Devices"},"languages":{"items":{"$ref":"#/components/schemas/LanguageDemand"},"type":"array","title":"Languages"}},"type":"object","required":["total_devices","languages"],"title":"LanguageDemandSummary"},"LanguageInfo":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"native_name":{"type":"string","title":"Native Name"},"supported":{"type":"boolean","title":"Supported","description":"Offered in the app now"},"offline_asr":{"type":"boolean","title":"Offline Asr","description":"A downloadable ONNX speech pack exists"},"server_asr":{"type":"boolean","title":"Server Asr","description":"The server can transcribe it (ONNX pack or .nemo model)"},"requested_by_device":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requested By Device","description":"Set when X-Device-Id is sent"}},"type":"object","required":["code","name","native_name","supported","offline_asr","server_asr"],"title":"LanguageInfo"},"LanguageList":{"properties":{"supported":{"items":{"type":"string"},"type":"array","title":"Supported"},"languages":{"items":{"$ref":"#/components/schemas/LanguageInfo"},"type":"array","title":"Languages"}},"type":"object","required":["supported","languages"],"title":"LanguageList"},"LanguageRequestCreate":{"properties":{"language":{"type":"string","maxLength":40,"minLength":1,"title":"Language","description":"ISO code ('mr') or name ('Marathi', 'मराठी')"},"platform":{"anyOf":[{"type":"string","enum":["ios","android"]},{"type":"null"}],"title":"Platform"},"app_version":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"App Version"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["language"],"title":"LanguageRequestCreate"},"LanguageRequestResponse":{"properties":{"language":{"type":"string","title":"Language"},"name":{"type":"string","title":"Name"},"native_name":{"type":"string","title":"Native Name"},"supported":{"type":"boolean","title":"Supported","description":"Already offered: nothing was recorded"},"already_requested":{"type":"boolean","title":"Already Requested"},"device_request_count":{"type":"integer","title":"Device Request Count"},"total_devices":{"type":"integer","title":"Total Devices","description":"Unique devices that asked for this language"}},"type":"object","required":["language","name","native_name","supported","already_requested","device_request_count","total_devices"],"title":"LanguageRequestResponse"},"LexiconTryRequest":{"properties":{"text":{"type":"string","maxLength":1000,"minLength":1,"title":"Text","examples":["કાલે 200 નું ગ્રોસરી લીધું"]}},"type":"object","required":["text"],"title":"LexiconTryRequest"},"ModelFile":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"size_bytes":{"type":"integer","title":"Size Bytes"},"sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sha256"}},"type":"object","required":["name","url","size_bytes"],"title":"ModelFile"},"ModelInfo":{"properties":{"id":{"type":"string","title":"Id","description":"asr-<lang> or nlu"},"type":{"type":"string","enum":["asr","nlu"],"title":"Type"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"version":{"type":"string","title":"Version"},"format":{"type":"string","const":"onnx","title":"Format","default":"onnx"},"precision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Precision"},"schema_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schema Version","description":"NLU output format version"},"review_threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Review Threshold"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"size_bytes":{"type":"integer","title":"Size Bytes","description":"All files"},"files":{"items":{"$ref":"#/components/schemas/ModelFile"},"type":"array","title":"Files"},"installed_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installed Version","description":"Echo of what the app said it has"},"update_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Update Available","description":"Set when the app sent its installed version"}},"type":"object","required":["id","type","languages","version","size_bytes","files"],"title":"ModelInfo"},"ModelList":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ModelInfo"},"type":"array","title":"Models"}},"type":"object","required":["models"],"title":"ModelList"},"ModelSwitchRequest":{"properties":{"reviewer":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Reviewer","description":"Who switched (shown in the history)"},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note","description":"Why, e.g. 'amount errors in Hindi'"}},"type":"object","title":"ModelSwitchRequest"},"ModelTryRequest":{"properties":{"transcript":{"type":"string","maxLength":1000,"minLength":1,"title":"Transcript","examples":["petrol ma 500 rupiya"]},"reference_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Date","description":"YYYY-MM-DD (default: today)"},"versions":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":4},{"type":"null"}],"title":"Versions","description":"Installed versions to run (default: served + newest other)"}},"type":"object","required":["transcript"],"title":"ModelTryRequest"},"NluParseRequest":{"properties":{"transcript":{"type":"string","maxLength":1000,"minLength":1,"title":"Transcript"},"reference_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Date","description":"YYYY-MM-DD, the user's local today"},"client_datetime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Datetime","description":"ISO datetime; used if reference_date is empty"},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$","title":"Currency","default":"INR"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"The language, if known (e.g. from the keyboard). Marathi and Hindi share a script, so send mr for Marathi"}},"type":"object","required":["transcript"],"title":"NluParseRequest"},"NluParseResponse":{"properties":{"amount":{"type":"number","minimum":0.0,"title":"Amount","description":"Major units: 25.0 = ₹25. 0 = no amount was said (ask the user)"},"category":{"type":"string","enum":["Food & Drink","Groceries","Transport","Fuel","Rent","Bills","Health","Shopping","Entertainment","Education","Travel","Personal Care","Gifts/Donations","Investments","Misc"],"title":"Category"},"merchant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"spent_at":{"type":"string","title":"Spent At","description":"YYYY-MM-DD"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"event_id":{"type":"string","title":"Event Id","description":"Send back in POST /v2/nlu/results once the user saves"},"transcript":{"type":"string","title":"Transcript"},"currency":{"type":"string","title":"Currency"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"needs_review":{"type":"boolean","title":"Needs Review"},"source":{"type":"string","enum":["model","gemini","rules"],"title":"Source"},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version"},"fallback_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Reason","description":"Why the model result was not used as is"}},"type":"object","required":["amount","category","spent_at","event_id","transcript","currency","confidence","needs_review","source"],"title":"NluParseResponse"},"RejectedEntry":{"properties":{"id":{"type":"string","title":"Id"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["id","reason"],"title":"RejectedEntry"},"ResultEntry":{"properties":{"id":{"type":"string","maxLength":64,"minLength":8,"pattern":"^[A-Za-z0-9._:-]+$","title":"Id","description":"App-generated id of this saved result; re-sending it is a no-op"},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id","description":"From /v2/nlu/parse or /v2/voice/parse (online). Omit for entries parsed on the device (offline)"},"final":{"$ref":"#/components/schemas/ExpenseFields","description":"What the user saved"},"edited_fields":{"items":{"type":"string"},"type":"array","title":"Edited Fields"},"transcript_edited":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Edited"},"confirm_time_ms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Confirm Time Ms"},"edit_reason":{"anyOf":[{"type":"string","enum":["model_error","user_changed","asr_error"]},{"type":"null"}],"title":"Edit Reason"},"transcript":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Transcript"},"reference_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Date"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At","description":"ISO datetime when the user saved it"},"model_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Model Json","description":"Raw on-device model output, if it ran"},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version"},"model_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Model Confidence"},"asr_model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asr Model Version"}},"type":"object","required":["id","final"],"title":"ResultEntry"},"ResultsRequest":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/ResultEntry"},"type":"array","maxItems":200,"minItems":1,"title":"Entries"}},"type":"object","required":["entries"],"title":"ResultsRequest"},"ResultsResponse":{"properties":{"saved":{"items":{"type":"string"},"type":"array","title":"Saved"},"duplicates":{"items":{"type":"string"},"type":"array","title":"Duplicates"},"rejected":{"items":{"$ref":"#/components/schemas/RejectedEntry"},"type":"array","title":"Rejected"}},"type":"object","required":["saved","duplicates","rejected"],"title":"ResultsResponse"},"ReviewDecision":{"properties":{"action":{"type":"string","enum":["approve","reject","skip","reset"],"title":"Action","description":"approve: use for training · reject: wrong, never use · skip: not used (e.g. unsure) · reset: back to pending"},"label":{"anyOf":[{"$ref":"#/components/schemas/ExpenseFields"},{"type":"null"}],"description":"approve only: the verified values training will use (default: what the user saved)"},"transcript":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Transcript","description":"approve only: the verified transcript (default: the user's)"},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note"},"reviewer":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Reviewer","description":"Who reviewed it (shown in the history)"}},"type":"object","required":["action"],"title":"ReviewDecision"},"ReviewList":{"properties":{"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts","description":"Results per status (with the other filters applied)"},"total":{"type":"integer","title":"Total","description":"Results matching all filters, status included"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items","description":"One page: event_id, status, transcript, changes (field, model, user), ..."},"facets":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object","title":"Facets","description":"Values each filter can take, with counts"}},"type":"object","required":["counts","total","items","facets"],"title":"ReviewList"},"TrainingData":{"properties":{"count":{"type":"integer","title":"Count"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"}},"type":"object","required":["count","items"],"title":"TrainingData"},"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"},"VoiceParseResponse":{"properties":{"amount":{"type":"number","minimum":0.0,"title":"Amount","description":"Major units: 25.0 = ₹25. 0 = no amount was said (ask the user)"},"category":{"type":"string","enum":["Food & Drink","Groceries","Transport","Fuel","Rent","Bills","Health","Shopping","Entertainment","Education","Travel","Personal Care","Gifts/Donations","Investments","Misc"],"title":"Category"},"merchant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"spent_at":{"type":"string","title":"Spent At","description":"YYYY-MM-DD"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"event_id":{"type":"string","title":"Event Id","description":"Send back in POST /v2/nlu/results once the user saves"},"transcript":{"type":"string","title":"Transcript"},"currency":{"type":"string","title":"Currency"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"needs_review":{"type":"boolean","title":"Needs Review"},"source":{"type":"string","enum":["model","gemini","rules"],"title":"Source"},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version"},"fallback_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Reason","description":"Why the model result was not used as is"},"asr":{"$ref":"#/components/schemas/AsrResult"}},"type":"object","required":["amount","category","spent_at","event_id","transcript","currency","confidence","needs_review","source","asr"],"title":"VoiceParseResponse"}},"securitySchemes":{"AdminKey":{"type":"apiKey","description":"Backend team only","in":"header","name":"X-Admin-Key"},"AppKey":{"type":"apiKey","description":"The app key shared with the mobile team","in":"header","name":"X-API-Key"}}}}