---
title: "Get import status"
method: POST
path: "/get_import_status"
---

# Get import status

`POST /get_import_status`

## Request

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

Returns the user's pending / succeeded / failed import counts (import_opml, or a subscribe_to_feed that answered queued) plus the most recent failures, and the addresses subscribe_to_feed refused this week: rechecking, added or refused. Report counts to the user, not a completion time.

## Request body

- object

## Response `200`

Success

- object
  - `pending` integer: Feeds still waiting for the worker to validate + insert.
  - `succeeded` integer: Feeds successfully imported in the last 24 hours.
  - `failed` integer: Feeds the worker rejected, all-time (validation error — dead URL, non-feed content, etc.).
  - `failed_recent` integer: Failed imports inside the last 7 days — the recency window the import_failures notice uses. v0.33.0.
  - `retrying` integer: Failures that still have an automatic retry scheduled. NOT losses — the worker will validate them again, so do not offer to re-add them by hand. Undocumented here since v0.54.0; added v1.150.0 (#173).
  - `next_retry_at` string, date-time, nullable: When the earliest scheduled retry runs. Omitted when nothing is scheduled. v1.150.0 (#173).
  - `eta` string: Queue STATE, not a time: "queue is empty" or "still importing". Deliberately carries no duration — the queue is shared across customers and most of the wall-clock is publishers' servers responding. Report the pending/succeeded/failed counts to the user, never a completion time.
  - `advice` string, nullable: Present when failed_recent > 0: assistant-directed instruction to relay the failed URLs and reasons and offer next steps. v0.33.0.
  - `failure_summary` object, nullable: Present only when there are failures. Counts failures by cause rather than the 10 in recent_failures, over at most 500 rows — if failure_summary_truncated is present these buckets are a sample of failed, not a census. publisher_blocks, domain_gone and malformed_feed cannot be fixed by anyone; address_not_found and no_feed_at_site can still be rescued by a different address. Zero buckets are absent, not 0. v1.144.0 (#150), capped disclosure v1.149.0 (#174).
    - `publisher_blocks` integer: The publisher refuses automated readers (401/403/406, or a bot check that needs a browser). Nothing to fix on either side. A rate limit is not a block and is counted under temporary. v1.159.0 (#191), reworded v1.235.0 (#268).
    - `address_not_found` integer: 404/410 — the address is gone. The server has already tried the site's homepage.
    - `no_feed_at_site` integer: The page loaded but advertises no feed anywhere, after full discovery.
    - `domain_gone` integer: The domain no longer resolves.
    - `malformed_feed` integer: The address serves a feed, but its XML is broken. The address is right; the publisher's file is not. Nothing a different URL fixes. v1.147.0 (#177).
    - `temporary` integer: Timeout, network failure, or a rate limit (HTTP 429 — retried, never treated as a block, since #228). The retry ladder re-drives these WHILE RETRIES REMAIN; a row whose message says we have stopped retrying has exhausted them and will not be re-driven until a validator change reopens it. v1.159.0 (#191).
    - `other` integer: Unclassified.
  - `refused_subscribes` object[]: Present only when subscribe_to_feed refused an address in the last 7 days. One entry per address, its latest refusal, newest first, at most 20. v1.281.7 (#367).
    - `url` string
    - `refused_at` string, date-time
    - `state` 'rechecking' | 'added' | 'refused': rechecking: a further check is scheduled, daily this week if needed, and the feed is added on its own if it answers — nothing for the user to do. added: it was added after a re-check. refused: no further check is scheduled.
    - `added_at` string, date-time: When the feed was added. Present only when state is added.
    - `reason` string: The first refusal's reason, as subscribe_to_feed reported it.
    - `http_status` integer: Present when the first refusal carried one.
    - `message` string: The first refusal's human-readable message.
    - `last_checked_at` string, date-time: When the address was last checked again, if it has been. Absent until then.
    - `recheck_reason` string: What the last re-check found, when one ran and was refused: its reason. Absent otherwise.
    - `recheck_status` integer: That re-check's HTTP status, when it had one.
    - `recheck_message` string: That re-check's human-readable message.
  - `refused_subscribes_note` string: Present with refused_subscribes: what each state means and what to tell the user. v1.281.7 (#367).
  - `refused_subscribes_unavailable` boolean: Present, true, only when the refused-subscribes read failed: an absent refused_subscribes then means nothing, not that nothing was refused. v1.281.7 (#367).
  - `failure_summary_truncated` boolean: Present only when failure_summary covered fewer rows than `failed`. Its buckets are then a sample, not a census — do not quote them as totals. v1.149.0 (#174).
  - `failure_summary_counted` integer: How many failed rows failure_summary actually read, when that is fewer than `failed`. v1.149.0 (#174).
  - `recent_failures` object[]: Up to 10 most recent failures with reasons, so the user can see what didn't import. Capped — use failure_summary for the totals.
    - `url` string
    - `last_error` string, nullable
    - `attempts` integer
    - `created_at` string, date-time
    - `next_retry_at` string, date-time, nullable: When the retry ladder will re-drive this row; null if nothing is scheduled and it is permanently failed. The per-row companion to the top-level `retrying` count, which says how many are scheduled but not which. Undocumented since v0.54.0. Unlike the top-level next_retry_at, this key is always present.

## 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)
