---
title: "Create"
method: POST
path: "/api/v1/funds/rules"
tags: ["Fund Rules"]
---

# Create

`POST /api/v1/funds/rules`

Create funds a group. The group is an AppEntitlement, so membership
 resolves through that entitlement's bindings on every acquire rather than
 being captured here. Creating the tenant's first rule is what turns group
 resolution on for that tenant.

## Request body

- C1ApiFundsV1FundRuleServiceCreateRequest — The FundRuleServiceCreateRequest message.
  - `displayName` string — The displayName field.
  - `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 — The reason field.

## Response `200`

Successful response

- C1ApiFundsV1FundRuleServiceCreateResponse — The FundRuleServiceCreateResponse message.
  - `rule` 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

## Changes

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

[Change history](https://skmtc.dev/conductorone/apis/c1-api/changes/api/v1/funds/rules/post.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)
