chat_key + message_key path params (message_key comes from GET /nandini/chats/{chat_key} - every message in data.messages[] carries its own); Bearer token required; JSON body {"query": "..."}USER messages can be targeted, not Nandini's replies. Two things happen atomically:message_key, same position in the thread) - it is NOT a new message, so it does not count against the plan's messages_per_day limit the way a fresh POST /nandini/chat does.GET /nandini/chats/{chat_key} or GET /nandini/chats anymore). The conversation forks from the edited point, the same as editing a message in ChatGPT: you get ONE current answer to the current wording, not two answers to two versions.POST /nandini/chat - open /ws/stream?stream_token=<stream_token> to receive Nandini's regenerated reply to the edited text, or fall back to GET /nandini/chats/{chat_key} once it's done. Client-side, remove any locally-cached messages after the edited one BEFORE opening the new stream (or just refetch the thread), since they no longer exist server-side.files instead if you need that).200 - same as POST /nandini/chat: data.chat_key + data.stream_token + data.status (processing)401 - invalid/expired token | 403 - message_key refers to a NANDINI message, not one of yours | 404 - chat_key or message_key not found for this user | 409 - edited query is empty