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

# Re-baseline addresses in a pool

Moves the risk baseline (initial_risk_level) for a batch of addresses to a caller-supplied risk level, without re-screening.

**Semantics:**
- Each entry carries a risk_level (SEVERE, HIGH, MEDIUM, or LOW) that becomes the member's new baseline.
- No re-screen is performed; the member's latest effective risk level is untouched — this API only moves the baseline.
- A REBASELINE history row records old-to-new baseline and the actor.
- Batch addresses only; at most 1000 per request.
- Per-address outcomes: APPLIED (baseline moved), NO_OP (baseline already at the target), NOT_FOUND (address not a live member of the pool).
- Idempotent: re-running the same request is a no-op.

# 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}/addresses:rebaseline": {
      "post": {
        "summary": "Re-baseline addresses in a pool",
        "description": "Moves the risk baseline (initial_risk_level) for a batch of addresses to a caller-supplied risk level, without re-screening.\n\n**Semantics:**\n- Each entry carries a risk_level (SEVERE, HIGH, MEDIUM, or LOW) that becomes the member's new baseline.\n- No re-screen is performed; the member's latest effective risk level is untouched — this API only moves the baseline.\n- A REBASELINE history row records old-to-new baseline and the actor.\n- Batch addresses only; at most 1000 per request.\n- Per-address outcomes: APPLIED (baseline moved), NO_OP (baseline already at the target), NOT_FOUND (address not a live member of the pool).\n- Idempotent: re-running the same request is a no-op.",
        "operationId": "MonitoringService_RebaselineAddresses",
        "responses": {
          "200": {
            "description": "A successful response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/v1RebaselineAddressesResponse"
                }
              }
            }
          }
        },
        "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/MonitoringServiceRebaselineAddressesBody"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "OAuth 2.0 access token obtained from /oauth/token using client credentials."
      }
    },
    "schemas": {
      "MonitoringServiceRebaselineAddressesBody": {
        "type": "object",
        "properties": {
          "addresses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/v1RebaselineEntry"
            },
            "description": "At most 1000 entries. Each must carry a target risk_level."
          }
        }
      },
      "v1AddressEntry": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string",
            "description": "Chain of the address, for example evm, bitcoin, tron, solana, xrp or\nlitecoin (the rejection message lists the full set). Risk is evaluated\nper chain, so a member is identified by chain + address. A canonicalized\nentry is echoed as its canonical chain, including one screening later\nmarks INVALID; an entry that could not be canonicalized is echoed exactly\nas submitted. A chain outside the supported set is rejected: AddAddresses\nfails the whole request with InvalidArgument, RemoveAddresses reports the\nentry as not removed. At most 128 bytes."
          },
          "address": {
            "type": "string",
            "description": "At most 1024 bytes as submitted; the canonical (stored) form is capped\nat 320 bytes after normalization."
          }
        }
      },
      "v1RebaselineAddressesResponse": {
        "type": "object",
        "properties": {
          "rebaselinedCount": {
            "type": "integer",
            "format": "int32",
            "description": "Number of baselines moved by this call."
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/v1RebaselineResult"
            },
            "description": "Per-address outcome, in request order."
          }
        }
      },
      "v1RebaselineEntry": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string",
            "description": "Chain (same canonicalization as AddAddresses / RemoveAddresses).\nAt most 128 bytes."
          },
          "address": {
            "type": "string",
            "description": "At most 1024 bytes as submitted."
          },
          "riskLevel": {
            "allOf": [
              {
                "$ref": "#/components/schemas/v1RiskLevel"
              }
            ],
            "description": "Required: the target baseline level for this address. Any valid\nRiskLevel is accepted (SEVERE, HIGH, MEDIUM, LOW); there is no\nconstraint against the pool's bound levels — the caller directly\ndeclares the baseline they want."
          }
        }
      },
      "v1RebaselineOutcome": {
        "type": "string",
        "enum": [
          "REBASELINE_OUTCOME_UNSPECIFIED",
          "APPLIED",
          "NOT_FOUND",
          "NO_OP"
        ],
        "default": "REBASELINE_OUTCOME_UNSPECIFIED",
        "description": "Per-address rebaseline outcome.\n\n - APPLIED: The baseline was moved.\n - NOT_FOUND: The address is not a live member of the pool.\n - NO_OP: The baseline was already at the target level."
      },
      "v1RebaselineResult": {
        "type": "object",
        "properties": {
          "address": {
            "allOf": [
              {
                "$ref": "#/components/schemas/v1AddressEntry"
              }
            ],
            "description": "The canonicalized entry; echoed as submitted when canonicalization failed."
          },
          "outcome": {
            "$ref": "#/components/schemas/v1RebaselineOutcome"
          },
          "newBaseline": {
            "allOf": [
              {
                "$ref": "#/components/schemas/v1RiskAssessment"
              }
            ],
            "description": "The baseline after this operation: level only (baselines carry no\nattributed config). Populated for APPLIED and NO_OP; absent for\nNOT_FOUND."
          }
        }
      },
      "v1RiskAssessment": {
        "type": "object",
        "properties": {
          "riskFound": {
            "type": "boolean",
            "description": "Convenience bool derived from risk_level: true iff risk_level != LOW."
          },
          "riskConfig": {
            "type": "string",
            "description": "The attributed risk config - normally the highest-level config that\nfound risk; on a scan record of a risky-to-LOW change, the previously\nrisky config. Empty for baselines (they record a level, not a config)\nand for members whose latest level is LOW."
          },
          "riskLevel": {
            "allOf": [
              {
                "$ref": "#/components/schemas/v1RiskLevel"
              }
            ],
            "description": "The effective risk level: the highest level among the pool's configs\nthat found risk; LOW means no risk found."
          }
        }
      },
      "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."
      }
    }
  }
}
```