Хранение и уничтожение данных
Максимальные сроки хранения на платформе, сокращение сроков и его влияние на существующие данные, уничтожение содержимого задачи и пределы наших гарантий.
Хранение имеет два уровня. Максимальный срок платформы — публичное обязательство, а не внутренний параметр настройки. В этих пределах вы можете задать собственные, более короткие сроки и в любой момент уничтожить содержимое отдельной задачи.
Соотношение двух уровней простое: срок можно только сократить; никакая ваша настройка не увеличивает максимальный срок.
Как долго мы храним данные: максимальные сроки платформы
| Данные | Максимальный срок платформы | После истечения |
|---|---|---|
| Созданные файлы: изображения, видео и аудио | Около 14 дней | Удаляются из объектного хранилища |
| Медиа короткометражных фильмов: изображения сцен, видео и озвучка, созданные в проекте короткометражного фильма Spicy Studio, а также экспортированные фильмы | Около 60 дней | Удаляются из объектного хранилища |
| Загруженные референсные изображения | 1 день | URI spicy:// истекает в момент expiresAt из ответа подтверждения загрузки; после этого объект удаляется |
Содержимое задачи: промпты и параметры в input, ссылки на результаты в output | 30 дней | Оба поля очищаются; сама запись задачи сохраняется |
| Библиотека ассетов (файлы, которые вы сохранили намеренно) | Пока вы их не удалите | Удаляются, когда вы удаляете ассет или владелец закрывает аккаунт; командная библиотека удаляется вместе с командой. См. Медиа |
| Записи задач: ID задачи, модель, состояние, сумма и время; без какого-либо содержимого | Бессрочно | Не удаляются: это доказательства для споров о начислениях |
| Журналы и события задач: переходы состояний, записи доставки вебхуков | Не менее 60 дней: месячные разделы, поэтому фактически 2–3 месяца | Удаляются |
| Записи баланса и финансового журнала | 10 лет | Сохраняются для истории аккаунта, сверки и разрешения споров; подробнее ниже |
| Аудиторские записи | 2 года | Удаляются согласно политике после проверки целостности |
| Открытые IP / UA в записях безопасности | 90 дней | Заменяются версионированными HMAC-псевдонимами; это не анонимизация |
| Резервные копии базы данных | 35 дней | Обновляются по циклу; удаление в приложении не удаляет резервные копии немедленно |
Первые четыре строки можно сократить с помощью четырёх отдельных сроков ниже: созданные результаты, включая медиа и данные результата, медиа короткометражных фильмов, текст промптов и загруженные файлы.
У медиа короткометражных фильмов срок больше, потому что фильм в Spicy Studio создаётся днями или неделями: сцена первой недели должна оставаться доступной при экспорте всего фильма. Это относится только к задачам, запущенным в проекте короткометражного фильма Studio. Та же модель через API, SDK или playground сохраняет предел в 14 дней, а текст промпта в любом случае — 30 дней. Остальные сроки являются обязательствами платформы или требованиями закона и не меняются вашими настройками.
Эти сроки задаются настройками сервера, а не жёстко прописанными константами
В таблице указаны действующие максимальные сроки, которые также являются значениями по умолчанию: если ничего не настраивать, поведение остаётся прежним. Операционная команда может менять их, поскольку требования разных юрисдикций меняются. Но любое такое изменение рассматривается как изменение требований соблюдения правил: эта страница и фактическое удаление должны оставаться согласованными.
Если вам нужен иной срок хранения, закреплённый в договоре, обсудите его до подписания, не делая выводов только по этой странице.
Срок действия URI загрузки не означает завершение удаления объекта
URI spicy://, возвращённый при подтверждении загрузки, действует только до expiresAt в ответе; по умолчанию это 1 день после успешного подтверждения. В этот момент URI сразу становится недопустимым для новых задач. Сам объект удаляет проход очистки; крайний резервный механизм может отставать до 24 часов, но это не продлевает срок использования URI.
Почему «около 14 дней», а не «ровно 14 дней»
Крайний механизм истечения срока — правило жизненного цикла объектного хранилища. Согласно его официальному поведению, объекты удаляются в течение 24 часов после истечения срока. Обещать ровное число дней, фактически удаляя через 14 дней плюс ещё до суток, было бы заведомо неверно, поэтому мы пишем «около».
То же относится к коротким срокам, которые вы задаёте сами. При сроке в один час очистка обычно завершается за несколько минут после его истечения, но мы всё равно пишем «около часа» или «не позднее», а не обещаем точную секунду.
Скачивайте всё, что хотите сохранить. После окончания срока выдать ссылку на скачивание нельзя, хотя запись задачи по-прежнему доступна для запроса, а движения баланса видны в истории начислений.
Четыре срока, настраиваемые отдельно
Они отвечают на четыре разных вопроса, а не на один вопрос с четырьмя настройками. Ниже приведены названия, показанные в консоли:
| Срок | Что охватывает | По умолчанию: предел платформы | Варианты |
|---|---|---|---|
| Готовые результаты | Созданные изображения, видео, аудио и данные результата | Около 14 дней | 1 час / 6 часов / 24 часа / 7 дней / 14 дней |
| Материалы коротких фильмов | Медиа проекта короткометражного фильма Spicy Studio и экспортированные фильмы | Около 60 дней | 1 час / 24 часа / 7 дней / 14 дней / 30 дней / 60 дней |
| Текст промптов | Текст запроса: промпт и текстовые поля в input | 30 дней | Как у результатов / 1 час / 24 часа / 7 дней / 30 дней |
| Загруженные файлы | Загруженные вами файлы для использования в качестве референсов | 1 день | Удалять после завершения задачи / 1 час / 24 часа |
Настройте их в разделе Хранение страницы Защита данных консоли. При принятии задачи ей назначаются собственные моменты истечения срока для результатов и промпта на основе этих настроек и заголовка ниже; они доступны в retention ответа recordInfo.
«Удалять после завершения задачи» означает, что загруженный файл удаляется, когда все использующие его задачи достигнут конечного состояния: succeeded / failed / canceled / expired. Обычно это происходит в течение минуты, а не при создании задачи, потому что файл нужен для повторной попытки. Учтите последствия заранее: для повторной генерации с тем же изображением его придётся загрузить заново, а повторная попытка задачи завершится неудачей.
Как изменение настройки влияет на существующие данные
Изменение срока не сводится к переключению «с этого момента». Некоторые изменения затрагивают уже выполненные задачи, другие — нет. Сейчас это работает так:
| Изменение | Влияние на существующие задачи и файлы |
|---|---|
| Текст промптов на 1 час или 24 часа | При следующем проходе очистки, обычно в течение нескольких минут, каждая задача, завершившаяся более суток назад, лишается текста промпта и созданных результатов и файлов, даже если для Готовые результаты всё ещё указано 14 дней. Затем то же происходит с каждой задачей через сутки после завершения, если другое правило не удалит данные раньше. |
| Текст промптов на 7 дней | То же самое, но с периодом 7 дней вместо суток. |
| Готовые результаты на более короткий срок, когда Текст промптов задан как Как у результатов | То же, что установка такого срока для Текст промптов: 7 дней затрагивают задачи старше 7 дней, а 1 час, 6 часов или 24 часа — старше суток. |
| Готовые результаты на более короткий срок, когда Текст промптов имеет отдельное значение | Для уже выполненных задач ничего не меняется: каждая сохраняет срок результата, назначенный при принятии. Новые задачи используют сокращённый срок. |
| Загруженные файлы на Удалять по завершении задачи | Применяется к файлам, существующим в момент сохранения настройки. Файлы, используемые только завершёнными задачами, удаляются примерно в течение минуты; остальные — когда завершатся использующие их задачи. Файлы, загруженные после сохранения настройки, пока сохраняют стандартный срок из ответа подтверждения загрузки. |
| Загруженные файлы на 1 час или 24 часа | Сейчас ничего не меняется: каждый загруженный файл остаётся пригодным до expiresAt из ответа подтверждения загрузки. |
| Любой срок на более длинный | Уже удалённое не возвращается, а существующие задачи сохраняют назначенные сроки. |
Почему некоторые изменения затрагивают прошлые задачи: собственные сроки задачи фиксируются при её принятии, но второй проход очистки работает с целыми днями. Он берёт настройку Текст промптов, округляет её вверх до 1, 7 или 30 дней и применяет ко всем завершённым задачам аккаунта. При очистке задачи удаляются вместе и текст промпта, и результаты.
На той же странице есть вторая карточка — Хранение содержимого задач, которая напрямую управляет очисткой по дням:
- Выбор 1 день или 7 дней очищает текст промптов, результаты и созданные файлы каждой задачи, завершившейся более соответствующего срока назад. Очистка продолжается для каждой задачи по достижении этого возраста.
- Включение Удалять вскоре после завершения очищает их для всех завершённых задач, включая задачи, выполненные до включения, примерно через час после завершения каждой.
- Обе карточки используют общие настройки: сохранение одной меняет показания другой.
Скачайте нужные результаты до сокращения любого срока
Более короткий срок может удалить результаты и промпты уже выполненных задач, а удалённое содержимое нельзя восстановить. Перед сохранением консоль показывает ожидаемое количество затронутых объектов. Считайте это предупреждением, а не точным списком удаляемого.
Сначала скачайте каждый результат, который хотите сохранить, затем сократите срок. Увеличение не требует такой осторожности: оно влияет только на будущее, а уже удалённое не возвращается.
Переопределение для отдельного запроса: X-Spicy-Retention
Если вы не хотите менять настройку аккаунта, а хотите раньше удалить только одну генерацию, передайте этот заголовок при создании задачи. Значение — целое число секунд; оно относится к файлам и промпту этой задачи:
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-H "X-Spicy-Retention: 3600" \
--data "$TASK_PAYLOAD"- Только сокращение. Действующее значение —
min(header, account setting, platform cap). Если администратор установил час для аккаунта, отдельный запрос не может вернуть 14 дней: иначе настройка аккаунта была бы лишь рекомендацией. 0допустим и означает удаление файлов сразу после достижения конечного состояния задачи.- Некорректное значение не вызывает отказ запроса. Отрицательное число ограничивается до
0, значение выше предела — до предела, а значение, не являющееся десятичным целым числом, игнорируется: применяется настройка аккаунта. Фактически применённое значение всегда указывается вretentionответаrecordInfo. Заголовок, запрашивающий лишь более осторожное хранение, не должен ломать генерацию. - Какие эндпоинты учитывают заголовок. Его читают
jobs/createTaskиjobs/stream.jobs/retryнаследует действующее значение исходной задачи и игнорирует заголовок: это вторая попытка того же действия, и возможность выбрать иной срок дала бы одной группе задач два разных срока истечения.jobs/quoteне читает его, поскольку не создаёт задачу.
recordInfo возвращает retention для каждой задачи. Сам ответ createTask его не включает, поэтому запросите значение после появления задачи:
{
"retention": {
"outputsExpireAt": "2026-09-13T12:00:00Z",
"promptsExpireAt": "2026-09-13T12:00:00Z",
"source": "header"
}
}source показывает определивший срок уровень: header — этот запрос, account — настройка аккаунта, platform — предел платформы. Если вы передали заголовок, но получили account, настройка аккаунта уже была короче запрошенного срока.
До завершения задачи outputsExpireAt отсчитывается от принятия; при достижении конечного состояния отсчёт переносится на момент завершения с тем же интервалом. Поэтому время может сдвигаться только позже, но не раньше. Доверяйте времени в ответе, а не пересчитывайте его самостоятельно: результат трёхуровневого ограничения не всегда совпадает с ожидаемым. Помимо вашего самостоятельного уничтожения, удалить содержимое раньше этих моментов может только настройка аккаунта, затрагивающая прошлые задачи, как описано выше.
Уничтожение содержимого по запросу: POST /jobs/purge
Если вы не хотите ждать истечения срока:
- В консоли откройте задачу в Логи и выберите Уничтожить результаты: это то же действие, что эндпоинт ниже.
- Удалить из истории для той же задачи также очищает её промпт и результат, ставит медиафайлы в очередь на удаление и дополнительно скрывает задачу из вашего журнала. Действие доступно после завершения задачи и окончательного расчёта стоимости.
Ни одно из действий не меняет начисленную сумму и не отменяет задачу. Вызов из кода:
curl -X POST https://api.spicyapi.ai/api/v1/jobs/purge \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
--data '{"taskId": "job_01k..."}'| Удаляется | Сохраняется |
|---|---|
| Сами объекты файлов результата | Финансовые записи и суммы |
Данные результата (output) | Состояние задачи и время |
Промпт и текст внутри input | Идентификатор модели и request_id |
Ответ:
{
"taskId": "job_01k...",
"contentState": "purged",
"purgedAt": "2026-09-13T12:00:00Z",
"contentRemovedBy": "user",
"billingRetained": true,
"mediaDeletionPending": true
}Несколько правил:
- Только задачи в конечном состоянии:
succeeded/failed/canceled/expired. Дождитесь завершения выполняющейся задачи: файлы ещё не получены, а частичное удаление хуже отсутствия удаления. Принятую задачу генерации нельзя отменить, поэтому пути «сначала отменить, затем уничтожить» нет. - Идемпотентно, без необходимости в
Idempotency-Key. Эндпоинт идемпотентен поtaskId: повторный вызов для уже уничтоженного содержимого всё равно возвращает 200, аpurgedAtсодержит время первого уничтожения, а не текущего вызова. Повтор после тайм-аута безопасен. - Ответ означает «запланировано», а не «уже удалено». Пока
mediaDeletionPendingравно true,contentStateуже имеет значениеpurged, но фоновая очистка ещё не завершила удаление объектов; обычно она заканчивается в течение минуты. При синхронном удалении один проблемный объект задерживал бы весь запрос именно тогда, когда вам нужен однозначный ответ. - Ответ со значением
presentозначает, что этот вызов ничего не удалил, например из-за обязательного сохранения данных задачи. Можно повторить позже; конкретная причина намеренно не раскрывается. billingRetainedвсегда равноtrue. Это кажется избыточным, но поле выделяет главное возможное заблуждение об этом эндпоинте; подробнее ниже.
Уничтожение не является отменой и не возвращает оплату
purge затрагивает только содержимое и ничего не меняет в расчётах:
- Окончательное начисление остаётся окончательным. Уничтожение файлов не возвращает деньги.
- Уже освобождённый резерв неудачных или просроченных задач остаётся освобождённым; уничтожение не освобождает его второй раз.
- Начисление по-прежнему видно на странице оплаты с суммой, временем и моделью.
Это намеренное разделение. Финансовые записи подтверждают операции для обеих сторон и хранятся по политике 10 лет; содержимое принадлежит вам и удаляется по вашему запросу. Это две категории данных, а не две стороны одного объекта.
Главное: уничтожение удаляет содержимое, но не запись о ваших расходах.
contentState: осталось ли содержимое и кто его удалил
В подробностях задачи есть contentState с тремя значениями:
| Значение | Смысл | Когда отображается |
|---|---|---|
present | Содержимое ещё существует | Обычное состояние; так же следует понимать старые задачи, созданные до появления поля |
expired | Автоматически удалено по истечении срока | Действующий срок хранения истёк и прошла очистка |
purged | Вы уничтожили содержимое | Вы вызвали jobs/purge или выбрали Уничтожить результаты |
Последние два значения сопровождаются purgedAt, временем удаления содержимого, и contentRemovedBy: system для очистки, user для вашего действия.
Слово `expired` встречается в двух местах с разным смыслом
- Состояние задачи
expired: время генерации истекло, она ничего не создала. contentStateсо значениемexpired: результат был создан, а затем удалён по вашим настройкам хранения.
В английском для них используется одно слово. Один ярлык «Истекло» в вашем интерфейсе смешивает две разные ситуации: в первой нужна повторная попытка, во второй никакое количество повторов не вернёт прежний результат.
Отображать purged как «истекло» неверно по той же причине: одно означает нажатие кнопки пользователем, другое — плановое действие политики. Если поменять смыслы, люди решат, что платформа потеряла их файлы.
По истечении срока очищаются поля, а не записи
Важны обе части этой фразы; одна первая часть вводит в заблуждение
Содержимое удаляется по окончании срока хранения; запись о начислении и состоянии, не содержащая самого содержимого, сохраняется бессрочно.
Только первая часть буквально верна, но создаёт неверное впечатление: исчезает содержимое input и output, а не запись задачи.
Очистка охватывает input, output, URL обратного вызова и связанное содержимое событий и обратных вызовов. Сама запись задачи сохраняется бессрочно: это единственное доказательство для спора о начислении, и её удаление нарушило бы учёт. После очистки остаются несколько сотен байт метаданных: ID задачи, модель, состояние, сумма, время и исходный ключ. Уничтожение по запросу следует тому же правилу; вы выбираете только момент.
После удаления содержимого:
- Вы можете узнать, сколько с вас списано за месяц, какие задачи завершились неудачей и какой ключ их отправил.
- Вы не можете узнать отправленный промпт или ключ объекта с файлом результата: с этого момента
recordInfoперестаёт возвращатьinputиoutput.
Если промпты нужны дольше, сохраняйте собственную копию. Действующее обязательное сохранение приостанавливает соответствующее удаление и блокирует уничтожение по запросу; ни один механизм не может восстановить уже физически удалённый результат.
История баланса отделена от содержимого задач
Очистка input и output задачи по истечении срока или по вашему запросу не меняет пополнения, резервы, окончательные начисления, возвращённые резервы или ручные корректировки. Эти движения баланса по-прежнему можно сверять на странице оплаты в консоли. Финансовые записи хранятся десять лет и не удаляются при истечении срока или уничтожении содержимого задачи.
Если запрос доступа или удаления затрагивает данные, которые нужно сохранить для спора, расследования безопасности или по закону, в ответе мы объясним объём и причину сохранения.
Две вещи, которые мы не можем сделать
1. Выполняющая запрос модель неизбежно видит промпт открытым текстом
Генерацию выполняет выбранная вами модель, и промпт должен поступить в неё открытым текстом. Это архитектурный предел, а не настройка: сокращение срока до часа ничего здесь не меняет. Поэтому наши сроки могут обещать только как долго данные хранит сама SpicyAPI.
Что происходит с промптом после его поступления в модель, наши настройки хранения не контролируют. Если это важно для вашего случая, свяжитесь с нами до отправки чувствительных материалов.
2. Мгновенного удаления не существует
Резервное правило жизненного цикла имеет окно выполнения до 24 часов, а резервные копии базы обновляются в течение 35 дней. Заявлять, что данные исчезают отовсюду мгновенно, неверно. Мы можем взять обязательство по сроку завершения удаления, но не по его мгновенности. Именно поэтому эндпоинт уничтожения отвечает «запланировано», а не «удалено».
Исключение: обязательное сохранение по юридическим основаниям
Задачи, затронутые спором, запросом на экспертизу или законной обязанностью предоставления отчётности, помещаются под обязательное сохранение; отсчёт срока останавливается до снятия этого требования. Пока оно действует, уничтожение по запросу не выполняется.
Это имеет приоритет над всеми цифрами и настройками выше. Это не скрытая лазейка: без такого механизма первое юридическое требование вынудило бы нарушить любое обещание хранения, а затем объяснять, почему документация обещала 14 дней. Это указано здесь, потому что является частью правил хранения.
Что можете сделать вы
- Задайте каждому сроку действительно нужную длительность. Они независимы: не переключайте загрузки на «Удалять после завершения задачи» только из-за желания сократить хранение промптов.
- Скачайте нужное до сокращения срока. Сокращение может затронуть уже выполненные задачи; см. последствия изменения настроек.
- Используйте
X-Spicy-Retentionдля отдельных чувствительных запросов. Для одной генерации не нужно перенастраивать весь аккаунт. - Не отправляйте лишнее. Референсные изображения и промпты — два самых чувствительных вида данных и единственные два, содержимое которых вы выбираете сами.
- Архивируйте свои результаты самостоятельно. Они хранятся не дольше примерно 14 дней, около 60 дней для медиа короткометражных фильмов, и меньше при сокращении срока.
- Скопируйте данные своего аккаунта. Кнопка Скачать ваши данные на странице Защита данных выдаёт JSON-файл с профилем, ролями в команде, сведениями об API-ключах без секретов, сохранёнными данными задач и финансовыми записями. Медиафайлы в него не входят: скачивайте нужные результаты отдельно.
- Не храните URL скачивания в базе данных. Они истекают через 20 минут, и их нельзя отозвать после выдачи. Создавайте подписанную ссылку, когда она нужна; см. Медиафайлы.
- Используйте HTTPS для URL обратного вызова. Тело содержит состояние задачи и ссылки на файлы результата; обычный HTTP открывает их любому участнику передачи.
Мы не обучаем модели на вашем содержимом
Ваши промпты, референсные изображения и результаты не попадают ни в один наш обучающий набор.
Граница этой фразы важна: она относится к нам. Мы не устанавливаем политики отдельных моделей; см. первый пункт выше.
Консоль и команды
Что делает каждая страница консоли SpicyAPI и когда ею пользоваться, а также как команды делят API-ключи и лимиты расходов, пока за всё платит владелец команды.
OpenAPI и указатель эндпоинтов
Контракт OpenAPI 3.1, все публичные эндпоинты и руководства, общие заголовки запросов и адрес производственного API.

