Skip to content
UpVoiced Docs

API reference

Connected apps (OAuth)

The dashboard side of MCP connector sign-in: the consent screen and the OAuth grants an operator can review and disconnect.

Set up the SDK client used in the examples

Dashboard session only (API keys get 403 session_required):

import { UpVoiced } from '@upvoiced/sdk';

// Dashboard-session operations: the Clerk session token of a signed-in operator.
const upvoiced = new UpVoiced({
  headers: { authorization: `Bearer ${sessionToken}` },
  workspace: workspaceId,
});

curl examples read $UPVOICED_API_KEY and $UPVOICED_WORKSPACE_IDfrom your shell. MCP examples are the tools/call request an MCP client sends to the MCP server with the same API key.

POST/v1/oauth/consent/preview

MCP OAuth consent screen data: the client, its redirect host and the workspaces the caller administers

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
previewMcpOAuthConsent
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
requeststringpattern ^[A-Za-z0-9_-]{40,8192}$Yes
Response 200: 20 fields
Response 200 (application/json)
NameTypeRequired
clientobjectYes
client.idstringYes
client.namestringYes
client.kind"metadata_document" | "registered"Yes
client.hoststring | nullYes
client.uristring | nullYes
redirectobjectYes
redirect.uristringYes
redirect.hoststringYes
redirect.kind"web" | "loopback" | "app"Yes
requested_scopesarray of "read" | "write"Yes
resourcestringYes
expires_atstring (date-time)Yes
workspacesarray of objectYes
workspaces[].idstring (uuid)Yes
workspaces[].namestringYes
workspaces[].slugstringYes
workspaces[].role"owner" | "admin"Yes
workspaces[].mcp_enabledbooleanYes
workspaces[].write_allowedbooleanYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/oauth/consent/preview' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "request": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/oauth/consent/preview', {
  body: {
    request: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
  },
});
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/oauth/consent

Approve an MCP OAuth connection for X-Workspace with read or write access (owner/admin)

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
approveMcpOAuthConsent
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
requeststringpattern ^[A-Za-z0-9_-]{40,8192}$Yes
scope"read" | "write"Yes
Response 200: 1 fields
Response 200 (application/json)
NameTypeRequired
redirect_tostringYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/oauth/consent' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "request": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "scope": "read"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/oauth/consent', {
  body: {
    request: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
    scope: 'read',
  },
});
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

POST/v1/oauth/consent/deny

Decline an MCP OAuth connection (back to the app with access_denied)

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
denyMcpOAuthConsent
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Request body (JSON)
NameTypeRequired
requeststringpattern ^[A-Za-z0-9_-]{40,8192}$Yes
Response 200: 1 fields
Response 200 (application/json)
NameTypeRequired
redirect_tostringYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X POST 'https://api.upvoiced.com/v1/oauth/consent/deny' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "request": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/oauth/consent/deny', {
  body: {
    request: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',
  },
});
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

GET/v1/oauth/grants

List the workspace's connected MCP apps (OAuth grants; owner/admin)

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
listMcpOAuthGrants
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 15 fields
Response 200 (application/json)
NameTypeRequired
itemsarray of objectYes
items[].idstring (uuid)Yes
items[].client_idstringYes
items[].client_namestringYes
items[].client_kind"metadata_document" | "registered"Yes
items[].redirect_hoststringYes
items[].scopesarray of "read" | "write"items 1–2Yes
items[].created_byobjectYes
items[].created_by.idstring (uuid)Yes
items[].created_by.namestringYes
items[].created_atstring (date-time)Yes
items[].expires_atstring (date-time)Yes
items[].last_used_atstring (date-time) | nullYes
items[].revoked_atstring (date-time) | nullYes
next_cursornullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl 'https://api.upvoiced.com/v1/oauth/grants' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/oauth/grants');
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.

DELETE/v1/oauth/grants/{id}

Disconnect an MCP app: revoke its OAuth grant and tokens (effective on the next request)

Authentication
Dashboard session only (API keys get 403 session_required)
Operation id
revokeMcpOAuthGrant
Path parameters
NameTypeRequired
idstring (uuid)Yes
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 13 fields
Response 200 (application/json)
NameTypeRequired
idstring (uuid)Yes
client_idstringYes
client_namestringYes
client_kind"metadata_document" | "registered"Yes
redirect_hoststringYes
scopesarray of "read" | "write"items 1–2Yes
created_byobjectYes
created_by.idstring (uuid)Yes
created_by.namestringYes
created_atstring (date-time)Yes
expires_atstring (date-time)Yes
last_used_atstring (date-time) | nullYes
revoked_atstring (date-time) | nullYes

Errors: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503, all in the standard error shape.

curl
curl -X DELETE 'https://api.upvoiced.com/v1/oauth/grants/0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' \
  -H "Authorization: Bearer $UPVOICED_SESSION_TOKEN" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.delete('/v1/oauth/grants/{id}', { path: { id: '0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d' } });
MCP

No MCP tool for this operation. The MCP server covers the everyday reads and writes.