---
title: "Say where a finished article is live on the site"
method: POST
path: "/v1/sites/{site}/articles/{article_id}/report-live"
tags: ["articles"]
---

# Say where a finished article is live on the site

`POST /v1/sites/{site}/articles/{article_id}/report-live`

## Request

- Base URL: `https://frontshelf.io/api`
- URL: `https://frontshelf.io/api/v1/sites/{site}/articles/{article_id}/report-live`
- Auth: HTTP bearer

Say where a finished article is live, once the page is public on the production site: Frontshelf records the address and lists the article as live. It is your claim, not a check: call it after the deploy, never for a pull request still waiting for its merge. Nothing is fetched now; Frontshelf's crawl reads the page later. `url` is the article's own page (never the home page): https when the site is, on the site's host or one under it, at the site's port. The same address again changes nothing (`recorded: false`); a new one replaces it (the article moved). A sample cannot be reported. If Frontshelf's WordPress publishing of it has not called the site yet, the report stops it, so the site has it once; once WordPress is posting it, the report is INVALID_TRANSITION, records nothing, and says what to tell your human. dry_run: true says what it would do.

## Path parameters

- `site` string, required: Site ID (site_…), origin (https://example.com), or bare domain, resolved server-side; the response carries the canonical ID.
- `article_id` string, required: A finished article's id (cart_…), from articles_list.

## Request body

- object
  - `url` string, required: The full address of the article's page: https when the site is, on the site's own host or a host under it, at the site's port, never the home page.
  - `dry_run` boolean: true: check the call and say what it would do, without doing it.
  - `confirm` boolean: true: go ahead with a change that asks for confirmation.

## Response `200`

Say where a finished article is live on the site

- object
  - `summary` string, required: The answer in one or two sentences, with the numbers it rests on.
  - `warnings` string[], required: What limits this answer (a cap, a read that was cut short). Empty when nothing does.
  - `next_actions` object[], required: What to call next, best first. Follow them.
    - `capability` string, required: What to call next: a capability.
    - `arguments` object, required: Its arguments, complete; pass them as they are.
    - `instruction` string, required: What to do, written to you.
  - `site_id` string, required: The site's canonical id.
  - `article_id` string, required
  - `live` object, required
    - `url` string, required
    - `since` string, required: When it was reported (ISO 8601).
    - `source` 'agent', required
  - `recorded` boolean, required: False: this address was already on record, and nothing changed.
  - `previous_url` string, nullable, required: The address on record before this call; null for the first report.

## Other responses

- `400`: VALIDATION_FAILED
- `401`: UNAUTHENTICATED
- `403`: ORGANIZATION_FROZEN, SCOPE_DENIED
- `404`: SITE_NOT_FOUND, NOT_FOUND
- `409`: AMBIGUOUS_SITE, INVALID_TRANSITION, AGENT_STOPPED
- `503`: PLATFORM_READ_ONLY, DEPENDENCY_UNAVAILABLE

---

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