---
title: "Get Activity"
method: GET
path: "/cygnal/activity/{activity_id}"
---

# Get Activity

`GET /cygnal/activity/{activity_id}`

## Request

- Base URL: `https://api.grayswan.ai`
- URL: `https://api.grayswan.ai/cygnal/activity/{activity_id}`
- Auth: one of:
  - HTTP bearer
  - API key in header `x-grayswan-api-key`
  - API key in header `grayswan-api-key`
  - API key in header `x-gs-api-key`
  - API key in header `gs-api-key`
  - API key in query parameter `gs_api_key`
- TypeScript: <https://skmtc.dev/grayswan/apis/gray-swan-ai-api/docs/cygnal/activity/:activity_id/get.ts> (a function with typed inputs; its response is checked against the schema)

Fetch a full monitor result and its latest automatic second opinion.

Authenticate with the same Gray Swan key and headers as POST /cygnal/monitor.
Requires the key owner's current activity-view permission and agent/project
access. No provider credential or admin role is required. The top-level monitor
fields describe the original judgment; latest_second_opinion.response holds
the full second-opinion result when available. The compact review summary is
visible with activity-view access; the nested full response additionally
requires ground-truth-view permission on the activity's project.

Malformed, missing, expired and other-organization IDs return the same 404.
Deferred judgments are persisted after completion, so callers should retry
fresh IDs for a bounded window. A running review can remain running if its
worker stops; stop polling after a few minutes.

## Path parameters

- `activity_id` string, required

## Response `200`

Successful Response

- ActivityLookupResponse: The original full monitor response with retained activity metadata.
  - `violation` number
  - `observe_violation` number, nullable
  - `violated_rules` integer[]
  - `violated_rule_descriptions` RuleDescription[]
    - `rule` integer
    - `name` string
    - `description` string
  - `ignored_inputs` IgnoredInput[]
    - `type` 'media' | 'transcript', required
    - `reason` 'text_moderation_only' | 'unsupported_transcript_shape', required
    - `description` string, required
  - `ipi` boolean
  - `mutation` boolean
  - `scanner_output` object, nullable
  - `reasoning` string, nullable
  - `activity_id` string, required
  - `block_message` string, nullable
  - `applied_policies` AppliedPolicy[], nullable
    - `id` string, required
    - `name` string, required
    - `version_id` string
  - `error` boolean
  - `error_message` string, nullable
  - `judgment_deferred` false
  - `timestamp` string, date-time, required
  - `original_finding` 'safe' | 'attempt' | 'violation' | 'skipped' | 'error', nullable
  - `latest_second_opinion` LatestSecondOpinionResponse, required: Compact review state with an optional authorized full monitor response.
    - `run_id` string, nullable
    - `status` 'not_sampled' | 'running' | 'completed' | 'failed' | 'unavailable'
    - `finding` 'safe' | 'attempt' | 'violation', nullable
    - `completed_at` string, date-time, nullable
    - `response` ActivityMonitorResponse: The monitor wire contract without internal analysis or token fields.
      - `violation` number
      - `observe_violation` number, nullable
      - `violated_rules` integer[]
      - `violated_rule_descriptions` RuleDescription[]
        - `rule` integer
        - `name` string
        - `description` string
      - `ignored_inputs` IgnoredInput[]
        - `type` 'media' | 'transcript', required
        - `reason` 'text_moderation_only' | 'unsupported_transcript_shape', required
        - `description` string, required
      - `ipi` boolean
      - `mutation` boolean
      - `scanner_output` object, nullable
      - `reasoning` string, nullable
      - `activity_id` string, nullable
      - `block_message` string, nullable
      - `applied_policies` AppliedPolicy[], nullable
        - `id` string, required
        - `name` string, required
        - `version_id` string
      - `error` boolean
      - `error_message` string, nullable
      - `judgment_deferred` false

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `422`: Validation Error
- `500`: Internal Server Error

## Changes

- **2026-10-22** `ed4b27064dfa`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/grayswan/apis/gray-swan-ai-api/changes/cygnal/activity/:activity_id/get.md)

---

[API](https://skmtc.dev/grayswan/apis/gray-swan-ai-api.md) - [All operations](https://skmtc.dev/grayswan/apis/gray-swan-ai-api/llms.txt) - [OpenAPI document](https://skmtc.dev/grayswan/apis/gray-swan-ai-api/revisions/ed4b27064dfa?raw)
