# Replace client service selections

> `POST` `/v1/clients/service-selections/replace`

URL: https://www.agencytitan.com/docs/tag/client-services/POST/v1/clients/service-selections/replace

Operation ID: `client_services_replace_selections`

Tag: [client_services](https://www.agencytitan.com/docs/tag/client-services.md)

## Description

Mark, star, or unmark services on a specific client record (the per-client offered + critical selections shown on the client info sheet).

Use this when the user wants to:
- mark, select, offer, attach, or assign services from the centralized list to a client
- star, flag, prioritize, or mark services as critical/key services for that client
- unmark, remove, or deselect a service from a client (without deleting the centralized service definition)
- set or update per-service notes/details on a client (the per-service rich-text field)

This is the per-client selection layer, not the centralized library. Use update_service_category / add_services_to_category / update_client_service for the centralized list itself.

Each entry in selections targets one service. is_offered controls whether the service is selected on the client; is_critical (only valid when offered) marks it as starred. Omit either flag to preserve the current value. details sets the per-service notes; pass null to clear them. The supplied selection records are committed as one atomic replacement batch; services omitted from the batch remain unchanged.

## Parameters

_None_

## Request body

- Required: yes
- Content-Type: `application/json`
  - Type: `allOf`
  - Properties:
    - `client_id` (`string`) — Exact client ID.
    - `client_name` (`string`) — Alternative exact client name.
    - `selections` (`array<anyOf>`) — One entry per service to update on the client.

## Responses

- `200` (`application/json`): Successful response.
  - Type: `object`
  - Properties:
    - `data` (`object`, required)
- `400` (`application/json`): Request validation failed (unknown or out-of-range parameters/properties are rejected).
  - Type: `object`
  - Properties:
    - `error` (`object`, required)
- `401` (`application/json`): Missing, invalid, expired, or revoked bearer token.
  - Type: `object`
  - Properties:
    - `error` (`string`, required)
    - `error_description` (`string`, required)
- `403` (`application/json`): The authenticated user does not have permission for this operation.
  - Type: `object`
  - Properties:
    - `error` (`object`, required)
- `404` (`application/json`): The requested resource was not found.
  - Type: `object`
  - Properties:
    - `error` (`object`, required)
- `409` (`application/json`): The request conflicts with an existing record or partially applied.
  - Type: `object`
  - Properties:
    - `error` (`object`, required)
- `429` (`application/json`): Per-tenant rate limit exceeded (600 requests/minute across all /v1 REST endpoints). The Retry-After header indicates how many seconds to wait.
  - Type: `object`
  - Properties:
    - `error` (`object`, required)
- `500` (`application/json`): An unexpected internal error occurred.
  - Type: `object`
  - Properties:
    - `error` (`object`, required)

## Authentication

- `bearerAuth` — http (bearer) — All /v1 endpoints (except `/v1/openapi.json` and `/v1/llms.txt`) require a bearer token. Two equal first-class paths: (1) an OAuth 2.0 access token from the au…

## Useful links

- Interactive page: https://www.agencytitan.com/docs/tag/client-services/POST/v1/clients/service-selections/replace
- API reference home: https://www.agencytitan.com/docs/
- Tag page: https://www.agencytitan.com/docs/tag/client-services.md
- This operation as Markdown: https://www.agencytitan.com/docs/tag/client-services/POST/v1/clients/service-selections/replace.md
- OpenAPI JSON: https://www.agencytitan.com/docs/openapi.json
- Full API Markdown: https://api.agencytitan.com/v1/llms.txt
- API keys: https://app.agencytitan.com/settings/api-mcp
