{"openapi":"3.1.0","info":{"title":"ClaimMind Open API Service","description":"API for SIMRS (Hospital Information Management System) integration","version":"26.1.0"},"paths":{"/admin/hospital-groups":{"get":{"tags":["Hospital Groups"],"summary":"List Hospital Groups","description":"List hospital groups.\n- **MTK Admin**: All hospital groups\n- **Super Admin**: Only their own hospital group","operationId":"list_hospital_groups_admin_hospital_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/HospitalGroupResponse"},"type":"array","title":"Response List Hospital Groups Admin Hospital Groups Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Hospital Groups"],"summary":"Create Hospital Group","description":"Create a new hospital group.\n**MTK Admin only**.","operationId":"create_hospital_group_admin_hospital_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HospitalGroupCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HospitalGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/hospital-groups/{hospital_group_id}":{"get":{"tags":["Hospital Groups"],"summary":"Get Hospital Group","description":"Get hospital group details.\n- **MTK Admin**: Any hospital group\n- **Super Admin**: Only their own hospital group","operationId":"get_hospital_group_admin_hospital_groups__hospital_group_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"path","required":true,"schema":{"type":"string","title":"Hospital Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HospitalGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Hospital Groups"],"summary":"Update Hospital Group","description":"Update hospital group information.\n**MTK Admin only**.","operationId":"update_hospital_group_admin_hospital_groups__hospital_group_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"path","required":true,"schema":{"type":"string","title":"Hospital Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HospitalGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HospitalGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Hospital Groups"],"summary":"Delete Hospital Group","description":"Delete a hospital group.\n**MTK Admin only**.","operationId":"delete_hospital_group_admin_hospital_groups__hospital_group_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"path","required":true,"schema":{"type":"string","title":"Hospital Group Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/hospital-groups/{hospital_group_id}/super-admins":{"post":{"tags":["Hospital Groups"],"summary":"Create Super Admin","description":"Create a new super-admin user for the hospital group.\n**MTK Admin only**.","operationId":"create_super_admin_admin_hospital_groups__hospital_group_id__super_admins_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"path","required":true,"schema":{"type":"string","title":"Hospital Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSuperAdminRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Hospital Groups"],"summary":"List Super Admins","description":"List all super-admins in a hospital group.\n- **MTK Admin**: Any hospital group\n- **Super Admin**: Only their own hospital group","operationId":"list_super_admins_admin_hospital_groups__hospital_group_id__super_admins_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"path","required":true,"schema":{"type":"string","title":"Hospital Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserResponse"},"title":"Response List Super Admins Admin Hospital Groups  Hospital Group Id  Super Admins Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/hospital-groups/{hospital_group_id}/super-admins/{user_id}":{"delete":{"tags":["Hospital Groups"],"summary":"Remove Super Admin","description":"Remove super-admin from the hospital group.\n**MTK Admin only**.","operationId":"remove_super_admin_admin_hospital_groups__hospital_group_id__super_admins__user_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"path","required":true,"schema":{"type":"string","title":"Hospital Group Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants":{"post":{"tags":["Tenants"],"summary":"Create Tenant","description":"Create a new tenant.\n- **MTK Admin**: Must provide hospital_group_id in query param\n- **Super Admin**: Uses hospital_group_id from JWT token","operationId":"create_tenant_admin_tenants_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hospital group ID (required for MTK Admin)","title":"Hospital Group Id"},"description":"Hospital group ID (required for MTK Admin)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tenants"],"summary":"List Tenants","description":"List tenants based on user's access scope.\n- **MTK Admin**: All tenants (optionally filtered by hospital_group_id)\n- **Super Admin**: Tenants in their hospital group\n- **Org Admin**: Only their own tenant","operationId":"list_tenants_admin_tenants_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by hospital group","title":"Hospital Group Id"},"description":"Filter by hospital group"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationResponse"},"title":"Response List Tenants Admin Tenants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}":{"get":{"tags":["Tenants"],"summary":"Get Tenant","description":"Get tenant details.\nAccess validated based on user's role and scope.","operationId":"get_tenant_admin_tenants__tenant_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Tenants"],"summary":"Update Tenant","description":"Update tenant details.\nAccess validated based on user's role and scope.","operationId":"update_tenant_admin_tenants__tenant_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tenants"],"summary":"Delete Tenant","description":"Delete a tenant.\n- **MTK Admin**: Any tenant\n- **Super Admin**: Only tenants in their hospital group","operationId":"delete_tenant_admin_tenants__tenant_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/org-admins":{"post":{"tags":["Tenants"],"summary":"Create Org Admin","description":"Create a new org-admin user for the tenant.\nAll admin roles can create org-admins in their scope.","operationId":"create_org_admin_admin_tenants__tenant_id__org_admins_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrgAdminRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tenants"],"summary":"List Org Admins","description":"List org-admins in the tenant.\nAccess validated based on user's role and scope.","operationId":"list_org_admins_admin_tenants__tenant_id__org_admins_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserResponse"},"title":"Response List Org Admins Admin Tenants  Tenant Id  Org Admins Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/org-admins/{user_id}":{"delete":{"tags":["Tenants"],"summary":"Remove Org Admin","description":"Remove an org-admin from the tenant.\n- **MTK Admin**: Any tenant\n- **Super Admin**: Only tenants in their hospital group","operationId":"remove_org_admin_admin_tenants__tenant_id__org_admins__user_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/sync-from-app":{"post":{"tags":["Tenants"],"summary":"Sync Tenant From App","description":"Sync tenant from Claim Mind App to Open API.\n\nThis operation:\n- Moves all data (claims, sftp_sync_log, users) from old tenant to new tenant\n- Transfers hospital_group_id from old to new tenant\n- Updates Keycloak group attributes\n\n**Requires mtk-admin role.**","operationId":"sync_tenant_from_app_admin_tenants_sync_from_app_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSyncRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/api-keys":{"post":{"tags":["API Keys"],"summary":"Create Api Key","description":"Create a new API key for a tenant.\n\nAccess control:\n- MTK Admin: Must specify tenant_id, can access any tenant\n- Super Admin: Must specify tenant_id within their hospital group\n- Org Admin: Uses their own tenant_id (query param ignored)","operationId":"create_api_key_admin_api_keys_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID to create API key for. Required for MTK Admin, optional for others.","title":"Tenant Id"},"description":"Tenant ID to create API key for. Required for MTK Admin, optional for others."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API Keys"],"summary":"List Api Keys","description":"List API keys based on role scope.\n\nAccess control:\n- MTK Admin: Must specify tenant_id, can access any tenant\n- Super Admin: If tenant_id provided, lists for that tenant (must be in hospital group).\n               If not provided, lists all keys for tenants in hospital group.\n- Org Admin: Lists keys for their own tenant only","operationId":"list_api_keys_admin_api_keys_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID to list keys for. Required for MTK Admin, optional for Super Admin (lists all in hospital group), auto-set for Org Admin.","title":"Tenant Id"},"description":"Tenant ID to list keys for. Required for MTK Admin, optional for Super Admin (lists all in hospital group), auto-set for Org Admin."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APIKeyResponse"},"title":"Response List Api Keys Admin Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api-keys/{key_id}":{"get":{"tags":["API Keys"],"summary":"Get Api Key","description":"Get a specific API key by ID.\nAccess validated based on user's role and scope.","operationId":"get_api_key_admin_api_keys__key_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID the API key belongs to","title":"Tenant Id"},"description":"Tenant ID the API key belongs to"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["API Keys"],"summary":"Update Api Key","description":"Update an API key's name, scopes, or status.\nAccess validated based on user's role and scope.","operationId":"update_api_key_admin_api_keys__key_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID the API key belongs to","title":"Tenant Id"},"description":"Tenant ID the API key belongs to"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API Keys"],"summary":"Revoke Api Key","description":"Revoke (disable) an API key.\nAccess validated based on user's role and scope.","operationId":"revoke_api_key_admin_api_keys__key_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID the API key belongs to","title":"Tenant Id"},"description":"Tenant ID the API key belongs to"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api-keys/validate":{"post":{"tags":["API Keys"],"summary":"Validate Api Key Endpoint","description":"Validate an API key (for testing purposes).\nThis endpoint is for admin testing/debugging only.","operationId":"validate_api_key_endpoint_admin_api_keys_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"tags":["Settings"],"summary":"Get Settings","description":"Get all partner settings (webhook + SFTP) for a tenant.\n\nAccess control:\n- MTK Admin: Must specify tenant_id\n- Super Admin: Can specify tenant_id or use hospital group context\n- Org Admin: Uses own tenant (query param ignored)","operationId":"get_settings_admin_settings_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID. Required for MTK Admin, optional for Super Admin, auto for Org Admin.","title":"Tenant Id"},"description":"Tenant ID. Required for MTK Admin, optional for Super Admin, auto for Org Admin."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/webhook":{"get":{"tags":["Settings"],"summary":"Get Webhook Config","description":"Get webhook configuration (without secret).","operationId":"get_webhook_config_admin_settings_webhook_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfigGetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Settings"],"summary":"Create Webhook Config","description":"Create webhook configuration.\nReturns the webhook secret (only shown once).","operationId":"create_webhook_config_admin_settings_webhook_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfigUpdate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Settings"],"summary":"Update Webhook Config","description":"Update webhook configuration (partial update).\nOnly updates provided fields. Omitted fields keep their existing values.","operationId":"update_webhook_config_admin_settings_webhook_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfigPartialUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Settings"],"summary":"Disable Webhook","description":"Disable webhook notifications.","operationId":"disable_webhook_admin_settings_webhook_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/webhook/test":{"post":{"tags":["Settings"],"summary":"Test Webhook","description":"Test webhook configuration.\nSends a test event to verify webhook endpoint is accessible.","operationId":"test_webhook_admin_settings_webhook_test_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/sftp":{"get":{"tags":["Settings"],"summary":"Get Sftp Config","description":"Get SFTP configuration (password excluded).","operationId":"get_sftp_config_admin_settings_sftp_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Settings"],"summary":"Create Sftp Config","description":"Create SFTP configuration.","operationId":"create_sftp_config_admin_settings_sftp_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpConfigCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Settings"],"summary":"Update Sftp Config","description":"Update SFTP configuration.","operationId":"update_sftp_config_admin_settings_sftp_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Settings"],"summary":"Delete Sftp Config","description":"Delete SFTP configuration.","operationId":"delete_sftp_config_admin_settings_sftp_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/sftp/test":{"post":{"tags":["Settings"],"summary":"Test Sftp Config","description":"Test stored SFTP configuration.\nTries to connect using the currently saved credentials.","operationId":"test_sftp_config_admin_settings_sftp_test_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/configs/bulk":{"put":{"tags":["Settings"],"summary":"Bulk Update Configs","description":"Bulk update tenant configurations.\nAllows updating multiple configuration keys at once.","operationId":"bulk_update_configs_admin_settings_configs_bulk_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID","title":"Tenant Id"},"description":"Tenant ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigBulkUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/snomed":{"get":{"tags":["Settings"],"summary":"Get Snomed Settings","description":"Get SNOMED feature settings for a tenant.\n\nReads sys_tenant_features (feature_code = 'snomed') — the same source\ncl-service's tenant_policy_service/snomed_service read from — not the\nlegacy sys_tenant_configs 'snomed_enabled' key.\n\nAccess control: MTK Admin only.","operationId":"get_snomed_settings_admin_settings_snomed_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID (required for MTK Admin)","title":"Tenant Id"},"description":"Tenant ID (required for MTK Admin)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnomedSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Settings"],"summary":"Update Snomed Settings","description":"Update SNOMED feature settings for a tenant.\n\nWrites sys_tenant_features (feature_code = 'snomed') — the same source\ncl-service's tenant_policy_service/snomed_service read from — not the\nlegacy sys_tenant_configs 'snomed_enabled' key.\n\nAccess control: MTK Admin only.","operationId":"update_snomed_settings_admin_settings_snomed_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID (required for MTK Admin)","title":"Tenant Id"},"description":"Tenant ID (required for MTK Admin)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnomedSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnomedSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/plans":{"get":{"tags":["Subscriptions"],"summary":"Get Plan List","description":"List all available subscription plans.\n\nReturns plans from Lago that contain 'claim' in their code,\nexcluding the free plan.\n\n**Access:** mtk_admin only","operationId":"get_plan_list_admin_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanListResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/tenants/{tenant_id}/subscription":{"post":{"tags":["Subscriptions"],"summary":"Assign Subscription","description":"Assign a subscription plan to a tenant.\n\nCreates a new subscription in Lago for the specified tenant.\nThe subscription starts on the provided start_date and ends after\nthe configured subscription period.\n\n**Access:** mtk_admin only\n\n**Request body:**\n```json\n{\n    \"plan_code\": \"claim_mind_pro\",\n    \"start_date\": \"2026-01-21\"\n}\n```","operationId":"assign_subscription_admin_tenants__tenant_id__subscription_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanAssignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionAssignResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Subscriptions"],"summary":"Get Subscription","description":"Get subscription details for a tenant.\n\nReturns the active subscription information including plan details,\nstatus, start date, and end date.\n\n**Access:**\n- mtk_admin: can view any tenant\n- super_admin: can view tenants in their hospital group\n- org_admin: can view only their own tenant","operationId":"get_subscription_admin_tenants__tenant_id__subscription_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Subscriptions"],"summary":"Update Subscription","description":"Update an existing subscription for a tenant.\n\nSupports changing the plan and/or the ending date. When changing\nthe plan, the old subscription is terminated and a new one is created.\n\nUse `effective_date` to schedule a future plan change instead of\nan immediate switch.\n\n**Access:** mtk_admin and super_admin (scoped to hospital group)\n\n**Request body:**\n```json\n{\n    \"plan_code\": \"claim_mind_pro\",\n    \"ending_at\": \"2027-01-31\",\n    \"effective_date\": null\n}\n```","operationId":"update_subscription_admin_tenants__tenant_id__subscription_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/subscription/cancel":{"post":{"tags":["Subscriptions"],"summary":"Cancel Subscription","description":"Cancel a tenant's subscription.\n\nSupports two cancellation modes:\n- `immediate`: Terminates the subscription right away, generates final invoice\n- `end_of_period`: Subscription continues until the current billing period ends\n\nIdempotent: cancelling an already-cancelled subscription returns 200.\n\n**Access:** mtk_admin and super_admin (scoped to hospital group)\n\n**Request body:**\n```json\n{\n    \"effective\": \"immediate\"\n}\n```","operationId":"cancel_subscription_admin_tenants__tenant_id__subscription_cancel_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCancelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCancelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/subscription/pause":{"post":{"tags":["Subscriptions"],"summary":"Pause Subscription","description":"Pause a tenant's subscription.\n\nTerminates the subscription in Lago and stores the pause state locally.\nBilling stops and the Claims API is blocked for this tenant.\n\nUse the resume endpoint to reactivate the subscription. The remaining\nsubscription time will be extended by the pause duration.\n\nIdempotent: pausing an already-paused subscription returns 200.\n\n**Access:** mtk_admin and super_admin (scoped to hospital group)\n\n**Request body:**\n```json\n{\n    \"reason\": \"Payment dispute\"\n}\n```","operationId":"pause_subscription_admin_tenants__tenant_id__subscription_pause_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPauseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPauseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/subscription/resume":{"post":{"tags":["Subscriptions"],"summary":"Resume Subscription","description":"Resume a paused subscription.\n\nCreates a new subscription in Lago using the saved pause state.\nThe ending date is extended by the number of days the subscription\nwas paused.\n\n**Access:** mtk_admin and super_admin (scoped to hospital group)","operationId":"resume_subscription_admin_tenants__tenant_id__subscription_resume_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResumeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/subscription/history":{"get":{"tags":["Subscriptions"],"summary":"Get Subscription History","description":"Get subscription history for a tenant.\n\nReturns all subscriptions (active, pending, cancelled, terminated)\nsorted by creation date descending with pagination.\n\n**Access:**\n- mtk_admin: can view any tenant\n- super_admin: can view tenants in their hospital group\n- org_admin: can view only their own tenant","operationId":"get_subscription_history_admin_tenants__tenant_id__subscription_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Per Page"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/usage":{"get":{"tags":["Subscriptions"],"summary":"Get Tenant Usage","description":"Get usage data for a tenant's subscription.\n\nReturns detailed usage including breakdown by claim type:\n- rawat_jalan_count: Rawat Jalan claims processed\n- rawat_inap_count: Rawat Inap claims processed\n- free_count: Free tier usage\n- charges_usage: Full breakdown from Lago\n\n**Access:**\n- mtk_admin: can view any tenant\n- super_admin: can view tenants in their hospital group\n- org_admin: can view only their own tenant","operationId":"get_tenant_usage_admin_tenants__tenant_id__usage_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RichTenantUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/hospital-groups/{hospital_group_id}/usage":{"get":{"tags":["Subscriptions"],"summary":"Get Hospital Group Usage","description":"Get aggregated usage for all tenants in a hospital group.\n\nReturns usage data for each tenant in the hospital group,\nalong with the total usage across all tenants.\n\n**Access:**\n- mtk_admin: can view any hospital group\n- super_admin: can view only their own hospital group","operationId":"get_hospital_group_usage_admin_hospital_groups__hospital_group_id__usage_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hospital_group_id","in":"path","required":true,"schema":{"type":"string","title":"Hospital Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HospitalGroupUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/nextsync":{"post":{"tags":["Internal Services","SFTP Callbacks"],"summary":"External Sftp Nextsync Callback","description":"Callback endpoint for External SFTP Processing Workflow.\n\nFlow:\n1. Receive SFTP validation results per-claim\n2. Persist file logs and documents\n3. Update claim status\n4. Fetch webhook/hospital config from repository\n5. Trigger ExternalSftpBatchProcessingWorkflow for valid claims","operationId":"external_sftp_nextsync_callback_internal_nextsync_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpNextSyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/ocr-nextsync":{"post":{"tags":["Internal Services","SFTP Callbacks"],"summary":"External Ocr Nextsync Callback","description":"Callback endpoint for External SFTP Batch Processing Workflow (OCR completion).\n\nFlow:\n1. Guard: Skip if batch already finalized\n2. Update per-file status in sftp_file_log\n3. Update per-claim status in sftp_sync_log and claims\n4. Finalize batch status\n5. Trigger next batch if pending","operationId":"external_ocr_nextsync_callback_internal_ocr_nextsync_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SftpOcrClaimItem"},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/sftp/move-claim":{"post":{"tags":["Internal Services","SFTP Callbacks"],"summary":"Sftp Move Claim","description":"Move a single claim's SFTP folder/file to processed or errors immediately.\nCalled per-claim from ExternalSftpBatchProcessingWorkflow as soon as each\nclaim finishes, rather than waiting for the whole batch.\nCredentials are fetched server-side from the tenant config — not passed in the request body.","operationId":"sftp_move_claim_internal_sftp_move_claim_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpMoveClaimRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/subscriptions/validate-and-meter":{"post":{"tags":["Internal Services"],"summary":"Validate subscription type and meter to Lago","description":"Internal endpoint for subscription validation and metering.\n\n    Flow:\n    1. Get subscription_type from tenant config (defaults to \"all\")\n    2. Validate jenis_perawatan against subscription_type\n    3. If valid, send metering event to Lago\n\n    Error statuses:\n    - missing_jenis_perawatan: JENIS_PERAWATAN is null/missing\n    - forbidden_rawat_jalan: subscription_type=rawat_inap but claim is rawat_jalan\n    - forbidden_rawat_inap: subscription_type=rawat_jalan but claim is rawat_inap","operationId":"validate_and_meter_internal_subscriptions_validate_and_meter_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionMeterRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionMeterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{tenant_id}/webhook-config":{"get":{"tags":["Internal Services"],"summary":"Get Webhook Config Internal","description":"Return the tenant's webhook config, or ``{\"enabled\": False}`` if none\nis configured.\n\nSame tenant-scoping rule as ``validate_and_meter``: an ordinary\nclaims:write key may only fetch its own tenant; only an admin-scoped\nkey may supply a different tenant_id -- that's how cm-temporal-workflow\n(one key, every tenant) is authorized to fetch across tenants.","operationId":"get_webhook_config_internal_internal_tenants__tenant_id__webhook_config_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/list-session-id":{"post":{"tags":["Open API","Dashboard"],"summary":"List session IDs with pagination","description":"List all session IDs ordered by start time (newest first).\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    **User-configurable parameters:**\n    - `limit`: Number of results (1-100, default: 5)\n    - `offset`: Pagination offset (default: 0)\n\n    Returns session details (sessionId, startedAt, status) with total claims count per session.\n    The `tenant_id` is automatically injected from the API key — no manual filtering needed.","operationId":"list_session_id_api_v1_dashboard_list_session_id_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":5,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Session list data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse"},"example":{"data":[{"DimSession.sessionId":"session-abc-123","DimSession.startedAt":"2026-03-01T10:00:00.000","DimSession.status":"completed","FactClaimMetrics.totalClaims":"42"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/latest-session":{"post":{"tags":["Open API","Dashboard"],"summary":"Get latest session progress","description":"Get the latest session progress data ordered by start time.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    **User-configurable parameters:**\n    - `limit`: Number of results (fixed to 1)\n    - `offset`: Pagination offset (default: 0)\n\n    Returns session details (sessionId, startedAt, status, totalClaims).","operationId":"latest_session_api_v1_dashboard_latest_session_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":5,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Latest session data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse"},"example":{"data":[{"DimSession.sessionId":"session-abc-123","DimSession.startedAt":"2026-03-01T10:00:00.000","DimSession.status":"completed","FactClaimMetrics.totalClaims":"42"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/today-summary":{"post":{"tags":["Open API","Dashboard"],"summary":"Get today's claim summary","description":"Get a summary of claims for today (or the most recent day with data).\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    Returns legacy totals plus the six category measures: readyToSubmitClaims,\n    attentionClaims, documentMissingClaims, readmisiClaims, fragmentasiClaims,\n    and needToCheckClaims.","operationId":"today_summary_api_v1_dashboard_today_summary_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Today's summary data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse_DashboardSummaryRow_"},"example":{"data":[{"FactClaimMetrics.dateId":"20260309","DimDate.isoDate":"2026-03-09","FactClaimMetrics.totalClaims":"150","FactClaimMetrics.verifiedClaims":"120","FactClaimMetrics.notVerifiedClaims":"30","FactClaimMetrics.readyToSubmitClaims":"90","FactClaimMetrics.attentionClaims":"45","FactClaimMetrics.documentMissingClaims":"10","FactClaimMetrics.readmisiClaims":"12","FactClaimMetrics.fragmentasiClaims":"8","FactClaimMetrics.needToCheckClaims":"15","FactClaimMetrics.inpatientClaims":"80","FactClaimMetrics.outpatientClaims":"70"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/month-to-date-summary":{"post":{"tags":["Open API","Dashboard"],"summary":"Get month-to-date claim summary","description":"Get aggregated claim metrics for the current month-to-date.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    Returns legacy totals and all six category measures grouped by month and year.","operationId":"month_to_date_summary_api_v1_dashboard_month_to_date_summary_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Month-to-date summary data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse_DashboardSummaryRow_"},"example":{"data":[{"DimDate.month":3,"DimDate.year":2026,"FactClaimMetrics.totalClaims":"1200","FactClaimMetrics.verifiedClaims":"950","FactClaimMetrics.notVerifiedClaims":"250","FactClaimMetrics.readyToSubmitClaims":"800","FactClaimMetrics.attentionClaims":"330","FactClaimMetrics.documentMissingClaims":"80","FactClaimMetrics.readmisiClaims":"90","FactClaimMetrics.fragmentasiClaims":"60","FactClaimMetrics.needToCheckClaims":"100","FactClaimMetrics.inpatientClaims":"600","FactClaimMetrics.outpatientClaims":"600"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/trendline-month-to-date":{"post":{"tags":["Open API","Dashboard"],"summary":"Get month-to-date trendline data","description":"Get daily claim metrics trendline for the current month.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    Returns daily breakdown with legacy totals and all six category measures.\n    Data is ordered by date ascending.","operationId":"trendline_month_to_date_api_v1_dashboard_trendline_month_to_date_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Trendline data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse_DashboardSummaryRow_"},"example":{"data":[{"DimDate.date":"2026-03-01T00:00:00.000","FactClaimMetrics.totalClaims":"50","FactClaimMetrics.verifiedClaims":"40","FactClaimMetrics.notVerifiedClaims":"10","FactClaimMetrics.readyToSubmitClaims":"30","FactClaimMetrics.attentionClaims":"15","FactClaimMetrics.documentMissingClaims":"4","FactClaimMetrics.readmisiClaims":"4","FactClaimMetrics.fragmentasiClaims":"3","FactClaimMetrics.needToCheckClaims":"4"},{"DimDate.date":"2026-03-02T00:00:00.000","FactClaimMetrics.totalClaims":"55","FactClaimMetrics.verifiedClaims":"45","FactClaimMetrics.notVerifiedClaims":"10","FactClaimMetrics.readyToSubmitClaims":"34","FactClaimMetrics.attentionClaims":"16","FactClaimMetrics.documentMissingClaims":"4","FactClaimMetrics.readmisiClaims":"5","FactClaimMetrics.fragmentasiClaims":"3","FactClaimMetrics.needToCheckClaims":"4"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/session/{session_id}/claims":{"post":{"tags":["Open API","Dashboard"],"summary":"Get claims for a specific session","description":"Retrieve the detailed list of claims associated with a specific session ID.\n    `FactClaimMetrics.claimReviewCategory` is nullable while a claim is transient.","operationId":"session_claims_api_v1_dashboard_session__session_id__claims_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":5,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Current claim detail rows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse_DashboardClaimDetailRow_"},"example":{"data":[{"FactClaimMetrics.claimId":"claim-abc-123","FactClaimMetrics.claimCode":"SEP-2026-001"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/date/{date_id}/claims":{"post":{"tags":["Open API","Dashboard"],"summary":"Get claims for a specific date","description":"Retrieve the detailed list of claims associated with a specific Date ID (YYYYMMDD).\n    `FactClaimMetrics.claimReviewCategory` is nullable while a claim is transient.","operationId":"date_claims_api_v1_dashboard_date__date_id__claims_post","parameters":[{"name":"date_id","in":"path","required":true,"schema":{"type":"string","title":"Date Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":5,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse_DashboardClaimDetailRow_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/month/{year}/{month}/claims":{"post":{"tags":["Open API","Dashboard"],"summary":"Get claims for a specific month","description":"Retrieve the detailed list of claims associated with a specific Year and Month.\n    `FactClaimMetrics.claimReviewCategory` is nullable while a claim is transient.","operationId":"month_claims_api_v1_dashboard_month__year___month__claims_post","parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"string","title":"Year"}},{"name":"month","in":"path","required":true,"schema":{"type":"string","title":"Month"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":5,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDataResponse_DashboardClaimDetailRow_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drugs/restriction/rules":{"post":{"tags":["Open API","Restriksi Obat"],"summary":"Look up FORNAS drug-restriction rules (sync translating proxy)","description":"Synchronous advice endpoint: brochure vocabulary in/out, validator (machine) vocabulary downstream. Stateless -- no Temporal, no file storage, no direct table access.","operationId":"get_rules_batch_api_v1_drugs_restriction_rules_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RulesLookupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drugs/restriction":{"post":{"tags":["Open API","Restriksi Obat"],"summary":"Submit prescriptions + supporting documents for FORNAS validation","description":"Async fire-and-forget submit, mirroring the Temporal drugs contract. Metadata carries the full clinical payload (patient_profile with a main diagnosis, rich current_prescriptions, optional history/supporting documents) plus one file_documents entry per uploaded file (document_type + date, paired by filename -- unpaired entries are rejected). Files are stored to the configured storage backend with per-file sha256. Creates the encounter row (status=processing) and returns 202 with the DB-backed encounter_id. Workflow hand-off is best-effort and gated.","operationId":"submit_restriction_api_v1_drugs_restriction_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_restriction_api_v1_drugs_restriction_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestrictionSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drugs/restriction/{encounter_id}/status":{"get":{"tags":["Open API","Restriksi Obat"],"summary":"Get encounter processing status (single-source: Encounter table)","operationId":"get_drugs_status_api_v1_drugs_restriction__encounter_id__status_get","parameters":[{"name":"encounter_id","in":"path","required":true,"schema":{"type":"string","title":"Encounter Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DrugsStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drugs/restriction/{encounter_id}/result":{"get":{"tags":["Open API","Restriksi Obat"],"summary":"Get validation result (status-first: DB if completed, Temporal if processing)","operationId":"get_drugs_result_api_v1_drugs_restriction__encounter_id__result_get","parameters":[{"name":"encounter_id","in":"path","required":true,"schema":{"type":"string","title":"Encounter Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DrugsResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/drugs/restriction/overlap-check":{"post":{"tags":["Open API","Restriksi Obat"],"summary":"Check 30-day prescription overlap (sync translating proxy)","description":"Synchronous advice endpoint: the client supplies today's prescription session plus the patient's recent history; the validator flags collisions inside the window. Brochure vocabulary in/out, machine vocabulary downstream. Stateless.","operationId":"validate_overlap_api_v1_drugs_restriction_overlap_check_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverlapCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/{claim_id}/icd-history":{"post":{"tags":["Open API","ICD History"],"summary":"Submit ICD change","description":"Submit a new ICD code change for a claim.\n\n    Creates a new versioned record in the ICD history audit trail.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:write`\n\n    **Request Body:**\n    - icd_inacbg: ICD codes for INA-CBG processing (optional)\n      - icd9_list: Array of ICD-9 codes\n      - icd10_list: Array of ICD-10 codes\n    - icd_idrg: ICD codes for IDRG processing (optional)\n      - icd9_list: Array of ICD-9 codes\n      - icd10_list: Array of ICD-10 codes\n    - feedback: Free-text reason for the change (optional, max 4000 characters)\n\n    **Example Request:**\n    ```json\n    {\n        \"icd_inacbg\": {\n            \"icd9_list\": [\"01.1\"],\n            \"icd10_list\": [\"A01.0\", \"B02.1\"]\n        },\n        \"icd_idrg\": {\n            \"icd9_list\": [\"02.2\"],\n            \"icd10_list\": [\"C03.0\"]\n        },\n        \"feedback\": \"koreksi dari koder RS\"\n    }\n    ```\n\n    **Note:** You can submit only `icd_inacbg`, only `icd_idrg`, or both.\n    A `feedback` value alone is not a submission and is rejected with 422.\n\n    **Note:** `origin` is recorded server-side as `human` for every submission made\n    through this endpoint. It cannot be set from the request body.\n\n    **Example Response:**\n    ```json\n    {\n        \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n        \"claim_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n        \"version\": 1,\n        \"icd_inacbg\": {\n            \"icd9_list\": [\"01.1\"],\n            \"icd10_list\": [\"A01.0\", \"B02.1\"]\n        },\n        \"icd_idrg\": null,\n        \"created_at\": \"2026-02-16T10:00:00Z\",\n        \"origin\": \"human\",\n        \"feedback\": \"koreksi dari koder RS\"\n    }\n    ```","operationId":"submit_icd_change_api_v1_claims__claim_id__icd_history_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IcdHistoryCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IcdHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Open API","ICD History"],"summary":"List ICD history","description":"List all ICD history records for a claim.\n\n    Returns all versions ordered by version number descending (most recent first).\n\n    Each item carries `origin` — who produced that version: `ai_initial`,\n    `ai_revalidate`, `human` or `unknown` (rows written before provenance tagging).\n    Treat the set as open: new values may be added. `feedback` is the reason recorded\n    with that version, if one was given.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    **Example Response:**\n    ```json\n    {\n        \"items\": [\n            {\n                \"id\": \"...\",\n                \"claim_id\": \"...\",\n                \"version\": 2,\n                \"icd_inacbg\": {\"icd9_list\": [\"01.1\"], \"icd10_list\": [\"A01.0\", \"B02.1\"]},\n                \"icd_idrg\": null,\n                \"created_at\": \"2026-02-16T11:00:00Z\"\n            },\n            {\n                \"id\": \"...\",\n                \"claim_id\": \"...\",\n                \"version\": 1,\n                \"icd_inacbg\": {\"icd9_list\": [\"01.1\"], \"icd10_list\": [\"A01.0\"]},\n                \"icd_idrg\": {\"icd9_list\": [\"02.2\"], \"icd10_list\": [\"C03.0\"]},\n                \"created_at\": \"2026-02-16T10:00:00Z\"\n            }\n        ],\n        \"total\": 2\n    }\n    ```","operationId":"list_icd_history_api_v1_claims__claim_id__icd_history_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IcdHistoryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/{claim_id}/icd-history/latest":{"get":{"tags":["Open API","ICD History"],"summary":"Get latest ICD history","description":"Get the latest (current) ICD history for a claim.\n\n    Returns the record with the highest version number.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    **Example Response:**\n    ```json\n    {\n        \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n        \"claim_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n        \"version\": 3,\n        \"icd_inacbg\": {\n            \"icd9_list\": [\"01.1\"],\n            \"icd10_list\": [\"A01.0\", \"B02.1\"]\n        },\n        \"icd_idrg\": {\n            \"icd9_list\": [],\n            \"icd10_list\": [\"C03.0\"]\n        },\n        \"created_at\": \"2026-02-16T12:00:00Z\"\n    }\n    ```","operationId":"get_latest_icd_history_api_v1_claims__claim_id__icd_history_latest_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IcdHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/{claim_id}/icd-history/{version}":{"get":{"tags":["Open API","ICD History"],"summary":"Get ICD history by version","description":"Get a specific version of ICD history for a claim.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    **Path Parameters:**\n    - claim_id: UUID of the claim\n    - version: Version number (integer)\n\n    **Example Response:**\n    ```json\n    {\n        \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n        \"claim_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n        \"version\": 1,\n        \"icd_inacbg\": {\n            \"icd9_list\": [\"01.1\"],\n            \"icd10_list\": [\"A01.0\", \"B02.1\"]\n        },\n        \"icd_idrg\": null,\n        \"created_at\": \"2026-02-16T10:00:00Z\"\n    }\n    ```","operationId":"get_icd_history_by_version_api_v1_claims__claim_id__icd_history__version__get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IcdHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/extract":{"post":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Submit Claim Extract","description":"Step 1: Document Extraction (OCR + Validation)\n\nTrigger OCR extraction and initial document completeness verification.\n\n**Supported file types:** PDF, PNG, JPEG, TIFF\n**Max file size:** 10MB per file\n\n**hospital_context format (optional JSON string):**\n```json\n{\n    \"regional\": 1,\n    \"jenis_rumah_sakit\": \"pemerintah\",\n    \"kelas_rumah_sakit\": \"a\",\n    \"nama_rumah_sakit_khusus\": null\n}\n```","operationId":"submit_claim_extract_api_v1_claims_extract_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_claim_extract_api_v1_claims_extract_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/extract/{claim_id}/status":{"get":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Get Extract Status","description":"Get the processing status of Step 1: Document Extraction.\n\nPoll this endpoint after submitting an extract request to check progress.","operationId":"get_extract_status_api_v1_claims_extract__claim_id__status_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/extract/{claim_id}/result":{"get":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Get Extract Result","description":"Get the result of Step 1: Document Extraction.\n\nReturns the full extraction output once processing is complete.","operationId":"get_extract_result_api_v1_claims_extract__claim_id__result_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/medical-grouper":{"post":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Submit Claim Medical Grouper","description":"Step 2: Medical Grouper (ICD + INA-CBG)\n\nTrigger ICD suggestion and INA-CBG tariff calculation based on extracted text.","operationId":"submit_claim_medical_grouper_api_v1_claims_medical_grouper_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimMedicalGrouperRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/medical-grouper/{claim_id}/status":{"get":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Get Medical Grouper Status","description":"Get the processing status of Step 2: Medical Grouper.\n\nPoll this endpoint after submitting a medical grouper request to check progress.","operationId":"get_medical_grouper_status_api_v1_claims_medical_grouper__claim_id__status_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/medical-grouper/{claim_id}/result":{"get":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Get Medical Grouper Result","description":"Get the result of Step 2: Medical Grouper.\n\nReturns the full medical grouper output (ICD codes, INA-CBG tariff) once processing is complete.","operationId":"get_medical_grouper_result_api_v1_claims_medical_grouper__claim_id__result_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/validate":{"post":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Submit Claim Validate","description":"Step 3: Final Claim Validation\n\nTrigger end-to-end business rule validation for the claim.","operationId":"submit_claim_validate_api_v1_claims_validate_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimValidationRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/validate/{claim_id}/status":{"get":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Get Validate Status","description":"Get the processing status of Step 3: Final Claim Validation.\n\nPoll this endpoint after submitting a validation request to check progress.","operationId":"get_validate_status_api_v1_claims_validate__claim_id__status_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/validate/{claim_id}/result":{"get":{"tags":["Open API","Modular Claim Processing Steps"],"summary":"Get Validate Result","description":"Get the result of Step 3: Final Claim Validation.\n\nReturns the full validation output once processing is complete.","operationId":"get_validate_result_api_v1_claims_validate__claim_id__result_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rules/search":{"get":{"tags":["Open API","Rules"],"summary":"Search validation rules","description":"Search and filter validation rules for the tenant.\n\n    **Use Case:** Retrieve validation rules to understand claim requirements or debug validation failures.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `rules:read`\n\n    **Search Parameters:**\n    - q: Search query (use \"*\" for all rules)\n    - scope: Rule scope - \"tenant\" (custom rules) or \"system\" (system rules)\n    - severity: Filter by severity - ERROR | WARNING | INFO\n    - status: Filter by status - ACTIVE | INACTIVE\n    - icd10: Filter rules applicable to specific ICD-10 diagnosis code\n    - icd9: Filter rules applicable to specific ICD-9 procedure code\n    - sex: Filter rules for specific patient gender (M/F)\n    - category: Filter by document category\n    - care_type: Filter by care type (Rawat Inap/Rawat Jalan)\n    - sort: Sort field (e.g., \"created_at\", \"-priority\")\n    - page: Page number (starting from 1)\n    - per_page: Results per page (max 100)\n\n    **Response Format:**\n    - rules: Array of validation rules\n      - rule_id: Unique rule identifier\n      - rule_code: Human-readable code\n      - rule_name: Display name\n      - description: Rule explanation\n      - severity: ERROR | WARNING | INFO\n      - status: ACTIVE | INACTIVE\n      - condition: Validation logic\n    - pagination: Page metadata (total, current_page, per_page)\n\n    **Use Cases:**\n    - List all active ERROR rules before submitting claims\n    - Search rules by ICD code to understand specific diagnosis requirements\n    - Debug validation failures by finding rule details\n\n    **Example Request:**\n    ```\n    GET /rules/search?q=*&scope=tenant&severity=ERROR&status=ACTIVE&page=1&per_page=20\n    ```\n\n    **Example Response:**\n    ```json\n    {\n        \"rules\": [\n            {\n                \"rule_id\": \"rule-uuid-123\",\n                \"rule_code\": \"R-001\",\n                \"rule_name\": \"Diagnosis Gender Match\",\n                \"description\": \"Pregnancy diagnosis must match female gender\",\n                \"severity\": \"ERROR\",\n                \"status\": \"ACTIVE\",\n                \"condition\": {\n                    \"if\": \"diagnosis.code starts with 'O'\",\n                    \"then\": \"patient.gender == 'F'\"\n                }\n            }\n        ],\n        \"pagination\": {\n            \"total\": 45,\n            \"page\": 1,\n            \"per_page\": 20,\n            \"total_pages\": 3\n        }\n    }\n    ```\n\n    **Integration Tips:**\n    - Cache rules locally to avoid repeated queries\n    - Use scope=tenant to see only custom rules\n    - Filter by icd10/icd9 to understand diagnosis-specific requirements\n    - Use status=ACTIVE to see only enforced rules","operationId":"search_rules_api_v1_rules_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query","default":"*","title":"Q"},"description":"Search query"},{"name":"scope","in":"query","required":false,"schema":{"type":"string","description":"Rule scope (tenant or system)","default":"tenant","title":"Scope"},"description":"Rule scope (tenant or system)"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity","title":"Severity"},"description":"Filter by severity"},{"name":"sex","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by patient gender","title":"Sex"},"description":"Filter by patient gender"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (ACTIVE/INACTIVE)","title":"Status"},"description":"Filter by status (ACTIVE/INACTIVE)"},{"name":"icd10","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ICD-10 code","title":"Icd10"},"description":"Filter by ICD-10 code"},{"name":"icd9","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ICD-9 code","title":"Icd9"},"description":"Filter by ICD-9 code"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by document category","title":"Category"},"description":"Filter by document category"},{"name":"care_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by care type","title":"Care Type"},"description":"Filter by care type"},{"name":"documents_to_validate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by documents to validate","title":"Documents To Validate"},"description":"Filter by documents to validate"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field","title":"Sort"},"description":"Sort field"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":20,"title":"Per Page"},"description":"Results per page"},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Rules retrieved successfully","content":{"application/json":{"schema":{},"example":{"rules":[{"rule_id":"rule-123","rule_code":"R-001","rule_name":"Sample Rule"}],"pagination":{"total":45,"page":1}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: claims:read"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rules/create":{"post":{"tags":["Open API","Rules"],"summary":"Create custom validation rule","description":"Create new tenant-specific validation rules for claim processing.\n\n    **Use Case:** Define custom business rules for your hospital's claim validation requirements.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `rules:write`\n\n    **Request Structure:**\n    List of rule objects to create.\n\n    **Rule Components:**\n    - requirement: What the rule checks (description)\n    - applicability: Logic defining when rule applies\n      - age_min/age_max: Patient age range\n      - sex: allowed gender (M/F/any)\n      - care_type: List of care types (e.g. [\"Rawat Inap\"])\n    - severity: ERROR | WARNING | INFO\n      - ERROR: Blocks claim submission\n      - WARNING: Shows warning but allows submission\n      - INFO: Informational message only\n    - category: Rule category (e.g., \"Administratif\")\n\n    **Example Request:**\n    ```json\n    {\n        \"rules\": [\n            {\n                \"requirement\": \"Patient age must be between 0 and 150 years\",\n                \"applicability\": {\n                    \"age_min\": 0,\n                    \"age_max\": 150,\n                    \"sex\": \"any\",\n                    \"care_type\": [\"Rawat Inap\", \"Rawat Jalan\"]\n                },\n                \"severity\": \"ERROR\",\n                \"category\": \"Administratif\"\n            }\n        ]\n    }\n    ```\n\n    **Example Response:**\n    ```json\n    {\n        \"created_rules\": [\n            {\n                \"rule_id\": \"rule-uuid-123\",\n                \"requirement\": \"Patient age must be between 0 and 150 years\",\n                \"status\": \"ACTIVE\"\n            }\n        ]\n    }\n    ```\n\n    **Common Errors:**\n    - 400: Invalid condition syntax\n    - 403: Insufficient permissions\n    - 500: Validator Service error","operationId":"create_rule_api_v1_rules_create_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRuleRequest"}}}},"responses":{"200":{"description":"Rule created successfully","content":{"application/json":{"schema":{},"example":{"created_rules":[{"rule_id":"rule-uuid-123","status":"ACTIVE"}]}}}},"400":{"description":"Invalid rule configuration","content":{"application/json":{"example":{"error":{"code":"VALIDATION_ERROR","message":"Invalid condition syntax or duplicate rule_code"}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: admin"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rules/modify-rules":{"post":{"tags":["Open API","Rules"],"summary":"Modify existing validation rule","description":"Update existing tenant-specific validation rules.\n\n    **Use Case:** Adjust rule logic, severity, or requirements based on operational feedback.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `rules:write`\n\n    **Request Structure:**\n    - scope: \"tenant\"\n    - rules: List of rules to modify (must include rule_id)\n\n    **Modifiable Fields:**\n    - requirement: Update description\n    - severity: Change severity level (ERROR/WARNING/INFO)\n    - applicability: Update logic\n    - category: Update category\n\n    **Example Request:**\n    ```json\n    {\n        \"scope\": \"tenant\",\n        \"rules\": [\n            {\n                \"rule_id\": \"rule-uuid-123\",\n                \"requirement\": \"Updated requirement text\",\n                \"severity\": \"WARNING\"\n            }\n        ]\n    }\n    ```\n\n    **Example Response:**\n    ```json\n    {\n        \"success\": True\n    }\n    ```","operationId":"modify_rule_api_v1_rules_modify_rules_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyRuleRequest"}}}},"responses":{"200":{"description":"Rule modified successfully","content":{"application/json":{"schema":{},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"example":{"error":{"code":"VALIDATION_ERROR","message":"Invalid rule_id or field values"}}}}},"404":{"description":"Rule not found","content":{"application/json":{"example":{"error":{"code":"NOT_FOUND","message":"Rule not found"}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: admin"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rules/activate-deactivate":{"post":{"tags":["Open API","Rules"],"summary":"Activate or deactivate validation rule","description":"Activate or deactivate validation rules.\n\n    **Use Case:** Temporarily disable rules during testing or enable rules after validation.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `rules:write`\n\n    **Request Structure:**\n    - scope: \"tenant\"\n    - activate_rules: List of {rule_id} to activate\n    - deactivate_rules: List of {rule_id} to deactivate\n\n    **Status Values:**\n    - ACTIVE: Rule is enforced on claim submissions\n    - INACTIVE: Rule is ignored (not enforced)\n\n    **Example Request:**\n    ```json\n    {\n        \"scope\": \"tenant\",\n        \"activate_rules\": [\n            {\"rule_id\": \"rule-uuid-123\"}\n        ],\n        \"deactivate_rules\": [\n            {\"rule_id\": \"rule-uuid-456\"}\n        ]\n    }\n    ```\n\n    **Example Response:**\n    ```json\n    {\n        \"activated_ids\": [\"rule-uuid-123\"],\n        \"deactivated_ids\": [\"rule-uuid-456\"]\n    }\n    ```","operationId":"activate_deactivate_rule_api_v1_rules_activate_deactivate_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateDeactivateRequest"}}}},"responses":{"200":{"description":"Rule status updated successfully","content":{"application/json":{"schema":{},"example":{"activated_ids":["rule-uuid-123"],"deactivated_ids":["rule-uuid-456"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"example":{"error":{"code":"VALIDATION_ERROR","message":"Invalid status value. Use ACTIVE or INACTIVE."}}}}},"404":{"description":"Rule not found","content":{"application/json":{"example":{"error":{"code":"NOT_FOUND","message":"Rule not found"}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: admin"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sandbox/reset":{"post":{"tags":["Open API","Sandbox"],"summary":"Reset sandbox state","description":"Clear all in-memory sandbox state (ICD history, SFTP sessions).","operationId":"reset_sandbox_api_v1_sandbox_reset_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reset Sandbox Api V1 Sandbox Reset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/sftp/submit":{"post":{"tags":["Open API","Claims SFTP Input Method"],"summary":"Submit claims via SFTP batch","description":"Trigger batch processing of claims uploaded via SFTP.\n\n    **Use Case:** High-volume processing (100+ claims) or legacy systems without HTTP multipart capability.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:write`\n\n    **Integration Pattern:**\n    1. Upload claim files to configured SFTP folder\n    2. Call this endpoint to trigger batch processing\n    3. Receive session_id for tracking\n    4. Poll /status/{session_id} for progress\n    5. Retrieve results from /result/{session_id} when complete\n\n    **Request Format:**\n    No request body required - automatically scans SFTP inbox folder based on tenant configuration.\n\n    **Response Format:**\n    - session_id: Unique batch session identifier for tracking\n    - batch_total: Total number of batches to process\n    - current_batch: Current batch being processed\n    - sep_in_batch: Number of claims in current batch\n    - status: PENDING | PROCESSING | COMPLETED | FAILED\n    - temporal_workflow_id: Internal workflow identifier\n\n    **Webhook Events:**\n    - batch.started: When batch processing begins\n    - batch.completed: When all claims in batch finish processing\n    - batch.failed: If batch processing encounters errors\n\n    **Cancellation:**\n    - Use Temporal **Cancel** (SDK `WorkflowHandle.cancel()` or the UI \"Cancel\" button) to stop a batch.\n      Finished claims stay in `success_claim_details`; unfinished claims are marked failed at their\n      latest step (`failed_at`, `retryable=true`, `reason=\"cancelled_at_<step>\"`, e.g.\n      `cancelled_at_medical_grouper`) and appear in `failed_claim_details`.\n      The DB is updated, `batch.failed` fires, and the next batch still runs.\n    - **Terminate** is not supported for clean compensation — it skips all cleanup and leaves claims stuck.\n\n    **Error Handling:**\n    - 400: Invalid SFTP configuration or no files found\n    - 401: Invalid API key\n    - 403: API key lacks claims:write scope\n    - 500: Server error - check SFTP connection\n\n    **Example Response:**\n    ```json\n    {\n        \"session_id\": \"sftp-session-20260122-001\",\n        \"batch_total\": 3,\n        \"current_batch\": 1,\n        \"sep_in_batch\": 10,\n        \"status\": \"PENDING\",\n        \"finished\": False,\n        \"claim_list\": [\n            {\"claim_id\": \"CLM-001\", \"files\": [\"claim.pdf\"]},\n            {\"claim_id\": \"CLM-002\", \"files\": [\"claim.pdf\", \"lab.pdf\"]}\n        ],\n        \"temporal_workflow_id\": \"wf-temporal-batch-123\"\n    }\n    ```\n\n    **Integration Tips:**\n    - Configure SFTP settings via Admin API before first use\n    - Batch size configurable (default 10 claims per batch)\n    - Use webhooks instead of polling for better performance\n    - Upload files during off-peak hours for optimal processing","operationId":"submit_claim_sftp_api_v1_claims_sftp_submit_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"202":{"description":"Batch processing initiated","content":{"application/json":{"schema":{},"example":{"success":true,"data":{"session_id":"sftp-session-20260122-001","batch_total":3,"current_batch":1,"sep_in_batch":10,"status":"PENDING","finished":false,"claim_list":[{"claim_id":"CLM-001","files":["claim.pdf"]}],"temporal_workflow_id":"wf-temporal-batch-123"}}}}},"400":{"description":"Bad request - SFTP not configured or no files found","content":{"application/json":{"example":{"error":{"code":"SFTP_NOT_CONFIGURED","message":"SFTP configuration not found for tenant"}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: claims:write"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/sftp/status/{session_id}":{"get":{"tags":["Open API","Claims SFTP Input Method"],"summary":"Get SFTP batch session status","description":"Get real-time processing status for an SFTP batch session.\n\n    **Use Case:** Track progress of bulk claim submissions uploaded via SFTP.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    **Integration Pattern:**\n    1. Upload files to SFTP folder\n    2. Call POST /claims/sftp/submit to trigger processing\n    3. Poll this endpoint for progress updates\n    4. Use returned session_id to track batch\n\n    **Response Fields:**\n    - batch_id (optional): Filter results for a specific batch\n    - session_id: Unique batch identifier\n    - status: PENDING | PROCESSING | COMPLETED | COMPLETED_WITH_ERRORS\n    - batch_total: Total number of batches\n    - current_batch: Currently processing batch number\n    - sep_in_batch: Number of claims in current batch\n    - finished: Boolean indicating if processing is complete\n    - temporal_workflow_id: Internal workflow tracking ID\n    - claim_list: Array of claims with their processing status\n\n    **Polling Strategy:**\n    - Poll every 10-30 seconds while status is PROCESSING\n    - Stop polling when status is COMPLETED or FAILED\n    - Alternative: Configure webhooks to avoid polling\n\n    **Webhook Alternative:**\n    Configure webhook to receive batch.completed event automatically.\n\n    **Example Response:**\n    ```json\n    {\n        \"session_id\": \"sftp-session-20260122-001\",\n        \"status\": \"PROCESSING\",\n        \"batch_total\": 3,\n        \"current_batch\": 2,\n        \"sep_in_batch\": 10,\n        \"finished\": False,\n        \"temporal_workflow_id\": \"wf-temporal-batch-123\",\n        \"claim_list\": [\n            {\n                \"claim_id\": \"CLM-001\",\n                \"status\": \"COMPLETED\",\n                \"files\": [\"claim.pdf\"]\n            },\n            {\n                \"claim_id\": \"CLM-002\",\n                \"status\": \"PROCESSING\",\n                \"files\": [\"claim.pdf\", \"lab.pdf\"]\n            }\n        ]\n    }\n    ```\n\n    **Error Responses:**\n    - 401: Invalid API key\n    - 403: API key lacks claims:read scope\n    - 404: Session ID not found\n    - 500: Server error retrieving status\n\n    **Integration Tips:**\n    - Use exponential backoff for polling (10s, 20s, 30s)\n    - Cache session_id for correlation with your system\n    - Configure webhooks to eliminate polling overhead","operationId":"get_sftp_session_status_api_v1_claims_sftp_status__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"integer","description":"Optional batch ID to filter results for a specific batch","title":"Batch Id"},"description":"Optional batch ID to filter results for a specific batch"},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Session status retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpSessionStatusResponse"},"example":{"session_id":"sftp-session-20260122-001","status":"PROCESSING","batch_total":3,"current_batch":2,"finished":false}}}},"404":{"description":"Session not found","content":{"application/json":{"example":{"error":{"code":"NOT_FOUND","message":"SFTP session not found"}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: claims:read"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/sftp/result/{session_id}":{"get":{"tags":["Open API","Claims SFTP Input Method"],"summary":"Get SFTP batch session final results (paginated)","description":"Get paginated results for a finished SFTP batch session.\n\n    **Use Case:** Retrieve final outcomes for all claims in batch after processing completes.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:read`\n\n    **Pagination:**\n    - page: Page number (default: 1, min: 1)\n    - limit: Items per page (default: 10, min: 1, max: 100)\n\n    **When to Call:**\n    - After status endpoint returns status: \"COMPLETED\" or \"FAILED\"\n    - For batch reconciliation and audit trails\n    - To retrieve detailed results for each claim in the batch\n    - Optionally filter by batch_id to get results for a specific batch\n\n    **Response Structure:**\n    - session_id: Batch identifier\n    - status: Final status (COMPLETED or FAILED)\n    - pagination: Pagination metadata\n      - page: Current page number\n      - limit: Items per page\n      - total: Total number of results\n      - total_pages: Total number of pages\n    - results: Array of individual claim results\n      - claim_id: Unique claim identifier\n      - external_claim_id: Your reference ID (if provided)\n      - status: COMPLETED | FAILED | AWAITING_INFO\n      - result: Processing outcomes (OCR, coding, validation)\n\n    **Webhook Alternative:**\n    Configure webhook to receive batch.completed event with results automatically.\n\n    **Example Response:**\n    ```json\n    {\n        \"session_id\": \"sftp-session-20260122-001\",\n        \"status\": \"COMPLETED\",\n        \"pagination\": {\n            \"page\": 1,\n            \"limit\": 10,\n            \"total\": 15,\n            \"total_pages\": 2\n        },\n        \"results\": [\n            {\n                \"claim_id\": \"CLM-001\",\n                \"external_claim_id\": \"HOSP-2026-001\",\n                \"status\": \"COMPLETED\",\n                \"result\": {\n                    \"patient\": {\"nama\": \"John Doe\"},\n                    \"diagnosis\": {\"primary_code\": \"A09\"},\n                    \"total_charges\": 5000000,\n                    \"validation_status\": \"PASSED\"\n                }\n            }\n        ]\n    }\n    ```\n\n    **Error Responses:**\n    - 400: Session still processing - call /status first\n    - 401: Invalid API key\n    - 403: API key lacks claims:read scope\n    - 404: Session ID not found\n    - 500: Server error retrieving results\n\n    **Integration Tips:**\n    - Only call when status is COMPLETED or FAILED\n    - Store results locally for audit and reconciliation\n    - Use external_claim_id to correlate with your SIMRS\n    - Process errors array for failed claims to retry submission\n    - Results are retained for 30 days","operationId":"get_sftp_session_result_api_v1_claims_sftp_result__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100)","default":10,"title":"Limit"},"description":"Items per page (max 100)"},{"name":"batch_id","in":"query","required":false,"schema":{"type":"integer","description":"Optional batch ID to filter results for a specific batch","title":"Batch Id"},"description":"Optional batch ID to filter results for a specific batch"},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Batch results retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSftpSessionResultResponse"},"example":{"session_id":"sftp-session-20260122-001","status":"COMPLETED","pagination":{"page":1,"limit":10,"total":15,"total_pages":2},"results":[]}}}},"400":{"description":"Session still processing","content":{"application/json":{"example":{"error":{"code":"PROCESSING_NOT_COMPLETE","message":"Batch is still processing. Check /status endpoint first."}}}}},"404":{"description":"Session not found","content":{"application/json":{"example":{"error":{"code":"NOT_FOUND","message":"SFTP session not found"}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: claims:read"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/text/submit":{"post":{"tags":["Open API","Claims Text Input Method"],"summary":"Submit claim with pre-extracted text","description":"Submit a medical claim with pre-extracted text documents.\n\n    **Use Case:** Systems with existing OCR/digitization that have already extracted text from documents.\n\n    **Authentication:** API Key (X-API-Key header)\n    **Required Scope:** `claims:write`\n\n    **Integration Pattern:**\n    1. SIMRS performs OCR on medical documents\n    2. Extract text from resume medis, lab results, etc.\n    3. POST text data to this endpoint\n    4. Skip OCR processing step for faster results\n    5. Track progress via /claims/upload/status/{claim_id}\n    6. Retrieve results via /claims/upload/result/{claim_id}\n\n    **When to Use This Method:**\n    - You already have OCR capability in your SIMRS\n    - Documents are in text format (not scanned images)\n    - You want faster processing by skipping OCR step\n    - You're migrating from legacy system with text data\n\n    **vs. File Upload Method:**\n    - File Upload: Send PDF/images, ClaimMind performs OCR\n    - Text Method: Send extracted text, ClaimMind skips OCR\n    - Text method is faster but requires OCR on your end\n\n    **Request Format:**\n    - external_claim_id: Your reference ID for correlation\n    - payer_id: Payer identifier (default: \"bpjs\")\n    - documents: Array of text documents\n      - doc_type: Document type (resume_medis, lab_result, etc.)\n      - raw_text: Extracted text content\n    - patient: Optional patient info (if known)\n    - admission: Optional admission info (if known)\n    - diagnosis: Optional diagnosis info (if known)\n\n    **Supported Document Types:**\n    - resume_medis: Medical resume/summary\n    - lab_result: Laboratory test results\n    - radiologi: Radiology reports\n    - resep: Prescription/medication\n    - billing: Billing information\n\n    **Response Format:**\n    - claim_id: Internal tracking ID\n    - external_claim_id: Your reference ID\n    - workflow_id: Temporal workflow ID\n    - status: PROCESSING | QUEUED\n    - status_url: URL to check claim status\n\n    **Webhook Events:**\n    - claim.submitted: When claim is accepted\n    - claim.completed: When processing finishes\n    - claim.failed: If processing fails\n\n    **Example Request:**\n    ```json\n    {\n        \"external_claim_id\": \"CLM-2026-001\",\n        \"payer_id\": \"bpjs\",\n        \"documents\": [\n            {\n                \"doc_type\": \"resume_medis\",\n                \"raw_text\": \"Patient: John Doe, Age: 41\\nDiagnosis: A09 - Gastroenteritis\\nTreatment: IV fluids, antiemetics\\nDischarged: 2026-01-20\"\n            },\n            {\n                \"doc_type\": \"lab_result\",\n                \"raw_text\": \"WBC: 12000/uL\\nHemoglobin: 13.5 g/dL\\nPlatelets: 250000/uL\"\n            }\n        ],\n        \"patient\": {\n            \"nama\": \"John Doe\",\n            \"rekam_medis\": \"RM001234\"\n        },\n        \"admission\": {\n            \"jenis_pasien\": \"Rawat Inap\",\n            \"kelas_rawat\": 2\n        }\n    }\n    ```\n\n    **Example Response:**\n    ```json\n    {\n        \"claim_id\": \"clm-abc-123-xyz\",\n        \"external_claim_id\": \"CLM-2026-001\",\n        \"workflow_id\": \"wf-temporal-456\",\n        \"status\": \"PROCESSING\",\n        \"status_url\": \"/api/v1/claims/upload/status/clm-abc-123-xyz\",\n        \"submitted_at\": \"2026-01-22T10:30:00Z\"\n    }\n    ```\n\n    **Error Handling:**\n    - 400: Invalid request format or empty documents\n    - 401: Invalid API key\n    - 403: API key lacks claims:write scope\n    - 429: Rate limit exceeded\n    - 500: Server error - retry with exponential backoff\n\n    **Integration Tips:**\n    - Use external_claim_id to correlate with your SIMRS claim ID\n    - Preserve original text formatting (newlines, spacing) for best results\n    - Include at least resume_medis document type\n    - Pre-populate patient/admission fields if available\n    - Configure webhooks to avoid status polling\n    - Text method processes 30-50% faster than file upload","operationId":"submit_claim_text_api_v1_claims_text_submit_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimTextRequest"}}}},"responses":{"202":{"description":"Claim accepted for processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSubmitResponse"},"example":{"claim_id":"clm-abc-123-xyz","external_claim_id":"CLM-2026-001","status":"PROCESSING"}}}},"400":{"description":"Invalid request","content":{"application/json":{"example":{"error":{"code":"VALIDATION_ERROR","message":"At least one document is required","details":[{"field":"documents","message":"Cannot be empty"}]}}}}},"401":{"description":"Authentication failed","content":{"application/json":{"example":{"error":{"code":"UNAUTHORIZED","message":"Invalid or missing API key"}}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"example":{"error":{"code":"FORBIDDEN","message":"API key lacks required scope: claims:write"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/upload/submit":{"post":{"tags":["Open API","Claims Upload File Input Method"],"summary":"Submit Claim Upload","description":"Submit a new claim with file uploads.\n\nUpload medical documents directly as files. The service will:\n- Validate file types and sizes\n- Store files in the configured storage backend (GCS or local)\n- Trigger the medical claim orchestrator workflow\n\n**Metadata format (optional JSON string):**\n```json\n{\n    \"external_claim_id\": \"CLM-001\",\n    \"payer_id\": \"bpjs\",\n    \"patient\": {\"nama\": \"...\", \"rekam_medis\": \"...\"},\n    \"admission\": {\"jenis_pasien\": \"Rawat Inap\", \"kelas_rawat\": 1},\n    \"diagnosis\": {\"diagnosa_utama\": \"...\"}\n}\n```\n\n**Supported file types:** PDF, PNG, JPEG, TIFF\n**Max file size:** 10MB per file\n\n**Required scope:** `claims:write`","operationId":"submit_claim_upload_api_v1_claims_upload_submit_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_claim_upload_api_v1_claims_upload_submit_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/upload/status/{claim_id}":{"get":{"tags":["Open API","Claims Upload File Input Method"],"summary":"Get Claim Status","description":"Get claim processing status.\n\nReturns the current processing status, workflow progress, and step-by-step results.\n\n**Required scope:** `claims:read`","operationId":"get_claim_status_api_v1_claims_upload_status__claim_id__get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/claims/upload/result/{claim_id}":{"get":{"tags":["Open API","Claims Upload File Input Method"],"summary":"Get Claim Result","description":"Get claim processing result.\n\nReturns the complete processing result including:\n- Document validation results\n- Medical coding (ICD-10, INA-CBG)\n- Claim validation results\n\n**Required scope:** `claims:read`","operationId":"get_claim_result_api_v1_claims_upload_result__claim_id__get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/soap/analysis":{"post":{"tags":["Open API","SOAP Validation"],"summary":"Submit a Concurrent SOAP / CPPT entry for analysis (async)","description":"Submit through the mode-selected SOAP service, returning an awaited acknowledgement. The body is discriminated by cppt_types ('SO' or 'AP'). Both variants require subjective and objective; AP also requires assessment and plan, while SO may include assessment and plan optionally. Invalid bodies are rejected at the boundary with 422 before this handler runs. The service returns an analysis_id, workflow_id, status, and poll URL in the existing response shape. Returns 202 with the analysis_id and a poll_url.","operationId":"submit_analysis_api_v3_soap_analysis_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoapAnalysisAcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$defs":{"CurrentAP":{"additionalProperties":false,"properties":{"subjective":{"minLength":1,"title":"Subjective","type":"string"},"objective":{"minLength":1,"title":"Objective","type":"string"},"assessment":{"minLength":1,"title":"Assessment","type":"string"},"plan":{"minLength":1,"title":"Plan","type":"string"}},"required":["subjective","objective","assessment","plan"],"title":"CurrentAP","type":"object"},"CurrentSO":{"additionalProperties":false,"properties":{"subjective":{"minLength":1,"title":"Subjective","type":"string"},"objective":{"minLength":1,"title":"Objective","type":"string"},"assessment":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"title":"Assessment"},"plan":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"title":"Plan"}},"required":["subjective","objective"],"title":"CurrentSO","type":"object"},"HistoryEntry":{"additionalProperties":false,"properties":{"submitted_by":{"enum":["doctor","nurse"],"title":"Submitted By","type":"string"},"timestamp":{"description":"Client-local event time in YYYY-MM-DD HH:MM:SS format, without a timezone offset.","format":"date-time","title":"Timestamp","type":"string"},"content":{"items":{"$ref":"#/$defs/Section"},"title":"Content","type":"array"}},"required":["submitted_by","timestamp","content"],"title":"HistoryEntry","type":"object"},"PatientBlock":{"additionalProperties":false,"properties":{"nomor_rekam_medis":{"description":"Raw medical record number.","minLength":1,"title":"Nomor Rekam Medis","type":"string"},"jenis_perawatan":{"enum":["Rawat Inap","Rawat Jalan"],"title":"Jenis Perawatan","type":"string"},"tanggal_masuk":{"format":"date","title":"Tanggal Masuk","type":"string"},"jenis_kelamin":{"enum":["M","F","L","P"],"title":"Jenis Kelamin","type":"string"},"umur":{"minimum":0,"title":"Umur","type":"integer"},"dpjp":{"description":"Full doctor name with DPJP specialty title, for example dr. Anonim Sp.Jp or dr. Contoh Sp.Pd.","minLength":1,"title":"Dpjp","type":"string"},"poli":{"description":"Clinic or polyclinic name, for example Penyakit Dalam, Ibu dan Anak, or Jantung.","minLength":1,"title":"Poli","type":"string"},"kelas_rawat":{"enum":[0,1,2,3],"title":"Kelas Rawat","type":"integer"}},"required":["nomor_rekam_medis","jenis_perawatan","tanggal_masuk","jenis_kelamin","umur","dpjp","poli","kelas_rawat"],"title":"PatientBlock","type":"object"},"RequestAP":{"additionalProperties":false,"properties":{"cppt_types":{"const":"AP","description":"CPPT type: SO (Subjective/Objective) or AP (Assessment/Plan).","title":"Cppt Types","type":"string"},"sep":{"description":"Raw SEP number from the hospital information system.","minLength":1,"title":"Sep","type":"string"},"patient":{"$ref":"#/$defs/PatientBlock"},"soap":{"$ref":"#/$defs/SoapAP"},"documents":{"items":{"discriminator":{"mapping":{"pdf":"#/$defs/SoapPdfDocument","text":"#/$defs/SoapTextDocument"},"propertyName":"kind"},"oneOf":[{"$ref":"#/$defs/SoapTextDocument"},{"$ref":"#/$defs/SoapPdfDocument"}]},"title":"Documents","type":"array"}},"required":["cppt_types","sep","patient","soap","documents"],"title":"RequestAP","type":"object"},"RequestSO":{"additionalProperties":false,"properties":{"cppt_types":{"const":"SO","description":"CPPT type: SO (Subjective/Objective) or AP (Assessment/Plan).","title":"Cppt Types","type":"string"},"sep":{"description":"Raw SEP number from the hospital information system.","minLength":1,"title":"Sep","type":"string"},"patient":{"$ref":"#/$defs/PatientBlock"},"soap":{"$ref":"#/$defs/SoapSO"},"documents":{"items":{"discriminator":{"mapping":{"pdf":"#/$defs/SoapPdfDocument","text":"#/$defs/SoapTextDocument"},"propertyName":"kind"},"oneOf":[{"$ref":"#/$defs/SoapTextDocument"},{"$ref":"#/$defs/SoapPdfDocument"}]},"title":"Documents","type":"array"}},"required":["cppt_types","sep","patient","soap","documents"],"title":"RequestSO","type":"object"},"Section":{"additionalProperties":false,"properties":{"type":{"enum":["subjective","objective","assessment","plan"],"title":"Type","type":"string"},"value":{"title":"Value","type":"string"}},"required":["type","value"],"title":"Section","type":"object"},"SoapAP":{"additionalProperties":false,"properties":{"current":{"$ref":"#/$defs/CurrentAP"},"history":{"anyOf":[{"items":{"$ref":"#/$defs/HistoryEntry"},"type":"array"},{"type":"null"}],"title":"History"}},"required":["current","history"],"title":"SoapAP","type":"object"},"SoapPdfDocument":{"additionalProperties":false,"properties":{"kind":{"const":"pdf","default":"pdf","title":"Kind","type":"string"},"filename":{"minLength":1,"title":"Filename","type":"string"},"document_type":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"description":"Optional caller hint from the mapping; accepts other strings and is not the final PDF classification.","title":"Document Type"},"document_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"title":"Document Date"}},"required":["filename"],"title":"SoapPdfDocument","type":"object"},"SoapSO":{"additionalProperties":false,"properties":{"current":{"$ref":"#/$defs/CurrentSO"},"history":{"anyOf":[{"items":{"$ref":"#/$defs/HistoryEntry"},"type":"array"},{"type":"null"}],"title":"History"}},"required":["current","history"],"title":"SoapSO","type":"object"},"SoapTextDocument":{"additionalProperties":false,"properties":{"kind":{"const":"text","default":"text","title":"Kind","type":"string"},"filename":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"description":"Optional label; text is carried in content.","title":"Filename"},"document_type":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"description":"Suggested document type from the mapping; accepts other strings.","title":"Document Type"},"content":{"minLength":1,"title":"Content","type":"string"},"document_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"title":"Document Date"}},"required":["content"],"title":"SoapTextDocument","type":"object"}},"discriminator":{"mapping":{"AP":"#/$defs/RequestAP","SO":"#/$defs/RequestSO"},"propertyName":"cppt_types"},"oneOf":[{"$ref":"#/$defs/RequestSO"},{"$ref":"#/$defs/RequestAP"}]}},"multipart/form-data":{"schema":{"type":"object","required":["metadata"],"properties":{"metadata":{"type":"string","description":"JSON-serialized SoapAnalysisRequest","contentMediaType":"application/json","contentSchema":{"$defs":{"CurrentAP":{"additionalProperties":false,"properties":{"subjective":{"minLength":1,"title":"Subjective","type":"string"},"objective":{"minLength":1,"title":"Objective","type":"string"},"assessment":{"minLength":1,"title":"Assessment","type":"string"},"plan":{"minLength":1,"title":"Plan","type":"string"}},"required":["subjective","objective","assessment","plan"],"title":"CurrentAP","type":"object"},"CurrentSO":{"additionalProperties":false,"properties":{"subjective":{"minLength":1,"title":"Subjective","type":"string"},"objective":{"minLength":1,"title":"Objective","type":"string"},"assessment":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"title":"Assessment"},"plan":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"title":"Plan"}},"required":["subjective","objective"],"title":"CurrentSO","type":"object"},"HistoryEntry":{"additionalProperties":false,"properties":{"submitted_by":{"enum":["doctor","nurse"],"title":"Submitted By","type":"string"},"timestamp":{"description":"Client-local event time in YYYY-MM-DD HH:MM:SS format, without a timezone offset.","format":"date-time","title":"Timestamp","type":"string"},"content":{"items":{"$ref":"#/$defs/Section"},"title":"Content","type":"array"}},"required":["submitted_by","timestamp","content"],"title":"HistoryEntry","type":"object"},"PatientBlock":{"additionalProperties":false,"properties":{"nomor_rekam_medis":{"description":"Raw medical record number.","minLength":1,"title":"Nomor Rekam Medis","type":"string"},"jenis_perawatan":{"enum":["Rawat Inap","Rawat Jalan"],"title":"Jenis Perawatan","type":"string"},"tanggal_masuk":{"format":"date","title":"Tanggal Masuk","type":"string"},"jenis_kelamin":{"enum":["M","F","L","P"],"title":"Jenis Kelamin","type":"string"},"umur":{"minimum":0,"title":"Umur","type":"integer"},"dpjp":{"description":"Full doctor name with DPJP specialty title, for example dr. Anonim Sp.Jp or dr. Contoh Sp.Pd.","minLength":1,"title":"Dpjp","type":"string"},"poli":{"description":"Clinic or polyclinic name, for example Penyakit Dalam, Ibu dan Anak, or Jantung.","minLength":1,"title":"Poli","type":"string"},"kelas_rawat":{"enum":[0,1,2,3],"title":"Kelas Rawat","type":"integer"}},"required":["nomor_rekam_medis","jenis_perawatan","tanggal_masuk","jenis_kelamin","umur","dpjp","poli","kelas_rawat"],"title":"PatientBlock","type":"object"},"RequestAP":{"additionalProperties":false,"properties":{"cppt_types":{"const":"AP","description":"CPPT type: SO (Subjective/Objective) or AP (Assessment/Plan).","title":"Cppt Types","type":"string"},"sep":{"description":"Raw SEP number from the hospital information system.","minLength":1,"title":"Sep","type":"string"},"patient":{"$ref":"#/$defs/PatientBlock"},"soap":{"$ref":"#/$defs/SoapAP"},"documents":{"items":{"discriminator":{"mapping":{"pdf":"#/$defs/SoapPdfDocument","text":"#/$defs/SoapTextDocument"},"propertyName":"kind"},"oneOf":[{"$ref":"#/$defs/SoapTextDocument"},{"$ref":"#/$defs/SoapPdfDocument"}]},"title":"Documents","type":"array"}},"required":["cppt_types","sep","patient","soap","documents"],"title":"RequestAP","type":"object"},"RequestSO":{"additionalProperties":false,"properties":{"cppt_types":{"const":"SO","description":"CPPT type: SO (Subjective/Objective) or AP (Assessment/Plan).","title":"Cppt Types","type":"string"},"sep":{"description":"Raw SEP number from the hospital information system.","minLength":1,"title":"Sep","type":"string"},"patient":{"$ref":"#/$defs/PatientBlock"},"soap":{"$ref":"#/$defs/SoapSO"},"documents":{"items":{"discriminator":{"mapping":{"pdf":"#/$defs/SoapPdfDocument","text":"#/$defs/SoapTextDocument"},"propertyName":"kind"},"oneOf":[{"$ref":"#/$defs/SoapTextDocument"},{"$ref":"#/$defs/SoapPdfDocument"}]},"title":"Documents","type":"array"}},"required":["cppt_types","sep","patient","soap","documents"],"title":"RequestSO","type":"object"},"Section":{"additionalProperties":false,"properties":{"type":{"enum":["subjective","objective","assessment","plan"],"title":"Type","type":"string"},"value":{"title":"Value","type":"string"}},"required":["type","value"],"title":"Section","type":"object"},"SoapAP":{"additionalProperties":false,"properties":{"current":{"$ref":"#/$defs/CurrentAP"},"history":{"anyOf":[{"items":{"$ref":"#/$defs/HistoryEntry"},"type":"array"},{"type":"null"}],"title":"History"}},"required":["current","history"],"title":"SoapAP","type":"object"},"SoapPdfDocument":{"additionalProperties":false,"properties":{"kind":{"const":"pdf","default":"pdf","title":"Kind","type":"string"},"filename":{"minLength":1,"title":"Filename","type":"string"},"document_type":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"description":"Optional caller hint from the mapping; accepts other strings and is not the final PDF classification.","title":"Document Type"},"document_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"title":"Document Date"}},"required":["filename"],"title":"SoapPdfDocument","type":"object"},"SoapSO":{"additionalProperties":false,"properties":{"current":{"$ref":"#/$defs/CurrentSO"},"history":{"anyOf":[{"items":{"$ref":"#/$defs/HistoryEntry"},"type":"array"},{"type":"null"}],"title":"History"}},"required":["current","history"],"title":"SoapSO","type":"object"},"SoapTextDocument":{"additionalProperties":false,"properties":{"kind":{"const":"text","default":"text","title":"Kind","type":"string"},"filename":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"description":"Optional label; text is carried in content.","title":"Filename"},"document_type":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}],"description":"Suggested document type from the mapping; accepts other strings.","title":"Document Type"},"content":{"minLength":1,"title":"Content","type":"string"},"document_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"title":"Document Date"}},"required":["content"],"title":"SoapTextDocument","type":"object"}},"discriminator":{"mapping":{"AP":"#/$defs/RequestAP","SO":"#/$defs/RequestSO"},"propertyName":"cppt_types"},"oneOf":[{"$ref":"#/$defs/RequestSO"},{"$ref":"#/$defs/RequestAP"}]}},"files":{"type":"array","description":"Repeat this field for each uploaded PDF","items":{"type":"string","format":"binary"}}}}}}}}},"/api/v3/soap/analysis/{analysis_id}":{"get":{"tags":["Open API","SOAP Validation"],"summary":"Poll a SOAP analysis (status: processing | completed | failed)","operationId":"get_analysis_api_v3_soap_analysis__analysis_id__get","parameters":[{"name":"analysis_id","in":"path","required":true,"schema":{"type":"string","title":"Analysis Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoapAnalysisPollResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/soap/claims/{claim_id}/verdicts":{"get":{"tags":["Open API","SOAP Validation"],"summary":"Current per-rule verdict state for a claim episode","description":"Read-only and tenant-scoped in production: returns the current verdict state for every analysis under the claim. This operation is not available in sandbox mode. An unknown claim yields an empty verdict list, not a 404.","operationId":"get_claim_verdicts_api_v3_soap_claims__claim_id__verdicts_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Claim Verdicts Api V3 Soap Claims  Claim Id  Verdicts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/soap/selections":{"post":{"tags":["Open API","SOAP Validation"],"summary":"Record physician code selections (sync, best-effort; production only)","description":"Synchronous, best-effort capture -- never routed through Temporal in production. This operation is not available in sandbox mode. The service swallows any bookkeeping failure into {accepted: false} so a physician mid-encounter is never blocked; a successful capture returns {accepted: true, analysis_id, recorded}.","operationId":"record_selections_api_v3_soap_selections_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoapSelectionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Record Selections Api V3 Soap Selections Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v3/claims/upload/submit":{"post":{"tags":["Open API","Claims Upload File Input Method"],"summary":"Submit Claim Upload","description":"Submit a new claim with file uploads, Word included.\n\nSame contract as `POST /api/v1/claims/upload/submit`. Word files (`.doc`, `.docx`)\nare converted to PDF and stored as `<name>.docx.pdf` / `<name>.doc.pdf`.\n\n**Supported file types:** PDF, PNG, JPEG, TIFF, Word (.doc, .docx)\n**Max file size:** 10MB per file; Word files have no size limit\n\n**Errors:** `422 INVALID_FILE` (a Word file is corrupt or password-protected),\n`503 CONVERTER_UNAVAILABLE` (retry later). Nothing is stored on either.\n\n**Required scope:** `claims:write`","operationId":"submit_claim_upload_api_v3_claims_upload_submit_post","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_claim_upload_api_v3_claims_upload_submit_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint - API information.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/healthcheck":{"get":{"summary":"Healthcheck","description":"Health check endpoint.","operationId":"healthcheck_healthcheck_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"APIKeyCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Human-readable name for the API key"},"scopes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Scopes","description":"List of permission scopes"}},"type":"object","required":["name","scopes"],"title":"APIKeyCreate","description":"Request schema for creating a new API key."},"APIKeyCreatedResponse":{"properties":{"id":{"type":"integer","title":"Id"},"description":{"type":"string","title":"Description"},"key":{"type":"string","title":"Key","description":"Full API key (only shown once)"},"key_identifier":{"type":"string","title":"Key Identifier"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"status":{"type":"string","title":"Status"},"organization_id":{"type":"string","title":"Organization Id"},"is_org_key":{"type":"boolean","title":"Is Org Key"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","description","key","key_identifier","scopes","status","organization_id","is_org_key","created_at"],"title":"APIKeyCreatedResponse","description":"Response schema when a new API key is created (includes full key)."},"APIKeyResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier for the API key"},"description":{"type":"string","title":"Description","description":"Name of the API key"},"key_identifier":{"type":"string","title":"Key Identifier","description":"Display identifier: sk-cm-abc..xyz"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"Permission scopes assigned to this key"},"status":{"type":"string","title":"Status","description":"Key status: ENABLED or DISABLED"},"organization_id":{"type":"string","title":"Organization Id","description":"Organization this key belongs to"},"is_org_key":{"type":"boolean","title":"Is Org Key","description":"True if organization-level key"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the key was created"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"When the key was last updated"}},"type":"object","required":["id","description","key_identifier","scopes","status","organization_id","is_org_key","created_at"],"title":"APIKeyResponse","description":"Response schema for API key information."},"APIKeyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"New name for the key"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Scopes","description":"Updated scopes"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Status: ENABLED or DISABLED"}},"type":"object","title":"APIKeyUpdate","description":"Request schema for updating an API key."},"APIKeyValidateRequest":{"properties":{"api_key":{"type":"string","title":"Api Key","description":"API key to validate"}},"type":"object","required":["api_key"],"title":"APIKeyValidateRequest","description":"Request schema for validating an API key."},"APIKeyValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid","description":"Whether the API key is valid"},"key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Key Id","description":"Key ID if valid"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Organization ID if valid"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Scopes if valid"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Key status if valid"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Error message if invalid"}},"type":"object","required":["valid"],"title":"APIKeyValidateResponse","description":"Response schema for API key validation."},"ActivateDeactivateRequest":{"properties":{"scope":{"$ref":"#/components/schemas/Scope"},"activate_rules":{"anyOf":[{"items":{"$ref":"#/components/schemas/RuleActionItem"},"type":"array"},{"type":"null"}],"title":"Activate Rules"},"deactivate_rules":{"anyOf":[{"items":{"$ref":"#/components/schemas/RuleActionItem"},"type":"array"},{"type":"null"}],"title":"Deactivate Rules"}},"type":"object","required":["scope"],"title":"ActivateDeactivateRequest","description":"Request schema for activate/deactivate rules."},"ActivationStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"ActivationStatus","description":"Activation status enum."},"AdmissionInfo":{"properties":{"tanggal_masuk":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Tanggal Masuk"},"tanggal_keluar":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Tanggal Keluar"},"jenis_pasien":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jenis Pasien"},"kelas_rawat":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kelas Rawat"},"dpjp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dpjp"}},"type":"object","title":"AdmissionInfo","description":"Patient admission information.","examples":[{"dpjp":"Dr. Jane Smith, Sp.PD","jenis_pasien":"Rawat Inap","kelas_rawat":2,"tanggal_keluar":"2026-01-20","tanggal_masuk":"2026-01-15"}]},"Applicability":{"properties":{"icd10_any":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Icd10 Any"},"icd9_any":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Icd9 Any"},"age_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Min","default":0},"age_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Max","default":150},"sex":{"anyOf":[{"$ref":"#/components/schemas/Sex"},{"type":"null"}],"default":"any"},"care_type":{"anyOf":[{"items":{"$ref":"#/components/schemas/CareType"},"type":"array"},{"type":"null"}],"title":"Care Type"}},"type":"object","title":"Applicability","description":"Rule applicability criteria."},"Body_submit_claim_extract_api_v1_claims_extract_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files","description":"Medical documents (PDF, PNG, JPEG, TIFF)"},"claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Id","description":"Existing claim ID to reuse"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id","description":"Your own claim reference ID"},"hospital_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hospital Context","description":"Optional JSON string with hospital context"}},"type":"object","required":["files"],"title":"Body_submit_claim_extract_api_v1_claims_extract_post"},"Body_submit_claim_upload_api_v1_claims_upload_submit_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files","description":"Medical documents (PDF, PNG, JPEG, TIFF)"},"metadata":{"type":"string","title":"Metadata","description":"Optional JSON string of claim metadata"}},"type":"object","required":["files"],"title":"Body_submit_claim_upload_api_v1_claims_upload_submit_post"},"Body_submit_claim_upload_api_v3_claims_upload_submit_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files","description":"Medical documents (PDF, PNG, JPEG, TIFF, Word .doc/.docx)"},"metadata":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata","description":"Optional JSON string of claim metadata"}},"type":"object","required":["files"],"title":"Body_submit_claim_upload_api_v3_claims_upload_submit_post"},"Body_submit_restriction_api_v1_drugs_restriction_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files","description":"Supporting documents (PDF, PNG, JPEG, TIFF)","default":[]},"metadata":{"type":"string","title":"Metadata","description":"JSON metadata: external_encounter_id, patient_profile, current_prescriptions, historical_prescriptions?, supporting_documents?, file_documents (one per uploaded file)"}},"type":"object","required":["metadata"],"title":"Body_submit_restriction_api_v1_drugs_restriction_post"},"CareType":{"type":"string","enum":["Rawat Inap","Rawat Jalan"],"title":"CareType","description":"Care type enum."},"Category":{"type":"string","enum":["Kriteria Diagnosis","Tatalaksana","Monitoring","Indikasi Rawat Inap","Kriteria Pulang","Administratif","Farmakologi","Others"],"title":"Category","description":"Rule category enum."},"ChargeUsageItem":{"properties":{"units":{"type":"string","title":"Units"},"events_count":{"type":"integer","title":"Events Count"},"amount_cents":{"type":"integer","title":"Amount Cents"},"amount_currency":{"type":"string","title":"Amount Currency"},"charge":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Charge"},"billable_metric":{"additionalProperties":true,"type":"object","title":"Billable Metric"}},"type":"object","required":["units","events_count","amount_cents","amount_currency","billable_metric"],"title":"ChargeUsageItem","description":"Usage for a single charge/metric.","examples":[{"amount_cents":0,"amount_currency":"IDR","billable_metric":{"code":"claim_rawat_inap_processed","name":"Claim Rawat Inap"},"events_count":11,"units":"11.0"}]},"ClaimMedicalGrouperRequest":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id"},"extracted_text":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extracted Text"},"patient":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Patient"},"hospital_context":{"anyOf":[{"$ref":"#/components/schemas/HospitalContext"},{"type":"null"}]}},"type":"object","required":["claim_id"],"title":"ClaimMedicalGrouperRequest","description":"Request for Step 2: Medical Grouper (ICD/INA-CBG).","examples":[{"claim_id":"clm-123","external_claim_id":"CLM-2026-001","extracted_text":{"MEDICAL-RESUME":"...","SEP":"..."},"hospital_context":{"jenis_rumah_sakit":"pemerintah","kelas_rumah_sakit":"B","regional":1},"patient":{"nama":"John Doe"}}]},"ClaimResultDTO":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id"},"status":{"type":"string","title":"Status"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"}},"type":"object","required":["claim_id","status"],"title":"ClaimResultDTO"},"ClaimResultResponse":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id"},"status":{"type":"string","title":"Status"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["claim_id","status"],"title":"ClaimResultResponse","description":"Claim result response.","examples":[{"claim_id":"clm-abc-123-xyz","completed_at":"2026-01-22T10:45:00Z","external_claim_id":"CLM-2026-001","result":{"diagnosis":{"primary_code":"A09","primary_description":"Gastroenteritis"},"patient":{"nama":"John Doe","rekam_medis":"RM001234"},"procedures":[{"code":"89.04","description":"IV fluid therapy"}],"total_charges":5000000,"validation_status":"PASSED"},"status":"COMPLETED"}]},"ClaimStatusResponse":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id"},"workflow_id":{"type":"string","title":"Workflow Id"},"status":{"type":"string","title":"Status"},"processing_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processing Step"},"processing_progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Processing Progress"},"steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/app__schemas__claim_schemas__ProcessingStep"},"type":"array"},{"type":"null"}],"title":"Steps"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["claim_id","workflow_id","status","updated_at"],"title":"ClaimStatusResponse","description":"Claim status response.","examples":[{"claim_id":"clm-abc-123-xyz","external_claim_id":"CLM-2026-001","processing_progress":65,"processing_step":"medical_coding","status":"PROCESSING","steps":[{"duration_ms":2500,"status":"COMPLETED","step":"ocr_extraction"},{"status":"IN_PROGRESS","step":"medical_coding"},{"status":"PENDING","step":"validation"}],"updated_at":"2026-01-22T10:35:00Z","workflow_id":"wf-temporal-456"}]},"ClaimSubmitResponse":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id"},"workflow_id":{"type":"string","title":"Workflow Id"},"status":{"type":"string","title":"Status"},"status_url":{"type":"string","title":"Status Url"},"submitted_at":{"type":"string","title":"Submitted At"}},"type":"object","required":["claim_id","workflow_id","status","status_url","submitted_at"],"title":"ClaimSubmitResponse","description":"Claim submission response.","examples":[{"claim_id":"clm-abc-123-xyz","external_claim_id":"CLM-2026-001","status":"PROCESSING","status_url":"/api/v1/claims/upload/status/clm-abc-123-xyz","submitted_at":"2026-01-22T10:30:00Z","workflow_id":"wf-temporal-456"}]},"ClaimTextRequest":{"properties":{"external_claim_id":{"type":"string","title":"External Claim Id"},"payer_id":{"type":"string","title":"Payer Id","default":"bpjs"},"documents":{"items":{"$ref":"#/components/schemas/RawTextDocument"},"type":"array","title":"Documents"},"patient":{"anyOf":[{"$ref":"#/components/schemas/PatientInfo"},{"type":"null"}]},"admission":{"anyOf":[{"$ref":"#/components/schemas/AdmissionInfo"},{"type":"null"}]},"diagnosis":{"anyOf":[{"$ref":"#/components/schemas/DiagnosisInfo"},{"type":"null"}]}},"type":"object","required":["external_claim_id","documents"],"title":"ClaimTextRequest","description":"Request for raw text claim submission.","examples":[{"documents":[{"doc_type":"resume_medis","raw_text":"Patient: John Doe, Age: 41, Gender: Male\\nDiagnosis: A09 - Gastroenteritis\\nTreatment: IV fluids, antiemetics"},{"doc_type":"lab_result","raw_text":"WBC: 12000, Hb: 13.5, Platelets: 250000"}],"external_claim_id":"CLM-2026-001","patient":{"nama":"John Doe","rekam_medis":"RM001234"},"payer_id":"bpjs"}]},"ClaimTrace":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id"},"batch_id":{"type":"integer","title":"Batch Id"},"status":{"type":"string","title":"Status"},"folder_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Name"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"steps":{"items":{"$ref":"#/components/schemas/app__schemas__sftp_schemas__ProcessingStep"},"type":"array","title":"Steps","default":[]},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["claim_id","batch_id","status"],"title":"ClaimTrace"},"ClaimValidationRequest":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"external_claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Claim Id"},"extracted_text":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extracted Text"},"patient":{"additionalProperties":true,"type":"object","title":"Patient"},"medical_grouper_results":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Medical Grouper Results"},"hospital_context":{"anyOf":[{"$ref":"#/components/schemas/HospitalContext"},{"type":"null"}]},"payer_id":{"type":"string","title":"Payer Id","default":"bpjs"}},"type":"object","required":["claim_id","patient"],"title":"ClaimValidationRequest","description":"Request for Step 3: Final Claim Validation.","examples":[{"claim_id":"clm-123","external_claim_id":"CLM-2026-001","extracted_text":{"SEP":"..."},"hospital_context":{"jenis_rumah_sakit":"pemerintah","kelas_rumah_sakit":"B","regional":1},"medical_grouper_results":{"idrg":{"icd_group_recommendation":{}}},"patient":{"NOMOR_REKAM_MEDIS":"..."},"payer_id":"bpjs"}]},"CodeSelection":{"properties":{"code":{"type":"string","minLength":1,"title":"Code","description":"Selected ICD code"},"code_system":{"type":"string","minLength":1,"title":"Code System","description":"Code system, e.g. 'ICD-10'"},"selected_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected By","description":"Who made the selection (optional)"}},"additionalProperties":false,"type":"object","required":["code","code_system"],"title":"CodeSelection","description":"One physician code selection to record against a completed analysis.\n\n``extra=\"forbid\"`` mirrors the request bodies above: a stray field is\nrejected loudly at the boundary, not silently dropped into the write."},"ConfigBulkUpdate":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ConfigItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ConfigBulkUpdate","description":"Bulk configuration update.","examples":[{"items":[{"config_key":"webhook_retry_max","config_value":"3","description":"Maximum webhook retry attempts"},{"config_key":"sftp_batch_size","config_value":"20","description":"Number of claims per SFTP batch"}]}]},"ConfigItem":{"properties":{"config_key":{"type":"string","title":"Config Key"},"config_value":{"type":"string","title":"Config Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["config_key","config_value"],"title":"ConfigItem","description":"Single configuration item.\n\n`is_sensitive` is deliberately NOT a field here. It is a security\nclassification derived server-side from the config key -- see\napp.config.config_sensitivity. Accepting it from the client would let a\ntenant's own org admin mark their credentials non-sensitive and push them\ninto the Temporal policy payload.","examples":[{"config_key":"webhook_retry_max","config_value":"3","description":"Maximum number of webhook retry attempts"}]},"CreateOrgAdminRequest":{"properties":{"username":{"type":"string","maxLength":100,"minLength":3,"title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name"},"password":{"type":"string","minLength":8,"title":"Password","description":"User password (min 8 characters)"}},"type":"object","required":["username","email","first_name","last_name","password"],"title":"CreateOrgAdminRequest","description":"Request schema for creating a new org-admin user.","examples":[{"email":"admin@hospital.com","first_name":"Admin","last_name":"Hospital","password":"<set-a-strong-password>","username":"orgadmin_hospital"}]},"CreateRuleItem":{"properties":{"requirement":{"type":"string","title":"Requirement"},"applicability":{"$ref":"#/components/schemas/Applicability"},"severity":{"$ref":"#/components/schemas/Severity"},"category":{"$ref":"#/components/schemas/Category"},"documents_to_validate":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Documents To Validate"}},"type":"object","required":["requirement","applicability","severity","category"],"title":"CreateRuleItem","description":"Single rule item for creation."},"CreateRuleRequest":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/CreateRuleItem"},"type":"array","title":"Rules"}},"type":"object","required":["rules"],"title":"CreateRuleRequest","description":"Request schema for creating rules."},"CreateSuperAdminRequest":{"properties":{"username":{"type":"string","maxLength":100,"minLength":3,"title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name"},"password":{"type":"string","minLength":8,"title":"Password","description":"User password (min 8 characters)"}},"type":"object","required":["username","email","first_name","last_name","password"],"title":"CreateSuperAdminRequest","description":"Request schema for creating a new super-admin user.","examples":[{"email":"superadmin@jakartanetwork.com","first_name":"Jane","last_name":"Smith","password":"<set-a-strong-password>","username":"superadmin_jkt"}]},"DashboardClaimDetailRow":{"properties":{"FactClaimMetrics.claimId":{"type":"string","title":"Factclaimmetrics.Claimid"},"FactClaimMetrics.claimReviewCategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Factclaimmetrics.Claimreviewcategory"}},"additionalProperties":true,"type":"object","required":["FactClaimMetrics.claimId"],"title":"DashboardClaimDetailRow","description":"Typed claim identity/category fields with compatible extra Cube members.","examples":[{"FactClaimMetrics.claimCode":"SEP-2026-001","FactClaimMetrics.claimId":"claim-abc-123"}]},"DashboardDataResponse":{"properties":{"data":{"items":{},"type":"array","title":"Data","description":"Array of data rows from the dashboard query"}},"type":"object","required":["data"],"title":"DashboardDataResponse","description":"Standard response wrapper for dashboard endpoints.\nReturns only the sanitized data array from Cube, stripping internal logs/metadata.","examples":[{"data":[{"DimSession.sessionId":"session-abc-123","DimSession.startedAt":"2026-03-01T10:00:00.000","DimSession.status":"completed","FactClaimMetrics.totalClaims":"42"}]}]},"DashboardDataResponse_DashboardClaimDetailRow_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DashboardClaimDetailRow"},"type":"array","title":"Data","description":"Array of data rows from the dashboard query"}},"type":"object","required":["data"],"title":"DashboardDataResponse[DashboardClaimDetailRow]","examples":[{"data":[{"DimSession.sessionId":"session-abc-123","DimSession.startedAt":"2026-03-01T10:00:00.000","DimSession.status":"completed","FactClaimMetrics.totalClaims":"42"}]}]},"DashboardDataResponse_DashboardSummaryRow_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DashboardSummaryRow"},"type":"array","title":"Data","description":"Array of data rows from the dashboard query"}},"type":"object","required":["data"],"title":"DashboardDataResponse[DashboardSummaryRow]","examples":[{"data":[{"DimSession.sessionId":"session-abc-123","DimSession.startedAt":"2026-03-01T10:00:00.000","DimSession.status":"completed","FactClaimMetrics.totalClaims":"42"}]}]},"DashboardSummaryRow":{"properties":{"FactClaimMetrics.totalClaims":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Factclaimmetrics.Totalclaims"},"FactClaimMetrics.readyToSubmitClaims":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Factclaimmetrics.Readytosubmitclaims"},"FactClaimMetrics.attentionClaims":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Factclaimmetrics.Attentionclaims"},"FactClaimMetrics.documentMissingClaims":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Factclaimmetrics.Documentmissingclaims"},"FactClaimMetrics.readmisiClaims":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Factclaimmetrics.Readmisiclaims"},"FactClaimMetrics.fragmentasiClaims":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Factclaimmetrics.Fragmentasiclaims"},"FactClaimMetrics.needToCheckClaims":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Factclaimmetrics.Needtocheckclaims"}},"additionalProperties":true,"type":"object","required":["FactClaimMetrics.totalClaims","FactClaimMetrics.readyToSubmitClaims","FactClaimMetrics.attentionClaims","FactClaimMetrics.documentMissingClaims","FactClaimMetrics.readmisiClaims","FactClaimMetrics.fragmentasiClaims","FactClaimMetrics.needToCheckClaims"],"title":"DashboardSummaryRow","description":"Typed category metrics returned by summary and trendline queries.","examples":[{"FactClaimMetrics.attentionClaims":"4","FactClaimMetrics.documentMissingClaims":"1","FactClaimMetrics.fragmentasiClaims":"1","FactClaimMetrics.needToCheckClaims":"1","FactClaimMetrics.readmisiClaims":"1","FactClaimMetrics.readyToSubmitClaims":"1","FactClaimMetrics.totalClaims":"6"}]},"DiagnosisInfo":{"properties":{"diagnosa_kerja":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Diagnosa Kerja"},"diagnosa_utama":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Diagnosa Utama"}},"type":"object","title":"DiagnosisInfo","description":"Diagnosis information.","examples":[{"diagnosa_kerja":"A09 - Gastroenteritis","diagnosa_utama":"A09 - Diarrhea and gastroenteritis of presumed infectious origin"}]},"DrugsResultResponse":{"properties":{"encounter_id":{"type":"string","title":"Encounter Id"},"status":{"type":"string","title":"Status"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"progress_current":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress Current"},"progress_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress Total"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["encounter_id","status"],"title":"DrugsResultResponse","description":"Response for GET /drugs/{encounter_id}/result. Status-first branching:\ncompleted -> DB (authoritative); processing -> Temporal (live progress only)."},"DrugsStatusResponse":{"properties":{"encounter_id":{"type":"string","title":"Encounter Id"},"status":{"type":"string","title":"Status"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"progress_current":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress Current"},"progress_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress Total"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["encounter_id","status","updated_at"],"title":"DrugsStatusResponse","description":"Response for GET /drugs/{encounter_id}/status. Single source: Encounter table."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HospitalContext":{"properties":{"regional":{"type":"integer","title":"Regional"},"jenis_rumah_sakit":{"type":"string","title":"Jenis Rumah Sakit"},"kelas_rumah_sakit":{"type":"string","title":"Kelas Rumah Sakit"},"nama_rumah_sakit_khusus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nama Rumah Sakit Khusus"}},"type":"object","required":["regional","jenis_rumah_sakit","kelas_rumah_sakit"],"title":"HospitalContext","description":"Hospital context information."},"HospitalGroupCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"HospitalGroupCreate","description":"Request schema for creating a hospital group.","examples":[{"description":"Network of hospitals in Jakarta region managed by central administration","name":"Jakarta Hospital Network"}]},"HospitalGroupResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","description","is_active","created_at","updated_at"],"title":"HospitalGroupResponse","description":"Response schema for hospital group.","examples":[{"created_at":"2026-01-22T10:00:00Z","description":"Network of hospitals in Jakarta region","id":"hg-uuid-789-abc","is_active":true,"name":"Jakarta Hospital Network","updated_at":"2026-01-22T10:00:00Z"}]},"HospitalGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"HospitalGroupUpdate","description":"Request schema for updating a hospital group."},"HospitalGroupUsageItem":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"plan_code":{"type":"string","title":"Plan Code"},"total_usage":{"type":"integer","title":"Total Usage"},"rawat_jalan_count":{"type":"integer","title":"Rawat Jalan Count","default":0},"rawat_inap_count":{"type":"integer","title":"Rawat Inap Count","default":0}},"type":"object","required":["tenant_id","tenant_name","plan_code","total_usage"],"title":"HospitalGroupUsageItem","description":"Usage item for a single tenant in hospital group.","examples":[{"plan_code":"claim_mind_basic","rawat_inap_count":11,"rawat_jalan_count":5,"tenant_id":"tenant-001","tenant_name":"Jakarta General Hospital","total_usage":16}]},"HospitalGroupUsageResponse":{"properties":{"hospital_group_id":{"type":"string","title":"Hospital Group Id"},"tenants":{"items":{"$ref":"#/components/schemas/HospitalGroupUsageItem"},"type":"array","title":"Tenants"},"total_usage":{"type":"integer","title":"Total Usage"},"total_rawat_jalan_count":{"type":"integer","title":"Total Rawat Jalan Count","default":0},"total_rawat_inap_count":{"type":"integer","title":"Total Rawat Inap Count","default":0}},"type":"object","required":["hospital_group_id","tenants","total_usage"],"title":"HospitalGroupUsageResponse","description":"Response for hospital group aggregated usage.","examples":[{"hospital_group_id":"hg-001","tenants":[{"plan_code":"claim_mind_basic","rawat_inap_count":11,"rawat_jalan_count":5,"tenant_id":"tenant-001","tenant_name":"Jakarta General Hospital","total_usage":16},{"plan_code":"claim_mind_basic","rawat_inap_count":0,"rawat_jalan_count":8,"tenant_id":"tenant-002","tenant_name":"Surabaya Clinic","total_usage":8}],"total_rawat_inap_count":11,"total_rawat_jalan_count":13,"total_usage":24}]},"IcdCodes":{"properties":{"icd9_list":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Icd9 List","default":[]},"icd10_list":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Icd10 List","default":[]}},"type":"object","title":"IcdCodes","description":"ICD codes structure for a coding system.","examples":[{"icd10_list":["A01.0","B02.1"],"icd9_list":["01.1","02.2"]}]},"IcdHistoryCreateRequest":{"properties":{"icd_inacbg":{"anyOf":[{"$ref":"#/components/schemas/IcdCodes"},{"type":"null"}]},"icd_idrg":{"anyOf":[{"$ref":"#/components/schemas/IcdCodes"},{"type":"null"}]},"feedback":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Feedback"}},"type":"object","title":"IcdHistoryCreateRequest","description":"Request to submit a new ICD change.\n\n`origin` and `origin_actor` are deliberately NOT accepted here (FR-34). They are\nderived server-side from the authenticated door the request came through; a caller\nthat could declare its own authorship would turn the column into a claim rather\nthan evidence. A body carrying them is IGNORED, not rejected (FR-35) — Pydantic's\ndefault extra='ignore' is load-bearing, do not set extra='forbid'.","examples":[{"icd_idrg":{"icd10_list":["C03.0"],"icd9_list":["02.2"]},"icd_inacbg":{"icd10_list":["A01.0","B02.1"],"icd9_list":["01.1"]}}]},"IcdHistoryListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/IcdHistoryResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"IcdHistoryListResponse","description":"Response for listing ICD history."},"IcdHistoryResponse":{"properties":{"id":{"type":"string","title":"Id"},"claim_id":{"type":"string","title":"Claim Id"},"version":{"type":"integer","title":"Version"},"icd_inacbg":{"anyOf":[{"$ref":"#/components/schemas/IcdCodes"},{"type":"null"}]},"icd_idrg":{"anyOf":[{"$ref":"#/components/schemas/IcdCodes"},{"type":"null"}]},"created_at":{"type":"string","title":"Created At"},"origin":{"type":"string","title":"Origin","default":"unknown"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"}},"type":"object","required":["id","claim_id","version","created_at"],"title":"IcdHistoryResponse","description":"Response for ICD history record.\n\n`origin_actor` IS NEVER DECLARED HERE. Rows written by cl-service carry a real\nhospital coder's display name or email; returning it would ship staff identity to\nan external integrator with no privacy review. PRD FR-25 asks for it and the\nImplementation Plan (OD-09 / R-9) withholds it — the plan wins. Do not add it\nwithout that review.\n\n`origin` is typed `str`, never Literal or Enum: FR-37 reserves the right to grow\nthe permitted set, and a Literal would make this endpoint 500 on every read of a\nclaim carrying a value it had not been taught.","examples":[{"claim_id":"660e8400-e29b-41d4-a716-446655440001","created_at":"2026-02-16T10:00:00Z","feedback":"koreksi dari koder RS","icd_inacbg":{"icd10_list":["A01.0","B02.1"],"icd9_list":["01.1"]},"id":"550e8400-e29b-41d4-a716-446655440000","origin":"human","version":1}]},"ModifyRuleItem":{"properties":{"rule_id":{"type":"string","title":"Rule Id"},"ruleset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ruleset Id"},"applicability":{"$ref":"#/components/schemas/Applicability"},"requirement":{"type":"string","title":"Requirement"},"severity":{"$ref":"#/components/schemas/Severity"},"category":{"$ref":"#/components/schemas/Category"},"activation_status":{"anyOf":[{"$ref":"#/components/schemas/ActivationStatus"},{"type":"null"}],"default":"ACTIVE"},"system_rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Rule Id"},"source":{"anyOf":[{"$ref":"#/components/schemas/RuleSource"},{"type":"null"}]},"documents_to_validate":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Documents To Validate"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["rule_id","applicability","requirement","severity","category"],"title":"ModifyRuleItem","description":"Single rule item for modification."},"ModifyRuleRequest":{"properties":{"scope":{"$ref":"#/components/schemas/Scope"},"rules":{"items":{"$ref":"#/components/schemas/ModifyRuleItem"},"type":"array","title":"Rules"}},"type":"object","required":["scope","rules"],"title":"ModifyRuleRequest","description":"Request schema for modifying rules."},"OrganizationCreate":{"properties":{"name":{"type":"string","title":"Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"org_types":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Types"},"org_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Class"},"special_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Name"},"institution_types":{"type":"string","title":"Institution Types","default":"Swasta"}},"type":"object","required":["name"],"title":"OrganizationCreate","examples":[{"address":"Jl. Sudirman No. 123, Jakarta","institution_types":"Swasta","name":"Jakarta General Hospital","org_class":"Type A","org_types":"Hospital","region":"DKI Jakarta","special_name":"RSUP Jakarta"}]},"OrganizationResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"org_types":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Types"},"org_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Class"},"special_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Name"},"institution_types":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Types"},"hospital_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hospital Group Id"}},"type":"object","required":["id","name"],"title":"OrganizationResponse","examples":[{"address":"Jl. Sudirman No. 123, Jakarta","created_at":"2026-01-22T10:00:00Z","hospital_group_id":"hg-uuid-789","id":"org-uuid-123-456","institution_types":"Swasta","name":"Jakarta General Hospital","org_class":"Type A","org_types":"Hospital","region":"DKI Jakarta","special_name":"RSUP Jakarta"}]},"OrganizationUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"org_types":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Types"},"org_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Class"},"special_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Special Name"},"institution_types":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Types"}},"type":"object","title":"OrganizationUpdate"},"OverlapCheckRequest":{"properties":{"overlap_window_days":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Overlap Window Days","default":30},"current_prescriptions":{"$ref":"#/components/schemas/OverlapSession"},"historical_prescriptions":{"items":{"$ref":"#/components/schemas/OverlapSession"},"type":"array","title":"Historical Prescriptions"}},"type":"object","required":["current_prescriptions"],"title":"OverlapCheckRequest","description":"POST /drugs/restriction/overlap-check -- brochure vocabulary.\n\nThe client supplies the patient's history; nothing is fetched server-side."},"OverlapPrescriptionItem":{"properties":{"external_item_id":{"type":"string","title":"External Item Id","description":"Client's HIS item identifier"},"item_name":{"type":"string","title":"Item Name","description":"Drug name as-is from HIS"},"qty":{"type":"integer","title":"Qty","description":"Quantity prescribed"},"formulation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formulation","description":"Dosage form (e.g. TBL, CAP)"},"apol_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apol Id"},"signa":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signa"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Brochure-only; not sent downstream"}},"type":"object","required":["external_item_id","item_name","qty"],"title":"OverlapPrescriptionItem","description":"One prescription item in a brochure-vocabulary overlap session."},"OverlapSession":{"properties":{"date":{"type":"string","title":"Date","description":"Session date (YYYY-MM-DD)"},"clinic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clinic"},"doctor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doctor"},"doctor_specialty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doctor Specialty","description":"Forwarded downstream; doctor itself is redacted to a title-only placeholder"},"prescriptions":{"items":{"$ref":"#/components/schemas/OverlapPrescriptionItem"},"type":"array","title":"Prescriptions"}},"type":"object","required":["date"],"title":"OverlapSession","description":"A prescription session (current or historical), brochure vocabulary."},"PaginatedSftpSessionResultResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"status":{"type":"string","title":"Status"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"},"results":{"items":{"$ref":"#/components/schemas/ClaimResultDTO"},"type":"array","title":"Results"}},"type":"object","required":["session_id","status","pagination","results"],"title":"PaginatedSftpSessionResultResponse","description":"Paginated response for SFTP session results."},"PaginationMeta":{"properties":{"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"total":{"type":"integer","title":"Total"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["page","limit","total","total_pages"],"title":"PaginationMeta","description":"Pagination metadata."},"PartnerSettingsResponse":{"properties":{"partner_id":{"type":"string","title":"Partner Id"},"webhook_config":{"$ref":"#/components/schemas/WebhookConfigResponse"},"sftp_config":{"$ref":"#/components/schemas/SftpConfigResponse"}},"type":"object","required":["partner_id","webhook_config","sftp_config"],"title":"PartnerSettingsResponse","description":"Complete partner settings response."},"PatientInfo":{"properties":{"no_sep":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"No Sep"},"rekam_medis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rekam Medis"},"nama":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nama"},"tanggal_lahir":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Tanggal Lahir"},"jenis_kelamin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jenis Kelamin"},"umur":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Umur"}},"type":"object","title":"PatientInfo","description":"Patient demographic information.","examples":[{"jenis_kelamin":"L","nama":"John Doe","no_sep":"0301R0011023V000001","rekam_medis":"RM001234","tanggal_lahir":"1985-03-15","umur":41}]},"PlanAssignRequest":{"properties":{"plan_code":{"type":"string","title":"Plan Code"},"start_date":{"type":"string","title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},"type":"object","required":["plan_code","start_date"],"title":"PlanAssignRequest","description":"Request to assign a plan to a tenant.","examples":[{"end_date":"2027-01-31","plan_code":"claim_mind_basic","start_date":"2026-02-01"},{"plan_code":"claim_mind_free","start_date":"2026-02-01"}]},"PlanItem":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"amount_cents":{"type":"integer","title":"Amount Cents"},"amount_currency":{"type":"string","title":"Amount Currency"},"interval":{"type":"string","title":"Interval"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","code","name","amount_cents","amount_currency","interval","created_at"],"title":"PlanItem","description":"Single plan item from Lago.","examples":[{"amount_cents":100000000,"amount_currency":"IDR","code":"claim_mind_basic","created_at":"2026-01-01T00:00:00Z","description":"Basic plan for small clinics - up to 100 claims/month","id":"plan-uuid-123","interval":"monthly","name":"ClaimMind Basic"}]},"PlanListResponse":{"properties":{"plans":{"items":{"$ref":"#/components/schemas/PlanItem"},"type":"array","title":"Plans"}},"type":"object","required":["plans"],"title":"PlanListResponse","description":"Response for listing available plans."},"RawTextDocument":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"raw_text":{"type":"string","title":"Raw Text"}},"type":"object","required":["doc_type","raw_text"],"title":"RawTextDocument","description":"A raw text document with type identifier.","examples":[{"doc_type":"resume_medis","raw_text":"Patient: John Doe, Age: 41, Gender: Male\\nDiagnosis: A09 - Gastroenteritis\\nTreatment: IV fluids, antiemetics\\nDischarge: 2026-01-20"}]},"RestrictionSubmitResponse":{"properties":{"encounter_id":{"type":"string","title":"Encounter Id"},"external_encounter_id":{"type":"string","title":"External Encounter Id"},"status":{"type":"string","title":"Status","default":"processing"}},"type":"object","required":["encounter_id","external_encounter_id"],"title":"RestrictionSubmitResponse","description":"Response for POST /drugs/restriction."},"RichTenantUsageResponse":{"properties":{"usage":{"$ref":"#/components/schemas/RichUsageData"}},"type":"object","required":["usage"],"title":"RichTenantUsageResponse","description":"Enhanced response with usage breakdown."},"RichUsageData":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"plan_code":{"type":"string","title":"Plan Code"},"subscription_external_id":{"type":"string","title":"Subscription External Id"},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"currency":{"type":"string","title":"Currency"},"total_usage":{"type":"integer","title":"Total Usage"},"rawat_jalan_count":{"type":"integer","title":"Rawat Jalan Count"},"rawat_inap_count":{"type":"integer","title":"Rawat Inap Count"},"free_count":{"type":"integer","title":"Free Count"},"amount_cents":{"type":"integer","title":"Amount Cents"},"charges_usage":{"items":{"$ref":"#/components/schemas/ChargeUsageItem"},"type":"array","title":"Charges Usage"}},"type":"object","required":["tenant_id","plan_code","subscription_external_id","period_start","period_end","currency","total_usage","rawat_jalan_count","rawat_inap_count","free_count","amount_cents","charges_usage"],"title":"RichUsageData","description":"Rich usage data with breakdown by metric type."},"RuleActionItem":{"properties":{"rule_id":{"type":"string","title":"Rule Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["rule_id"],"title":"RuleActionItem","description":"Rule action item with optional reason."},"RuleLookupItem":{"properties":{"external_item_id":{"type":"string","title":"External Item Id","description":"Client's HIS item identifier"},"item_name":{"type":"string","title":"Item Name","description":"Drug name as-is from HIS"},"formulation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formulation","description":"Dosage form (e.g. TBL, CPS)"},"strength":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strength","description":"Dose amount if separate (e.g. 40 mg)"},"apol_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apol Id","description":"Apotek Online item identifier"}},"type":"object","required":["external_item_id","item_name"],"title":"RuleLookupItem","description":"One drug in a brochure-vocabulary rules lookup.\n\nPassed through to the validator as-is (no field remapping)."},"RuleSource":{"properties":{"page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page"},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","title":"RuleSource","description":"Source reference for a rule."},"RulesLookupRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RuleLookupItem"},"type":"array","minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"RulesLookupRequest","description":"POST /drugs/restriction/rules -- brochure vocabulary."},"Scope":{"type":"string","enum":["system","tenant"],"title":"Scope","description":"Rule scope enum."},"Severity":{"type":"string","enum":["error","warning","info","any","EPISODIC"],"title":"Severity","description":"Rule severity enum."},"Sex":{"type":"string","enum":["M","F","any"],"title":"Sex","description":"Sex enum."},"SftpClaimInput":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"files":{"items":{"$ref":"#/components/schemas/SftpFileResult"},"type":"array","title":"Files","default":[]},"sftp_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sftp Path"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"error_msg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Msg"}},"type":"object","required":["claim_id"],"title":"SftpClaimInput"},"SftpConfigCreate":{"properties":{"sftp_hostname":{"type":"string","title":"Sftp Hostname"},"sftp_port":{"type":"integer","title":"Sftp Port","default":22},"sftp_username":{"type":"string","title":"Sftp Username"},"sftp_password":{"type":"string","title":"Sftp Password"},"sftp_base_path":{"type":"string","title":"Sftp Base Path","default":"/inbox"},"sftp_batch_size":{"type":"integer","title":"Sftp Batch Size","default":10}},"type":"object","required":["sftp_hostname","sftp_username","sftp_password"],"title":"SftpConfigCreate","description":"SFTP configuration creation request.","examples":[{"sftp_base_path":"/claims/inbox","sftp_batch_size":10,"sftp_hostname":"sftp.hospital.example.com","sftp_password":"secure_password_123","sftp_port":22,"sftp_username":"claimmind_user"}]},"SftpConfigResponse":{"properties":{"sftp_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sftp Hostname"},"sftp_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sftp Port"},"sftp_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sftp Username"},"sftp_base_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sftp Base Path"},"sftp_batch_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sftp Batch Size"},"is_configured":{"type":"boolean","title":"Is Configured","default":false}},"type":"object","title":"SftpConfigResponse","description":"SFTP configuration response.","examples":[{"is_configured":true,"sftp_base_path":"/claims/inbox","sftp_batch_size":10,"sftp_hostname":"sftp.hospital.example.com","sftp_port":22,"sftp_username":"claimmind_user"}]},"SftpConfigUpdate":{"properties":{"sftp_hostname":{"type":"string","title":"Sftp Hostname"},"sftp_port":{"type":"integer","title":"Sftp Port","default":22},"sftp_username":{"type":"string","title":"Sftp Username"},"sftp_password":{"type":"string","title":"Sftp Password"},"sftp_base_path":{"type":"string","title":"Sftp Base Path","default":"/inbox"},"sftp_batch_size":{"type":"integer","title":"Sftp Batch Size","default":10}},"type":"object","required":["sftp_hostname","sftp_username","sftp_password"],"title":"SftpConfigUpdate","description":"SFTP configuration update request."},"SftpFileResult":{"properties":{"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"hash_file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hash File"},"status":{"type":"string","title":"Status","default":"success"},"error_msg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Msg"},"sftp_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sftp Path"},"base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size"}},"type":"object","title":"SftpFileResult"},"SftpMoveClaimRequest":{"properties":{"sftp_path":{"type":"string","title":"Sftp Path"},"batch_id":{"type":"integer","title":"Batch Id"},"target":{"type":"string","enum":["processed","errors"],"title":"Target"},"claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Id"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["sftp_path","batch_id","target","session_id"],"title":"SftpMoveClaimRequest","description":"Request body for the per-claim SFTP folder move endpoint."},"SftpNextSyncInputData":{"properties":{"session_id":{"type":"string","title":"Session Id"},"batch_id":{"type":"integer","title":"Batch Id"},"claims":{"items":{"$ref":"#/components/schemas/SftpClaimInput"},"type":"array","title":"Claims","default":[]}},"type":"object","required":["session_id","batch_id"],"title":"SftpNextSyncInputData"},"SftpNextSyncRequest":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"input_data":{"$ref":"#/components/schemas/SftpNextSyncInputData"}},"type":"object","required":["tenant_id","input_data"],"title":"SftpNextSyncRequest","description":"Payload for External SFTP Processing Workflow callback.\nReceives validation results per-claim."},"SftpOcrClaimItem":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"session_id":{"type":"string","title":"Session Id"},"batch_id":{"type":"integer","title":"Batch Id"},"batch_file":{"items":{"$ref":"#/components/schemas/SftpOcrFileResult"},"type":"array","title":"Batch File","default":[]}},"type":"object","required":["claim_id","tenant_id","session_id","batch_id"],"title":"SftpOcrClaimItem","description":"Item for External SFTP Batch Processing Workflow (OCR completion) callback.\nEndpoint receives List[SftpOcrClaimItem]."},"SftpOcrFileResult":{"properties":{"hash_file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hash File"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"error_msg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Msg"}},"type":"object","title":"SftpOcrFileResult"},"SftpSessionStatusResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"status":{"type":"string","title":"Status"},"summary":{"additionalProperties":{"type":"integer"},"type":"object","title":"Summary"},"claims":{"items":{"$ref":"#/components/schemas/ClaimTrace"},"type":"array","title":"Claims"}},"type":"object","required":["session_id","status","summary","claims"],"title":"SftpSessionStatusResponse"},"SftpTestResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details"}},"type":"object","required":["success","message"],"title":"SftpTestResponse","description":"SFTP connection test response.","examples":[{"details":"Connected to sftp.hospital.example.com:22 and accessed /claims/inbox","message":"SFTP connection successful","success":true}]},"SnomedSettingsResponse":{"properties":{"snomed_enabled":{"type":"boolean","title":"Snomed Enabled"}},"type":"object","required":["snomed_enabled"],"title":"SnomedSettingsResponse","description":"SNOMED feature settings response."},"SnomedSettingsUpdate":{"properties":{"snomed_enabled":{"type":"boolean","title":"Snomed Enabled"}},"type":"object","required":["snomed_enabled"],"title":"SnomedSettingsUpdate","description":"SNOMED feature settings update request."},"SoapAnalysisAcceptedResponse":{"properties":{"analysis_id":{"type":"string","title":"Analysis Id","description":"Run handle to poll on"},"episode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode Id","description":"Tenant-scoped episode surrogate"},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Deterministic Temporal parent ID"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version","description":"Analysis version for the episode and CPPT type"},"cppt_types":{"type":"string","title":"Cppt Types","description":"Echoes the accepted variant, 'SO' or 'AP'"},"status":{"type":"string","title":"Status","description":"Always 'processing' at accept time","default":"processing"},"poll_url":{"type":"string","title":"Poll Url","description":"Where to poll for status / result"}},"type":"object","required":["analysis_id","cppt_types","poll_url"],"title":"SoapAnalysisAcceptedResponse","description":"202 Accepted -- the analysis run was enqueued and is processing."},"SoapAnalysisPollResponse":{"properties":{"analysis_id":{"type":"string","title":"Analysis Id","description":"Run handle"},"episode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode Id"},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id"},"cppt_types":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cppt Types"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"status":{"type":"string","title":"Status","description":"processing | completed | failed"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase","description":"Current pipeline phase"},"progress_current":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress Current","description":"Steps completed"},"progress_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress Total","description":"Total steps"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Failure detail when status='failed'"},"coding_result":{"anyOf":[{"$ref":"#/components/schemas/SoapCodingResult"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Coding Result"},"validation_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Validation Result"},"tariff_result":{"anyOf":[{"$ref":"#/components/schemas/SoapTariffResultEnvelope"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["analysis_id","status"],"title":"SoapAnalysisPollResponse","description":"Single DB-authoritative status response with the three SOAP results."},"SoapCodingBranch":{"properties":{"diagnoses":{"items":{"$ref":"#/components/schemas/SoapCodingItem"},"type":"array","title":"Diagnoses","description":"Diagnosis recommendations"},"procedures":{"items":{"$ref":"#/components/schemas/SoapCodingItem"},"type":"array","title":"Procedures","description":"Procedure recommendations"}},"additionalProperties":false,"type":"object","title":"SoapCodingBranch","description":"Public diagnosis and procedure recommendations for one grouper branch."},"SoapCodingData":{"properties":{"idrg":{"$ref":"#/components/schemas/SoapCodingBranch","description":"IDRG coding recommendations"},"inacbg":{"$ref":"#/components/schemas/SoapCodingBranch","description":"INA-CBG coding recommendations"}},"additionalProperties":false,"type":"object","required":["idrg","inacbg"],"title":"SoapCodingData","description":"Public IDRG and INA-CBG coding recommendations."},"SoapCodingItem":{"properties":{"code":{"type":"string","title":"Code","description":"ICD-10 / ICD-9 code"},"description":{"type":"string","title":"Description","description":"Human-readable description","default":""},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Weighted percentage of applicable VALID and NOT_FOUND rules"},"coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage","description":"Percentage of applicable rules with VALID status"}},"additionalProperties":false,"type":"object","required":["code"],"title":"SoapCodingItem","description":"One public ICD coding recommendation with validation quality metrics."},"SoapCodingResult":{"properties":{"schema_version":{"type":"integer","title":"Schema Version","description":"Public coding result schema version"},"status":{"type":"string","title":"Status","description":"Coding result status"},"data":{"$ref":"#/components/schemas/SoapCodingData","description":"Scored coding recommendations"},"warning_codes":{"items":{},"type":"array","title":"Warning Codes","description":"Non-fatal coding warnings"},"error":{"title":"Error","description":"Coding error detail, when present"}},"additionalProperties":false,"type":"object","required":["schema_version","status","data"],"title":"SoapCodingResult","description":"Public scored SOAP coding result returned by the poll endpoint."},"SoapSelectionRequest":{"properties":{"analysis_id":{"type":"string","minLength":1,"title":"Analysis Id","description":"Run handle the selections belong to"},"selections":{"items":{"$ref":"#/components/schemas/CodeSelection"},"type":"array","title":"Selections","description":"Selected codes to record"}},"additionalProperties":false,"type":"object","required":["analysis_id"],"title":"SoapSelectionRequest","description":"POST /selections body: the physician's code choices for a completed run.\n\nSynchronous, best-effort capture -- never routed through Temporal. An empty\n``selections`` list is representable and simply records nothing (the service\nreturns ``recorded: 0``); it is not an error, so no min_length is imposed."},"SoapTariffResultData":{"properties":{"inacbg":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Inacbg"},"idrg":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Idrg"},"tariff_profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tariff Profile"},"provisional":{"type":"boolean","title":"Provisional"}},"additionalProperties":false,"type":"object","required":["inacbg","idrg","tariff_profile","provisional"],"title":"SoapTariffResultData","description":"Provider-owned tariff branches plus the canonical shared profile."},"SoapTariffResultEnvelope":{"properties":{"schema_version":{"type":"integer","const":1,"title":"Schema Version"},"status":{"type":"string","enum":["completed","completed_degraded"],"title":"Status"},"data":{"$ref":"#/components/schemas/SoapTariffResultData"},"warning_codes":{"items":{"type":"string"},"type":"array","title":"Warning Codes"},"error":{"anyOf":[{},{"type":"null"}],"title":"Error"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"}},"additionalProperties":false,"type":"object","required":["schema_version","status","data","warning_codes","error"],"title":"SoapTariffResultEnvelope","description":"Public v1 tariff result returned by the SOAP polling endpoint."},"SubscriptionAssignResponse":{"properties":{"subscription":{"$ref":"#/components/schemas/SubscriptionDetail"},"message":{"type":"string","title":"Message","default":"Subscription assigned successfully"}},"type":"object","required":["subscription"],"title":"SubscriptionAssignResponse","description":"Response after assigning a subscription."},"SubscriptionCancelRequest":{"properties":{"effective":{"type":"string","title":"Effective","default":"immediate"}},"type":"object","title":"SubscriptionCancelRequest","description":"Request to cancel a subscription.","examples":[{"effective":"immediate"}]},"SubscriptionCancelResponse":{"properties":{"subscription":{"$ref":"#/components/schemas/SubscriptionDetail"},"cancelled_at":{"type":"string","format":"date-time","title":"Cancelled At"},"effective_date":{"type":"string","format":"date-time","title":"Effective Date"},"message":{"type":"string","title":"Message","default":"Subscription cancelled successfully"}},"type":"object","required":["subscription","cancelled_at","effective_date"],"title":"SubscriptionCancelResponse","description":"Response after cancelling subscription."},"SubscriptionDetail":{"properties":{"lago_id":{"type":"string","title":"Lago Id"},"external_id":{"type":"string","title":"External Id"},"plan_code":{"type":"string","title":"Plan Code"},"plan_name":{"type":"string","title":"Plan Name"},"status":{"type":"string","title":"Status"},"billing_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Time"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ending_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ending At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["lago_id","external_id","plan_code","plan_name","status","created_at"],"title":"SubscriptionDetail","description":"Subscription details from Lago.","examples":[{"created_at":"2026-01-22T10:00:00Z","ending_at":"2027-01-31T23:59:59Z","external_id":"tenant-001","lago_id":"sub-lago-uuid-456","plan_code":"claim_mind_basic","plan_name":"ClaimMind Basic","started_at":"2026-02-01T00:00:00Z","status":"active"}]},"SubscriptionDetailResponse":{"properties":{"subscription":{"$ref":"#/components/schemas/SubscriptionDetail"}},"type":"object","required":["subscription"],"title":"SubscriptionDetailResponse","description":"Response for subscription details."},"SubscriptionHistoryItem":{"properties":{"lago_id":{"type":"string","title":"Lago Id"},"external_id":{"type":"string","title":"External Id"},"plan_code":{"type":"string","title":"Plan Code"},"plan_name":{"type":"string","title":"Plan Name"},"status":{"type":"string","title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ending_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ending At"},"canceled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Canceled At"},"terminated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Terminated At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["lago_id","external_id","plan_code","plan_name","status","created_at"],"title":"SubscriptionHistoryItem","description":"Single subscription in history.","examples":[{"created_at":"2025-12-20T08:00:00Z","ending_at":"2026-06-30T23:59:59Z","external_id":"ext-sub-001","lago_id":"sub-lago-uuid-789","plan_code":"claim_mind_basic","plan_name":"ClaimMind Basic","started_at":"2026-01-01T00:00:00Z","status":"terminated","terminated_at":"2026-03-15T10:00:00Z"}]},"SubscriptionHistoryResponse":{"properties":{"subscriptions":{"items":{"$ref":"#/components/schemas/SubscriptionHistoryItem"},"type":"array","title":"Subscriptions"},"total_count":{"type":"integer","title":"Total Count"},"page":{"type":"integer","title":"Page","default":1},"per_page":{"type":"integer","title":"Per Page","default":20}},"type":"object","required":["subscriptions","total_count"],"title":"SubscriptionHistoryResponse","description":"Response for subscription history."},"SubscriptionMeterRequest":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id","description":"Tenant UUID"},"claim_id":{"type":"string","format":"uuid","title":"Claim Id","description":"Claim UUID"},"jenis_perawatan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jenis Perawatan","description":"Type of care: 'Rawat Jalan' or 'Rawat Inap'. None if unknown."}},"type":"object","required":["tenant_id","claim_id"],"title":"SubscriptionMeterRequest","description":"Request schema for subscription validation and metering."},"SubscriptionMeterResponse":{"properties":{"valid":{"type":"boolean","title":"Valid","description":"Whether the claim passed validation"},"metered":{"type":"boolean","title":"Metered","description":"Whether a metering event was sent to Lago"},"error_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Status","description":"Error status code if validation failed. Values: missing_jenis_perawatan, forbidden_rawat_jalan, forbidden_rawat_inap"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Human-readable reason for the result"}},"type":"object","required":["valid","metered"],"title":"SubscriptionMeterResponse","description":"Response schema for subscription validation and metering."},"SubscriptionPauseRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"SubscriptionPauseRequest","description":"Request to pause a subscription.","examples":[{"reason":"Payment dispute"}]},"SubscriptionPauseResponse":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"paused_at":{"type":"string","format":"date-time","title":"Paused At"},"previous_plan_code":{"type":"string","title":"Previous Plan Code"},"message":{"type":"string","title":"Message","default":"Subscription paused successfully"}},"type":"object","required":["tenant_id","paused_at","previous_plan_code"],"title":"SubscriptionPauseResponse","description":"Response after pausing subscription."},"SubscriptionResumeResponse":{"properties":{"subscription":{"$ref":"#/components/schemas/SubscriptionDetail"},"resumed_at":{"type":"string","format":"date-time","title":"Resumed At"},"pause_duration_days":{"type":"integer","title":"Pause Duration Days"},"message":{"type":"string","title":"Message","default":"Subscription resumed successfully"}},"type":"object","required":["subscription","resumed_at","pause_duration_days"],"title":"SubscriptionResumeResponse","description":"Response after resuming subscription."},"SubscriptionUpdateRequest":{"properties":{"plan_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Code"},"ending_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ending At"},"effective_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Date"}},"type":"object","title":"SubscriptionUpdateRequest","description":"Request to update a subscription.","examples":[{"plan_code":"claim_mind_pro"}]},"SubscriptionUpdateResponse":{"properties":{"subscription":{"$ref":"#/components/schemas/SubscriptionDetail"},"previous_plan_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Plan Code"},"message":{"type":"string","title":"Message","default":"Subscription updated successfully"}},"type":"object","required":["subscription"],"title":"SubscriptionUpdateResponse","description":"Response after updating subscription."},"TenantSyncDetails":{"properties":{"hospital_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hospital Group Id"},"claims_updated":{"type":"integer","title":"Claims Updated","default":0},"sftp_sync_log_updated":{"type":"integer","title":"Sftp Sync Log Updated","default":0},"configs_merged":{"type":"integer","title":"Configs Merged","default":0},"api_keys_updated":{"type":"integer","title":"Api Keys Updated","default":0},"keycloak_updated":{"type":"boolean","title":"Keycloak Updated","default":false},"old_tenant_deleted":{"type":"boolean","title":"Old Tenant Deleted","default":false}},"type":"object","title":"TenantSyncDetails","description":"Details of sync operation."},"TenantSyncRequest":{"properties":{"tenant_id_app":{"type":"string","title":"Tenant Id App","description":"Tenant ID from Claim Mind App"},"tenant_id_old":{"type":"string","title":"Tenant Id Old","description":"Tenant ID to replace in Open API"}},"type":"object","required":["tenant_id_app","tenant_id_old"],"title":"TenantSyncRequest","description":"Request schema for syncing tenant from App.","examples":[{"tenant_id_app":"f52f9c6d-4cf5-4691-8f7b-1160e4ed3e79","tenant_id_old":"a55eac0f-ffc6-4152-9448-76ef82568b7c"}]},"TenantSyncResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"details":{"anyOf":[{"$ref":"#/components/schemas/TenantSyncDetails"},{"type":"null"}]}},"type":"object","required":["success","message"],"title":"TenantSyncResponse","description":"Response schema for tenant sync.","examples":[{"details":{"api_keys_updated":2,"claims_updated":150,"configs_merged":8,"hospital_group_id":"xxx-xxx-xxx","keycloak_updated":true,"old_tenant_deleted":true,"sftp_sync_log_updated":25},"message":"Sync completed successfully","success":true}]},"UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"type":"string","title":"Email"}},"type":"object","required":["id","username","email"],"title":"UserResponse"},"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"},"WebhookConfigGetResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/WebhookEvent"},"type":"array"},{"type":"null"}],"title":"Events"},"retry_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Max"},"retry_interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Interval"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"type":"object","required":["enabled"],"title":"WebhookConfigGetResponse","description":"Webhook configuration GET response."},"WebhookConfigPartialUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/WebhookEvent"},"type":"array"},{"type":"null"}],"title":"Events"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"type":"object","title":"WebhookConfigPartialUpdate","description":"Webhook configuration partial update request."},"WebhookConfigResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/WebhookEvent"},"type":"array"},{"type":"null"}],"title":"Events"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"type":"object","required":["enabled"],"title":"WebhookConfigResponse","description":"Webhook configuration response.","examples":[{"enabled":true,"events":["claim.completed","claim.failed","batch.completed"],"secret":"whsec_abc123xyz456","url":"https://hospital.example.com/webhooks/claimmind"}]},"WebhookConfigUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"url":{"type":"string","title":"Url"},"events":{"items":{"$ref":"#/components/schemas/WebhookEvent"},"type":"array","title":"Events"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"type":"object","required":["enabled","url","events"],"title":"WebhookConfigUpdate","description":"Webhook configuration update request (full update).","examples":[{"enabled":true,"events":["claim.completed","claim.failed","batch.completed"],"secret":"my_custom_secret_key","url":"https://hospital.example.com/webhooks/claimmind"}]},"WebhookEvent":{"type":"string","enum":["claim.submitted","claim.completed","claim.failed","step.ocr_completed","step.document_validation_completed","step.medical_grouper_completed","step.claim_validation_completed","step.snomed_completed","batch.started","batch.completed","batch.failed","drugs.validation.completed","drugs.validation.failed","step.soap_submitted","step.soap_grouping_completed","step.soap_validation_completed","step.soap_tariff_completed","step.soap_completed","step.soap_failed"],"title":"WebhookEvent","description":"Webhook event types."},"WebhookTestResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"response_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Status"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"WebhookTestResponse","description":"Webhook test response.","examples":[{"response_status":200,"response_time_ms":245,"success":true}]},"app__schemas__claim_schemas__ProcessingStep":{"properties":{"step":{"type":"string","title":"Step"},"status":{"type":"string","title":"Status"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"}},"type":"object","required":["step","status"],"title":"ProcessingStep","description":"Individual processing step status.","examples":[{"duration_ms":2500,"status":"COMPLETED","step":"ocr_extraction"}]},"app__schemas__sftp_schemas__ProcessingStep":{"properties":{"step_number":{"type":"integer","title":"Step Number"},"process_name":{"type":"string","title":"Process Name"},"status":{"type":"string","title":"Status"}},"type":"object","required":["step_number","process_name","status"],"title":"ProcessingStep"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"token"}}}}}}