Skip to content

Crypto Articles

The Crypto Articles endpoint returns a paginated list of crypto news articles enriched with per-article sentiment scoring. Each article includes the title, summary, source link, authors, publication timestamp, category tags, and a sentiment label (positive, neutral, or negative) together with a confidence score.

Use this to:

  • Build a crypto news feed with live sentiment badges
  • Filter and display articles from a specific publisher
  • Export article datasets to CSV for offline analysis
  • Power a sentiment timeline by comparing results across time frames

Base URL

https://crypto-news51.p.rapidapi.com

RapidAPI key required

Include your RapidAPI credentials on every request. See Authentication.


Get articles

GET/api/v1/crypto/articles

Returns an array of news articles published within the specified time frame. Results are sorted by published descending (newest first).

Authentication

HeaderValue
X-RapidAPI-KeyYour RapidAPI secret key
X-RapidAPI-Hostcrypto-news51.p.rapidapi.com

Query parameters

ParameterTypeDefaultDescription
pageinteger1Page number for pagination. Use together with limit to walk through all results.
limitinteger10Number of articles per page. Maximum: 100.
time_framestring24h Lookback window. Accepted values:
1h — last 1 hour
6h — last 6 hours
12h — last 12 hours
24h — last 24 hours
formatstringjsonResponse format. Use json for structured data or csv to receive a raw CSV string suitable for spreadsheet import.
sourcestring Filter articles to a single publisher. Accepts one value only. See the Source List for all valid source names.

time_frame vs. page

Pagination operates within the chosen time_frame. If you request page=3&limit=10&time_frame=1h but only 15 articles exist in the last hour, page 3 will return an empty array — not an error. Always check whether the returned array length equals limit to decide whether more pages exist.


Example requests

bash
curl "https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles?page=1&limit=10&time_frame=24h&format=json" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: crypto-news51.p.rapidapi.com"
bash
curl "https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles?page=1&limit=20&time_frame=6h&source=CoinDesk" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: crypto-news51.p.rapidapi.com"
bash
curl "https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles?limit=100&time_frame=24h&format=csv" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: crypto-news51.p.rapidapi.com" \
  -o articles.csv
javascript
const params = new URLSearchParams({
  page: '1',
  limit: '10',
  time_frame: '24h',
  format: 'json',
})

const response = await fetch(
  `https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles?${params}`,
  {
    headers: {
      'X-RapidAPI-Key': process.env.RAPIDAPI_KEY,
      'X-RapidAPI-Host': 'crypto-news51.p.rapidapi.com',
    },
  }
)

const articles = await response.json()

for (const article of articles) {
  const { label, score } = article.sentiment
  const confidence = (score * 100).toFixed(1)
  console.log(`[${label.toUpperCase()} ${confidence}%] ${article.title}`)
}
javascript
async function fetchAllArticles(timeFrame = '24h') {
  const headers = {
    'X-RapidAPI-Key': process.env.RAPIDAPI_KEY,
    'X-RapidAPI-Host': 'crypto-news51.p.rapidapi.com',
  }

  const allArticles = []
  let page = 1
  const limit = 100

  while (true) {
    const params = new URLSearchParams({ page, limit, time_frame: timeFrame, format: 'json' })
    const res = await fetch(
      `https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles?${params}`,
      { headers }
    )
    const batch = await res.json()

    if (!Array.isArray(batch) || batch.length === 0) break
    allArticles.push(...batch)
    if (batch.length < limit) break   // last page
    page++
  }

  return allArticles
}

const articles = await fetchAllArticles('24h')
console.log(`Total articles fetched: ${articles.length}`)
python
import os
import requests

response = requests.get(
    "https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles",
    params={
        "page": 1,
        "limit": 10,
        "time_frame": "24h",
        "format": "json",
    },
    headers={
        "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"],
        "X-RapidAPI-Host": "crypto-news51.p.rapidapi.com",
    },
)

response.raise_for_status()
articles = response.json()

for article in articles:
    sentiment = article["sentiment"]
    confidence = round(sentiment["score"] * 100, 1)
    print(f"[{sentiment['label'].upper():8} {confidence:5.1f}%]  {article['title'][:80]}")
python
import os
import requests

def fetch_all_articles(time_frame="24h"):
    session = requests.Session()
    session.headers.update({
        "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"],
        "X-RapidAPI-Host": "crypto-news51.p.rapidapi.com",
    })

    all_articles, page, limit = [], 1, 100

    while True:
        resp = session.get(
            "https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles",
            params={"page": page, "limit": limit, "time_frame": time_frame, "format": "json"},
        )
        resp.raise_for_status()
        batch = resp.json()

        if not batch:
            break
        all_articles.extend(batch)
        if len(batch) < limit:
            break   # reached the last page
        page += 1

    return all_articles

articles = fetch_all_articles("24h")
print(f"Fetched {len(articles)} articles")

Response

The response is a JSON array of article objects (not wrapped in an envelope).

json
[
  {
    "title": "XRP's Strong ETF Performance Goes Against Price: 40% Decline, $41 Million",
    "summary": "XRP's price performance is very far from what the asset is showing us on the ETF market.",
    "media": [
      "https://i0.wp.com/u.today/sites/default/files/styles/twitterwithoutlogo/public/2026-04/Depositphotos_252610748_S.jpg"
    ],
    "link": "https://bitcoinethereumnews.com/tech/xrps-strong-etf-performance-goes-against-price-40-decline-41-million/",
    "authors": [
      { "name": "Bitcoin Ethereum News" }
    ],
    "published": "2026-04-06T15:59:15+00:00",
    "category": "financial",
    "subCategory": "cryptocurrency",
    "language": "en",
    "timeZone": "UTC",
    "sentiment": {
      "label": "negative",
      "score": 0.8656466007232666
    }
  }
]

Article object fields

FieldTypeDescription
titlestringFull headline of the article.
summarystringShort excerpt or lead paragraph. May contain the original RSS feed description.
mediastring[]Array of image URLs attached to the article. Can be empty ([]) if no media is available.
linkstringCanonical URL of the original article on the publisher's website.
authorsobject[]List of authors. Each object contains a name field (string).
publishedstringISO 8601 publication timestamp with timezone offset (e.g. 2026-04-06T15:59:15+00:00).
categorystringTop-level content category (e.g. financial, technology).
subCategorystringMore specific topic classification (e.g. cryptocurrency, blockchain).
languagestringTwo-letter ISO 639-1 language code of the article (e.g. en).
timeZonestringTimezone string of the source (e.g. UTC).
sentiment.labelstringSentiment classification: positive, neutral, or negative.
sentiment.scorenumberModel confidence for the assigned label, in the range 0.0–1.0. A score of 0.87 means the model is 87% confident in the label. Higher is more certain.

Reading the sentiment score

The score is the model's confidence for the assigned label, not an absolute positive/negative scale. An article with label: "negative" and score: 0.95 is strongly negative; score: 0.51 means the model was barely confident — treat low-score articles as closer to neutral regardless of label.


Pagination

This endpoint uses page + limit (offset-based) pagination. The response is a plain array with no envelope — detect the last page by checking whether the returned array is shorter than limit.

page 1 → items 1–10
page 2 → items 11–20
page N → last page when array.length < limit
javascript
let page = 1
const limit = 50
const all = []

while (true) {
  const batch = await fetchPage(page, limit)  // your fetch wrapper
  all.push(...batch)
  if (batch.length < limit) break
  page++
}
python
page, limit, all_articles = 1, 50, []

while True:
    batch = fetch_page(page, limit)   # your request helper
    all_articles.extend(batch)
    if len(batch) < limit:
        break
    page += 1

CSV format

Pass format=csv to receive a plain-text CSV response instead of JSON. Useful for bulk data export to spreadsheets or data pipelines.

bash
curl "https://crypto-news51.p.rapidapi.com/api/v1/crypto/articles?limit=100&time_frame=24h&format=csv" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: crypto-news51.p.rapidapi.com" \
  -o articles.csv

The CSV includes columns: title, summary, link, published, authors, category, subCategory, language, sentiment_label, sentiment_score.

CSV and source filtering

The source filter works with format=csv. Pagination also applies — use page and limit to chunk large exports.


Error responses

StatusCodeDescription
400bad_requestInvalid time_frame value or limit exceeds 100
401unauthorizedX-RapidAPI-Key is missing or invalid
403forbiddenYour RapidAPI plan does not include access to this endpoint
429too_many_requestsRapidAPI rate limit exceeded
500internal_errorServer error — safe to retry after a short delay

Example 400 response:

json
{
  "detail":"Timeframe '243h' not supported. Choose from ['1h', '6h', '12h', '24h']"
}

Rate limits

Limits are enforced by RapidAPI and depend on your subscription plan:

PlanPriceRequests / monthRate Limit
Basic$0501,000 / hour
Pro$10100,000100 / min
Ultra$20500,000180 / min
Mega$501,000,000180 / min

Check your current usage in the RapidAPI developer dashboard.


EndpointDescription
Crypto SentimentAggregated sentiment counts and percentages across all articles for a given interval

Released under the MIT License.