{"openapi":"3.0.3","info":{"title":"xWires: API управления компанией","version":"1.0.0","description":"API управления компанией xWires для систем самой компании: HR, учёта, согласований. Они читают сотрудников, заказы, список почт, приглашения и ленту событий и делают то же, что админ в кабинете: подтверждают и отклоняют заказы, ведут список почт, приглашают и отмечают уволившихся. Руководство с примерами: https://xwires.ai/docs/company-api.\n\n## Ключ\n\nКлюч выпускает админ компании: Компания → Интеграции. Ключ принадлежит компании и действует, пока его не отзовут, также когда выпустивший его админ ушёл. Доступ: только чтение (read) или чтение и действия (manage). Передавайте ключ только с сервера и только в заголовке `Authorization: Bearer xwc_…`. Ключ в адресе запроса — `400 api_key_in_url`: такой ключ отзовите.\n\n## Ответы\n\nJSON в UTF-8. Время — RFC 3339 со смещением +00:00 и долей секунды от 0 до 6 цифр, деньги — десятичной строкой с валютой. Незнакомые поля, статусы и типы событий пропускайте: в v1 они только добавляются, поэтому значения ответов перечислены в `x-extensible-enum`, а событие нового типа подходит под `UnknownEvent`. Каждый ответ несёт `X-Request-Id`. Ошибка — `{\"error\": {\"code\", \"message\", \"request_id\", \"details\"}}`: решения принимайте по `code`, `details` есть только у `invalid_request`. Незнакомый адрес — `404 not_found`.\n\n## Лимиты\n\nС одного ключа — 60 запросов в минуту и 2 одновременно: заголовки RateLimit-*, сверх них `429 rate_limited` с Retry-After. Тело запроса — до 256 КБ, почт в запросе — до 500. Почт и приглашений через API — до 5000 у компании за сутки (`429 api_email_quota_exceeded`).\n\n## Списки\n\n`limit` от 1 до 200, по умолчанию 100, и `cursor` из `next_cursor` предыдущей страницы, с теми же фильтрами. Лента событий листается по `after` и `next_after`.\n\n## Песочница\n\nДля проверки интеграции — https://api.sandbox.xwires.ai/company/v1: те же операции и события на тестовых данных, ничего не оплачивается и никому не пишется. Войдите в https://sandbox.xwires.ai с любой почтой: у вас будет своя компания с придуманными сотрудниками и заказами. Ключи песочницы — `xwc_test_…`, их выпускают в её кабинете; ключ одного окружения в другом — `401 invalid_api_key`. Операции с тегом «Песочница» есть только там: они создают сотрудников и заказы и двигают заказы за сотрудника, оператора и партнёра. Подтверждённый заказ сам доходит до succeeded, пока его не переведут вручную.\n\n## Повторы\n\nКаждое действие можно повторить: подтверждение и отказ ответят 409, почты попадут в skipped, приглашение вернётся с `created: false`, увольнение и удаление ответят 404. После таймаута или ответа 5xx сначала прочитайте данные, потом повторяйте.\n\n## Вебхуки\n\nАдреса HTTPS для вебхуков добавляет админ в кабинете. Тело запроса — `WebhookEvent`: событие, как в `GET /events`, или тестовое `webhook.test`. Заголовки по Standard Webhooks:\n\n- `webhook-id`: id события, одинаковый во всех попытках, — повторы отбрасывайте по нему;\n- `webhook-timestamp`: время попытки в секундах Unix — отклоняйте запросы старше 300 секунд;\n- `webhook-signature`: `v1,` и base64 от HMAC-SHA256 строки `<webhook-id>.<webhook-timestamp>.<тело>` на байтах секрета адреса (base64 после префикса `whsec_`). 24 часа после смены секрета подписей две, через пробел: подходит любая;\n- `user-agent`: `xWires-Webhooks/1 (+https://xwires.ai/docs/company-api#webhooks)`.\n\nОтветьте 2xx за 10 секунд. Иначе отправка повторится: до 10 попыток примерно за 22 часа; событие, которое не удалось доставить за 3 дня с первой попытки, больше не отправляется, а накопившиеся, пока адрес не принимал запросы, придут позже и могут быть старше. Адрес, который не принимает события 5 дней, выключается. Событие может прийти дважды, порядок не гарантирован: действуйте по данным API. События хранятся 30 дней, их всегда можно дочитать из `GET /events`. Запросы приходят с IP 135.106.174.63, на порт 443, по IPv4, с сертификатом из публично доверенных; перенаправления не выполняются."},"servers":[{"url":"https://api.xwires.ai/company/v1","description":"xWires"},{"url":"https://api.sandbox.xwires.ai/company/v1","description":"Песочница: тестовые данные, ключи xwc_test_…"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Ключ"},{"name":"Сотрудники"},{"name":"Заказы"},{"name":"Список почт"},{"name":"Приглашения"},{"name":"События"},{"name":"Песочница"}],"paths":{"/me":{"get":{"operationId":"getMe","summary":"Ключ и компания","description":"Проверяет, что ключ действует, и называет его доступ и компанию. key.id сравнивайте с actor.api_key_id событий, чтобы узнавать свои действия.","tags":["Ключ"],"x-xwires-access":"read","parameters":[],"responses":{"200":{"description":"Ключ и его компания.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/employees":{"get":{"operationId":"listEmployees","summary":"Сотрудники","description":"Текущие пользователи компании, админы тоже, с подписками, по id. Ушедших в списке нет.","tags":["Сотрудники"],"x-xwires-access":"read","parameters":[{"name":"limit","in":"query","required":false,"description":"Сколько строк на странице, от 1 до 200.","schema":{"default":100,"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","required":false,"description":"next_cursor предыдущей страницы, с теми же фильтрами.","schema":{"type":"string","minLength":1,"maxLength":512}}],"responses":{"200":{"description":"Страница сотрудников.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeesPage"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_cursor`: Курсор не подходит: он испорчен или получен с другими фильтрами. Начните список сначала, без cursor.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_cursor"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/employees/search":{"post":{"operationId":"searchEmployees","summary":"Найти сотрудника по почте","description":"Ищет по почте входа и по почте ChatGPT-аккаунта, без учёта регистра: 0, 1 или 2 сотрудника. POST, чтобы почта не попадала в адреса и логи.","tags":["Сотрудники"],"x-xwires-access":"read","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchEmployeesRequest"}}}},"responses":{"200":{"description":"Найденные сотрудники; next_cursor всегда null.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeesPage"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_email`: Проверьте почту: нужен адрес вида name@example.ru.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_email"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/employees/{id}":{"get":{"operationId":"getEmployee","summary":"Сотрудник","description":"Текущий пользователь компании с подпиской. Ушедший или чужой — 404.","tags":["Сотрудники"],"x-xwires-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"id сотрудника.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Сотрудник.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`employee_not_found`: Сотрудника с таким id в компании нет: возможно, он уже ушёл.","x-xwires-codes":["employee_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/employees/{id}/offboard":{"post":{"operationId":"offboardEmployee","summary":"Отметить уволившимся","description":"Человек перестаёт быть сотрудником компании, его заказы за счёт компании, ещё не ушедшие партнёру, отменяются. Заказ, который партнёру как раз передают (submitting), остаётся и доходит до итога; если партнёр его так и не получил, он отменится позже, событием order.cancelled. Админа так не отметить (409 cannot_offboard_admin): это делают в кабинете. Тело пустое или {}. Автопродление его подписки за счёт компании отключается (subscription.auto_renewal_stopped, stop_reason offboarded). Вернуть человека можно новым приглашением.","tags":["Сотрудники"],"x-xwires-access":"manage","parameters":[{"name":"id","in":"path","required":true,"description":"id сотрудника.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Сотрудник ушёл.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OffboardResult"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`employee_not_found`: Сотрудника с таким id в компании нет: возможно, он уже ушёл.","x-xwires-codes":["employee_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`cannot_offboard_admin`: Админа компании через API уволившимся не отметить: это делают в кабинете.","x-xwires-codes":["cannot_offboard_admin"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/employees/{id}/auto-renewal/stop":{"post":{"operationId":"stopAutoRenewal","summary":"Отключить автопродление","description":"Подписка сотрудника больше не продлевается каждый месяц за счёт компании: оплаченный месяц остаётся до expires_at, после него подписка истекает. Продление у OpenAI xWires отменит сам; сотруднику и админам компании придёт письмо, в ленте — событие subscription.auto_renewal_stopped с stop_reason api_key. Отключить можно, только пока auto_renewal.state сотрудника не off и платит ваша компания (auto_renewal.can_stop), иначе 409 auto_renewal_not_on, повтор тоже. Включить снова до expires_at нельзя; новый заказ с renewal: monthly уйдёт партнёру, когда оплаченный месяц кончится. Тело пустое или {}.","tags":["Сотрудники"],"x-xwires-access":"manage","parameters":[{"name":"id","in":"path","required":true,"description":"id сотрудника.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Сотрудник после отключения.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`employee_not_found`: Сотрудника с таким id в компании нет: возможно, он уже ушёл.","x-xwires-codes":["employee_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`auto_renewal_not_on`: Автопродление сотрудника не включено или его оплачивает не компания: отключать нечего.","x-xwires-codes":["auto_renewal_not_on"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders":{"get":{"operationId":"listOrders","summary":"Заказы","description":"Заказы, которые оплачивает компания, также ушедших сотрудников (employee: null), по времени последнего изменения. Для синхронизации есть лента событий; updated_since — для дозагрузки: берите запас в минуту и убирайте повторы по id и updated_at. Курсор действует только с теми же фильтрами.","tags":["Заказы"],"x-xwires-access":"read","parameters":[{"name":"status","in":"query","required":false,"description":"Статусы через запятую, например awaiting_approval,approved. Значения: awaiting_approval, approved, awaiting_check, scheduled, submitting, sent, review_required, succeeded, failed, rejected, cancelled.","schema":{"type":"string"}},{"name":"updated_since","in":"query","required":false,"description":"Заказы, изменённые в этот момент или позже: ISO 8601 со смещением, + кодируйте как %2B.","schema":{"type":"string"}},{"name":"employee_id","in":"query","required":false,"description":"Заказы одного сотрудника, пока он в компании.","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"description":"Сколько строк на странице, от 1 до 200.","schema":{"default":100,"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","required":false,"description":"next_cursor предыдущей страницы, с теми же фильтрами.","schema":{"type":"string","minLength":1,"maxLength":512}}],"responses":{"200":{"description":"Страница заказов.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrdersPage"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_cursor`: Курсор не подходит: он испорчен или получен с другими фильтрами. Начните список сначала, без cursor.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_cursor"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}":{"get":{"operationId":"getOrder","summary":"Заказ","description":"Заказ компании.","tags":["Заказы"],"x-xwires-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"id заказа.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Заказ.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`order_not_found`: Заказа с таким id у компании нет.","x-xwires-codes":["order_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}/approve":{"post":{"operationId":"approveOrder","summary":"Подтвердить заказ","description":"Заказ в статусе awaiting_approval: компания его оплачивает, а сотрудника просят прислать session ChatGPT. В заказе записан ключ: approved_via api_key и approved_by_api_key_id. Тело пустое, {} или с renewal: monthly либо once; без renewal — once: согласия на ежемесячное продление API никогда не даёт само. monthly — согласие компании, что подписка будет продлеваться каждый месяц за её счёт, пока её не отключат; только пока автопродление для компании открыто, иначе 409 auto_renewal_closed. Компания может выбрать monthly и для заказа, где сотрудник выбрал разовую активацию. Окончательным режим становится, когда сотрудник прислал session и согласился на продление: без его согласия заказ разовый. Режим сейчас — renewal_mode ответа. Повтор — 409 order_not_awaiting_approval.","tags":["Заказы"],"x-xwires-access":"manage","parameters":[{"name":"id","in":"path","required":true,"description":"id заказа.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveOrderRequest"}}}},"responses":{"200":{"description":"Заказ после подтверждения.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`order_not_found`: Заказа с таким id у компании нет.","x-xwires-codes":["order_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`order_not_awaiting_approval`: Заказ не ждёт подтверждения: его уже подтвердили, отклонили или отменили. Прочитайте заказ.\n\n`auto_renewal_closed`: Автопродление для компании пока закрыто: подтвердите разовую активацию — без renewal или с renewal: \"once\".","x-xwires-codes":["order_not_awaiting_approval","auto_renewal_closed"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}/reject":{"post":{"operationId":"rejectOrder","summary":"Отклонить заказ","description":"Заказ в статусе awaiting_approval отклоняется, сотрудник видит это в кабинете. Тело пустое или {}. Повтор — 409 order_not_awaiting_approval.","tags":["Заказы"],"x-xwires-access":"manage","parameters":[{"name":"id","in":"path","required":true,"description":"id заказа.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Заказ после отказа.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`order_not_found`: Заказа с таким id у компании нет.","x-xwires-codes":["order_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`order_not_awaiting_approval`: Заказ не ждёт подтверждения: его уже подтвердили, отклонили или отменили. Прочитайте заказ.","x-xwires-codes":["order_not_awaiting_approval"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/subscriptions":{"post":{"operationId":"orderSubscription","summary":"Оформить подписку сотруднику","description":"Месяц подписки за один запрос, как его оформляет оператор xWires: почта входа сотрудника, план и session его ChatGPT-аккаунта. Почты нет в xWires — создаём учётную запись в компании: войти в неё можно кодом на эту почту. Заказ подтверждён ключом (approved_via api_key) и ждёт проверки xWires (awaiting_check), затем уходит партнёру; сотруднику приходит письмо. Новая подписка активируется, активная или истёкшая продлевается на тот же ChatGPT-аккаунт и план. Отправляя session, ключ заверяет, что сотрудник согласился передать его партнёру. Если человек с этой почтой не в компании (личный клиент или сотрудник другой), или почта на домене другой компании — 202 invited: ему уходит приглашение, почта ждёт в списке с планом (с renewal: monthly — как renews_monthly), session не сохраняется. renewal: monthly — подписка с автопродлением, только пока оно открыто для компании: иначе 409 auto_renewal_closed, и ни заказа, ни приглашения. Заказ он сделает сам, приняв приглашение, и почта его подтвердит. Повтор после обрыва — 409 open_order_exists: найдите заказ в GET /orders?employee_id=…. Идёт в суточный лимит (5000 почт и приглашений через API).","tags":["Заказы"],"x-xwires-access":"manage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderSubscriptionRequest"}}}},"responses":{"201":{"description":"Заказ создан и ждёт проверки xWires.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderSubscriptionResult"}}}},"202":{"description":"Человек не в компании: приглашение и почта в списке, без заказа.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderSubscriptionResult"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_email`: Проверьте почту: нужен адрес вида name@example.ru.\n\n`invalid_plan`: Укажите план, который оплачивает компания: plus, pro100, pro200, pro500.\n\n`invalid_session`: Session не подходит, details.issues называет почему: too_large — длиннее 32 КБ, wrong_shape — это не ответ chatgpt.com/api/auth/session (нет user.email, expires или accessToken), email_mismatch — accessToken от другого аккаунта, expired — истёк. Попросите сотрудника войти в свой ChatGPT, открыть chatgpt.com/api/auth/session и прислать ответ целиком.\n\n`session_token_required`: В session нет sessionToken, а подписку сотрудника продлевают каждый месяц по session: пришлите ответ chatgpt.com/api/auth/session целиком.\n\n`session_expires_too_soon`: Session истечёт раньше, чем заказ уйдёт партнёру: продление уходит, когда закончится оплаченный период. Пришлите свежий session ближе к этой дате.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_email","invalid_plan","invalid_session","session_token_required","session_expires_too_soon"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`auto_renewal_closed`: Автопродление для компании пока закрыто: подтвердите разовую активацию — без renewal или с renewal: \"once\".\n\n`auto_renewal_on`: Подписку сотрудника каждый месяц продлевает автопродление: новый заказ не нужен. Чтобы продлить вручную, сначала отключите его (stopAutoRenewal).\n\n`open_order_exists`: У сотрудника уже есть открытый заказ: следите за ним в GET /orders?employee_id=… или в ленте событий. В песочнице его можно довести до конца (POST /sandbox/orders/{id}/advance) или создать другого сотрудника.\n\n`chatgpt_email_taken`: Этот ChatGPT-аккаунт в xWires уже у другого человека: проверьте, что session от аккаунта сотрудника.\n\n`chatgpt_email_mismatch`: Подписка сотрудника — на другой ChatGPT-аккаунт, а продление идёт на тот же: пришлите session того аккаунта (subscription.chatgpt_email в GET /employees/{id}).\n\n`plan_mismatch`: Подписка сотрудника — на другой план, а продление идёт на тот же: укажите plan его подписки (GET /employees/{id}).","x-xwires-codes":["auto_renewal_closed","auto_renewal_on","open_order_exists","chatgpt_email_taken","chatgpt_email_mismatch","plan_mismatch"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`api_email_quota_exceeded`: За сутки через API прислали 5000 почт и приглашений компании. Повторите позже или добавьте почты в кабинете.\n\n`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["api_email_quota_exceeded","rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/approved-emails":{"get":{"operationId":"listApprovedEmails","summary":"Список почт","description":"Почты, которые подтверждают заказы сотрудников, ещё не использованные, по времени добавления.","tags":["Список почт"],"x-xwires-access":"read","parameters":[{"name":"limit","in":"query","required":false,"description":"Сколько строк на странице, от 1 до 200.","schema":{"default":100,"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","required":false,"description":"next_cursor предыдущей страницы, с теми же фильтрами.","schema":{"type":"string","minLength":1,"maxLength":512}}],"responses":{"200":{"description":"Страница списка.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovedEmailsPage"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_cursor`: Курсор не подходит: он испорчен или получен с другими фильтрами. Начните список сначала, без cursor.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_cursor"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"addApprovedEmails","summary":"Добавить почты","description":"От 1 до 500 почт с планом, который оплачивает компания. Заказ этого плана от сотрудника с такой почтой входа или ChatGPT подтверждается сам; заказ, который уже ждёт, подтверждается сразу (approved_order_ids). Человеку, которого ещё нет в компании, уходит письмо. Почта с renews_monthly: true подтверждает заказ в режиме, который выбрал сотрудник, почта без согласия — разовым (renewal_mode once). Согласие записывается, только пока автопродление для компании открыто: записано ли оно, говорит renews_monthly ответа. Повтор безопасен: почты из списка и почты, которые уже подтвердили незавершённый заказ этого плана, считаются в skipped. В суточный лимит (5000 почт и приглашений через API) идёт каждая присланная почта.","tags":["Список почт"],"x-xwires-access":"manage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddApprovedEmailsRequest"}}}},"responses":{"200":{"description":"Что сделали почты.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddApprovedEmailsResult"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_plan`: Укажите план, который оплачивает компания: plus, pro100, pro200, pro500.\n\n`no_emails`: Пришлите хотя бы одну почту.\n\n`too_many_emails`: Не больше 500 почт в одном запросе.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_plan","no_emails","too_many_emails"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`api_email_quota_exceeded`: За сутки через API прислали 5000 почт и приглашений компании. Повторите позже или добавьте почты в кабинете.\n\n`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["api_email_quota_exceeded","rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/approved-emails/{id}":{"delete":{"operationId":"deleteApprovedEmail","summary":"Удалить почту из списка","description":"Почта больше не подтверждает заказы. Уже подтверждённые заказы остаются. Повтор — 404.","tags":["Список почт"],"x-xwires-access":"manage","parameters":[{"name":"id","in":"path","required":true,"description":"id почты в списке.","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Почта удалена.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`approved_email_not_found`: Почты с таким id в списке нет: её уже удалили, или она уже подтвердила заказ.","x-xwires-codes":["approved_email_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/invites":{"get":{"operationId":"listInvites","summary":"Приглашения","description":"Приглашения, которые ещё не приняли, по времени. Входил ли приглашённый в xWires, API не говорит.","tags":["Приглашения"],"x-xwires-access":"read","parameters":[{"name":"limit","in":"query","required":false,"description":"Сколько строк на странице, от 1 до 200.","schema":{"default":100,"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","required":false,"description":"next_cursor предыдущей страницы, с теми же фильтрами.","schema":{"type":"string","minLength":1,"maxLength":512}}],"responses":{"200":{"description":"Страница приглашений.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitesPage"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_cursor`: Курсор не подходит: он испорчен или получен с другими фильтрами. Начните список сначала, без cursor.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_cursor"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createInvite","summary":"Пригласить","description":"Приглашает почту входа человека с личной почтой: он станет сотрудником, приняв приглашение в кабинете. Заказ не подтверждает: для этого добавьте почту в список. Новое приглашение — 201 и письмо человеку, существующее — 200 без письма. Идёт в суточный лимит (5000 почт и приглашений через API).","tags":["Приглашения"],"x-xwires-access":"manage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteRequest"}}}},"responses":{"200":{"description":"Такое приглашение уже было.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResult"}}}},"201":{"description":"Новое приглашение.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResult"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_email`: Проверьте почту: нужен адрес вида name@example.ru.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_email"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`already_employee`: Человек с этой почтой уже сотрудник компании.","x-xwires-codes":["already_employee"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`api_email_quota_exceeded`: За сутки через API прислали 5000 почт и приглашений компании. Повторите позже или добавьте почты в кабинете.\n\n`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["api_email_quota_exceeded","rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/invites/{id}":{"delete":{"operationId":"revokeInvite","summary":"Отозвать приглашение","description":"Приглашение больше не действует. Повтор — 404.","tags":["Приглашения"],"x-xwires-access":"manage","parameters":[{"name":"id","in":"path","required":true,"description":"id приглашения.","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Приглашение отозвано.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`invite_not_found`: Приглашения с таким id нет: его уже отозвали или приняли.","x-xwires-codes":["invite_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/events":{"get":{"operationId":"listEvents","summary":"Лента событий","description":"Изменения заказов, сотрудников и подписок компании, те же, что приходят на вебхуки, по position. Храните next_after и спрашивайте after=<next_after> раз в 10–60 секунд или на каждый вебхук. after=0 — с самого старого хранимого события, after=latest — с текущего момента. 410 events_cursor_expired: событий сразу после этой позиции уже нет (они истекли, или базу xWires восстановили из копии): запросите after=latest и сохраните next_after, затем перечитайте списки и продолжайте с сохранённой позиции.","tags":["События"],"x-xwires-access":"read","parameters":[{"name":"after","in":"query","required":false,"description":"0 — с самого старого хранимого события, latest — только новые, число — после этой позиции (next_after).","schema":{"default":"0","type":"string","pattern":"^(latest|0|[1-9][0-9]{0,17})$"}},{"name":"types","in":"query","required":false,"description":"Типы событий через запятую; без него — все. Значения: order.awaiting_approval, order.approved, order.awaiting_check, order.scheduled, order.submitting, order.sent, order.succeeded, order.failed, order.review_required, order.rejected, order.cancelled, employee.joined, employee.left, employee.role_changed, subscription.activated, subscription.renewed, subscription.expired, subscription.auto_renewal_started, subscription.auto_renewal_stopped.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Сколько строк на странице, от 1 до 200.","schema":{"default":100,"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"Страница ленты.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsPage"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"`events_cursor_expired`: Событий сразу после этой позиции нет: мы храним их 30 дней, или ленту компании восстановили из резервной копии. Запросите after=latest и сохраните next_after, затем перечитайте списки и продолжайте с сохранённой позиции.","x-xwires-codes":["events_cursor_expired"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sandbox/employees":{"post":{"operationId":"createSandboxEmployee","summary":"Придуманный сотрудник","description":"Только в песочнице. Новый сотрудник компании с подпиской в статусе new на план из тела: событие employee.joined. Его почты под .invalid, войти за него нельзя. Его заказ — POST /sandbox/orders.","tags":["Песочница"],"x-xwires-access":"manage","x-xwires-sandbox-only":true,"servers":[{"url":"https://api.sandbox.xwires.ai/company/v1","description":"Песочница: тестовые данные, ключи xwc_test_…"}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSandboxEmployeeRequest"}}}},"responses":{"201":{"description":"Сотрудник.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.\n\n`invalid_plan`: Укажите план, который оплачивает компания: plus, pro100, pro200, pro500.","x-xwires-codes":["invalid_request","api_key_in_url","invalid_plan"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: Такого адреса в API нет: проверьте путь и метод.","x-xwires-codes":["not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sandbox/orders":{"post":{"operationId":"createSandboxOrder","summary":"Заказ сотрудника","description":"Только в песочнице. Сотрудник заказывает месяц подписки, как в своём кабинете: заказ awaiting_approval, или сразу approved, если его почта в списке компании. Активация для новой подписки, продление для активной или истёкшей. Подтверждённый заказ доводит до succeeded автопилот, если его не остановить (POST /sandbox/orders/{id}/advance).","tags":["Песочница"],"x-xwires-access":"manage","x-xwires-sandbox-only":true,"servers":[{"url":"https://api.sandbox.xwires.ai/company/v1","description":"Песочница: тестовые данные, ключи xwc_test_…"}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSandboxOrderRequest"}}}},"responses":{"201":{"description":"Заказ.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: Такого адреса в API нет: проверьте путь и метод.\n\n`employee_not_found`: Сотрудника с таким id в компании нет: возможно, он уже ушёл.","x-xwires-codes":["not_found","employee_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`membership_not_found`: У сотрудника нет подписки: заказ создаётся для придуманного сотрудника, POST /sandbox/employees.\n\n`open_order_exists`: У сотрудника уже есть открытый заказ: следите за ним в GET /orders?employee_id=… или в ленте событий. В песочнице его можно довести до конца (POST /sandbox/orders/{id}/advance) или создать другого сотрудника.","x-xwires-codes":["membership_not_found","open_order_exists"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sandbox/orders/{id}/advance":{"post":{"operationId":"advanceSandboxOrder","summary":"Перевести заказ","description":"Только в песочнице. Заказ идёт в статус to шаг за шагом, за сотрудника, оператора и партнёра, как в проде: approved → awaiting_check → scheduled → sent → succeeded или failed; review_required из scheduled, cancelled из awaiting_check и review_required, approved из awaiting_check. Каждый шаг — своё событие, без actor. Подтверждают и отклоняют заказ, как всегда, POST /orders/{id}/approve и /reject. После вызова автопилот этот заказ больше не трогает; to, равный нынешнему статусу, только останавливает его.","tags":["Песочница"],"x-xwires-access":"manage","x-xwires-sandbox-only":true,"servers":[{"url":"https://api.sandbox.xwires.ai/company/v1","description":"Песочница: тестовые данные, ключи xwc_test_…"}],"parameters":[{"name":"id","in":"path","required":true,"description":"id заказа.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvanceSandboxOrderRequest"}}}},"responses":{"200":{"description":"Заказ в новом статусе.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: Такого адреса в API нет: проверьте путь и метод.\n\n`order_not_found`: Заказа с таким id у компании нет.","x-xwires-codes":["not_found","order_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`sandbox_invalid_transition`: Из нынешнего статуса заказ в этот не перевести: подтверждает и отклоняет компания, а из succeeded, failed, rejected и cancelled дальше пути нет. Прочитайте заказ.","x-xwires-codes":["sandbox_invalid_transition"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sandbox/employees/{id}/expire-subscription":{"post":{"operationId":"expireSandboxSubscription","summary":"Завершить подписку","description":"Только в песочнице. Активная подписка сотрудника истекает сейчас: событие subscription.expired. Его следующий заказ — продление. Тело пустое или {}.","tags":["Песочница"],"x-xwires-access":"manage","x-xwires-sandbox-only":true,"servers":[{"url":"https://api.sandbox.xwires.ai/company/v1","description":"Песочница: тестовые данные, ключи xwc_test_…"}],"parameters":[{"name":"id","in":"path","required":true,"description":"id сотрудника.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Сотрудник с истёкшей подпиской.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee"}}}},"400":{"description":"`invalid_request`: Запрос не прошёл проверку: details.issues называет поля и что с ними не так.\n\n`api_key_in_url`: Ключ API передан в адресе запроса, а адреса попадают в логи. Отзовите этот ключ в кабинете и передавайте новый только в заголовке Authorization: Bearer.","x-xwires-codes":["invalid_request","api_key_in_url"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`invalid_api_key`: Ключ API не подходит: передайте его в заголовке Authorization: Bearer xwc_….\n\n`api_key_revoked`: Ключ API отозван. Выпустите новый в кабинете: Компания → Интеграции.","x-xwires-codes":["invalid_api_key","api_key_revoked"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`api_key_read_only`: Ключ API только для чтения: для этого запроса нужен ключ с правом действий.","x-xwires-codes":["api_key_read_only"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: Такого адреса в API нет: проверьте путь и метод.\n\n`employee_not_found`: Сотрудника с таким id в компании нет: возможно, он уже ушёл.","x-xwires-codes":["not_found","employee_not_found"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"`request_timeout`: Тело запроса не пришло целиком за 10 секунд. Повторите запрос.","x-xwires-codes":["request_timeout"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"`subscription_not_active`: Подписка сотрудника не активна: завершить нечего.","x-xwires-codes":["subscription_not_active"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large`: Тело запроса больше 256 КБ.","x-xwires-codes":["payload_too_large"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type`: Тело запроса должно быть JSON с Content-Type: application/json.","x-xwires-codes":["unsupported_media_type"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: Слишком много запросов с этим ключом: не больше 60 в минуту и 2 одновременно. Повторите после Retry-After.","x-xwires-codes":["rate_limited"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal_error`: Внутренняя ошибка xWires. Прочитайте данные GET-запросом и повторите; если ошибка не проходит, напишите в поддержку с request_id.","x-xwires-codes":["internal_error"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`service_unavailable`: xWires сейчас не может ответить. Повторите через секунду: запрос можно безопасно повторить.","x-xwires-codes":["service_unavailable"],"headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"xwc_ и 64 шестнадцатеричных символа; в песочнице xwc_test_ и 64","description":"Ключ компании из кабинета: Компания → Интеграции."}},"headers":{"X-Request-Id":{"description":"id запроса: назовите его поддержке.","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Сколько запросов с ключа можно за минуту.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Сколько из них осталось в этой минуте.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Через сколько секунд минута начнётся заново.","schema":{"type":"integer"}},"Retry-After":{"description":"Через сколько секунд повторить.","schema":{"type":"integer"}}},"schemas":{"Me":{"type":"object","properties":{"key":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id ключа: его же несут actor.api_key_id событий и approved_by_api_key_id заказов, которые он подтвердил."},"name":{"type":"string","description":"Название, которое дал ключу админ."},"access":{"type":"string","x-extensible-enum":["read","manage"],"description":"read: только чтение; manage: чтение и действия."},"last4":{"type":"string","pattern":"^[0-9a-f]{4}$","description":"Последние 4 символа ключа: в кабинете он показан как xwc_…last4."},"created_at":{"type":"string","format":"date-time","description":"Когда ключ выпустили."}},"required":["id","name","access","last4","created_at"]},"company":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id компании."},"name":{"type":"string","description":"Название компании."}},"required":["id","name"]}},"required":["key","company"],"description":"Ключ, которым сделан запрос, и его компания."},"AutoRenewal":{"type":"object","properties":{"state":{"type":"string","x-extensible-enum":["on","needs_session","in_progress","attention","off"],"description":"on: включено; off: выключено или не включалось; needs_session, in_progress, attention — появятся вместе с самими продлениями: нужен новый session, продлеваем, на разборе у xWires. Незнакомое значение считайте включённым."},"next_renewal_at":{"nullable":true,"type":"string","format":"date-time","description":"Когда подписка продлится; null, если автопродление выключено."},"stop_reason":{"nullable":true,"description":"Почему выключено: user — сотрудник, company_admin — админ компании, api_key — система компании, operator — оператор xWires, offboarded — сотрудник ушёл, payer_changed — сменился плательщик. null, если включено или не включалось.","type":"string","x-extensible-enum":["user","company_admin","api_key","operator","offboarded","payer_changed"]},"can_stop":{"type":"boolean","description":"Компания может отключить его (stopAutoRenewal): оно включено, и платит она."}},"required":["state","next_renewal_at","stop_reason","can_stop"],"description":"Автопродление подписки: каждый месяц её продлевает сам OpenAI за счёт плательщика, пока его не отключат."},"Subscription":{"type":"object","properties":{"chatgpt_email":{"type":"string","description":"Почта ChatGPT-аккаунта, который пополняется."},"plan":{"type":"string","x-extensible-enum":["plus","pro100","pro200","pro500"],"description":"План подписки."},"status":{"type":"string","x-extensible-enum":["new","processing","active","expired","cancelled"],"description":"new: план выбран, ещё не оплачен; processing: заказ у партнёра; active: действует; expired: срок прошёл; cancelled: отказ."},"expires_at":{"nullable":true,"type":"string","format":"date-time","description":"До какого момента оплачена; null, пока её ни разу не активировали."},"auto_renewal":{"$ref":"#/components/schemas/AutoRenewal"}},"required":["chatgpt_email","plan","status","expires_at","auto_renewal"],"description":"Подписка ChatGPT сотрудника."},"Employee":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id сотрудника."},"email":{"type":"string","description":"Почта, с которой он входит в xWires."},"name":{"nullable":true,"description":"Имя, если сотрудник его указал.","type":"string"},"role":{"type":"string","x-extensible-enum":["employee","admin"],"description":"employee или admin."},"subscription":{"nullable":true,"description":"Подписка; null, пока сотрудник не выбрал план и ChatGPT-аккаунт.","allOf":[{"$ref":"#/components/schemas/Subscription"}]}},"required":["id","email","name","role","subscription"],"description":"Текущий пользователь компании, админ тоже."},"OrderEmployee":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id сотрудника."},"email":{"type":"string","description":"Почта входа."},"name":{"nullable":true,"description":"Имя, если указано.","type":"string"},"chatgpt_email":{"type":"string","description":"Почта ChatGPT-аккаунта подписки."}},"required":["id","email","name","chatgpt_email"],"description":"Сотрудник, чей это заказ, пока он в компании."},"Order":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id заказа."},"status":{"type":"string","x-extensible-enum":["awaiting_approval","approved","awaiting_check","scheduled","submitting","sent","review_required","succeeded","failed","rejected","cancelled"],"description":"Статус. Может вернуться назад: failed → sent, awaiting_check → approved, review_required → approved. Незнакомый статус считайте заказом в работе."},"is_open":{"type":"boolean","description":"Заказ ещё не завершён: у сотрудника не может быть второго открытого."},"kind":{"type":"string","x-extensible-enum":["activation","renewal"],"description":"activation: первый месяц; renewal: продление."},"plan":{"type":"string","x-extensible-enum":["plus","pro100","pro200","pro500"],"description":"План."},"renewal_mode":{"type":"string","x-extensible-enum":["monthly","once"],"description":"monthly: подписка будет продлеваться каждый месяц за счёт компании, пока её не отключат; once: оплачивается один месяц. Пока заказ ждёт подтверждения — выбор сотрудника; после подтверждения — выбор компании (renewal в approveOrder); окончательный — с awaiting_check: monthly, только если и сотрудник согласился на продление, присылая session, иначе once."},"origin":{"type":"string","x-extensible-enum":["manual","auto_renewal"],"description":"manual: заказ оформили сотрудник, компания или оператор; auto_renewal: продление по автопродлению."},"created_at":{"type":"string","format":"date-time","description":"Когда заказ создан."},"updated_at":{"type":"string","format":"date-time","description":"Последнее изменение: по нему идут список и фильтр updated_since."},"approved_at":{"nullable":true,"type":"string","format":"date-time","description":"Когда подтверждён; null, пока нет."},"approved_by_operator":{"type":"boolean","description":"Подтвердил оператор xWires за компанию."},"approved_via":{"nullable":true,"description":"Кто подтвердил, кнопкой или почтой из списка: company_admin, operator или api_key; null, пока никто.","type":"string","x-extensible-enum":["company_admin","operator","api_key"]},"approved_by_api_key_id":{"nullable":true,"type":"string","format":"uuid","description":"Ключ, который подтвердил заказ или добавил почту, которая его подтвердила."},"scheduled_for":{"nullable":true,"type":"string","format":"date-time","description":"Когда заказ уйдёт партнёру; null, пока не назначено."},"completed_at":{"nullable":true,"type":"string","format":"date-time","description":"Когда партнёр выполнил заказ (succeeded) или отказал в нём (failed); null у остальных статусов, также у rejected и cancelled. Закрыт ли заказ, показывает is_open."},"employee":{"nullable":true,"description":"null, если сотрудник уже ушёл из компании.","allOf":[{"$ref":"#/components/schemas/OrderEmployee"}]}},"required":["id","status","is_open","kind","plan","renewal_mode","origin","created_at","updated_at","approved_at","approved_by_operator","approved_via","approved_by_api_key_id","scheduled_for","completed_at","employee"],"description":"Заказ на месяц подписки, который оплачивает компания."},"ApprovedEmail":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id почты в списке."},"email":{"type":"string","description":"Почта, в нижнем регистре."},"plan":{"nullable":true,"description":"План, заказ которого она подтверждает; null — любой (почты, добавленные до планов).","type":"string","x-extensible-enum":["plus","pro100","pro200","pro500"]},"renews_monthly":{"type":"boolean","description":"Почта несёт согласие компании, что подписка будет продлеваться каждый месяц за её счёт: она подтверждает заказ в режиме, который выбрал сотрудник, почта без согласия — разовым."},"created_at":{"type":"string","format":"date-time","description":"Когда добавлена."},"added_by_operator":{"type":"boolean","description":"Добавил оператор xWires."}},"required":["id","email","plan","renews_monthly","created_at","added_by_operator"],"description":"Почта из списка компании, ещё не подтвердившая заказ."},"Invite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id приглашения."},"email":{"type":"string","description":"Приглашённая почта входа, в нижнем регистре."},"created_at":{"type":"string","format":"date-time","description":"Когда приглашён."}},"required":["id","email","created_at"],"description":"Приглашение, которое ещё не приняли."},"EmployeesPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Employee"}},"next_cursor":{"nullable":true,"description":"Передайте его в cursor, чтобы получить следующую страницу; null — страниц больше нет.","type":"string"}},"required":["data","next_cursor"],"description":"Страница сотрудников, по id."},"OrdersPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Order"}},"next_cursor":{"nullable":true,"description":"Передайте его в cursor, чтобы получить следующую страницу; null — страниц больше нет.","type":"string"}},"required":["data","next_cursor"],"description":"Страница заказов, по updated_at и id."},"ApprovedEmailsPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApprovedEmail"}},"next_cursor":{"nullable":true,"description":"Передайте его в cursor, чтобы получить следующую страницу; null — страниц больше нет.","type":"string"}},"required":["data","next_cursor"],"description":"Страница списка почт, по created_at и id."},"InvitesPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Invite"}},"next_cursor":{"nullable":true,"description":"Передайте его в cursor, чтобы получить следующую страницу; null — страниц больше нет.","type":"string"}},"required":["data","next_cursor"],"description":"Страница приглашений, по created_at и id."},"AddApprovedEmailsResult":{"type":"object","properties":{"approved":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Сколько почт сразу подтвердили ждущий заказ."},"remembered":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Сколько почт добавлены в список и ждут заказа."},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Сколько уже были в списке, уже подтвердили незавершённый заказ этого плана или повторялись в запросе."},"invalid":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Сколько не похожи на почту."},"approved_order_ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Заказы, которые подтвердились сразу."},"renews_monthly":{"type":"boolean","description":"Почты запроса несут согласие на ежемесячное продление. false при renews_monthly: true в запросе — автопродление для компании пока закрыто, и согласие не записано."}},"required":["approved","remembered","skipped","invalid","approved_order_ids","renews_monthly"],"description":"Что сделали присланные почты."},"InviteResult":{"type":"object","properties":{"invite":{"$ref":"#/components/schemas/Invite"},"created":{"type":"boolean","description":"true: новое, человеку ушло письмо; false: такое приглашение уже было."}},"required":["invite","created"],"description":"Приглашение и создано ли оно этим запросом."},"OrderSubscriptionResult":{"type":"object","properties":{"outcome":{"type":"string","x-extensible-enum":["ordered","invited"],"description":"ordered (201): заказ создан и ждёт проверки xWires; invited (202): человек не в компании, ему ушло приглашение, почта добавлена в список с планом, session не сохранён."},"account_created":{"type":"boolean","description":"true: учётную запись xWires для этой почты создал этот запрос; у invited всегда false."},"order":{"nullable":true,"description":"Заказ; null у invited.","allOf":[{"$ref":"#/components/schemas/Order"}]}},"required":["outcome","account_created","order"],"description":"Что сделал запрос: заказ сотрудника или приглашение человеку вне компании."},"OffboardResult":{"type":"object","properties":{"employee_id":{"type":"string","format":"uuid","description":"id ушедшего сотрудника."},"cancelled_order_ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Заказы за счёт компании, отменённые потому, что ещё не ушли партнёру."}},"required":["employee_id","cancelled_order_ids"],"description":"Сотрудник ушёл; какие его заказы отменены."},"EventActor":{"type":"object","properties":{"api_key_id":{"type":"string","format":"uuid"}},"required":["api_key_id"],"description":"Ключ компании, чей запрос к API вызвал событие; null — кто угодно другой: админ, сотрудник, xWires. Сравните с key.id из GET /me, чтобы узнать свои действия."},"OrderEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id события; он же заголовок webhook-id: повторы отбрасывайте по нему."},"timestamp":{"type":"string","format":"date-time","description":"Когда это случилось."},"position":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991,"description":"Номер события в компании, без пропусков по всем типам; в одном изменении номера могут идти не подряд."},"company_id":{"type":"string","format":"uuid","description":"id компании."},"actor":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EventActor"}]},"type":{"type":"string","x-extensible-enum":["order.awaiting_approval","order.approved","order.awaiting_check","order.scheduled","order.submitting","order.sent","order.succeeded","order.failed","order.review_required","order.rejected","order.cancelled"]},"data":{"type":"object","properties":{"order_id":{"type":"string","format":"uuid","description":"id заказа: подробности — GET /orders/{id}."},"status":{"type":"string","x-extensible-enum":["awaiting_approval","approved","awaiting_check","scheduled","submitting","sent","review_required","succeeded","failed","rejected","cancelled"],"description":"Статус после изменения."},"previous_status":{"nullable":true,"description":"Статус до; null, если заказ только что стал заказом компании.","type":"string","x-extensible-enum":["awaiting_approval","approved","awaiting_check","scheduled","submitting","sent","review_required","succeeded","failed","rejected","cancelled"]},"kind":{"type":"string","x-extensible-enum":["activation","renewal"]},"plan":{"type":"string","x-extensible-enum":["plus","pro100","pro200","pro500"]},"renewal_mode":{"type":"string","x-extensible-enum":["monthly","once"],"description":"Режим продления после изменения, как renewal_mode в Order."},"employee_id":{"nullable":true,"type":"string","format":"uuid","description":"Сотрудник; null, если он уже ушёл из компании."},"approved_via":{"nullable":true,"description":"Кто подтвердил заказ, как в Order.","type":"string","x-extensible-enum":["company_admin","operator","api_key"]},"approved_by_api_key_id":{"nullable":true,"type":"string","format":"uuid","description":"Ключ, который подтвердил заказ или добавил подтвердившую его почту."}},"required":["order_id","status","previous_status","kind","plan","renewal_mode","employee_id","approved_via","approved_by_api_key_id"]}},"required":["id","timestamp","position","company_id","actor","type","data"],"description":"order.<status>: заказ компании перешёл в статус status."},"EmployeeEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id события; он же заголовок webhook-id: повторы отбрасывайте по нему."},"timestamp":{"type":"string","format":"date-time","description":"Когда это случилось."},"position":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991,"description":"Номер события в компании, без пропусков по всем типам; в одном изменении номера могут идти не подряд."},"company_id":{"type":"string","format":"uuid","description":"id компании."},"actor":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EventActor"}]},"type":{"type":"string","x-extensible-enum":["employee.joined","employee.left","employee.role_changed"]},"data":{"type":"object","properties":{"employee_id":{"type":"string","format":"uuid","description":"id сотрудника."},"role":{"type":"string","x-extensible-enum":["employee","admin"],"description":"Роль после изменения; у ушедшего — роль, с которой он ушёл."},"previous_role":{"description":"Роль до; только у employee.role_changed.","nullable":true,"type":"string","x-extensible-enum":["employee","admin"]}},"required":["employee_id","role"]}},"required":["id","timestamp","position","company_id","actor","type","data"],"description":"employee.joined, employee.left, employee.role_changed: человек пришёл в компанию, ушёл или сменил роль."},"SubscriptionEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id события; он же заголовок webhook-id: повторы отбрасывайте по нему."},"timestamp":{"type":"string","format":"date-time","description":"Когда это случилось."},"position":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991,"description":"Номер события в компании, без пропусков по всем типам; в одном изменении номера могут идти не подряд."},"company_id":{"type":"string","format":"uuid","description":"id компании."},"actor":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EventActor"}]},"type":{"type":"string","x-extensible-enum":["subscription.activated","subscription.renewed","subscription.expired","subscription.auto_renewal_started","subscription.auto_renewal_stopped"]},"data":{"type":"object","properties":{"employee_id":{"type":"string","format":"uuid","description":"id сотрудника."},"status":{"type":"string","x-extensible-enum":["new","processing","active","expired","cancelled"],"description":"Статус подписки после изменения."},"previous_status":{"nullable":true,"description":"Статус до.","type":"string","x-extensible-enum":["new","processing","active","expired","cancelled"]},"plan":{"type":"string","x-extensible-enum":["plus","pro100","pro200","pro500"]},"expires_at":{"nullable":true,"type":"string","format":"date-time","description":"До какого момента оплачена."},"stop_reason":{"description":"Только у subscription.auto_renewal_stopped: почему выключено, как stop_reason в AutoRenewal.","type":"string","x-extensible-enum":["user","company_admin","api_key","operator","offboarded","payer_changed"]}},"required":["employee_id","status","previous_status","plan","expires_at"]}},"required":["id","timestamp","position","company_id","actor","type","data"],"description":"subscription.activated, subscription.renewed, subscription.expired, subscription.auto_renewal_started, subscription.auto_renewal_stopped: подписка сотрудника, который сейчас в компании."},"UnknownEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id события; он же заголовок webhook-id: повторы отбрасывайте по нему."},"timestamp":{"type":"string","format":"date-time","description":"Когда это случилось."},"position":{"nullable":true,"description":"Номер события в компании; null — у события только для вебхуков, как у webhook.test.","type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991},"company_id":{"type":"string","format":"uuid","description":"id компании."},"actor":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EventActor"}]},"type":{"type":"string","description":"Тип события."},"data":{"type":"object","additionalProperties":{},"description":"Данные события, свои у каждого типа."}},"required":["id","timestamp","position","company_id","actor","type","data"],"description":"Событие типа, которого в этом описании ещё нет: в v1 типы только добавляются. Конверт тот же, что у других событий; такое событие пропустите."},"Event":{"description":"Событие компании: в ленте GET /events и в теле вебхука. Незнакомые типы и поля пропускайте.","anyOf":[{"$ref":"#/components/schemas/OrderEvent"},{"$ref":"#/components/schemas/EmployeeEvent"},{"$ref":"#/components/schemas/SubscriptionEvent"},{"$ref":"#/components/schemas/UnknownEvent"}]},"WebhookTestEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"id тестовой отправки; он же webhook-id."},"type":{"type":"string","x-extensible-enum":["webhook.test"]},"timestamp":{"type":"string","format":"date-time","description":"Когда отправлено."},"position":{"type":"string","nullable":true,"x-extensible-enum":[]},"company_id":{"type":"string","format":"uuid","description":"id компании."},"actor":{"type":"string","nullable":true,"x-extensible-enum":[]},"data":{"type":"object","properties":{"endpoint_id":{"type":"string","format":"uuid","description":"Адрес вебхука, который проверяли."}},"required":["endpoint_id"]}},"required":["id","type","timestamp","position","company_id","actor","data"],"description":"webhook.test: тестовое событие, которое админ отправил из кабинета. Только в вебхуках, не в ленте."},"WebhookEvent":{"description":"Тело вебхука: событие компании или тестовое.","anyOf":[{"$ref":"#/components/schemas/OrderEvent"},{"$ref":"#/components/schemas/EmployeeEvent"},{"$ref":"#/components/schemas/SubscriptionEvent"},{"$ref":"#/components/schemas/WebhookTestEvent"},{"$ref":"#/components/schemas/UnknownEvent"}]},"EventsPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"next_after":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Передайте его в after следующего запроса. Без новых событий он равен последней позиции компании."},"has_more":{"type":"boolean","description":"true: за next_after уже есть события, спросите сразу."}},"required":["data","next_after","has_more"],"description":"Страница ленты событий, по position."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["invalid_request","invalid_session","invalid_cursor","api_key_in_url","not_found","request_timeout","payload_too_large","unsupported_media_type","rate_limited","internal_error","service_unavailable","invalid_api_key","api_key_revoked","api_key_read_only","invalid_email","invalid_plan","session_token_required","session_expires_too_soon","no_emails","too_many_emails","order_not_found","employee_not_found","approved_email_not_found","invite_not_found","order_not_awaiting_approval","already_employee","open_order_exists","chatgpt_email_taken","chatgpt_email_mismatch","plan_mismatch","auto_renewal_not_on","auto_renewal_on","auto_renewal_closed","cannot_offboard_admin","events_cursor_expired","api_email_quota_exceeded","membership_not_found","sandbox_invalid_transition","subscription_not_active"]},"message":{"type":"string","description":"Что случилось и что делать, по-русски."},"request_id":{"type":"string","format":"uuid","description":"Он же заголовок X-Request-Id: назовите его поддержке."},"details":{"description":"У invalid_request: какие поля не прошли проверку; у invalid_session: path session и причина. Значения не повторяются.","type":"object","properties":{"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","description":"Поле, через точку; пусто — весь запрос."},"issue":{"type":"string","description":"Код проблемы zod (invalid_type, too_big, unrecognized_keys…) или у invalid_session — причина: too_large, wrong_shape, email_mismatch, expired."}},"required":["path","issue"]}}},"required":["issues"]}},"required":["code","message","request_id"]}},"required":["error"],"description":"Ошибка. Решения принимайте по code; message — для человека."},"SearchEmployeesRequest":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"description":"Почта входа или ChatGPT-аккаунта, в любом регистре."}},"required":["email"],"additionalProperties":false,"description":"Почта для поиска."},"AddApprovedEmailsRequest":{"type":"object","properties":{"emails":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","maxLength":320},"description":"Почты входа или ChatGPT-аккаунтов сотрудников, в любом регистре; повторы считаются в skipped."},"plan":{"type":"string","enum":["plus","pro100","pro200","pro500"],"description":"План: почта подтверждает заказ только этого плана."},"renews_monthly":{"description":"Компания согласна, что подписка, которую подтвердит почта, будет продлеваться каждый месяц за её счёт, пока её не отключат. Почта с согласием подтверждает заказ в режиме, который выбрал сотрудник, без него — разовым. Согласие записывается, только пока автопродление для компании открыто: записано ли оно, говорит renews_monthly ответа.","type":"boolean"}},"required":["emails","plan"],"additionalProperties":false,"description":"Почты и план, который оплачивает компания."},"CreateInviteRequest":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"description":"Почта, с которой человек входит или войдёт в xWires."}},"required":["email"],"additionalProperties":false,"description":"Почта, которую пригласить."},"ApproveOrderRequest":{"type":"object","properties":{"renewal":{"description":"monthly — компания согласна, что подписка будет продлеваться каждый месяц за её счёт, пока её не отключат; once — разовая активация. Без поля — once, что бы ни выбрал сотрудник. monthly — только пока автопродление для компании открыто, иначе 409 auto_renewal_closed. Окончательно заказ станет monthly, когда сотрудник согласится на продление, присылая session.","type":"string","enum":["monthly","once"]}},"additionalProperties":false,"description":"Подтверждение заказа; тело может быть пустым."},"OrderSubscriptionRequest":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"description":"Почта, с которой человек входит или войдёт в xWires, в любом регистре."},"plan":{"type":"string","enum":["plus","pro100","pro200","pro500"],"description":"План, который оплачивает компания."},"session":{"type":"object","additionalProperties":{},"description":"Ответ https://chatgpt.com/api/auth/session целиком, JSON-объектом: его открывает сотрудник, войдя в свой ChatGPT-аккаунт. Почта аккаунта берётся из него. Мы храним его зашифрованным и передаём только партнёру, который оплачивает подписку."},"name":{"description":"Имя для учётной записи, если её ещё нет; имя существующей не меняется.","type":"string","minLength":1,"maxLength":100},"renewal":{"description":"monthly — компания согласна, что подписка будет продлеваться каждый месяц за её счёт, пока её не отключат, а сотрудник — что для этого хранится его session; once — разовая активация. Без поля — once. monthly — только пока автопродление для компании открыто, иначе 409 auto_renewal_closed.","type":"string","enum":["monthly","once"]}},"required":["email","plan","session"],"additionalProperties":false,"description":"Сотрудник, план и session его ChatGPT-аккаунта."},"CreateSandboxEmployeeRequest":{"type":"object","properties":{"name":{"description":"Имя; без него — одно из придуманных.","type":"string","minLength":1,"maxLength":100},"plan":{"type":"string","enum":["plus","pro100","pro200","pro500"],"description":"План его подписки: его заказы будут на этот план."}},"required":["plan"],"additionalProperties":false,"description":"Придуманный сотрудник песочницы."},"CreateSandboxOrderRequest":{"type":"object","properties":{"employee_id":{"type":"string","format":"uuid","description":"id сотрудника с подпиской и без открытого заказа."}},"required":["employee_id"],"additionalProperties":false,"description":"Чей заказ."},"AdvanceSandboxOrderRequest":{"type":"object","properties":{"to":{"type":"string","enum":["awaiting_approval","approved","awaiting_check","scheduled","submitting","sent","review_required","succeeded","failed","rejected","cancelled"],"description":"Статус, в который заказ придёт шаг за шагом: approved, awaiting_check, scheduled, sent, review_required, succeeded, failed или cancelled. Нынешний статус только останавливает автопилот."}},"required":["to"],"additionalProperties":false,"description":"Куда перевести заказ."}}}}