---
title: "Get account info"
method: POST
path: "/get_account_info"
---

# Get account info

`POST /get_account_info`

## Request

- Base URL: `https://newsmind.app/api/v1`
- URL: `https://newsmind.app/api/v1/get_account_info`
- Auth: OAuth 2 (authorization code, authorization URL `https://newsmind.app/oauth/authorize`, token URL `https://newsmind.app/oauth/token`, scopes: `mcp`)

Caller introspection: email, tier (pro/max/expired), subscription status, billing period end, trial end, feed limit, current feed count. Use whenever the user asks about their account, plan, billing, trial, or feed quotas. Read-only.

## Request body

- object

## Response `200`

Success

- object
  - `email` string, nullable
  - `tier` string: pro, max, or expired
  - `status` string, nullable: Stripe subscription status: pending, trialing, active, past_due, canceled, unpaid, incomplete, incomplete_expired
  - `selected_plan` string, nullable
  - `selected_cycle` string, nullable
  - `current_period_end` string, date-time, nullable
  - `renewal_date` string, date-time, nullable: Friendlier alias for current_period_end. Same value.
  - `trial_ends_at` string, date-time, nullable
  - `cancel_at_period_end` boolean
  - `feed_limit` integer, nullable
  - `feed_count` integer: Number of feeds the user is subscribed to.
  - `article_count` integer: Articles in the user's subscribed feeds that are within their tier retention window (Pro 30d / Max 90d). Reflects what's reachable via discovery tools — not raw storage. Updated in 0.3.5 to respect retention.
  - `star_count` integer: Articles the user has starred that are still within their tier retention window. Stars on articles past retention are not counted (those articles are invisible to discovery anyway). Updated in 0.3.5 to respect retention.
  - `import_pending` integer: Pending feeds in the user's OPML-import queue, drained in the background by the poll-batch worker. Added in v0.14.0.
  - `feed_warnings` FeedWarnings: Failing feeds — 3+ consecutive fetch failures AND nothing delivered in 48h. The delivery clause keeps a host that merely flaps out of this list. Returned on get_account_info and get_new_articles, only when there is something to report. failing_samples is capped at 5; get_feed_health has the full picture.
    - `failing_count` integer, required: Total subscribed feeds that have failed 3+ fetches in a row and returned no items for 48 hours. They are still retried (#368).
    - `note` string: Plain-language statement of what the count means: these feeds keep failing and have returned no items for 48 hours, and they are still retried. v0.55.0; #368.
    - `failing_hosts` object[]: Every host failing 2+ of the user's feeds, biggest group first. Turns a count into a shape: 42 feeds on one host that answers 451 is one breakage, not 42. Absent when no host is failing more than one feed. v1.259.0 (#327).
      - `host` string, required: Hostname, spelled as the feeds' last_error text spells it.
      - `feed_count` integer, required: How many of this user's failing feeds are on this host.
      - `shared_error` string: The error text every failing feed on this host reports. DESCRIPTIVE, not causal — it does not claim one upstream cause, which matters on shared feed hosts where each feed has a different owner. Absent when the feeds report different errors.
    - `failing_samples` object[], required: Up to 5 sample failing feeds, round-robined across hosts with the biggest group first — so the samples span causes rather than repeating one dead host. v1.259.0 (#327); previously the 5 highest error_counts.
      - `feed_id` integer, required
      - `title` string, nullable
      - `url` string, required: The address that stopped working — so a client can search for the publication's current feed without a second get_feed call. v1.165.0 (#199).
      - `diagnosis` string: Facts about the publisher, established once for this feed and identical for every subscriber: whether the site still answers and whether it advertises a feed elsewhere. States what is true, never what to subscribe to. Absent until diagnosed. v1.166.0 (#199).
      - `last_error` string, nullable: Most recent error text from the poller (HTTP status, parser error, etc.).
  - `import_failures` ImportFailures: Import-failure notice — feeds the user asked to import that failed in the last window_days days. Returned on the discovery tools and get_account_info only when non-zero. Two states: `import_failures` (permanent, relay them and offer next steps) and `import_retrying` (a retry is still scheduled, nothing to do — do not raise it unprompted). Call get_import_status for failed URLs and reasons. v0.33.0, retry state documented v1.150.0 (#173).
    - `state` 'import_failures' | 'import_retrying', required: `import_retrying` means every recent failure still has a retry scheduled — nothing is lost and there is nothing for the user to do. Emitted since v0.54.0 and undocumented until v1.150.0 (#173).
    - `failed_imports` integer, required: Permanently-failed imports inside the window. Zero on an `import_retrying` notice.
    - `retrying_imports` integer: Failures with a retry still scheduled. Omitted when zero. v1.150.0 (#173).
    - `window_days` integer, required: Recency window in days (currently 7).
    - `message` string, required: Assistant-directed instruction: relay the failures and offer next steps.
  - `import_recovered` ImportRecovered: Import-recovery notice — feeds the user asked to import that failed, were re-validated after a discovery fix shipped (#161), and have now been added automatically. Returned alongside the other notices only when non-zero. Worth mentioning ONCE: the user was previously told these feeds could not be added, so a feed appearing on its own is otherwise confusing. Nothing is required from them. v1.151.0 (#162).
    - `state` 'import_recovered', required
    - `recovered_imports` integer, required: Distinct URLs recovered inside the window.
    - `urls` string[], required: Up to 10 of them, so the assistant can name names. May be fewer than recovered_imports.
    - `window_days` integer, required: Recency window in days (currently 7).
    - `message` string, required: Assistant-directed instruction.
  - `manage_url` string, uri

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `402`: Subscription required (trial expired or cancelled)
- `429`: Too many calls. Either the per-account rate limit ({error: "rate_limited", message}) or the account's in-flight work ({error: <sentence>, code: "busy"}). Wait Retry-After seconds.
- `500`: Server error on our side (error: internal_error). The team has been notified.
- `503`: Temporarily unable to answer. error: timeout (the request ran too long; narrow it), server_busy or tier_unavailable (retry after Retry-After seconds when sent).

---

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