Appearance
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.comRapidAPI 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
| Header | Value |
|---|---|
X-RapidAPI-Key | Your RapidAPI secret key |
X-RapidAPI-Host | crypto-news51.p.rapidapi.com |
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | integer | 1 | Page number for pagination. Use together with limit to walk through all results. |
| limit | integer | 10 | Number of articles per page. Maximum: 100. |
| time_frame | string | 24h | Lookback window. Accepted values:1h — last 1 hour6h — last 6 hours12h — last 12 hours24h — last 24 hours |
| format | string | json | Response format. Use json for structured data or csv to receive a raw CSV string suitable for spreadsheet import. |
| source | string | — | 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.csvjavascript
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
| Field | Type | Description |
|---|---|---|
| title | string | Full headline of the article. |
| summary | string | Short excerpt or lead paragraph. May contain the original RSS feed description. |
| media | string[] | Array of image URLs attached to the article. Can be empty ([]) if no media is available. |
| link | string | Canonical URL of the original article on the publisher's website. |
| authors | object[] | List of authors. Each object contains a name field (string). |
| published | string | ISO 8601 publication timestamp with timezone offset (e.g. 2026-04-06T15:59:15+00:00). |
| category | string | Top-level content category (e.g. financial, technology). |
| subCategory | string | More specific topic classification (e.g. cryptocurrency, blockchain). |
| language | string | Two-letter ISO 639-1 language code of the article (e.g. en). |
| timeZone | string | Timezone string of the source (e.g. UTC). |
| sentiment.label | string | Sentiment classification: positive, neutral, or negative. |
| sentiment.score | number | Model 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 < limitRecommended pattern
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 += 1CSV 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.csvThe 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
| Status | Code | Description |
|---|---|---|
| 400 | bad_request | Invalid time_frame value or limit exceeds 100 |
| 401 | unauthorized | X-RapidAPI-Key is missing or invalid |
| 403 | forbidden | Your RapidAPI plan does not include access to this endpoint |
| 429 | too_many_requests | RapidAPI rate limit exceeded |
| 500 | internal_error | Server 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:
| Plan | Price | Requests / month | Rate Limit |
|---|---|---|---|
| Basic | $0 | 50 | 1,000 / hour |
| Pro | $10 | 100,000 | 100 / min |
| Ultra | $20 | 500,000 | 180 / min |
| Mega | $50 | 1,000,000 | 180 / min |
Check your current usage in the RapidAPI developer dashboard.
Related endpoints
| Endpoint | Description |
|---|---|
| Crypto Sentiment | Aggregated sentiment counts and percentages across all articles for a given interval |