CoinNudge research data API documentation
Use one free API key to query current CoinNudge Research datasets, or use a paid data entitlement for immutable Market Events releases and bulk files. This guide is public; keys stay in your private workspace.
What can I query?
Free Research API: every signed-in account may create one key and query the current datasets behind all CoinNudge Research pages, in JSON or CSV, at up to 60 requests per minute. Start with https://coinnudge.site/api/data/v1/research/catalog to discover the stable dataset IDs and request URLs.
Paid Market Events API: Researcher and Research Desk additionally include versioned Market Events v1 history for BTCUSDT, ETHUSDT, SOLUSDT, BNBUSDT, XRPUSDT and DOGEUSDT on Binance Spot. Check the paid catalog and manifest for actual published dates. This is not a raw exchange feed or an all-market multi-year archive.
A free Research request reads the latest published snapshot and its declared observation time. A paid Market Events request reads an immutable release; recent daily partitions are checked hourly and a revision receives a new release ID.
Free public Research access
Every published Research article is free to read. Eligible live Research pages also expose the current source-backed dataset shown on that page as no-key JSON and CSV through /api/research/live/PAGE_KEY and /api/research/live/PAGE_KEY.csv.
Fair-use limit: 60 requests per minute per IP, shared across all public Research JSON and CSV endpoints. Follow each page's published refresh interval instead of polling continuously. Free access does not include a bulk feed of article text, unpublished or internal material, historical snapshots, the internal archive, or paid Market Events v1 releases.
Free API key: authentication and request URLs
Every signed-in account can create one free key and read the current datasets behind CoinNudge Research pages at up to 60 requests per minute. Paid data plans additionally unlock Market Events history, filtered rows and complete JSON, CSV and Parquet releases.
- Create and save your key. Sign in, open API Keys, enter a label, and click Create API key. A paid plan is not required for the free Research scope. Copy the complete key beginning with
cnd_; the shortened prefix in the table is not usable. The secret is shown once. If lost, revoke it and create a replacement. - Send it as a request header. Base URL:
https://coinnudge.site/api/data/v1. Every endpoint below uses GET and the headerAuthorization: Bearer YOUR_API_KEY. Replace YOUR_API_KEY with your full key; do not include quotation marks around the key in the header value. Opening the URL in a browser tab does not attach this header. - Choose the correct scope. Free Research: request
/research/catalog, copy a datasetid, then request/research/DATASET_IDor/research/DATASET_ID/csv. Paid Market Events: start with/catalogand/releases?limit=30. - Preserve the dataset context. A Research response is a current snapshot and declares its observation time, calculation version and limitations. A paid release ID is immutable; keep the same ID while paging and save it with your analysis.
Security: use the key in your own backend or local notebook, never in a public website’s JavaScript, URL, shared notebook or chat message. Giving a key to an agent lets it consume your account quota. These endpoints only read public Research datasets or data covered by your paid entitlement; they do not place trades or expose internal logs and customer records.
Free Research API endpoints
All three endpoints use GET. Send Authorization: Bearer YOUR_API_KEY on every request. There is no request body and the key must never be placed in the query string.
| Complete request URL | What you receive |
|---|---|
https://coinnudge.site/api/data/v1/research/catalog | All current Research dataset IDs, calculation versions, JSON/CSV request URLs and your account limit. |
https://coinnudge.site/api/data/v1/research/DATASET_ID | One current Research dataset as JSON. Replace the final segment with an ID returned by the catalog; for example market-breadth. |
https://coinnudge.site/api/data/v1/research/DATASET_ID/csv | The current tabular observations for that dataset as CSV. The CSV header is the field list for those rows; page-level JSON summaries are not repeated as rows. |
Free Research API fields
The API has a stable common envelope and dataset-specific measurements. Do not assume that a funding-rate row has the same columns as market breadth or liquidation data. Use the catalog to select an ID, then inspect that dataset's JSON keys or CSV header before binding fields in production.
| Catalog field | Type | Meaning |
|---|---|---|
scope | string | The entitlement boundary. The free scope is current public Research snapshots, not historical Market Events files. |
datasets[] | array | One entry per available Research dataset. |
datasets[].id | string | Stable dataset identifier used as DATASET_ID in JSON and CSV URLs. |
datasets[].calculation_version | string | Version of the published calculation or classification rule. |
datasets[].json_url / csv_url | string | Same-origin request paths for the current JSON snapshot and its tabular CSV rows. |
limits.keys / rpm / daily_bytes | number | Your active-key allowance, account-wide requests per minute, and paid file-byte allowance. Free Research has no bulk-download byte allowance. |
limitations[] | array | Scope and interpretation boundaries that must travel with downstream analysis. |
| Dataset JSON field | Type | Meaning |
|---|---|---|
key | string | Dataset ID for this snapshot. |
generated_at / updated | number | UTC Unix seconds for calculation generation and the newest underlying observation available to the snapshot. |
stale | boolean | Whether the snapshot exceeds its declared freshness boundary. A successful HTTP response does not override true. |
refresh_seconds | number | Declared calculation refresh interval. Cache locally and do not poll faster than this value. |
calculation_version | string | Rule version required to reproduce or compare this result. |
source / source_url | string or null | Named source and, when available, its public reference URL. Multi-source datasets may describe sources inside observations instead. |
window | object or string | Observation interval or lookback used by this dataset; its exact child fields are dataset-specific. |
summary | object or string | Current answer or aggregate. Related objects such as counts, health and evidence components appear only when relevant. |
items[] | array | Primary observations. Row fields differ by dataset and become the columns in the CSV response. |
limitation | string, array or object | Missing-data, coverage and interpretation boundaries. Preserve it alongside downloaded values. |
Example row fields: market-breadth
| Field | Meaning |
|---|---|
symbol / base | Exchange pair and base asset, such as BTCUSDT and BTC. |
source | Venue or market source for this observation. |
price | Observed quote price; unit follows the pair's quote asset. |
change_24h | Rolling 24-hour price change in percent, not a decimal return. |
volume_24h | Rolling 24-hour quote-asset turnover. |
source_time | UTC Unix seconds attached to the source observation. |
calculation_version | Calculation version copied onto the row for auditability. |
For another dataset, call its JSON URL and inspect items[0]; for CSV, the first line is the exact current row schema. Fields may be absent or null when the source did not provide a valid observation. Never convert missing values to zero. JSON also contains page-level summaries and provenance that CSV cannot represent, so retain the JSON response when audit context matters.
Paid Market Events API endpoints
GET path after https://coinnudge.site/api/data/v1 | What you receive |
|---|---|
/catalog | Available dataset, symbols, coverage dates, freshness and account limits. Do not assume multi-year or all-market history. |
/schema | Field names, types, units, nullable flags and limitations for the current product. For an exact older version, download its bundled schema. |
/releases?limit=30 | Up to 30 published daily releases, latest first. Limit: 1–100; no date-range or offset parameter on this endpoint. |
/rows/RELEASE_ID | Filtered rows plus total, has_more and next_offset. Parameters are explained below. |
/download/RELEASE_ID/FORMAT | Full daily file. FORMAT: csv, parquet, json, manifest or schema. Row filters do not apply to downloads. Manifest provides coverage and file checksums. |
Paid Market Events filters
The parameters below apply to /rows/RELEASE_ID and require an active Researcher or Research Desk data plan. Current Research endpoints use the stable dataset ID returned by /research/catalog and do not accept these release-row filters.
| Parameter | Allowed values / default | Example |
|---|---|---|
| symbol | BTCUSDT, ETHUSDT, SOLUSDT, BNBUSDT, XRPUSDT or DOGEUSDT. Omit for all six. | symbol=BTCUSDT |
| sample_type | event or control. Omit for both. Controls are scheduled comparisons, not matched negative signals. | sample_type=event |
| limit | 1–500 rows per request; default 100. | limit=100 |
| offset | 0–100000; default 0. Use the returned next_offset to continue. | offset=0 |
items contains this page’s records; total counts all records matching your filters. If has_more is true, request next_offset with the same release ID and filters. An empty items list with total 0 is a valid result, not an API failure. No event may have qualified for that coin on that day.
Times are Unix seconds in UTC. Inspect feature_status, feature_pit_eligible and window status fields before analysis. Retrospective context was obtained later; pending or gap outcomes are missing, not zero returns. Future returns must not be used as predictor inputs. Read real rows and field definitions →
Copy a working example
The first example works with a free account and shows all three Research API requests. The paid Python example needs no third-party package and automatically selects an immutable Market Events release, queries matching BTC events and optionally verifies a full CSV download.
Free Research cURL example
# Available to every signed-in CoinNudge account.
read -r -s -p "CoinNudge API key: " COINNUDGE_DATA_KEY
echo
# List all current Research datasets.
curl --fail-with-body -H "Authorization: Bearer $COINNUDGE_DATA_KEY" \
https://coinnudge.site/api/data/v1/research/catalog
# Read one current dataset as JSON.
curl --fail-with-body -H "Authorization: Bearer $COINNUDGE_DATA_KEY" \
https://coinnudge.site/api/data/v1/research/market-breadth
# Download the same current dataset as CSV.
curl --fail-with-body -H "Authorization: Bearer $COINNUDGE_DATA_KEY" \
https://coinnudge.site/api/data/v1/research/market-breadth/csv \
--output coinnudge-market-breadth.csv
unset COINNUDGE_DATA_KEYShow paid Market Events Python example
Paid Python example
# Python 3: standard library only. Works on Windows, macOS and Linux.
# Save as coinnudge_example.py, then run: python coinnudge_example.py
import getpass
import hashlib
import json
from pathlib import Path
from urllib.error import HTTPError
from urllib.parse import urlencode
from urllib.request import Request, urlopen
BASE = "https://coinnudge.site/api/data/v1"
key = getpass.getpass("CoinNudge API key (hidden): ").strip()
def fetch(path):
request = Request(BASE + path, headers={"Authorization": "Bearer " + key})
try:
with urlopen(request, timeout=30) as response:
return response.read()
except HTTPError as error:
detail = error.read().decode("utf-8", errors="replace")
raise SystemExit(f"HTTP {error.code}: {detail}") from None
def get_json(path):
return json.loads(fetch(path))
catalog = get_json("/catalog")
print("Dataset coverage:", catalog["datasets"])
releases = get_json("/releases?limit=30")["items"]
if not releases:
raise SystemExit("No published releases yet; try again later.")
# Latest available daily release; change this selection for another day.
release = releases[0]
release_id = release["id"]
print("Selected day:", release["day"], "version:", release["version"])
# Query BTC events. Keep the SAME release ID on every page.
offset = 0
rows = []
while True:
query = urlencode({"symbol": "BTCUSDT", "sample_type": "event",
"limit": 500, "offset": offset})
page = get_json(f"/rows/{release_id}?{query}")
rows.extend(page["items"])
if not page["has_more"]:
break
offset = page["next_offset"]
if not isinstance(offset, int) or offset > 100000:
raise SystemExit("Use a full file download for this larger release.")
print("Matching BTC event rows:", len(rows))
# Save filtered JSON without overwriting an existing file.
filtered = Path(f"btc-events-{release_id}.json")
if not filtered.exists():
with filtered.open("x", encoding="utf-8") as file:
json.dump(rows, file, indent=2)
# Optional full daily CSV: includes ALL six markets and event/control rows.
if input("Also download the full daily CSV? [y/N] ").lower() == "y":
content = fetch(f"/download/{release_id}/csv")
expected = release["files"]["csv"]["sha256"]
if hashlib.sha256(content).hexdigest() != expected:
raise SystemExit("Checksum mismatch; do not use this file.")
output = Path(f"coinnudge-{release_id}.csv")
if not output.exists():
with output.open("xb") as file:
file.write(content)
print("Verified CSV:", output)
# Inspect field definitions before analysis. Never replace null with 0.
schema = get_json("/schema")
print("Field count:", len(schema["fields"]))Show paid Market Events cURL example
Paid cURL example
# Bash on macOS / Linux. If using zsh, run bash first.
# Enter your key without displaying it.
read -r -s -p "CoinNudge API key: " COINNUDGE_DATA_KEY
echo
export COINNUDGE_DATA_KEY
# 1. Check access and current coverage.
curl --fail-with-body -H "Authorization: Bearer $COINNUDGE_DATA_KEY" \
https://coinnudge.site/api/data/v1/catalog
# 2. List daily releases. Copy the full id for the day you need.
curl --fail-with-body -H "Authorization: Bearer $COINNUDGE_DATA_KEY" \
"https://coinnudge.site/api/data/v1/releases?limit=30"
# 3. Replace this placeholder with that full 64-character id.
RELEASE_ID="REPLACE_WITH_RELEASE_ID"
curl --fail-with-body -H "Authorization: Bearer $COINNUDGE_DATA_KEY" \
"https://coinnudge.site/api/data/v1/rows/$RELEASE_ID?symbol=BTCUSDT&sample_type=event&limit=100&offset=0"
# 4. Download the ENTIRE daily release, not just the BTC filter above.
curl --fail-with-body -H "Authorization: Bearer $COINNUDGE_DATA_KEY" \
"https://coinnudge.site/api/data/v1/download/$RELEASE_ID/csv" \
--output "coinnudge-$RELEASE_ID.csv"
unset COINNUDGE_DATA_KEYLimits, refreshes and common errors
Free: 1 key and 60 requests/minute for current Research datasets. Researcher: 1 key, 60 requests/minute and 1 GiB/day. Research Desk: 5 keys, 300 requests/minute and 5 GiB/day. Limits are account-wide, not per key. Paid byte budgets use UTC calendar days. Read each Research dataset's declared refresh interval instead of polling continuously; reuse downloaded immutable releases.
| Status | What to check |
|---|---|
| 401 | Missing, incorrect or revoked key. Use the full cnd_ key in the Bearer header, not the displayed prefix or an internal audit key. |
| 403 | The request targets paid Market Events without an active data plan, or the key exceeds the current plan allowance after a downgrade. The free Research endpoints remain available to a valid first key. |
| 404 | Unknown release ID or unavailable file. Obtain the ID from releases; an older release may predate its bundled schema. |
| 409 when creating a key | All permitted key slots are used. Revoke an unused key or change your plan before creating another. |
| 422 | Invalid parameter. Check uppercase symbol, sample_type and numeric limits against the table above. |
| 429 | Account quota reached. For request limits, wait at least the Retry-After interval. A daily byte limit will not clear after one minute—wait for the next UTC day or change the plan. Do not retry in a tight loop. |
| 413 / 503 | Oversized row query: use a full partition download. An unavailable or checksum-failing file must not be analysed as valid data; retry later and preserve the error for support. |
Which timestamps and fields are safe for research?
Read the release-specific schema before joining rows. Observation time, availability time and archive/ingestion time answer different questions. An input recovered after an event must not be used as if it were known then. Retrospective and missing-quality flags are part of the evidence, not optional cleaning noise.
Event rows are recorded public triggers. Control rows are scheduled comparison observations, not matched negative signals. Forward returns, maximum favorable excursion and maximum adverse excursion are outcomes, not predictor inputs, actual fills or fee-adjusted profits. Pending or incomplete windows stay missing, never zero.
For a repeatable analysis, save the release ID, bundled schema and manifest checksum; state the chosen symbols, event/control filters, outcome windows and valid sample counts. Do not combine row pages from different release IDs.
Inspect fields, sample rows and missingnessHow do I report a data issue?
Contact samqikaka625@gmail.com for support, coverage reviews or data corrections. Keep the release ID, request path without credentials, observation identifier, UTC time and expected versus actual value. Never include your API key, password or private account data. The alerts bot is an automated notification service, not a human support inbox.
Operated by LUMOS AI TECHNOLOGY CO LTD, Hong Kong. Read research and correction standards and service boundaries. Explore the data catalog before purchasing a scope outside Market Events v1.