Daepak

Daepak for Developers

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.

Get API Key API Reference OpenAPI GitHub PyPI

Try It Now

You can call public data without a key. With a key, you use the actual tools as-is.

Connect via MCP

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.

⚠️ The account is determined by the key. You cannot specify a different user in the request body, and such fields are not ignored but explicitly rejected with 400 — because silently returning empty results is more dangerous.

Use Directly via REST

# 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 }
}

Reference

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.

Interactive reference openapi.json

OpenAPI 3.1 — readable as-is in Swagger UI, Redoc, Postman, Insomnia, code generators, and anywhere else. You can view it without a key.

Endpoint

MethodPathDescription
GET/v1/toolsCatalog — schema, permissions, pricing. Filtered by key permissions.
POST/v1/tools/{name}Tool call. The body is the arguments object.
GET/v1/usageThis month's usage, broken down by tool.
POST/v1/agent/messagesAnalyst's completed answer (agent:chat)
POST/v1/agent/streamSame 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/conversationsConversation list for this key
GET/v1/agent/conversations/{id}Messages of a single conversation
GET/v1/openapi.jsonSpec. No key required

Response envelope

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
}

Conversations · Images · Files

/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.

⚠️ Conversations verify the owner. If you put someone else's conversation_id, you get 404 — you cannot read someone else's history with your key.

Streaming

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.
⚠️ Even if the connection drops, generation continues in the background — the answer stays in the conversation, and when you reconnect you receive the missed events as a backlog. Dropping a long answer mid-wait should not mean throwing the work away.

mode: "mentor" explains not just the conclusion but why it was read that way. The mode is set when the conversation is created.

Limit

PlanMonthly creditsKeyRequests per minute
Free2,000110
Lite10,000230
Pro60,000560
Premium200,00010120

⚠️ 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.

Language

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.

Permissions (scopes)

ScopeToolsContent
read:market78Quotes, candles, indicators, levels, scores, narratives, derivatives, order books, liquidations, options, US stocks, Korean markets, backtests
read:personal9My positions, portfolio, trading journal, catalysts, memory, background tasks
write:personal11Write to the same record
agent:chatPOST /v1/agent/messages — the analyst's completed answer

Permission to read a journal does not grant permission to write. These are separate scopes.

Credits

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.

CategoryExampleCredits
Internal DBPrices, indicators, levels, candles, narratives1
External callsStocks, tokens, options, on-chain5
Embeddings · SandboxNews search, code execution20
When you run out of monthly credits, we’ll show you 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.

Skills

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.

Asset Analysis: From Data to Decision

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.

Hypothesis Testing

⚠️ 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.

Korean Market

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).

Reading Errors

CodeMeaning
401Key is missing, revoked, or malformed
403 scope_requiredInsufficient permissions for the key — the response indicates which permission is required
400 user_id_not_acceptedThe body contained user_id. The account is derived from the key
429Per-minute limit exceeded. Per-minute limits protect the service; monthly limits protect the budget
402 over_limitMonthly credits exhausted — upgrade plan or wait until next month