SynthBoard/ MCP docs
Get started free
Start here
  • Overview
  • Quick start
  • Client setup
Using MCP
  • How sessions run
  • Pricing & billing
  • Security
  • Key management
  • Webhooks
  • Tools & resources
Problem-solving
  • Troubleshooting
  • Error reference
Get started
  • Create an API key
  • Sign in to console
MCP documentation

SynthBoard MCP help center

Connect Claude Desktop, Cursor, ChatGPT, or any MCP-compatible client to a full SynthBoard account. 42 tools, 18 resources, 11 prompts — one engine.

Create an API keyJump to quick start

Quick start

From zero to your first board in 4 steps.

  1. 1
    Create an API key
    Open the Control Center → API Keys and click Create key. The key is shown exactly once — copy it somewhere safe.
  2. 2
    Paste into your client config
    Pick your client below. Each has a dedicated config file — paste the snippet and replace sb_live_... with your real key.
  3. 3
    Restart the client
    Quit fully and reopen. The SynthBoard tools + prompts should appear in the client's tool menu.
  4. 4
    Try a prompt
    Type /synthboard-boardroom and ask a real strategic question. The decision brief staffs the board; the board debates and delivers a memo.

Client setup

All 6 supported clients. Click a tab to switch.

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "synthboard": {
      "url": "https://synthboard.ai/api/mcp",
      "headers": { "Authorization": "Bearer sb_live_..." }
    }
  }
}
💡 Quit and reopen Claude Desktop after editing. The file may not exist yet — create it.

Your first board

What actually happens when your agent starts a SynthBoard session.

Ask a real strategic question. Your agent calls synthboard.session.plan, shows you the proposal, then starts the run. No synth-picking needed — an adaptive decision brief reads the question and staffs the right advisors.

The plan-first flow
// 1. Plan — nothing charged yet
{ "name": "synthboard.session.plan",
  "arguments": {
    "question": "Should we launch a free tier next quarter?",
    "session_type": "boardroom",
    "mode": "decision"
  } }
// → { plan_id, proposal, estimated_credits, expires_at }

// 2. Start with the approved plan
{ "name": "synthboard.session.start",
  "arguments": { "plan_id": "<plan_id>" } }
// → { session_id, task_id, session_type: "boardroom", session_url }

// 3. Wait for the run (long-poll up to 60s per call)
{ "name": "synthboard.session.get",
  "arguments": { "session_id": "<id>", "wait_ms": 60000 } }
// → { v4_phase: "done", decision_brief, memo: { verdict,
//     confidence_0_100, conditions, dissent } }

What you'll see

  • Within seconds: session_id, task_id, and a link to watch live on synthboard.ai.
  • Phase progress as the board moves: intake → staffed → research → debate → memo.
  • On completion: the decision memo — verdict, confidence, conditions, and the strongest dissent — or a shaped artifact for non-decision asks.
Tip

For a 1-on-1 instead of a full board, plan with session_type: "consult" and a synth_id, then drive turns with synthboard.consult.message.

Plan-before-start

The product rule: no surprise sessions. Sessions must be approved or explicitly configured.

Sessions can't auto-start from a bare question. That protects users and their credit balance from runaway agent loops. You have two paths:

Path A — preview, then start

  1. Call synthboard.session.plan with the question (+ optional session_type / mode / synth_id).
  2. Receive a plan_id valid for 15 min + the full proposal (staffing note, mode, credit estimate).
  3. Show it to the user in whatever client invoked the tool.
  4. If approved → call synthboard.session.start({plan_id}). The plan is consumed; replay is blocked.

Best for interactive clients (Claude Desktop, ChatGPT). Users see what they're about to spend before committing.

Path B — explicit start

Call synthboard.session.start with an explicit setup: boardroom = question + session_type or mode; consult = question + synth_id. The explicit setup counts as consent. Best for automation (n8n, cron, scripts) where you've already decided.

Legacy fields (synth_ids, rounds, llm_model) are still accepted — they map to pinned seats and per-seat model overrides.

Bare calls (question only, no plan_id and no setup signal) return validation_error with actionable guidance.

How sessions run

The concepts behind every MCP/API session — same engine as the web app.

Two rooms

boardroomThe Boardroom

A staffed board of advisors debates your question across research + debate phases and delivers a decision memo or shaped artifact.

consultThe Consult

A 1-on-1 session with a single named expert. Conversational, turn-based, billed per turn.

Express intake & the decision brief

Sessions started over MCP/API skip the interactive intake: a single facilitator pass turns your question + context into a decision brief — the framed question, the known facts, and the staffed board (which advisors, which seats, why). The brief is returned on session.get as decision_brief.

Board phases

v4_phase tracks the run: intake → staffed → research → debate → memo → done. Each seated advisor researches independently, the board debates with genuinely opposed theses, and the run terminates in a deliverable.

The deliverable: memo or shaped artifact

  • Decision boards deliver a decision memo: the verdict, confidence (0–100), the conditions that would flip it, and the strongest dissent — under a named author.
  • Every other ask delivers a board artifact shaped to the question — a plan, forecast, comparison, research brief, diagnosis, and more. Read it via board_artifact or the synthboard://session/{id}/memo resource.

Reconvene: Round N+1

A finished board isn't continued — it's reconvened. When something changed, call synthboard.session.reconvene({session_id, whats_changed}). The new round opens from the board's delivered call (verdict, confidence, dissent) plus your update, re-briefs, and runs — returning a new session_id linked to the parent. (session.continue remains for legacy-engine sessions and redirects boards here.)

Consult turns

A Consult is a conversation, billed per turn. Each synthboard.consult.message call sends one message to the seated expert and returns their reply — plus a composed document when the ask calls for one (a memo, an email, a plan). If wait_ms elapses, the turn keeps running server-side; re-read via session.get.

Your World Model & wm_scope

The board keeps a dossier on your world — identity, situation, goals, constraints, the names that matter — and a searchable memory of every delivered call. Agents read it via the synthboard://world-model resource and search it with synthboard.world_model.search (decisions, memos, board artifacts, world-model facts). Every session binds a wm_scope at creation (accepted by session.plan and session.start):

wm_scopeBoard reads your worldSession writes back
grounded (default)YesYes — learnings update the dossier and memory
read_onlyYesNo — nothing from this session is remembered
off_recordNoNo — fully off the record, excluded from search too

A reconvened round inherits its parent's scope — an off-record board's Round 2 stays off the record. The weekly Board Brief is readable at synthboard://briefs/latest.

Pricing & billing

MCP uses the same credit system as the web UI. Tier controls capacity.

TierConcurrentMax synthsWeb / visionMax rounds
Free13—1
ProPopular35✓5
Max108✓5
Ultra2512✓5

Every paid tier gets the full feature surface — no lockouts. Credits self-price richness. Max synths shows the default per tier; the live value is account-configurable and enforced server-side.

What does a typical session cost?
Most board runs land in the 55–150 credit range; Consult turns typically total 5–40 credits per session. session.plan returns a pre-flight estimated_credits before anything is charged.
Can I cap spend per key?
Yes, two guards per key: a daily credit cap (resets midnight UTC) and a monthly credit budget (resets at month start UTC). Hitting either blocks further billed calls on that key until reset, and email alerts fire at 50%, 80%, and 100% of each guard.
Failed session — do I get refunded?
Credits charged for completed work are retained. Anything unconsumed is either not charged or refunded automatically — including when a run fails mid-flight. Every charge and refund shows up in your credit history.
Does MCP cost more than the web UI?
No. Same credit pricing. Same charges. MCP just gives programmatic access to the same engine.

Rate limits & concurrency

Operational caps, not feature gates. Baselines below are the Pro tier; other tiers multiply.

Rate limits are per-user (or per-OAuth-client) per bucket. The baseline numbers below apply to Pro; other tiers multiply the baseline — Free ×0.15, Max ×3.3, Ultra ×16 (minimum 1). Buckets without explicit config get a bounded default of 30/min. Concurrent-session caps are enforced atomically — there's no way to race past them.

BucketPro baselineWindow
session.plan1201 h
session.start601 h
session.get601 min
session.list601 min
session.continue201 min
session.fork / session.reconvene301 h
session.outcomes / session.share301 h
session.export601 h
synth.chat / consult.message1001 h
assistant.ask1001 h
bookmark.create / decision.capture2001 h
catalog.search / resource reads60 / 1201 min
action.execute / action.undo101 min
share.verify_password101 min
webhooks read / write (REST)60 / 201 min

Hit a limit? The error tells you exactly which cap and when to retry (retry_after_s). Watch live headroom on the usage dashboard.

Scopes (8)

Every tool demands exactly one scope. Create keys with only what the workload needs.

ScopeGrants
session:readRead sessions, tasks, transcripts, exports, shares
session:writeCreate/reconvene/cancel/fork/share sessions + bookmarks/decisions
synth:chat1-on-1 synth chat + Consult turns
synth:readRead synth profiles + knowledge listings
synth:writeCreate/edit/delete custom synths, preferences, knowledge
assistant:useSession Assistant Q&A
integrations:readList connected integration providers
integrations:writeExecute/undo tool actions + webhook subscription CRUD

Security

Built for production from day one.

Keys hashed, never stored

Your API key is shown exactly once, then hashed. Revoke or rotate anytime — it takes effect instantly.

IP allowlist (optional)

Lock any key to the IPs you trust. Calls from anywhere else are rejected before they reach a tool.

OAuth for web clients

Claude.ai, ChatGPT and other browser-based clients authenticate through modern, short-lived OAuth tokens.

Outbound request guard

Webhooks can't reach internal networks. Only public HTTPS endpoints are allowed.

Prompt-injection defense

Tool inputs are sandboxed before they ever reach a model, with layered guards on top.

Complete audit log

Every call logged with caller, tool, session, and cost. Filterable and exportable as CSV from the Control Center.

Key management

Stay out of trouble.

  • One key per client. Separate keys for Claude Desktop, Cursor, and automation scripts — revocation stays surgical.
  • Rotate quarterly. Click Rotate on a key to create a replacement with the same scopes. Old key works for 24 hours while you update clients.
  • Set a cap for automation. For n8n, Zapier, cron, anywhere you can't watch — a daily credit cap prevents runaway loops.
  • Never commit keys. Keep them out of git. If exposed, revoke instantly — it takes effect in real time.
  • Scope down. A read-only automation doesn't need session:write. Create keys with just the scopes you need.

OAuth 2.1 (for web clients)

How Claude.ai web, ChatGPT apps, and other browser-embedded clients authenticate.

Most MCP clients (Claude Desktop, Cursor, Windsurf, Zed, scripts) authenticate with a Bearer API key — simplest, fastest. Browser-based clients like Claude.ai web don't accept raw keys; they use OAuth 2.1 for user-mediated consent. SynthBoard exposes a native, spec-compliant Authorization Server at the standard discovery endpoints.

Discovery metadata

  • GET /.well-known/oauth-authorization-server — RFC 8414 AS metadata
  • GET /.well-known/oauth-protected-resource — RFC 9728 protected-resource metadata
  • GET /.well-known/jwks.json — public JWKS for token verification

Flow

  1. Dynamic client registration (RFC 7591): POST /api/oauth/register with your client metadata. https-only redirect URIs required.
  2. Authorize: send user to /api/oauth/authorize with response_type=code, code_challenge (S256), resource (your MCP URL), scopes.
  3. Consent page: user sees plain-English scope descriptions and approves. CSRF-protected.
  4. Token exchange: POST /api/oauth/token with the code + PKCE verifier. Receive a 10-minute access token and 7-day rotating refresh token.
  5. Use on /api/mcp — JWT in Authorization: Bearer. Server validates signature, audience (aud must match resource URL, RFC 8707), expiry, and revocation status on every call.
  6. Refresh: rotate the refresh token before the access expires. Reused old refreshes trigger grant-chain revocation.
What this gives you
Short-lived tokens · Strict redirect allowlist · Tokens bound to this server (never replayable elsewhere) · Reused refresh tokens trigger full revocation · Consent pages hardened against clickjacking and CSRF.

Webhooks

Two delivery systems coexist. Use subscriptions — the per-key mechanism is legacy.

Board runs take 30 seconds to a few minutes. Instead of polling, subscribe and let SynthBoard call you. There are two contracts with different signatures — verify with the right one:

Recommended

Subscriptions — X-SynthBoard-Signature

  • Manage in Control Center → Webhooks or via POST /api/v1/webhooks. Multiple subscriptions, per-event filters.
  • All 6 events: session.complete, session.failed, session.cancelled, session.continued, session.reconvened, outcomes.ready.
  • Fired by the engine itself — session completion/failure from the orchestrator, cancellation and follow-up rounds from the tools, deliverables from outcomes.
  • Signature: X-SynthBoard-Signature: sha256=<hex> — HMAC-SHA256 of `${timestamp}.${body}` with the subscription's secret (returned once on create).
  • Headers: X-SynthBoard-Event, X-SynthBoard-Timestamp (unix seconds), X-SynthBoard-Delivery-Id.
Legacy

Per-key webhook — X-Mcp-Signature

  • Configured as a Webhook URL on an API key (not via /webhooks). Kept for existing integrations — new setups should use subscriptions.
  • Fires session.complete only, when a session started with that key finishes.
  • Signature: X-Mcp-Signature: sha256=<hex> — HMAC-SHA256 of the raw body alone (no timestamp in the MAC) with the key's whsec_ secret.
  • Headers: X-Mcp-Event, X-Mcp-Timestamp, X-Mcp-Delivery-Id.

Delivery guarantee

Every started session ends in exactly one terminal event — session.complete, session.failed (including engine timeouts swept by the watchdog, delivered with reason: "timeout"), or session.cancelled. Build state machines on that invariant.

Retries — both systems

Any non-2xx retries with backoff at 1, 5, 15, 60, 240 minutes — 5 attempts total. Subscriptions additionally auto-disable after 10 consecutive failures (re-enable in the Control Center, which resets the breaker).

Verify — subscriptions (Node.js)

X-SynthBoard-Signature over `${timestamp}.${body}`
import { createHmac, timingSafeEqual } from "node:crypto";

function verifySubscriptionWebhook(
  rawBody: string, sigHeader: string, tsHeader: string, secret: string,
): boolean {
  if (Math.abs(Date.now() / 1000 - Number(tsHeader)) > 300) return false; // replay guard
  const expected = "sha256=" + createHmac("sha256", secret)
    .update(`${tsHeader}.${rawBody}`).digest("hex");
  const a = Buffer.from(sigHeader), b = Buffer.from(expected);
  return a.length === b.length && timingSafeEqual(a, b);
}

Verify — legacy per-key (Node.js)

X-Mcp-Signature over the raw body
import { createHmac, timingSafeEqual } from "node:crypto";

function verifyLegacyKeyWebhook(
  rawBody: string, sigHeader: string, secret: string, // whsec_...
): boolean {
  const expected = "sha256=" +
    createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(sigHeader), b = Buffer.from(expected);
  return a.length === b.length && timingSafeEqual(a, b);
}
Test tip

Use webhook.site for a zero-setup inbox, or the Send test button on any subscription in the Control Center — it fires a signed test.ping without touching your delivery stats.

Tool reference (42)

The complete tool surface, grouped. Every tool demands one scope.

Session lifecycle (13)

  • synthboard.session.plansession:write

    Propose a full session setup + credit estimate without starting. Returns a single-use plan_id (15 min).

    question, session_type?, mode?, synth_id? (consult), context?, web_search?, language?

  • synthboard.session.startsession:write

    Launch a session from an approved plan_id or an explicit setup. Boardroom: the decision brief staffs the advisors. Consult: requires synth_id.

    plan_id | (question + session_type/mode) | (question + synth_id), preselected_synth_ids?, focus_synth_id?, synth_model_overrides?, images?, tags?

  • synthboard.session.getsession:read

    Session state + latest task. On finished boards: v4_phase, decision_brief, memo, board_artifact.

    session_id, wait_ms? (≤60000), include_transcript?, include_tool_calls?, include_action_items?

  • synthboard.session.continuesession:write

    Follow-up round on a legacy-engine session. Current boards redirect to session.reconvene.

    session_id, message

  • synthboard.session.reconvenesession:write

    Reconvene a completed board as Round N+1 — opens from the delivered verdict plus what changed, re-briefs, runs.

    session_id, whats_changed, question?, keep_board?

  • synthboard.session.cancelsession:write

    Cancel the in-flight task. Work delivered is retained; the remainder is refunded.

    session_id, reason?

  • synthboard.session.updatesession:write

    Mid-session mutations on legacy-engine sessions — add/remove synths, change mode, tune DNA/model/temperature. Current boards redirect to session.reconvene.

    session_id, add_synths?, remove_synths?, change_mode?, tune?

  • synthboard.session.forksession:write

    Duplicate a session with altered context; rerun=true starts the fork immediately.

    session_id, new_context?, rerun?

  • synthboard.session.listsession:read

    Filter, search, sort, and paginate your sessions.

    status?, mode?, tag?, q?, since?, until?, sort?, limit?, cursor?

  • synthboard.session.update_metasession:write

    Rename a session or update its tags.

    session_id, topic?, tags?

  • synthboard.session.deletesession:write

    Hard-delete a draft. Non-drafts archive instead.

    session_id, confirm: true

  • synthboard.session.archivesession:write

    Hide a session from default listings (or bring it back). Idempotent.

    session_id, action: archive | unarchive

  • synthboard.session.exportsession:read

    Export as markdown, JSON, or plain text with selectable parts.

    session_id, format, include? (transcript/synthesis/bookmarks/decision/action_items/full_reasoning)

The Consult (1)

  • synthboard.consult.messagesynth:chat

    Send one message to the seated expert of a Consult session; returns the reply and any composed document. Billed per turn.

    session_id, message (≤5000), wait_ms? (≤290000)

In-session interaction (7)

  • synthboard.session.outcomessession:write

    Generate a polished deliverable — action plan, report, decision memo, or bullets.

    session_id, format?, include?

  • synthboard.session.live_summarysession:read

    Live consensus snapshot — who agrees, who dissents, running confidence.

    session_id

  • synthboard.session.cross_roundsession:read

    How positions evolved across rounds.

    session_id

  • synthboard.synth.chatsynth:chat

    Direct message to a specific synth inside a session.

    session_id, synth_id, message

  • synthboard.assistant.askassistant:use

    Q&A grounded in the session transcript + synthesis.

    session_id, question

  • synthboard.bookmark.createsession:write

    Save a moment — a claim, agreement, conflict, or pinned thread.

    session_id, type, item_text, synth_id?, note?

  • synthboard.decision.capturesession:write

    Record a formal decision with rationale, stakeholders, deadline, action items.

    session_id, decision, rationale?, stakeholders?, deadline?, action_items?, confidence?

Your World Model (1)

  • synthboard.world_model.searchsession:read

    Hybrid semantic + keyword search over your board's memory — captured decisions, delivered memos, board artifacts, and world-model facts. Off-record material is never returned.

    query, types? (decision | memo | board_artifact | wm_fact), limit?

Synth management (7)

  • synthboard.synth.createsynth:write

    Create a custom advisor — name, role, persona, expertise, DNA, model, training files.

    name, role, system_prompt, tagline?, expertise_tags?, dna_*?, preferred_model?, training_files?

  • synthboard.synth.updatesynth:write

    Edit one of your custom synths. Core synths use preferences.set.

    synth_id + any editable field

  • synthboard.synth.deletesynth:write

    Permanently delete a custom synth.

    synth_id, confirm: true

  • synthboard.synth.getsynth:read

    Fetch one synth — core, public, or your own (own prompt included).

    synth_id

  • synthboard.synth.listsynth:read

    List core, public, and your own synths with search + filters.

    search?, core_only?, expertise?, limit?, offset?

  • synthboard.synth.preferences.setsynth:write

    Per-user overlay for a core synth — DNA, model, temperature, directions.

    synth_id, dna_*?, preferred_model?, temperature?, user_directions?

  • synthboard.synth.preferences.resetsynth:write

    Reset your core-synth overlay to defaults.

    synth_id, confirm: true

Synth knowledge (4)

  • synthboard.synth.knowledge.addsynth:write

    Give a custom synth permanent knowledge from a URL or text (RAG). 1 credit per source.

    synth_id, source: url | text, url?, text?, label?

  • synthboard.synth.knowledge.listsynth:read

    List a custom synth's knowledge files.

    synth_id

  • synthboard.synth.knowledge.removesynth:write

    Delete a knowledge file and its chunks.

    synth_id, file_id, confirm: true

  • synthboard.synth.knowledge.promote_sessionsynth:write

    Persist a session's uploaded documents into a synth's permanent knowledge. Idempotent.

    session_id, synth_id, source_files?

Shares (4)

  • synthboard.session.sharesession:write

    Create a share link — public, password, or invite.

    session_id, type, password?, invite_emails?, expires_in_days?, share_scope?

  • synthboard.share.listsession:read

    Every active share for a session, with codes, URLs, and expiry.

    session_id

  • synthboard.share.revokesession:write

    Invalidate a share link immediately.

    share_code, confirm: true

  • synthboard.share.verify_passwordsession:read

    Validate a guest password against a protected share.

    share_code, password

Actions & integrations (3)

  • synthboard.integrations.listintegrations:read

    Your connected providers across the live integration catalog.

  • synthboard.action.executeintegrations:write

    Run a Recommended Action through a connected tool — same Skeptic gate, undo window, and audit as the web.

    session_id, action_item_id, tool_slug, arguments?, skeptic_token?

  • synthboard.action.undointegrations:write

    Best-effort reversal within the 30-second undo window.

    event_id

Utilities (2)

  • synthboard.pingno scope

    Connectivity check — returns the authenticated principal. No billing.

  • synthboard.catalog.searchsession:read

    Search synths, modes, templates, strategies, and models.

    query?, kind?, limit?

Resources (18) & prompts (11)

Deep-linkable, cacheable read surfaces — plus slash commands.

MCP Resources are the "GET" side of SynthBoard — read them any time for the latest state. Resource subscriptions are not supported: for live board tracking, poll synthboard.session.get with wait_ms (long-polls up to 60s per call), or use webhooks to be called when a run finishes.

URIReturns
synthboard://session/{id}Full session state — plus decision brief, memo, and board artifact on finished boards.
synthboard://session/{id}/memoThe board's terminal deliverable alone — decision memo or shaped artifact.
synthboard://session/{id}/synthesisRound summaries + synthesis blocks.
synthboard://session/{id}/outcomesCaptured decisions, action plan, outcomes.
synthboard://session/{id}/transcriptComplete agent message transcript.
synthboard://session/{id}/bookmarksSaved moments with notes.
synthboard://session/{id}/citationsWeb-search citations used in the session.
synthboard://session/{id}/canvasCanvas layout, positions, metadata.
synthboard://synth/{id}Public-safe profile — role, tagline, expertise, rating.
synthboard://catalog/synthsThe full public synth library.
synthboard://catalog/modesAll session modes with recommended setups.
synthboard://catalog/templatesPre-built decision templates.
synthboard://catalog/synthesis_strategiesAll 5 synthesis strategies with best-for guidance.
synthboard://catalog/modelsLLM models available at your tier — same list as the web UI.
synthboard://recentYour 20 most recent sessions, engine + phase aware.
synthboard://accountCredit balance, tier, engine, available session types.
synthboard://world-modelThe board's dossier on your world — identity, situation, goals, constraints, named entities — plus per-section counts, freshness, and per-seat calibration records (whose judgment has held up, per decision type).
synthboard://briefs/latestYour most recent weekly Board Brief — the standing board's proactive read on your world.

All session-scoped resources enforce ownership — cross-tenant reads return not_found, never a leak. Catalog resources are public read-only.

11 slash-prompts

Pre-configured commands — each routes through the plan-first flow with a mode signal./synthboard-consult opens the 1-on-1 room.

/synthboard-boardroom/synthboard-debate/synthboard-stress-test/synthboard-quick-take/synthboard-deep-dive/synthboard-decision/synthboard-war-room/synthboard-forecast/synthboard-research/synthboard-brainstorm/synthboard-consult

Error code reference (29)

Every error carries a code, message, correlation_id, and — over REST — the HTTP status below.

CodeHTTPMeaningFix
unauthorized401Missing / malformed Authorization headerSend Authorization: Bearer sb_live_...
forbidden403Authenticated but not allowedCheck ownership and key scopes
invalid_credentials401Key invalid, expired, or revokedCreate a new key
key_revoked401This key was revokedCreate a new key
ip_not_allowed403Request IP not in the key's allowlistRemove the allowlist or add your IP
scope_missing403Key lacks the required scopeCreate a key with the scope
mcp_disabled403The MCP/API surface is disabledContact support
validation_error400Tool argument failed schema validationCheck error details for the field
not_found404Resource doesn't exist or isn't yoursVerify the ID
rate_limited429Too many calls for your tierWait retry_after_s seconds
concurrent_session_limit429Max parallel sessions reachedWait or cancel one
insufficient_credits402Balance below the estimateTop up credits
insufficient_credits_mid_execution402Credits ran out mid-runTop up; delivered work is retained
daily_spend_cap_exceeded429The key's daily credit cap is reachedWait for reset (midnight UTC) or raise the cap
monthly_budget_exceeded429The key's monthly credit budget is reachedWait for month start (UTC) or raise the budget
idempotency_mismatch400Same idempotency_key, different argumentsUse a fresh key per distinct call
invalid_synth400Synth ID not in the libraryCheck synthboard.synth.list
invalid_mode400Unknown session modeCheck synthboard://catalog/modes
invalid_session_state400Session can't accept this operation (e.g. continue on a finished board)Follow the guidance in details — usually session.reconvene
session_not_complete500Operation needs a completed sessionWait for the run to finish
session_failed500The session run failedCheck the error, re-run or fork
task_not_found404No task execution for this IDVerify the task_id
user_banned403Account suspendedContact support
ssrf_blocked403URL pointed at a private/internal hostUse a public https URL
upstream_error500An upstream model/provider failedRetry; fallback chains handle most cases
timeout504The operation exceeded its time budgetRetry; check session.get for partial state
internal_error500Unexpected server errorContact support with the correlation_id
failed_precondition412A precondition isn't met (e.g. provider not connected)Check details; connect the integration
resource_exhausted429Provider-side quota exhaustedWait and retry

A few statuses differ over REST where HTTP semantics demand it (e.g. concurrent_session_limit → 409, upstream_error → 502).

Troubleshooting

Client says 'connection refused'
  • URL: https://synthboard.ai/api/mcp
  • Confirm the Authorization header includes the full key including the sb_live_ prefix.
  • Quit + relaunch the client. Config is read at startup.
  • Hit /api/mcp/health — should return { "ok": true }.
session.continue says invalid_session_state
The session is a current-engine board — finished boards aren't continued, they're reconvened. Call synthboard.session.reconvene with whats_changed.
concurrent_session_limit error
Your tier allows N parallel sessions. Wait or call synthboard.session.cancel. Tier limits appear in the error details.
insufficient_credits
Check your balance on the usage dashboard. Error includes exact shortfall.
Session stuck 'running' forever
Stuck tasks are swept and auto-refunded, and the sweep emits a session.failed webhook with reason timeout. Cancel via synthboard.session.cancel; credits charged up to that point are retained.
401 Unauthorized
Key was likely revoked, rotated past grace, or expired. Visit the Control Center → API Keys.
Claude.ai web isn't discovering OAuth
Use the full URL https://synthboard.ai/api/mcp — the /api/mcp suffix is required for metadata discovery.

Still stuck?

Every error response includes a correlation_id. Include it in any support request and we can trace the full call in our audit log.

Create an API key View your usage
On this page
  • Quick start
  • Client setup
  • Your first board
  • Plan-before-start
  • How sessions run
  • Pricing & billing
  • Rate limits & concurrency
  • Scopes
  • Security
  • Key management
  • OAuth 2.1 (for web clients)
  • Webhooks
  • Tool reference
  • Resources & prompts
  • Error codes
  • Troubleshooting