Контракт обмеженого отримання історичних сторінок

Отримати API-ключ

Захищене читання та публічний статус

Захищене читання використовує GET на https://api.redditstreamapi.com з X-API-Key: <ключ> або Authorization: Bearer <ключ>. Обидва варіанти передають ключ архіву цього домену, а не токен Reddit OAuth. Зберігайте секрет на сервері. Cookie Secure HttpOnly панелі облікового запису стосується окремої сесії. Сервіс повертає окремі JSON-відповіді, а не живий SSE-потік, з’єднання WebSocket чи підписку на події Reddit.

/v1/search шукає дописи й коментарі. /v1/posts обмежує видачу дописами, /v1/comments — коментарями. Усі три приймають q, subreddit, author, kind, from, to, min_score, limit і page, але не id. kind приймає post та comment; для обох типів через search не задавайте його. q — текстовий пошук без довільної мови запитів, класифікації тональності чи власної серверної аналітики.

/v1/item?id=... потребує лише id та шукає один архівний запис, який може бути відсутній. Батьківські записи й відповіді автоматично не обходяться. /v1/subreddits приймає лише prefix і limit для пошуку назв спільнот, без посторінкового обходу та гарантії глобально точних лічильників. /v1/status публічний і безоплатний: статичний опис підтверджує відповідь HTTP-застосунку, не перевіряючи доступності пошуку, свіжості записів, чинності ключа чи балансу.

Вікна дат, поля та порядок документів

from і to приймають YYYY-MM-DD в UTC та фільтрують created_utc, а не мить потрапляння запису до архіву. Останній день to включений повністю. Це фільтри днів, а не значення курсора з точністю до часу доби. Під час поділу роботи за датами зберігайте фактичні межі й розрізняйте час обробки завдання та створення запису. Поділ не доводить повноти отримання чи розкладу оновлення архіву.

min_score задає числовий поріг оцінки без сортування або визначення якості поради. Порядок _doc — внутрішній порядок документів, не час вставлення, хронологія, релевантність чи оцінка. Останній запис сторінки не є гарантованою часовою позначкою прогресу. Локальне сортування організує отримане, але не доводить, що всі раніші записи вже завантажені, а пізніші з’являться в майбутньому зверненні.

Записи вмісту плоскі, поля можуть різнитися. Наявні parent_id та link_id допускають локальне групування, без повного ланцюжка батьківських записів або розмови. Жодне поле не є фільтром запиту. Відповіді містять data, pagination і credits. Перевіряйте отримані дані, зберігайте відсутність полів і нерозв’язані посилання замість підставляння вигаданих значень для власної схеми. Успішний порожній масив data не є помилкою автентифікації.

Межі сторінок, підсумки та обробка збоїв

Маршрути вмісту приймають limit і page від 1 до 100, по одній сторінці за запит. page=2 не повертає першої та другої сторінок разом. Нумерація не є стабільним курсором чи послідовністю подій; page=101 для тієї самої вибірки не підтримується. Поділ вікон і локальне усунення дублікатів організують роботу, не доводячи повного охоплення, унікальності чи незмінності повторного результату.

Читайте pagination.total разом із relation: eq — точний підсумок запиту, gte — нижня межа, unknown — відсутність надійного підсумку, можливо null. Порожня сторінка після першої може повернути unknown, а не число нуль. Точний підсумок не доводить завантаження всіх збігів або наявності всієї історії в архіві. Зберігайте has_more та window_exhausted як ознаки меж, не токени необмеженого експорту.

HTTP 400 стосується неправильних параметрів, 401 — відсутнього або недійсного ключа, 402 — нестачі кредитів, 429 — обмеження частоти. Некоректні запити не списуються; збій джерела повертає резерв. Успішне отримання коштує один кредит, навіть порожнє й повторне. Втрата відповіді може приховувати оплачений успіх; локальна помилка не повертає його вартості. Збережіть відповідь до оновлення прогресу та враховуйте успішні повтори окремо.

Маршрути API

МетодМаршрутПараметри
GET/v1/searchq, subreddit, author, kind, from, to, min_score, limit, page
GET/v1/postsq, subreddit, author, kind, from, to, min_score, limit, page
GET/v1/commentsq, subreddit, author, kind, from, to, min_score, limit, page
GET/v1/itemid
GET/v1/subredditsprefix
GET/v1/status—

Параметри запиту

ПараметрЗначення / тип / діапазон
qtext
subredditkeyword
authorkeyword
kindpost | comment
fromISO date
toISO date
min_scoreinteger
limit1–100
page1–100
iditem ID
prefixsubreddit prefix
curl -H "Authorization: Bearer YOUR_API_KEY" 'https://api.redditstreamapi.com/v1/search?q=research&limit=10'

import json, urllib.request
request = urllib.request.Request('https://api.redditstreamapi.com/v1/search?q=research&limit=10', headers={"Authorization": "Bearer YOUR_API_KEY"})
with urllib.request.urlopen(request) as response:
    print(json.load(response))

fetch("https://api.redditstreamapi.com/v1/search?q=research&limit=10", {headers: {Authorization: "Bearer YOUR_API_KEY"}})
  .then(response => response.json()).then(console.log);