---
title: "Get the current project deployment status"
method: GET
path: "/v1/projects/{project_id}/status"
---

# Get the current project deployment status

`GET /v1/projects/{project_id}/status`

## Request

- Base URL: `https://app.ohmyho.st`
- URL: `https://app.ohmyho.st/v1/projects/{project_id}/status`
- Auth: HTTP bearer

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.

## Path parameters

- `project_id` string, required

## Headers

- `X-Request-Id` string

## Response `200`

The current tenant-scoped project status.

- ProjectStatus
  - `etag` string, required: Optimistic-concurrency token for changing this project address; use it as If-Match on the handle endpoint.
  - `project_id` string, required
  - `handle` string, required
  - `region` 'us' | 'eu', required: Chosen when the project is created and immutable afterwards. us (default) places the project's database, files, build sandbox and build objects in the US; eu places them in the EU. Prices are identical. ohmyhost.yaml storage.jurisdiction must equal this value.
  - `dev_access_mode` 'protected' | 'public', required
  - `lifecycle` 'active' | 'deleting' | 'deleted', required
  - `source` union, required
    - GithubProjectSource
      - `provider` 'github', required
      - `installation_id` string, required
      - `repository_full_name` string, required
      - `status` 'pending' | 'ready' | 'failed' | 'revoked', required
      - `linked_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `failure_summary` string
    - ManagedProjectSource
      - `initialization_operation_id` string
      - `initialization_error_code` string: Canonical public operation failure code for failed initialization; never a provider error.
      - `provider` 'managed', required
      - `source_connection_id` string, required
      - `source_generation` integer, required
      - `namespace` string, required
      - `repository_name` string, required
      - `branch` 'main', required
      - `current_commit_sha` string, nullable, required
      - `status` 'pending' | 'ready' | 'failed' | 'revoked', required
      - `linked_at` string, date-time, required
      - `updated_at` string, date-time, required
  - `default_environment` ProjectEnvironment, required
    - `id` string, required
    - `name` string, required
  - `environments` ProjectEnvironment[]: 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.
    - `id` string, required
    - `name` string, required
  - `head_deployment` Deployment, required
    - `id` string, required
    - `project_id` string, required
    - `operation_id` string, required
    - `commit_sha` string, required: Exact full Git commit object identifier; abbreviated or branch references are forbidden.
    - `source_digest` string, required
    - `build_plan_digest` string, required
    - `artifact_digest` string
    - `status` 'queued' | 'building' | 'publishing' | 'active' | 'failed' | 'rolled_back' | 'deleting' | 'deleted' | 'reconciliation_required', required
    - `url` string, uri: Project-isolated public gateway URL for the observed deployment.
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
  - `dev_url` string, uri, nullable, required
  - `prod_url` string, uri, nullable, required
  - `latest_operation` Operation, required: 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.
    - `blocking_operation_id` string
    - `deployment_id` string
    - `id` string, required
    - `state` 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled', required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `result` object
    - `error` OperationFailure
      - `code` 'operation_failed' | 'operation_abandoned' | 'authorization_changed' | 'source_commit_conflict' | 'source_snapshot_invalid' | 'source_upload_expired' | '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_write_rejected' | 'database_write_unavailable' | 'database_write_outcome_unknown' | 'database_compute_failed' | 'database_compute_plan_changed' | 'database_compute_rejected' | 'database_migration_failed' | 'insufficient_organization_credits' | 'paid_plan_required' | 'runtime_candidate_failed' | 'runtime_candidate_rejected' | 'storage_jurisdiction_conflict' | 'provider_state_absent' | 'auto_deploy_plan_rejected' | 'promotion_source_stale' | 'promotion_target_stale', required
      - `message` string, required
      - `retryable` false, required: A terminal operation cannot be retried in place; follow suggested_action.
      - `suggested_action` string, required
      - `detail` string: Present only on auto_deploy_plan_rejected when planning the pushed commit returned a typed refusal. It is the same fixed catalog sentence that the planning 409 problem returns as detail, naming the file, the rule and the required change.
    - `progress` OperationDeploymentProgress: Current deployment dependency observation, separate from immutable operation history. Poll the same operation; mail readiness does not mean application activation.
      - `build_completed_at` string, date-time: Actual successful build completion time when this operation ran a build; omitted for reused artifacts without a current build.
      - `phase` 'queued' | 'building' | 'publishing' | 'waiting_for_mail' | 'mail_status_unavailable', required
      - `project_id` string, required
      - `deployment_id` string, required
      - `observed_at` string, date-time, required
      - `next_poll_after_seconds` 60, required
      - `suggested_action` string, required
    - `reconciliation` OperationReconciliation
      - `state` 'required' | 'pending', required
      - `attempt_id` string, required
      - `observed_at` string, date-time, required
      - `suggested_action` string, required
  - `cleanup_state` 'not_started' | 'pending' | 'completed' | 'reconciliation_required', required

## Other responses

- `400`: The request failed.
- `401`: The request failed.
- `403`: The request failed.
- `404`: The resource does not exist or is not visible to the authenticated principal.
- `429`: The request failed.
- `503`: The request failed.

---

[API](https://skmtc.dev/ohmyho/apis/ohmyho-st-api.md) · [All operations](https://skmtc.dev/ohmyho/apis/ohmyho-st-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ohmyho/apis/ohmyho-st-api/revisions/d069888c0017?raw)
