---
title: "Get Content Guard monitoring status"
method: GET
path: "/content/{id}/monitoring"
tags: ["Optimizations"]
---

# Get Content Guard monitoring status

`GET /content/{id}/monitoring`

## Request

- Base URL: `https://next.frase.io/api/v1`
- URL: `https://next.frase.io/api/v1/content/{id}/monitoring`
- Auth: one of:
  - API key in header `X-API-KEY`
  - HTTP bearer

Content Guard monitoring state for one article. `hasPublishedUrl` is a RECOVERABILITY judgment, not a presence test on the stored URL: the server runs the same recovery ladder arming runs — the stored URL when absolute; otherwise (empty slot, non-FraseCMS) the newest live CMS-inventory URL; otherwise, for a FraseCMS article with a live published post, an address re-derived from the site's CURRENT settings. So a stored relative path ("/blog/post", which a FraseCMS publish produces before domain setup) reports `hasPublishedUrl: true` once domain setup is finished — no re-publish needed — and `false` means the enable WOULD be rejected right now. `publishedUrlIssue` names the residual after recovery failed: "missing" (no stored URL and nothing recoverable) or "not_absolute" (a stored path that could not be re-derived — for FraseCMS that can mean domain setup unfinished, the post not live, or FraseCMS disabled for the site). Read the pair together rather than testing the URL yourself: this is exactly the condition enabling enforces.

## Path parameters

- `id` string, uuid, required

## Response `200`

Monitoring status

- object
  - `data` object
    - `isMonitored` boolean: Whether Content Guard is currently watching this article.
    - `monitoredAt` string, date-time, nullable: When monitoring was first enabled, or null when it never was.
    - `quota` object: The workspace's monitoring quota after this read.
      - `used` integer
      - `limit` integer: Monitored-content cap on the current plan. A sentinel 999 means unlimited.
      - `remaining` integer
      - `allowed` boolean: Whether another article could be guarded right now.
      - `message` string: Present only when the quota blocks further arming.
    - `hasPublishedUrl` boolean: Whether Guard could watch this article RIGHT NOW: the stored URL when absolute, or an address the server can recover (CMS inventory, or FraseCMS re-derivation from current settings when a live published post exists). True no longer implies the stored URL itself is absolute. This is the same ladder the enable path runs, so it never reports true for an article that arming would reject.
    - `publishedUrlIssue` 'missing' | 'not_absolute' | 'null', nullable: Residual reason when hasPublishedUrl is false — i.e. after recovery failed. "missing": no stored URL and nothing recoverable (never published, or a FraseCMS article with no live post/domain). "not_absolute": a stored path that could not be re-derived — for FraseCMS that can mean domain setup unfinished, the post not live, or FraseCMS disabled; for imports, a URL that was never a full address.
    - `hasGsc` boolean: Whether the article's site has a connected Search Console property.
    - `cmsConnections` object[]: CMS destinations this article could be re-published to.
    - `pendingApplicationId` string, uuid, nullable: A suggestion application awaiting review, or null.
    - `isPaused` boolean: True when this article is monitored but ranks past the plan's quota, so the sweep skips it. Ephemeral: it clears on upgrade without any data change.
    - `unreachableSince` string, date-time, nullable: When the guarded URL stopped answering. Set only after two consecutive failed weekly runs, so it means "this page appears to be gone", not "one request timed out". Null while the page still answers, and null whenever monitoring is off.

## Other responses

- `404`: Content not found in this workspace

---

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