---
title: "One brand, with its pipeline health"
method: GET
path: "/brands/{brandId}"
tags: ["brands"]
---

# One brand, with its pipeline health

`GET /brands/{brandId}`

## Request

- Base URL: `https://shruwd.io/api/v1`
- URL: `https://shruwd.io/api/v1/brands/{brandId}`
- Auth: HTTP bearer

Counts, the engines the plan measures, and the health block: last
successful cycle, next scheduled cycle, run success rate, log-ingest
continuity, connection states. Read this before treating a flat metric
as a signal.

## Response `200`

The brand.

- BrandDetail
  - `brandId` string, required
  - `role` 'viewer' | 'editor' | 'admin' | 'owner', required: The caller's role on this brand: `owner` for the workspace's owner, else the role they were given on it. Reads need `viewer`, writes `editor`.
  - `slug` string, required: The URL handle: the dashboard is at /brands/{slug}. From the name at creation; stable across renames; accepted wherever `{brandId}` is.
  - `name` string, required
  - `domain` string, required: Registrable domain, lowercase.
  - `timezone` string, required: IANA zone; day boundaries for cycles and rollups.
  - `createdAt` string, date-time, required
  - `activePrompts` integer, required
  - `competitors` integer, required
  - `stats` BrandStats
    - `openFindings` integer, required: Open and acknowledged findings, suppressed ones excluded.
    - `lastCycle` object, nullable, required
      - `cycleId` string, required
      - `kind` string, required
      - `state` string, required
      - `completedAt` string, date-time, nullable, required
    - `nextCycle` object, nullable, required
      - `cycleId` string, required
      - `kind` string, required
      - `scheduledFor` string, date-time, required
    - `nextAnswersAt` string, date-time, nullable, required: While a cycle runs, when the brand's next answer is expected on any engine (as `nextAnswers` in the health block); null when no run is waiting. A cycle's repetitions are hours apart, so `nextCycle` alone reads as if nothing more is coming this week.
    - `mentionRate` object, required: Self mention rate over the last 30 days, keyed by entitled engine.
    - `trend` object, required: Daily self mention rate for the primary engine over the last 56 days, rollup days only.
      - `engine` 'google_aio' | 'google_ai_mode' | 'chatgpt', required: `google_aio` — Google AI Overviews. `google_ai_mode` — Google AI Mode, tracked since 2026-10-15. `chatgpt` — ChatGPT.
      - `points` object[], required
        - `day` string, date, required
        - `rate` number, nullable, required: Null when the day's n is below ten. A gap, not a zero.
        - `n` integer, required
  - `engines` Engine[], required: The engines the plan measures for this brand.
  - `health` BrandHealth, required
    - `lastSuccessfulCycle` CycleHealth, required
      - `cycleId` string, required
      - `state` string, required
      - `kind` 'scheduled' | 'recheck' | 'manual', required
      - `at` string, date-time, required: Completion time for a finished cycle, else its due time.
      - `plannedRuns` integer, required
      - `completedRuns` integer, required
      - `failedRuns` integer, required
    - `nextScheduledCycle` CycleHealth, required
      - `cycleId` string, required
      - `state` string, required
      - `kind` 'scheduled' | 'recheck' | 'manual', required
      - `at` string, date-time, required: Completion time for a finished cycle, else its due time.
      - `plannedRuns` integer, required
      - `completedRuns` integer, required
      - `failedRuns` integer, required
    - `runningCycle` CycleHealth, required
      - `cycleId` string, required
      - `state` string, required
      - `kind` 'scheduled' | 'recheck' | 'manual', required
      - `at` string, date-time, required: Completion time for a finished cycle, else its due time.
      - `plannedRuns` integer, required
      - `completedRuns` integer, required
      - `failedRuns` integer, required
    - `nextAnswers` object[], required: One entry per engine with a run waiting or out: when its next answer is expected, the first 15-minute sweep at or after the earliest such run is due. In the past while one is due or out now. A cycle's repetitions are spread over about a day.
      - `engine` 'google_aio' | 'google_ai_mode' | 'chatgpt', required: `google_aio` — Google AI Overviews. `google_ai_mode` — Google AI Mode, tracked since 2026-10-15. `chatgpt` — ChatGPT.
      - `expectedAt` string, date-time, required
    - `runSuccessRate` object, required
      - `succeeded` integer, required
      - `failed` integer, required
      - `total` integer, required
      - `rate` number, nullable, required: Null when nothing ran — not 0.
      - `windowDays` integer, required
    - `ingest` object, required
      - `everIngested` boolean, required
      - `lastDay` string, date, nullable, required
      - `daysSince` integer, nullable, required
      - `daysWithDataLast30` integer, required
      - `linesThisMonth` integer, required: Log lines delivered this calendar month across the workspace. Compare with `entitlements.crawlerLinesPerMonth`: once used up, further lines are dropped at ingest until next month and ingest days stop being recorded.
    - `connections` ConnectionHealth[], required
      - `kind` string, required
      - `status` 'active' | 'needs_reauth' | 'error' | 'revoked', required
      - `externalRef` string, nullable, required
      - `lastSyncAt` string, date-time, nullable, required
      - `lastError` string, nullable, required
      - `hoursSinceSync` number, nullable, required

## Other responses

- `404`: `not_found`: no such resource in this workspace.
- `default`: Every failure has this body.

---

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