Skip to content

Build with SynthBoard

Platform reference

Version 0.1.0. Base URL https://www.synthboard.ai/api/v1, an organization key as a Bearer token. Generated from the same OpenAPI document the SDKs are built from.

POST /offices#

Create a managed office for one of your users (idempotent by external_user_id)

Scope offices:write · TypeScript sb.createOffice() · Python sb.create_office()

Body · OfficeCreate
external_user_idrequiredstringYour own opaque id for this user (a database id or a random token — never an email address, phone number or name). Creating again with the same id returns the same office. Deleting the office removes it from usage rows.
langstring | nullThe office language (e.g. en, he).
timezonestring | nullAn IANA time zone (e.g. Asia/Jerusalem).
metadataobject | nullYour own data (up to 4 KB). Never sent to a model.
Response · Office
idrequiredstring
objectrequiredstring
external_user_idrequiredstring
environmentrequired"live" | "sandbox"
langrequiredstring | null
timezonerequiredstring | null
metadatarequiredobject
created_atrequiredstring
last_call_atrequiredstring | null
noticestringThe one line to show your user before their first ask in this office.

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /offices#

List your managed offices (cursor-paged, newest first)

Scope offices:read · TypeScript sb.listOffices() · Python sb.list_offices()

Parameters
limit (query)integerPage size (default 25).
cursor (query)stringnext_cursor from the previous page.
external_user_id (query)stringOnly the office for this user id.
Response · OfficeList
objectrequiredstring
datarequiredobject[]
next_cursorrequiredstring | null

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /offices/{officeId}#

Get a managed office

Scope offices:read · TypeScript sb.getOffice() · Python sb.get_office()

Parameters
officeId (path)requiredstring
Response · Office
idrequiredstring
objectrequiredstring
external_user_idrequiredstring
environmentrequired"live" | "sandbox"
langrequiredstring | null
timezonerequiredstring | null
metadatarequiredobject
created_atrequiredstring
last_call_atrequiredstring | null
noticestringThe one line to show your user before their first ask in this office.

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

DELETE /offices/{officeId}#

Delete a managed office and erase everything in it

Scope offices:write · TypeScript sb.deleteOffice() · Python sb.delete_office()

Parameters
officeId (path)requiredstring
Response · OfficeDeleted
idrequiredstring
objectrequiredstring
deletedrequiredboolean

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

POST /offices/{officeId}/ask#

Ask in a managed office: her answer or an expert's (one turn per Idempotency-Key)

Scope ask · TypeScript sb.ask() · Python sb.ask()

Parameters
officeId (path)requiredstring
wait (query)integerSeconds to wait for the answer (default 25). Past it: 202, status working, then GET the turn.
Idempotency-Key (header)stringThe same key is the same turn: a retry returns that turn and never buys a second answer. The SDKs always send one.
Body · AskRequest
kind"question" | "review" | "log"
textrequiredstring
draftstring
proposed_actionobject
matter_idstring
context_idstring
practicestring
expertsstring[]
asked_in_wordsstring
supplied_factsobject[]
attachmentsobject[]
timezonestring
budgetobject
needs_by"now" | "today" | "whenever"
idempotency_keystring
langstring
Response · AskResult
schema_versionrequiredstring
statusrequired"ok" | "working" | "partial" | "failed" | "needs_input" | "needs_confirmation" | "upgrade_required"
turn_idrequiredstring
langrequiredstring
linkrequiredstring
speakerrequired"her" | "expert" | "board" | "job"
herobject
handoffobject
expert_turnsrequiredobject[]
matterrequiredobject | null
opinionobject
recordrequiredobject
speedrequiredobject
follow_offerobject
questionobject
saved_factsrequiredobject[]
surfaceobject
movesrequiredobject[]
cardsrequiredobject[]
follow_upsrequiredobject[]
filesrequiredobject[]
costrequiredobject
refusalobject
stepsrequiredobject[]
failed_reason"no_words" | "stream_failed" | "speak_failed"
joined_tostring | null
actsobject[]
provenancerequiredobject
boardobject
replystring
legacy_statusstring
agent_cardsobject[]
retryboolean
disclosurestring
noticestring

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /offices/{officeId}/turns/{turnId}#

A turn's answer (long poll with ?wait=)

Scope ask · TypeScript sb.getTurn() · Python sb.get_turn()

Parameters
officeId (path)requiredstring
turnId (path)requiredstring
wait (query)integerSeconds to wait while the turn is working (default 0).
Response · AskResult
schema_versionrequiredstring
statusrequired"ok" | "working" | "partial" | "failed" | "needs_input" | "needs_confirmation" | "upgrade_required"
turn_idrequiredstring
langrequiredstring
linkrequiredstring
speakerrequired"her" | "expert" | "board" | "job"
herobject
handoffobject
expert_turnsrequiredobject[]
matterrequiredobject | null
opinionobject
recordrequiredobject
speedrequiredobject
follow_offerobject
questionobject
saved_factsrequiredobject[]
surfaceobject
movesrequiredobject[]
cardsrequiredobject[]
follow_upsrequiredobject[]
filesrequiredobject[]
costrequiredobject
refusalobject
stepsrequiredobject[]
failed_reason"no_words" | "stream_failed" | "speak_failed"
joined_tostring | null
actsobject[]
provenancerequiredobject
boardobject
replystring
legacy_statusstring
agent_cardsobject[]
retryboolean
disclosurestring
noticestring

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /offices/{officeId}/matters#

The office's matters (rooms, one-offs or closed)

Scope record:read · TypeScript sb.listMatters() · Python sb.list_matters()

Parameters
officeId (path)requiredstring
scope (query)"rooms" | "one_offs" | "closed"Which matters (default rooms).
limit (query)integerPage size.
cursor (query)stringnext_cursor from the previous page.
Response · MatterList
objectrequiredstring
datarequiredobject[]
next_cursorrequiredstring | null

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /offices/{officeId}/record#

How each expert's calls in the office have turned out

Scope record:read · TypeScript sb.getRecord() · Python sb.get_record()

Parameters
officeId (path)requiredstring
Response · RecordResult
rowsrequiredobject[]

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /offices/{officeId}/events#

What happened on the office's matters since a cursor

Scope record:read · TypeScript sb.listEvents() · Python sb.list_events()

Parameters
officeId (path)requiredstring
cursor (query)stringnext_cursor from your last read: only what happened since.
Response · EventList
eventsrequiredobject[]
upcomingobject[]
next_cursorrequiredstring | null
moreboolean
deliverystring

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /offices/{officeId}/files/{fileId}#

A file made in the office, as a signed short-lived link

Scope files:read · TypeScript sb.getFile() · Python sb.get_file()

Parameters
officeId (path)requiredstring
fileId (path)requiredstring
ttl (query)integerLink lifetime in seconds (default 300).
Response · FileLink
filerequiredobject
urlrequiredstring
expires_atrequiredstring
ttl_secondsrequirednumber

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /usage#

This month's platform spend, calls, cap and balance, per office

Scope usage:read · TypeScript sb.getUsage() · Python sb.get_usage()

Parameters
month (query)stringYYYY-MM (default: this month, UTC).
office_id (query)stringOne office only.
Response · Usage
objectrequiredstring
environmentrequired"live" | "sandbox"
monthrequiredstringYYYY-MM (UTC).
creditsrequiredintegerCredits your offices consumed this month (1 credit = $0.01).
callsrequiredinteger
caprequiredinteger | nullYour monthly cap in credits; null = none.
balancerequiredinteger | nullYour SynthBoard account's balance.
officesrequiredobject[]

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

GET /webhooks#

Your organization's webhook subscriptions

Scope webhooks:write · TypeScript sb.listWebhooks() · Python sb.list_webhooks()

Response · WebhookList
okrequiredboolean
itemsrequiredobject[]

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

POST /webhooks#

Subscribe to events from all your offices (signing secret returned once)

Scope webhooks:write · TypeScript sb.createWebhook() · Python sb.create_webhook()

Body · WebhookCreate
labelrequiredstring
urlrequiredstring
eventsrequiredstring[]
Response · WebhookCreated
okrequiredboolean
subscriptionrequiredobject
signing_secretrequiredstring
verify_instructionsrequiredstring

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

DELETE /webhooks/{id}#

Delete a webhook subscription

Scope webhooks:write · TypeScript sb.deleteWebhook() · Python sb.delete_webhook()

Parameters
id (path)requiredstring
Response · WebhookDeleted
okrequiredboolean
deletedrequiredboolean

Errors

  • 400 validation_error or not_available (a reserved or not-yet-served part; nothing ran)
  • 401 unauthorized / invalid_credentials
  • 402 insufficient_credits or monthly_budget_exceeded (nothing ran)
  • 403 scope_missing / forbidden
  • 404 not_found (any other organization’s or environment’s id is a 404)
  • 429 rate_limited (Retry-After)
  • 503 api_disabled / not_available

Your own SynthBoard (personal keys)#

A personal key (sb_live_…) acts on your own SynthBoard and spends your credits, within the allowance you set in Settings › Connections › AI apps.

meta

  • GET /api/v1/health — Unauthenticated health probe
  • GET /api/v1/prices — The machine-readable price list: plans, what a credit is worth, the rate, the about-number per kind of work (unauthenticated)

agent

  • POST /api/v1/ask — Ask their Chief of Staff (Idempotency-Key: one turn, one charge; about 25 s, then working + turn_id)
  • GET /api/v1/turns/{id} — A turn's answer (long poll with ?wait_seconds=)
  • GET /api/v1/events — What happened on their matters since a cursor
  • GET /api/v1/record — Their record with each expert: resolved calls per expert and domain
  • GET /api/v1/contexts/{id} — One context the key's grant opens: what it is for, its own shape (`schema`: record types and their fields), members, files, kept records (each with its `type`, its `fields` by the schema's keys and the page each came from), decisions; ?query= adds the matching pages
  • POST /api/v1/contexts/{id}/proposals — Propose records into a granted context in its own shape (`type`, `fields` by the schema's keys, sub-rows' `cells`); kept only when the person keeps them

matters

  • GET /api/v1/matters — Their matters (rooms, one-offs or closed), paged
  • GET /api/v1/matters/{id} — One matter: its record, its files, whether it is followed
  • POST /api/v1/matters/{id}/follow — Stop following (on: false); Keep following stays the person's own yes (409 with the quote)
  • POST /api/v1/matters/{id}/watch — Stop watching for a reply (on: false); starting a watch stays the person's own yes (409 with the price and the link)

sessions

  • POST /api/v1/sessions — Start a session (plan_id or explicit setup; session_type boardroom | consult)
  • GET /api/v1/sessions — List sessions with filter/sort/cursor
  • POST /api/v1/sessions/plan — Propose a session setup + credit estimate without starting
  • GET /api/v1/sessions/{id} — Get session state + latest task (v4_phase, decision_brief, memo, board_artifact)
  • PATCH /api/v1/sessions/{id} — Rename / retag a session
  • DELETE /api/v1/sessions/{id} — Hard-delete a draft session
  • POST /api/v1/sessions/{id}/continue — Follow-up round (legacy-engine sessions)
  • POST /api/v1/sessions/{id}/reconvene — Chain a new board round on a completed V4 board (returns new_session_id)
  • POST /api/v1/sessions/{id}/messages — Send one Consult turn (expert reply + composed document)
  • POST /api/v1/sessions/{id}/cancel — Cancel the in-flight task
  • POST /api/v1/sessions/{id}/outcomes — Generate a deliverable (action plan / report / memo / bullets)
  • POST /api/v1/sessions/{id}/export — Export as markdown / JSON / text
  • POST /api/v1/sessions/{id}/archive — Archive or unarchive
  • POST /api/v1/sessions/{id}/fork — Duplicate with altered context (rerun optional)
  • POST /api/v1/sessions/{id}/update — Mid-session mutations (synths, mode, DNA tuning)
  • GET /api/v1/sessions/{id}/live-summary — Live consensus snapshot
  • GET /api/v1/sessions/{id}/cross-round — Cross-round position trends
  • POST /api/v1/sessions/{id}/assistant — Ask the Session Assistant
  • POST /api/v1/sessions/{id}/bookmarks — Bookmark a moment or pin a thread
  • POST /api/v1/sessions/{id}/decisions — Capture a formal decision record
  • POST /api/v1/sessions/{id}/promote-to-synth — Promote session documents into synth knowledge

calls

  • POST /api/v1/calls — Put a call on the record from her card (the person's yes; one start per card)
  • GET /api/v1/calls — List the person's calls on the record (status, paged)
  • GET /api/v1/calls/{id} — A call: each expert's take, the chair, the dates, the decision and the outcome
  • POST /api/v1/calls/{id} — Report a decision or an outcome (pending until the person confirms)

synths

  • POST /api/v1/synths/chat — 1-on-1 chat with a synth in a session
  • GET /api/v1/synths — List synths (core + public + your own)
  • POST /api/v1/synths — Create a custom synth
  • GET /api/v1/synths/{id} — Get a synth
  • PATCH /api/v1/synths/{id} — Update a custom synth
  • DELETE /api/v1/synths/{id} — Delete a custom synth
  • PATCH /api/v1/synths/{id}/preferences — Set per-user core-synth preferences
  • DELETE /api/v1/synths/{id}/preferences — Reset core-synth preferences
  • GET /api/v1/synths/{id}/knowledge — List a synth's knowledge files
  • POST /api/v1/synths/{id}/knowledge — Add knowledge (URL or text)
  • DELETE /api/v1/synths/{id}/knowledge/{fileId} — Remove a knowledge file

catalog

  • GET /api/v1/catalog/search — Search synths / modes / templates / strategies / models

shares

  • GET /api/v1/shares — List shares for a session
  • POST /api/v1/shares — Create a share link
  • DELETE /api/v1/shares/{id} — Revoke a share by share code
  • POST /api/v1/shares/verify-password — Verify a password-protected share

actions

  • POST /api/v1/actions/execute — Execute a Recommended Action via a connected tool
  • POST /api/v1/actions/undo — Undo an executed action (30 s window)
  • GET /api/v1/integrations — List connected integration providers

webhooks

  • GET /api/v1/webhooks — List webhook subscriptions
  • POST /api/v1/webhooks — Create a subscription (signing secret returned once)
  • PATCH /api/v1/webhooks/{id} — Update / enable / disable a subscription
  • DELETE /api/v1/webhooks/{id} — Delete a subscription
  • GET /api/v1/webhooks/{id}/deliveries — Recent delivery attempts for a subscription

files

  • GET /api/v1/files/{id} — A file made for the person (Word, Excel, PDF, calendar, PNG) as a signed short-lived link