Price, indicators, levels, positioning, kimchi premium, US stocks, options, backtesting — the tools analysts use, 100 tools delivered as API and MCP. The free plan includes 2,000 credits per month, so you can build something in an evening.
You can call public data without a key. With a key, you use the actual tools as-is.
Attach in a single line to engines that support MCP, such as Claude Code and Claude Desktop.
claude mcp add daepak -e DAEPAK_API_KEY=dpk_live_… -- uvx daepak-mcp
The server does not describe anything on its own. It fetches the catalog from GET /v1/tools,
so it shows exactly what the key is allowed to and does not drift from the product.
400 —
because silently returning empty results is more dangerous.
# Catalog: schema, permissions, pricing curl -H "Authorization: Bearer dpk_live_…" https://daepak.com/v1/tools # Tool call curl -X POST https://daepak.com/v1/tools/get_price \ -H "Authorization: Bearer dpk_live_…" \ -H "Content-Type: application/json" \ -d '{"coin": "BTC"}'
{
"tool": "get_price",
"credits_used": 1,
"credits_left": 1999,
"took_ms": 104,
"data": { "coin": "BTC", "price": 78017.26, "change_24h": -1.2 }
}
All 98 tools are documented with argument schemas, required permissions, and credit prices. The specification is generated from the same schema that analysts receive, so it does not drift from the product.
OpenAPI 3.1 — readable as-is in Swagger UI, Redoc, Postman, Insomnia, code generators, and anywhere else. You can view it without a key.
| Method | Path | Description |
|---|---|---|
| GET | /v1/tools | Catalog — schema, permissions, pricing. Filtered by key permissions. |
| POST | /v1/tools/{name} | Tool call. The body is the arguments object. |
| GET | /v1/usage | This month's usage, broken down by tool. |
| POST | /v1/agent/messages | Analyst's completed answer (agent:chat) |
| POST | /v1/agent/stream | Same answer as an SSE stream. Continues in the background even if the connection drops |
| GET | /v1/agent/resume/{id} | Reconnect to an in-progress generation — resume from the missed events |
| POST | /v1/agent/cancel/{id} | Stop generation. If you just disconnect, the job keeps consuming tokens until it finishes |
| GET | /v1/agent/conversations | Conversation list for this key |
| GET | /v1/agent/conversations/{id} | Messages of a single conversation |
| GET | /v1/openapi.json | Spec. No key required |
Every tool call is wrapped in the same shape — along with the result, how much it cost comes back. Not settled later, but visible right there.
{
"tool": "get_price",
"credits_used": 1, // Failed calls are 0 — you don't pay
"credits_left": 1999,
"took_ms": 104,
"data": { … } // The tool's own result
}
/v1/agent/messages uses the same path as chat.
The response returns a conversation_id, so if you send it
in the next request, the context continues. Put a data-URL in images
and it also reads chart screenshots.
curl -X POST https://daepak.com/v1/agent/messages \
-H "Authorization: Bearer dpk_live_…" -H "Content-Type: application/json" \
-d '{"message": "How's BTC right now?", "lang": "ko"}'
# Put the conversation_id from the response into the next request to continue the conversation
{ "answer": "…", "conversation_id": 1234, "lang": "ko", "took_ms": 8120 }
The image drawn by make_chart comes in the response's url
— you can receive it directly with the same key.
conversation_id,
you get 404 — you cannot read someone else's history with your key.
Answers take tens of seconds. /v1/agent/stream streams via SSE
just like chat — status, tool,
delta (text fragments), suggest (follow-up
questions), done.
curl -N -X POST https://daepak.com/v1/agent/stream \
-H "Authorization: Bearer dpk_live_…" -H "Content-Type: application/json" \
-d '{"message": "How's BTC right now?", "mode": "mentor"}'
conversation comes first — keep the id inside it.
That's where you go back to when the connection drops.suggest comes after done.
If you stop reading at done, you'll never see it —
the order is intentional. The spinner must stop before computing the suggestion.
mode: "mentor" explains not just the conclusion but why it was read that way. The mode is set when the conversation is created.
| Plan | Monthly credits | Key | Requests per minute |
|---|---|---|---|
| Free | 2,000 | 1 | 10 |
| Lite | 10,000 | 2 | 30 |
| Pro | 60,000 | 5 | 60 |
| Premium | 200,000 | 10 | 120 |
⚠️ Per-minute limits matter more than monthly limits: monthly limits protect the budget, per-minute limits protect the service. A single external loop should not stop collection.
Error messages default to English — /v1 is read by developers in any country.
Send X-Lang: ko or ru to get a response in that language.
| Scope | Tools | Content |
|---|---|---|
| read:market | 78 | Quotes, candles, indicators, levels, scores, narratives, derivatives, order books, liquidations, options, US stocks, Korean markets, backtests |
| read:personal | 9 | My positions, portfolio, trading journal, catalysts, memory, background tasks |
| write:personal | 11 | Write to the same record |
| agent:chat | — | POST /v1/agent/messages — the analyst's completed answer |
Permission to read a journal does not grant permission to write. These are separate scopes.
Every tool sends its price along with the catalog. That means you can calculate the budget before execution. Prices are not guesses — they are measured in the production environment.
| Category | Example | Credits |
|---|---|---|
| Internal DB | Prices, indicators, levels, candles, narratives | 1 |
| External calls | Stocks, tokens, options, on-chain | 5 |
| Embeddings · Sandbox | News search, code execution | 20 |
402 along with two paths:
upgrade to a higher plan, or wait for next month’s reset. No overage charges —
we’d rather decline than send a bill no one expected.
The engine handles the tool list on its own. What a skill carries is what the schema can’t show — the order in which to ask, and how to read the numbers so you don’t get misled.
Current price → history → objective levels → positioning → system opinion → risk sizing. Order matters. Go backwards and you’ll force the facts to fit a size you’ve already chosen.
⚠️ Compare against a baseline, not zero. "68% directional accuracy" means nothing if you don’t know what a random entry at the same point in time would give you. And win rate is not money: in our own data, 68% accuracy came with a profit factor of 1.04.
The kimchi premium has two legs — an asset discount and a KRW discount. Reading them together leads to wrong interpretation. And we explain, but do not predict: we found no relationship in intraday windows (646 episodes).
| Code | Meaning |
|---|---|
| 401 | Key is missing, revoked, or malformed |
403 scope_required | Insufficient permissions for the key — the response indicates which permission is required |
400 user_id_not_accepted | The body contained user_id. The account is derived from the key |
| 429 | Per-minute limit exceeded. Per-minute limits protect the service; monthly limits protect the budget |
402 over_limit | Monthly credits exhausted — upgrade plan or wait until next month |