Checkout links
Sell a plan from your own systems by minting a checkout URL through the API.
POST /v1/checkout-links (scope checkout:write) creates a real checkout
session for a specific buyer. Identify the buyer with a connected platform
identity, an existing Arcalotl member ID, or your own namespaced user ID.
For an operator-controlled application, follow the complete External entitlements guide.
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",
"subject": {
"external": {
"namespace": "production",
"external_user_id": "usr_7f921"
}
},
"client_reference_id": "order_8Z4P1",
"return_url": "https://community.example.com/billing/complete"
}tier_id(required): the plan tier to sell.subject(required): exactly one buyer identity. Send an existingmember_id, a namespacedexternalidentity you own, or a connected platform identity.plan_id(optional): required only when the tier has more than one active billing plan; omit it when there is exactly one.client_reference_id(optional): your order or checkout-attempt ID. It is returned in later entitlement source metadata.return_url(required for external subjects): an HTTPS page in your app. Treat it as navigation only, never as payment confirmation.discount_code(optional): a community discount code to apply to the checkout. Case-insensitive. Invalid or ineligible codes fail the request with422 discount_invalid.Idempotency-Key(optional but recommended): makes a retry safe. See Idempotency.
Response
{
"checkout_id": "cs_01JMZX9E7P",
"member_id": "mem_01JMZX1Z7D",
"url": "https://checkout.stripe.com/c/pay/cs_...",
"expires_at": "2026-08-01T12:00:00Z"
}The response also includes checkout_id, the canonical Arcalotl member_id,
and expires_at when reported by the provider. A platform-identity checkout
uses the Arcalotl-hosted surface; an external-subject checkout uses the
provider-hosted surface and an HTTPS return_url you supply.
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; platform subjects only) - 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.