Skip to content

Start this tenant's production subscription

POST
/v1/subscription
curl --request POST \
--url https://api.vocapable.com/v1/subscription \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "workload_class": "engage", "term": "mtm", "extra_sessions": 0, "receptionist_connections": 0 }'

Subscribe this tenant without ever retrying an ambiguous Stripe create blindly.

The request has three independently committed phases: a tenant-unique operation before Stripe I/O, the provider correlation after Stripe answers, then the local subscription mirror. A crash after any phase leaves a durable recovery point. In particular, a retry that finds pending does not make another Stripe POST: its first outcome is unknown and a signed customer.subscription.created webhook must reconcile it.

Media typeapplication/json
SubscriptionRequest

The published card’s two axes plus the one published add-on quantity.

No price and no rate: the catalog owns every figure (vocapable_domain.rate_card), and a body that could name one would be a client setting its own price. extra_sessions is a quantity of the one published $200/mo add-on (ADR-0022) - deliberately unbounded above, per the card (“any quantity”); actual concurrency stays bounded by fleet capacity, which is an operations fact, not a checkout refusal.

receptionist_connections is the same shape for inbound answering (ADR-0025) and is a count of connections bought on top of whatever the plan already includes: the standalone receptionist plan’s $250 base fee carries the first one, so 0 there is a working one-connection receptionist, while an outbound plan includes none and buys its first connection here. receptionist_line_items owns that asymmetry; nothing on this request states which item bills.

object
workload_class
required
Workload Class
string
Allowed values: engage workforce sales receptionist
term
required
Term
string
Allowed values: mtm three_year
extra_sessions
Extra Sessions
integer
0
receptionist_connections
Receptionist Connections
integer
0

Successful Response

Media typeapplication/json
SubscriptionCreated
object
subscription_id
required
Subscription Id
string
external_ref
required
External Ref
string
status
required
Status
string
plan_id
required
Plan Id
string
plan_name
required
Plan Name
string
workload_class
required
Workload Class
string
Allowed values: engage workforce sales receptionist
term
required
Term
string
Allowed values: mtm three_year
base_price_minor
required
Base Price Minor
integer
currency
required
Currency
string
extra_sessions
required
Extra Sessions
integer
total_sessions
required
Total Sessions
integer
extra_session_monthly_minor
required
Extra Session Monthly Minor
integer
receptionist_connections
required
Receptionist Connections
integer
total_receptionist_connections
required
Total Receptionist Connections
integer
receptionist_base_monthly_minor
required
Receptionist Base Monthly Minor
integer
receptionist_connection_monthly_minor
required
Receptionist Connection Monthly Minor
integer
current_period_start
required
Current Period Start
string format: date-time
current_period_end
required
Current Period End
string format: date-time
sandbox_credit_redeemed_minor
required
Sandbox Credit Redeemed Minor
integer
sandbox_credit_unconfirmed
Sandbox Credit Unconfirmed
boolean
Example
{
"workload_class": "engage",
"term": "mtm",
"sandbox_credit_unconfirmed": false
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Examplegenerated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}