---
title: "Change one signup’s own-plan quota with an append-only audit"
method: POST
path: "/internal/operator/signups/{id}/actions"
---

# Change one signup’s own-plan quota with an append-only audit

`POST /internal/operator/signups/{id}/actions`

## Request

- Base URL: `https://api.eurobase.dev`
- URL: `https://api.eurobase.dev/internal/operator/signups/{id}/actions`
- Auth: none declared

## Path parameters

- `id` string, required

## Request body

- union
  - object
    - `action` 'grant_plan', required
    - `reason` string, required: Must not contain NUL or unpaired UTF-16 surrogates
    - `clientRequestId` string, required
    - `confirmEmail` string, required: Must equal the target email, case-insensitively
    - `planCode` 'starter' | 'pro', required
  - object
    - `action` 'revoke_plan', required
    - `reason` string, required: Must not contain NUL or unpaired UTF-16 surrogates
    - `clientRequestId` string, required
    - `confirmEmail` string, required: Must equal the target email, case-insensitively
  - object
    - `action` 'release_stuck_quota', required
    - `reason` string, required: Must not contain NUL or unpaired UTF-16 surrogates
    - `clientRequestId` string, required
    - `confirmEmail` string, required: Must equal the target email, case-insensitively
  - object
    - `action` 'reset_daily_deployments', required
    - `reason` string, required: Must not contain NUL or unpaired UTF-16 surrogates
    - `clientRequestId` string, required
    - `confirmEmail` string, required: Must equal the target email, case-insensitively

## Response `200`

Committed action or the original result of an identical replay

- SignupQuotaActionResponse
  - `id` string, required
  - `action` 'grant_plan' | 'revoke_plan' | 'release_stuck_quota' | 'reset_daily_deployments', required
  - `userId` string, required
  - `organizationId` string, required
  - `before` SignupQuotaActionSnapshot, required
    - `plan` SignupQuotaPlan
      - `code` string, required
      - `name` string, required
      - `source` 'free' | 'subscription' | 'operator_grant', required
      - `grant` object, nullable, required
        - `id` string, required
        - `createdAt` string, date-time, required
        - `grantedByUserId` string, nullable, required
    - `meters` SignupQuotaMeter[]
      - `metricCode` string, required
      - `actionCode` string, required
      - `label` string, required
      - `unit` string, required
      - `used` string, nullable, required: Decimal amount; null when the tenant usage reader is unavailable
      - `reserved` string, nullable
      - `limit` string, required
      - `resetAt` string, date-time, nullable, required
      - `state` 'ok' | 'blocked' | 'unavailable', required
      - `projectId` string, nullable, required: Set for limits enforced per project
      - `projectName` string, nullable, required
  - `after` SignupQuotaActionSnapshot, required
    - `plan` SignupQuotaPlan
      - `code` string, required
      - `name` string, required
      - `source` 'free' | 'subscription' | 'operator_grant', required
      - `grant` object, nullable, required
        - `id` string, required
        - `createdAt` string, date-time, required
        - `grantedByUserId` string, nullable, required
    - `meters` SignupQuotaMeter[]
      - `metricCode` string, required
      - `actionCode` string, required
      - `label` string, required
      - `unit` string, required
      - `used` string, nullable, required: Decimal amount; null when the tenant usage reader is unavailable
      - `reserved` string, nullable
      - `limit` string, required
      - `resetAt` string, date-time, nullable, required
      - `state` 'ok' | 'blocked' | 'unavailable', required
      - `projectId` string, nullable, required: Set for limits enforced per project
      - `projectName` string, nullable, required
  - `createdAt` string, date-time, required

## Other responses

- `400`: Invalid action, reason, clientRequestId or email confirmation
- `403`: Owner operator required
- `404`: Signup not found
- `409`: Request ID reused with a different target, operator or payload; own plan or active grant missing; plan changed or unavailable
- `429`: Operator action rate limit reached
- `503`: Quota state unavailable; no action committed

---

[API](https://skmtc.dev/eurobase/apis/eurobase-api.md) · [All operations](https://skmtc.dev/eurobase/apis/eurobase-api/llms.txt) · [OpenAPI document](https://skmtc.dev/eurobase/apis/eurobase-api/revisions/5266a299d18a?raw)
