---
title: "Billing Checkout Status"
method: GET
path: "/api/billing/checkout-status"
tags: ["billing"]
---

# Billing Checkout Status

`GET /api/billing/checkout-status`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/billing/checkout-status`
- Auth: none declared

Reconcile the Checkout Session the browser returned with.

200 {paid: bool, status, tier, period} when the Session is the caller's;
404 otherwise (or when it does not exist); 400 on a malformed id; 503 when
Stripe cannot be asked. Never provisions anything -- the webhook owns the
tier write; this only tells the client whether to stop celebrating.

## Query parameters

- `session_id` string, required

## Response `200`

Successful Response

- CheckoutStatusResponse: The post-return reconcile of a Stripe Checkout Session the browser came back with (`?billing=success&session_id=...`). `paid` is the one field the client dereferences without a null-check: it decides between "Payment successful" and "your payment did not go through". It is True for a COMPLETE Session of the caller whose payment_status is 'paid' or 'no_payment_required' (a $0 first invoice -- credit balance, customer coupon -- is a live subscription too; CHAOS 2026-09-25). A complete Session still 'unpaid' is an async payment PROCESSING: `paid` is False and `status` is 'complete', which the client must read as "processing", not "failed". The route never provisions anything -- the webhook owns the tier write -- so a `paid` answer can precede the tier change by a few seconds.
  - `paid` boolean, required: True iff the Session is 'complete' and its payment_status is 'paid' or 'no_payment_required'.
  - `status` string, nullable: Stripe Session status: 'open' | 'complete' | 'expired'.
  - `tier` string, nullable: The tier the Session was created for (metadata.tier).
  - `period` string, nullable: 'monthly' | 'annual' (metadata.period).

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
