Визначте локальне завдання замість живої підписки
Reddit Stream API — незалежний історичний архів, не офіційний Reddit і не сервіс живих подій. Він повертає посторінкові GET-відповіді, без SSE, підписок WebSocket, Reddit OAuth, публікації, голосування та приватних повідомлень. Повторюване завдання знову опитує архів; воно не підписується на вхідну активність і не встановлює, наскільки швидко поточний матеріал Reddit стане доступним для читання.
Почніть із https://api.redditstreamapi.com/v1/posts?subreddit=datasets&limit=3&page=2 — прикладу з головної. Він запитує щонайбільше три дописи datasets на другій сторінці, а не дві сторінки одразу. Зберігайте ключ на сервері та передавайте X-API-Key: <ключ> або Authorization: Bearer <ключ>. Документація описує контракт маршруту, сторінка ключа — створення облікового запису до оплати. Обидві форми заголовка використовують саме ключ архіву.
Для завдання з обмеженням дат задайте from і to як YYYY-MM-DD UTC, що фільтрують created_utc. Останній день включений повністю. Наступний інтервал вибирайте явно, щоб спільна включена межа не створювала випадкового перетину у вашому плані. Навіть уважно вибрані сусідні періоди не доводять повного охоплення, відсутності повторів чи стабільності результатів під час нового запуску. Зберігайте обмеження разом із вивантаженням.
Збережіть сторінку до просування контрольної точки
Запишіть фільтри, limit, page та фактичну відповідь до власного сховища перед позначенням сторінки обробленою. Перевірте data й поля, потрібні приймачу. Це дозволяє дослідити локальне перетворення без нового віддаленого читання. Контрольна точка фіксує лише стан завдання; вона не є курсором архіву, ідентифікатором знімка чи доказом, що всі попередні записи вже отримані.
Запити вмісту повертають до 100 записів, page приймає від 1 до 100 в окремих викликах. Вибирайте limit відповідно до потреб обробки, не вважаючи 100 гарантією продуктивності. Останній отриманий запис не придатний як гарантована хронологічна межа: _doc — внутрішній порядок, не час створення, релевантність чи оцінка. min_score фільтрує поріг, не змінюючи цього порядку. Локальне сортування не заповнює пропусків.
Використовуйте локальні ідентифікатори для перевірки дублікатів, коли вони доступні, зберігаючи відсутність полів і нерозв’язані parent_id чи link_id. Групування плоских записів не створює гарантовано повного обговорення. Повторна обробка збереженої відповіді не викликає API. Новий віддалений запит може повернути інші дані, а локальне усунення дублікатів не скасовує заднім числом кредиту за успішне повторне отримання.
Зупиняйтеся та повторюйте за фактичним результатом
Читайте total разом із relation. eq — точний підсумок запиту, gte — нижня межа, unknown — ненадійне значення або null. Порожня глибока сторінка не встановлює підсумку нуль. Ні точні числа, ні обхід сторінок, ні менші вікна дат не доводять повного вивантаження. Зберігайте has_more та window_exhausted, зупиняйтеся біля допустимої межі; не вигадуйте курсора й не обходьте page=100 новими однаковими зверненнями.
За HTTP 400 виправте параметри, за 401 перевірте домен і ключ, за 402 зупиніть завдання та перевірте баланс, за 429 використовуйте затримку й обмежену кількість спроб. Публічний /v1/status безоплатний і не потребує ключа, але підтверджує лише HTTP-відповідь та статичний опис. Він не встановлює працездатності пошуку, свіжості архіву чи списання за попередній запит із невизначеним результатом.
Кожен успішний запит, включно з порожнім і повторним, коштує один кредит. Некоректні запити не списуються, збій джерела повертає резерв. Клієнтський тайм-аут можливий після оплаченого успіху; помилка власного зберігання його не скасовує. До планування повторних вікон прочитайте ціни: $1 за 1000 успіхів, платний мінімум $50 та умовні 100 пробних кредитів. Повторне створення ключа після підтвердження пароля одразу вимикає старий, тому оновлюйте обробники свідомо, не очікуючи двох чинних ключів.