Skip to content

Rotation Schedule Without Cadence

URI: https://docs.ankatech.co/errors/rotation-schedule-without-cadence
HTTP Status: 422 Unprocessable Content

When you see this

A key's rotation schedule was written with autoRotationEnabled: true, no rotation interval applies to the key, and neither usage option is on. Nothing was stored: the key's schedule is unchanged.

A key's cadence is its own TIME_BASED trigger, else the tenant default, else the deployment default. Enabling automatic rotation needs something to rotate on: one of them carrying an interval, or rotateOnSoftUsageLimit or rotateOnUsageExhaustion set to true in the same request. Otherwise the key would be enabled with nothing that could ever rotate it.

A key enabled with a usage option and no interval is admitted: its state reads NO_CADENCE, it has no nextDueAt, and it rotates only when its usage reaches the limit the option names (Rotation on key usage*).

Response Example

{
  "type": "https://docs.ankatech.co/errors/rotation-schedule-without-cadence",
  "title": "Rotation Schedule Without Cadence",
  "status": 422,
  "detail": "Automatic rotation cannot be enabled: no interval applies to this key and no usage option is on. Send a TIME_BASED trigger for the key, turn on rotateOnSoftUsageLimit or rotateOnUsageExhaustion, or set a tenant or deployment default first.",
  "instance": "/api/v3/admin/tenants/550e8400-e29b-41d4-a716-446655440000/keys/payments-data-key/rotation-schedule",
  "timestamp": 1790000000,
  "extensions": {
    "requestId": "b81e4d27-3c9a-4f50-a6d2-9e7c1b0f3a58"
  }
}

Content-Type: application/problem+json — the response follows RFC 9457 Problem Details.

How to Resolve

  1. Send the key's own cadence in the same request: {"autoRotationEnabled": true, "triggers": [{"type": "TIME_BASED", "interval": "P90D"}]}.
  2. Or set a tenant default (PUT /api/v3/admin/tenants/{tenantId}/policies/rotation-schedule) or a deployment default, then enable the key with "triggers": null to inherit it.
  3. A key sent "triggers": [] has no cadence of its own by choice; send a trigger or null instead.
  4. Or rotate the key on its usage alone: send "rotateOnSoftUsageLimit": true or "rotateOnUsageExhaustion": true with the enablement. Each needs the matching usage limit on the key.

Operations that emit it

Method Endpoint
PUT /api/v3/admin/tenants/{tenantId}/keys/{kid}/rotation-schedule

For full schema definitions, examples, and interactive testing, see the Developer Hub Reference.

* restricted content — see higher-tier documentation