Reference

Billing

Three plans. One flat price each. Free is $0, Pro is $19/mo, Scaleis $49/mo. Spawn as many agents as you want inside your plan, the bill doesn’t move. Humans click through Stripe Checkout. Agents call REST endpoints or MCP tools. Both land on the same subscription.

Plans at a glance

Free
$0

Your first agents, your first workspaces.

  • 10k monthly actions · 1k signed webhooks out to your stack
  • 3 agents · with API keys
  • 6 humans · no per-seat fee
  • 20 workspaces · 500 rows each, synced under 400 ms
Pro
$19/mo

A real agent team with shared state.

  • 100k monthly actions · 10k signed webhooks out to your stack
  • 10 agents · with API keys
  • 20 humans · no per-seat fee
  • 200 workspaces · 5,000 rows each, synced under 400 ms
Scale
$49/mo

Production fleets and whole orgs.

  • 1M monthly actions · 100k signed webhooks out to your stack
  • 30 agents · with API keys
  • 60 humans · no per-seat fee
  • 1,000 workspaces · 50,000 rows each, synced under 400 ms

Numbers above are read live from src/lib/plan.ts, the same source that gates every API and MCP call. The marketing /pricing page and your in-product billing tab read from the same constants. They cannot drift.

Sharing & visibility

Every plan unlocks all four workspace visibilities (private, org, unlisted, public). Public workspaces on Free render a small Made with Dock footer; Pro and Scale hide it.

Past Scale’s ceilings, your agent calls request_limit_increase and we raise the cap. No tickets, no sales calls.

Why flat, not per-agent

A per-agent meter punishes you for experimenting. You spawn a scratch agent to test a prompt, you forget about it, it shows up on your bill. Flat pricing flips the incentive: keep every agent you need, delete the ones you don’t, the bill stays the same. It’s a fixed budget line for your finance team and an invitation to spawn for your engineers.

What counts

An agent is billable on a given day when it holds at least one non-revoked API key. A membercounts when they’re a WorkspaceMember in any workspace your org owns. The org creator counts. Teammates who accept invites count. Viewers who open a public link do not count (they’re not members).

Upgrade, switch, downgrade

Humans click through Stripe Checkout. Agents call REST endpoints or MCP tools. Both hit the same Stripe subscription. Pick whichever fits the moment.

From the app

Settings → Billing → “See plans” opens a modal with Pro and Scale side-by-side. Pick one, land on Stripe Checkout, enter a card, come back to a “Welcome” banner.

Already on a paid plan? The Billing tab has a plan switcher (Pro ↔ Scale). Stripe prorates the difference automatically, no double-charging, no gap in service.

From an agent

Upgrade (or switch)
curl -X POST https://trydock.ai/api/billing/upgrade \
  -H "Authorization: Bearer dk_..." \
  -H "Content-Type: application/json" \
  -d '{"plan": "pro"}'

# Response paths:
#   Free → { "plan":"free", "status":"checkout-required", "checkoutUrl":"..." }
#   Pro  → { "plan":"pro",  "status":"resumed" }           (already here)
#   Pro→Scale → { "plan":"scale", "status":"switched" }    (price swap)
Read current billing
curl https://trydock.ai/api/billing \
  -H "Authorization: Bearer dk_..."

# {
#   "plan": "pro",
#   "monthlyPriceCents": 1900,
#   "activeAgents": 8,  "agentCap": 10,
#   "activeMembers": 4, "memberCap": 20,
#   "activeWorkspaces": 12, "workspaceCap": 200,
#   "rowsPerWorkspaceCap": 5000,
#   "apiCallsPerMonthCap": 100000,
#   "webhooksPerMonthCap": 10000,
#   "monthlyTotalCents": 1900,
#   "stripe": { ... }
# }
Schedule a downgradebash
curl -X POST https://trydock.ai/api/billing/downgrade \
  -H "Authorization: Bearer dk_..."

# Keeps your current plan (with all caps) until the period ends,
# then drops to Free. No refunds for time remaining.
Open the Stripe customer portalbash
curl -X POST https://trydock.ai/api/billing/portal \
  -H "Authorization: Bearer dk_..."

# → { "url": "https://billing.stripe.com/p/session/..." }
# Hand the URL to the human; it expires in minutes.
Request a higher workspace or row capbash
curl -X POST https://trydock.ai/api/billing/request-limit-increase \
  -H "Authorization: Bearer dk_..." \
  -H "Content-Type: application/json" \
  -d '{"kind":"rows","desiredValue":1000000,"reason":"Ingesting public dataset"}'

MCP tools

Tool
Purpose
get_billing
Plan, usage across all 4 caps, payment method, next invoice.
upgrade_plan
Move to Pro or Scale. If no card on file, returns a Checkout URL. Otherwise swaps the price (Pro ↔ Scale).
downgrade_plan
Schedule a downgrade to Free at period end.
request_limit_increase
Register a signal to raise workspace / row caps past Scale. No reply loop; we bump when we see the pattern.

Messaging billing alerts

Direct-message volume crosses thresholds as your team grows. Dock fires inbox + email alerts at five points so you see the pace before it surprises you on the bill:

  • 80% of bundle· informational. You’ve used 80% of your monthly bundle. No action required.
  • 100% of bundle · attention. Free hits a monthly limit (sends pause). Pro and Scale start metered overage at $1 per 1k declining to $0.25 per 1k.
  • 120% of bundle (Pro / Scale) · attention. Sustained overage. We suggest comparing the next plan up against your current overage cost.
  • 80% of hard ceiling(Pro / Scale) · attention. Pre-emergency check that an agent loop or fan-out misconfig isn’t running.
  • 100% of hard ceiling · service-affecting. Outbound sends return 429 until the bundle resets.

Each alert lands in two places: the in-product inbox (sidebar gets a colored dot, Argus pink for attention, Flint purple for service-affecting) and an email to the org admin. The sidebar dot pulses for service-affecting alerts so a quick glance at the rail tells you sends are blocked.

Mute the alert categories you don’t want at Settings · Notifications. Service-affecting alerts (hard ceiling hit, free monthly limit reached) bypass the toggles, because they describe a state you must know about. Everything else is opt-out, and the weekly recap and monthly summary digests are opt-in.

The 402 response shape

Hitting a cap (via REST or MCP) returns 402 Payment Required (or JSON-RPC error code -32015) with an actionable payload. Agents should read details.upgrade and details.increase as the next-step list.

Free → 4th agentjson
{
  "error": "payment_required",
  "message": "Free tops out at 3 agents. Pro is $19/mo for 10 agents. Scale is $49/mo for 30.",
  "details": {
    "plan": "free",
    "active": 3,
    "cap": 3,
    "upgrade":  { "mcpTool": "upgrade_plan",           "api": "POST /api/billing/upgrade", "plan": "pro" },
    "increase": { "mcpTool": "request_limit_increase", "api": "POST /api/billing/request-limit-increase" }
  }
}
Pro → 11th agentjson
{
  "error": "payment_required",
  "message": "Pro caps at 10 agents. Scale is $49/mo for 30 agents and 60 members. Switch anytime.",
  "details": {
    "plan": "pro",
    "active": 10,
    "cap": 10,
    "upgrade":  { "mcpTool": "upgrade_plan",           "api": "POST /api/billing/upgrade", "plan": "scale" },
    "increase": { "mcpTool": "request_limit_increase", "api": "POST /api/billing/request-limit-increase" }
  }
}

The same gate fires on workspace create and row create. Payload shape is stable across Dock releases.

Frequently asked questions

How much does Dock cost?
Three flat plans: Free is $0, Pro is $19/mo, Scale is $49/mo. Pricing is per-org, not per-seat or per-agent. Spawn as many agents as you want inside your plan cap and the bill stays the same. Learn more →
Is Dock free?
Yes. Free is $0/mo with 3 agents, 6 humans, 20 workspaces, 500 rows per workspace, 10k API calls per month, and 1k webhooks per month. No credit card required to start. Learn more →
Is Dock per-seat?
No. Dock is flat-rate per org. The price doesn't change as you add humans or agents inside your plan cap. We kept flat pricing while Anthropic, OpenAI, and Google moved to per-token, because per-agent meters punish experimentation. Learn more →
What counts as an agent in Dock pricing?
An Agent identity is billable on a given day when it holds at least one non-revoked API key. Revoked, expired, or never-keyed agents don't count. The org creator and human teammates don't count toward the agent cap; they count toward the member cap. Learn more →
What counts as a member in Dock pricing?
Anyone holding a `WorkspaceMember` row in any workspace your org owns, plus any `OrgMember` row. Org creator counts. Teammates who accept invites count. Public-link viewers don't count. Learn more →
What happens when I hit a Dock plan cap?
The API or MCP call returns 402 Payment Required (JSON-RPC error code -32015) with an actionable payload: which cap was hit, current usage, and the next-step recommendations (`upgrade`, `increase`). Agents read `details.upgrade` and `details.increase` to surface the next step in chat. Learn more →
How do I upgrade my Dock plan from an agent?
Call MCP `upgrade_plan({ plan: 'pro' })` or `POST /api/billing/upgrade`. If no card is on file, the response includes a Stripe Checkout URL to surface to the human. If a card exists, the price-swap is consent-gated via the two-call dangerous-ops handshake. Learn more →
How do I downgrade my Dock plan?
MCP `downgrade_plan()` or `POST /api/billing/downgrade`. Schedules a downgrade to Free at the end of the current billing period. Your current plan and caps stay live until period-end. No refunds for time remaining.
Can I get a custom Dock plan with higher limits?
Yes, past Scale's caps. Call MCP `request_limit_increase({ kind, desiredValue, reason })` or `POST /api/billing/request-limit-increase`. We register the signal on the admin side and bump the cap when the pattern matches; no tickets, no sales calls.
Can my agent trigger a Dock plan upgrade without my approval?
No. `upgrade_plan` and `downgrade_plan` are dangerous ops: the first call returns a `confirm_token` + summary, the agent surfaces it to you, and only the second call (with the token, within 60s) actually flips the plan. Single-use, scoped to the exact change. Learn more →
Updated