Start a checkout
Starts a Stripe Checkout for a plan in availablePlans when nothing is paid through Stripe yet, and returns the URL the customer opens to pay; an open checkout for the same plan is reused.
Both redirect URLs must be on the Voidhash dashboard.
Guide: Plans and billing
A project secret key: vh_sk_... for production, vh_sk_test_... for test. Keep it on your servers.
In: header
Path parameters
The organization's id, org_....
Request body
application/json
TypeScript definitions
Use the request body type in TypeScript.
The plan version to subscribe to, from availablePlans.
A dashboard URL the customer returns to.
A dashboard URL the customer returns to.
Examples
curl -X POST "https://api.voidhash.com/api/v1/organizations/org_w5xk2e7q0lzv3n8b1c4d6f9g/billing/checkout-sessions" \ -H "Authorization: Bearer vh_sk_..." \ -H "Content-Type: application/json" \ -d '{ "planVersionId": "bplanv_g4r7w2t9k5m1x8c3v6b0n4q2", "successUrl": "https://voidhash.com/studio/acme/~/settings/billing?checkout=success", "cancelUrl": "https://voidhash.com/studio/acme/~/settings/billing" }'{ "url": "https://checkout.stripe.com/c/pay/cs_live_a1B2c3D4e5F6g7H8"}{ "error": { "type": "invalid_request", "code": "plan_unavailable", "message": "This plan is not available to the organization.", "param": "planVersionId" }}{ "error": { "type": "unauthenticated", "code": "invalid_api_key", "message": "This secret key is not valid." }}{ "error": { "type": "permission_denied", "code": "permission_denied", "message": "Insufficient permissions." }}{ "error": { "type": "not_found", "code": "organization_not_found", "message": "There is no organization org_w5xk2e7q0lzv3n8b1c4d6f9g, or this credential cannot use it.", "param": "organizationId" }}{ "error": { "type": "conflict", "code": "already_subscribed", "message": "The organization already pays through Stripe; change the subscription's plan instead." }}{ "error": { "type": "internal", "code": "internal_error", "message": "Something went wrong on our side. Try again, and contact support with the Request-Id header if it keeps failing." }}{ "error": { "type": "unavailable", "code": "string", "message": "string", "param": "string" }}Response body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
Errors
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request | plan_unavailable | For a plan the organization cannot pick. |
| 400 | invalid_request | invalid_redirect_url | For a redirect elsewhere. |
| 409 | conflict | already_subscribed | When the organization already pays through Stripe. |
It can also fail with the errors every operation shares, such as unauthenticated; see Errors.
More in Billing
Something wrong or missing on this page? Tell us by email or on Discord.