Invite-only.
Reference

Support

File a ticket from code, curl, or an agent — POST /api/support mirrors every ticket into our GitHub support repo. Your agent can call the create_support_ticket MCP tool and file the issue itself the moment something breaks.

Five kinds

kind
Use when
bug
Dock did the wrong thing. Include repro steps.
feature
Dock's missing something you'd use. Describe the job-to-be-done.
billing
Plan, subscription, Stripe, invoice.
question
How do I, does Dock support, etc.
other
Investment, partnership, press, anything else.

POST /api/support/upload

Upload a screenshot before filing. Accepts multipart/form-data with a single file field. Returns a URL you pass back as attachmentUrls[] when you call POST /api/support. Limits: 5MB per file, image/* only, 10 per hour per org.

curl -X POST https://trydock.ai/api/support/upload \
  -H "Authorization: Bearer dk_live_..." \
  -F "file=@screenshot.png"

Response:

{
  "url": "https://<tenant>.public.blob.vercel-storage.com/support/...png",
  "filename": "screenshot.png",
  "size": 148231,
  "contentType": "image/png"
}

The dashboard at /settings/support uses the same endpoint under the hood — paste a screenshot (Cmd+V), drop a file, or click to upload. Attachments show inline at the top of the GitHub issue so triagers see them first.

POST /api/support

Authed (session cookie or Authorization: Bearer dk_… API key). Rate-limited to 10 tickets per hour per org.

curl -X POST https://trydock.ai/api/support \
  -H "Authorization: Bearer dk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "bug",
    "title": "Table cell loses focus on paste",
    "body": "Pasting into a text cell drops focus to the row below. Expected focus to stay on the edited cell.",
    "attachmentUrls": [
      "https://<tenant>.public.blob.vercel-storage.com/support/...png"
    ],
    "context": {
      "workspace": "launch-plan",
      "browser": "Chrome 128 on macOS"
    }
  }'

Response:

{
  "id": "cmxxxxx",
  "kind": "bug",
  "title": "Table cell loses focus on paste",
  "status": "open",
  "githubNumber": 42,
  "githubUrl": "https://github.com/try-dock-ai/support/issues/42",
  "githubError": null,
  "createdAt": "2026-04-19T…"
}

If GitHub is temporarily unreachable we still persist the ticket and return githubNumber: null with githubError populated — the ticket is not lost, and ops retries on the admin side.

GET /api/support

Lists the authenticated org's tickets, most recent first (max 100).

curl https://trydock.ai/api/support \
  -H "Authorization: Bearer dk_live_..."

GET /api/support/[id]

Fetches one ticket, including its body + context. Scoped to your org.

MCP tool: create_support_ticket

Every agent connected to Dock via MCP gets this tool. When an agent hits an error, it can file the ticket without leaving its task:

{
  "tool": "create_support_ticket",
  "input": {
    "kind": "bug",
    "title": "row.patch returns 500 on long URL columns",
    "body": "Got { code: 'internal', requestId: 'mo…' } when patching a URL column over 2kB.",
    "context": { "requestId": "mo6fjc7q…", "workspace": "content-pipeline" }
  }
}

Ships with the 12 other MCP tools. See MCP server for the full tool list.

Where tickets go

Each ticket becomes a GitHub issue in try-dock-ai/support (private) with labels support, kind:<kind>, and from-api (plus from-agent when filed by an agent). Replies happen on the GitHub issue; the dashboard at /settings/support lists your org's tickets with the issue link.

When to use what

  • Hit a plan cap? Use request_limit_increase. It's purpose-built for that — no ticket, no reply loop.
  • Stripe / invoice question? Use kind: "billing".
  • Broken code path? kind: "bug" with the x-request-id header value in context. That's the fastest path to a fix.