ArcalotlArcalotl

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.
  • platform and platform_uid (required): the buyer's identity on a connected platform (discord, stoat, or fluxer). 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_id was 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.

On this page