> ## 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.

# Put a journaled write back

> Restores the rows one whole-catalog write moved, each to exactly what it held before (an explicit on or off, or inherit), and only where the write is still the last word on it: the row must read as the write left it (a turn-on left explicit on rows; a turn-off left provider rows off and the tool rows it converged at inherit) and no later write may have journaled the slug. Anything else was decided since and is skipped and counted, never clobbered. Rows are never deleted, so putting an earlier write back afterwards still finds them. A tool pinned now stays on and counts as skipped: putting a turn-on back never takes a pin away. Any other tool put back off drops its MCP pin; a tool put back on does not get its pin back, but pass the unpinned slugs the write answered with as repin and the answer names those that came back on. Only the id a whole-catalog write answered with (all-on:… or all-off:…) is accepted: other writers converge exceptions their journals do not record, so their state cannot be rebuilt exactly. The revert is journaled like any other write, under this request's id.



## OpenAPI

````yaml /api-reference/openapi.json post /credits/catalog/changes/{requestId}/revert
openapi: 3.1.0
info:
  title: Locus Pro API
  description: >-
    Access paid tools, manage prepaid balances, and build usage billing. Send
    money as exact decimal strings and reuse Idempotency-Key on retries.
    Management routes require a scoped server key or authorized dashboard
    session. Sensitive workspace changes require an owner or admin with recent
    MFA or passkey verification, except where an operation documents a stricter
    boundary. Interactive agents use MCP OAuth; unattended agents use scoped
    Agent Connections. Browser widgets use end-user tokens.
  version: 0.7.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: Feature-gated 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: MCP
    description: Stateless Streamable HTTP transport and MCP tool-result contracts
  - name: Okibi Identity
    description: >-
      Feature-gated 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: Hosted Workflows
    description: >-
      Tenant-private TypeScript Workflow definitions, immutable versions,
      bounded runs, artifacts, and recovery
  - name: Agent connections
    description: Scoped, expiring, revocable credentials for agent execution
  - name: Recipes
    description: >-
      Search, research, extraction, enrichment, and travel outcomes across
      providers
paths:
  /credits/catalog/changes/{requestId}/revert:
    post:
      tags:
        - Catalog
      summary: Put a journaled write back
      description: >-
        Restores the rows one whole-catalog write moved, each to exactly what it
        held before (an explicit on or off, or inherit), and only where the
        write is still the last word on it: the row must read as the write left
        it (a turn-on left explicit on rows; a turn-off left provider rows off
        and the tool rows it converged at inherit) and no later write may have
        journaled the slug. Anything else was decided since and is skipped and
        counted, never clobbered. Rows are never deleted, so putting an earlier
        write back afterwards still finds them. A tool pinned now stays on and
        counts as skipped: putting a turn-on back never takes a pin away. Any
        other tool put back off drops its MCP pin; a tool put back on does not
        get its pin back, but pass the unpinned slugs the write answered with as
        repin and the answer names those that came back on. Only the id a
        whole-catalog write answered with (all-on:… or all-off:…) is accepted:
        other writers converge exceptions their journals do not record, so their
        state cannot be rebuilt exactly. The revert is journaled like any other
        write, under this request's id.
      parameters:
        - name: requestId
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 200
          description: >-
            The requestId a whole-catalog write answered with
            (all-on:<revision>:… or all-off:<revision>:…).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                repin:
                  type: array
                  maxItems: 50
                  items:
                    type: string
                    minLength: 1
                    maxLength: 512
                  description: >-
                    Tool slugs whose pins the write cleared (its unpinned
                    answer).
              additionalProperties: false
      responses:
        '200':
          description: >-
            Rows restored where they still held; skipped counts rows decided
            since; repin names the asked-about tools now back on
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - reverted
                  - skipped
                  - skippedSlugs
                  - repin
                  - requestId
                properties:
                  success:
                    const: true
                  reverted:
                    type: integer
                    minimum: 0
                  skipped:
                    type: integer
                    minimum: 0
                  skippedSlugs:
                    type: array
                    maxItems: 200
                    items:
                      type: string
                    description: >-
                      The first 200 slugs left alone because they were decided
                      since; skipped is the full count.
                  repin:
                    type: array
                    items:
                      type: string
                    description: >-
                      Of the slugs asked about, those whose tool this revert put
                      back on.
                  requestId:
                    type: string
                additionalProperties: false
        '400':
          description: >-
            requestId empty, longer than 200 characters, or not one a
            whole-catalog write answered with; or a body that is not { repin?:
            string[] }
        '403':
          $ref: '#/components/responses/InsufficientScope'
        '404':
          description: No catalog changes are journaled for that request
      security:
        - dashboardSession: []
        - secretKey: []
components:
  responses:
    InsufficientScope:
      description: >-
        The authenticated management credential lacks one or more required
        scopes
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/InsufficientScopeError'
  schemas:
    InsufficientScopeError:
      type: object
      additionalProperties: false
      required:
        - success
        - error
        - code
        - message
        - requiredScopes
        - presentScopes
      properties:
        success:
          const: false
        error:
          const: Forbidden
        code:
          const: INSUFFICIENT_SCOPE
        message:
          type: string
        requiredScopes:
          type: array
          items:
            $ref: '#/components/schemas/CreditsTenantScope'
          minItems: 1
          uniqueItems: true
        presentScopes:
          type: array
          items:
            $ref: '#/components/schemas/CreditsTenantScope'
          uniqueItems: true
    CreditsTenantScope:
      type: string
      enum:
        - tenant:read
        - tenant:write
        - catalog:write
        - credits:move
        - credentials:manage
        - tokens:manage
        - payouts:manage
        - members:manage
        - widget:read
  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). High-risk workspace
        administration requires an owner or admin role and fresh MFA/passkey
        step-up.

````