Skip to content
UpVoiced Docs

API reference

Billing and credits

The plan, checkout and billing portal sessions, plan changes and AI credits.

Set up the SDK client used in the examples

API key or Dashboard session:

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

const apiKey = process.env['UPVOICED_API_KEY']; // uv_live_… (Settings → API keys)
const workspace = process.env['UPVOICED_WORKSPACE_ID']; // sent as X-Workspace
if (!apiKey || !workspace) throw new Error('Set UPVOICED_API_KEY and UPVOICED_WORKSPACE_ID.');
const upvoiced = new UpVoiced({ apiKey, workspace });

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.

GET/v1/billing

Plan, status, entitlements, usage and credits for upsell UI (any member)

Authentication
API key or Dashboard session; API key scope read
Operation id
getBilling
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 48 fields
Response 200 (application/json)
NameTypeRequired
plan"free" | "starter" | "growth" | "business"Yes
subscribed_plan"free" | "starter" | "growth" | "business"Yes
interval"month" | "year"Yes
status"active" | "trialing" | "past_due" | "paused" | "canceled"Yes
current_period_endstring (date-time) | nullYes
cancel_at_period_endbooleanYes
scheduled_changeobject | nullYes
scheduled_change.plan"free" | "starter" | "growth" | "business"Yes
scheduled_change.interval"month" | "year"Yes
payment_failedbooleanYes
has_billing_accountbooleanYes
entitlementsobjectYes
entitlements.boards.maxinteger | nullvalue 0–1000000000Yes
entitlements.posts.active_maxinteger | nullvalue 0–1000000000Yes
entitlements.members.maxinteger | nullvalue 0–1000000000Yes
entitlements.surveys.active_maxinteger | nullvalue 0–1000000000Yes
entitlements.testimonials.maxinteger | nullvalue 0–1000000000Yes
entitlements.video_testimonialsbooleanYes
entitlements.walls.maxinteger | nullvalue 0–1000000000Yes
entitlements.powered_by.removablebooleanYes
entitlements.custom_domainbooleanYes
entitlements.custom_cssbooleanYes
entitlements.integrations.slack_discordbooleanYes
entitlements.api.enabledbooleanYes
entitlements.api.access"read_only" | "read_write"Yes
entitlements.api.keys_maxinteger | nullvalue 0–1000000000Yes
entitlements.mcp.enabledbooleanYes
entitlements.mcp.access"read_only" | "read_write"Yes
entitlements.webhooks.maxinteger | nullvalue 0–1000000000Yes
entitlements.ai.credits_monthlyintegervalue ≥ 0Yes
entitlements.end_user_ssobooleanYes
entitlements.audit_logbooleanYes
entitlements.private_boardsbooleanYes
entitlements.email_recipients_monthlyinteger | nullvalue 0–1000000000Yes
entitlements.support"community" | "email" | "priority_email" | "priority_onboarding"Yes
usageobjectYes
usage.membersintegervalue ≥ 0Yes
usage.boardsintegervalue ≥ 0Yes
usage.active_postsintegervalue ≥ 0Yes
restrictionsobjectYes
restrictions.read_only_board_idsarray of string (uuid)Yes
restrictions.board_selection"default" | "operator"Yes
restrictions.new_posts_blockedbooleanYes
creditsobjectYes
credits.balanceintegervalue ≥ 0Yes
credits.expiringintegervalue ≥ 0Yes
credits.expires_atstring (date-time) | nullYes
credits.lowbooleanYes

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

curl
curl 'https://api.upvoiced.com/v1/billing' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID"
TypeScript SDK
const data = await upvoiced.get('/v1/billing');
MCP
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_usage",
    "arguments": {
      "workspace": "0190f5e2-4c1d-7a3b-8c2d-5e6f7a8b9c0d"
    }
  }
}

Tool get_usage.

POST/v1/billing/checkout

Create a server-controlled Paddle transaction for a plan (owner)

Authentication
API key or Dashboard session; API key scope admin
Operation id
createCheckout
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
plan"starter" | "growth" | "business"Yes
interval"month" | "year"Yes
Response 201: 1 fields
Response 201 (application/json)
NameTypeRequired
transaction_idstringpattern ^txn_[a-z\d]{26}$Yes

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/billing/checkout' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "plan": "starter",
  "interval": "month"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/billing/checkout', { body: { plan: 'starter', interval: 'month' } });
MCP

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

POST/v1/billing/portal

Paddle customer portal session URL (owner)

Authentication
API key or Dashboard session; API key scope admin
Operation id
createBillingPortalSession
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Response 200: 2 fields
Response 200 (application/json)
NameTypeRequired
urlstring (uri)Yes
update_payment_method_urlstring (uri) | nullYes

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/billing/portal' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
TypeScript SDK
const data = await upvoiced.post('/v1/billing/portal', { body: {} });
MCP

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

POST/v1/billing/change

Change plan/interval: upgrades prorated now, downgrades next period (owner)

Authentication
API key or Dashboard session; API key scope admin
Operation id
changePlan
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
plan"starter" | "growth" | "business"Yes
interval"month" | "year"Yes
Response 200: 3 fields
Response 200 (application/json)
NameTypeRequired
effective"immediately" | "next_billing_period"Yes
plan"starter" | "growth" | "business"Yes
interval"month" | "year"Yes

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/billing/change' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "plan": "starter",
  "interval": "month"
}'
TypeScript SDK
const data = await upvoiced.post('/v1/billing/change', { body: { plan: 'starter', interval: 'month' } });
MCP

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

POST/v1/billing/cancel

Cancel at the end of the billing period; data is kept (owner)

Authentication
API key or Dashboard session; API key scope admin
Operation id
cancelSubscription
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Response 200: 2 fields
Response 200 (application/json)
NameTypeRequired
cancel_at_period_endbooleanYes
current_period_endstring (date-time) | nullYes

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/billing/cancel' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
TypeScript SDK
const data = await upvoiced.post('/v1/billing/cancel', { body: {} });
MCP

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

POST/v1/billing/resume

Remove a scheduled cancellation (owner)

Authentication
API key or Dashboard session; API key scope admin
Operation id
resumeSubscription
Idempotency
Send an Idempotency-Key to make retries safe.
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
idempotency-keystringpattern ^[A-Za-z0-9_.:-]{8,128}$No
Response 200: 2 fields
Response 200 (application/json)
NameTypeRequired
cancel_at_period_endbooleanYes
current_period_endstring (date-time) | nullYes

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/billing/resume' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
TypeScript SDK
const data = await upvoiced.post('/v1/billing/resume', { body: {} });
MCP

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

GET/v1/billing/credits

AI credit balance and recent ledger entries (any member)

Authentication
API key or Dashboard session; API key scope read
Operation id
getCredits
Headers
NameTypeRequired
x-workspacestring (uuid)Yes
Response 200: 10 fields
Response 200 (application/json)
NameTypeRequired
creditsobjectYes
credits.balanceintegervalue ≥ 0Yes
credits.expiringintegervalue ≥ 0Yes
credits.expires_atstring (date-time) | nullYes
credits.lowbooleanYes
entriesarray of objectYes
entries[].deltaintegerYes
entries[].reason"plan_grant" | "purchase" | "consume" | "refund" | "adjust" | "expire"Yes
entries[].balance_afterintegervalue ≥ 0Yes
entries[].created_atstring (date-time)Yes

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

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

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

POST/v1/billing/credits/checkout

Create a Paddle transaction for an AI credit pack (owner/admin)

Authentication
API key or Dashboard session; API key scope admin
Operation id
createCreditsCheckout
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
pack500 | 2500 | 10000Yes
Response 201: 1 fields
Response 201 (application/json)
NameTypeRequired
transaction_idstringpattern ^txn_[a-z\d]{26}$Yes

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/billing/credits/checkout' \
  -H "Authorization: Bearer $UPVOICED_API_KEY" \
  -H "X-Workspace: $UPVOICED_WORKSPACE_ID" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "pack": 500
}'
TypeScript SDK
const data = await upvoiced.post('/v1/billing/credits/checkout', { body: { pack: 500 } });
MCP

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