---
title: "Reconcile Intents"
method: POST
path: "/billing/intents/reconcile"
---

# Reconcile Intents

`POST /billing/intents/reconcile`

## Request

- Base URL: `https://api-docs.session-exchange.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api-docs.session-exchange.com/billing/intents/reconcile`
- Auth: none declared

Settle `pending` intents that never heard a webhook (WP-6): one-time checkouts after
AGENT_MDX_RECONCILE_ONE_TIME_AGE_S (default 15 min; the same pass also runs every 5 min as
`reconcile_sweep_loop`), subscription checkouts after 24 h. Body {dry_run}
(default TRUE — pass false to apply). QA intents are skipped. With a session id: read the session
from Stripe (GET only; the one write is the O-3 geo refund the replayed webhook path issues for a
buyer outside the EU) — `expired` → expired, `complete` → replayed as the
missed `checkout.session.completed` (same idempotent path as the webhook). Without one: the
sessions created around the intent are listed first (`_find_session_for`); a match is handled
like a stored session id, and only when Stripe positively has none is the intent expired with
reason `never_reached_stripe`. Stripe unreadable → skip. Re-running is a no-op.
SUBSCRIPTION intents stuck in `processing` for 15 min+ are recovered too
(`_reconcile_processing_subscription`): the Subscription is read and, when active/trialing and
in the platform's Stripe mode, granted through the webhook's own `_apply_subscription`.

## Response `200`

Successful Response

- unknown

---

[API](https://skmtc.dev/session-exchange/apis/a4sx.md) · [All operations](https://skmtc.dev/session-exchange/apis/a4sx/llms.txt) · [OpenAPI document](https://skmtc.dev/session-exchange/apis/a4sx/revisions/abaefc33dfc7?raw)
