Skip to main content
Orders capture purchase transactions from creation through fulfillment. Podium supports four checkout methods, each suited to different use cases — from traditional card payments to fully autonomous agent transactions.

Choosing a Checkout Method

MethodBest ForCurrencyAuth RequiredHuman in Loop?
StripeConsumer web/mobile checkoutUSD (fiat)YesYes — card entry
x402Agent-native autonomous paymentsUSDC on BaseNoNo — programmatic
Embedded WalletAutomated crypto checkout via PrivyUSDC on BaseYesNo — server-side
Coinbase CommerceMulti-token crypto checkoutVariousYesYes — Coinbase flow

Order Lifecycle

Create an Order

Orders start as OPEN and can have products added to them. Creating an order with a product in a single call:
curl -X POST https://api.podium.build/api/v1/user/{userId}/order \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "productId": "clx9prod001",
    "variantIds": ["clx9var001"],
    "quantity": 1
  }'
Response:
{
  "id": "clx9order001",
  "status": "OPEN",
  "shippingStatus": "PENDING",
  "points": 0,
  "shippingFee": 0,
  "items": [
    {
      "id": 1,
      "productId": "clx9prod001",
      "productName": "Organic Face Serum",
      "productSlug": "organic-face-serum",
      "quantity": 1,
      "price": 2500,
      "selectedAttributes": { "Size": "30ml" }
    }
  ],
  "createdAt": "2026-03-07T12:00:00Z"
}

Get Open Order

Retrieve the current open order for a user (only one open order at a time):
curl https://api.podium.build/api/v1/user/{userId}/order \
  -H "Authorization: Bearer YOUR_API_KEY"

Add Product to Order

curl -X POST https://api.podium.build/api/v1/user/{userId}/order/{orderId}/product/{productId} \
  -H "Authorization: Bearer YOUR_API_KEY"

Remove Item from Order

curl -X DELETE https://api.podium.build/api/v1/user/{userId}/order/{orderId}/item/{orderItemId} \
  -H "Authorization: Bearer YOUR_API_KEY"

Order Status Flow

StatusDescription
OPENOrder created, items being added
PAYMENT_PENDINGCheckout initiated, awaiting payment confirmation
PAIDPayment confirmed (via webhook or on-chain verification)
PAYMENT_FAILEDPayment attempt failed
PROCESSINGBeing prepared for shipping
SHIPPEDShipping label created, in transit
DELIVEREDDelivered to customer

Stripe Checkout

The most common flow for consumer-facing applications. Creates a Stripe PaymentIntent and returns a clientSecret for completing payment on the frontend.
curl -X POST https://api.podium.build/api/v1/user/{userId}/order/{orderId}/checkout \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "points": 500
  }'
Request Body:
FieldTypeDefaultDescription
pointsinteger0Points to apply as discount
Response:
{
  "intentId": "pi_3abc123",
  "clientSecret": "pi_3abc123_secret_xyz",
  "status": "requires_payment_method",
  "amount": 2000
}

How It Works

1

Create PaymentIntent

POST /checkout creates a Stripe PaymentIntent for the order total (minus any points discount). If a PaymentIntent already exists and points haven’t changed, the existing one is reused. If points changed, the old intent is cancelled and a new one is created.
2

Complete Payment

Use the clientSecret on the frontend with Stripe.js or Stripe Elements to collect payment. The user enters their card and confirms.
3

Webhook Confirmation

Stripe sends payment_intent.succeeded to /webhooks/stripe/payment-intent/succeeded. Podium updates the order to PAID, decrements inventory, and publishes an OrderConfirmationEvent.
4

Finalize Points

If points were applied, call PUT /user/{userId}/order/{orderId}/points/finalize to commit the point spend. If the payment failed, call POST /user/{userId}/order/{orderId}/points/revert to return the points.

x402 Checkout (USDC)

Machine-native payment for autonomous agents. No authentication required — the agent pays with USDC on Base via the x402 protocol. See x402 Payments for the full protocol spec.
# Step 1: Request payment requirements (returns HTTP 402)
curl -X POST https://api.podium.build/api/v1/x402/orders/{orderId}/pay

# Response: 402 Payment Required
# Headers include X-PAYMENT-REQUIREMENTS with amount, payTo address, and network

# Step 2: Submit payment with signed USDC transfer
curl -X POST https://api.podium.build/api/v1/x402/orders/{orderId}/pay \
  -H "X-PAYMENT: <base64-encoded-payment-payload>"

How It Works

1

Request Requirements

Agent calls the pay endpoint without an X-PAYMENT header. The server returns 402 Payment Required with the order amount in USDC, the payTo address, and the network (Base).
2

Sign and Send Payment

Agent constructs a USDC transfer, signs it, and re-calls the endpoint with the X-PAYMENT header containing the base64-encoded payment proof.
3

Verify and Settle

Podium decodes the payment, verifies the amount matches the order total, and confirms the on-chain transfer via the x402 facilitator. On success: creates/updates an X402Payment record, moves the order to PAID, and decrements inventory.
x402 checkout requires the organization to have x402PayToAddress configured in their settings. The payment amount is converted from the order’s cent-based total to USDC (6 decimal places).

Embedded Wallet Checkout

For automated crypto checkout using Privy server-managed wallets. The transaction is executed server-side — no user interaction required during payment.
curl -X PATCH https://api.podium.build/api/v1/user/{userId}/order/{orderId}/checkout/embedded-wallet \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "txHash": "0xabc123...",
    "amount": "25.00",
    "email": "user@example.com",
    "shippingAddress": {
      "line1": "123 Main St",
      "city": "San Francisco",
      "state": "CA",
      "postalCode": "94102",
      "countryCode": "US"
    },
    "walletAddress": "0x1234567890abcdef...",
    "chain": "BASE",
    "asset": "USDC"
  }'
Request Body:
FieldTypeRequiredDescription
txHashstringYesOn-chain transaction hash
amountstringYesPayment amount
emailstringYesNotification email
shippingAddressobject?NoShipping address (nullable)
walletAddressstringYesEthereum address of the paying wallet
chainenumYesBASE
assetenumYesUSDC

How It Works

  1. Your backend initiates a USDC transfer from the user’s Privy embedded wallet
  2. After the transaction confirms on-chain, call this endpoint with the txHash
  3. Podium verifies the wallet, creates a CryptoPaymentIntent (status CONFIRMED), updates the order to PAID, and decrements inventory
  4. An OrderConfirmationEvent is published if an email is provided

Coinbase Commerce Checkout

Multi-token crypto checkout via Coinbase Commerce:
curl -X PATCH https://api.podium.build/api/v1/user/{userId}/order/{orderId}/checkout/coinbase \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "callsId": "coinbase_charge_abc123",
    "amount": "25.00",
    "customer": {
      "email": "user@example.com",
      "physicalAddress": {
        "address1": "123 Main St",
        "city": "San Francisco",
        "state": "CA",
        "postalCode": "94102",
        "countryCode": "US",
        "name": {
          "firstName": "Jane",
          "familyName": "Doe"
        }
      }
    }
  }'

Discounts and Points

Apply Points Discount

curl -X POST https://api.podium.build/api/v1/user/{userId}/order/{orderId}/points \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "points": 500 }'
Points are held in a pending state until finalized after payment or reverted on failure.

Apply Discount Code

curl -X POST https://api.podium.build/api/v1/user/{userId}/order/{orderId}/discount \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "code": "SUMMER2026" }'

Finalize Points

After successful payment, commit the point spend:
curl -X PUT https://api.podium.build/api/v1/user/{userId}/order/{orderId}/points/finalize \
  -H "Authorization: Bearer YOUR_API_KEY"

Revert Points

On payment failure, return held points to the user:
curl -X POST https://api.podium.build/api/v1/user/{userId}/order/{orderId}/points/revert \
  -H "Authorization: Bearer YOUR_API_KEY"

Shipping

Podium integrates with Shippo for shipping rate calculation and label generation.

Get Shipping Quote

Returns available shipping rates and updates the Stripe PaymentIntent amount to include shipping:
curl -X POST https://api.podium.build/api/v1/order/{orderId}/shipping/quote \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Jane",
    "lastName": "Doe",
    "address": {
      "line1": "123 Main St",
      "city": "San Francisco",
      "state": "CA",
      "postalCode": "94102",
      "countryCode": "US"
    }
  }'

Generate Shipping Label

curl https://api.podium.build/api/v1/creator/id/{creatorId}/order/{orderId}/shipping/label \
  -H "Authorization: Bearer YOUR_API_KEY"
Creates a Shippo shipping label and sends a tracking email to the customer.

Guest Checkout

Anonymous buyers can place orders without creating a Podium account.

Create Guest Order

curl -X POST https://api.podium.build/api/v1/guest/order \
  -H "Content-Type: application/json" \
  -d '{
    "productId": "clx9prod001",
    "variantIds": ["clx9var001"],
    "quantity": 1
  }'

Guest Stripe Checkout

curl -X POST https://api.podium.build/api/v1/guest/order/{orderId}/checkout
Returns a Stripe PaymentIntent clientSecret — same flow as authenticated checkout but without user context.

Guest Coinbase Checkout

curl -X PATCH https://api.podium.build/api/v1/guest/order/{orderId}/checkout/coinbase \
  -H "Content-Type: application/json" \
  -d '{ "callsId": "...", "amount": "25.00", "customer": { ... } }'

Record Payment Failure

If payment fails on the client side (before webhook), notify the server:
curl -X POST https://api.podium.build/api/v1/user/{userId}/order/{orderId}/payment-failed \
  -H "Authorization: Bearer YOUR_API_KEY"

Order Model

FieldTypeDescription
idstringCUID2 identifier
statusenumOrder status (see flow above)
shippingStatusenumPENDING, LABEL_CREATED, IN_TRANSIT, DELIVERED
pointsintegerPoints applied as discount
shippingFeeintegerShipping cost in cents
shippingInfoobject?Shippo tracking data
itemsarrayOrder items with product snapshots
createdAtdatetimeCreation timestamp
updatedAtdatetimeLast update timestamp

Endpoint Summary

MethodPathDescription
GET/user/{id}/orderGet open order
POST/user/{id}/orderCreate order with product
GET/user/{id}/ordersList user orders
GET/user/{id}/order/{orderId}Get order by ID
POST/user/{id}/order/{orderId}/product/{productId}Add product to order
DELETE/user/{id}/order/{orderId}/item/{orderItemId}Remove item
POST/user/{id}/order/{orderId}/checkoutStripe checkout
PATCH/user/{id}/order/{orderId}/checkout/embedded-walletEmbedded wallet checkout
PATCH/user/{id}/order/{orderId}/checkout/coinbaseCoinbase checkout
POST/user/{id}/order/{orderId}/discountApply discount code
POST/user/{id}/order/{orderId}/pointsApply points
PUT/user/{id}/order/{orderId}/points/finalizeFinalize points
POST/user/{id}/order/{orderId}/points/revertRevert points
POST/user/{id}/order/{orderId}/payment-failedRecord payment failure
POST/x402/orders/{id}/payx402 USDC payment
POST/order/{id}/shipping/quoteShipping quote
GET/order/{id}Get order (generic)
POST/guest/orderCreate guest order
POST/guest/order/{id}/checkoutGuest Stripe checkout
PATCH/guest/order/{id}/checkout/coinbaseGuest Coinbase checkout
POST/guest/order/{id}/payment-failedGuest payment failure