---
title: "Save business approval rules (Sandbox)"
method: POST
path: "/money/test_approval_rules"
tags: ["money", "approvals", "sandbox", "customer-session"]
---

# Save business approval rules (Sandbox)

`POST /money/test_approval_rules`

## Request

- Base URL: `https://api.stablesea.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stablesea.com/money/test_approval_rules`
- Auth: none declared

Uses your business's isolated Sandbox data with your existing signed-in member permissions. Replaces changed business approval rules and records the signed-in administrator. Unchanged saves retain the current version without notices. Send expected_version_id from GET to reject stale changes with 409. Requires `approval_controls_manage` in enforced mode or `permissions_manage` in legacy mode. Rule writes must be enabled. Send an Idempotency-Key to prevent duplicate revisions and notices on retry; a duplicate returns 409. Read the current rules after an uncertain response.

## Headers

- `Idempotency-Key` string: Optional client idempotency key; a duplicate save with the same key is rejected with 409 without another revision or notice.

## Request body

- MoneyMovementsPutApprovalRulesInput
  - `expected_version_id` string, nullable: Optional current version from GET. Empty means expect no version. Stale returns 409; omission retains compatible serialized replacement.
  - `rules` MoneyMovementsApprovalRuleInput[], nullable, required
    - `also_required_ind_id` string
    - `comparison` 'gt' | 'gte'
    - `flows` MoneyMovementsApprovalFlow[], nullable, required
    - `id` string: Current rule reference; omit min_amount_usd to retain its exact stored threshold.
    - `min_amount_usd` string, nullable: Exact USD threshold. Omit only with a current rule id to retain its server-known amount.
    - `required_approvals` integer, required

## Response `200`

OK

- MoneyMovementsApprovalRulesOutput
  - `current` MoneyMovementsApprovalRuleVersionView
    - `created_by` string
    - `created_ts` string, date-time
    - `id` string
    - `rules` MoneyMovementsApprovalRuleView[], nullable
      - `also_required_ind_id` string
      - `comparison` 'gt' | 'gte', required
      - `flows` MoneyMovementsApprovalFlow[], nullable
      - `id` string
      - `legacy_exclusive` boolean
      - `min_amount_usd` string
      - `required_approvals` integer
  - `eligible_approvers` MoneyMovementsApprovalEligibleMemberView[], nullable: Current eligible approvers, populated only by GET /money/approval_rules. Null on writes; fetch GET after a successful save to refresh the roster.
    - `display_name` string
    - `individual_id` string
    - `selected_eligible` boolean
  - `gateable_flows` MoneyMovementsApprovalFlow[], nullable
  - `max_executable_approvals` integer: No fixed quorum limit within the stored integer range; satisfiability is bounded by the business's currently eligible roster.
  - `named_approver_executable` boolean
  - `release_controls_supported` boolean, required
  - `writes_enabled` boolean

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `409`: Conflict
- `429`: Too Many Requests
- `503`: Service Unavailable
- `default`: Error response.

## Changes

- **2026-10-29** `ea7c02786bba`: 6 info
  - added the new optional request property `expected_version_id`
  - added the new optional request property `rules/items/comparison`
  - added the new optional request property `rules/items/id`
  - the request property `rules/items/min_amount_usd` became nullable
  - …2 more
- **2026-10-29** `e003c8a67b62`: 8 info
  - added the optional property `error/authorization` to the response with the `400` status
  - added the optional property `error/authorization` to the response with the `401` status
  - added the optional property `error/authorization` to the response with the `403` status
  - added the optional property `error/authorization` to the response with the `404` status
  - …4 more
- **2026-10-28** `025b2fda2a84`: 1 info
  - added the required property `release_controls_supported` to the response with the `200` status
- **2026-10-17** `28e463bb4bdc`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/stablesea/apis/stable-sea-backend/changes/money/test_approval_rules/post.md)

---

[API](https://skmtc.dev/stablesea/apis/stable-sea-backend.md) - [All operations](https://skmtc.dev/stablesea/apis/stable-sea-backend/llms.txt) - [OpenAPI document](https://skmtc.dev/stablesea/apis/stable-sea-backend/revisions/772c80d83658?raw)
