REST API
The KITE 2.0 REST API provides programmatic access to aggregated financial news from 38+ 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") |
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") |
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"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": "",
"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. Useful for building dynamic filter UIs.
Example Request
const 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);Response
{
"sources": [
{ "name": "BBC News", "category": "financial_news" },
{ "name": "Bloomberg Markets", "category": "financial_news" },
{ "name": "CoinDesk", "category": "financial_news" },
{ "name": "Fed - All Press", "category": "central_banks" },
{ "name": "Bank of England - News", "category": "central_banks" },
{ "name": "FCA", "category": "regulators" }
]
}/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 |
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.