---
title: "Pending Payment"
method: GET
path: "/api/v1/billing/pending-payment"
tags: ["billing"]
---

# Pending Payment

`GET /api/v1/billing/pending-payment`

## Request

- Base URL: `https://api.badgeia.com`
- URL: `https://api.badgeia.com/api/v1/billing/pending-payment`
- Auth: none declared

Rehydrate an unresolved, authenticated plan-change payment.

Recovery intentionally does NOT depend on ``require_billing_enabled``.
``BILLING_ENABLED`` prevents creation of new money-moving operations; it
must not strand a hosted invoice created before the kill switch flipped.

The canonical subscription id and customer id both come from the
authenticated user's row. Stripe is then re-read with the invoice expanded
and both identities are checked again before any URL is returned. No local
plan state is changed here; signed Stripe webhooks remain the sole
entitlement writer.

## Response `200`

Successful Response

- PendingPaymentResponse: Authenticated recovery state for one already-requested plan change. This deliberately lives outside ``BillingStatusResponse``: billing status is public deployment configuration, whereas an open hosted invoice is customer payment data. The endpoint below is the only browser-readable projection and returns no Stripe/customer/subscription identifiers. The authenticated Badge user id binds this response to the browser's SWR cache key; it is not a Stripe identifier and is never used for authorization.
  - `user_id` string, uuid, required
  - `payment_pending` boolean
  - `payment_url` string, nullable
  - `expires_at` string, date-time, nullable

---

[API](https://skmtc.dev/badgeia/apis/badge.md) · [All operations](https://skmtc.dev/badgeia/apis/badge/llms.txt) · [OpenAPI document](https://skmtc.dev/badgeia/apis/badge/revisions/7e7f7fee8b77?raw)
