Опишите результат одним проверяемым предложением
Сотрудник открывает экран исследования, запрашивает архивные примеры SideProject об обратной связи и сохраняет заметку о следующем вопросе клиентам. Такое описание позволяет проверить поведение продукта. Оно не обещает репрезентативного исследования рынка, текущих мнений или автоматически составленного плана разработки. Сначала согласуйте именно этот небольшой результат с тем, кто будет пользоваться функцией.
Reddit API Cloud предоставляет доступ к независимому историческому архиву Reddit через HTTPS. Вашей команде не нужно запускать и обслуживать собственный Elasticsearch для обращения к этому архиву. Это не официальный сервис Reddit и не источник текущих обновлений. Публикация, голосование, личные сообщения и Reddit OAuth не поддерживаются. Получение исторических записей отделено от пользовательских сессий и бизнес-логики вашего продукта.
Оставьте сервер между пользователем и архивом
Перед обращением проверьте права сотрудника в своём приложении. Аккаунт архива разрешает получение записей серверу, а не авторизует каждого клиента SaaS. Загрузите ключ этого домена из серверной конфигурации и используйте Authorization: Bearer <key> либо X-API-Key: <key>. Не отправляйте секрет в браузер вместе с результатами поиска.
Заранее решите, открывает ли сохранённая заметка уже полученный материал или запускает новое платное обращение. Собственное хранилище заметок, доступ коллег и развёртывание приложения остаются вашей работой. Размещённый архив не предоставляет для продукта отдельный кластер или готовое рабочее пространство исследования.
Проверьте точный вопрос на трёх записях
Используйте https://api.redditapicloud.com/v1/search?q=feedback&subreddit=SideProject&limit=3. На главной объяснены параметры и приведён синтетический пустой ответ. Без kind возможны публикации и комментарии. q ищет в title и text; несколько терминов объединяются AND внутри одного совпавшего поля. Это не интерфейс семантического поиска, определения тональности или поиска точной фразы.
Для временного ограничения используйте from и to в формате YYYY-MM-DD UTC по полю created_utc; последний день включён целиком. Это не время попадания записи в архив. min_score задаёт числовой порог без сортировки и проверки качества совета. Внутренний порядок _doc не является хронологией, релевантностью или оценкой. Локальная сортировка переставляет только полученное и не возвращает отсутствующих записей.
Разведите исходный текст и вывод сотрудника
Проверьте data и наличие title или text, выводите содержимое как текст и при сохранении добавьте параметры запроса. Плоские записи можно группировать локально по имеющимся parent_id или link_id, но пропуски не исчезнут и полной беседы может не быть. Название продуктовой темы, которое назначил сотрудник, — его интерпретация, а не классификация, полученная от архива.
Предусмотрите отдельное состояние для пустого результата и для ошибки. При изменении вопроса сохраняйте новый запрос, не объединяя разные выборки молча в якобы представительный результат. Повторное получение не обязано возвращать те же записи. Эти различия должны быть видны человеку, который вернётся к заметке после обсуждения.
Ограничьте действие вместе с повторами
Для содержимого limit и page принимают от 1 до 100, одна страница требует отдельного запроса. Одно нажатие в продукте может вызвать несколько платных обращений, если вы добавили автоматический обход страниц или поиск контекста. Задайте собственный максимум вызовов и отложенных повторов. Это ваши ограничения, а не предоставленные архивом квоты отдельных клиентов SaaS. Дробление дат не доказывает полноты или уникальности записей.
Читайте total вместе с relation: eq означает точный итог запроса, gte — нижнюю границу, unknown — ненадёжный итог, возможно null. Пустая глубокая страница может иметь unknown вместо нуля. Сохраняйте has_more и window_exhausted и останавливайтесь на поддерживаемой границе страниц. Точный итог или завершённое локальное задание не доказывают получения всех подходящих исторических записей. Список сообществ с prefix не является поиском похожих тем.
Каждый успешный запрос, включая пустую страницу, стоит один кредит по цене $1 за 1000. Ответ может потеряться у клиента после оплаченного успеха; успешный повтор спишет ещё один кредит. Некорректные обращения не списываются, сбой источника возвращает резерв. Локальная обработка сохранённого ответа не требует нового получения, но не отменяет прежнюю стоимость.
Выпускайте после проверки поведения функции
Проверьте пользователя с доступом и без него, пустую выдачу, отсутствующие поля и потерю ответа. Код 400 указывает на параметры, 401 — на ключ, 402 — на баланс, 429 — на ограничение частоты. Уместные повторы выполняйте с задержкой и пределом попыток. Публичный /v1/status показывает статическое описание сервиса и ответ приложения, а не работоспособность поиска в источнике.
Оцените, помогает ли пилот обсуждать продукт, прежде чем расширять доступ. В плане выпуска оставьте собственный сервер, правила хранения и права клиентов. Страница ключа отвечает за доступ, страница цен — за минимальное пополнение $50. Ни регистрация, ни оплата сами по себе не означают, что функция готова для пользователей.