Pull CryptoGuide data into your own tools with the REST API and webhooks. Whale plan only.
Three read-only JSON endpoints under /api/v1, one key per request, and signed webhooks for new briefs and reports. Everything below matches the running code.
Base URL: https://cryptoguide.live
Send your key in an Authorization: Bearer header or in x-api-key. Keys start with cg_live_, are shown once when issued, and can be revoked here at any time. Up to 5 active keys per account. A key stops working the moment the Whale subscription lapses and is also subject to the regional availability of the API.
curl -H "Authorization: Bearer cg_live_…" \
https://cryptoguide.live/api/v1/market/pricesEvery successful response is a JSON object with a data field and a meta field. Market endpoints add stale and updatedAt. stale: true means every upstream source failed and you are seeing our last good value; updatedAt is when that value was fetched. data is null only if we have never had a value for that endpoint (or, for briefs, if nothing has been published yet).
/api/v1/market/pricesUSD quotes for BTC, ETH and SOL with 24h change. Sources: CoinGecko → CoinPaprika → Binance; served from a 20-second server cache.
Request
curl -H "Authorization: Bearer cg_live_…" \
https://cryptoguide.live/api/v1/market/pricesResponse
{
"data": [
{ "id": "BTC", "name": "Bitcoin", "price": 64123.5, "changePct": -1.23 },
{ "id": "ETH", "name": "Ethereum", "price": 3105.2, "changePct": 0.41 },
{ "id": "SOL", "name": "Solana", "price": 142.8, "changePct": 2.05 }
],
"stale": false,
"updatedAt": "2026-08-24T01:23:45.000Z",
"meta": { … }
}Fields
| data[].id | BTC | ETH | SOL |
| data[].name | Display name |
| data[].price | USD price (number) |
| data[].changePct | 24h change in percent (number, may be 0 when the source omits it) |
| stale | true when all sources failed and this is the last good value |
| updatedAt | ISO-8601 time the value was fetched, or null |
/api/v1/market/sentimentCrypto Fear & Greed index from Alternative.me; served from a 5-minute server cache. The index itself updates about once a day.
Request
curl -H "x-api-key: cg_live_…" \
https://cryptoguide.live/api/v1/market/sentimentResponse
{
"data": { "value": 42, "classification": "Fear", "timestamp": 1756000000000 },
"stale": false,
"updatedAt": "2026-08-24T01:20:00.000Z",
"meta": { … }
}Fields
| data.value | 0–100 |
| data.classification | Provider label, e.g. "Extreme Fear", "Fear", "Neutral", "Greed", "Extreme Greed" |
| data.timestamp | Provider timestamp in milliseconds since epoch |
| stale / updatedAt | As above |
/api/v1/briefs/latestThe most recent published AI Market Brief, detailed tier, in Korean and English. Non-personalized, AI-generated; the aiModel field names the model (or mock-v1 for the template fallback).
Request
curl -H "Authorization: Bearer cg_live_…" \
https://cryptoguide.live/api/v1/briefs/latestResponse
{
"data": {
"briefDate": "2026-08-24",
"tier": "DETAILED",
"sections": {
"btc": { "ko": "…", "en": "…" },
"eth": { "ko": "…", "en": "…" },
"altcoin": { "ko": "…", "en": "…" },
"macro": { "ko": "…", "en": "…" },
"today": { "ko": "…", "en": "…" }
},
"aiModel": "claude-…",
"createdAt": "2026-08-23T22:31:02.000Z",
"aiGenerated": true
},
"meta": { … }
}Fields
| data.briefDate | YYYY-MM-DD — the calendar date the brief was generated for (UTC date at generation time unless the job passes an explicit date) |
| data.tier | Always DETAILED on this endpoint |
| data.sections | btc, eth, altcoin, macro, today — each an object with ko and en text |
| data.aiModel | Model label shown on the site |
| data.createdAt | ISO-8601 publish time |
| data.aiGenerated | Always true |
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Retry-After: 37
{ "error": "rate limit exceeded" }| Status | error | Meaning | What to do |
|---|---|---|---|
| 401 | missing api key | No Authorization: Bearer or x-api-key header | Add the header |
| 401 | invalid api key | Key not recognised | Check for truncation; issue a new key if needed |
| 401 | api key revoked | Key was revoked on this page | Issue a new key |
| 429 | too many failed authentication attempts | 20 failed authentications from the same IP within a minute | Wait Retry-After seconds, then retry with a valid key |
| 403 | api access requires the Whale plan | Subscription lapsed or is below Whale | Renew or upgrade; keys resume automatically |
| 403 | api access is not available in your region | Regional availability policy | Not overridable by key or plan |
| 429 | rate limit exceeded | More than 60 requests in the current minute | Wait Retry-After seconds, then retry |
| 429 | monthly quota exceeded | 100,000 calls used this UTC month | Resets on the 1st (UTC); the Retry-After header here only reflects the minute window |
Error bodies are a JSON object with a single error string, using the messages above verbatim.
Every response ends with a meta object: provider ("CryptoGuide API v1"), docs (link to this page), disclaimer (ko and en) and terms (ko and en). The data is informational only and not investment advice; redistribution, resale and public re-publication are prohibited. If you store or display the data, keep the disclaimer and terms with it.
"meta": {
"provider": "CryptoGuide API v1",
"docs": "https://cryptoguide.live/api-center",
"disclaimer": { "ko": "본 데이터는 정보 제공 목적으로만 제공되며 투자 권유가 아닙니다. …", "en": "This data is provided for informational purposes only and is not investment advice. …" },
"terms": { "ko": "데이터의 재배포·재판매·대중 공개 게시를 금지합니다. …", "en": "Redistribution, resale, or public re-publication of this data is prohibited. …" }
}Register an https URL (port 443 or 8443) and we POST to it when a brief or report is published. Up to 5 webhooks per account. Deliveries have a 5-second timeout and are not retried; the last HTTP status is shown next to each webhook. URLs that resolve to private or internal addresses are rejected when you register them.
Events and their data fields: brief.published (briefDate, tier); report.published (slug, locale, cadence, category, periodKey); test.ping (message — sent by the Send test button). The body is always id, event, data and sentAt.
Headers: content-type: application/json, x-cryptoguide-event: <event>, x-cryptoguide-delivery: <delivery id, same as the body id>, x-cryptoguide-signature: sha256=<hex HMAC-SHA256 of the raw body, keyed with your webhook secret>.
POST https://example.com/webhook
content-type: application/json
x-cryptoguide-event: brief.published
x-cryptoguide-delivery: 0b9d6c1e-6a52-4c0e-9a55-3f1f6f0f2a11
x-cryptoguide-signature: sha256=9f2c…
{ "id": "0b9d6c1e-6a52-4c0e-9a55-3f1f6f0f2a11", "event": "brief.published", "data": { "briefDate": "2026-08-24", "tier": "STANDARD" }, "sentAt": "2026-08-23T22:31:05.000Z" }Verify by recomputing the HMAC over the raw request body and comparing with a constant-time compare. Reject anything that does not match. For replay protection reject old sentAt values, and ignore an id you have already processed.
import crypto from 'node:crypto'
export function verify(rawBody: string, header: string, secret: string) {
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex')
return expected.length === header.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(header))
}API keys and webhooks belong to an account and their use is logged. This is what we do automatically and what we ask of you.
Found a vulnerability or abuse of the service? Please write to the contact listed at /.well-known/security.txt.
This is v1. Fields may be added; existing fields are not renamed or removed without a new version prefix.