---
title: "Read the declarative client-state document for the caller"
method: GET
path: "/v1/client-state"
tags: ["ClientState"]
---

# Read the declarative client-state document for the caller

`GET /v1/client-state`

Returns the state the caller's client should converge on. Scope is resolved from the actor alone — a caller can only ever read their own state, never another org's. The document is a signal, not a command: it reports whether managed requirements exist, while the vetted list stays behind POST /v1/policy/evaluate. Supports conditional GET via ETag and If-None-Match: a matching token returns 304 with no body.

## Headers

- `Authorization` string
- `if-none-match` string

## Response `200`

Default Response

- object
  - `links` object, required
    - `self` string, uri, required
  - `data` object, required
    - `id` string, required
    - `type` 'client-state', required
    - `attributes` object, required
      - `stateVersion` 1, required
      - `etag` string, required — Opaque token for the whole document. Changes whenever any field in the document changes, including agentSignals flags. Not equal to policy.fingerprint: the policy fingerprint only tracks policy changes, while the etag tracks the full document.
      - `scope` union, required — How the caller's org was resolved. `resolved` means a single org was found and the policy fields reflect it; `ambiguous` means the actor belongs to multiple orgs with no valid default; `none` means the actor belongs to no org.
        - 'resolved'
        - 'ambiguous'
        - 'none'
      - `policy` object, required
        - `managedRequirementsPresent` boolean, required — Whether the actor's org mandates any managed plugins. The vetted, policy-gated requirement list still comes from POST /v1/policy/evaluate.
        - `fingerprint` string, required — Changes whenever the org's effective policy changes. A client that sees a new fingerprint re-evaluates; an unchanged one means nothing to do.
      - `agentSignals` object, required
        - `sendToBackend` boolean, required — Whether the CLI should send agent signals to the backend. Controlled by an org-level feature flag; defaults to false when the flag is unset.

## Other responses

- `304` — Not Modified — client already has the current state
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `500` — Internal Server Error

## Changes

- **2026-09-04** `ffb03b5d287f` — 1 info
  - added the required property `data/attributes/agentSignals` to the response with the `200` status
- **2026-08-20** `536b9b70ebaa` — 2 info
  - added the new optional `header` request parameter `if-none-match`
  - added the non-success response with the status `304`
- **2026-08-18** `e7688d4122e1` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/tessl/apis/tessl-api/changes/v1/client-state/get.md)

---

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