REST API
The KITE 2.0 REST API provides programmatic access to aggregated financial news from 34 sources. All endpoints return JSON and require authentication via an API key.
Base URL
https://kite-api.gtdigital.devAuthentication
All API requests require a valid API key. To get a key, create an account and generate one from your Account → API Keys page.
Include your key in the X-API-Key header with every request:
curl -H "X-API-Key: kite_your_key_here" https://kite-api.gtdigital.dev/api/newsconst response = await fetch('https://kite-api.gtdigital.dev/api/news', {
headers: { 'X-API-Key': 'kite_your_key_here' }
});Requests without a valid key receive a 401 Unauthorized response:
{
"error": "Missing API key. Include an X-API-Key header."
}Endpoints Overview
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/news | Fetch news items with filtering and pagination |
| GET | /api/news/:id | Fetch a single news item by ID |
| GET | /api/sources | List all available news sources |
| GET | /api/categories | List all available news categories |
Endpoints
/api/newsFetch news items with optional server-side filtering, keyword matching, and pagination. Combines all filter parameters with AND logic.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
source | string | -- | Comma-separated source names to filter by (e.g. "BBC News,CNBC") |
category | string | -- | Comma-separated categories: financial_news, central_banks, regulators |
keywords | string | -- | Comma-separated keywords to match against title, description, tickers, and tags |
search | string | -- | Free-text search across title, source, description, author, tickers, and tags |
tickers | string | -- | Comma-separated ticker symbols to filter by (e.g. "AAPL,BTC") |
companies | string | -- | Comma-separated company names to match against title and description (e.g. "Apple,Tesla") |
sentiment | string | -- | Comma-separated sentiment labels to filter by. Valid values: positive, negative, neutral |
from | ISO 8601 | -- | Filter items published on or after this date |
to | ISO 8601 | -- | Filter items published on or before this date |
page | integer | 1 | Page number for pagination |
perPage | integer | 50 | Items per page (max 200) |
sort | string | -published | Sort field. Prefix with - for descending (e.g. "-created", "source", "sentiment_score") |
Example Request
// Fetch the latest 20 Bitcoin-related news from financial sources
const response = await fetch(
'https://kite-api.gtdigital.dev/api/news?category=financial_news&keywords=Bitcoin&perPage=20',
{ headers: { 'X-API-Key': 'kite_your_key_here' } }
);
const data = await response.json();
console.log(data.items); // Array of NewsItem objects
console.log(data.totalItems); // Total matching items
console.log(data.totalPages); // Total pages available# Fetch news from BBC and CNBC, published after Jan 1 2025
curl -H "X-API-Key: kite_your_key_here" \
"https://kite-api.gtdigital.dev/api/news?source=BBC%20News,CNBC&from=2025-01-01T00:00:00Z"
# Search for Federal Reserve mentions across all fields
curl -H "X-API-Key: kite_your_key_here" \
"https://kite-api.gtdigital.dev/api/news?search=federal%20reserve&perPage=10"
# Filter by specific ticker symbols
curl -H "X-API-Key: kite_your_key_here" \
"https://kite-api.gtdigital.dev/api/news?tickers=AAPL,TSLA&sort=-published"
# Only negative sentiment news (market-moving bad news)
curl -H "X-API-Key: kite_your_key_here" \
"https://kite-api.gtdigital.dev/api/news?sentiment=negative&sort=-published"
# Positive central bank news, sorted by sentiment score
curl -H "X-API-Key: kite_your_key_here" \
"https://kite-api.gtdigital.dev/api/news?category=central_banks&sentiment=positive&sort=-sentiment_score"Response
{
"items": [
{
"id": "abc123xyz",
"title": "Fed Holds Rates Steady Amid Inflation Concerns",
"url": "https://example.com/article",
"description": "The Federal Reserve held interest rates...",
"published": "2025-05-01T14:00:00.000Z",
"source": "BBC News",
"category": "central_banks",
"guid": "https://example.com/article-guid",
"author": "Jane Smith",
"tags": ["federal reserve", "interest rates"],
"tickers": ["SPY"],
"article_type": "news",
"image_url": "https://example.com/image.jpg",
"speaker": "",
"speaker_title": "",
"institution": "",
"event_location": "",
"base_currency": "",
"target_currency": "",
"exchange_rate": "",
"sentiment_label": "negative",
"sentiment_score": -0.183,
"sentiment_positive": [],
"sentiment_negative": ["recession", "inflation"],
"political_leaning": "center",
"created": "2025-05-01T14:05:00.000Z",
"updated": "2025-05-01T14:05:00.000Z"
}
],
"page": 1,
"perPage": 50,
"totalItems": 1234,
"totalPages": 25
}/api/news/:idFetch a single news item by its unique record ID.
Path Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
id | string | -- | The unique PocketBase record ID |
Example Request
const response = await fetch('https://kite-api.gtdigital.dev/api/news/abc123xyz', {
headers: { 'X-API-Key': 'kite_your_key_here' }
});
const data = await response.json();
console.log(data.item.title);Error Response (404)
{
"error": "News item not found"
}/api/sourcesList all available feed sources with their category. Use this to discover valid source names before filtering news requests or setting up WebSocket subscriptions.
Example Request
curl -H "X-API-Key: kite_your_key_here" https://kite-api.gtdigital.dev/api/sourcesconst response = await fetch('https://kite-api.gtdigital.dev/api/sources', {
headers: { 'X-API-Key': 'kite_your_key_here' }
});
const data = await response.json();
// Group sources by category
const grouped = Object.groupBy(data.sources, s => s.category);
console.log(grouped.financial_news); // financial news sources
console.log(grouped.central_banks); // central bank sources
console.log(grouped.regulators); // regulator sourcesResponse
{
"sources": [
{ "name": "BBC News", "category": "financial_news" },
{ "name": "Bloomberg Markets", "category": "financial_news" },
{ "name": "NY Times", "category": "financial_news" },
{ "name": "Washington Post", "category": "financial_news" },
{ "name": "CNBC", "category": "financial_news" },
{ "name": "CNBC Markets", "category": "financial_news" },
{ "name": "CNBC Earnings", "category": "financial_news" },
{ "name": "Financial Times", "category": "financial_news" },
{ "name": "TechCrunch", "category": "financial_news" },
{ "name": "Forbes", "category": "financial_news" },
{ "name": "MarketWatch", "category": "financial_news" },
{ "name": "Seeking Alpha", "category": "financial_news" },
{ "name": "Motley Fool", "category": "financial_news" },
{ "name": "Investing.com", "category": "financial_news" },
{ "name": "Yahoo Finance", "category": "financial_news" },
{ "name": "ZeroHedge", "category": "financial_news" },
{ "name": "CoinDesk", "category": "financial_news" },
{ "name": "CoinTelegraph", "category": "financial_news" },
{ "name": "CryptoSlate", "category": "financial_news" },
{ "name": "CryptoPotato", "category": "financial_news" },
{ "name": "Bitcoin Magazine", "category": "financial_news" },
{ "name": "Decrypt", "category": "financial_news" },
{ "name": "The Block", "category": "financial_news" },
{ "name": "Fed - All Press", "category": "central_banks" },
{ "name": "Fed - Monetary Policy", "category": "central_banks" },
{ "name": "Fed - Speeches", "category": "central_banks" },
{ "name": "Fed - Financial Stability","category": "central_banks" },
{ "name": "Bank of England - News", "category": "central_banks" },
{ "name": "Bank of England - Publications", "category": "central_banks" },
{ "name": "ECB - Press", "category": "central_banks" },
{ "name": "Bank of Japan", "category": "central_banks" },
{ "name": "Bank of Canada", "category": "central_banks" },
{ "name": "FCA", "category": "regulators" },
{ "name": "SEC - Press Releases", "category": "regulators" }
]
}Use the name values exactly as returned here when filtering via the source query parameter on /api/news or the sources array in a WebSocket subscribe message. Source names are case-sensitive.
/api/categoriesList all available news categories with their human-readable labels.
Example Request
curl -H "X-API-Key: kite_your_key_here" https://kite-api.gtdigital.dev/api/categoriesResponse
{
"categories": [
{ "id": "financial_news", "label": "Financial News" },
{ "id": "central_banks", "label": "Central Banks" },
{ "id": "regulators", "label": "Regulators" }
]
}NewsItem Schema
Every news item returned by the API contains the following fields. Fields may be empty strings or empty arrays when not applicable to a particular source.
| Parameter | Type | Default | Description |
|---|---|---|---|
id | string | -- | Unique record ID |
title | string | -- | Article headline |
url | string | -- | Link to the original article |
description | string | -- | Short summary or snippet |
published | ISO 8601 | -- | Article publication date |
source | string | -- | Feed source name (e.g. "Bloomberg Markets") |
category | string | -- | One of: financial_news, central_banks, regulators |
guid | string | -- | Unique identifier from the RSS feed |
author | string | -- | Author name(s) |
tags | string[] | -- | Array of category/tag strings from the feed |
tickers | string[] | -- | Extracted stock/crypto ticker symbols |
article_type | string | -- | Feed-specific article type |
image_url | string | -- | Thumbnail or featured image URL |
speaker | string | -- | Speaker name (central bank speeches) |
speaker_title | string | -- | Speaker job title |
institution | string | -- | Institution abbreviation (e.g. "RBA", "Fed") |
event_location | string | -- | Venue for speeches/events |
base_currency | string | -- | Base currency code (exchange rates) |
target_currency | string | -- | Target currency code (exchange rates) |
exchange_rate | string | -- | Numeric exchange rate value |
sentiment_label | string | -- | Sentiment classification: "positive", "negative", or "neutral" |
sentiment_score | number | -- | AFINN comparative sentiment score, normalized to roughly -1 to +1 |
sentiment_positive | string[] | -- | Top positive trigger words found in the article |
sentiment_negative | string[] | -- | Top negative trigger words found in the article |
political_leaning | string | -- | Source political leaning: "left", "center-left", "center", "center-right", or "right" |
created | ISO 8601 | -- | Record creation timestamp |
updated | ISO 8601 | -- | Record last update timestamp |
Error Handling
All error responses follow a consistent format:
{
"error": "Description of what went wrong"
}Status Codes
| Code | Meaning |
|---|---|
200 | Success |
400 | Bad request (invalid parameters) |
401 | Unauthorized (missing or invalid API key) |
404 | Resource not found |
500 | Internal server error |
Rate Limiting
There are currently no rate limits enforced. Please be respectful with request frequency. For real-time updates, use the WebSocket API instead of polling.
