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

# Approve operation

> Allow or deny one exact pending owner-admission request.

Use `operations:approve` and an `Idempotency-Key`. Copy the `approvalId`, `requestId`, `operationId`, `operationRevision`, `expectedUpdatedAt`, and `reviewToken` from the current owner request. Review its exact inputs and effects, then send `decision: "allow"` or `"deny"`.

The endpoint accepts only an existing `OPERATION_ADMISSION` request whose policy explicitly requires one owner decision. It rejects wrong owners, stale terms, expired requests, resolved decisions, and multi-approver workflows. Retries with the same key and input return the recorded decision.

The result records owner admission. `executionStarted: false` is explicit: this response does not claim the provider began work. It never grants the requester's external-account access, action consent, or payment permission.


## OpenAPI

````yaml openapi-publish.json POST /v3/operate/approve
openapi: 3.1.0
info:
  title: Publish
  version: 3.0.0
  description: >-
    Owner-authorized agent and operation publishing, operating decisions and
    analytics, and durable campaign management. Publishing records does not
    bypass independent execution verification. Campaign submission requests
    review; it does not activate delivery or authorize spending.
servers:
  - url: https://api.darwin.so/api
security: []
paths:
  /v3/operate/approve:
    post:
      tags:
        - Operate
      summary: Approve operation
      description: >-
        Allow or deny one existing pending owner-admission request. Binds the
        exact request, operation revision, expectedUpdatedAt, and reviewToken.
        Only single-owner decisions (ownerAdmission=true, quorum=1) are
        supported. Stale, expired, other-owner, or multi-approver requests fail
        closed. A recorded owner decision does not grant requester
        authentication, action consent, payment, or claim execution began.
      operationId: approve_operation
      parameters:
        - name: Idempotency-Key
          in: header
          required: true
          description: >-
            Stable key for this exact mutation. Reusing it with different input
            returns 409.
          schema:
            type: string
            minLength: 1
            maxLength: 200
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                operationId:
                  type: string
                  minLength: 1
                  maxLength: 200
                operationRevision:
                  type: integer
                  minimum: 1
                  maximum: 2147483647
                approvalId:
                  type: string
                  minLength: 1
                  maxLength: 200
                requestId:
                  type: string
                  minLength: 1
                  maxLength: 200
                expectedUpdatedAt:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                reviewToken:
                  type: string
                  pattern: ^[a-f0-9]{64}$
                decision:
                  type: string
                  enum:
                    - allow
                    - deny
              required:
                - operationId
                - operationRevision
                - approvalId
                - requestId
                - expectedUpdatedAt
                - reviewToken
                - decision
              additionalProperties: false
            example:
              operationId: operation-from-get-operation
              operationRevision: 1
              approvalId: approval-from-owner-request
              requestId: request-from-owner-request
              expectedUpdatedAt: '2026-10-18T18:00:00.000Z'
              reviewToken: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
              decision: allow
      responses:
        '200':
          description: >-
            Current owner-scoped result. A mutation retry returns its saved
            response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  approval:
                    type: object
                    properties:
                      approvalId:
                        type: string
                      operationId:
                        type: string
                      requestId:
                        type: string
                      operationRevision:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                      status:
                        type: string
                        enum:
                          - APPROVED
                          - REJECTED
                      executionStarted:
                        type: boolean
                        const: false
                    required:
                      - approvalId
                      - operationId
                      - requestId
                      - operationRevision
                      - status
                      - executionStarted
                    additionalProperties: false
                required:
                  - approval
                additionalProperties: false
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type:
                      - string
                      - array
                  code:
                    type: string
        '401':
          description: Missing or invalid credentials.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type:
                      - string
                      - array
                  code:
                    type: string
        '403':
          description: Insufficient scope or user authority.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type:
                      - string
                      - array
                  code:
                    type: string
        '404':
          description: Resource is absent or not owned by this caller.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type:
                      - string
                      - array
                  code:
                    type: string
        '409':
          description: Revision, handle, idempotency, or decision conflict.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type:
                      - string
                      - array
                  code:
                    type: string
        '503':
          description: Canonical product storage or migration is unavailable.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type:
                      - string
                      - array
                  code:
                    type: string
      security:
        - apiKey: []
        - apiKeyBearer: []
components:
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
    apiKeyBearer:
      type: http
      scheme: bearer
      description: A Darwin API key supplied as an Authorization Bearer token.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.