Skip to main content
POST
/
api
/
v1
/
payments
/
stripe
/
checkout-session
Create Checkout Session
curl --request POST \
  --url https://api.devkit4ai.com/api/v1/payments/stripe/checkout-session \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "price_id": "<string>",
  "success_url": "<string>",
  "cancel_url": "<string>",
  "mode": "subscription",
  "quantity": 1,
  "metadata": {},
  "allow_existing_subscription": false
}
'
{
  "session_id": "<string>",
  "checkout_url": "<string>"
}
Create a Stripe Checkout session to redirect users to Stripe’s hosted checkout page. Supports both subscription and one-time payment modes.

Authentication

This endpoint requires end user authentication via HTTP Bearer Token with project scope.

Query Parameters

test_mode
boolean
default:"true"
Use test mode credentials. Set to false for production payments.

Request Body

price_id
string
required
Stripe Price ID for the product or subscription (e.g., price_1ABC...)
success_url
string
required
URL to redirect after successful payment. Include {CHECKOUT_SESSION_ID} placeholder.
cancel_url
string
required
URL to redirect if user cancels checkout
mode
string
default:"subscription"
Checkout mode: subscription or payment (one-time)
quantity
integer
default:"1"
Quantity of items (minimum: 1)
metadata
object
Additional metadata to attach to the checkout session
allow_existing_subscription
boolean
default:"false"
If true, allows checkout even if user already has an active subscription

Response

session_id
string
Stripe Checkout Session ID
checkout_url
string
URL to redirect user to Stripe Checkout

Example Request

curl -X POST "https://api.devkit4ai.com/api/v1/payments/stripe/checkout-session?test_mode=true" \
  -H "Authorization: Bearer {end_user_jwt}" \
  -H "Content-Type: application/json" \
  -d '{
    "price_id": "price_1ABC123def456",
    "success_url": "https://myapp.com/success?session_id={CHECKOUT_SESSION_ID}",
    "cancel_url": "https://myapp.com/pricing",
    "mode": "subscription"
  }'

Example Response

{
  "session_id": "cs_test_a1b2c3d4e5f6g7h8i9j0",
  "checkout_url": "https://checkout.stripe.com/c/pay/cs_test_a1b2c3d4e5f6g7h8i9j0"
}

Checkout Flow

Integration Example

Frontend (React)

// Pricing button component
const SubscribeButton = ({ priceId }: { priceId: string }) => {
  const handleSubscribe = async () => {
    const response = await fetch('/api/checkout', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        price_id: priceId,
        success_url: `${window.location.origin}/success?session_id={CHECKOUT_SESSION_ID}`,
        cancel_url: `${window.location.origin}/pricing`
      })
    });
    
    const { checkout_url } = await response.json();
    window.location.href = checkout_url;
  };

  return <button onClick={handleSubscribe}>Subscribe</button>;
};

Backend (Next.js API Route)

// app/api/checkout/route.ts
export async function POST(request: Request) {
  const body = await request.json();
  
  const response = await fetch(
    `${process.env.NEXT_PUBLIC_API_URL}/api/v1/payments/stripe/checkout-session?test_mode=${process.env.STRIPE_TEST_MODE}`,
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${getUserToken()}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(body)
    }
  );
  
  return Response.json(await response.json());
}

Existing Subscription Handling

By default, users with active subscriptions cannot start a new checkout:
Set allow_existing_subscription: true for upgrade/downgrade flows, or use the Update Subscription endpoint instead.

Price IDs

Get Price IDs from your Stripe Dashboard:
  1. Navigate to Products > Pricing
  2. Click on a price to view its ID
(((REPLACE_THIS_WITH_IMAGE: stripe-dashboard-price-id.png: Stripe Dashboard showing a product’s pricing section with Price ID visible)))

Error Responses

StatusDescription
400User already has active subscription (when allow_existing_subscription: false)
401Unauthorized - Invalid or missing authentication
404Project not found or Stripe not configured
422Validation error - Invalid price_id or URLs

Get My Subscription

Check user’s subscription status

Stripe Webhook

Handle checkout completion

Update Subscription

Change subscription plans

Authorizations

Authorization
string
header
required

The access token received from the authorization server in the OAuth 2.0 flow.

Query Parameters

test_mode
boolean
default:true

Use test mode credentials

Body

application/json

Request to create a Stripe checkout session.

price_id
string
required
Minimum string length: 1
success_url
string
required
Minimum string length: 1
cancel_url
string
required
Minimum string length: 1
mode
string
default:subscription
Pattern: ^(subscription|payment)$
quantity
integer
default:1
Required range: x >= 1
metadata
Metadata · object
allow_existing_subscription
boolean
default:false

If true, allows checkout even if user has active subscription

Response

Successful Response

Stripe checkout session response.

session_id
string
required
checkout_url
string
required