---
title: "Consumer withdrawal state for this account"
method: GET
path: "/v1/billing/withdrawal"
tags: ["Billing"]
---

# Consumer withdrawal state for this account

`GET /v1/billing/withdrawal`

## Request

- Base URL: `https://api.briefgate.dev`
- URL: `https://api.briefgate.dev/v1/billing/withdrawal`
- Auth: HTTP bearer

What was declared at checkout, when the 14-day withdrawal window closes, and whether a withdrawal is already on file. Reports the deadline even once it has passed and even where the right was waived. `declarations` is returned in the requested `language` where a translation exists (Czech today; English otherwise), falling back to the account's default language when none is requested.

## Query parameters

- `language` 'cs' | 'sk' | 'pl' | 'de' | 'es' | 'en'

## Response `200`

Withdrawal state

- object
  - `applicable` boolean: False when there is nothing to withdraw from. True on a paid plan, and also true on the free plan while a deferred-start subscription (see /v1/billing/checkout) is trialling — the contract already exists even though paid access has not started yet.
  - `declarations` object: The exact sentences a checkout form must show, so the record matches what the buyer saw. In the requested `language`, else the account's default language (falls back to English for a language with no translation of these two sentences yet).
    - `business` string
    - `immediate_access` string
  - `customer_type` 'consumer' | 'business' | 'undeclared'
  - `withdrawal_waived` boolean
  - `consent_text` string, nullable: The exact sentence agreed to, stored verbatim.
  - `consent_language` 'cs' | 'sk' | 'pl' | 'de' | 'es' | 'en', nullable: Language consent_text was actually shown in at the time it was agreed to. Null when no consent is on file yet.
  - `consent_recorded_at` string, date-time, nullable
  - `subscription_started_at` string, date-time, nullable
  - `window_days` integer
  - `deadline` string, date-time, nullable
  - `within_window` boolean
  - `pending_request` object, nullable
  - `refund_preview` object, nullable: What withdrawing right now would refund, computed from what Stripe actually charged (see computeWithdrawalRefund in src/consumer.ts). Null when not applicable, or once a withdrawal is already on file — that request's amount is fixed at the time it was made.
    - `amount_paid_cents` integer
    - `period_days` integer
    - `days_used` integer
    - `unused_sms_credit_cents` integer
    - `refund_cents` integer
    - `needs_review` boolean: True if Stripe could not be read and this figure is a 0-filled placeholder.

## Other responses

- `401`: Missing or invalid API key

---

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