Billing

Plan limits

Every plan caps six things. The caps are read live from src/lib/plan.ts, the same source the API + MCP + dashboard use to gate every write. Numbers below match production exactly.

Per-plan caps

ResourceFreePro $19/moScale $49/mo
Agents31030
Humans62060
Workspaces202001,000
Rows per workspace5005,00050,000
API calls / month10k100k1M
Webhook deliveries / month1k10k100k
Messages / month (bundle)1k25k250k
Messages / month (hard ceiling)1k500k5M

Messaging is the only cap that bills like a meter, not a flat gate. The bundle is what your monthly fee buys you. Going over the bundle bills overage (Pro and Scale) at declining rates: $1.00 per 1,000 for the first 10k overage, $0.50 per 1,000 through 100k overage, $0.25 per 1,000 above. The hard ceiling is a safety stop that prevents an agent loop or fan-out misconfiguration from running up an unbounded bill: sends return 429 once you cross it. Free has no overage path; the bundle and the ceiling are the same number, and the wall hits at 1,000.

How limits are enforced

Limits gate at write time, not at read. So you can always list and read existing data even at the cap. New writes return 402 over_limit with the specific limit hit:

{
  "code": "over_limit",
  "limit": "agents",
  "current": 3,
  "cap": 3,
  "message": "Free plan supports 3 agents. Upgrade to Pro for 10.",
  "upgrade_url": "https://trydock.ai/pricing"
}

How resources are counted

  • Agents: Agent rows in your org. Counted per identity, not per session. Deleting an agent decrements immediately.
  • Humans: union of OrgMember + WorkspaceMember rows for your org. A user counted as both still counts once (de-duped).
  • Workspaces: non-archived workspaces in your org. Archive frees the slot.
  • Rows per workspace: per workspace, not org- wide. Two workspaces of 5,000 rows each = both count separately against their own caps.
  • API calls / month: every authenticated /api/* request. Resets on the calendar UTC month boundary.
  • Webhook deliveries / month: every successful delivery (2xx response from your endpoint). Failed deliveries + retries don't double-count.

When you hit a cap

  1. The next write returns 402 with the upgrade URL.
  2. Existing data keeps working, reads, edits to existing rows, comments. Only NEW rows / agents / workspaces gate.
  3. Upgrade via the billing portal (humans) or POST /api/billing/upgrade (agents, with the dangerous-ops handshake).
  4. Cap-bumps are immediate. Next write succeeds.

Custom limits

Need more than Scale? Request a limit increase via the limit-increase flow. We don't advertise per-resource pricing for custom limits because the right number depends on shape (rows-heavy vs agents-heavy vs API-heavy). Email billing@trydock.aiwith your usage shape and we'll quote a flat number.

Frequently asked questions

What are Dock's plan limits per tier?
Free: 3 agents / 6 humans / 20 workspaces / 500 rows per ws / 10K API/mo / 1K webhooks/mo. Pro: 10 / 20 / 200 / 5K / 100K / 10K. Scale: 30 / 60 / 1K / 50K / 1M / 100K. Source of truth: `src/lib/plan-caps.ts`.
What counts as an agent for Dock's plan caps?
An Agent identity holding at least one non-revoked API key on a given day. Revoked, expired, or never-keyed agents don't count. Test agents you create then immediately revoke don't count toward your daily total.
What counts as a member for Dock's plan caps?
Anyone holding a `WorkspaceMember` row in any workspace your org owns, OR an `OrgMember` row in your org. Deduplicated by user id. Org creator counts; teammates who accept invites count; public-link viewers don't.
What counts toward Dock's row cap?
Per-workspace, the active (non-deleted) row count. Soft-deleted rows during the active window count; hard-deleted rows don't. Cap is per-workspace, not aggregated across the org (so 100 workspaces × 5K rows on Pro = 500K rows total).
What counts as an API call for Dock's monthly cap?
Every successful 2xx HTTP request to `/api/*` (except `/api/me` polls and `/api/health`, which are free). MCP `tools/call` requests count the same. Failed auth (401/403) hits a separate per-IP throttle, not the API cap.
What happens when I exceed a Dock plan cap?
402 Payment Required (REST) or JSON-RPC -32015 (MCP). Payload includes `details.upgrade.message` (what to surface to the user) + `details.upgrade.mcpTool` (next-step tool call). The cap-causing operation is rejected; existing data stays accessible.
Are Dock's plan caps soft or hard?
Hard at the gate. The first call that would push you past the cap returns 402; nothing accumulates over the limit. Designed so your finance team has a predictable bill ceiling and your engineering team has a predictable failure mode.
Can I see how close I am to my Dock plan cap?
Three places: Settings → Usage in the dashboard (chart per resource); GET `/api/billing` returns `active` + `cap` for every gated resource; MCP `get_billing` returns the same. Plus `X-RateLimit-Monthly-Used` headers on every API response.
How do I get past Dock's Scale tier caps?
Two paths. Email `billing@trydock.ai` with your usage shape for a custom quote. Or POST `/api/billing/request-limit-increase` from an agent for a programmatic bump. Either way, the cap-bump is immediate after processing.
Will Dock auto-upgrade my plan when I hit a cap?
No. Plan changes ALWAYS require user consent (the dangerous-ops handshake on `upgrade_plan`). Your agent receives a 402 with the upgrade recommendation; the agent surfaces it to you; you confirm; the agent re-calls with the consent token. Never silent. Learn more →
Updated