Get structured, validated JSON from agent workflows. The Agent SDK supports structured outputs through JSON Schemas, ensuring your agents return data in exactly the format you need.
When to use structured outputs
Use structured outputs when you need validated JSON after an agent completes a multi-turn workflow with tools (file searches, command execution, web research, etc.).
For single API calls without tool use, see API Structured Outputs.
Structured outputs provide reliable, type-safe integration with your applications:
Define your JSON schema
Create a JSON Schema that describes the structure you want the agent to return. The schema uses standard JSON Schema format.
Add the outputFormat parameter
Include the outputFormat parameter in your query options with type: "json_schema" and your schema definition.
Run your query
The agent uses any tools it needs to complete the task (file operations, commands, web search, etc.).
Access validated output
The agent's final result will be valid JSON matching your schema, available in message.structured_output.
The Agent SDK supports the same JSON Schema features and limitations as API Structured Outputs.
Key supported features:
enum, const, required, additionalProperties (must be false)date-time, date, email, uri, uuid, etc.$ref, $def, and definitionsFor complete details on supported features, limitations, and regex pattern support, see JSON Schema limitations in the API documentation.
Here's a complete example showing an agent that searches code for TODOs and extracts git blame information:
import { query } from '@anthropic-ai/claude-agent-sdk'
// Define structure for TODO extraction
const todoSchema = {
type: 'object',
properties: {
todos: {
type: 'array',
items: {
type: 'object',
properties: {
text: { type: 'string' },
file: { type: 'string' },
line: { type: 'number' },
author: { type: 'string' },
date: { type: 'string' }
},
required: ['text', 'file', 'line']
}
},
total_count: { type: 'number' }
},
required: ['todos', 'total_count']
}
// Agent uses Grep to find TODOs, Bash to get git blame info
for await (const message of query({
prompt: 'Find all TODO comments in src/ and identify who added them',
options: {
outputFormat: {
type: 'json_schema',
schema: todoSchema
}
}
})) {
if (message.type === 'result' && message.structured_output) {
const data = message.structured_output
console.log(`Found ${data.total_count} TODOs`)
data.todos.forEach(todo => {
console.log(`${todo.file}:${todo.line} - ${todo.text}`)
if (todo.author) {
console.log(` Added by ${todo.author} on ${todo.date}`)
}
})
}
}The agent autonomously uses the right tools (Grep, Bash) to gather information and returns validated data.
If the agent cannot produce valid output matching your schema, you'll receive an error result:
for await (const msg of query({
prompt: 'Analyze the data',
options: {
outputFormat: {
type: 'json_schema',
schema: mySchema
}
}
})) {
if (msg.type === 'result') {
if (msg.subtype === 'success' && msg.structured_output) {
console.log(msg.structured_output)
} else if (msg.subtype === 'error_max_structured_output_retries') {
console.error('Could not produce valid output')
}
}
}