---
title: "List History"
method: GET
path: "/api/v1/funds/policy/history"
tags: ["Fund Policy"]
---

# List History

`GET /api/v1/funds/policy/history`

List the change history for the fund policy, newest first. Admin-tier per
 the object-history convention.

## Query parameters

- `page_size` integer — The pageSize field.
- `page_token` string — The pageToken field.

## Response `200`

Successful response

- C1ApiFundsV1FundPolicyServiceListHistoryResponse — The FundPolicyServiceListHistoryResponse message.
  - `list` C1ApiFundsV1FundPolicyHistoryEntry[], nullable — The list field.
    - `metadata` C1ApiHistoryV1HistoryEntryMetadata — HistoryEntryMetadata is the shared metadata envelope embedded on every per-service HistoryEntry. The strongly-typed snapshot lives on the per-service entry message alongside this envelope.
      - `actor` C1ApiHistoryV1HistoryActor — HistoryActor is a typed reference to whoever performed the change. kind mirrors the storage-model ActorKind enum; user_id is set when kind corresponds to a user principal (API / SUPPORT) so the frontend can resolve the user via its own avatar / lookup hooks. Protos reference objects by id; the frontend renders / caches itself. The raw passport fields (token_id / principal_id) intentionally do not leave the server. Non-user actors (workflow, connector, internal) are identified by `kind` alone; correlating IDs (workflow_run_id, etc.) flow through `HistoryAnnotation` instead of being plucked into the actor message.
        - `kind` 'ACTOR_KIND_UNSPECIFIED' | 'ACTOR_KIND_API' | 'ACTOR_KIND_SLACK' | 'ACTOR_KIND_MSTEAMS' | 'ACTOR_KIND_JIRA_CLOUD' | 'ACTOR_KIND_INTERNAL' | 'ACTOR_KIND_SUPPORT' | 'ACTOR_KIND_WORKFLOW' — The kind field.
        - `userId` string — Bare KSUID. Set when kind = ACTOR_KIND_API or ACTOR_KIND_SUPPORT. Empty otherwise. The frontend resolves user_id → display name via the same lookup paths it uses elsewhere (avatars, mentions, ...).
      - `annotations` C1ApiHistoryV1HistoryAnnotation[], nullable — Server-rendered annotations: known keys carry display_label and (for ticket_id, etc.) display_url resolved from tenant config. Cap mirrors the per-object annotation ceiling (16).
        - `displayLabel` string — Server-rendered label, e.g. "Ticket".
        - `displayUrl` string — Resolved from tenant config; "" if none. Frontend applies its own scheme allowlist.
        - `displayValue` string — UI-friendly rendering (truncated / reshaped from raw_value).
        - `key` string — Storage-side key. Bounds: ^[a-z][a-z0-9_.-]{0,63}$.
        - `kind` 'ANNOTATION_KIND_UNSPECIFIED' | 'ANNOTATION_KIND_GENERIC' | 'ANNOTATION_KIND_TICKET' | 'ANNOTATION_KIND_REASON' | 'ANNOTATION_KIND_WORKFLOW' | 'ANNOTATION_KIND_BATCH' | 'ANNOTATION_KIND_CORRELATION' | 'ANNOTATION_KIND_AUTOMATION' — The kind field.
        - `rawValue` string — Raw value as stored in ObjectHistory.annotations; storage-side values are capped at 512 bytes.
      - `changeKind` 'CHANGE_KIND_UNSPECIFIED' | 'CHANGE_KIND_CREATE' | 'CHANGE_KIND_PUT' | 'CHANGE_KIND_HARD_DELETE' — Storage-model enum re-exported here for wire compatibility with the storage row. UNSPECIFIED should never appear on the wire.
      - `createdAt` string, date-time, nullable
      - `id` string — KSUID. Same value as c1.models.history.v1.ObjectHistory.id.
      - `syslogEventId` string — System Log event id — KSUID of the OCSF event recorded for this write. Empty for non-RPC writes (workflows, cron). Customer-facing copy says "System Log event"; the underlying format is OCSF.
      - `traceId` string — OTel trace correlation. Empty when no valid span at write time. 32-hex-char otel trace id or empty.
    - `snapshot` C1ApiFundsV1FundPolicy — FundPolicy is the tenant's fund policy as the API renders it. Every field is server-owned on the way out; requests name the fields they change rather than sending this message back.
      - `createdAt` string, date-time, nullable
      - `currencyCode` string — ISO 4217. Set at Create and immutable thereafter.
      - `defaultLimit` C1ModelsFundsV1SpendLimit — SpendLimit is the three-way behavior fork. Which arms are legal depends on the scope carrying it; pkg/funds enforces that matrix, not the schema, because one SpendControls shape is shared by every scope. This message contains a oneof named kind. Only a single field of the following list may be set at a time: - unlimited - amount - blocked
        - `amount` C1ModelsFundsV1SpendLimitAmount — SpendLimitAmount caps spend at money per resolved period.
          - `money` C1ModelsFundsV1Money — Money is wire-compatible with google.type.Money field-for-field, so the public API converts with a field copy. Declared here rather than imported because protoc-gen-pgdb mirrors a nested message by calling its generated DBReflect, which only exists for messages this repo generates.
            - `currencyCode` string — ISO 4217 currency code. Must equal the tenant's FundPolicy.currency_code.
            - `nanos` integer — Nano-unit remainder, 0 <= nanos < 10^9. Non-negative for the same reason as units, which also keeps the (units, nanos) pair unambiguous.
            - `units` string, int64 — Non-negative — grants, never debts — and bounded so units * 10^9 + nanos always fits int64. Without the ceiling a large value wraps positive and installs a limit nobody granted. The pair check spans two fields, so pkg/funds re-checks it on every conversion.
        - `blocked` C1ModelsFundsV1SpendLimitBlocked — SpendLimitBlocked refuses supply at this scope. Distinct from suspension: blocked is a stated policy posture, suspension is a reversible freeze that preserves the numbers underneath it.
        - `unlimited` C1ModelsFundsV1SpendLimitUnlimited — SpendLimitUnlimited is a tracking limit: full accounting, no admission condition. The maximum element, so an unlimited default makes grant rules no-ops.
      - `orgCeiling` C1ModelsFundsV1SpendControls — SpendControls is the one control shape carried by every authority scope. Per-row resolution, identical everywhere: suspension present -> deny; unexpired extension -> extension.limit; limit present -> limit; otherwise this row states no opinion and resolution falls through. Not a oneof: two transitions need the losing field to survive. Unsuspending restores the limit it froze, and a lapsed extension falls back to its base rather than to the next layer. Pinned by TestControlsCoPresenceSurvivesEveryTransition in pkg/funds.
        - `extension` C1ModelsFundsV1SpendExtension — SpendExtension replaces the row's total with a temporary one until expires_at. It never changes the period, and it never expresses a refusal — a temporary refusal is a SpendSuspension.
          - `expiresAt` string, date-time, nullable
          - `limit` C1ModelsFundsV1SpendLimit — SpendLimit is the three-way behavior fork. Which arms are legal depends on the scope carrying it; pkg/funds enforces that matrix, not the schema, because one SpendControls shape is shared by every scope. This message contains a oneof named kind. Only a single field of the following list may be set at a time: - unlimited - amount - blocked
            - `amount` C1ModelsFundsV1SpendLimitAmount — SpendLimitAmount caps spend at money per resolved period.
              - …
            - `blocked` C1ModelsFundsV1SpendLimitBlocked — SpendLimitBlocked refuses supply at this scope. Distinct from suspension: blocked is a stated policy posture, suspension is a reversible freeze that preserves the numbers underneath it.
            - `unlimited` C1ModelsFundsV1SpendLimitUnlimited — SpendLimitUnlimited is a tracking limit: full accounting, no admission condition. The maximum element, so an unlimited default makes grant rules no-ops.
          - `reason` string — Subject-visible: "why do I have this bump". Mutation rationale rides the history change_reason annotation instead.
        - `limit` C1ModelsFundsV1SpendLimit — SpendLimit is the three-way behavior fork. Which arms are legal depends on the scope carrying it; pkg/funds enforces that matrix, not the schema, because one SpendControls shape is shared by every scope. This message contains a oneof named kind. Only a single field of the following list may be set at a time: - unlimited - amount - blocked
          - `amount` C1ModelsFundsV1SpendLimitAmount — SpendLimitAmount caps spend at money per resolved period.
            - `money` C1ModelsFundsV1Money — Money is wire-compatible with google.type.Money field-for-field, so the public API converts with a field copy. Declared here rather than imported because protoc-gen-pgdb mirrors a nested message by calling its generated DBReflect, which only exists for messages this repo generates.
              - …
          - `blocked` C1ModelsFundsV1SpendLimitBlocked — SpendLimitBlocked refuses supply at this scope. Distinct from suspension: blocked is a stated policy posture, suspension is a reversible freeze that preserves the numbers underneath it.
          - `unlimited` C1ModelsFundsV1SpendLimitUnlimited — SpendLimitUnlimited is a tracking limit: full accounting, no admission condition. The maximum element, so an unlimited default makes grant rules no-ops.
        - `period` 'PERIOD_KIND_UNSPECIFIED' | 'PERIOD_KIND_DAILY' | 'PERIOD_KIND_WEEKLY' | 'PERIOD_KIND_MONTHLY' | 'PERIOD_KIND_QUARTERLY' | 'PERIOD_KIND_YEARLY' — Only valid together with limit: a period without its amount would reinterpret some other layer's number in a cadence that layer never agreed to.
        - `suspension` C1ModelsFundsV1SpendSuspension — SpendSuspension freezes a scope without erasing the limit it must restore on unsuspend, which is why it lives beside the SpendLimit oneof rather than inside it.
          - `reason` string — The reason field.
          - `suspendedAt` string, date-time, nullable
      - `period` 'PERIOD_KIND_UNSPECIFIED' | 'PERIOD_KIND_DAILY' | 'PERIOD_KIND_WEEKLY' | 'PERIOD_KIND_MONTHLY' | 'PERIOD_KIND_QUARTERLY' | 'PERIOD_KIND_YEARLY' — The root period every amount in the tenant is denominated in.
      - `tenantId` string — The tenantId field.
      - `updatedAt` string, date-time, nullable
  - `nextPageToken` string — The nextPageToken field.

## Changes

- **2026-09-01** `f76d07868c0c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/conductorone/apis/c1-api/changes/api/v1/funds/policy/history/get.md)

---

[API](https://skmtc.dev/conductorone/apis/c1-api.md) · [All operations](https://skmtc.dev/conductorone/apis/c1-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/conductorone/c1-api/revisions/f76d07868c0c/schema)
