---
title: "Deploy one project container"
method: POST
path: "/projects/{id}/containers/{containerId}/deploy"
---

# Deploy one project container

`POST /projects/{id}/containers/{containerId}/deploy`

## Request

- Base URL: `https://api.eurobase.dev`
- URL: `https://api.eurobase.dev/projects/{id}/containers/{containerId}/deploy`
- Auth: none declared

## Path parameters

- `id` string, required
- `containerId` string, required

## Response `201`

Deployed project container

- ProjectContainerDeployResponse
  - `ok` boolean, required
  - `project` ProjectSummary, required
    - `id` string, required
    - `name` string, nullable
    - `organizationId` string, nullable
    - `projectMembershipId` string, nullable
    - `projectRole` 'owner' | 'admin' | 'contributor' | 'null', nullable
    - `projectSlug` string, nullable
    - `projectHostname` string, nullable
    - `primaryHostname` string, nullable: Official address of the project: its active custom domain whose DNS points at Eurobase, the one that went live first when several do, otherwise projectHostname. projectHostname stays reserved and keeps serving.
    - `deploymentMode` 'runtime' | 'static', required
    - `lifecycleState` string, nullable
    - `deleteRequestedAt` string, date-time, nullable
    - `projectRoute` ProjectRoute, required
      - `status` 'healthy' | 'repairing' | 'degraded' | 'broken' | 'unknown', required
      - `reasonCode` 'none' | 'dns_record_missing' | 'dns_propagating' | 'domain_binding_missing' | 'tls_pending' | 'missing_project_upstream' | 'upstream_unreachable' | 'ingress_unreachable' | 'unmanaged_custom_domain' | 'scw_mutation_failed', required
      - `checkedAt` string, date-time, nullable
      - `lastRepairAt` string, date-time, nullable
      - `lastError` string, nullable
      - `managed` boolean, required
      - `convergenceState` 'recovering' | 'exhausted' | 'ready' | 'null', nullable
      - `upstream` ProjectUpstreamState, required
        - `status` 'healthy' | 'broken' | 'unknown', required
        - `reasonCode` 'none' | 'missing_project_upstream' | 'upstream_unreachable', required
        - `checkedAt` string, date-time, nullable
        - `lastError` string, nullable
    - `releaseUsability` ReleaseUsability, required
      - `status` 'reachable' | 'degraded' | 'blocked' | 'unknown', required
      - `reasonCode` 'none' | 'missing_live_release' | 'access_not_allowed' | 'route_repair_in_progress' | 'route_incident' | 'project_suspended', required
      - `lastLiveDeploymentId` string, nullable, required
    - `projectSummaryStatus` ProjectSummaryStatus
      - `label` string, required
      - `tone` 'neutral' | 'problem' | 'error', required
      - `code` 'setup_required' | 'route_issue' | 'deploy_failed' | 'deploy_unhealthy' | 'live_release_blocked' | 'status_check_delayed' | 'deploy_in_progress' | 'rollback_live' | 'healthy' | 'suspended', required
      - `detailTitle` string, nullable, required
      - `detail` string, nullable, required
    - `servingSuspension` ProjectServingSuspension: An operator suspension of the project's public serving (ADR 0080). Operator notes and evidence are never included.
      - `state` 'suspended', required
      - `reasonCategory` 'phishing' | 'malware' | 'shared_domain_abuse' | 'spam' | 'illegal_content' | 'legal_order' | 'other_policy_violation', required
      - `reasonLabel` string, required
      - `since` string, date-time, nullable, required
      - `supportEmail` string, required
      - `policyUrl` string, required
    - `sourceProfile` ProjectSourceProfileSummary, required
      - `framework` 'next' | 'astro' | 'svelte-kit' | 'nuxt' | 'react-router' | 'vite' | 'hono' | 'nestjs' | 'fastify' | 'express' | 'django' | 'fastapi' | 'flask' | 'laravel' | 'rails' | 'node' | 'python' | 'php' | 'ruby' | 'go' | 'java' | 'dotnet' | 'static', required
      - `frameworkLabel` string, required
      - `outputMode` 'runtime' | 'static', required
    - `sourceLock` ProjectSourceLock: ADR 0090: while locked, no caller can change the project repository, branch, root directory or deployment mode.
      - `locked` boolean, required
      - `lockedAt` string, date-time, nullable, required
  - `projectHealth` ProjectHealth, required
    - `lifecycleState` 'provisioning' | 'ready' | 'pending_delete' | 'delete_failed', required
    - `overallState` 'provisioning' | 'ready' | 'degraded' | 'blocked' | 'failed' | 'pending_delete' | 'delete_failed', required
    - `reasonCode` 'none' | 'project_key_missing' | 'project_key_revoked' | 'provider_identity_missing' | 'provider_identity_not_ready' | 'provider_bucket_missing' | 'provider_drift_detected' | 'provider_provisioning_failed' | 'provider_delete_failed', required
    - `keyState` 'pending' | 'active' | 'revoked', required
    - `providerIdentityState` 'provisioning' | 'ready' | 'degraded' | 'blocked' | 'failed' | 'pending_delete' | 'delete_failed', required
    - `driftState` 'in_sync' | 'degraded' | 'unknown', required
    - `keyLastUsedAt` string, date-time, nullable
    - `keyLastRotatedAt` string, date-time, nullable
    - `providerLastReconciledAt` string, date-time, nullable
    - `providerRevokedAt` string, date-time, nullable
  - `containerDefaults` ProjectContainerDefaults, required
    - `runtimeTier` ProjectContainerRuntimeTier, required
      - `code` 'euro-small' | 'euro-medium' | 'euro-large' | 'euro-xlarge' | 'existing-unmanaged', required
      - `label` string, required
      - `limitsKnown` boolean, required
      - `cpuMillicores` integer, nullable, required
      - `memoryMb` integer, nullable, required
      - `minScale` integer, nullable, required
      - `maxScale` integer, nullable, required
      - `burnMultiplier` string, nullable
      - `workloadGuidance` string, nullable
      - `equivalentIncludedRuntimeHours` string, nullable
      - `unavailableReason` string, nullable
      - `recoveryAction` string, nullable
      - `selectable` boolean, required
    - `defaultRuntimeTierCode` string, nullable, required
    - `runtimeTierOptions` ProjectContainerRuntimeTier[], required
      - `code` 'euro-small' | 'euro-medium' | 'euro-large' | 'euro-xlarge' | 'existing-unmanaged', required
      - `label` string, required
      - `limitsKnown` boolean, required
      - `cpuMillicores` integer, nullable, required
      - `memoryMb` integer, nullable, required
      - `minScale` integer, nullable, required
      - `maxScale` integer, nullable, required
      - `burnMultiplier` string, nullable
      - `workloadGuidance` string, nullable
      - `equivalentIncludedRuntimeHours` string, nullable
      - `unavailableReason` string, nullable
      - `recoveryAction` string, nullable
      - `selectable` boolean, required
    - `planRuntimeAllowance` object, nullable, required
      - `smallEquivalentHours` string, required
      - `maxScale` integer, required
    - `unavailableReason` string, nullable
    - `recoveryAction` string, nullable
  - `container` ProjectContainer, required
    - `id` string, required
    - `organizationId` string, required
    - `projectId` string, required
    - `sourceType` 'git' | 'dockerfile' | 'image', required
    - `accessMode` 'public' | 'private', required
    - `imageRef` string, nullable, required
    - `sourceRootDir` string, required
    - `sourceRunCommand` string, nullable, required
    - `sourceFramework` 'auto' | 'next' | 'vite' | 'astro' | 'sveltekit' | 'nuxt' | 'node' | 'express' | 'nestjs' | 'fastify' | 'bun' | 'deno' | 'python' | 'django' | 'fastapi' | 'flask' | 'laravel' | 'custom', required
    - `sourceDockerfilePath` string, nullable, required
    - `sourceCommitSha` string, nullable, required
    - `containerName` string, required
    - `containerHostname` string, nullable, required
    - `containerPort` integer, required
    - `healthPath` string, required
    - `runtimeTier` ProjectContainerRuntimeTier, required
      - `code` 'euro-small' | 'euro-medium' | 'euro-large' | 'euro-xlarge' | 'existing-unmanaged', required
      - `label` string, required
      - `limitsKnown` boolean, required
      - `cpuMillicores` integer, nullable, required
      - `memoryMb` integer, nullable, required
      - `minScale` integer, nullable, required
      - `maxScale` integer, nullable, required
      - `burnMultiplier` string, nullable
      - `workloadGuidance` string, nullable
      - `equivalentIncludedRuntimeHours` string, nullable
      - `unavailableReason` string, nullable
      - `recoveryAction` string, nullable
      - `selectable` boolean, required
    - `status` 'draft' | 'deploying' | 'deleting' | 'ready' | 'failed', required
    - `statusLabel` string, required
    - `serving` ProjectContainerServing, required
      - `state` 'serving' | 'stopped', required
      - `stoppedAt` string, date-time, nullable, required
    - `lastError` string, nullable
    - `customDomainStatus` string, required
    - `configuredAt` string, date-time, required
    - `lastDeployedAt` string, date-time, nullable, required
    - `lastVerifiedAt` string, date-time, nullable, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `latestDeployment` Deployment, required
      - `id` string, required
      - `projectId` string, required
      - `version` integer, required
      - `deploymentMode` 'runtime' | 'static', required
      - `runtime` 'workers' | 'container' | 'static', required: Where this deployment runs: a Worker, a container, or static files.
      - `runtimeWorkersReason` string, nullable, required: Why a Workers route of this deployment runs as a container instead, as short display copy of the build Job detection reason; null otherwise or when the reason has no display copy.
      - `primaryHostname` string, nullable: The deployment's project's official address today (see ProjectSummary.primaryHostname).
      - `provider` 'scaleway' | 'null', nullable: Owner/admin deployment detail proof only; list and contributor surfaces omit this field.
      - `imageRef` string, nullable: Owner/admin deployment detail proof only; list and contributor surfaces omit this field.
      - `rollbackTargetImageRef` string, nullable: Owner/admin deployment detail rollback proof only; list and contributor surfaces omit this field.
      - `status` 'queued' | 'building' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back', required
      - `displayStatus` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back' | 'status_check_delayed', required
      - `releaseKind` 'runtime_release' | 'static_release' | 'deployment_attempt', required
      - `statusView` DeploymentStatusView, required
        - `code` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back' | 'status_check_delayed', required
        - `primaryCode` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back', required
        - `primaryLabel` string, required
        - `secondaryLabel` string, nullable, required
        - `tone` 'neutral' | 'active' | 'success' | 'warning' | 'danger', required
        - `freshnessLabel` 'Live' | 'Refreshing' | 'Status delayed' | 'null', nullable, required
      - `terminal` boolean, required
      - `visible` boolean, required
      - `stale` boolean, required
      - `freshness` 'fresh' | 'reconciling' | 'stale', required
      - `lastObservedAt` string, date-time, required
      - `lastProvenExecutionPhase` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'null', nullable, required
      - `displayStatusReasonCode` 'none' | 'builder_capacity_wait_exceeded' | 'build_output_delayed' | 'deploy_runner_wait_exceeded' | 'deploy_execution_delayed' | 'projection_evidence_conflict', required
      - `statusReason` string, nullable
      - `failureSummary` DeploymentFailureSummary
        - `category` 'clone_failed' | 'build_failed' | 'image_push_failed' | 'deploy_failed' | 'healthcheck_failed' | 'runtime_startup_failed' | 'runtime_startup_timeout' | 'app_health_failed' | 'route_activation_failed' | 'platform_capacity_failed' | 'invalid_runtime_config' | 'internal_platform_error', required
        - `phase` 'queue' | 'build' | 'deploy' | 'healthcheck' | 'system', required
        - `severity` 'info' | 'warning' | 'error', required
        - `headline` string, required
        - `detail` string, nullable: One short line: the typed failure reason in owner copy, never the raw reason code.
        - `explanation` string, nullable: The full failure sentence shown in the status popover, when it says more than detail.
        - `fixCommand` string, nullable: The command named in explanation that fixes the failure, offered for copying.
        - `observedAt` string, date-time, required
      - `artifactType` 'static_archive' | 'null', nullable
      - `artifactRef` string, nullable: Internal static artifact object key is withheld from member-readable responses; member clients must use deployableOutput.
      - `artifactSha256` string, nullable
      - `publishTarget` string, nullable: Internal static publish prefix is withheld from member-readable responses; member clients must use deployableOutput.
      - `detailRevision` string: Changes only when lifecycle, immutable output or preview detail is invalidated.
      - `deployableOutput` object, required
        - `kind` 'runtime_image' | 'static_artifact' | 'app_release' | 'none', required
        - `digest` string, nullable, required
        - `displayLabel` string, required
        - `releaseId` string, nullable
        - `deploymentId` string, nullable, required
      - `actionAvailability` object, required
        - `canPromote` boolean, required
        - `canRollback` boolean, required
        - `canRebuild` boolean, required
        - `rebuildBlockedReason` 'deployment-not-terminal' | 'source-snapshot-unavailable' | 'repository-access-unavailable' | 'route-convergence-in-progress' | 'source-build-engine-retired' | 'null', nullable, required
        - `rebuildRecoveryAction` DeploymentRebuildRecoveryAction, required
          - `kind` 'oauth' | 'refresh' | 'install' | 'manage' | 'review' | 'disabled', required
          - `label` string, required
          - `href` string, nullable, required
          - `disabled` boolean, required
          - `reason` string, nullable, required
        - `rebuildDescriptor` object, nullable, required
          - `repository` string, required
          - `branch` string, required
          - `commitSha` string, required
          - `domain` string, required: The project's official address the redeploy serves: its linked domain once one serves it, otherwise its eurobase.dev host
        - `compatibleOutputKind` 'runtime_image' | 'static_artifact' | 'app_release' | 'none', required
        - `blockedReason` string, nullable, required
        - `targetDeploymentId` string, nullable, required
      - `assetType` 'app' | 'container' | 'null', nullable
      - `assetId` string, nullable
      - `canonicalContainerDetailPath` string, nullable
      - `previewCaptureStatus` 'pending' | 'ready' | 'failed' | 'null', nullable
      - `previewCapturedAt` string, date-time, nullable
      - `previewImageUrl` string, uri-reference, nullable: Same-origin API-owned authenticated preview image route path. Container deployment previews are exposed only on the selected project container detail screen model; generic deployment detail and container list rows keep this null. Missing preview storage read capability also returns null instead of failing the parent screen model.
      - `previewRefreshGeneration` integer, nullable
      - `previewRefreshStatus` 'pending' | 'failed' | 'null', nullable
      - `previewRefreshRequestedAt` string, date-time, nullable
      - `previewRefreshFailedAt` string, date-time, nullable
      - `previewRefreshError` string, nullable
      - `routeConvergence` object, nullable
        - `state` 'recovering' | 'exhausted' | 'ready', required
        - `statusLabel` string, required
        - `pollRecommended` boolean, required
      - `providerMetadata` DeploymentProviderMetadata
        - `visibility` string, nullable
        - `supersededByDeploymentId` string, nullable
        - `customDomainStatus` string, nullable
        - `resolution` string, nullable
      - `lifecycle` DeploymentLifecycle
        - `source` 'api_projection', required
        - `phases` DeploymentLifecyclePhase[], required
          - `key` 'initialize' | 'build' | 'deploy' | 'verify', required
          - `label` 'Initialize' | 'Build' | 'Deploy' | 'Verify', required
          - `status` 'pending' | 'running' | 'recovering' | 'completed' | 'failed' | 'skipped' | 'unavailable', required
          - `startedAt` string, date-time, nullable, required
          - `endedAt` string, date-time, nullable, required
          - `durationMs` integer, nullable, required
          - `detailLabel` string, nullable, required
          - `skipReason` 'image-only' | 'null', nullable, required
      - `timingEvidence` DeploymentTimingEvidence
        - `version` 'deployment-timing-evidence-v2' | 'deployment-timing-evidence-v3', required
        - `complete` boolean, required
        - `outcome` 'healthy' | 'rolled_back' | 'failed' | 'unhealthy' | 'null', nullable, required
        - `totalMs` integer, nullable, required
        - `userTotalMs` integer, nullable, required
        - `builderTimingsVersion` 'railpack-phase-timings-v1' | 'railpack-phase-timings-v2' | 'railpack-phase-timings-v3' | 'source-build-phase-timings-v1' | 'null', nullable, required
        - `builderTimingsMs` object, nullable, required
        - `publicMarkerProof` object, nullable, required
          - `deploymentId` string, required
          - `acceptedDigest` string, required
          - `sourceFingerprint` string, required
          - `requestIdSha256` string, required
          - `apiObservedAt` string, date-time, required
        - `triggerReceivedAt` string, date-time, nullable, required
        - `requestedAt` string, date-time, nullable, required
        - `buildDispatchAt` string, date-time, nullable, required
        - `builderReadyAt` string, date-time, nullable, required
        - `callbackReceivedAt` string, date-time, nullable, required
        - `callbackAcceptedAt` string, date-time, nullable, required
        - `deployDispatchAt` string, date-time, nullable, required
        - `deployWorkerClaimedAt` string, date-time, nullable, required
        - `deployRunnerStartedAt` string, date-time, nullable, required
        - `deployRunnerReadyAt` string, date-time, nullable, required
        - `providerRequestStartedAt` string, date-time, nullable, required
        - `providerReadyAt` string, date-time, nullable, required
        - `brandedRouteProvedAt` string, date-time, nullable, required
        - `activatedAt` string, date-time, nullable, required
        - `terminalAt` string, date-time, nullable, required
        - `warmRunnerTimingsMs` object, nullable, required
          - `dispatchToWorkerClaimMs` integer, nullable, required
          - `workerClaimToRunnerStartMs` integer, nullable, required
          - `runnerStartToProviderRequestMs` integer, nullable, required
          - `providerRequestToReadyMs` integer, nullable, required
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
    - `sourceIdentity` union, required
      - object
        - `kind` 'configured_framework', required
        - `framework` 'next' | 'vite' | 'astro' | 'sveltekit' | 'nuxt' | 'node' | 'express' | 'nestjs' | 'fastify' | 'bun' | 'deno' | 'python' | 'django' | 'fastapi' | 'flask' | 'laravel' | 'custom', required
        - `label` 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime' | 'Configured framework: Automatic runtime', required
      - object
        - `kind` 'source', required
        - `framework` unknown, required
        - `label` 'Source: Code build' | 'Source: Dockerfile build' | 'Source: Image registry', required
    - `actionAvailability` ProjectContainerActionAvailability, required
      - `canDeploy` boolean, required
      - `canRedeploy` boolean, required
      - `blockedReason` 'not-authorized' | 'container-not-configured' | 'container-deploy-in-flight' | 'container-delete-in-flight' | 'container-tier-unmanaged' | 'container-source-project-repo-missing' | 'container-source-installation-missing' | 'container-image-ref-required' | 'container-runtime-tier-unavailable' | 'project-key-revoked' | 'project-provider-access-not-ready' | 'null', nullable, required
      - `recoveryAction` 'configure_source' | 'open_github' | 'open_settings' | 'request_plan_change' | 'null', nullable, required
      - `targetContainerId` string, nullable, required
    - `route` ProjectContainerRoute, required
      - `hostname` string, required
      - `productUrl` string, uri, nullable, required: Allocated Eurobase Function URL when known. Clients may display this value before route readiness, but Copy/Open actions require status=ready.
      - `accessMode` 'public' | 'private', required
      - `accessMapped` boolean, required
      - `gatewayRegistrationReady` boolean, required
      - `brandedHostGatewayProven` boolean, required
      - `status` 'pending' | 'ready' | 'failed', required
      - `statusLabel` string, required
      - `reasonCode` string, required
      - `statusMessage` string, required
    - `secretStatusView` ProjectContainerSecretStatusView, required
      - `state` 'none' | 'current' | 'not_deployed' | 'redeploy_required' | 'restart_required' | 'restart_queued' | 'failed' | 'unknown', required
      - `label` string, required
      - `tone` 'ready' | 'deploying' | 'failed' | 'draft', required
      - `canRestart` boolean, required
  - `deployment` Deployment, required
    - `id` string, required
    - `projectId` string, required
    - `version` integer, required
    - `deploymentMode` 'runtime' | 'static', required
    - `runtime` 'workers' | 'container' | 'static', required: Where this deployment runs: a Worker, a container, or static files.
    - `runtimeWorkersReason` string, nullable, required: Why a Workers route of this deployment runs as a container instead, as short display copy of the build Job detection reason; null otherwise or when the reason has no display copy.
    - `primaryHostname` string, nullable: The deployment's project's official address today (see ProjectSummary.primaryHostname).
    - `provider` 'scaleway' | 'null', nullable: Owner/admin deployment detail proof only; list and contributor surfaces omit this field.
    - `imageRef` string, nullable: Owner/admin deployment detail proof only; list and contributor surfaces omit this field.
    - `rollbackTargetImageRef` string, nullable: Owner/admin deployment detail rollback proof only; list and contributor surfaces omit this field.
    - `status` 'queued' | 'building' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back', required
    - `displayStatus` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back' | 'status_check_delayed', required
    - `releaseKind` 'runtime_release' | 'static_release' | 'deployment_attempt', required
    - `statusView` DeploymentStatusView, required
      - `code` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back' | 'status_check_delayed', required
      - `primaryCode` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'healthy' | 'unhealthy' | 'failed' | 'rolled_back', required
      - `primaryLabel` string, required
      - `secondaryLabel` string, nullable, required
      - `tone` 'neutral' | 'active' | 'success' | 'warning' | 'danger', required
      - `freshnessLabel` 'Live' | 'Refreshing' | 'Status delayed' | 'null', nullable, required
    - `terminal` boolean, required
    - `visible` boolean, required
    - `stale` boolean, required
    - `freshness` 'fresh' | 'reconciling' | 'stale', required
    - `lastObservedAt` string, date-time, required
    - `lastProvenExecutionPhase` 'queued' | 'waiting_for_builder' | 'building_image' | 'waiting_for_deploy_runner' | 'deploying' | 'null', nullable, required
    - `displayStatusReasonCode` 'none' | 'builder_capacity_wait_exceeded' | 'build_output_delayed' | 'deploy_runner_wait_exceeded' | 'deploy_execution_delayed' | 'projection_evidence_conflict', required
    - `statusReason` string, nullable
    - `failureSummary` DeploymentFailureSummary
      - `category` 'clone_failed' | 'build_failed' | 'image_push_failed' | 'deploy_failed' | 'healthcheck_failed' | 'runtime_startup_failed' | 'runtime_startup_timeout' | 'app_health_failed' | 'route_activation_failed' | 'platform_capacity_failed' | 'invalid_runtime_config' | 'internal_platform_error', required
      - `phase` 'queue' | 'build' | 'deploy' | 'healthcheck' | 'system', required
      - `severity` 'info' | 'warning' | 'error', required
      - `headline` string, required
      - `detail` string, nullable: One short line: the typed failure reason in owner copy, never the raw reason code.
      - `explanation` string, nullable: The full failure sentence shown in the status popover, when it says more than detail.
      - `fixCommand` string, nullable: The command named in explanation that fixes the failure, offered for copying.
      - `observedAt` string, date-time, required
    - `artifactType` 'static_archive' | 'null', nullable
    - `artifactRef` string, nullable: Internal static artifact object key is withheld from member-readable responses; member clients must use deployableOutput.
    - `artifactSha256` string, nullable
    - `publishTarget` string, nullable: Internal static publish prefix is withheld from member-readable responses; member clients must use deployableOutput.
    - `detailRevision` string: Changes only when lifecycle, immutable output or preview detail is invalidated.
    - `deployableOutput` object, required
      - `kind` 'runtime_image' | 'static_artifact' | 'app_release' | 'none', required
      - `digest` string, nullable, required
      - `displayLabel` string, required
      - `releaseId` string, nullable
      - `deploymentId` string, nullable, required
    - `actionAvailability` object, required
      - `canPromote` boolean, required
      - `canRollback` boolean, required
      - `canRebuild` boolean, required
      - `rebuildBlockedReason` 'deployment-not-terminal' | 'source-snapshot-unavailable' | 'repository-access-unavailable' | 'route-convergence-in-progress' | 'source-build-engine-retired' | 'null', nullable, required
      - `rebuildRecoveryAction` DeploymentRebuildRecoveryAction, required
        - `kind` 'oauth' | 'refresh' | 'install' | 'manage' | 'review' | 'disabled', required
        - `label` string, required
        - `href` string, nullable, required
        - `disabled` boolean, required
        - `reason` string, nullable, required
      - `rebuildDescriptor` object, nullable, required
        - `repository` string, required
        - `branch` string, required
        - `commitSha` string, required
        - `domain` string, required: The project's official address the redeploy serves: its linked domain once one serves it, otherwise its eurobase.dev host
      - `compatibleOutputKind` 'runtime_image' | 'static_artifact' | 'app_release' | 'none', required
      - `blockedReason` string, nullable, required
      - `targetDeploymentId` string, nullable, required
    - `assetType` 'app' | 'container' | 'null', nullable
    - `assetId` string, nullable
    - `canonicalContainerDetailPath` string, nullable
    - `previewCaptureStatus` 'pending' | 'ready' | 'failed' | 'null', nullable
    - `previewCapturedAt` string, date-time, nullable
    - `previewImageUrl` string, uri-reference, nullable: Same-origin API-owned authenticated preview image route path. Container deployment previews are exposed only on the selected project container detail screen model; generic deployment detail and container list rows keep this null. Missing preview storage read capability also returns null instead of failing the parent screen model.
    - `previewRefreshGeneration` integer, nullable
    - `previewRefreshStatus` 'pending' | 'failed' | 'null', nullable
    - `previewRefreshRequestedAt` string, date-time, nullable
    - `previewRefreshFailedAt` string, date-time, nullable
    - `previewRefreshError` string, nullable
    - `routeConvergence` object, nullable
      - `state` 'recovering' | 'exhausted' | 'ready', required
      - `statusLabel` string, required
      - `pollRecommended` boolean, required
    - `providerMetadata` DeploymentProviderMetadata
      - `visibility` string, nullable
      - `supersededByDeploymentId` string, nullable
      - `customDomainStatus` string, nullable
      - `resolution` string, nullable
    - `lifecycle` DeploymentLifecycle
      - `source` 'api_projection', required
      - `phases` DeploymentLifecyclePhase[], required
        - `key` 'initialize' | 'build' | 'deploy' | 'verify', required
        - `label` 'Initialize' | 'Build' | 'Deploy' | 'Verify', required
        - `status` 'pending' | 'running' | 'recovering' | 'completed' | 'failed' | 'skipped' | 'unavailable', required
        - `startedAt` string, date-time, nullable, required
        - `endedAt` string, date-time, nullable, required
        - `durationMs` integer, nullable, required
        - `detailLabel` string, nullable, required
        - `skipReason` 'image-only' | 'null', nullable, required
    - `timingEvidence` DeploymentTimingEvidence
      - `version` 'deployment-timing-evidence-v2' | 'deployment-timing-evidence-v3', required
      - `complete` boolean, required
      - `outcome` 'healthy' | 'rolled_back' | 'failed' | 'unhealthy' | 'null', nullable, required
      - `totalMs` integer, nullable, required
      - `userTotalMs` integer, nullable, required
      - `builderTimingsVersion` 'railpack-phase-timings-v1' | 'railpack-phase-timings-v2' | 'railpack-phase-timings-v3' | 'source-build-phase-timings-v1' | 'null', nullable, required
      - `builderTimingsMs` object, nullable, required
      - `publicMarkerProof` object, nullable, required
        - `deploymentId` string, required
        - `acceptedDigest` string, required
        - `sourceFingerprint` string, required
        - `requestIdSha256` string, required
        - `apiObservedAt` string, date-time, required
      - `triggerReceivedAt` string, date-time, nullable, required
      - `requestedAt` string, date-time, nullable, required
      - `buildDispatchAt` string, date-time, nullable, required
      - `builderReadyAt` string, date-time, nullable, required
      - `callbackReceivedAt` string, date-time, nullable, required
      - `callbackAcceptedAt` string, date-time, nullable, required
      - `deployDispatchAt` string, date-time, nullable, required
      - `deployWorkerClaimedAt` string, date-time, nullable, required
      - `deployRunnerStartedAt` string, date-time, nullable, required
      - `deployRunnerReadyAt` string, date-time, nullable, required
      - `providerRequestStartedAt` string, date-time, nullable, required
      - `providerReadyAt` string, date-time, nullable, required
      - `brandedRouteProvedAt` string, date-time, nullable, required
      - `activatedAt` string, date-time, nullable, required
      - `terminalAt` string, date-time, nullable, required
      - `warmRunnerTimingsMs` object, nullable, required
        - `dispatchToWorkerClaimMs` integer, nullable, required
        - `workerClaimToRunnerStartMs` integer, nullable, required
        - `runnerStartToProviderRequestMs` integer, nullable, required
        - `providerRequestToReadyMs` integer, nullable, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required

## Other responses

- `409`: Container deploy is blocked by quota or by a recoverable project or provider state
- `503`: Quota evidence is temporarily unavailable; quota-state-unavailable confirms restoration, while quota-recovery-unavailable means atomic restoration did not commit and internal convergence is still required; no deployment or job is created

---

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