> ## Documentation Index
> Fetch the complete documentation index at: https://docs.paywithlocus.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rotate ONE key; sibling keys of the same kind keep working

> The replacement inherits the target's name, scopes, endpoint allowlist, pricing, audience (legacy policy-bearing rows are normalized to the execution audience), and — unless expiresIn is passed — its expiry deadline. Only the target is superseded: with gracePeriodSeconds > 0 it keeps authenticating until the overlap ends (capped at the target's own expiry), otherwise it is revoked with this response. Rotating a key that is already rotating out is rejected (rotate its replacement instead), as is rotating an expired key without a fresh expiresIn. This is the rotation the dashboard uses; the kind-level /keys/rotate remains the rotate-everything cutover. Requires the workspace owner with MFA or passkey step-up completed in the last ten minutes.



## OpenAPI

````yaml /api-reference/openapi.json post /credits/tenants/me/keys/{keyId}/rotate
openapi: 3.1.0
info:
  title: Locus Pro API
  description: >-
    Production is live at https://api.paywithlocus.com/api. Stage remains
    available for evaluation and integration testing at
    https://api.stage.paywithlocus.com/api; credentials, balances, and tenant
    data are isolated by environment. Embedded prepaid credits over the Locus
    pay-per-use catalog. Money and top-up amounts use exact decimal strings (up
    to 6dp). Every burn requires an Idempotency-Key header. Management routes
    accept a tenant secret key or authorized dashboard session as shown per
    operation. Widget routes accept an end-user JWT alone; when a publishable
    key is present it must belong to the JWT's tenant. MCP uses OAuth 2.1
    Authorization Code with PKCE by default and also accepts the explicitly
    documented tenant secret key, end-user JWT, or scoped agent connection
    compatibility credentials. Burns accept the execution credentials shown per
    operation. Publishable keys never authorize management or burns by
    themselves.
  version: 0.6.0
servers:
  - url: https://api.paywithlocus.com/api
    description: Production
  - url: https://api.stage.paywithlocus.com/api
    description: Stage — evaluation and integration testing
security:
  - secretKey: []
tags:
  - name: Authentication
    description: Email-verified self-serve account creation and dashboard identity
  - name: Tenants
    description: Tenant profile, keys, and settings (dashboard session or secret key)
  - name: Workspace members
    description: Invite-only human workspace membership and role administration
  - name: Catalog
    description: Enable/disable APIs and set markups
  - name: Custom APIs
    description: >-
      Available when enabled for the workspace. Enterprise BYOK providers and
      schema-backed custom actions
  - name: End users
    description: End-user accounts, tokens, and allocations
  - name: Top-ups
    description: Locus-hosted checkout top-ups and quotes
  - name: Ledger
    description: Burn/top-up history and earnings
  - name: Webhooks
    description: Signed events, delivery inspection, and replay
  - name: Burn
    description: Metered pay-per-use calls
  - name: Travel routing
    description: >-
      Available when enabled for the workspace. Multi-provider flight search,
      no-dispatch planning, and feedback
  - name: MCP
    description: Stateless Streamable HTTP transport and MCP tool-result contracts
  - name: Okibi Identity
    description: >-
      Available when enabled for the workspace. Okibi identity verification and
      scoped native CLI credential bootstrap
  - name: Widget
    description: End-user JWT surface; a matching publishable key is optional
  - name: Agent-native onboarding
    description: >-
      Self-registration, human Stripe funding handoff, and restricted account
      setup for headless agents
  - name: Agent connections
    description: Scoped, expiring, revocable credentials for agent execution
  - name: Capability routing
    description: Outcome-level web search and research across eligible catalog providers
paths:
  /credits/tenants/me/keys/{keyId}/rotate:
    post:
      tags:
        - Tenants
      summary: Rotate ONE key; sibling keys of the same kind keep working
      description: >-
        The replacement inherits the target's name, scopes, endpoint allowlist,
        pricing, audience (legacy policy-bearing rows are normalized to the
        execution audience), and — unless expiresIn is passed — its expiry
        deadline. Only the target is superseded: with gracePeriodSeconds > 0 it
        keeps authenticating until the overlap ends (capped at the target's own
        expiry), otherwise it is revoked with this response. Rotating a key that
        is already rotating out is rejected (rotate its replacement instead), as
        is rotating an expired key without a fresh expiresIn. This is the
        rotation the dashboard uses; the kind-level /keys/rotate remains the
        rotate-everything cutover. Requires the workspace owner with MFA or
        passkey step-up completed in the last ten minutes.
      parameters:
        - name: keyId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Key record id from GET /credits/tenants/me/keys.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                gracePeriodSeconds:
                  type: integer
                  minimum: 0
                  maximum: 86400
                  description: >-
                    Overlap during which the old key still works. Omitted or 0
                    means it dies with this response.
                expiresIn:
                  type: integer
                  minimum: 60
                  maximum: 31536000
                  description: >-
                    Lifetime of the replacement in seconds. Omit to inherit the
                    target's deadline.
              additionalProperties: false
      responses:
        '200':
          description: New raw key (returned exactly once) with keyMetadata.
        '400':
          description: >-
            Target is revoked, already rotating out, expired without a fresh
            expiresIn — or an unknown body field.
        '403':
          description: STEP_UP_REQUIRED or INSUFFICIENT_SCOPE.
        '404':
          description: No such key in this workspace (malformed ids included).
      security:
        - dashboardSession: []
components:
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      description: Tenant secret key (lcr_…). Server-side only.
    dashboardSession:
      type: http
      scheme: bearer
      description: Locus Pro dashboard session (Cognito).

````