документация · версия 1.0 · rest · json
newsmetry api
новости рынков одним api: лента без задержки, полный текст, ссылка на оригинал и время публикации.
01обзор
базовый адрес всех методов: https://api.newsmetry.xyz/api/v1
лента приходит в api сразу, как только новость собрана целиком. на сайте newsmetry те же события открываются с задержкой 15 минут.
спецификация openapi и интерактивная консоль: swagger ↗
02быстрый старт
- получите ключ: запросите его в личном кабинете. ключ выглядит как
nag_…и показывается один раз — сохраните его. - передайте ключ в заголовке
Authorization: Bearer <ключ>. - запросите ленту — и всё.
curl -H "Authorization: Bearer $NEWS_API_KEY" \
"https://api.newsmetry.xyz/api/v1/news?limit=5"import os, requests
API = "https://api.newsmetry.xyz/api/v1"
headers = {"Authorization": f"Bearer {os.environ['NEWS_API_KEY']}"}
r = requests.get(API + "/news?limit=5", headers=headers, timeout=30)
r.raise_for_status()
print(r.json())const API = "https://api.newsmetry.xyz/api/v1";
const res = await fetch(API + "/news?limit=5", {
headers: { Authorization: `Bearer ${process.env.NEWS_API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error.message);
console.log(await res.json());03ключ и авторизация
каждый запрос, кроме /health, требует ключ. подойдёт любой из двух заголовков:
Authorization: Bearer nag_…
X-API-Key: nag_…отправляйте ключ только с сервера, никогда из браузера.
04лимиты и тарифы
каждый ключ ограничен тремя способами. все три видны в заголовках ответа, превышение — ответ 429 с заголовком Retry-After.
| тариф | квота / сутки | в секунду | в минуту | одновременно | новостей на страницу |
|---|---|---|---|---|---|
| Freeпробный доступ: 5 запросов в сутки | 5 | 1 | 5 | 1 | 50 |
| Proрабочий доступ: 1000 запросов в сутки | 1 000 | 5 | 120 | 4 | 500 |
квоту тратят только запросы к новостям (/news, /news/{id}). /me и /health — бесплатно. если сервер ответил ошибкой 5xx, запрос квоте возвращается.
05страницы и опрос новинок
лента листается курсором, а не номером страницы: в ответе есть next_cursor — передайте его параметром cursor, чтобы получить следующую порцию. пока has_more = true, есть ещё.
чтобы забирать только новое, читайте с order=asc и сохраняйте next_cursor — он отдаётся и на последней странице. в следующий раз начните с него: придут только новости, появившиеся после.
import os, time, requests
API = "https://api.newsmetry.xyz/api/v1"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['NEWS_API_KEY']}"
cursor = None # храните между запусками — в файле или базе
while True:
params = {"order": "asc", "limit": 50}
if cursor:
params["cursor"] = cursor
r = session.get(f"{API}/news", params=params, timeout=30)
if r.status_code == 429: # лимит или квота — ждём, сколько сказали
time.sleep(int(r.headers.get("Retry-After", "60")))
continue
r.raise_for_status()
page = r.json()
for item in page["items"]:
print(item["published_at"], item["title"])
cursor = page["next_cursor"] or cursor
if not page["has_more"]:
time.sleep(60)новость попадает в ленту и получает id, когда готова целиком — с полным текстом. если текста у новости нет и не будет (короткая молния), она приходит с body_status = "empty".
06объект новости
id stringидентификатор новости. растёт с каждой новой новостью — по нему идёт курсор.title stringзаголовок.summary string | nullлид или краткое описание.body string | nullполный текст.body_status stringfull — текст есть; empty — текста нет и не будет (короткая молния).url string | nullссылка на оригинал.image_url string | nullкартинка.lang string | nullязык: en, ru.tags string[]рубрики.published_at iso 8601время публикации, utc.collected_at iso 8601когда новость появилась в newsmetry.updated_at iso 8601последнее изменение записи.{
"id": "48213",
"title": "Fed holds rates steady, signals two cuts in 2027",
"summary": "The Federal Reserve left its benchmark rate unchanged on Wednesday…",
"body": "WASHINGTON — The Federal Reserve held interest rates steady…",
"body_status": "full",
"url": "https://www.reuters.com/markets/us/fed-holds-rates-2026-10-12/",
"image_url": "https://www.reuters.com/resizer/…/fed.jpg",
"lang": "en",
"tags": [],
"published_at": "2026-10-12T18:02:11Z",
"collected_at": "2026-10-12T18:07:40Z",
"updated_at": "2026-10-12T18:07:40Z"
}все id — строки: числа такой длины javascript теряет. время — iso 8601 в utc с суффиксом Z.
07ошибки
любая ошибка — json одного вида:
{
"error": {
"code": "quota_exceeded",
"message": "суточная квота исчерпана (1000 запросов), сброс в 00:00 UTC"
}
}400 invalid_parameterневерный параметр: в message — какой и что ожидалось, в details — список полей.401 unauthorizedключа нет, он неизвестен или перевыпущен.403 forbiddenдоступ отключён администратором или истёк срок ключа.404 not_foundнет такой новости или такого пути.429 rate_limitedслишком часто: превышен лимит в секунду или в минуту. подождите Retry-After секунд.429 throttledслишком много одновременных запросов с одного ключа. повторите через секунду.429 quota_exceededсуточная квота исчерпана. сброс в 00:00 utc, до него — Retry-After секунд.503 unavailableвременная недоступность. повторите через Retry-After секунд.08заголовки ответа
X-RateLimit-Limitлимит запросов в минуту по тарифу.X-RateLimit-Remainingсколько ещё можно в текущей минуте.X-RateLimit-Resetкогда освободится окно (unix-время, секунды).X-Quota-Limitсуточная квота (только у запросов, которые её тратят).X-Quota-Remainingостаток квоты на сегодня.X-Quota-Resetсброс квоты — ближайшая полночь utc (unix-время).Retry-Afterчерез сколько секунд повторять — у ответов 429 и 503.09лента новостей
GET/newsтратит квоту
новости, свежие первыми.
limit integer · по умолчанию 50сколько новостей вернуть: от 1 до потолка тарифа.cursor stringnext_cursor из предыдущего ответа — следующая страница.order desc | asc · по умолчанию descdesc — от новых к старым, asc — от старых к новым (для опроса «что нового»).lang stringязык: en, ru.q stringподстрока заголовка, без учёта регистра (до 200 символов).from iso 8601опубликовано не раньше, например 2026-10-12T00:00:00Z.to iso 8601опубликовано не позже.curl -H "Authorization: Bearer $NEWS_API_KEY" \
"https://api.newsmetry.xyz/api/v1/news?limit=5"{
"items": [
{
"id": "48213",
"title": "Fed holds rates steady, signals two cuts in 2027",
"summary": "The Federal Reserve left its benchmark rate unchanged on Wednesday…",
"body": "WASHINGTON — The Federal Reserve held interest rates steady…",
"body_status": "full",
"url": "https://www.reuters.com/markets/us/fed-holds-rates-2026-10-12/",
"image_url": "https://www.reuters.com/resizer/…/fed.jpg",
"lang": "en",
"tags": [],
"published_at": "2026-10-12T18:02:11Z",
"collected_at": "2026-10-12T18:07:40Z",
"updated_at": "2026-10-12T18:07:40Z"
}
],
"has_more": true,
"next_cursor": "48213",
"meta": {
"quota_limit": 1000,
"quota_remaining": 987
}
}10одна новость
GET/news/{id}тратит квоту
новость по id.
id string · обязательныйидентификатор новости из ленты.curl -H "Authorization: Bearer $NEWS_API_KEY" \
"https://api.newsmetry.xyz/api/v1/news/48213"{
"id": "48213",
"title": "Fed holds rates steady, signals two cuts in 2027",
"summary": "The Federal Reserve left its benchmark rate unchanged on Wednesday…",
"body": "WASHINGTON — The Federal Reserve held interest rates steady…",
"body_status": "full",
"url": "https://www.reuters.com/markets/us/fed-holds-rates-2026-10-12/",
"image_url": "https://www.reuters.com/resizer/…/fed.jpg",
"lang": "en",
"tags": [],
"published_at": "2026-10-12T18:02:11Z",
"collected_at": "2026-10-12T18:07:40Z",
"updated_at": "2026-10-12T18:07:40Z"
}11мой ключ и квота
GET/meквоту не тратит
тариф, лимиты и сколько запросов осталось на сегодня. квоту не тратит — удобно для мониторинга.
curl -H "Authorization: Bearer $NEWS_API_KEY" \
"https://api.newsmetry.xyz/api/v1/me"{
"id": "17",
"name": "Trading bot",
"key_prefix": "nag_q8Jx2LmA",
"key_expires_at": null,
"plan": {
"code": "pro",
"name": "Pro",
"daily_quota": 1000,
"rate_per_second": 5,
"rate_per_minute": 120,
"max_concurrency": 4,
"max_page_size": 500,
"unlimited": false
},
"quota": {
"used": 13,
"remaining": 987,
"reset_at": "2026-10-13T00:00:00Z"
}
}12состояние сервиса
GET/healthбез ключа
работает ли api и идёт ли сбор. ключ не нужен.
curl "https://api.newsmetry.xyz/api/v1/health"{
"status": "ok",
"service": "newsmetry",
"version": "1.0",
"time": "2026-10-12T18:08:12Z",
"db": "ok",
"redis": "ok",
"worker": "running"
}