---
title: "PUT /api/v1/hosting/apps/{app_id}/service_placements/configure"
method: PUT
path: "/api/v1/hosting/apps/{app_id}/service_placements/configure"
tags: ["hosting"]
---

# PUT /api/v1/hosting/apps/{app_id}/service_placements/configure

`PUT /api/v1/hosting/apps/{app_id}/service_placements/configure`

## Request

- Base URL: `https://composal.com` (the document declares no server; this is the origin it was published from)
- URL: `https://composal.com/api/v1/hosting/apps/{app_id}/service_placements/configure`
- Auth: HTTP bearer

## Path parameters

- `app_id` string, required

## Request body

- AppServicePlacementPayload
  - `app_service_id` string, required
  - `app_environment_id` string, required
  - `expected_generation` integer: Required for preview environments. Stale generations or unfinished cleanup return 409.
  - `mode` 'single_region' | 'multi_region', required
  - `rollout_strategy` 'health_gated' | 'burst', required
  - `deployment_channel` 'stable' | 'blue_green', nullable: Preview-only override; null inherits the captured source channel.
  - `replicas_per_region` integer, required
  - `targets` object[], required
    - `location_id` string, required
    - `enabled` boolean

## Response `200`

Configured service placement

- object
  - `placement` AppServicePlacement, required
    - `id` string, required
    - `organization_id` string, required
    - `hosted_app_id` string, required
    - `app_service_id` string, required
    - `app_environment_id` string, required
    - `mode` 'single_region' | 'multi_region', required
    - `rollout_strategy` 'health_gated' | 'burst', required
    - `deployment_channel` 'stable' | 'blue_green', nullable, required: Preview-only override; null inherits the captured source channel.
    - `replicas_per_region` integer, required
    - `region_count` integer, required
    - `total_replicas` integer, required
    - `targets` object[], required
      - `id` string, required
      - `location_id` string, required
      - `location` HostingLocation, required
        - `id` string, required
        - `code` string, required
        - `name` string, required
        - `nomad_datacenter` string, required
        - `created_at` string, date-time, required
        - `updated_at` string, date-time, required
      - `position` integer, required
      - `enabled` boolean, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `409`: Preview placement requires completed pause cleanup and the current generation
- `422`: Deployment request failed validation
- `502`: Bad gateway

---

[API](https://skmtc.dev/composal/apis/vex-api.md) - [All operations](https://skmtc.dev/composal/apis/vex-api/llms.txt) - [OpenAPI document](https://skmtc.dev/composal/apis/vex-api/revisions/74298a24e040?raw)
