---
title: "Get Seo Today"
method: GET
path: "/seo/today"
tags: ["SEO"]
---

# Get Seo Today

`GET /seo/today`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/seo/today`
- Auth: HTTP bearer

SPENDS NOTHING. Today in Signals > SEO: health, KPIs, what changed, the approval queue and open alerts.

Every modelled number carries `confidence` (`measured`, `estimated` or `partial`). Sources that are not
connected degrade to a card saying so; `sources` lists which answered.

## Query parameters

- `domain` string, nullable: A tracked domain. Omit for the primary one.

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Response `200`

Successful Response

- ApiResponseSeoToday
  - `data` SeoToday, required: Today in Signals > SEO: KPIs, the briefing, the approval queue, movers, alerts and the setup checklist.
    - `domain` string, nullable
    - `generated_at` string, required
    - `kpis` SeoTodayKpi[], required
      - `key` string, required
      - `label` string, required
      - `value` number, nullable
      - `delta_pct` number, nullable
      - `confidence` 'measured' | 'estimated' | 'partial'
      - `hint` string, nullable
    - `briefing` SeoTodayCard[], required
      - `id` string, required
      - `category` string, required
      - `severity` 'critical' | 'high' | 'medium' | 'low', required
      - `title` string, required
      - `detail` string, required
      - `stake` string, nullable
      - `confidence` 'measured' | 'estimated' | 'partial'
      - `action` SeoTodayAction, required
        - `label` string, required
        - `kind` 'goto_tab' | 'settings' | 'approve_fix' | 'link', required
        - `tab` string, nullable
        - `href` string, nullable
        - `fix_id` string, nullable
    - `approval_queue` SeoApprovalQueue, required
      - `count` integer, required
      - `items` SeoApprovalItem[], required
        - `fix_id` string, required
        - `title` string, required
        - `category` string, required
        - `severity` string, required
        - `target_url` string, nullable
        - `delivery` string, required
        - `impact` object, nullable
        - `confidence` 'measured' | 'estimated' | 'partial'
    - `movers` SeoMover[], required
      - `kind` 'rank_up' | 'rank_down' | 'gsc_drop' | 'gsc_gain' | 'low_ctr', required
      - `title` string, required
      - `detail` string, required
      - `delta` number, nullable
      - `from_value` number, nullable
      - `to_value` number, nullable
      - `url` string, nullable
      - `confidence` 'measured' | 'estimated' | 'partial'
    - `alerts` SeoTodayAlert[], required
      - `id` string, required
      - `kind` string, required
      - `severity` 'critical' | 'high' | 'medium' | 'low', required
      - `title` string, required
      - `body` string, required
      - `fired_at` string, required
      - `payload` object
      - `action` SeoTodayAction
        - `label` string, required
        - `kind` 'goto_tab' | 'settings' | 'approve_fix' | 'link', required
        - `tab` string, nullable
        - `href` string, nullable
        - `fix_id` string, nullable
    - `end_of_day` SeoEndOfDay, required
      - `win` string, required
      - `risk` string, required
      - `ask` string, required
      - `work_channel_id` string, nullable
    - `setup` SeoSetupChecklist, required
      - `items` SeoSetupItem[], required
        - `key` 'gsc' | 'domain' | 'competitors' | 'prompts' | 'fix_delivery', required
        - `label` string, required
        - `done` boolean, required
        - `hint` string, required
        - `action` SeoTodayAction, required
          - `label` string, required
          - `kind` 'goto_tab' | 'settings' | 'approve_fix' | 'link', required
          - `tab` string, nullable
          - `href` string, nullable
          - `fix_id` string, nullable
      - `done_count` integer, required
      - `total` integer, required
    - `health_score` integer, nullable
    - `sources` object
  - `pagination` PaginationMeta
    - `page` integer, required: Current page number (1-indexed)
    - `limit` integer, required: Items per page
    - `total` integer, required: Total number of items
    - `has_next` boolean, required: Whether there are more pages
    - `next_cursor` string, nullable: Opaque cursor for the next page; null when there are no more items. Pass it back as the `cursor` query param to fetch the following page without computing page numbers.
    - `total_available` integer, nullable: Search endpoints only: how many records really match, when known. Can be larger than `total`, which is capped at the 10,000 results that can be paged. For company search this is a distinct-company estimate. Null when unknown; absent outside search.
    - `total_is_lower_bound` boolean, nullable: Search endpoints only: true when more records match than `total` shows (the result set is larger than the 10,000 results that can be paged). Absent outside search.
    - `notes` string[], nullable: Search endpoints only: plain-language notes about the result, e.g. that more records match than can be paged, or that a reversed `between` range was put in order.

## Other responses

- `422`: Validation Error

---

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