What's New?
On November 14, 2025, Anthropic announced Structured Outputs in public beta for Claude Sonnet 4.5 and Opus 4.1. This feature guarantees that Claude's API responses conform exactly to your JSON schema—eliminating parsing errors, retry logic, and validation headaches.
If you've ever built production applications with LLM APIs, you know the pain: Claude (or any LLM) returns a response that's almost valid JSON. Maybe it's missing a comma, has an extra field, or uses the wrong type. You write retry logic, add validation layers, and cross your fingers.
That era is over. With Structured Outputs, Claude guarantees schema compliance on the first try—no JSON.parse() errors, no retries, no validation loops. Define your schema once in Pydantic (Python) or Zod (TypeScript), and Claude handles the rest.
Key Features
Guaranteed Schema Compliance
Claude's responses will always match your JSON schema exactly—no exceptions, no edge cases, no "usually works" caveats.
- • No JSON.parse() errors
- • No missing or extra fields
- • No type mismatches
- • First-try accuracy
Two Modes of Operation
Use JSON outputs for direct structured responses, or strict tool use for precise function calling with guaranteed schemas.
- • JSON mode: output_format parameter
- • Tool mode: strict: true flag
- • Both guarantee schema compliance
- • Choose based on use case
Pydantic Integration (Python)
Define schemas using Pydantic models. Claude SDK automatically converts them to JSON schema and validates responses.
- • Native Pydantic support
- • Type hints and validation
- • Auto-conversion to JSON schema
- • Production-ready SDK
Zod Integration (TypeScript)
Use Zod schemas for type-safe TypeScript applications. Full IDE autocomplete and compile-time safety.
- • TypeScript-first design
- • Zod schema validation
- • Full IntelliSense support
- • Compile-time type checking
How It Works: JSON Mode
Python Example with Pydantic
Define your data model using Pydantic, then pass it to Claude. The SDK handles schema conversion and validation automatically.
from anthropic import Anthropic
from pydantic import BaseModel
# Define your schema
class Recipe(BaseModel):
name: str
ingredients: list[str]
prep_time_minutes: int
difficulty: str
# Initialize client with beta header
client = Anthropic(
api_key="your-api-key",
default_headers={
"anthropic-beta": "structured-outputs-2025-11-13"
}
)
# Make request with output_format
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": "Give me a recipe for chocolate chip cookies"
}],
output_format={
"type": "json",
"schema": Recipe.model_json_schema()
}
)
# Response is guaranteed to match schema
recipe = Recipe.model_validate_json(message.content[0].text)
print(f"Recipe: {recipe.name}")
print(f"Ingredients: {recipe.ingredients}")
print(f"Time: {recipe.prep_time_minutes} minutes")
Key Point: No try/catch for JSON parsing needed. The response is guaranteed to be valid according to your Pydantic schema.
TypeScript Example with Zod
Use Zod schemas for compile-time type safety and runtime validation in TypeScript applications.
import Anthropic from "@anthropic-ai/sdk";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";
// Define Zod schema
const RecipeSchema = z.object({
name: z.string(),
ingredients: z.array(z.string()),
prep_time_minutes: z.number().int(),
difficulty: z.enum(["easy", "medium", "hard"])
});
type Recipe = z.infer;
// Initialize client
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
defaultHeaders: {
"anthropic-beta": "structured-outputs-2025-11-13"
}
});
// Make request
const message = await client.messages.create({
model: "claude-sonnet-4-5",
max_tokens: 1024,
messages: [{
role: "user",
content: "Give me a recipe for chocolate chip cookies"
}],
output_format: {
type: "json",
schema: zodToJsonSchema(RecipeSchema)
}
});
// Parse and validate (guaranteed to succeed)
const recipe: Recipe = RecipeSchema.parse(
JSON.parse(message.content[0].text)
);
console.log(`Recipe: ${recipe.name}`);
console.log(`Time: ${recipe.prep_time_minutes} minutes`);
TypeScript Benefit: Full autocomplete and type checking throughout your application. No need for manual type assertions.
Strict Tool Use Mode
When to Use Tool Mode
Use strict tool use when you want Claude to call specific functions with guaranteed parameter schemas. Perfect for:
- Multi-agent systems where tools must be called precisely
- Database queries requiring exact column names and types
- API integrations with strict parameter requirements
- Production systems where malformed tool calls break workflows
Example: Structured Search Tool
from anthropic import Anthropic
from pydantic import BaseModel
class SearchParams(BaseModel):
query: str
filters: dict[str, str]
max_results: int = 10
client = Anthropic(
default_headers={
"anthropic-beta": "structured-outputs-2025-11-13"
}
)
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=[{
"name": "search_database",
"description": "Search product database",
"input_schema": SearchParams.model_json_schema(),
"strict": True # Enable strict schema validation
}],
messages=[{
"role": "user",
"content": "Find laptops under $1000 with 16GB RAM"
}]
)
# Tool call parameters are guaranteed to match SearchParams
for block in response.content:
if block.type == "tool_use":
params = SearchParams.model_validate(block.input)
print(f"Query: {params.query}")
print(f"Filters: {params.filters}")
Guaranteed: The block.input will always have the correct fields with correct types. No defensive programming needed.
Real-World Use Cases
📊 Data Extraction Pipelines
Extract structured data from unstructured text (invoices, resumes, emails) with guaranteed schema compliance.
After: Direct extraction to typed objects
🤖 Multi-Agent Architectures
Agents communicate via structured messages. No more "agent B couldn't parse agent A's output."
Impact: Higher success rates for complex workflows
🔍 Semantic Search Tools
Build search tools with precise filtering, pagination, and sorting—guaranteed to have correct parameter types.
Schema: Query, price range, categories, sort order
📝 Form Generation & Validation
Generate forms from natural language specs, with guaranteed validation rules matching your backend.
Validation: Frontend and backend in sync
"Structured outputs are fundamental to building agentic AI stack... They make AI models more reliable and integration-friendly, unlocking new possibilities for automation and intelligent workflows."
— OpenRouter COO, on the value of structured outputs
Getting Started
Requirements
-
Models: Claude Sonnet 4.5 or Opus 4.1
-
Beta Header:
anthropic-beta: structured-outputs-2025-11-13 -
SDK: Latest Python or TypeScript SDK
Quick Start Steps
pip install anthropic
output_format or strict: true
Before vs After
| Aspect | Before (Traditional) | After (Structured Outputs) |
|---|---|---|
| JSON Parsing | Try/catch, retry on parse errors | ✓ Guaranteed valid JSON |
| Schema Validation | Manual validation, custom logic | ✓ Auto-validated by Claude |
| Error Handling | Complex retry loops, fallbacks | ✓ No retries needed |
| Type Safety | Manual casting, type assertions | ✓ Native Pydantic/Zod types |
| Development Time | Hours on validation logic | ✓ Minutes to define schema |
| Production Reliability | Edge cases cause failures | ✓ 100% schema compliance |
The Bottom Line
Structured Outputs solves one of the biggest pain points in production LLM applications: unreliable response formats. By guaranteeing JSON schema compliance, Anthropic eliminates the need for defensive programming, complex retry logic, and manual validation.
The integration with Pydantic and Zod means developers can use the tools they already know and love, with full type safety from API response to application logic. This is especially valuable for multi-agent systems, data extraction pipelines, and any application where reliability matters more than creativity.
If you're building production AI applications, structured outputs should be your default approach. The time saved on validation and error handling alone justifies the switch—and the increased reliability is just the bonus.
Start Using Structured Outputs Today
Available now in public beta for Claude Sonnet 4.5 and Opus 4.1