UpGate Logo

Crypto

REST API v1https://api.upgate.online

Crypto News API

Four REST endpoints. Translated crypto news as JSON — for apps, bots, and publisher CMS tools.

English & PersianSentiment & token tagsLive feed or snapshotPublisher edition (Premium)

Auth: X-API-Key header on every request

Quickstart

Get your first articles in five minutes: get an API key, send one GET, read the JSON array.

Code Examples

curl -X GET "https://api.upgate.online/api/v1/crypto/articles/translated/latest-snapshot/?lang=en&limit=3" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Accept: application/json"

Response

[
  {
    "original_id": 2147,
    "language": "en",
    "title": "OKX will launch IRYS/USD and IRYS/EUR for spot trading",
    "content": "To support the growth of the unified USD and EUR ecosystem...",
    "created_at": "2026-05-27T05:00:00",
    "meta": {
      "token_mentions": ["IRYS"],
      "thumbnail_url": "https://img.upgate.online/crypto/2147",
      "source_name": "OKX",
      "category": "exchanges",
      "sentiment": "positive",
      "feed_type": null
    }
  }
]

Endpoints at a Glance

Four GET endpoints under /api/v1/crypto/. Standard endpoints return translated news. Publication endpoints return adapted copy for your publication (Premium add-on).

StandardTracks progressmax 100

Standard Feed

Live news feeds in apps and websites

GET /api/v1/crypto/articles/translated/
StandardNo historymax 50

Standard Snapshot

Cron jobs, Telegram bots, and dashboards

GET /api/v1/crypto/articles/translated/latest-snapshot/
PublicationTracks progressmax 100

Publication Feed

Live feed written in your publication's voice (Premium)

GET /api/v1/crypto/publication-feed/
PublicationNo historymax 50

Publication Snapshot

Scheduled pulls of edited stories (Premium)

GET /api/v1/crypto/publication-feed/latest-snapshot/

Which one do I need?

Your goalUse this
Scrollable feed in an appStandard Feed or Publication Feed
Cron job, bot, or dashboardStandard Snapshot or Publication Snapshot
Stories in your publication's voicePublication Feed (Premium)
Raw translated wire copyStandard Feed or Standard Snapshot

Time windows

EndpointWindow
Standard FeedLast 2 days (scroll archive)
Standard SnapshotNo time window — latest by created_at
Publication FeedRolling delivery window (about 7 days)
Publication SnapshotNo checkpoint — latest adapted stories

Which Endpoint?

Answer three quick questions — we'll suggest the right endpoint.

Which endpoint should I use?

Pick your use case — we'll suggest the right endpoint.

What are you building?

Integration Guide: News Feed

Poll with direction=newer while your app is open. The API returns only unseen articles. With direction=newer, [] means nothing new.

Code Examples

const API_BASE = "https://api.upgate.online"
const PATH = "/api/v1/crypto/articles/translated/"

async function pollFeed({ apiKey, lang = "en", limit = 10 }) {
  const url = new URL(API_BASE + PATH)
  url.searchParams.set("lang", lang)
  url.searchParams.set("limit", String(limit))
  url.searchParams.set("direction", "newer")

  const res = await fetch(url, {
    headers: { "X-API-Key": apiKey, Accept: "application/json" },
  })
  if (!res.ok) throw new Error((await res.json().catch(() => ({}))).detail || res.status)
  return res.json() // [] = no new articles
}

setInterval(async () => {
  for (const article of await pollFeed({ apiKey: process.env.UPGATE_API_KEY })) {
    renderCard(article)
  }
}, 60_000) // must respect frequency_minutes + daily_limit on your plan

Integration Guide: Cron & Alerts

Call Snapshot on a schedule from your server. Track original_id yourself so you never alert on the same story twice.

Code Examples

const seen = new Set()

function ingestNew(articles) {
  return articles.filter((a) => !seen.has(a.original_id) && seen.add(a.original_id))
}

async function tick() {
  const res = await fetch(
    'https://api.upgate.online/api/v1/crypto/articles/translated/latest-snapshot/?lang=en&limit=10&token=BTC',
    { headers: { 'X-API-Key': process.env.UPGATE_API_KEY } }
  )
  for (const article of ingestNew(await res.json())) await notify(article)
}
setInterval(tick, 5 * 60_000)

Authentication

Send your API key in the X-API-Key header on every request.

Parameters

NameTypeRequiredDescription
X-API-KeystringYesYour UpGate API key from Dashboard → Key & Test
Example: YOUR_API_KEY
AcceptstringNoRecommended: application/json
Example: application/json
X-Request-IDstringNoOptional ID for support — echoed in the response
Example: trace-abc-123

Code Examples

curl -X GET "https://api.upgate.online/api/v1/crypto/articles/translated/latest-snapshot/?limit=1&lang=en" \
  -H "X-API-Key: YOUR_API_KEY"

Standard Feed

For scrollable feeds. The server remembers how far each user has read — no page numbers needed. Returns articles from the last 2 days only.

How the Standard Feed works

First request
  GET ?direction=newer     → latest articles

Poll for new items
  GET ?direction=newer     → articles the user has not seen yet
  []                       → nothing new (you are up to date)

Scroll into older items (2-day window)
  GET ?direction=older     → older articles
  []                       → end of the 2-day archive

The server tracks read progress per API key and language.
You never send page numbers or cursor tokens.
For live feeds, always use direction=newer.

Endpoint

GEThttps://api.upgate.online/api/v1/crypto/articles/translated/

Parameters

NameTypeRequiredDescription
langstringNoen or fa. Default: en
Example: en
limitintegerNo1–100 endpoint max. Also capped by max_items_per_request on your key.
Example: 10
directionstringNonewer = unseen. older = scroll back. Default: newer if no checkpoint yet; otherwise older. Always pass newer for live feeds.
Example: newer
tokenstringNoFilter by token symbol (case-insensitive)
Example: BTC

Code Examples

curl -G "https://api.upgate.online/api/v1/crypto/articles/translated/" \
  -H "X-API-Key: YOUR_API_KEY" \
  --data-urlencode "lang=en" \
  --data-urlencode "limit=10" \
  --data-urlencode "direction=newer"

Standard Snapshot

Returns the latest articles by created_at. No time window, no read tracking — best for cron jobs, bots, and alerts.

Endpoint

GEThttps://api.upgate.online/api/v1/crypto/articles/translated/latest-snapshot/

Parameters

NameTypeRequiredDescription
langstringNoen or fa. Default: en
Example: en
limitintegerNo1–50. Default: 10. Also capped by max_items_per_request.
Example: 10
tokenstringNoFilter by token symbol (case-insensitive)
Example: BTC

Code Examples

curl -G "https://api.upgate.online/api/v1/crypto/articles/translated/latest-snapshot/" \
  -H "X-API-Key: YOUR_API_KEY" \
  --data-urlencode "lang=en" \
  --data-urlencode "limit=10" \
  --data-urlencode "token=BTC"

Publication Edition

Publication Edition rewrites stories for your publication's tone and audience. Set up Publication Identity in your dashboard, then call Publication endpoints with the same API key.

Standard vs Publication

StandardPublication (Premium)
ContentTranslated wire copyAdapted for your publication
PlansTrial and paid API plansPublication Edition add-on
Time windowFeed: 2 days. Snapshot: noneFeed: ~7 days. Snapshot: none
Read progressSeparate checkpoint per feed typeSeparate checkpoint per feed type
meta.feed_typenullpublication
Languagelang query paramPublication Identity target language overrides lang
SetupAPI key onlyPublication Identity in dashboard first

Publication Feed

Scrollable feed of adapted stories (~7-day window). Same parameters as Standard Feed, but requires Publication Edition and a configured publication profile.

Endpoint

GEThttps://api.upgate.online/api/v1/crypto/publication-feed/

Parameters

NameTypeRequiredDescription
langstringNoen or fa. Overridden by Publication Identity target language when set.
Example: en
limitintegerNo1–100 endpoint max. Also capped by max_items_per_request.
Example: 10
directionstringNonewer or older only — invalid values return HTTP 400. Always use newer for live feeds.
Example: newer
tokenstringNoFilter by token — max 16 alphanumeric characters
Example: ETH

Code Examples

curl -G "https://api.upgate.online/api/v1/crypto/publication-feed/" \
  -H "X-API-Key: YOUR_API_KEY" \
  --data-urlencode "lang=en" \
  --data-urlencode "limit=10" \
  --data-urlencode "direction=newer"

Publication Snapshot

Latest adapted stories without advancing Feed read progress. Track original_id on your side.

Endpoint

GEThttps://api.upgate.online/api/v1/crypto/publication-feed/latest-snapshot/

Parameters

NameTypeRequiredDescription
langstringNoen or fa. Overridden by Publication Identity target language when set.
Example: en
limitintegerNo1–50. Default: 10
Example: 10
tokenstringNoFilter by token — max 16 alphanumeric characters
Example: SOL

Code Examples

curl -G "https://api.upgate.online/api/v1/crypto/publication-feed/latest-snapshot/" \
  -H "X-API-Key: YOUR_API_KEY" \
  --data-urlencode "lang=en" \
  --data-urlencode "limit=10"

Response Format

Every endpoint returns a JSON array of articles. There is no wrapper object.

Response

[
  {
    "original_id": 2147,
    "language": "en",
    "title": "OKX will launch IRYS/USD and IRYS/EUR for spot trading",
    "content": "To support the growth of the unified USD and EUR ecosystem...",
    "created_at": "2026-05-27T05:00:00",
    "meta": {
      "token_mentions": ["IRYS"],
      "thumbnail_url": "https://img.upgate.online/crypto/2147",
      "source_name": "OKX",
      "category": "exchanges",
      "sentiment": "positive",
      "feed_type": null
    }
  }
]

Article fields

FieldTypeDescription
original_idintegerUnique ID — use this to detect duplicates
languagestringen or fa
titlestringHeadline
contentstringBody text (Markdown-ready; RTL when lang=fa)
created_atstring (ISO 8601)When UpGate processed the story (UTC)
meta.token_mentionsstring[]Token symbols, e.g. ["BTC", "ETH"]
meta.source_namestringOriginal publisher, e.g. OKX
meta.categorystringTopic (see table below)
meta.sentimentstringpositive, negative, or neutral
meta.thumbnail_urlstringImage URL — https://img.upgate.online/crypto/{id}
meta.has_watermarkboolean | nullWhether the source image had a watermark
meta.feed_typestring | nullnull on Standard feeds; publication on Publication feeds
meta.adaptation_idinteger | nullPublication Edition ID (Publication feeds only)
meta.publication_identity_versioninteger | nullPublication profile version used
meta.hot_scorefloat | nullLive score when hot_score is enabled on your key
meta.hot_score_staticfloat | nullScore at processing time

Response headers

HeaderWhenDescription
X-Request-IDAlwaysTrace ID — send this to support
X-Feed-MessageStandard FeedHuman-readable feed status
X-Feed-MessagePublication feedsHuman-readable feed status
X-Feed-Message-CodePublication feedsMachine code, e.g. feed_up_to_date
X-Feed-CountPublication feedsNumber of articles returned

Categories

LabelDescription
market_trendsPrice action, market analysis, ETF flows
regulation_policyRegulation, policy, legal news
project_updatesUpgrades, roadmaps, team announcements
defiDeFi protocols and yields
nftNFT markets and collections
memecoinMeme coins and community tokens
exchangesListings, delistings, exchange updates
security_hacksHacks, exploits, vulnerabilities
adoption_partnershipsAdoption, partnerships, integrations
technology_innovationL2, consensus, technical upgrades
mining_infrastructureMining, staking, infrastructure
macro_economyMacro factors affecting crypto
unclassifiedLow-confidence classification

Languages

CodeLanguageDefault
enEnglishYes
faPersian (RTL)No

Errors Cheat Sheet

Common responses and what to do about them.

Response

HTTP 429
{
  "detail": "Rate limit exceeded. Please wait 1 minutes between requests."
}

HTTP 200 (normal)
[]

Symptoms & fixes

What you seeMeaningWhat to do
[] + direction=newerNo new articlesNormal — keep polling.
[] + direction=olderEnd of archive windowNormal on Standard Feed (2-day window).
HTTP 401Invalid, inactive, or expired keyCopy the key again from Dashboard → Key & Test. Renew at upgate.online/pricing if expired.
HTTP 403Publication Edition not enabledEnable Publication Edition from upgate.online/pricing or billing.
HTTP 409Publication Identity not set upConfigure Publication Identity in your dashboard first.
HTTP 429 (wait N min)frequency_minutes — called too soonWait N minutes, then retry.
HTTP 429 (daily limit)daily_limit reached for todayWait until UTC midnight or upgrade at upgate.online/pricing.
HTTP 400 (max items)limit exceeds max_items_per_requestLower the limit parameter.
HTTP 400 (invalid lang)Unsupported languageUse en or fa only.
HTTP 400 (invalid direction/token)Bad query on Publication feedsUse newer/older; token max 16 alphanumeric chars.
HTTP 503Publication Edition temporarily offRetry later.
HTTP 500Server errorRetry with backoff. Contact support with X-Request-ID.

FAQ

Common questions from developers integrating UpGate.

Frequently asked questions

How do I get an API key?

Start the free 7-day trial at upgate.online/login?mode=signup, or purchase a plan at upgate.online/pricing. After sign-in, copy your key from Dashboard → Key & Test.

Do you support webhooks?

No. Poll Feed endpoints for live apps, or Snapshot endpoints on a schedule.

Which languages are supported?

English (en) and Persian (fa). Default is en if you omit lang.

Is there a sandbox?

No public sandbox. Use the 7-day trial for your own key, or the docs demo tester (5 tries/day).

How do I filter by token?

Add ?token=BTC to any endpoint. Matching is case-insensitive. Publication feeds also require alphanumeric tokens (max 16 chars).

What's the difference between Standard and Publication feeds?

Standard returns translated wire copy. Publication returns stories adapted for your publication. Publication requires the Premium add-on and dashboard setup.

Can I use both Standard and Publication feeds?

Yes. Each feed type tracks read progress separately.

Rate Limits & Quotas

Each API key has limits set when your account is provisioned. See Dashboard → Key & Test for your current values.

Limit types

LimitWhat it meansHTTP code
frequency_minutesMinimum minutes between consecutive requests429
daily_limitMax requests per UTC day429
max_items_per_requestMax value for the limit query param400
access_expires_atKey expiry (trial ends after 7 days)401

Typical plan limits (API calls)

Plandaily_limitmax_itemsfrequency_minutes
7-day trial (Basic profile)331
Pro3051
Premium / Enterprise profile200101

Support

For integration help, contact support with your X-Request-ID, endpoint path, and request time. To get an API key, use the trial or pricing links — not email.