---
title: "Whole retained campaign proof as safe JSON. Requires trail:read and the pilot gate; free."
method: GET
path: "/v1/campaigns/{id}/proof"
tags: ["Guard"]
---

# Whole retained campaign proof as safe JSON. Requires trail:read and the pilot gate; free.

`GET /v1/campaigns/{id}/proof`

## Request

- Base URL: `https://api.layrcake.dev`
- URL: `https://api.layrcake.dev/v1/campaigns/{id}/proof`
- Auth: HTTP bearer

One snapshot; at most 10,000 events, 1,000 approvals, 5,000 decisions, 10 MiB and five seconds. No partial downloads. Identity/access changes require regeneration. Private no-store attachment. CSV cells are quoted after prefixing an apostrophe to formula-leading text or leading tab/CR/LF; compare parsed cells after that transform, retaining ISO timestamps. Proof omits recipient identities and content; supporting settlement events remain separate from directly campaign-filtered events.

## Path parameters

- `id` string, uuid, required

## Response `200`

Complete buffered attachment

- object
  - `schema_version` 1, required
  - `workspace_id` string, uuid, required
  - `campaign_id` string, uuid, required
  - `workspace_name` string, required
  - `campaign_title` string, required
  - `generated_at` string, required
  - `snapshot_at` string, required
  - `scope` 'whole_retained_campaign_history', required
  - `completeness` string, required
  - `approvals` object[], required
    - `approval_id` string, uuid, required
    - `command_id` string, uuid, nullable, required
    - `chain_id` string, uuid, nullable, required
    - `command_version` integer, nullable, required
    - `instance_number` integer, nullable, required
    - `command_hash` string, nullable, required
    - `content_digest` string, nullable, required
    - `state` 'draft' | 'pending_approval' | 'held' | 'approved' | 'queued' | 'executing' | 'declined' | 'expired' | 'superseded' | 'cancelled' | 'failed' | 'completed' | 'execution_failed', nullable, required
    - `campaign_id` string, uuid, nullable, required
    - `reply_id` string, uuid, nullable, required
    - `superseded_by_id` string, uuid, nullable, required
    - `ledger` object, nullable, required
      - `found` integer, required
      - `left_out` object[], required
        - `category` 'opted_out' | 'do_not_contact' | 'invalid' | 'platform_blocked' | 'contacted_recently' | 'capped' | 'other' | 'said_no_since_drafted', required
        - `count` integer, required
      - `included` integer, required
    - `decisions` object[], required
      - `id` string, uuid, required
      - `revision` integer, required
      - `decision` 'approve' | 'hold' | 'decline' | 'undo' | 'supersede' | 'cancel' | 'expire' | 'request_change' | 'revise' | 'reply_myself', required
      - `command_hash` string, required
      - `actor` object, required
        - `kind` 'person' | 'key' | 'system', required
        - `ref` string, uuid, nullable, required
        - `label` string, required
        - `label_basis` 'current_retained_label', required
      - `channel` string, nullable, required
      - `for_client` boolean, required
      - `reverses_decision_id` string, uuid, nullable, required
      - `decided_at` string, required
    - `approving_decision_id` string, uuid, nullable, required
    - `operation_id` string, uuid, nullable, required
    - `request_id` string, uuid, nullable, required
    - `approved_first_send_at` string, nullable, required
    - `first_send_at` string, nullable, required
    - `execution` 'not_yet_run' | 'not_confirmed' | 'recorded_success' | 'recorded_failure', required
    - `settlement_event_ids` string[], required
    - `settlement_events` object[], required
      - `id` string, uuid, required
      - `kind` 'launched' | 'launch_failed' | 'reply_sent' | 'reply_failed', required
      - `observed_at` string, required
      - `campaign_id` string, uuid, nullable, required
      - `reply_id` string, uuid, nullable, required
      - `request_id` string, uuid, nullable, required
      - `operation_id` string, uuid, nullable, required
    - `coverage` object, required
      - `status` 'recorded' | 'partial' | 'unavailable', required
      - `reasons` string[], required
  - `events` object[], required
    - `id` string, uuid, required
    - `kind` 'verify_verdict' | 'admitted' | 'removed' | 'capped' | 'provider_correlated' | 'queued' | 'launch_requested' | 'launched' | 'launch_failed' | 'approval_requested' | 'approved' | 'declined' | 'consumed' | 'expired' | 'reply' | 'bounce' | 'stop' | 'complaint' | 'pause_requested' | 'paused' | 'resume_requested' | 'resumed' | 'spend_threshold_crossed' | 'dnc_added' | 'dnc_loosened' | 'dnc_loosen_cancelled' | 'reply_sent' | 'reply_failed' | 'approval_superseded' | 'completed' | 'approval_held' | 'approval_undone' | 'approval_cancelled' | 'approval_failed' | 'approval_change_requested' | 'approval_revised' | 'approval_reply_myself' | 'tool_action' | 'lead_status', required
    - `observed_at` string, required
    - `record` object, required
      - `actor` object, required
        - `kind` 'person' | 'key' | 'system', required
        - `ref` string, uuid, nullable, required
        - `label` string, required
        - `label_basis` 'current_retained_label', required
      - `approval_id` string, uuid, nullable, required
      - `decision_id` string, uuid, nullable, required
      - `decision_revision` integer, nullable, required
      - `stage` string, required
      - `coverage` object, required
        - `status` 'recorded' | 'partial' | 'unavailable', required
        - `reasons` string[], required
  - `limits` string[], required

## Other responses

- `400`: Invalid filters or export bound/deadline exceeded. Identity changed: HTTP 400 invalid_request; Record identity changed; regenerate the export. Discarded exports have no settled read audit.
- `401`: Key revoked or expired
- `403`: Missing trail:read or access changed
- `404`: Pilot disabled or campaign not in this workspace

---

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