{"openapi":"3.1.0","info":{"title":"NameGPT API","version":"0.2.0","description":"API и JSON-контракты NameGPT: анкета генерации, refine, проверки доступности, invite-login и ответы сессий."},"servers":[{"url":"https://namegpt.ru","description":"Production"}],"tags":[{"name":"auth","description":"Вход по инвайту без пароля"},{"name":"sessions","description":"Генерация и получение нейминговых сессий"},{"name":"availability","description":"Проверки ФИПС и доменных зон"},{"name":"account","description":"Баланс и usage"}],"paths":{"/api/auth/login":{"post":{"tags":["auth"],"summary":"Войти по email-инвайту","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}}},"responses":{"200":{"description":"Успешный вход","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Выйти из аккаунта","responses":{"200":{"description":"Cookie очищена"}}}},"/api/v1/sessions":{"post":{"tags":["sessions"],"summary":"Создать сессию генерации","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionnairePayload"}}}},"responses":{"202":{"description":"Сессия создана и поставлена в обработку","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionResponse"}}}}}}},"/api/v1/sessions/{id}":{"get":{"tags":["sessions"],"summary":"Получить статус и результат сессии","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Данные сессии","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}}}}},"/api/v1/sessions/{id}/refine":{"post":{"tags":["sessions"],"summary":"Запустить новую генерацию с учётом понравившихся названий","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefineRequest"}}}},"responses":{"200":{"description":"Обновлённая сессия","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}}}}},"/api/v1/sessions/{id}/check-availability":{"post":{"tags":["availability"],"summary":"Проверить выбранные названия по ФИПС и доменным зонам","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityRequest"}}}},"responses":{"200":{"description":"Матрица результатов проверки","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityResponse"}}}}}}},"/api/v1/account/usage":{"get":{"tags":["account"],"summary":"Получить usage и суммарную стоимость","responses":{"200":{"description":"Статистика аккаунта","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}}}}}},"components":{"schemas":{"LoginRequest":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"admin@namegpt.ru"}}},"LoginResponse":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"email":{"type":"string","example":"admin@namegpt.ru"},"role":{"type":"string","enum":["user","admin"]},"balance_rub":{"type":"integer","example":5000}}},"QuestionnairePayload":{"type":"object","required":["businessSentence","languages","useLengthLimit","lengthMin","lengthMax","wordCountMode","useExtra","desiredRoots","forbiddenRoots","creativePresets","priceRub"],"properties":{"businessSentence":{"type":"string","description":"Одно короткое предложение только про сферу бизнеса пользователя","minLength":10,"maxLength":500,"example":"Сервис подбора названий для новых компаний и продуктов"},"languages":{"type":"array","minItems":1,"items":{"type":"string","enum":["RU","EN","DE","FR","ES","OTHER"]},"example":["RU","OTHER","DE","FR"]},"otherLanguage":{"type":"string","description":"Сейчас не используется для свободного ввода и передаётся пустой строкой","example":""},"useLengthLimit":{"type":"boolean","example":true},"lengthMin":{"type":"integer","description":"Минимальная длина каждого отдельного слова в названии","minimum":3,"maximum":10,"example":5},"lengthMax":{"type":"integer","description":"Максимальная длина каждого отдельного слова в названии","minimum":3,"maximum":10,"example":8},"wordCountMode":{"type":"string","description":"Режим количества слов; `unlimited` означает «Без лимитов»","enum":["unlimited","strict-1","strict-2","strict-3","1-2","1-3","2-3","3plus"],"example":"1-2"},"useExtra":{"type":"boolean","example":true},"desiredRoots":{"type":"array","items":{"type":"string"},"example":["nova","spark"]},"forbiddenRoots":{"type":"array","items":{"type":"string"},"example":["cheap","copy"]},"creativePresets":{"type":"array","description":"Выбранные пресеты генерации; если пользователь не выбирал их вручную, сервер использует базовый набор без slang / Мат / 18+","items":{"type":"string","enum":["wordplay","multi-layered","neologism","numbers","humor","surname-derived","neologism-2","colors","animals","modern","slang","explicit","adults"]},"example":["wordplay","multi-layered"]},"priceRub":{"type":"integer","example":500}}},"CreateSessionResponse":{"type":"object","properties":{"session_id":{"type":"string","example":"cmojs208i0002k8brpn3sp41q"},"status":{"type":"string","example":"processing"},"status_url":{"type":"string","example":"/api/v1/sessions/cmojs208i0002k8brpn3sp41q"},"web_url":{"type":"string","example":"/sessions/cmojs208i0002k8brpn3sp41q"},"balance_rub":{"type":"integer","example":4500},"charged_rub":{"type":"integer","example":500}}},"RefineRequest":{"type":"object","required":["likedNameIds"],"properties":{"likedNameIds":{"type":"array","minItems":1,"items":{"type":"string"},"example":["name_1","name_2"]},"comment":{"type":"string","maxLength":300,"example":"Больше метафор и меньше техно-звучания"}}},"AvailabilityRequest":{"type":"object","required":["nameIds","tlds","checkFips"],"properties":{"nameIds":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string"},"example":["name_1","name_2"]},"tlds":{"type":"array","items":{"type":"string"},"example":[".ru",".com"]},"customTld":{"type":"string","example":".io"},"checkFips":{"type":"boolean","example":true}}},"AvailabilityResponse":{"type":"object","properties":{"session_id":{"type":"string"},"charged_rub":{"type":"integer","example":600},"balance_rub":{"type":"integer","example":3900},"checked_at":{"type":"string","format":"date-time"},"checks":{"type":"array","items":{"type":"object","properties":{"name_id":{"type":"string"},"name":{"type":"string","example":"NovaFlow"},"domains":{"type":"array","items":{"type":"object","properties":{"target":{"type":"string","example":"novaflow.ru"},"status":{"type":"string","enum":["available","taken","possible_conflict"]}}}},"trademarks":{"type":"array","items":{"type":"object","properties":{"registry":{"type":"string","example":"ФИПС"},"status":{"type":"string","enum":["available","taken","possible_conflict"]}}}}}}}}},"NameItem":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string","example":"NovaFlow"},"score":{"type":"number","example":0.912},"explanation":{"type":"string"},"source_model":{"type":"string","example":"webhook-namegpt"},"is_top_pick":{"type":"boolean","example":false},"refinement_round":{"type":"integer","example":0}}},"SessionResponse":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["processing","completed","failed"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_steps":{"type":"integer"},"total_steps":{"type":"integer"},"refinement_round":{"type":"integer"},"estimated_cost":{"type":"number","example":500},"balance_rub":{"type":"integer","example":4500},"error_message":{"type":["string","null"]},"brief":{"$ref":"#/components/schemas/QuestionnairePayload"},"top_names":{"type":"array","items":{"$ref":"#/components/schemas/NameItem"}},"names":{"type":"array","items":{"$ref":"#/components/schemas/NameItem"}}}},"UsageResponse":{"type":"object","properties":{"sessions":{"type":"integer","example":3},"generated_names":{"type":"integer","example":300},"availability_checks":{"type":"integer","example":12},"estimated_cost_usd":{"type":"number","example":0}}},"WebhookOutboundPayload":{"type":"object","description":"JSON, который NameGPT отправляет во внешний webhook генерации","properties":{"session_id":{"type":"string","example":"cmojs208i0002k8brpn3sp41q"},"user_email":{"type":"string","example":"admin@namegpt.ru"},"mode":{"type":"string","enum":["initial","refine"],"example":"initial"},"liked_names":{"type":"array","items":{"type":"string"},"example":[]},"comment":{"type":["string","null"],"example":null},"prompt":{"type":"string","description":"Полностью собранный prompt для внешнего генератора","example":"<role>\nТы — профессиональный нейминг-стратег и креативный директор.\nТвоя задача — придумать названия компаний по анкете пользователя.\n</role>\n\n<main_task>\nСгенерируй ровно 20 вариантов названий компании.\n\nКаждое название должно:\n1. Иметь смысловую связь со сферой бизнеса пользователя.\n2. Соответствовать всем техническим ограничениям.\n3. Быть пригодным как название бренда, компании, сервиса или продукта.\n4. Не быть случайным набором красивых слогов без связи с бизнесом.\n5. Не повторять другие варианты по смыслу, звучанию и структуре.\n</main_task>\n\n<priority_rules>\nПриоритеты правил:\n\n1. Запрещённые части слов, корни и фрагменты — абсолютный запрет.\n2. Язык названия.\n3. Длина слов / названия.\n4. Количество слов.\n5. Обязательные части слов / корни.\n6. Креативность, благозвучие, оригинальность.\n\nЕсли креативная идея конфликтует с техническими правилами — откажись от идеи и придумай другую.\nЕсли обязательный корень конфликтует с запрещённым фрагментом — запрещённый фрагмент важнее.\n</priority_rules>\n\n<business_context>\nПользователь описал сферу деятельности компании так:\n\n\"Сервис подбора названий для новых компаний и продуктов\"\n\nЭто главный смысловой якорь генерации.\n\nКаждое из 20 названий должно хотя бы косвенно отражать эту сферу бизнеса:\n- через прямую ассоциацию;\n- через пользу для клиента;\n- через образ, метафору или эмоцию;\n- через аудиторию;\n- через проблему, которую решает бизнес;\n- через результат, который получает клиент;\n- через отраслевой контекст.\n\nНельзя генерировать универсальные названия, которые подходят к любой компании и не связаны с описанием бизнеса.\n</business_context>\n<semantic_check>\nПеред финальным ответом проверь каждый вариант:\nможно ли объяснить, почему это название подходит именно для этой сферы бизнеса?\n\nЕсли объяснение слабое, слишком общее или подходит к любой сфере — замени название.\n</semantic_check>\n\n<language_rules>\nРазрешённые языки названий: русский, английский, немецкий.\n\nРаспредели 20 названий максимально равномерно между выбранными языками.\nНе смешивай языки внутри одного названия.\n</language_rules>\n\n<length_rules>\nОграничение длины: каждое отдельное слово в названии должно быть от 5 до 8 символов включительно.\n\nПравила подсчёта:\n- пробелы не считаются;\n- дефисы и знаки препинания не считаются;\n- буквы с диакритикой считаются как один символ;\n- если название состоит из нескольких слов, каждое слово отдельно должно попадать в диапазон 5–8 символов.\n\nНе выдавай варианты, где хотя бы одно слово короче 5 или длиннее 8 символов.\n</length_rules>\n\n<word_count_rules>\nРазрешённое количество слов в названии: 1 или 2.\n\nИз 20 названий:\n- минимум 6 названий должны состоять из 1 слова;\n- минимум 6 названий должны состоять из 2 слов;\n- остальные 8 названий могут состоять только из 1 или 2 слов — выбирай по качеству.\n\nНе используй названия с другим количеством слов.\n</word_count_rules>"},"prompt_parts":{"type":"object","properties":{"mainprompt":{"type":"string","example":"<role>\nТы — профессиональный нейминг-стратег и креативный директор.\nТвоя задача — придумать названия компаний по анкете пользователя.\n</role>\n\n<main_task>\nСгенерируй ровно 20 вариантов названий компании.\n\nКаждое название должно:\n1. Иметь смысловую связь со сферой бизнеса пользователя.\n2. Соответствовать всем техническим ограничениям.\n3. Быть пригодным как название бренда, компании, сервиса или продукта.\n4. Не быть случайным набором красивых слогов без связи с бизнесом.\n5. Не повторять другие варианты по смыслу, звучанию и структуре.\n</main_task>\n\n<priority_rules>\nПриоритеты правил:\n\n1. Запрещённые части слов, корни и фрагменты — абсолютный запрет.\n2. Язык названия.\n3. Длина слов / названия.\n4. Количество слов.\n5. Обязательные части слов / корни.\n6. Креативность, благозвучие, оригинальность.\n\nЕсли креативная идея конфликтует с техническими правилами — откажись от идеи и придумай другую.\nЕсли обязательный корень конфликтует с запрещённым фрагментом — запрещённый фрагмент важнее.\n</priority_rules>"},"sfera_prompt":{"type":"string","example":"<business_context>\nПользователь описал сферу деятельности компании так:\n\n\"Сервис подбора названий для новых компаний и продуктов\"\n\nЭто главный смысловой якорь генерации.\n\nКаждое из 20 названий должно хотя бы косвенно отражать эту сферу бизнеса:\n- через прямую ассоциацию;\n- через пользу для клиента;\n- через образ, метафору или эмоцию;\n- через аудиторию;\n- через проблему, которую решает бизнес;\n- через результат, который получает клиент;\n- через отраслевой контекст.\n\nНельзя генерировать универсальные названия, которые подходят к любой компании и не связаны с описанием бизнеса.\n</business_context>\n<semantic_check>\nПеред финальным ответом проверь каждый вариант:\nможно ли объяснить, почему это название подходит именно для этой сферы бизнеса?\n\nЕсли объяснение слабое, слишком общее или подходит к любой сфере — замени название.\n</semantic_check>"},"language_rules":{"type":"string","example":"<language_rules>\nРазрешённые языки названий: русский, английский, немецкий.\n\nРаспредели 20 названий максимально равномерно между выбранными языками.\nНе смешивай языки внутри одного названия.\n</language_rules>"},"lenght_rules":{"type":"string","example":"<length_rules>\nОграничение длины: каждое отдельное слово в названии должно быть от 5 до 8 символов включительно.\n\nПравила подсчёта:\n- пробелы не считаются;\n- дефисы и знаки препинания не считаются;\n- буквы с диакритикой считаются как один символ;\n- если название состоит из нескольких слов, каждое слово отдельно должно попадать в диапазон 5–8 символов.\n\nНе выдавай варианты, где хотя бы одно слово короче 5 или длиннее 8 символов.\n</length_rules>"},"word_count_rules":{"type":"string","example":"<word_count_rules>\nРазрешённое количество слов в названии: 1 или 2.\n\nИз 20 названий:\n- минимум 6 названий должны состоять из 1 слова;\n- минимум 6 названий должны состоять из 2 слов;\n- остальные 8 названий могут состоять только из 1 или 2 слов — выбирай по качеству.\n\nНе используй названия с другим количеством слов.\n</word_count_rules>"},"basic_presets_rule":{"type":"string","example":"Используй все базовые пресеты, кроме slang, profanity, adult.\n\nЕсли среди активных пресетов есть wordplay:\nминимум 20% выдачи, то есть минимум 4 из 20.\n\nЕсли среди активных пресетов есть multilayer:\nминимум 10% выдачи, то есть минимум 2 из 20.\n\nОставшиеся слоты распределяй максимально равномерно между остальными активными пресетами."},"creative_presets_task":{"type":"string","example":"<creative_presets_task>\nТеперь сгенерируй названия с учётом выбранных креативных пресетов.\n...\n</creative_presets_task>"},"preset_rules":{"type":"object","additionalProperties":{"type":"string"}}}},"businessSentence":{"type":"string","description":"Краткое описание сферы бизнеса в одном предложении"},"languages":{"type":"array","items":{"type":"string","enum":["RU","EN","DE","FR","ES","OTHER"]}},"otherLanguage":{"type":"string"},"useLengthLimit":{"type":"boolean"},"lengthMin":{"type":"integer"},"lengthMax":{"type":"integer"},"wordCountMode":{"type":"string","enum":["unlimited","strict-1","strict-2","strict-3","1-2","1-3","2-3","3plus"]},"useExtra":{"type":"boolean"},"desiredRoots":{"type":"array","items":{"type":"string"}},"forbiddenRoots":{"type":"array","items":{"type":"string"}},"creativePresets":{"type":"array","items":{"type":"string"}},"priceRub":{"type":"integer"}}},"WebhookInboundResponse":{"description":"JSON, который webhook может вернуть в ответ. Поддерживаются строки и объекты.","oneOf":[{"type":"object","properties":{"names":{"type":"array","items":{"oneOf":[{"type":"string","example":"NovaFlow"},{"type":"object","properties":{"text":{"type":"string","example":"NovaFlow"},"explanation":{"type":"string","example":"Комбинация новизны и динамики потока"},"source_model":{"type":"string","example":"gpt-5.4"},"score":{"type":"number","example":0.91}}}]}}}},{"type":"array","items":{"oneOf":[{"type":"string","example":"NovaFlow"},{"type":"object","properties":{"text":{"type":"string","example":"NovaFlow"},"explanation":{"type":"string","example":"Комбинация новизны и динамики потока"},"source_model":{"type":"string","example":"gpt-5.4"},"score":{"type":"number","example":0.91}}}]}}]}}}}