---
updatedAt: 2026-08-31T03:40:46.000Z
agentTools:
  projectIndex: https://readme.cipherowl.ai/llms.txt
---

# Update a pool

Updates a pool's mutable properties: name and open-case risk levels.

**Mutable fields (both optional — omitting a field leaves it unchanged):**
- **name**: must be non-empty and unique within your organization.
- **open_case_risk_levels**: replaces the current set entirely. Every entry must name a level mapped by one of the pool's risk configs. An empty levels list clears the set.

**Semantics:** Changing open_case_risk_levels is forward-looking only. It never retro-opens cases for members already at an in-set level; the case gate fires on history rows entering the set (SCAN transition-in or ENROLL seed) after the change.

**Immutable:** Config-to-level bindings (risk_configs) cannot be changed after creation.

**Authorization:** Pool must belong to the requesting user's organization.

# OpenAPI definition

```json
{
  "openapi": "3.0.3",
  "info": {
    "title": "API ENDPOINTS",
    "description": "CipherOwl blockchain compliance and risk assessment APIs.",
    "version": "1.0"
  },
  "servers": [
    {
      "url": "https://svc.cipherowl.ai"
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "Continuous Monitoring",
      "description": "Monitor pools of blockchain addresses for risk changes. Create address pools, manage their membership, re-baseline accepted risk, and consume the pool's time-ordered feed of risk-change events (or one address's history). Members are identified by chain (e.g. `evm`) and address."
    }
  ],
  "paths": {
    "/api/monitoring/v1/pools/{poolId}": {
      "patch": {
        "summary": "Update a pool",
        "description": "Updates a pool's mutable properties: name and open-case risk levels.\n\n**Mutable fields (both optional — omitting a field leaves it unchanged):**\n- **name**: must be non-empty and unique within your organization.\n- **open_case_risk_levels**: replaces the current set entirely. Every entry must name a level mapped by one of the pool's risk configs. An empty levels list clears the set.\n\n**Semantics:** Changing open_case_risk_levels is forward-looking only. It never retro-opens cases for members already at an in-set level; the case gate fires on history rows entering the set (SCAN transition-in or ENROLL seed) after the change.\n\n**Immutable:** Config-to-level bindings (risk_configs) cannot be changed after creation.\n\n**Authorization:** Pool must belong to the requesting user's organization.",
        "operationId": "MonitoringService_UpdatePool",
        "responses": {
          "200": {
            "description": "A successful response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1UpdatePoolResponse"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "poolId",
            "description": "Pool id, as returned by CreatePool/ListPools (a UUID). At most 64 bytes.",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Continuous Monitoring"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonitoringServiceUpdatePoolBody"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "OAuth 2.0 access token obtained from /oauth/token using client credentials."
      }
    },
    "schemas": {
      "MonitoringServiceUpdatePoolBody": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "New pool name. Must contain non-whitespace characters and be unique\nwithin the organization; at most 256 bytes. Omit to leave the current\nname unchanged."
          },
          "openCaseRiskLevels": {
            "allOf": [
              {
                "$ref": "#/components/schemas/v1UpdateOpenCaseLevels"
              }
            ],
            "description": "Replacement open-case risk levels. Replaces the current set entirely.\nOmit to leave the current set unchanged."
          }
        }
      },
      "v1AddressPool": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "organization": {
            "type": "string"
          },
          "createdBy": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "riskConfigs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/v1RiskConfigBinding"
            },
            "description": "Config-to-level bindings, highest level first."
          },
          "openCaseRiskLevels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/v1RiskLevel"
            },
            "description": "Mapped levels at which a clean-to-risky flip opens a case."
          }
        }
      },
      "v1RiskConfigBinding": {
        "type": "object",
        "properties": {
          "riskConfig": {
            "type": "string",
            "description": "Risk config name. At most 256 bytes."
          },
          "riskLevel": {
            "$ref": "#/components/schemas/v1RiskLevel"
          }
        },
        "description": "One risk config bound to one risk level on a pool."
      },
      "v1RiskLevel": {
        "type": "string",
        "enum": [
          "RISK_LEVEL_UNSPECIFIED",
          "SEVERE",
          "HIGH",
          "MEDIUM",
          "LOW"
        ],
        "default": "RISK_LEVEL_UNSPECIFIED",
        "description": "Ordered risk levels: SEVERE > HIGH > MEDIUM > LOW. LOW is the \"no risk\nfound\" floor — it can never be bound to a risk config and never appears in\nopen_case_risk_levels."
      },
      "v1UpdateOpenCaseLevels": {
        "type": "object",
        "properties": {
          "levels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/v1RiskLevel"
            },
            "description": "Every entry must be one of the levels mapped by the pool's risk configs.\nAn empty list clears the set (no level opens a case). At most 16 entries."
          }
        },
        "description": "Wrapper for the repeated open_case_risk_levels field in UpdatePoolRequest.\nProto3 cannot distinguish an absent repeated field from an empty one on the\nwire — both serialize identically. A wrapper message provides presence\nsemantics: present with an empty levels list means \"clear the set\" (no\nlevel opens a case); absent (the field itself omitted) means \"leave the\ncurrent set unchanged\". This is an intentional asymmetry with the response's\ndirect repeated RiskLevel array, where presence/absence carries no such\ndistinction."
      },
      "v1UpdatePoolResponse": {
        "type": "object",
        "properties": {
          "pool": {
            "$ref": "#/components/schemas/v1AddressPool"
          }
        }
      }
    }
  }
}
```