---
title: "Reconcile Entitlement"
method: POST
path: "/api/v1/billing/reconcile"
tags: ["billing"]
---

# Reconcile Entitlement

`POST /api/v1/billing/reconcile`

## Request

- Base URL: `https://api.cohearence.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.cohearence.app/api/v1/billing/reconcile`
- Auth: HTTP bearer

Re-read this user's plan from the provider and return the refreshed entitlement.

A second, independent path to the same truth as the webhook — and the one the
post-checkout redirect uses. The two race by design: Polar sends the browser back
the moment payment clears, which can beat ``customer.state_changed`` reaching us.
Worse, the webhook may never arrive at all (no dead-letter queue, no replay, and an
endpoint auto-disabled after 10 failures), which leaves a paying user on the free
tier with nothing to retry.

Pulling on the success screen closes both holes: the common case is a few hundred
milliseconds faster, and the pathological case self-heals instead of becoming a
support ticket.

Idempotent — it applies the same full snapshot the webhook would.

## Response `200`

Successful Response

- EntitlementResponse: A user's plan, as the client should see it. Provider-neutral by design — ``source`` distinguishes a comped account from a paid one, but never names the Merchant of Record, so swapping it is invisible to the app.
  - `tier` string, required
  - `is_pro` boolean, required
  - `status` string, nullable
  - `source` string, nullable
  - `renews_at` string, date-time, nullable
  - `cancel_at_period_end` boolean

---

[API](https://skmtc.dev/cohearence/apis/health-agent-api.md) · [All operations](https://skmtc.dev/cohearence/apis/health-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cohearence/apis/health-agent-api/revisions/c7aee7d6ecf0?raw)
