---
title: "Set (fully replace) one plan's limits for every organization on it; a null field means \"the default applies\". An organization's own override still wins; nothing that exists is resized"
method: PUT
path: "/operator/plan-limits/{planId}"
tags: ["Operator"]
---

# Set (fully replace) one plan's limits for every organization on it; a null field means "the default applies". An organization's own override still wins; nothing that exists is resized

`PUT /operator/plan-limits/{planId}`

## Request

- Base URL: `https://hostingsurge.com/api/v1`
- URL: `https://hostingsurge.com/api/v1/operator/plan-limits/{planId}`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__Host-hs_session`

## Path parameters

- `planId` 'free' | 'pro' | 'business', required

## Request body

- object
  - `projects` integer, nullable, required
  - `databases` integer, nullable, required
  - `seats` integer, nullable, required
  - `cpus` number, nullable, required
  - `memoryMb` integer, nullable, required
  - `totalCpus` number, nullable, required
  - `totalMemoryMb` integer, nullable, required
  - `buildMinutes` integer, nullable, required
  - `bandwidthGb` integer, nullable, required
  - `storageGb` integer, nullable, required: persistent volume storage of the whole organization, GB (migration 147)
  - `aiCredits` integer, nullable
  - `deployedSitesMax` integer, nullable
  - `trialDays` integer, nullable
  - `requestsPerMonth` integer, nullable
  - `cpuHoursPerMonth` number, nullable
  - `previewsPerTeam` integer, nullable
  - `previewsPerProject` integer, nullable
  - `agents` integer, nullable
  - `builderSessions` integer, nullable
  - `importsOpen` integer, nullable
  - `buildConcurrency` integer, nullable
  - `buildTimeoutMinutes` integer, nullable
  - `pidsPerContainer` integer, nullable
  - `cpuShares` integer, nullable
  - `oomScoreAdj` integer, nullable
  - `diskGbPerProject` number, nullable
  - `uploadMb` integer, nullable
  - `crashLoopRestartsPerHour` integer, nullable
  - `allowedClasses` string[], nullable: site classes the plan may create, deploy, start, preview and publish; null = the next layer decides
  - `rateLimitProfile` 'off' | 'default' | 'strict' | 'null', nullable
  - `note` string, nullable, required
  - `reason` string, required: required: shown in the audit log verbatim
  - `requestId` string: idempotency key: a retried request with the same id changes nothing and writes no second audit entry

## Response `200`

Saved

- object
  - `status` 'ok', required
  - `replay` boolean, required
  - `overview` object, required
    - `plans` object[], required
      - `planId` 'free' | 'pro' | 'business', required
      - `name` string, required
      - `defaults` object, required: the plan catalog (billing/plans.ts): what applies without any setting
        - `projects` integer, nullable, required
        - `databases` integer, nullable, required
        - `seats` integer, nullable, required
        - `cpus` number, required: per project and per database
        - `memoryMb` integer, required: per project and per database
        - `totalCpus` number, nullable, required: the whole organization: every project and database together
        - `totalMemoryMb` integer, nullable, required
        - `buildMinutes` integer, nullable, required
        - `bandwidthGb` integer, nullable, required
        - `storageGb` integer, nullable, required: persistent volume storage of the whole organization, GB (docs/VOLUMES.md); null = no limit
        - `aiCredits` integer, required
      - `server` object, nullable, required: PLATFORM_DEFAULT_LIMITS keys this server sets (Free only; they sit between the catalog and this page)
        - `projects` integer, nullable
        - `databases` integer, nullable
        - `cpus` number
        - `memoryMb` integer
      - `setting` object, required
        - `projects` integer, nullable, required
        - `databases` integer, nullable, required
        - `seats` integer, nullable, required
        - `cpus` number, nullable, required
        - `memoryMb` integer, nullable, required
        - `totalCpus` number, nullable, required
        - `totalMemoryMb` integer, nullable, required
        - `buildMinutes` integer, nullable, required
        - `bandwidthGb` integer, nullable, required
        - `storageGb` integer, nullable, required
        - `aiCredits` integer, nullable: the plan-level Build Credits allowance (migration 203)
        - `deployedSitesMax` number, nullable
        - `trialDays` number, nullable
        - `requestsPerMonth` number, nullable
        - `cpuHoursPerMonth` number, nullable
        - `previewsPerTeam` number, nullable
        - `previewsPerProject` number, nullable
        - `agents` number, nullable
        - `builderSessions` number, nullable
        - `importsOpen` number, nullable
        - `buildConcurrency` number, nullable
        - `buildTimeoutMinutes` number, nullable
        - `pidsPerContainer` number, nullable
        - `cpuShares` number, nullable
        - `oomScoreAdj` number, nullable
        - `diskGbPerProject` number, nullable
        - `uploadMb` number, nullable
        - `crashLoopRestartsPerHour` number, nullable
        - `allowedClasses` string[], nullable
        - `rateLimitProfile` 'off' | 'default' | 'strict' | 'null', nullable
        - `note` string, nullable, required
        - `updatedBy` string, uuid, nullable, required
        - `updatedByEmail` string, nullable, required
        - `updatedAt` string, nullable, required: ISO-8601 timestamp
      - `effective` object, required: what the plan resolves to, before any organization's own override
        - `projects` integer, nullable, required
        - `databases` integer, nullable, required
        - `seats` integer, nullable, required
        - `cpus` number, required: per project and per database
        - `memoryMb` integer, required: per project and per database
        - `totalCpus` number, nullable, required: the whole organization: every project and database together
        - `totalMemoryMb` integer, nullable, required
        - `buildMinutes` integer, nullable, required
        - `bandwidthGb` integer, nullable, required
        - `storageGb` integer, nullable, required: persistent volume storage of the whole organization, GB (docs/VOLUMES.md); null = no limit
        - `aiCredits` integer, required
      - `sources` object, required
        - `projects` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `databases` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `seats` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `cpus` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `memoryMb` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `totalCpus` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `totalMemoryMb` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `buildMinutes` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `bandwidthGb` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `storageGb` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
        - `aiCredits` 'default' | 'server' | 'plan' | 'override' | 'unlimited', required
      - `policy` object: the plan policy (migration 203): allowed site classes, the site cap, the Free period, usage caps, engine limits
        - `defaults` object, required: the catalog (billing/plans.ts PLAN_POLICY_DEFAULTS)
          - `deployedSitesMax` number, nullable, required
          - `trialDays` number, nullable, required
          - `requestsPerMonth` number, nullable, required
          - `cpuHoursPerMonth` number, nullable, required
          - `previewsPerTeam` number, nullable, required
          - `previewsPerProject` number, nullable, required
          - `agents` number, nullable, required
          - `builderSessions` number, nullable, required
          - `importsOpen` number, nullable, required
          - `buildConcurrency` number, nullable, required
          - `buildTimeoutMinutes` number, nullable, required
          - `pidsPerContainer` number, nullable, required
          - `cpuShares` number, nullable, required
          - `oomScoreAdj` number, nullable, required
          - `diskGbPerProject` number, nullable, required
          - `uploadMb` number, nullable, required
          - `crashLoopRestartsPerHour` number, nullable, required
          - `allowedClasses` string[], nullable, required
          - `rateLimitProfile` 'off' | 'default' | 'strict', required
          - `aiCredits` number, nullable, required
        - `effective` object, required: what the plan resolves to with the setting of this page
          - `deployedSitesMax` number, nullable, required
          - `trialDays` number, nullable, required
          - `requestsPerMonth` number, nullable, required
          - `cpuHoursPerMonth` number, nullable, required
          - `previewsPerTeam` number, nullable, required
          - `previewsPerProject` number, nullable, required
          - `agents` number, nullable, required
          - `builderSessions` number, nullable, required
          - `importsOpen` number, nullable, required
          - `buildConcurrency` number, nullable, required
          - `buildTimeoutMinutes` number, nullable, required
          - `pidsPerContainer` number, nullable, required
          - `cpuShares` number, nullable, required
          - `oomScoreAdj` number, nullable, required
          - `diskGbPerProject` number, nullable, required
          - `uploadMb` number, nullable, required
          - `crashLoopRestartsPerHour` number, nullable, required
          - `allowedClasses` string[], nullable, required
          - `rateLimitProfile` 'off' | 'default' | 'strict', required
          - `aiCredits` number, nullable, required
        - `sources` object, required: why each policy field has its value
    - `freePool` object, required
      - `cpus` number, nullable, required
      - `memoryMb` integer, nullable, required
      - `note` string, nullable, required
      - `updatedBy` string, uuid, nullable, required
      - `updatedByEmail` string, nullable, required
      - `updatedAt` string, nullable, required: ISO-8601 timestamp
    - `allocation` object, required
      - `free` object, required
        - `organizations` integer, required
        - `running` object, required: limits of what runs now, suspended organizations excluded (as on the Server page)
          - `cpus` number, required
          - `memoryMb` integer, required
          - `count` integer, required
        - `all` object, required: limits of every project and database that exists: what the Free pool counts
          - `cpus` number, required
          - `memoryMb` integer, required
          - `count` integer, required
      - `paid` object, required
        - `organizations` integer, required
        - `running` object, required: limits of what runs now, suspended organizations excluded (as on the Server page)
          - `cpus` number, required
          - `memoryMb` integer, required
          - `count` integer, required
        - `all` object, required: limits of every project and database that exists: what the Free pool counts
          - `cpus` number, required
          - `memoryMb` integer, required
          - `count` integer, required
      - `unlimited` object, required: organizations in PLATFORM_UNLIMITED_ORG_IDS: never Free, never in the pool
        - `organizations` integer, required
        - `running` object, required: limits of what runs now, suspended organizations excluded (as on the Server page)
          - `cpus` number, required
          - `memoryMb` integer, required
          - `count` integer, required
        - `all` object, required: limits of every project and database that exists: what the Free pool counts
          - `cpus` number, required
          - `memoryMb` integer, required
          - `count` integer, required
    - `capacity` object, required: the host's CPUs and memory; null without host facts
      - `cpus` number, nullable, required
      - `memoryMb` integer, nullable, required
    - `bounds` object, required
      - `plan` object, required: what each plan setting may hold
      - `policy` object: what each policy field may hold (migration 203)
      - `freePool` object, required
        - `cpus` object, required
          - `min` number, required
          - `max` number, required
          - `step` number, required
        - `memoryMb` object, required
          - `min` number, required
          - `max` number, required
          - `step` number, required
    - `recommendedFreePool` object: the Free pool every brand starts with (migration 153): what "Use the recommended" fills in
      - `cpus` number, required
      - `memoryMb` integer, required
    - `staticSiteSize` object: the size every new static site gets on Free, and what "right-size static sites" brings older ones down to (migration 153)
      - `cpus` number, required
      - `memoryMb` integer, required

## Other responses

- `400`: Invalid request (code invalid_request)
- `403`: An action on an operator-console session older than 5 minutes (code forbidden, details.reauthenticate: sign in again at /admin/login), or an operator removed since the session was resolved
- `404`: Not found (code not_found); also the answer to any request without a live operator-console session (no admin cookie, a dashboard session, an API/MCP key or OAuth token, or a caller who is not a platform operator)
- `429`: Too many requests (code rate_limited); see Retry-After
- `501`: Not available on this server (code not_configured)

---

[API](https://skmtc.dev/hostingsurge/apis/hostingsurge-platform-api.md) · [All operations](https://skmtc.dev/hostingsurge/apis/hostingsurge-platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hostingsurge/apis/hostingsurge-platform-api/revisions/4d08337cdff1?raw)
