---
name: claude-api
description: "Anthropic Messages API (Claude API) for integrations, streaming, prompt caching, tool use, vision. Use for chatbots, assistants, or encountering rate limits, 429 errors."
license: MIT
metadata:
  version: "2.0.0"
  last_verified: "2025-11-21"
  sdk_version: "@anthropic-ai/sdk@0.70.1"
  templates_included: 12
  references_included: 7
  keywords:
    - claude api
    - anthropic api
    - messages api
    - "@anthropic-ai/sdk"
    - claude streaming
    - prompt caching
    - tool use
    - vision
    - extended thinking
    - claude 3.5 sonnet
    - claude 3.7 sonnet
    - claude sonnet 4
    - function calling
    - SSE
    - rate limits
    - 429 errors
---
# Claude API (Anthropic Messages API)

**Status**: Production Ready | **SDK**: @anthropic-ai/sdk@0.70.1

---

## Quick Start (5 Minutes)

### Node.js

```typescript
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
});

const message = await client.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [
    { role: 'user', content: 'Hello, Claude!' },
  ],
});

console.log(message.content[0].text);
```

### Cloudflare Workers

```typescript
const response = await fetch('https://api.anthropic.com/v1/messages', {
  method: 'POST',
  headers: {
    'x-api-key': env.ANTHROPIC_API_KEY,
    'anthropic-version': '2023-06-01',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    model: 'claude-sonnet-4-5-20250929',
    max_tokens: 1024,
    messages: [{ role: 'user', content: 'Hello!' }],
  }),
});

const data = await response.json();
console.log(data.content[0].text);
```

**Load `references/setup-guide.md` for complete setup with streaming, caching, and tools.**

---

## Critical Rules

### Always Do ✅

1. **Use environment variables** for API keys (NEVER hardcode)
2. **Set max_tokens** explicitly (required parameter)
3. **Pin model version** (`claude-sonnet-4-5-20250929`, not `claude-3-5-sonnet-latest`)
4. **Enable prompt caching** for repeated content (90% cost savings)
5. **Stream long responses** (`stream: true`) for better UX
6. **Handle errors** - Implement retry logic for 429, 529 errors
7. **Validate inputs** - Sanitize user messages before sending
8. **Monitor costs** - Track token usage
9. **Set timeouts** - Prevent hanging requests
10. **Use tool use properly** - Return tool_result in follow-up message

### Never Do ❌

1. **Never expose API key** in client-side code
2. **Never skip max_tokens** - API will error without it
3. **Never ignore stop_reason** - Check for `tool_use`, `end_turn`, `max_tokens`
4. **Never assume single content block** - `content` is an array
5. **Never use outdated models** - Pin to specific version
6. **Never skip error handling** - API calls can fail
7. **Never mix message roles** - Alternate user/assistant correctly
8. **Never ignore rate limits** - Implement exponential backoff
9. **Never store API keys** in logs or databases
10. **Never skip input validation** - Prevent injection attacks

---

## Top 3 Errors (Prevent 80% of Issues)

### Error #1: Rate Limit 429

**Symptom**: `429 Too Many Requests: Number of request tokens has exceeded your per-minute rate limit`

**Solution**: Implement exponential backoff with retry-after header

```typescript
async function handleRateLimit(requestFn, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await requestFn();
    } catch (error) {
      if (error.status === 429) {
        const retryAfter = error.response?.headers?.['retry-after'];
        const delay = retryAfter ? parseInt(retryAfter) * 1000 : 1000 * Math.pow(2, attempt);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
}
```

**Prevention**: Monitor rate limit headers, upgrade tier, implement backoff

---

### Error #2: Prompt Caching Not Activating

**Symptom**: High costs despite `cache_control` blocks, `cache_read_input_tokens: 0`

**Solution**: Place `cache_control` on LAST block with >= 1024 tokens

```typescript
// ❌ Wrong - cache_control not at end
{
  type: 'text',
  text: DOCUMENT,
  cache_control: { type: 'ephemeral' },  // Wrong position
},
{
  type: 'text',
  text: 'Additional text',
}

// ✅ Correct - cache_control at end
{
  type: 'text',
  text: DOCUMENT + '\n\nAdditional text',
  cache_control: { type: 'ephemeral' },  // Correct position
}
```

**Prevention**: Ensure content >= 1024 tokens, keep cached content identical, monitor usage

**Load `references/prompt-caching-guide.md` for complete caching strategy.**

---

### Error #3: Tool Use Response Format Errors

**Symptom**: `invalid_request_error: tools[0].input_schema is invalid`

**Solution**: Valid tool schema with proper JSON Schema

```typescript
// ✅ Valid tool schema
{
  name: 'get_weather',
  description: 'Get current weather',
  input_schema: {
    type: 'object',           // Must be 'object'
    properties: {
      location: {
        type: 'string',       // Valid JSON Schema types
        description: 'City'   // Optional but recommended
      }
    },
    required: ['location']    // List required fields
  }
}

// ✅ Valid tool result
{
  type: 'tool_result',
  tool_use_id: block.id,      // Must match tool_use id
  content: JSON.stringify(result)  // Convert to string
}
```

**Prevention**: Validate schemas, match tool_use_id exactly, stringify results

**Load `references/tool-use-patterns.md` + `references/top-errors.md` for all 12 errors.**

---

## Common Use Cases (Quick Patterns)

### Streaming Responses

```typescript
const stream = await client.messages.stream({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Write a story.' }],
});

for await (const event of stream) {
  if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
    process.stdout.write(event.delta.text);
  }
}
```

**Load**: `templates/streaming-chat.ts`

---

### Prompt Caching (90% Cost Savings)

```typescript
const message = await client.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  system: [
    {
      type: 'text',
      text: 'Long system prompt...',
      cache_control: { type: 'ephemeral' },
    },
  ],
  messages: [{ role: 'user', content: 'Question?' }],
});
```

**Cache lasts 5 minutes, 90% savings on cached tokens**

**Load**: `references/prompt-caching-guide.md` + `templates/prompt-caching.ts`

---

### Tool Use (Function Calling)

```typescript
const message = await client.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  tools: [{
    name: 'get_weather',
    description: 'Get weather for a location',
    input_schema: {
      type: 'object',
      properties: { location: { type: 'string' } },
      required: ['location'],
    },
  }],
  messages: [{ role: 'user', content: 'Weather in SF?' }],
});

if (message.stop_reason === 'tool_use') {
  const toolUse = message.content.find(b => b.type === 'tool_use');
  // Execute tool and send result back...
}
```

**Load**: `references/tool-use-patterns.md` + `templates/tool-use-basic.ts`

---

### Vision (Image Understanding)

```typescript
const message = await client.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [{
    role: 'user',
    content: [
      {
        type: 'image',
        source: {
          type: 'base64',
          media_type: 'image/jpeg',
          data: base64Image,
        },
      },
      { type: 'text', text: 'What is in this image?' },
    ],
  }],
});
```

**Supports**: JPEG, PNG, WebP, GIF (max 5MB)

**Load**: `references/vision-capabilities.md` + `templates/vision-image.ts`

---

### Extended Thinking Mode

```typescript
const message = await client.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 4096,
  thinking: {
    type: 'enabled',
    budget_tokens: 2000,
  },
  messages: [{ role: 'user', content: 'Solve complex problem...' }],
});

const thinking = message.content.find(b => b.type === 'thinking')?.thinking;
const answer = message.content.find(b => b.type === 'text')?.text;
```

**Load**: `templates/extended-thinking.ts`

---

## Model Versions (Current)

**Latest models:**
- `claude-sonnet-4-5-20250929` - Recommended (best performance)
- `claude-sonnet-4-20250514` - Stable version
- `claude-3-7-sonnet-20250219` - Previous generation
- `claude-3-5-sonnet-20241022` - Legacy

**Always pin to specific version** (not `-latest` suffix)

---

## When to Load References

### Load `references/setup-guide.md` when:
- First-time Claude API user needing complete setup walkthrough
- Setting up Node.js or Cloudflare Workers from scratch
- Need production deployment checklist and platform-specific tips
- Troubleshooting basic setup issues (API keys, authentication, environment)

### Load `references/prompt-caching-guide.md` when:
- Want to reduce costs by 90% on repeated content
- Using large system prompts, documents, or codebases in context
- Need detailed caching strategy with benchmarks and cost calculations
- Optimizing multi-turn conversations with conversation history caching
- Troubleshooting cache activation issues or cache misses

### Load `references/tool-use-patterns.md` when:
- Implementing function calling and tool definitions
- Need tool execution loop patterns and multi-turn tool use
- Want Zod validation examples for type-safe tools
- Troubleshooting tool use response format errors

### Load `references/vision-capabilities.md` when:
- Processing images with Claude (OCR, analysis, description)
- Need image format requirements and validation logic
- Want vision use cases and best practices
- Combining vision with tools or prompt caching

### Load `references/api-reference.md` when:
- Need complete API parameter reference and request/response schemas
- Looking up specific fields or content block types
- Want endpoint details, authentication headers, or model IDs
- Need streaming event types and SSE format details

### Load `references/top-errors.md` when:
- Encountering API errors (all 12 documented errors with solutions)
- Need error code reference (400, 401, 429, 529, etc.)
- Want comprehensive prevention strategies
- Implementing robust error handling and retry logic

### Load `references/rate-limits.md` when:
- Planning high-volume usage and scaling strategy
- Encountering 429 rate limit errors repeatedly
- Need tier limits information and upgrade path
- Optimizing request patterns to stay within limits

---

## Using Bundled Resources

### References (references/)

- **setup-guide.md** - Complete setup (Node.js + Cloudflare Workers + Next.js)
- **api-reference.md** - Complete API parameter reference + schemas
- **prompt-caching-guide.md** - 90% cost savings guide + benchmarks
- **tool-use-patterns.md** - Function calling patterns + Zod examples
- **vision-capabilities.md** - Image understanding guide + validation
- **top-errors.md** - All 12 errors with solutions + prevention
- **rate-limits.md** - Limits by tier + best practices

### Templates (templates/)

- **basic-chat.ts** - Simple chat example
- **streaming-chat.ts** - Streaming implementation with SSE
- **prompt-caching.ts** - Caching example with benchmarks
- **tool-use-basic.ts** - Basic tool use pattern
- **tool-use-advanced.ts** - Advanced multi-turn tool patterns
- **vision-image.ts** - Vision example with validation
- **extended-thinking.ts** - Extended thinking mode
- **error-handling.ts** - Complete error handling
- **nodejs-example.ts** - Complete Node.js app
- **cloudflare-worker.ts** - Complete CF Worker
- **nextjs-api-route.ts** - Next.js API route
- **package.json** - Dependencies

---

## Platform Integration

**Node.js**: `bun add @anthropic-ai/sdk` → Use templates: `nodejs-example.ts`, `basic-chat.ts`

**Cloudflare Workers**: Use fetch API → Use templates: `cloudflare-worker.ts`

**Next.js**: `bun add @anthropic-ai/sdk` → Use templates: `nextjs-api-route.ts`

---

## Production Checklist

- [ ] API key stored securely (environment variable)
- [ ] Error handling implemented (401, 429, 400, 529)
- [ ] Rate limiting with exponential backoff
- [ ] Prompt caching enabled for repeated content
- [ ] Streaming for long responses
- [ ] Input validation + output sanitization
- [ ] Monitoring and cost tracking
- [ ] Timeouts configured
- [ ] Model version pinned
- [ ] max_tokens set appropriately

---

## Related Skills

- **openai-api** - OpenAI Chat Completions for comparison
- **claude-agent-sdk** - Higher-level Claude SDK
- **ai-sdk-core** - Vercel AI SDK (supports Claude)

---

## Official Documentation

- **Messages API**: https://docs.anthropic.com/en/api/messages
- **Prompt Caching**: https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
- **Tool Use**: https://docs.anthropic.com/en/docs/build-with-claude/tool-use
- **Vision**: https://docs.anthropic.com/en/docs/build-with-claude/vision
- **Extended Thinking**: https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking

---

**Questions? Issues?**

1. Check `references/top-errors.md` for error solutions
2. Review `references/setup-guide.md` for complete setup
3. See `references/prompt-caching-guide.md` for cost optimization
4. Load templates from `templates/` for working examples
