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

> ## Agent Instructions
> For account actions, read https://ohmyho.st/skills/ohmyhost-get-started/SKILL.md and use the authenticated ohmyho.st CLI, local product MCP or supported remote OAuth MCP. Read the current project source binding before choosing GitHub or managed versions. Mintlify search only reads documentation. Preserve the customer’s selected project, environment and authentication provider; keep private application values in the portal or local stdin flow.

# Plan promotion of the current dev deployment

> Produces a non-mutating, ten-minute plan that binds the current succeeded dev deployment and current prod head without rebuilding the artifact.



## OpenAPI

````yaml /openapi.json post /v1/projects/{project_id}/deployments/{source_deployment_id}:promote-plan
openapi: 3.1.2
info:
  title: ohmyho.st API
  version: 0.0.0
  description: >-
    Public REST API for ohmyho.st hosting, projects, domains, email, credits and
    exports.
servers:
  - url: https://app.ohmyho.st
    description: Production control API
  - url: https://dev.app.ohmyho.st
    description: Development control API
security:
  - BearerAuth: []
paths:
  /v1/projects/{project_id}/deployments/{source_deployment_id}:promote-plan:
    post:
      summary: Plan promotion of the current dev deployment
      description: >-
        Produces a non-mutating, ten-minute plan that binds the current
        succeeded dev deployment and current prod head without rebuilding the
        artifact.
      operationId: planDeploymentPromotion
      parameters:
        - $ref: '#/components/parameters/RequestId'
        - $ref: '#/components/parameters/ProjectId'
        - $ref: '#/components/parameters/SourceDeploymentId'
      responses:
        '200':
          description: A promotion plan with a ten-minute action-bound confirmation token.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GuardedActionPlan'
        '400':
          $ref: '#/components/responses/Problem'
        '401':
          $ref: '#/components/responses/Problem'
        '403':
          $ref: '#/components/responses/Problem'
        '404':
          $ref: '#/components/responses/ResourceNotFound'
        '409':
          $ref: '#/components/responses/Problem'
        '429':
          $ref: '#/components/responses/Problem'
        '503':
          $ref: '#/components/responses/Problem'
components:
  parameters:
    RequestId:
      name: X-Request-Id
      in: header
      description: Optional caller-provided correlation identifier.
      required: false
      schema:
        type: string
        minLength: 1
        maxLength: 128
    ProjectId:
      name: project_id
      in: path
      description: Project identifier.
      required: true
      schema:
        $ref: '#/components/schemas/Ulid'
    SourceDeploymentId:
      name: source_deployment_id
      in: path
      required: true
      description: >-
        Current succeeded dev deployment whose immutable artifact will be
        promoted.
      schema:
        $ref: '#/components/schemas/Ulid'
  headers:
    XRequestId:
      description: Correlates the request with operations, events, logs, and audit records.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 128
  schemas:
    GuardedActionPlan:
      type: object
      description: >-
        Non-mutating guarded-action plan with a confirmation token that expires
        exactly ten minutes after creation.
      additionalProperties: false
      x-ohmyhost-ttl-seconds: 600
      required:
        - action
        - project_id
        - resource_etag
        - effects
        - risks
        - confirmation_token
        - created_at
        - expires_at
      properties:
        action:
          type: string
          enum:
            - rollback
            - promote
            - delete
        project_id:
          $ref: '#/components/schemas/Ulid'
        target_deployment_id:
          $ref: '#/components/schemas/Ulid'
        target_artifact_digest:
          $ref: '#/components/schemas/Sha256Digest'
        source_deployment_id:
          $ref: '#/components/schemas/Ulid'
        source_artifact_digest:
          $ref: '#/components/schemas/Sha256Digest'
        source_environment:
          type: string
          const: dev
        target_environment:
          type: string
          const: prod
        resource_etag:
          type: string
          minLength: 3
          maxLength: 128
          description: Send as If-Match with this plan's confirmation token.
        effects:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 512
        risks:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 512
        confirmation_token:
          $ref: '#/components/schemas/ConfirmationToken'
        created_at:
          type: string
          format: date-time
        expires_at:
          type: string
          format: date-time
      oneOf:
        - properties:
            action:
              const: rollback
          required:
            - target_deployment_id
            - target_artifact_digest
        - properties:
            action:
              const: promote
          required:
            - source_deployment_id
            - source_artifact_digest
            - source_environment
            - target_environment
        - properties:
            action:
              const: delete
          not:
            anyOf:
              - required:
                  - target_deployment_id
              - required:
                  - target_artifact_digest
              - required:
                  - source_deployment_id
              - required:
                  - source_artifact_digest
              - required:
                  - source_environment
              - required:
                  - target_environment
    Ulid:
      type: string
      pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
    Sha256Digest:
      type: string
      pattern: ^sha256:[0-9a-f]{64}$
    ConfirmationToken:
      type: string
      description: >-
        Opaque, single-action token bound to the planned action, project, target
        resource, and resource ETag.
      minLength: 32
      maxLength: 4096
      pattern: ^[A-Za-z0-9._~-]+$
    ProblemDetails:
      type: object
      description: RFC 9457 Problem Details extended with stable ohmyhost recovery fields.
      additionalProperties: false
      required:
        - type
        - title
        - status
        - code
        - request_id
        - retryable
        - suggested_action
      properties:
        type:
          type: string
          format: uri-reference
        title:
          type: string
          minLength: 1
        status:
          type: integer
          minimum: 400
          maximum: 599
        detail:
          type: string
        instance:
          type: string
          format: uri-reference
        code:
          type: string
          enum:
            - invalid_request
            - unauthenticated
            - forbidden
            - organization_required
            - resource_not_found
            - idempotency_key_reused
            - project_handle_unavailable
            - project_identity_unavailable
            - deployment_plan_expired
            - deployment_plan_incompatible
            - confirmation_expired
            - confirmation_invalid
            - etag_mismatch
            - promotion_source_stale
            - promotion_target_stale
            - promotion_invalid_target
            - mail_domain_conflict
            - mail_domain_required
            - mail_capacity_unavailable
            - storage_jurisdiction_conflict
            - shared_data_requires_promotion
            - production_deployment_required
            - framework_conversion_required
            - repository_configuration_missing
            - migration_filename_noncanonical
            - environment_secret_mutation_blocked
            - workers_runtime_incompatible
            - project_handle_invalid
            - project_handle_taken
            - project_handle_unchanged
            - project_rename_blocked
            - payload_too_large
            - rate_limited
            - insufficient_organization_credits
            - paid_plan_required
            - project_budget_exceeded
            - compute_performance_paid_required
            - compute_performance_unavailable
            - database_write_pending
            - database_access_limit
            - compute_change_pending
            - compute_change_conflict
            - billing_purchase_conflict
            - billing_recharge_conflict
            - github_connection_required
            - github_connection_revoked
            - repository_not_installed
            - cloudflare_zone_not_bound
            - cloudflare_authorization_closed
            - project_notes_conflict
            - project_export_not_ready
            - powered_by_flag_required
            - interactive_login_required
            - api_key_creation_uncertain
            - api_key_permissions_unavailable
            - reconciliation_exhausted
            - service_unavailable
            - source_commit_not_found
            - domain_hostname_taken
            - domain_dns_conflict
            - data_change_blocked
            - data_change_in_progress
            - data_change_not_applicable
            - rollback_target_data_changed
            - project_domain_delete_required
        request_id:
          type: string
          minLength: 1
          maxLength: 128
        retryable:
          type: boolean
        retry_after_seconds:
          type: integer
          minimum: 1
          maximum: 86400
          description: >-
            Optional machine-readable retry delay for a rate limit, matching
            Retry-After.
        suggested_action:
          type: string
          minLength: 1
  responses:
    Problem:
      description: The request failed.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    ResourceNotFound:
      description: >-
        The resource does not exist or is not visible to the authenticated
        principal.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            resourceNotFound:
              value:
                type: https://docs.ohmyho.st/errors/resource-not-found
                title: Resource not found
                status: 404
                code: resource_not_found
                request_id: req_01J00000000000000000000000
                retryable: false
                suggested_action: Check the resource identifier and your access scope.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        WorkOS access JWT or a user-owned WorkOS API key. User keys are bound to
        one organization and restricted to their enabled product permissions.
        Session-only onboarding and session revocation require an interactive
        access JWT. No cookie session is assumed.

````

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