Docs
Tally is a tiny agent plus a dashboard. The agent reads usage your AI tools already record, prices it, and uploads hourly totals. Here is everything it does.
01Install
- 01
curl -fsSL https://tally.arnavprabhu.com/install.sh | shInstall the agent (macOS · Linux) - 02
tally loginApprove this machine in your browser - 03
tally service installRun in the background, sync every 5 min
The installer detects your OS and CPU, downloads a single static binary from https://tally.arnavprabhu.com/downloads and puts it in ~/.local/bin (or /usr/local/bin if writable). No root, no runtime.
tally login uses a device code: approve the code at /device and the machine appears under Machines.
Config lives in ~/.config/tally/config.json (0600), state and logs in ~/.local/state/tally/. XDG_CONFIG_HOME, XDG_STATE_HOME, TALLY_SERVER and TALLY_TOKEN are respected.
02CLI commands
| tally login [--server URL] | Link this machine: opens the browser, shows a code, saves a device token. |
| tally logout | Forget the device token on this machine. |
| tally status | Server, device, last sync and detected providers. |
| tally sync [--dry-run] [--provider id] | Collect and upload once. --dry-run prints the exact JSON payload instead. |
| tally daemon | Sync in a loop (default every 300s, jittered, exponential backoff). |
| tally service install | uninstall | status | Run the daemon at login via launchd (macOS) or a systemd user unit (Linux). |
| tally providers | List every provider, whether it was detected and enabled. |
| tally providers enable | disable <id> | Turn a provider on or off. |
| tally keys set <provider> | Store an API key locally (prompted, no echo). Keys never leave the machine. |
| tally keys ls | rm <provider> | List (masked) or remove stored keys. |
| tally update | Re-run the installer to get the latest version. |
| tally version | Print the agent version. |
03How cost is computed
API-equivalent value
Σ tokens × list price (per model)
What your usage would cost at public API prices — input, output, cache reads and cache writes priced separately from a versioned pricing table (/api/pricing). Useful for comparing plans.
Real spend
plan $ × 12 ÷ 365 per day + billed API $
Subscriptions are prorated per day. API-billed accounts use actual billed dollars where the provider reports them, otherwise the API-equivalent estimate. Free accounts count as $0.
Value multiplier = API-equivalent value ÷ real spend. A Max plan at 12× means you used twelve times its price in API terms. Set plan prices and billing modes on Accounts; your edits are never overwritten.
04Plan limits
Where providers expose them, the agent reports quota windows — Claude's 5-hour session and weekly windows, Codex primary/secondary limits, Cursor's monthly requests, API credit balances — as a percent used plus the reset time. The dashboard counts down to each reset, keeps 30 days of history and can alert you at any threshold.
05Privacy
Uploaded
- + Provider & model name
- + Token & request counts
- + Cost in USD
- + Project folder basename
- + Hostname, OS, arch
- + Hour bucket timestamps
- + Plan-limit % and reset time
- + Account label (renamable, hideable)
Never uploaded
- Prompts or completions
- Source code or diffs
- Full file paths
- API keys
- OAuth tokens
- Browser cookies
API keys stay in the agent's local config. Device tokens are stored server-side only as SHA-256 hashes. Run tally sync --dry-run to see the exact payload. Delete your account any time from Settings — everything is removed immediately.
06Supported providers
| ID | Provider | Source | Status |
|---|---|---|---|
| Anthropic providers · 2 | |||
| claude | Claude Code JSONL transcripts in ~/.claude/projects, ~/.config/claude/projects, $CLAUDE_CONFIG_DIR, Claude Desktop agent/code sessions, claude-swap profiles; acco | Local logs · Local login | implemented |
| claudeplatform | Claude Platform (Anthropic API) Admin API usage_report/messages, cost_report, organizations/me (daily) | API key | implemented |
| CLI coding-agent providers · 11 | |||
| gemini | Gemini CLI Logs: ~/.gemini/tmp/<project>/chats/session-.json(l) (per-message tokens, project from .project_root). Limits: ~/.gemini/oauth_creds.json → POST cloud | Local logs · Local login | implemented |
| opencode | OpenCode Logs: ~/.local/share/opencode/opencode.db (OPENCODE_DB, XDG_DATA_HOME, option db_path). Legacy message+step-finish parts (one event per step) plus v2 | Local logs · API key | implemented |
| opencodego | OpenCode Go Logs: opencode-go rows from the OpenCode DB. Limits: GET https://opencode.ai/zen/go/v1/usage → session (5h), weekly, monthly. The token comes from the | Local logs · Local login · API key | implemented |
| pi | Pi Logs: Pi/OMP JSONL transcripts. Roots: ~/.pi/agent/sessions, ~/.omp/agent/sessions (PI_CONFIG_DIR), ~/.local/share/omp/sessions, ~/.omp/profiles//(age | Local logs | implemented |
| amp | Amp Limits only. The access token (AMP_API_KEY / tally keys set amp, or the Amp CLI's ~/.local/share/amp/secrets.json) → POST https://ampcode.com/api/inte | Local login · API key | implemented |
| factory | Droid (Factory) Logs: ~/.factory/sessions/<proj>/<session>.settings.json tokenUsage (cumulative per session). There's one event per session at the last .jsonl timesta | Local logs · API key | partial |
| kilo | Kilo Logs: ~/.local/share/kilo/kilo.db (same OpenCode-fork schema, KILO_DB). Limits: GET https://app.kilo.ai/api/trpc/user.getCreditBlocks,kiloPass.getStat | Local logs · Local login · API key | implemented |
| kiro | Kiro Limits: kiro-cli state DB (~/Library/Application Support/kiro-cli/data.sqlite3, Linux ~/.local/share/kiro-cli/…, KIRO_DATA_DIR). auth_kv kirocli:odic: | Local login | implemented |
| xkiro | xKiro GET https://api.xkiro.com/v1/usage → daily free tokens (used/limit, reset 00:00 UTC). | API key | implemented |
| qoder | Qoder GET https://qoder.com/api/v2/me/usages/big_model_credits (or qoder.com.cn) → monthly big-model credits (total + shared quota merged, nextResetAt). | API key | manual cred |
| copilot | GitHub Copilot Logs: Copilot CLI ~/.copilot/session-store.db assistant_usage_events (one row per call, cwd from sessions). For sessions not in the store, it reads ~/ | Local logs · Local login · API key | implemented |
| AI APIs, gateways & misc services · 39 | |||
| abacus | Abacus AI apps.abacus.ai/api/_getOrganizationComputePoints, POST /api/_getBillingInfo → monthly compute-point window | API key | manual cred |
| abliteration | abliteration.ai api.abliteration.ai/v1/credits → credits used/total | API key | implemented |
| aerostack | Aerostack api.aerostack.dev/api/billing/usage → monthly AI-token window, tier | API key | implemented |
| aiand | ai& api.aiand.com/logs?range=30days (paged) → per-request tokens + cost → hourly events per model | API key | implemented |
| aixy | Aixy {base}/v1/usage (key.usage) → one window per applicable budget, spend_7d counter | API key | implemented |
| atlascloud | Atlas Cloud api.atlascloud.ai/public/v1/balance → credits balance | API key | implemented |
| bifrost | Bifrost {base}/api/governance/virtual-keys/quota (header x-bf-vk) → budget windows (hourly/daily/weekly/monthly or budget_<id>, provider/model scoped provider | API key | implemented |
| chatbox | Chatbox AI api.chatboxai.app/api/license/detail/realtime → monthly plan tokens, topup, images, quota | API key | implemented |
| clawrouter | ClawRouter {base}/v1/usage → monthly budget window; month-to-date requests/tokens/cost event | API key | implemented |
| cosmic | Cosmic AI dapi.cosmicjs.com/v3/projects/usage?project_id= → input_tokens / output_tokens allowance windows | API key | implemented |
| deepgram | Deepgram api.deepgram.com/v1/projects, /projects/{id}/usage/breakdown?start=<month start>&end=<today> → month-to-date requests + tokens event | API key | implemented |
| elevenlabs | ElevenLabs api.elevenlabs.io/v1/user/subscription → monthly character credits (resets), voice_slots, professional_voices | API key | implemented |
| exa | Exa admin-api.exa.ai/team-management/api-keys/{id}/usage (current UTC month) → month-to-date spend event | API key | implemented |
| fal | fal api.fal.ai/v1/account/billing?expand=credits (Key auth) → credits balance, username | API key | implemented |
| flora | FLORA app.flora.ai/api/v1/workspaces/{ws}/usage → credits balance; month-to-date spend + runs event | API key | implemented |
| futureagi | Future AGI api.futureagi.com/usage/v2/usage-overview/ → one window per meter with a free allowance; billing-period estimated-cost event | API key | implemented |
| huggingface | Hugging Face huggingface.co/api/whoami-v2, /api/settings/billing/usage-v2 → month-to-date billable Inference Providers spend event, monthly spending-limit + includ | API key | partial |
| langdock | Langdock app.langdock.com/api/trpc/usageSettings.getPersonalUsage → session (5h) / weekly percent | API key | manual cred |
| linkup | Linkup api.linkup.so/v1/credits/balance → credits balance | API key | implemented |
| litellm | LiteLLM {base}/key/info → /user/info (personal budget + team_budget) or /team/info; /user/daily/activity (30 d) → per-day per-model tokens/requests/spend even | API key | implemented |
| lithosai | LithosAI console.lithosai.cloud/api/me, /api/billing → credits balance; /api/billing/spend → daily spend events | API key | manual cred |
| llmman | llmman {host}/llmman/node → memory window (loaded model bytes / memory) | API key | implemented |
| llmproxy | LLM Proxy {base}/v1/quota-stats → quota (most-used quota group), requests_total/tokens_total/approx_spend counters | API key | partial |
| munito | Munito api.munito.ai/admin/v1/limits + /organization → daily / monthly spend windows; month-to-date spend event | API key | implemented |
| neuralwatt | Neuralwatt api.neuralwatt.com/v1/quota → credits balance, monthly kWh window, key_allowance; current-month cost/requests/tokens event | API key | implemented |
| parallel | Parallel POST platform.parallel.ai/api/rpc/billing/payments/refresh-balance → credits balance | API key | manual cred |
| poe | Poe api.poe.com/usage/current_balance → credits (points); /usage/points_history (≤5×100 rows, 30 d) → hourly per-bot request/cost events | API key | implemented |
| replicate | Replicate replicate.com/account/billing (React props → account) → /api/{users,organizations}/{name}/invoices current monthly-usage invoice → month-to-date spend | API key | manual cred |
| sailresearch | Sail Research api.sailresearch.com/v2/usage/summary?range=30d → credits balance, spend_30d counter | API key | implemented |
| sofya | Sofya sofya.co/v1/auth/me → credits, plan_credits (free-tier reset), purchased_credits | API key | implemented |
| soniox | Soniox api.soniox.com/v1/organization/balance + /usage/monthly → monthly budget window, prepaid credits, month-to-date spend event | API key | implemented |
| sub2api | sub2api {base}/v1/usage?days=30&timezone=UTC → daily/weekly/monthly subscription windows or quota, rate_<window> limits, credits balance; today's requests/tok | API key | implemented |
| tavily | Tavily api.tavily.com/usage → monthly plan credits, key, paygo windows | API key | implemented |
| tinyapi | TinyApi tinyapi.rest/api/user/credits → credits balance | API key | manual cred |
| typesafe | TypeSafe console.typesafe.ai/settings/billing: discovers the getBillingOverviewResult Next.js server-action id from page JS chunks, then POST with Next-Action | API key | manual cred |
| vercel | Vercel AI Gateway ai-gateway.vercel.sh/v1/credits → credits balance + lifetime_spend; optional personal budget via api.vercel.com/v2/user + /ai-gateway/budgets/list → d | API key | implemented |
| wayfinder | Wayfinder {base}/healthz, /router/models, /v1/savings?period=30d → requests_30d, tokens_30d, spend_30d (realized vs baseline), saved_30d counters | API key | partial |
| xapi | X API console.x.com/api/me → /api/accounts/{id}/credits → credits (purchased + free) | API key | manual cred |
| zenmux | ZenMux zenmux.ai/api/v1/management/subscription/detail → session (5 h) / weekly (7 d) flow windows, plan; /payg/balance → credits | API key | implemented |
| IDE & subscription coding-tool providers · 27 | |||
| cursor | Cursor Session: the Cursor.app state.vscdb (cursorAuth/accessToken, cachedEmail, stripeMembershipType), then ~/.config/cursor/auth.json (cursor-agent). The J | Local login · API key | implemented |
| windsurf | Windsurf 1) Manual session bundle (JSON with devin_session_token, devin_auth1_token, devin_account_id, devin_primary_org_id) sent to POST windsurf.com/_backend | Local login · API key | implemented |
| zed | Zed GET cloud.zed.dev/client/users/me with Authorization: <user_id> <token>: plan (plan_v3), edit_predictions used/limit, cycle end, GitHub login. Alterna | Local login · API key | manual cred |
| warp | Warp POST app.warp.dev/graphql/v2?op=GetRequestLimitInfo (User-Agent: Warp/1.0) gives monthly credits used/limit + reset, and addon_credits (user + workspa | API key | implemented |
| jetbrains | JetBrains AI The most recently modified <config>/JetBrains/<IDE><ver>/options/AIAssistantQuotaManager2.xml (macOS ~/Library/Application Support/{JetBrains,Google}, | Local logs | partial |
| augment | Augment Auggie CLI auggie account status (15 s). The parsed credits remaining/used/limit become monthly, plus the cycle end. Without the CLI: app.augmentcode. | Local login · API key | implemented |
| devin | Devin GET app.devin.ai/api/<org>/billing/quota/usage (Bearer + x-cog-org-id) gives daily/weekly % + resets, plan, and overage balance. | API key | manual cred |
| antigravity | Antigravity Local language server of Antigravity.app, the IDE extension, or agy. ps -ax finds language_server processes with Antigravity markers and their --csrf_ | Local login | partial |
| traecn | Trae CN Cookie → POST api.trae.cn/cloudide/api/v3/common/GetUserToken (short-lived token, never stored) → POST /trae/api/v2/pay/user_current_entitlement_list | API key | manual cred |
| coderabbit | CodeRabbit Runs coderabbit usage (20 s, CODERABBIT_CLI_DISABLE_AUTO_UPDATE=true, stderr discarded). Parses Your reviews into a reviews counter (no denominator), | Local login | implemented |
| gitkraken | GitKraken AI GET api.gitkraken.dev/v1/ai-tasks/usage gives weekly personal + weekly_org shared pool (credits; -1 means unlimited, which becomes a counter). | API key | manual cred |
| ibmbob | IBM Bob GET api.us-east.bob.ibm.com/admin/v1/profile, then per instance/team GET https://api.<region_domain>/admin/v1/teams/<team>/users/<user> gives monthly[ | API key | implemented |
| raycast | Raycast GET www.raycast.com/frontend_api/current_user/ai_credits (only __raycast_session + csrf_token are sent) gives monthly credits (total−remaining)/total | API key | manual cred |
| v0 | v0 GET api.v0.dev/v1/user/billing (token: billing balance used/total + cycle end, plus on_demand balance; legacy: allowance) + GET /v1/rate-limits (rate_ | API key | implemented |
| commandcode | Command Code /alpha/billing/credits + /alpha/billing/subscriptions with a user_… key, or /internal/… with the web session cookie (api.commandcode.ai). Gives monthl | Local login · API key | implemented |
| codebuff | Codebuff POST www.codebuff.com/api/v1/usage gives credits used/quota + next reset. With the CLI session: GET /api/user/subscription adds tier, email, and the w | Local login · API key | implemented |
| clinepass | ClinePass GET api.cline.bot/api/v1/users/me/plan/usage-limits gives session (five_hour), weekly, monthly % + resets. | Local login · API key | implemented |
| devpass | DevPass GET api.llmgateway.io/v1/key gives monthly plan credits $, weekly premium $ + reset, and key_spend (all-time key spend / limit). Plan none means pay-a | API key | implemented |
| helmcode | Helmcode cloud-api.<tenant>/api/usage/quota gives a per-model token cap/used window (monthly, monthly:<model>, rolling_<h>h:<model> for premium). /api/billing | API key | manual cred |
| workbuddy | WorkBuddy POST www.workbuddy.cn/billing/meter/get-user-resource-summary gives monthly credits (Σ credit packages total−remain) and the plan. Sessions are bound | API key | manual cred |
| zoommate | ZoomMate GET ai.zoom.us/ai-computer/api/v1/credits/status with Bearer gives credits used/budget cap + cycle end. A pasted zoom.us cookie is exchanged for a sho | API key | manual cred |
| hyper | Charm Hyper API key: GET hyper.charm.land/v1/credits → balance. Cookie: the dashboard HTML is checked for the team redirect, then "Hypercredits Available" is scra | API key | implemented |
| muse | Muse Code Usage: Muse CLI logs ~/.local/share/muse/sessions/YYYY/MM/DD//session.jsonl (MUSE_SESSIONS_DIR). model_completed / automated_review_completed events b | Local logs · Local login | implemented |
| museai | Muse (muse.ai) Next.js server action fetchSubscriptionAction (POST muse.ai/ with Next-Action: <id>). The id is discovered from page JS chunks (≤96 + 32), cached in m | API key | manual cred |
| t3chat | T3 Chat GET t3.chat/api/trpc/getCustomerData?batch=1… (JSONL). Finds the customer object and maps it to session (4-hour Base %) + reset and monthly (Overage % | API key | manual cred |
| notion | Notion AI POST app.notion.com/api/v3/getSpaces (user, workspaces) → getCreditRateLimitStatus {spaceId} gives session (rolling 6h) and monthly credits used/limit | API key | manual cred |
| manus | Manus POST api.manus.im/user.v1.UserService/GetAvailableCredits (Bearer = session_id cookie value) gives monthly (proMonthly − periodic), daily refresh cred | API key | manual cred |
| LLM API platforms · 25 | |||
| openrouter | OpenRouter GET /api/v1/credits (credits used/total), GET /api/v1/key (key spend cap + reset), GET /api/v1/activity (+?date=) per-model daily tokens/requests/spen | API key | implemented |
| deepseek | DeepSeek GET api.deepseek.com/user/balance; with a Platform token: GET platform.deepseek.com/api/v0/usage/by_api_key/{amount,cost} (per-model daily cache-hit/m | API key | implemented |
| moonshot | Moonshot / Kimi Open Platform GET /v1/users/me/balance on api.moonshot.ai (USD) or api.moonshot.cn (CNY) | API key | implemented |
| kimi | Kimi Code GET api.kimi.com/coding/v1/usages (china) or api.kimi.ai/coding/v1/usages (international): ratio pools limit_5h / limit_7d / limit_month_total, legacy | API key | implemented |
| xai | xAI API Management API: GET /v1/billing/teams/{team}/prepaid/balance, GET …/postpaid/invoice/preview, POST …/usage (daily USD, 30 days) | API key | implemented |
| grok | Grok (SuperGrok / Grok Build) GET cli-chat-proxy.grok.com/v1/billing?format=credits (credit usage %, period, prepaid balance) + GET …/v1/settings (plan tier) | API key | implemented |
| groq | Groq Stytch POST api.stytchb2b.groq.com/sdk/v1/b2b/sessions/authenticate (session → JWT), then GET api.groq.com/platform/v1/organizations/{org}/activity (p | API key | manual cred |
| mistral | Mistral GET admin.mistral.ai/api/billing/v2/usage?month&year (per-model daily tokens; cost = billed units × the response's price table, EUR→USD), GET /api/bil | API key | manual cred |
| fireworks | Fireworks AI GET api.fireworks.ai/v1/accounts (slug discovery), GET /v1/accounts/{slug}/billing/summary?startTime&endTime for yesterday and today (UTC) | API key | implemented |
| deepinfra | DeepInfra GET api.deepinfra.com/payment/checklist?compute_owed=true (balance/owed, cycle limit), GET /payment/usage?from=current (month-to-date spend, booked at | API key | implemented |
| perplexity | Perplexity GET www.perplexity.ai/rest/billing/credits → recurring (monthly), bonus and purchased API credits, balance | API key | manual cred |
| venice | Venice GET api.venice.ai/api/v1/billing/balance (USD balance, DIEM balance / epoch allocation) | API key | implemented |
| zai | z.ai / GLM Coding Plan GET /api/monitor/usage/quota/limit (5-hour + weekly token/credit windows, MCP monthly), GET /api/monitor/usage/model-usage (hourly per-model tokens si | API key | implemented |
| minimax | MiniMax GET api.minimax.io/v1/token_plan/remains, fallback /v1/api/openplatform/coding_plan/remains; China host api.minimaxi.com retried when the global host | API key | implemented |
| alibaba | Alibaba Coding Plan POST {modelstudio.console.alibabacloud.com | bailian.console.aliyun.com}/data/api.json?action=zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanI | API key | implemented |
| qwencloud | Qwen Cloud home.qwencloud.com: GET /tool/user/info.json (sec_token), POST /data/api.json ea-service/LoadHumanInfo + BssOpenAPI-V3/GetSeatSubscriptionSummary (Tea | API key | partial |
| stepfun | StepFun POST platform.stepfun.com/api/step.openapi.devcenter.Dashboard/QueryStepPlanRateLimit (5-hour + weekly or credit pool) + …/GetStepPlanStatus (plan) | API key | manual cred |
| doubao | Doubao (Volcengine Ark) Volcengine OpenAPI, V4-signed: POST open.volcengineapi.com/?Action=GetCodingPlanUsage&Version=2024-01-01 (Coding Plan 5-hour/weekly/monthly) + ?Action | API key | implemented |
| longcat | LongCat longcat.chat: GET /api/v1/user-current, POST /api/pay/quota/metering/token-packs/summary, GET /api/lc-platform/v1/tokenUsage, GET /api/lc-platform/v1/ | API key | manual cred |
| mimo | Xiaomi MiMo platform.xiaomimimo.com: GET /api/v1/balance, /api/v1/tokenPlan/detail, /api/v1/tokenPlan/usage | API key | manual cred |
| chutes | Chutes GET api.chutes.ai/users/me/subscription_usage, fallback GET /users/me/quotas + /users/me/quota_usage/{chute_id} (rolling 4-hour + monthly windows) | API key | implemented |
| synthetic | Synthetic GET api.synthetic.new/v2/quotas (rolling 5-hour, weekly token/credit limit, search hourly; generic quota fallback) | API key | implemented |
| sakana | Sakana AI HTML scrape of console.sakana.ai/billing (5-hour + weekly % used, reset, plan/price) and ?tab=payAsYouGo (credit balance) | API key | manual cred |
| nous | Nous Portal GET portal.nousresearch.com/api/oauth/account (subscription credits, top-up, total usable) | API key | implemented |
| ollama | Ollama Cloud GET ollama.com/api/balance (purchased credit balance, monthly included credits) | API key | implemented |
| OpenAI-family & cloud LLM platform providers · 5 | |||
| codex | Codex Local rollout logs ~/.codex/sessions//rollout-.jsonl + ~/.codex/archived_sessions/.jsonl (or $CODEX_HOME, option codex_home). Plan limits: GET https:/ | Local logs · Local login | implemented |
| openai | OpenAI API GET /v1/organization/costs (daily, group_by=line_item) → billing_api. GET /v1/organization/usage/completions (daily, group_by=model) → provider_api to | API key | implemented |
| azureopenai | Azure OpenAI Azure Cost Management Query API (ActualCost, daily, grouped by ServiceName + Meter, filtered with (?i)openai|cognitive|foundry) → billing_api. Uses a | API key | partial |
| bedrock | AWS Bedrock Cost Explorer GetCostAndUsage (daily, grouped by SERVICE, keeps services containing "Bedrock", which includes Marketplace "… (Amazon Bedrock Edition)" | API key | implemented |
| vertexai | Vertex AI Cloud Monitoring timeSeries.list: aiplatform.googleapis.com/publisher/online_serving/token_count (by model_user_id + type) and …/model_invocation_coun | Local login | implemented |
109 providers · generated from the agent docs at build time