Checkout Sessions API
The Checkout Sessions API manages shopping carts and purchase flows.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
POST | /checkout_sessions | Create a new checkout session |
GET | /checkout_sessions/{id} | Get checkout session state |
PATCH | /checkout_sessions/{id} | Update checkout session |
POST | /checkout_sessions/{id}/complete | Complete the purchase |
POST | /checkout_sessions/{id}/cancel | Cancel the checkout |
Create Checkout Session
Create a new checkout session with cart items.
POST /checkout_sessionsRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
items | LineItemInput[] | Yes | Items to add to cart |
shipping_address | Address | No | Shipping address |
customer | Customer | No | Customer information |
payment_method | string | No | Payment method (default: demo_card) |
LineItemInput
| Field | Type | Required | Description |
|---|---|---|---|
product_id | string | Yes | Product ID from catalog |
variant_sku | string | No | Specific variant SKU |
quantity | integer | No | Quantity (default: 1) |
Address
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Recipient name |
line1 | string | No | Street address |
line2 | string | No | Apartment, suite, etc. |
city | string | No | City |
state | string | No | State/province code |
postal_code | string | No | ZIP/postal code |
country | string | No | Country code (e.g., US) |
Customer
| Field | Type | Required | Description |
|---|---|---|---|
email | string | No | Customer email |
phone | string | No | Customer phone |
name | string | No | Customer name |
Response
Returns a CheckoutSessionResponse with the created session.
Examples
cURL
curl -X POST "https://{{YOUR_STORE_URL}}/checkout_sessions" \
-H "Content-Type: application/json" \
-H "X-ACP-API-Key: {{YOUR_API_KEY}}" \
-d '{
"items": [
{
"product_id": "{{PRODUCT_ID}}",
"variant_sku": "{{VARIANT_SKU}}",
"quantity": 1
}
],
"shipping_address": {
"name": "Jane Doe",
"line1": "123 Main Street",
"city": "San Francisco",
"state": "CA",
"postal_code": "94102",
"country": "US"
},
"customer": {
"email": "jane@example.com",
"name": "Jane Doe"
}
}'Python
import requests
BASE_URL = "https://{{YOUR_STORE_URL}}"
HEADERS = {
"Content-Type": "application/json",
"X-ACP-API-Key": "{{YOUR_API_KEY}}"
}
def create_checkout(items, shipping_address=None, customer=None):
payload = {"items": items}
if shipping_address:
payload["shipping_address"] = shipping_address
if customer:
payload["customer"] = customer
response = requests.post(
f"{BASE_URL}/checkout_sessions",
json=payload,
headers=HEADERS
)
response.raise_for_status()
return response.json()
# Usage
session = create_checkout(
items=[
{"product_id": "prod_abc123", "variant_sku": "sku_black_m", "quantity": 2}
],
shipping_address={
"name": "Jane Doe",
"line1": "123 Main Street",
"city": "San Francisco",
"state": "CA",
"postal_code": "94102",
"country": "US"
},
customer={
"email": "jane@example.com",
"name": "Jane Doe"
}
)
print(f"Session ID: {session['checkout_session']['id']}")
print(f"Total: ${session['checkout_session']['amounts']['total']}")TypeScript
const BASE_URL = "https://{{YOUR_STORE_URL}}";
const API_KEY = "{{YOUR_API_KEY}}";
interface LineItemInput {
product_id: string;
variant_sku?: string;
quantity?: number;
}
interface Address {
name?: string;
line1?: string;
line2?: string;
city?: string;
state?: string;
postal_code?: string;
country?: string;
}
interface Customer {
email?: string;
phone?: string;
name?: string;
}
interface CreateCheckoutInput {
items: LineItemInput[];
shipping_address?: Address;
customer?: Customer;
}
async function createCheckout(input: CreateCheckoutInput): Promise<any> {
const response = await fetch(`${BASE_URL}/checkout_sessions`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-ACP-API-Key": API_KEY
},
body: JSON.stringify(input)
});
if (!response.ok) {
throw new Error(`Failed to create checkout: ${response.statusText}`);
}
return response.json();
}
// Usage
const session = await createCheckout({
items: [
{ product_id: "prod_abc123", variant_sku: "sku_black_m", quantity: 2 }
],
shipping_address: {
name: "Jane Doe",
line1: "123 Main Street",
city: "San Francisco",
state: "CA",
postal_code: "94102",
country: "US"
},
customer: {
email: "jane@example.com"
}
});
console.log(`Session ID: ${session.checkout_session.id}`);
console.log(`Total: $${session.checkout_session.amounts.total}`);Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class LornCheckoutClient {
private static final String BASE_URL = "https://{{YOUR_STORE_URL}}";
private static final String API_KEY = "{{YOUR_API_KEY}}";
private final HttpClient client = HttpClient.newHttpClient();
public String createCheckout(String requestBody) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/checkout_sessions"))
.header("Content-Type", "application/json")
.header("X-ACP-API-Key", API_KEY)
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200 && response.statusCode() != 201) {
throw new RuntimeException("Failed to create checkout: " + response.body());
}
return response.body();
}
}
// Usage
String requestBody = """
{
"items": [
{"product_id": "prod_abc123", "variant_sku": "sku_black_m", "quantity": 2}
],
"shipping_address": {
"name": "Jane Doe",
"line1": "123 Main Street",
"city": "San Francisco",
"state": "CA",
"postal_code": "94102",
"country": "US"
},
"customer": {"email": "jane@example.com"}
}
""";
LornCheckoutClient client = new LornCheckoutClient();
String result = client.createCheckout(requestBody);
System.out.println(result);Go
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
const (
baseURL = "https://{{YOUR_STORE_URL}}"
apiKey = "{{YOUR_API_KEY}}"
)
type LineItemInput struct {
ProductID string `json:"product_id"`
VariantSKU string `json:"variant_sku,omitempty"`
Quantity int `json:"quantity,omitempty"`
}
type Address struct {
Name string `json:"name,omitempty"`
Line1 string `json:"line1,omitempty"`
Line2 string `json:"line2,omitempty"`
City string `json:"city,omitempty"`
State string `json:"state,omitempty"`
PostalCode string `json:"postal_code,omitempty"`
Country string `json:"country,omitempty"`
}
type Customer struct {
Email string `json:"email,omitempty"`
Phone string `json:"phone,omitempty"`
Name string `json:"name,omitempty"`
}
type CreateCheckoutInput struct {
Items []LineItemInput `json:"items"`
ShippingAddress *Address `json:"shipping_address,omitempty"`
Customer *Customer `json:"customer,omitempty"`
}
func createCheckout(input CreateCheckoutInput) (map[string]interface{}, error) {
body, err := json.Marshal(input)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", baseURL+"/checkout_sessions", bytes.NewBuffer(body))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-ACP-API-Key", apiKey)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var result map[string]interface{}
if err := json.Unmarshal(respBody, &result); err != nil {
return nil, err
}
return result, nil
}
func main() {
session, err := createCheckout(CreateCheckoutInput{
Items: []LineItemInput{
{ProductID: "prod_abc123", VariantSKU: "sku_black_m", Quantity: 2},
},
ShippingAddress: &Address{
Name: "Jane Doe",
Line1: "123 Main Street",
City: "San Francisco",
State: "CA",
PostalCode: "94102",
Country: "US",
},
Customer: &Customer{
Email: "jane@example.com",
},
})
if err != nil {
panic(err)
}
fmt.Printf("Session: %v\n", session)
}Get Checkout Session
Retrieve the current state of a checkout session.
GET /checkout_sessions/{session_id}Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Yes | Checkout session ID |
Response
Returns a CheckoutSessionResponse with the current session state.
Examples
cURL
curl "https://{{YOUR_STORE_URL}}/checkout_sessions/{{SESSION_ID}}" \
-H "X-ACP-API-Key: {{YOUR_API_KEY}}"Python
def get_checkout(session_id: str) -> dict:
response = requests.get(
f"{BASE_URL}/checkout_sessions/{session_id}",
headers=HEADERS
)
response.raise_for_status()
return response.json()
# Usage
session = get_checkout("cs_demo_abc123")
print(f"Status: {session['checkout_session']['status']}")
print(f"Total: ${session['checkout_session']['amounts']['total']}")TypeScript
async function getCheckout(sessionId: string): Promise<any> {
const response = await fetch(`${BASE_URL}/checkout_sessions/${sessionId}`, {
headers: { "X-ACP-API-Key": API_KEY }
});
if (!response.ok) {
throw new Error(`Checkout not found: ${sessionId}`);
}
return response.json();
}Update Checkout Session
Update an existing checkout session (cart items, address, or customer info).
PATCH /checkout_sessions/{session_id}Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Yes | Checkout session ID |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
items | LineItemInput[] | No | Replace cart items entirely |
shipping_address | Address | No | Update shipping address |
customer | Customer | No | Update customer info |
payment_method | string | No | Update payment method |
Note: When items is provided, it replaces the entire cart. Omit to keep existing items.
Response
Returns a CheckoutSessionResponse with the updated session state.
Examples
cURL
# Update shipping address
curl -X PATCH "https://{{YOUR_STORE_URL}}/checkout_sessions/{{SESSION_ID}}" \
-H "Content-Type: application/json" \
-H "X-ACP-API-Key: {{YOUR_API_KEY}}" \
-d '{
"shipping_address": {
"name": "Jane Doe",
"line1": "456 Oak Avenue",
"city": "Los Angeles",
"state": "CA",
"postal_code": "90001",
"country": "US"
}
}'
# Update cart items
curl -X PATCH "https://{{YOUR_STORE_URL}}/checkout_sessions/{{SESSION_ID}}" \
-H "Content-Type: application/json" \
-H "X-ACP-API-Key: {{YOUR_API_KEY}}" \
-d '{
"items": [
{"product_id": "prod_abc123", "quantity": 3},
{"product_id": "prod_xyz789", "quantity": 1}
]
}'Python
def update_checkout(session_id: str, updates: dict) -> dict:
response = requests.patch(
f"{BASE_URL}/checkout_sessions/{session_id}",
json=updates,
headers=HEADERS
)
response.raise_for_status()
return response.json()
# Update shipping address
session = update_checkout("cs_demo_abc123", {
"shipping_address": {
"name": "Jane Doe",
"line1": "456 Oak Avenue",
"city": "Los Angeles",
"state": "CA",
"postal_code": "90001",
"country": "US"
}
})
# Update cart quantity
session = update_checkout("cs_demo_abc123", {
"items": [
{"product_id": "prod_abc123", "quantity": 3}
]
})TypeScript
async function updateCheckout(sessionId: string, updates: object): Promise<any> {
const response = await fetch(`${BASE_URL}/checkout_sessions/${sessionId}`, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
"X-ACP-API-Key": API_KEY
},
body: JSON.stringify(updates)
});
if (!response.ok) {
throw new Error(`Failed to update checkout: ${response.statusText}`);
}
return response.json();
}
// Update shipping address
const session = await updateCheckout("cs_demo_abc123", {
shipping_address: {
name: "Jane Doe",
line1: "456 Oak Avenue",
city: "Los Angeles",
state: "CA",
postal_code: "90001",
country: "US"
}
});Complete Checkout Session
Finalize the checkout and complete the purchase.
POST /checkout_sessions/{session_id}/completePath Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Yes | Checkout session ID |
Response
Returns a CheckoutSessionResponse with status: "completed".
Examples
cURL
curl -X POST "https://{{YOUR_STORE_URL}}/checkout_sessions/{{SESSION_ID}}/complete" \
-H "X-ACP-API-Key: {{YOUR_API_KEY}}"Python
def complete_checkout(session_id: str) -> dict:
response = requests.post(
f"{BASE_URL}/checkout_sessions/{session_id}/complete",
headers=HEADERS
)
response.raise_for_status()
return response.json()
# Usage
order = complete_checkout("cs_demo_abc123")
print(f"Order completed! Status: {order['checkout_session']['status']}")
print(f"Total charged: ${order['checkout_session']['amounts']['total']}")TypeScript
async function completeCheckout(sessionId: string): Promise<any> {
const response = await fetch(
`${BASE_URL}/checkout_sessions/${sessionId}/complete`,
{
method: "POST",
headers: { "X-ACP-API-Key": API_KEY }
}
);
if (!response.ok) {
throw new Error(`Failed to complete checkout: ${response.statusText}`);
}
return response.json();
}
const order = await completeCheckout("cs_demo_abc123");
console.log(`Order completed! Total: $${order.checkout_session.amounts.total}`);Cancel Checkout Session
Cancel an in-progress checkout session.
POST /checkout_sessions/{session_id}/cancelPath Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Yes | Checkout session ID |
Response
Returns a CheckoutSessionResponse with status: "canceled".
Errors
| Status | Error | Description |
|---|---|---|
| 404 | not_found | Session not found |
| 405 | method_not_allowed | Session already completed or canceled |
Examples
cURL
curl -X POST "https://{{YOUR_STORE_URL}}/checkout_sessions/{{SESSION_ID}}/cancel" \
-H "X-ACP-API-Key: {{YOUR_API_KEY}}"Python
def cancel_checkout(session_id: str) -> dict:
response = requests.post(
f"{BASE_URL}/checkout_sessions/{session_id}/cancel",
headers=HEADERS
)
if response.status_code == 405:
raise ValueError("Cannot cancel: session already completed or canceled")
response.raise_for_status()
return response.json()
# Usage
try:
result = cancel_checkout("cs_demo_abc123")
print(f"Session canceled: {result['checkout_session']['status']}")
except ValueError as e:
print(e)Response Objects
CheckoutSessionResponse
{
"checkout_session": {
"id": "cs_demo_abc123",
"status": "open",
"currency": "USD",
"line_items": [
{
"product_id": "prod_abc123",
"variant_sku": "sku_black_m",
"quantity": 2,
"title": "Classic Cotton T-Shirt",
"unit_price": 29.99,
"currency": "USD",
"subtotal": 59.98
}
],
"shipping_address": {
"name": "Jane Doe",
"line1": "123 Main Street",
"city": "San Francisco",
"state": "CA",
"postal_code": "94102",
"country": "US"
},
"customer": {
"email": "jane@example.com",
"name": "Jane Doe"
},
"payment_method": "demo_card",
"shipping": {
"method": "ground",
"amount": 7.99,
"currency": "USD"
},
"tax": {
"rate": 0.08,
"amount": 4.80,
"currency": "USD"
},
"amounts": {
"subtotal": 59.98,
"tax": 4.80,
"shipping": 7.99,
"total": 72.77,
"currency": "USD"
},
"client_secret": "pi_demo_cs_demo_abc123_secret_demo",
"created_at": "2024-01-15T10:30:00Z"
}
}Field Reference
CheckoutSession
| Field | Type | Description |
|---|---|---|
id | string | Unique session identifier |
status | string | open, completed, canceled |
currency | string | Currency code |
line_items | LineItem[] | Cart items |
shipping_address | Address | Shipping address |
customer | Customer | Customer info |
payment_method | string | Payment method |
shipping | ShippingQuote | Shipping details |
tax | TaxSummary | Tax calculation |
amounts | AmountBreakdown | Price totals |
client_secret | string | Payment intent secret |
created_at | string | Creation timestamp (ISO 8601) |
LineItem
| Field | Type | Description |
|---|---|---|
product_id | string | Product ID |
variant_sku | string | Variant SKU |
quantity | integer | Quantity |
title | string | Product title |
unit_price | number | Price per unit |
currency | string | Currency |
subtotal | number | Line total |
AmountBreakdown
| Field | Type | Description |
|---|---|---|
subtotal | number | Sum of line items |
tax | number | Tax amount |
shipping | number | Shipping cost |
total | number | Grand total |
currency | string | Currency |
Errors
| Status | Error | Description |
|---|---|---|
| 400 | invalid_request | Invalid input (missing items, unknown product) |
| 404 | not_found | Session or product not found |
| 405 | method_not_allowed | Invalid operation (e.g., cancel completed session) |
| 503 | service_unavailable | Backend not configured |
Error Response
{
"detail": "Checkout session not found"
}