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

# Get the current project deployment status

> Returns the immutable project handle, current source, default environment, head deployment, independently evidenced dev and prod gateway origins, latest operation, and cleanup state without exposing provider credentials.



## OpenAPI

````yaml /openapi.json get /v1/projects/{project_id}/status
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}/status:
    get:
      summary: Get the current project deployment status
      description: >-
        Returns the immutable project handle, current source, default
        environment, head deployment, independently evidenced dev and prod
        gateway origins, latest operation, and cleanup state without exposing
        provider credentials.
      operationId: getProjectStatus
      parameters:
        - $ref: '#/components/parameters/RequestId'
        - $ref: '#/components/parameters/ProjectId'
      responses:
        '200':
          description: The current tenant-scoped project status.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectStatus'
        '400':
          $ref: '#/components/responses/Problem'
        '401':
          $ref: '#/components/responses/Problem'
        '403':
          $ref: '#/components/responses/Problem'
        '404':
          $ref: '#/components/responses/ResourceNotFound'
        '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'
  headers:
    XRequestId:
      description: Correlates the request with operations, events, logs, and audit records.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 128
  schemas:
    ProjectStatus:
      type: object
      additionalProperties: false
      required:
        - project_id
        - handle
        - lifecycle
        - source
        - default_environment
        - head_deployment
        - dev_url
        - prod_url
        - latest_operation
        - cleanup_state
      properties:
        project_id:
          $ref: '#/components/schemas/Ulid'
        handle:
          type: string
          minLength: 5
          maxLength: 59
          pattern: ^[a-z]+-[a-z]+-[a-z]+$
        lifecycle:
          type: string
          enum:
            - active
            - deleting
            - deleted
        source:
          oneOf:
            - $ref: '#/components/schemas/ProjectSource'
            - type: 'null'
        default_environment:
          oneOf:
            - $ref: '#/components/schemas/ProjectEnvironment'
            - type: 'null'
        environments:
          type: array
          maxItems: 2
          description: >-
            Tenant-scoped Dev and Prod environment IDs for secrets and other
            environment-scoped commands. Select by name; never infer the Prod ID
            from the default Dev environment.
          items:
            $ref: '#/components/schemas/ProjectEnvironment'
        head_deployment:
          oneOf:
            - $ref: '#/components/schemas/Deployment'
            - type: 'null'
        dev_url:
          oneOf:
            - type: string
              format: uri
              pattern: ^https://dev-[a-z]+-[a-z]+-[a-z]+\.(?:dev\.)?check\.omh\.st$
            - type: 'null'
        prod_url:
          oneOf:
            - type: string
              format: uri
              pattern: ^https://[a-z]+-[a-z]+-[a-z]+\.(?:dev\.)?check\.omh\.st$
            - type: 'null'
        latest_operation:
          oneOf:
            - $ref: '#/components/schemas/Operation'
            - type: 'null'
        cleanup_state:
          type: string
          enum:
            - not_started
            - pending
            - completed
            - reconciliation_required
    Ulid:
      type: string
      pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
    ProjectSource:
      type: object
      additionalProperties: false
      required:
        - provider
        - installation_id
        - repository_full_name
        - status
        - linked_at
        - updated_at
      properties:
        provider:
          type: string
          const: github
        installation_id:
          type: string
          pattern: ^[1-9][0-9]*$
          maxLength: 20
        repository_full_name:
          type: string
          minLength: 3
          maxLength: 201
          pattern: ^[^/]+/[^/]+$
        status:
          type: string
          enum:
            - pending
            - ready
            - failed
            - revoked
        linked_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        failure_summary:
          type: string
          minLength: 1
          maxLength: 512
    ProjectEnvironment:
      type: object
      additionalProperties: false
      required:
        - id
        - name
      properties:
        id:
          $ref: '#/components/schemas/Ulid'
        name:
          type: string
          minLength: 1
          maxLength: 128
    Deployment:
      type: object
      additionalProperties: false
      required:
        - id
        - project_id
        - operation_id
        - commit_sha
        - source_digest
        - build_plan_digest
        - status
        - created_at
        - updated_at
      properties:
        id:
          $ref: '#/components/schemas/Ulid'
        project_id:
          $ref: '#/components/schemas/Ulid'
        operation_id:
          $ref: '#/components/schemas/Ulid'
        commit_sha:
          $ref: '#/components/schemas/GitCommitSha'
        source_digest:
          $ref: '#/components/schemas/Sha256Digest'
        build_plan_digest:
          $ref: '#/components/schemas/Sha256Digest'
        artifact_digest:
          $ref: '#/components/schemas/Sha256Digest'
        status:
          type: string
          enum:
            - queued
            - building
            - publishing
            - active
            - failed
            - rolled_back
            - deleting
            - deleted
            - reconciliation_required
        url:
          type: string
          description: Project-isolated public gateway URL for the observed deployment.
          format: uri
          pattern: ^https://
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    Operation:
      type: object
      description: >-
        Durable record returned for an accepted asynchronous mutation. Optional
        reconciliation is a current observation for queued/running work,
        separate from immutable terminal state. A completed reconciliation
        attempt alone does not mean the operation succeeded.
      additionalProperties: false
      required:
        - id
        - state
        - created_at
        - updated_at
      properties:
        id:
          $ref: '#/components/schemas/Ulid'
        state:
          type: string
          enum:
            - queued
            - running
            - succeeded
            - failed
            - cancelled
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        result:
          type: object
          additionalProperties: true
        error:
          $ref: '#/components/schemas/OperationFailure'
        progress:
          $ref: '#/components/schemas/OperationDeploymentProgress'
        reconciliation:
          $ref: '#/components/schemas/OperationReconciliation'
    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
            - 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
            - framework_conversion_required
            - migration_filename_noncanonical
            - environment_secret_mutation_blocked
            - container_runtime_required
            - payload_too_large
            - rate_limited
            - insufficient_organization_credits
            - paid_plan_required
            - project_budget_exceeded
            - compute_performance_paid_required
            - compute_performance_unavailable
            - compute_change_pending
            - compute_change_conflict
            - billing_purchase_conflict
            - cloudflare_authorization_closed
            - project_notes_conflict
            - project_export_not_ready
            - interactive_login_required
            - api_key_creation_uncertain
            - api_key_permissions_unavailable
            - reconciliation_exhausted
            - service_unavailable
        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
    GitCommitSha:
      type: string
      description: >-
        Exact full Git commit object identifier; abbreviated or branch
        references are forbidden.
      pattern: ^[0-9a-f]{40}$
    Sha256Digest:
      type: string
      pattern: ^sha256:[0-9a-f]{64}$
    OperationFailure:
      type: object
      additionalProperties: false
      required:
        - code
        - message
        - retryable
        - suggested_action
      properties:
        code:
          type: string
          enum:
            - operation_failed
            - recovery_dispatch_failed
            - recovery_job_failed
            - recovery_input_expired
            - recovery_database_unavailable
            - recovery_checksum_mismatch
            - recovery_scope_unavailable
            - recovery_archive_too_large
            - build_not_started
            - build_failed
            - database_compute_failed
            - database_compute_plan_changed
            - database_compute_rejected
            - database_migration_failed
            - insufficient_organization_credits
            - paid_plan_required
            - runtime_candidate_failed
            - container_runtime_secrets_unsupported
            - provider_state_absent
        message:
          type: string
          minLength: 1
          maxLength: 512
        retryable:
          type: boolean
          const: false
          description: >-
            A terminal operation cannot be retried in place; follow
            suggested_action.
        suggested_action:
          type: string
          minLength: 1
          maxLength: 500
    OperationDeploymentProgress:
      type: object
      additionalProperties: false
      description: >-
        Current deployment dependency observation, separate from immutable
        operation history. Poll the same operation; mail readiness does not mean
        application activation.
      required:
        - phase
        - project_id
        - deployment_id
        - observed_at
        - next_poll_after_seconds
        - suggested_action
      properties:
        build_completed_at:
          type: string
          format: date-time
          description: >-
            Actual successful CodeBuild completion time when this operation ran
            a build; omitted for reused artifacts without a current build.
        phase:
          type: string
          enum:
            - queued
            - building
            - publishing
            - waiting_for_mail
            - mail_status_unavailable
        project_id:
          $ref: '#/components/schemas/Ulid'
        deployment_id:
          $ref: '#/components/schemas/Ulid'
        observed_at:
          type: string
          format: date-time
        next_poll_after_seconds:
          type: integer
          const: 60
        suggested_action:
          type: string
          minLength: 1
          maxLength: 500
    OperationReconciliation:
      type: object
      additionalProperties: false
      required:
        - state
        - attempt_id
        - observed_at
        - suggested_action
      properties:
        state:
          type: string
          enum:
            - required
            - pending
        attempt_id:
          oneOf:
            - $ref: '#/components/schemas/Ulid'
            - type: 'null'
          description: >-
            Active attempt for pending reconciliation; null when a new confirmed
            reconciliation is required.
        observed_at:
          type: string
          format: date-time
        suggested_action:
          type: string
          minLength: 1
          maxLength: 500
  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.

````