Documentation

CryptoBob Intelligence is a lightweight market-intelligence API that provides regime filters, rankings, and risk hints computed on multiple timeframes. It is designed for dashboards, quant research, and automated workflows.

Interactive docs

Swagger UI is available at https://api.cryptobob.de/docs

Use Swagger for live testing; use this page as the stable reference with examples and field semantics.

Authentication

Authenticate using your CryptoBob Access Token. Send it as:

Authorization: Bearer <access_token>

Notes:

  • Tokens are short-lived; refresh in your client after subscription changes (e.g. checkout=success).
  • Billing/internal endpoints are intentionally not documented here. This page only covers customer-facing endpoints.

Base URL

https://api.cryptobob.de

Usage & quota

Requests are tracked per calendar month (UTC). /health and /v1/usage are not counted toward quota.

Quickstart

Replace $TOKEN with your CryptoBob Access Token.

export API_BASE="https://api.cryptobob.de"
export TOKEN="..."

curl -s \
  -H "Authorization: Bearer $TOKEN" \
  "$API_BASE/health"

curl -s \
  -H "Authorization: Bearer $TOKEN" \
  "$API_BASE/v1/rankings?timeframe=15m&limit=10"
Data model: Snapshot

Most endpoints return a Snapshot object (or arrays / maps of snapshots). This object is stable and suitable for caching.

Snapshot fields
  • symbol (string) — Trading pair, e.g. BTCUSDC.
  • timeframe (string) — One of 15m, 30m, 1h.
  • timestamp (string, ISO-8601) — Timestamp of the latest computed candle used for this snapshot.
  • price (number) — Latest close price from the timeframe candle.
  • regime (object) — Tradeability decision and reasons.
  • setup (object) — Ranking features (currently a single setup score).
  • risk (object) — ATR-based risk hints (stop and trailing percentages).
Regime
  • regime.tradeable (boolean) — true if the symbol meets regime filters (trend/strength/liquidity).
  • regime.reasons (string[]) — If tradeable=false, contains human-readable reasons. Values may include:
    • "ADX too low"
    • "Low volume"
    • "Below EMA200"
Setup
  • setup.score (number) — Higher means “more attractive” relative setup. Used for rankings. Not a probability; use it to sort.
Risk
  • risk.stop_pct (number) — Suggested stop distance in percent (e.g. 2.6 means ~2.6%).
  • risk.trail_pct (number) — Suggested trailing distance in percent.
Example Snapshot (JSON)
{
  "symbol": "BTCUSDC",
  "timeframe": "15m",
  "timestamp": "2025-12-15T10:45:00+00:00",
  "price": 104250.12,
  "regime": { "tradeable": true, "reasons": [] },
  "setup": { "score": 2.15 },
  "risk": { "stop_pct": 2.6, "trail_pct": 3.3 }
}
Endpoints

All endpoints require Authorization: Bearer <access_token>.

GET /health

Health check and supported timeframes. Not counted toward quota.

Example request
curl -H "Authorization: Bearer $TOKEN" \
"$API_BASE/health"
Example response
{
  "status": "ok",
  "timeframes": ["15m", "30m", "1h"]
}
Response fields
  • status — Always "ok" if service is healthy.
  • timeframes — Array of supported timeframes.
GET /symbols

Returns the configured symbol universe and supported timeframes.

Example request
curl -H "Authorization: Bearer $TOKEN" \
"$API_BASE/symbols"
Example response
{
  "symbols": ["BTCUSDC", "ETHUSDC"],
  "timeframes": ["15m", "30m", "1h"]
}
Response fields
  • symbols — List of tradable pairs available in the API.
  • timeframes — Array of supported timeframes.
GET /v1/usage

Returns your current monthly API usage. Not counted toward quota.

Example request
curl -H "Authorization: Bearer $TOKEN" \
"$API_BASE/v1/usage"
Example response
{
  "plan": "basic",
  "month": "2025-12",
  "used": 12452,
  "limit": 20000,
  "remaining": 7548
}
Response fields
  • plan — Your effective plan name (e.g. free, basic, pro).
  • month — Billing month (UTC) in YYYY-MM.
  • used — Requests used in this month (counted endpoints only).
  • limit — Monthly request limit for the plan.
  • remaining — Remaining requests for the month.
GET /v1/regime

Returns snapshots focusing on regime/tradeability. Use it to gate entries and filter symbols.

Query parameters
  • timeframe 15m | 30m | 1h | all (default 15m)
  • symbol — optional filter (e.g. BTCUSDC)
Example request
curl -H "Authorization: Bearer $TOKEN" \
"$API_BASE/v1/regime?timeframe=15m"
Example response (timeframe=15m)
[
  {
    "symbol": "BTCUSDC",
    "timeframe": "15m",
    "timestamp": "2025-12-15T10:45:00+00:00",
    "price": 104250.12,
    "regime": { "tradeable": true, "reasons": [] },
    "setup": { "score": 2.15 },
    "risk": { "stop_pct": 2.6, "trail_pct": 3.3 }
  }
]
Response shape
  • If timeframe is a single timeframe, response is Snapshot[].
  • If timeframe=all, response is { "15m": Snapshot[], "30m": Snapshot[], "1h": Snapshot[] }.
GET /v1/rankings

Returns symbols sorted by setup.score (descending). Use this to pick the best candidates for further filtering.

Query parameters
  • timeframe 15m | 30m | 1h | all (default 15m)
  • limit — number of results (1–200), default 10
Example request
curl -H "Authorization: Bearer $TOKEN" \
"$API_BASE/v1/rankings?timeframe=15m&limit=10"
Example response
[
  {
    "symbol": "BTCUSDC",
    "timeframe": "15m",
    "timestamp": "2025-12-15T10:45:00+00:00",
    "price": 104250.12,
    "regime": { "tradeable": true, "reasons": [] },
    "setup": { "score": 2.15 },
    "risk": { "stop_pct": 2.6, "trail_pct": 3.3 }
  }
]
Interpretation tips
  • Use regime.tradeable as your first filter.
  • Use risk.stop_pct and risk.trail_pct to size risk and avoid illiquid regimes.
GET /v1/snapshot

Returns full snapshots for all symbols. Use this for full dashboards or batch analytics.

Query parameters
  • timeframe 15m | 30m | 1h | all (default 15m)
Example request
curl -H "Authorization: Bearer $TOKEN" \
"$API_BASE/v1/snapshot?timeframe=15m"
Example response
[
  {
    "symbol": "BTCUSDC",
    "timeframe": "15m",
    "timestamp": "2025-12-15T10:45:00+00:00",
    "price": 104250.12,
    "regime": { "tradeable": true, "reasons": [] },
    "setup": { "score": 2.15 },
    "risk": { "stop_pct": 2.6, "trail_pct": 3.3 }
  }
]
Notes
  • This endpoint typically has the highest payload size (all symbols). Consider caching on your side.
  • When timeframe=all, response is a map of timeframe → snapshots.
Errors

The API uses standard HTTP status codes. Error bodies are JSON.

  • 401 Unauthorized — Missing/invalid token.
  • 403 Forbidden — Subscription inactive or insufficient plan.
  • 429 Too Many Requests — Monthly quota exceeded.
  • 400 Bad Request — Invalid parameters (e.g. unsupported timeframe).
Example quota error (429)
{
  "detail": {
    "error": "monthly_quota_exceeded",
    "limit": 20000,
    "used": 20001,
    "plan": "basic"
  }
}