---
title: "Has anyone opened it? Opens, comments and expiry for one page, for the agent that published it."
method: GET
path: "/sites/{idOrSlug}/activity"
tags: ["Sites"]
---

# Has anyone opened it? Opens, comments and expiry for one page, for the agent that published it.

`GET /sites/{idOrSlug}/activity`

## Request

- Base URL: `https://api.stacktr.ee`
- URL: `https://api.stacktr.ee/sites/{idOrSlug}/activity`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.stacktr.ee/oauth/authorize`, token URL `https://api.stacktr.ee/oauth/token`, scopes: `sites:read`)
  - API key in header `Authorization`

Read-only and content-free. Works with the credential the publisher already holds: `Authorization: Claim <claim_token>` for a page published without an account, or the account's API key or OAuth token. Every plan sees `opened`, `first_opened_at`, open `comments` and the expiry; `unique_viewers`, `last_opened_at` and `opened_by` (named opens) are for plans with view metrics and are null otherwise, with `metrics_locked: true`. `summary` is one sentence built only from those fields, safe to say to the owner as it stands. A single early open is often the owner checking their own link. To be called instead of polling, an account can register webhooks (POST /webhooks).

## Response `200`

OK

- object
  - `id` string
  - `url` string
  - `state` 'live' | 'expired' | 'removed' | 'burned' | 'disabled'
  - `opened` boolean
  - `first_opened_at` string, nullable: ISO 8601.
  - `unique_viewers` integer, nullable
  - `last_opened_at` string, nullable
  - `opened_by` object[], nullable
    - `name` string
    - `first_opened_at` string, nullable
  - `ai_reads` object, nullable: A reader's own assistant (ChatGPT, Claude, Perplexity, Meta AI, Le Chat) that read the page, or that a passcode or email gate stopped, in the last 30 days. Null until one has. The assistant and time of a read are null without view metrics. Not counted in unique_viewers.
    - `read` boolean
    - `last_read_at` string, nullable: ISO 8601.
    - `last_read_with` string, nullable
    - `stopped_at` string, nullable: ISO 8601.
    - `stopped_with` string, nullable
    - `stopped_by` 'passcode' | 'email' | 'null', nullable
  - `comments` object
    - `open` integer
    - `total` integer
  - `expires_at` integer, nullable
  - `expires_at_iso` string, nullable
  - `metrics_locked` boolean
  - `summary` string
  - `keep_url` string: Claim-token reads only: the link that keeps the page, for the owner alone.
  - `next` string

## Other responses

- `401`: Missing or invalid credentials.
- `403`: `invalid_claim_token`: wrong token, a page that has since been claimed, or no such page (indistinguishable on purpose).
- `404`: Resource not found.

---

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