Claude Code advanced
Claude Code is Anthropic’s terminal coding agent, and it talks to MirAPI over the Anthropic Messages API (POST /v1/messages). This page covers what to configure once the connection works: pinning the model, restricting permissions, wiring lifecycle hooks, and capping spend. Claude Code only speaks the Anthropic protocol, so there is no OpenAI or Gemini variant to set up.
Prerequisites: Claude Code configured with ANTHROPIC_BASE_URL="https://api.mirapi.ai" (the bare origin, no /v1) and ANTHROPIC_AUTH_TOKEN. See Claude Code.
settings.json
Section titled “settings.json”Project settings live in .claude/settings.json in the project root. The keys you are most likely to touch:
| Key | What it does |
|---|---|
model |
Pins the MirAPI model for the project, e.g. deepseek-chat |
max_turns |
Caps the tool-use turns per task, bounding runaway loops |
permissions.allow |
Tools and patterns Claude Code may run without asking |
permissions.deny |
Tools and patterns to block or flag |
hooks |
Commands that run on lifecycle events (Stop, Notification, PostToolUse, …) |
env |
Per-project environment variables (an alternative to shell exports) |
statusLine |
A custom command for the status line |
{ "model": "deepseek-chat", "max_turns": 40, "permissions": { "allow": [ "Read", "Edit", "Bash(git:*)" ], "deny": [ "Bash(rm:*)", "Bash(curl:*)" ] }, "hooks": { "Notification": [ { "hooks": [ { "type": "command", "command": "terminal-notifier -message 'Claude Code finished' 2>/dev/null || true" } ] } ], "Stop": [ { "hooks": [ { "type": "command", "command": "echo 'paused for input'" } ] } ] }}permissionsis the whitelist of what Claude Code may do without confirmation; anything else triggers an interactive prompt.hooksfire on lifecycle events and are the place for notifications, formatting, or guards.
Switching models
Section titled “Switching models”Change model in settings.json, or pass ANTHROPIC_MODEL at launch:
ANTHROPIC_MODEL="deepseek-chat" claudeThe model name must match an entry from GET /v1/models exactly. A model outside the key’s whitelist returns 403. Claude Code is optimized for Anthropic-style clients, so pick a model that supports tool calling for the best experience.
Capping spend
Section titled “Capping spend”The quota is enforced on the gateway side, so even a runaway session cannot exceed it:
- In https://platform.mirapi.ai → API Keys, set a quota limit (spend cap) on the key. Once the cap is reached, requests are rejected with 403 until you raise it.
- Check usage at any time:
curl https://api.mirapi.ai/api/usage/token -H "Authorization: Bearer $MIRAPI_API_KEY"curl https://api.mirapi.ai/api/log/token -H "Authorization: Bearer $MIRAPI_API_KEY"GET /api/usage/token returns account-level totals; GET /api/log/token returns per-request detail.
Billing
Section titled “Billing”- Conversations are billed per token: input, output, and cache read each have their own price per 1M tokens. Reasoning and thinking tokens count as output.
- Cache reads are cheaper than ordinary input.
- Usage draws from a prepaid balance with no subscription or minimum, and the balance never expires.
- When the balance runs out, requests fail with 403; topping up restores the same key immediately.
Error handling
Section titled “Error handling”- 404 on
/v1/messages/count_tokens: that endpoint is not implemented. Claude Code may call it at startup, and the error is harmless. - 401: the key is missing, malformed, or unknown. Fix
ANTHROPIC_AUTH_TOKEN. - 403: the key is valid but the request was refused because the balance is exhausted, the model is not whitelisted, the quota is reached, or the IP is not allowed. Check the error message for the reason.
- 429: rate limited. Retry with jittered exponential backoff (1s → 2s → 4s, capped around 30s). There is no
Retry-Afterheader, and the gateway does not retry for you. - 500: idempotent requests are safe to retry.
- Every error message ends with a request ID; include it when you open a support ticket.
Pitfalls
Section titled “Pitfalls”- Hook commands that print a lot of output slow the session down; keep them quiet.
permissions.denyblocks matching commands but is not a hard security boundary. Review the interactive prompts before you approve anything risky.- The Anthropic base URL stays bare (
https://api.mirapi.ai); do not append/v1.