Checkout links
Sell a plan from your own systems by minting a hosted checkout URL through the API.
POST /v1/checkout-links (scope checkout:write) creates a real, hosted
Stripe Checkout session for a specific buyer and returns its URL. Use it to
sell access from your own storefront, bot command, or support tool without
building your own checkout flow.
Request
POST /v1/checkout-links
Authorization: Bearer arclt_live_...
Content-Type: application/json
Idempotency-Key: a-client-generated-unique-string
{
"tier_id": "tier_abc123",
"plan_id": "plan_monthly",
"platform": "discord",
"platform_uid": "123456789012345678"
}tier_id(required): the plan tier to sell.platformandplatform_uid(required): the buyer's identity on a connected platform (discord,stoat, orfluxer). This is how the checkout session is tied to a member once payment completes.plan_id(optional): required only when the tier has more than one active billing plan; omit it when there is exactly one.Idempotency-Key(optional but recommended): makes a retry safe. See Idempotency.
Response
{
"url": "https://checkout.stripe.com/c/pay/cs_live_..."
}The URL is a real hosted checkout session created at request time, so it is
single-use and tied to the buyer you identified. Stripe-hosted sessions follow
Stripe's own default expiry (24 hours). Send the buyer to url; Arcalotl
handles the rest of the checkout and grants access the same way a self-service
purchase would.
Eligibility
Checkout link creation fails with a 422 or 409 problem (see
Errors) when:
- the tier does not exist or is not active (
not_found) - the community has no active payment provider configuration
(
payment_config_inactive) - the tier has multiple plans and
plan_idwas omitted (plan_required) - the community has no configuration for the requested platform
(
platform_not_connected) - the buyer is already subscribed or already purchased this tier, or a plan
switch is required instead of a new checkout (
not_eligible)
Retry only after fixing the underlying condition; retrying an eligibility failure with the same request will fail the same way.