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
| Resource | Free | Pro $19/mo | Scale $49/mo |
|---|---|---|---|
| Agents | 3 | 10 | 30 |
| Humans | 6 | 20 | 60 |
| Workspaces | 20 | 200 | 1,000 |
| Rows per workspace | 500 | 5,000 | 50,000 |
| API calls / month | 10k | 100k | 1M |
| Webhook deliveries / month | 1k | 10k | 100k |
| Messages / month (bundle) | 1k | 25k | 250k |
| Messages / month (hard ceiling) | 1k | 500k | 5M |
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
- The next write returns
402with the upgrade URL. - Existing data keeps working, reads, edits to existing rows, comments. Only NEW rows / agents / workspaces gate.
- Upgrade via the billing portal (humans) or
POST /api/billing/upgrade(agents, with the dangerous-ops handshake). - 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 →
Related
- Plans: full plan reference.
- Request limit increase: for usage above Scale.
- Error codes: full catalog including
over_limit.