---
title: "LM Studio — Anthropic Messages API"
aliases: [lmstudio-messages, lm-studio-anthropic-messages]
tags: [lmstudio, anthropic, api, messages, local-llm, streaming, tools]
sources: [raw/Messages.md]
created: 2026-04-30
updated: 2026-04-30
---

# LM Studio — Anthropic Messages API

The `/v1/messages` endpoint in LM Studio mirrors the Anthropic Messages API exactly — same request shape, same response shape. Use it as a local drop-in for any code already calling Anthropic's cloud API.

## Endpoint

```
POST http://localhost:1234/v1/messages
```

Required headers:
- `Content-Type: application/json`
- `x-api-key: $LM_API_TOKEN` — optional if **Require Authentication** is disabled in LM Studio

## Basic Request

```bash
curl http://localhost:1234/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $LM_API_TOKEN" \
  -d '{
    "model": "ibm/granite-4-micro",
    "max_tokens": 256,
    "messages": [
      {"role": "user", "content": "Say hello from LM Studio."}
    ]
  }'
```

## Streaming

Add `"stream": true` to receive Server-Sent Events (SSE):

```bash
curl http://localhost:1234/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $LM_API_TOKEN" \
  -d '{
    "model": "ibm/granite-4-micro",
    "messages": [{"role": "user", "content": "Hello"}],
    "max_tokens": 256,
    "stream": true
  }'
```

SSE event sequence:
1. `message_start`
2. `content_block_start`
3. `content_block_delta` (repeating)
4. `content_block_stop`
5. `message_delta`
6. `message_stop`

## Tool Use

Pass a `tools` array with JSON Schema input definitions and a `tool_choice` policy:

```bash
curl http://localhost:1234/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $LM_API_TOKEN" \
  -d '{
    "model": "ibm/granite-4-micro",
    "max_tokens": 1024,
    "tools": [
      {
        "name": "get_weather",
        "description": "Get the current weather in a given location",
        "input_schema": {
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "The city and state, e.g. San Francisco, CA"
            }
          },
          "required": ["location"]
        }
      }
    ],
    "tool_choice": {"type": "any"},
    "messages": [
      {"role": "user", "content": "What is the weather like in San Francisco?"}
    ]
  }'
```

`tool_choice` options (Anthropic-compat): `"auto"`, `"any"`, `{"type": "tool", "name": "…"}`.

## Authentication

| Scenario | Header needed |
|----------|---------------|
| Auth disabled in LM Studio | No `x-api-key` required |
| Auth enabled | `x-api-key: $LM_API_TOKEN` |

## Key Takeaways

- `POST /v1/messages` on `localhost:1234` is a drop-in for `api.anthropic.com/v1/messages`
- Same request body — swap the base URL and optionally add `x-api-key`
- Streaming uses standard Anthropic SSE event names — existing stream parsers work unchanged
- Tool use with `input_schema` / `tool_choice` is supported
- Auth header is optional when LM Studio's **Require Authentication** is off
- See [[wiki/claude-code/lmstudio-anthropic-compat|lmstudio-anthropic-compat]] for redirecting the full Anthropic SDK via env vars

## Related

- [[wiki/claude-code/lmstudio-anthropic-compat|LM Studio Anthropic Compat Setup]] — redirect Claude Code / SDK to local server
- [[wiki/claude-code/lmstudio-chat-completions|LM Studio Chat Completions]] — OpenAI-compatible `/v1/chat/completions`
- [[wiki/claude-code/lmstudio-rest-api|LM Studio REST API]] — native v1 endpoints and feature comparison table
- [[wiki/claude-code/lmstudio-idle-ttl-auto-evict|Idle TTL & Auto-Evict]] — memory management for loaded models
