---
title: "Count Message Tokens"
method: POST
path: "/v1/messages/count_tokens"
tags: ["messages"]
---

# Count Message Tokens

`POST /v1/messages/count_tokens`

Anthropic ``/v1/messages/count_tokens``-compatible endpoint.

Returns ``{"input_tokens": N}`` without contacting an upstream provider:
counting is local, so there is no budget reservation, pricing, or usage
logging. Authentication mirrors :func:`create_message` — hybrid mode
resolves the caller's token against the platform, standalone mode validates
the API key — so the endpoint is not an open token-counting oracle.

## Request body

- CountTokensRequest — Anthropic ``/v1/messages/count_tokens`` request. A subset of :class:`MessagesRequest`: the input fields that affect the token count, minus ``max_tokens`` and the streaming/sampling controls, since the endpoint only counts input tokens. ``context_management`` and ``betas`` are accepted for wire compatibility, but the local estimate does not apply provider-side context edits. Clients such as Claude Code call this on every turn to keep their prompt within the model's context window.
  - `betas` string[], nullable
  - `cache_control` object, nullable
  - `context_management` object, nullable
  - `messages` object[], required
  - `metadata` object, nullable
  - `model` string, required
  - `system` union
    - string
    - object[]
  - `thinking` object, nullable
  - `tool_choice` object, nullable
  - `tools` object[], nullable

## Response `200`

Successful Response

- CountTokensResponse — Anthropic ``/v1/messages/count_tokens`` response.
  - `input_tokens` integer, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/mozilla-ai/apis/otari.md) · [All operations](https://skmtc.net/mozilla-ai/apis/otari/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/mozilla-ai/otari/revisions/3f47ecc61aff/schema)
