---
title: "List History"
method: GET
path: "/api/v1/funds/rules/{rule_id}/history"
tags: ["Fund Rules"]
---

# List History

`GET /api/v1/funds/rules/{rule_id}/history`

List the change history for one rule, newest first. Admin-tier per the
 object-history convention. A deleted rule keeps its history: the delete is
 the last entry, and the one before it is the rule as it last stood.

## Path parameters

- `rule_id` string, required — The ruleId field.

## Query parameters

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

## Response `200`

Successful response

- C1ApiFundsV1FundRuleServiceListHistoryResponse — The FundRuleServiceListHistoryResponse message.
  - `list` C1ApiFundsV1FundRuleHistoryEntry[], 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` C1ApiFundsV1FundRule — FundRule is one group grant as the API renders it.
      - `createdAt` string, date-time, nullable
      - `displayName` string — Admin-facing label, so a rule list reads as policy rather than as ids. Bounded on the message rather than only on Create: Update carries a whole FundRule, and this is the column the mirror's full-text and btree indexes are built on.
      - `grant` 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.
      - `groupRef` C1ApiAppV1AppEntitlementRef — The AppEntitlementRef message.
        - `appId` string — The appId field.
        - `id` string — The id field.
      - `reason` string — Why this cohort is funded. Subject-visible where a grant is explained.
      - `ruleId` string — The ruleId field.
      - `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/rules/:rule_id/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)
