---
title: "List actions"
method: GET
path: "/agent/workspaces/{workspace}/actions"
tags: ["ActionReadApi"]
---

# List actions

`GET /agent/workspaces/{workspace}/actions`

## Request

- Base URL: `https://plainrouter.com/api/v1`
- URL: `https://plainrouter.com/api/v1/agent/workspaces/{workspace}/actions`
- Auth: HTTP bearer

Read persisted Actions data for the authorized account. Unbound keys require exactly one active account; account_id cannot select among multiple accounts.

## Path parameters

- `workspace` integer, required

## Query parameters

- `status` 'pending' | 'approved_without_execution' | 'rejected' | 'executing' | 'executed_pending_verification' | 'compensating' | 'measuring' | 'verified' | 'failed' | 'execution_uncertain' | 'rolled_back' | 'blocked'
- `account_id` integer
- `cursor` integer
- `limit` integer
- `page` integer

## Response `200`

Authorized Actions resource. Result projections share the 80,000-byte MCP JSON budget; defaults are bounded, next_cursor continues complete rows, and oversized single rows are explicitly refused. Plan creative continuation uses the read endpoint; proposal continuation uses the batch read endpoint.

- ActionListRead
  - `data` ActionReadItem[], required
    - `id` string, required
    - `batch_id` string, required
    - `workspace_id` integer, required
    - `type` 'increase_budget' | 'decrease_budget' | 'pause' | 'resume' | 'replace_creative' | 'shift_spend' | 'rollback' | 'create_campaign' | 'create_ad_set' | 'create_ad' | 'upload_asset' | 'adjust_budget' | 'set_status' | 'duplicate_ad_with_creative' | 'duplicate_adset' | 'duplicate_ad_with_creative_v2', required
    - `target_entity_type` string, required
    - `target_entity_id` string, required
    - `target_entity_name` string, nullable, required
    - `counted_evidence` object, nullable: Frozen proposal-time target figures over completed account-local dates. Purchase values are decimal strings in the account currency; counted values in other currencies are excluded and never converted. Null means figures were not captured. Display only; never an enforcement input.
      - `target` object, required
        - `kind` string, required
        - `id` string, required
      - `captured_at` string, required
      - `window` object, nullable, required
        - `since` string, required
        - `until` string, required
        - `timezone` string, required
        - `days` integer
      - `currency` string, nullable, required
      - `currency_note` string, required
      - `conversion_definition` object
        - `version` string, required
        - `events` string[], required
      - `meta_reported` object, required
        - `inline_link_clicks` integer, nullable, required
        - `purchase_count` integer, nullable, required
        - `purchase_value` string, nullable, required
        - `spend` string, nullable, required
        - `impressions` integer, nullable, required
      - `counted` object, required
        - `arrivals` integer, nullable, required
        - `purchase_count` integer, nullable, required
        - `purchase_value` string, nullable, required
        - `observed_conversions` integer, nullable
      - `coverage` object, required
        - `arrivals` object, nullable, required
          - `since` string, required
          - `until` string, required
          - `timezone` string, required
          - `days` integer
        - `purchases` object, nullable, required
          - `since` string, required
          - `until` string, required
          - `timezone` string, required
          - `days` integer
    - `params` union, required
      - object
      - unknown[]
        - unknown
    - `rationale` string, required
    - `proposer` object
      - `type` 'user' | 'agent' | 'system', required
      - `name` string: PlainRouter for a system proposer; omitted for people and agents.
    - `evidence` union: System evidence cites either the original action and its counted outcome or the rule, revision, run and decision.
      - object
        - `original_action_id` string, required
        - `outcome` object, required: Write-once outcome. Management comparisons use PlainRouter counted arrivals and Inventory spend. Resume compares the target after the change with the rest of the same account over those same days. Pause is not judged. Missing data never yields a verdict. Other action types retain their existing payloads.
          - `status` 'measurable' | 'not_measurable' | 'unavailable'
          - `observed_at` string, date-time
          - `reason_code` string, nullable
          - `reason` string, nullable
          - `baseline` union
            - object
              - …
            - string[]
          - `metrics` union
            - object
              - …
            - string[]
          - `inverse` object
            - `status` 'proposed' | 'inverse_not_proposed', required
            - `batch_id` string
            - `reason_code` string
      - object
        - `rule_id` string, required
        - `revision_id` string, required
        - `run_id` string, required
        - `decision_id` string, required
      - object: System evidence from a completed Test cites its Test, verdict and selected winner member.
        - `test_id` string, required
        - `verdict_id` string, required
        - `winner_member_id` string, required
    - `status` 'pending' | 'approved_without_execution' | 'rejected' | 'executing' | 'executed_pending_verification' | 'compensating' | 'measuring' | 'verified' | 'failed' | 'execution_uncertain' | 'rolled_back' | 'blocked', required
    - `batch_status` 'pending' | 'approved' | 'approved_without_execution' | 'auto_approved' | 'rejected' | 'executing' | 'executed_pending_verification' | 'compensating' | 'measuring' | 'completed' | 'failed' | 'rolled_back' | 'rollback_incomplete' | 'blocked' | 'halted', required
    - `disposition` ActionCurrentDisposition, required
      - `receipt_status` 'pending' | 'attempting' | 'reconciliation_required' | 'committed' | 'executed_pending_verification' | 'measuring' | 'verified' | 'compensating' | 'compensated' | 'compensation_failed' | 'irreversible' | 'failed' | 'reconciliation_exhausted' | 'null', nullable, required
      - `outcome_payload` object, nullable, required: Write-once outcome. Management comparisons use PlainRouter counted arrivals and Inventory spend. Resume compares the target after the change with the rest of the same account over those same days. Pause is not judged. Missing data never yields a verdict. Other action types retain their existing payloads.
        - `status` 'measurable' | 'not_measurable' | 'unavailable'
        - `observed_at` string, date-time
        - `reason_code` string, nullable
        - `reason` string, nullable
        - `baseline` union
          - object
            - `scope` 'target' | 'rest_of_account'
            - `days` string[]: Three whole days in the ad account timezone; excludes the change day.
            - `currency` string, nullable
            - `timezone` string
            - `spend_minor` string, nullable: Decimal spend in ISO currency minor units; null when daily mirror data is missing.
            - `counted_arrivals` integer, nullable: Arrivals counted by PlainRouter through Signals, never provider conversions.
            - `cost_per_counted_arrival_minor` string, nullable: Spend divided by counted arrivals, in ISO currency minor units, displayed to six decimal places.
          - string[]
        - `metrics` union
          - object
            - `scope` 'target' | 'rest_of_account'
            - `days` string[]: Three whole days in the ad account timezone; excludes the change day.
            - `currency` string, nullable
            - `timezone` string
            - `spend_minor` string, nullable: Decimal spend in ISO currency minor units; null when daily mirror data is missing.
            - `counted_arrivals` integer, nullable: Arrivals counted by PlainRouter through Signals, never provider conversions.
            - `cost_per_counted_arrival_minor` string, nullable: Spend divided by counted arrivals, in ISO currency minor units, displayed to six decimal places.
            - `verdict` 'held' | 'lost' | 'not_judged' | 'null', nullable
            - `loss_threshold_percent` string
          - string[]
        - `inverse` object
          - `status` 'proposed' | 'inverse_not_proposed', required
          - `batch_id` string
          - `reason_code` string
      - `outcome_status` 'measurable' | 'not_measurable' | 'unavailable' | 'null', nullable, required
      - `outcome_reason_code` string, nullable, required
      - `outcome_checked_at` string, date-time, nullable, required
      - `compensation_reason_code` string, nullable, required
      - `recovery_disposition` 'no_compensation' | 'restored' | 'unrestored' | 'contradictory' | 'irreversible' | 'uncertain' | 'null', nullable, required
      - `late_restored` boolean, required
    - `policy_decision` 'allow' | 'require_approval' | 'block' | 'null', nullable, required
    - `policy_reasons` string[], required
    - `policy_result` ActionPolicyResult, required
      - `id` string, required
      - `policy_id` string, required
      - `policy_version` integer, required
      - `phase` 'proposal' | 'approval' | 'execution', required
      - `outcome` 'allowed' | 'approval_required' | 'blocked', required
      - `reasons` string[], required
      - `reason_details` string[], nullable, required
      - `requested_minor` integer, nullable, required
      - `evaluated_at` string, date-time, required
    - `policy_results` ActionPolicyResult[], required
      - `id` string, required
      - `policy_id` string, required
      - `policy_version` integer, required
      - `phase` 'proposal' | 'approval' | 'execution', required
      - `outcome` 'allowed' | 'approval_required' | 'blocked', required
      - `reasons` string[], required
      - `reason_details` string[], nullable, required
      - `requested_minor` integer, nullable, required
      - `evaluated_at` string, date-time, required
  - `meta` object, required: Complete projection rows are paged within 80,000 JSON bytes, accounting for both MCP representations. Defaults are bounded. Follow next_cursor with the same scope and filters. One oversized row is explicitly refused; fields are never silently clipped.
    - `current_page` integer, required
    - `last_page` integer, required
    - `per_page` integer, required
    - `total` integer, required
    - `next_cursor` integer, nullable
    - `truncated` boolean
    - `continuation` string

## Other responses

- `401`: Missing, invalid, expired or revoked credentials and inactive account bindings return error and error_description. Insufficient principal permission or lost issuer authority returns error insufficient_scope and error_description. A management key returns message instead.
- `403`: The key lacks the read-actions grant.
- `404`: Workspace, account, or Actions resource not found.
- `422`: Request validation failed.

## Changes

- **2026-10-20** `d071d4f4f05c`: 2 info
  - added the optional property `data/items/counted_evidence/conversion_definition` to the response with the `200` status
  - added the optional property `data/items/counted_evidence/counted/observed_conversions` to the response with the `200` status

[Operation history](https://skmtc.dev/plainrouter/apis/plainrouter-conversion-api/changes/agent/workspaces/:workspace/actions/get.md)

---

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