<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sangmin Lee</title>
    <description>The latest articles on DEV Community by Sangmin Lee (@claudeguide).</description>
    <link>https://dev.to/claudeguide</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3946361%2F45852601-611d-4e7b-a381-c122ca373b5a.jpg</url>
      <title>DEV Community: Sangmin Lee</title>
      <link>https://dev.to/claudeguide</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/claudeguide"/>
    <language>en</language>
    <item>
      <title>Claude API vision_error (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sun, 05 Jul 2026 01:31:33 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-visionerror-invalidrequesterror-weoningwa-haegyeolbeob-1e6b</link>
      <guid>https://dev.to/claudeguide/claude-api-visionerror-invalidrequesterror-weoningwa-haegyeolbeob-1e6b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-vision-error?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-vision-error" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-vision-error&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API vision_error (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API vision_error invalid_request_error는 이미지 형식, 크기, 또는 인코딩이 모델 요구사항과 불일치에 발생합니다 (2026 기준).&lt;/strong&gt; 이미지 입력 오류이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;vision_error&lt;/code&gt; 에러 서브타입는 이미지 형식, 크기, 또는 인코딩이 모델 요구사항과 불일치을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;지원 안 되는 이미지 포맷 (예: WebP, BMP — JPEG/PNG/GIF/WebP만)&lt;/li&gt;
&lt;li&gt;단일 이미지 5MB 초과 (base64 인코딩 후)&lt;/li&gt;
&lt;li&gt;이미지 dimensions 8000×8000 초과&lt;/li&gt;
&lt;li&gt;URL 이미지의 Content-Type이 image/* 아님&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
# Validate image before sending
from PIL import Image
import io, base64

def safe_image_block(image_bytes: bytes):
    img = Image.open(io.BytesIO(image_bytes))
    if img.format not in ("JPEG", "PNG", "GIF", "WEBP"):
        raise ValueError(f"Unsupported format: {img.format}")
    if img.size[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API tool_use_error (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sun, 05 Jul 2026 01:30:50 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-tooluseerror-invalidrequesterror-weoningwa-haegyeolbeob-g19</link>
      <guid>https://dev.to/claudeguide/claude-api-tooluseerror-invalidrequesterror-weoningwa-haegyeolbeob-g19</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-tool-use-error?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-tool-use-error" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-tool-use-error&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API tool_use_error (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API tool_use_error invalid_request_error는 tool_choice / tool_result / tool_use 형식이 schema와 불일치에 발생합니다 (2026 기준).&lt;/strong&gt; Tool use 형식 오류이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tool_use_error&lt;/code&gt; 에러 서브타입는 tool_choice / tool_result / tool_use 형식이 schema와 불일치을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;tool_use_id가 tool_result와 매칭 안 됨&lt;/li&gt;
&lt;li&gt;tool_choice를 specific tool로 했지만 해당 tool 미정의&lt;/li&gt;
&lt;li&gt;input_schema가 JSON Schema draft 2020-12 위반&lt;/li&gt;
&lt;li&gt;messages에 tool_use는 있는데 다음 turn에 tool_result 없음&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Validate tool_use → tool_result pairing before sending
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_tool_pairing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;pending_tool_uses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;pending_tool_uses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pending_tool_uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;pending_tool_uses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_use_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pending_tool_uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unmatched tool_use IDs: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pending_tool_uses&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  해결 코드 (TypeScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
typescript
function validateToolPairing(messages) {
  const pending: string[] = [];
  for (const msg of messages) {
    if (msg.role === "assistant") {
      for (const b of msg.content ?? []) {
        if (b.type === "tool_use") pending.push(b.id);
      }
    } else if (msg.role === "user") {
      for (const b of msg.content ?? []) {
        if (b.type === "tool_result") {
          const idx = pending.indexOf(b.tool_use_id);
          if (idx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API streaming_error (api_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sun, 05 Jul 2026 01:30:47 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-streamingerror-apierror-weoningwa-haegyeolbeob-46pa</link>
      <guid>https://dev.to/claudeguide/claude-api-streamingerror-apierror-weoningwa-haegyeolbeob-46pa</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-streaming-error?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-streaming-error" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-streaming-error&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API streaming_error (api_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API streaming_error api_error는 SSE 스트림이 중간에 끊기거나 malformed event 발생에 발생합니다 (2026 기준).&lt;/strong&gt; 스트리밍 응답 중단이며, exponential backoff 재시도가 효과적해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;streaming_error&lt;/code&gt; 에러 서브타입는 SSE 스트림이 중간에 끊기거나 malformed event 발생을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"api_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;긴 응답 중 connection timeout (&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API prompt_too_long (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sun, 05 Jul 2026 01:30:04 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-prompttoolong-invalidrequesterror-weoningwa-haegyeolbeob-7i7</link>
      <guid>https://dev.to/claudeguide/claude-api-prompttoolong-invalidrequesterror-weoningwa-haegyeolbeob-7i7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-prompt-too-long?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-prompt-too-long" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-prompt-too-long&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API prompt_too_long (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API prompt_too_long invalid_request_error는 단일 messages 또는 누적 conversation이 모델 context window 초과에 발생합니다 (2026 기준).&lt;/strong&gt; 프롬프트가 너무 김이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;prompt_too_long&lt;/code&gt; 에러 서브타입는 단일 messages 또는 누적 conversation이 모델 context window 초과을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;200K context 모델에 250K 토큰 입력&lt;/li&gt;
&lt;li&gt;Long-running 챗봇의 누적 history 미관리&lt;/li&gt;
&lt;li&gt;PDF/문서 첨부 토큰 미계산&lt;/li&gt;
&lt;li&gt;RAG context를 무한정 추가&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Trim conversation to fit budget before sending
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;trim_to_budget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_budget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200_000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count_tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;input_tokens&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;output_budget&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Fallback to summarize older content
&lt;/span&gt;            &lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;summarize_old_msgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;  &lt;span class="c1"&gt;# drop oldest user+assistant pair
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  해결 코드 (TypeScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trimToBudget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputBudget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;input_tokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;countTokens&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;system&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;outputBudget&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;summarizeOldMsgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  재시도하지 마세요
&lt;/h2&gt;

&lt;p&gt;이 에러는 &lt;strong&gt;클라이언트 측 문제&lt;/strong&gt;라 재시도해도 같은 결과입니다. 위 원인을 확인하고 요청을 수정한 뒤 재발송하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  비용 영향
&lt;/h2&gt;

&lt;p&gt;이 에러는 요청이 처리되지 않았으므로 비용이 청구되지 않습니다. 단, 잘못된 모델로 요청을 반복하다가 다른 에러가 발생할 수 있으니 모니터링이 필요합니다.&lt;/p&gt;

&lt;p&gt;자세한 비용 절감 패턴은 &lt;a href="https://dev.to/claude-api-cost-prompt-caching-break-even"&gt;Claude API Cost and Prompt Caching Break-Even&lt;/a&gt; 또는 무료 &lt;a href="https://dev.to/calculator"&gt;비용 계산기&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  관련 에러
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-400"&gt;400 invalid_request_error&lt;/a&gt; — 잘못된 요청 형식&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-401"&gt;401 authentication_error&lt;/a&gt; — 인증 실패&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-403"&gt;403 permission_error&lt;/a&gt; — 권한 부족&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-429"&gt;429 rate_limit_error&lt;/a&gt; — Rate limit 초과&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-529"&gt;529 overloaded_error&lt;/a&gt; — API 일시 과부하&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  자주 묻는 질문
&lt;/h2&gt;

&lt;h3&gt;
  
  
  prompt_too_long 에러가 떴을 때 비용이 청구되나요?
&lt;/h3&gt;

&lt;p&gt;처리되지 않은 요청이므로 청구되지 않습니다. 단, 무한 재시도 루프는 다른 에러로 비용을 발생시킬 수 있습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  prompt_too_long와 다른 에러의 차이는?
&lt;/h3&gt;

&lt;p&gt;prompt_too_long는 클라이언트 측 문제로 &lt;strong&gt;요청 수정 없이는 재시도해도 같은 결과&lt;/strong&gt;입니다. 5xx 에러 (500/529)는 일시적 서버 이슈라 재시도가 효과적입니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bedrock/Vertex에서도 같은 에러 코드인가요?
&lt;/h3&gt;

&lt;p&gt;네, Anthropic의 &lt;code&gt;error.type&lt;/code&gt; 명명 규칙은 모든 deployment (Direct API, AWS Bedrock, GCP Vertex AI)에서 동일합니다. 다만 HTTP 상태 코드는 platform 별로 wrapping되어 다를 수 있습니다 (예: Bedrock은 에러 type을 다른 prefix로 변경).&lt;/p&gt;




&lt;h2&gt;
  
  
  다음 단계
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;프로덕션 코드에 retry 로직을 추가하려면 &lt;a href="https://dev.to/claude-agent-sdk-guide"&gt;Production Patterns for Claude Agents&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;비용을 모니터링하려면 &lt;a href="https://dev.to/claude-%EB%B9%84%EC%9A%A9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;Claude API 비용 모니터링 가이드&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;에러 분류 자동화는 무료 &lt;a href="https://dev.to/cheatsheet-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;/cheatsheet-한국어&lt;/a&gt;에서 30개 프롬프트로&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API model_not_found (not_found_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sun, 05 Jul 2026 01:30:01 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-modelnotfound-notfounderror-weoningwa-haegyeolbeob-29ge</link>
      <guid>https://dev.to/claudeguide/claude-api-modelnotfound-notfounderror-weoningwa-haegyeolbeob-29ge</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-model-not-found?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-model-not-found" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-model-not-found&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API model_not_found (not_found_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API model_not_found not_found_error는 지정한 model 문자열이 존재하지 않거나 deprecated된 경우에 발생합니다 (2026 기준).&lt;/strong&gt; 모델 이름 오류이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;model_not_found&lt;/code&gt; 에러 서브타입는 지정한 model 문자열이 존재하지 않거나 deprecated된 경우을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"not_found_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;오타 (예: &lt;code&gt;claude-sonnet-4&lt;/code&gt; → 정답: &lt;code&gt;claude-sonnet-4-5&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Deprecated 모델 사용 (&lt;code&gt;claude-2.0&lt;/code&gt;, &lt;code&gt;claude-instant-1.2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Legacy 형식 (&lt;code&gt;claude-sonnet-4-5-20240229&lt;/code&gt;) — 신형식 권장&lt;/li&gt;
&lt;li&gt;Bedrock 사용 시 region에 미배포된 모델&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;VALID_MODELS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# Add aliases as Anthropic releases them
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;VALID_MODELS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; not in valid set. Use one of: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;VALID_MODELS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  해결 코드 (TypeScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VALID_MODELS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validateModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;VALID_MODELS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; invalid`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  구버전 모델 마이그레이션 가이드
&lt;/h2&gt;

&lt;p&gt;기존 코드에서 deprecated 모델 이름을 사용하고 있다면 다음 매핑으로 교체하세요:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구버전 (deprecated)&lt;/th&gt;
&lt;th&gt;신버전 (2026)&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-2.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;범용 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-2.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;범용 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-instant-1.2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;빠른 처리 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-3-haiku-20240307&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Haiku 세대 업그레이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-3-5-sonnet-20241022&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sonnet 세대 업그레이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-3-opus-20240229&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opus 세대 업그레이드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;코드베이스 전체 마이그레이션:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 구버전 모델 이름을 일괄 검색&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"claude-2&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;claude-3&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;claude-instant"&lt;/span&gt; ./src &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.py"&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.ts"&lt;/span&gt;

&lt;span class="c"&gt;# 발견된 파일에서 모델 이름을 상수로 분리한 뒤 중앙 관리&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;모델 이름을 코드 전체에 하드코딩하면 Anthropic이 새 모델을 출시할 때마다 여러 파일을 수정해야 합니다. &lt;code&gt;MODEL_REGISTRY&lt;/code&gt; 딕셔너리나 환경변수(&lt;code&gt;CLAUDE_MODEL=claude-sonnet-4-5&lt;/code&gt;)로 중앙 관리하면 한 곳만 수정하면 됩니다.&lt;/p&gt;




&lt;h2&gt;
  
  
  재시도하지 마세요
&lt;/h2&gt;

&lt;p&gt;이 에러는 &lt;strong&gt;클라이언트 측 문제&lt;/strong&gt;라 재시도해도 같은 결과입니다. 위 원인을 확인하고 요청을 수정한 뒤 재발송하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  비용 영향
&lt;/h2&gt;

&lt;p&gt;이 에러는 요청이 처리되지 않았으므로 비용이 청구되지 않습니다. 단, 잘못된 모델로 요청을 반복하다가 다른 에러가 발생할 수 있으니 모니터링이 필요합니다.&lt;/p&gt;

&lt;p&gt;자세한 비용 절감 패턴은 &lt;a href="https://dev.to/claude-api-cost-prompt-caching-break-even"&gt;Claude API Cost and Prompt Caching Break-Even&lt;/a&gt; 또는 무료 &lt;a href="https://dev.to/calculator"&gt;비용 계산기&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  2026 Claude 모델 이름 레지스트리
&lt;/h2&gt;

&lt;p&gt;다음 표는 2026년 기준 유효한 모델 이름 목록입니다. 이 외의 문자열은 &lt;code&gt;model_not_found&lt;/code&gt;를 유발합니다:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델 이름&lt;/th&gt;
&lt;th&gt;용도&lt;/th&gt;
&lt;th&gt;컨텍스트 윈도우&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;빠른 처리, 분류, 간단한 Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;범용 고성능&lt;/td&gt;
&lt;td&gt;200K / 1M (확장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;복잡한 추론, 전략&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5-20250514&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;haiku-4-5 고정 버전&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5-20250514&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sonnet-4-5 고정 버전&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;자주 틀리는 이름 패턴:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;claude-sonnet-4&lt;/code&gt; (틀림) → &lt;code&gt;claude-sonnet-4-5&lt;/code&gt; (정답)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude-3-5-sonnet&lt;/code&gt; (틀림, 구버전) → &lt;code&gt;claude-sonnet-4-5&lt;/code&gt; (신버전)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude-opus-4-5&lt;/code&gt; (틀림) → &lt;code&gt;claude-opus-4&lt;/code&gt; (정답)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude-4-sonnet&lt;/code&gt; (틀림) → &lt;code&gt;claude-sonnet-4-5&lt;/code&gt; (정답)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  빠른 진단 체크리스트
&lt;/h2&gt;

&lt;p&gt;모델 이름 오류를 빠르게 찾는 체크리스트:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] 모델 이름이 위 레지스트리 테이블과 정확히 일치하는가?&lt;/li&gt;
&lt;li&gt;[ ] 코드에서 하드코딩된 모델 이름을 상수로 관리하고 있는가? (분산된 하드코딩 → 오타 위험)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;VALID_MODELS&lt;/code&gt; 세트에서 사전 검증 후 API를 호출하고 있는가?&lt;/li&gt;
&lt;li&gt;[ ] 구버전 모델(&lt;code&gt;claude-2.0&lt;/code&gt;, &lt;code&gt;claude-instant-1.2&lt;/code&gt;)에서 마이그레이션됐는가?&lt;/li&gt;
&lt;li&gt;[ ] AWS Bedrock 사용 시 모델 이름 대신 ARN(&lt;code&gt;arn:aws:bedrock:...&lt;/code&gt;)을 사용하는가?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  프로덕션 모니터링
&lt;/h2&gt;

&lt;p&gt;모델 이름은 배포 시 고정되므로, 코드 배포 직후 모델 유효성을 사전 검증하는 패턴이 효과적입니다:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude.model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2026 유효 모델 집합 — 신규 모델 출시 시 업데이트
&lt;/span&gt;&lt;span class="n"&gt;VALID_MODELS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-haiku-4-5-20250514&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-5-20250514&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;safe_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;VALID_MODELS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_not_found — 배포 전 모델 이름 점검 필요&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requested_model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valid_models&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VALID_MODELS&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;은 유효하지 않은 모델입니다. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;사용 가능: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VALID_MODELS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  언제 지원팀에 연락해야 하나요?
&lt;/h2&gt;

&lt;p&gt;model_not_found는 항상 클라이언트 코드 수정으로 해결됩니다. 다음 경우에만 &lt;a href="https://support.anthropic.com" rel="noopener noreferrer"&gt;support.anthropic.com&lt;/a&gt;에 문의하세요:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Anthropic 문서에 명시된 이름을 정확히 사용했는데 not_found_error가 반환되는 경우&lt;/li&gt;
&lt;li&gt;[ ] Bedrock에서 특정 리전에서만 모델을 찾지 못하는 경우 (리전 배포 확인 필요)&lt;/li&gt;
&lt;li&gt;[ ] 이전에 정상 동작하던 모델 이름이 갑자기 not_found를 반환하는 경우 (deprecated 가능성 → 공식 마이그레이션 가이드 요청)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  관련 에러
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-400"&gt;400 invalid_request_error&lt;/a&gt; — 잘못된 요청 형식&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-401"&gt;401 authentication_error&lt;/a&gt; — 인증 실패&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-403"&gt;403 permission_error&lt;/a&gt; — 권한 부족&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-429"&gt;429 rate_limit_error&lt;/a&gt; — Rate limit 초과&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-529"&gt;529 overloaded_error&lt;/a&gt; — API 일시 과부하&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  자주 묻는 질문
&lt;/h2&gt;

&lt;h3&gt;
  
  
  model_not_found 에러가 떴을 때 비용이 청구되나요?
&lt;/h3&gt;

&lt;p&gt;처리되지 않은 요청이므로 청구되지 않습니다. 단, 무한 재시도 루프는 다른 에러로 비용을 발생시킬 수 있습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  model_not_found와 다른 에러의 차이는?
&lt;/h3&gt;

&lt;p&gt;model_not_found는 클라이언트 측 문제로 &lt;strong&gt;요청 수정 없이는 재시도해도 같은 결과&lt;/strong&gt;입니다. 5xx 에러 (500/529)는 일시적 서버 이슈라 재시도가 효과적입니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bedrock/Vertex에서도 같은 에러 코드인가요?
&lt;/h3&gt;

&lt;p&gt;네, Anthropic의 &lt;code&gt;error.type&lt;/code&gt; 명명 규칙은 모든 deployment (Direct API, AWS Bedrock, GCP Vertex AI)에서 동일합니다. 다만 HTTP 상태 코드는 platform 별로 wrapping되어 다를 수 있습니다 (예: Bedrock은 에러 type을 다른 prefix로 변경).&lt;/p&gt;




&lt;h2&gt;
  
  
  다음 단계
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;프로덕션 코드에 retry 로직을 추가하려면 &lt;a href="https://dev.to/claude-agent-sdk-guide"&gt;Production Patterns for Claude Agents&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;비용을 모니터링하려면 &lt;a href="https://dev.to/claude-%EB%B9%84%EC%9A%A9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;Claude API 비용 모니터링 가이드&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;에러 분류 자동화는 무료 &lt;a href="https://dev.to/cheatsheet-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;/cheatsheet-한국어&lt;/a&gt;에서 30개 프롬프트로&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API max_tokens (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:31:33 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-maxtokens-invalidrequesterror-weoningwa-haegyeolbeob-20gi</link>
      <guid>https://dev.to/claudeguide/claude-api-maxtokens-invalidrequesterror-weoningwa-haegyeolbeob-20gi</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-max-tokens?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-max-tokens" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-max-tokens&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API max_tokens (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API max_tokens invalid_request_error는 max_tokens가 모델별 출력 한도를 초과한 경우에 발생합니다 (2026 기준).&lt;/strong&gt; max_tokens 한도 초과이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;max_tokens&lt;/code&gt; 에러 서브타입는 max_tokens가 모델별 출력 한도를 초과한 경우을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sonnet 4.5: max_tokens 8192 한도&lt;/li&gt;
&lt;li&gt;Opus 4.5: max_tokens 8192 한도&lt;/li&gt;
&lt;li&gt;Haiku 4.5: max_tokens 8192 한도&lt;/li&gt;
&lt;li&gt;Sonnet extended thinking 시: 64K (별도 옵션)&lt;/li&gt;
&lt;li&gt;오래된 모델 (Sonnet 3.5)에 대해 새 한도 사용&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
MAX_OUTPUT = {
    "claude-haiku-4-5": 8192,
    "claude-sonnet-4-5": 8192,
    "claude-opus-4-5": 8192,
}

def safe_max_tokens(model: str, requested: int) -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API invalid_api_key (authentication_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:30:50 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-invalidapikey-authenticationerror-weoningwa-haegyeolbeob-4791</link>
      <guid>https://dev.to/claudeguide/claude-api-invalidapikey-authenticationerror-weoningwa-haegyeolbeob-4791</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-invalid-api-key?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-invalid-api-key" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-invalid-api-key&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API invalid_api_key (authentication_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API invalid_api_key authentication_error는 API key 문자열 자체가 손상되었거나 형식이 맞지 않는 경우에 발생합니다 (2026 기준).&lt;/strong&gt; 잘못된 API key 형식이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;invalid_api_key&lt;/code&gt; 에러 서브타입는 API key 문자열 자체가 손상되었거나 형식이 맞지 않는 경우을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"authentication_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"authentication_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;환경변수 설정 시 따옴표 포함 (예: ANTHROPIC_API_KEY="sk-ant-...")&lt;/li&gt;
&lt;li&gt;key 끝의 줄바꿈 문자 (echo 명령으로 echo $key | xxd 확인)&lt;/li&gt;
&lt;li&gt;다른 LLM provider key를 잘못 사용 (OpenAI sk-xxx 등)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Strip quotes if accidentally wrapped
&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-ant-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid format: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  해결 코드 (TypeScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ANTHROPIC_API_KEY&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;"'&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;"'&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;$/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sk-ant-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Invalid format: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;...`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  환경별 API Key 설정 방법
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;로컬 개발 환경 (.env 파일)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env 파일 — 따옴표 없이 설정&lt;/span&gt;
&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-ant-api03-xxxxxxxx...

&lt;span class="c"&gt;# 읽기 전용 모드로 설정 (선택 사항)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Docker 환경&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile에 key를 하드코딩하지 말 것&lt;/span&gt;
&lt;span class="c"&gt;# docker run -e ANTHROPIC_API_KEY=sk-ant-... 또는&lt;/span&gt;
&lt;span class="c"&gt;# docker-compose.yml의 environment 섹션에서 host 환경변수 참조:&lt;/span&gt;
&lt;span class="c"&gt;# environment:&lt;/span&gt;
&lt;span class="c"&gt;#   - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub Actions / CI 환경&lt;/strong&gt;&lt;br&gt;
Repository Settings → Secrets and variables → Actions → "New repository secret"에 &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;를 추가하고, workflow 파일에서 &lt;code&gt;${{ secrets.ANTHROPIC_API_KEY }}&lt;/code&gt;로 참조합니다. Secrets는 로그에서 자동으로 마스킹됩니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vercel / Netlify 환경&lt;/strong&gt;&lt;br&gt;
대시보드 → Environment Variables에서 &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;를 추가한 다음 반드시 재배포를 실행해야 변경사항이 적용됩니다. 빌드 시점과 런타임 모두에 설정이 필요한 경우 "Exposed to browser"는 비활성화 상태로 유지하세요.&lt;/p&gt;


&lt;h2&gt;
  
  
  재시도하지 마세요
&lt;/h2&gt;

&lt;p&gt;이 에러는 &lt;strong&gt;클라이언트 측 문제&lt;/strong&gt;라 재시도해도 같은 결과입니다. 위 원인을 확인하고 요청을 수정한 뒤 재발송하세요.&lt;/p&gt;


&lt;h2&gt;
  
  
  비용 영향
&lt;/h2&gt;

&lt;p&gt;이 에러는 요청이 처리되지 않았으므로 비용이 청구되지 않습니다. 단, 잘못된 모델로 요청을 반복하다가 다른 에러가 발생할 수 있으니 모니터링이 필요합니다.&lt;/p&gt;

&lt;p&gt;자세한 비용 절감 패턴은 &lt;a href="https://dev.to/claude-api-cost-prompt-caching-break-even"&gt;Claude API Cost and Prompt Caching Break-Even&lt;/a&gt; 또는 무료 &lt;a href="https://dev.to/calculator"&gt;비용 계산기&lt;/a&gt;를 참고하세요.&lt;/p&gt;


&lt;h2&gt;
  
  
  invalid_api_key vs authentication_error 차이
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;invalid_api_key&lt;/code&gt;는 &lt;code&gt;authentication_error&lt;/code&gt; 타입의 하위 케이스입니다. &lt;code&gt;error.message&lt;/code&gt; 필드에 "invalid x-api-key" 또는 "invalid API key" 같은 문구가 포함되어 있으면 키 형식 또는 만료 문제로 좁힐 수 있습니다. 반면 &lt;code&gt;authentication_error&lt;/code&gt;가 발생하지만 메시지에 key 관련 내용이 없다면 조직(Organization) 계정 문제이거나 서비스 인증 설정 오류일 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;에러 구분 코드:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_auth_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API key 형식 또는 만료 문제 — key 재발급&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;organization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;조직 계정 문제 — Console에서 조직 상태 확인&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;인증 문제 (기타): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  빠른 진단 체크리스트
&lt;/h2&gt;

&lt;p&gt;API key 형식 문제를 단계별로 찾아내는 체크리스트:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] key가 &lt;code&gt;sk-ant-api03-&lt;/code&gt;로 시작하는가? (&lt;code&gt;sk-ant-&lt;/code&gt;만 있고 &lt;code&gt;api03-&lt;/code&gt; 없으면 구버전 key)&lt;/li&gt;
&lt;li&gt;[ ] 환경변수 설정 시 따옴표로 감싸지 않았는가? (&lt;code&gt;KEY="value"&lt;/code&gt; 형식은 따옴표가 값에 포함됨)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;printenv ANTHROPIC_API_KEY | wc -c&lt;/code&gt; 명령으로 예상 문자 수(약 108자)와 일치하는가?&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;printenv ANTHROPIC_API_KEY | xxd | tail -1&lt;/code&gt; 로 마지막 바이트가 &lt;code&gt;0a&lt;/code&gt; (줄바꿈)인지 확인했는가?&lt;/li&gt;
&lt;li&gt;[ ] Docker/K8s 환경이라면 Secret이 올바르게 마운트됐는가?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  프로덕션 모니터링
&lt;/h2&gt;

&lt;p&gt;key 형식 검증은 애플리케이션 시작 시점에 한 번만 수행하는 것이 효율적입니다. 런타임 중에 key 손상을 감지하는 패턴:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import re, os, logging

logger = logging.getLogger("claude.key")

# Anthropic API key 정규식 패턴 (2026 기준)
_KEY_PATTERN = re.compile(r"^sk-ant-api\d{2}-[A-Za-z0-9_\-]{95,}$")

def validate_api_key(key: str) -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API file_upload_error (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:30:47 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-fileuploaderror-invalidrequesterror-weoningwa-haegyeolbeob-3ihn</link>
      <guid>https://dev.to/claudeguide/claude-api-fileuploaderror-invalidrequesterror-weoningwa-haegyeolbeob-3ihn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-file-upload-error?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-file-upload-error" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-file-upload-error&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API file_upload_error (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API file_upload_error invalid_request_error는 Files API에 파일 업로드 시 형식/크기/MIME-type 오류에 발생합니다 (2026 기준).&lt;/strong&gt; Files API 업로드 실패이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;file_upload_error&lt;/code&gt; 에러 서브타입는 Files API에 파일 업로드 시 형식/크기/MIME-type 오류을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;파일이 32MB 초과 (Files API 한도)&lt;/li&gt;
&lt;li&gt;MIME type이 application/pdf, image/* 외&lt;/li&gt;
&lt;li&gt;Beta 헤더 누락 (&lt;code&gt;anthropic-beta: files-api-2025-04-14&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Files API 미사용 region (Bedrock 일부 region)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Use Files API for large attachments
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic-beta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;files-api-2025-04-14&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doc.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# use in messages.create
&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;document&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  해결 코드 (TypeScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createReadStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;doc.pdf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;document&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;file_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Summarize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anthropic-beta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;files-api-2025-04-14&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  재시도하지 마세요
&lt;/h2&gt;

&lt;p&gt;이 에러는 &lt;strong&gt;클라이언트 측 문제&lt;/strong&gt;라 재시도해도 같은 결과입니다. 위 원인을 확인하고 요청을 수정한 뒤 재발송하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  비용 영향
&lt;/h2&gt;

&lt;p&gt;이 에러는 요청이 처리되지 않았으므로 비용이 청구되지 않습니다. 단, 잘못된 모델로 요청을 반복하다가 다른 에러가 발생할 수 있으니 모니터링이 필요합니다.&lt;/p&gt;

&lt;p&gt;자세한 비용 절감 패턴은 &lt;a href="https://dev.to/claude-api-cost-prompt-caching-break-even"&gt;Claude API Cost and Prompt Caching Break-Even&lt;/a&gt; 또는 무료 &lt;a href="https://dev.to/calculator"&gt;비용 계산기&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  관련 에러
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-400"&gt;400 invalid_request_error&lt;/a&gt; — 잘못된 요청 형식&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-401"&gt;401 authentication_error&lt;/a&gt; — 인증 실패&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-403"&gt;403 permission_error&lt;/a&gt; — 권한 부족&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-429"&gt;429 rate_limit_error&lt;/a&gt; — Rate limit 초과&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-529"&gt;529 overloaded_error&lt;/a&gt; — API 일시 과부하&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  자주 묻는 질문
&lt;/h2&gt;

&lt;h3&gt;
  
  
  file_upload_error 에러가 떴을 때 비용이 청구되나요?
&lt;/h3&gt;

&lt;p&gt;처리되지 않은 요청이므로 청구되지 않습니다. 단, 무한 재시도 루프는 다른 에러로 비용을 발생시킬 수 있습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  file_upload_error와 다른 에러의 차이는?
&lt;/h3&gt;

&lt;p&gt;file_upload_error는 클라이언트 측 문제로 &lt;strong&gt;요청 수정 없이는 재시도해도 같은 결과&lt;/strong&gt;입니다. 5xx 에러 (500/529)는 일시적 서버 이슈라 재시도가 효과적입니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bedrock/Vertex에서도 같은 에러 코드인가요?
&lt;/h3&gt;

&lt;p&gt;네, Anthropic의 &lt;code&gt;error.type&lt;/code&gt; 명명 규칙은 모든 deployment (Direct API, AWS Bedrock, GCP Vertex AI)에서 동일합니다. 다만 HTTP 상태 코드는 platform 별로 wrapping되어 다를 수 있습니다 (예: Bedrock은 에러 type을 다른 prefix로 변경).&lt;/p&gt;




&lt;h2&gt;
  
  
  다음 단계
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;프로덕션 코드에 retry 로직을 추가하려면 &lt;a href="https://dev.to/claude-agent-sdk-guide"&gt;Production Patterns for Claude Agents&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;비용을 모니터링하려면 &lt;a href="https://dev.to/claude-%EB%B9%84%EC%9A%A9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;Claude API 비용 모니터링 가이드&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;에러 분류 자동화는 무료 &lt;a href="https://dev.to/cheatsheet-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;/cheatsheet-한국어&lt;/a&gt;에서 30개 프롬프트로&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API context_length_exceeded (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:30:03 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-contextlengthexceeded-invalidrequesterror-weoningwa-haegyeolbeob-3d1p</link>
      <guid>https://dev.to/claudeguide/claude-api-contextlengthexceeded-invalidrequesterror-weoningwa-haegyeolbeob-3d1p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-context-length-exceeded?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-context-length-exceeded" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-context-length-exceeded&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API context_length_exceeded (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API context_length_exceeded invalid_request_error는 messages 누적 토큰 + max_tokens가 모델의 context window 초과에 발생합니다 (2026 기준).&lt;/strong&gt; 컨텍스트 길이 초과이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;context_length_exceeded&lt;/code&gt; 에러 서브타입는 messages 누적 토큰 + max_tokens가 모델의 context window 초과을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sonnet 4.5 1M context를 사용 중인데 max_tokens가 1M-요청토큰보다 큼&lt;/li&gt;
&lt;li&gt;긴 system prompt + 누적된 conversation history&lt;/li&gt;
&lt;li&gt;PDF/document 첨부의 token 사용량 미고려&lt;/li&gt;
&lt;li&gt;Tool result가 messages에 누적되어 폭증&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import anthropic

# Pre-compute token usage with the count_tokens endpoint
client = anthropic.Anthropic()
response = client.messages.count_tokens(
    model="claude-sonnet-4-5",
    messages=conversation_history,
    system="You are a helpful assistant.",
)
input_tokens = response.input_tokens
context_window = 200_000  # or 1_000_000 for Sonnet 4.5 1M context
budget = context_window - input_tokens

if budget &amp;lt; 1024:
    # Trim conversation: drop oldest messages
    while budget &amp;lt; 4096 and len(conversation_history)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API cache_error (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:30:01 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-cacheerror-invalidrequesterror-weoningwa-haegyeolbeob-4kec</link>
      <guid>https://dev.to/claudeguide/claude-api-cacheerror-invalidrequesterror-weoningwa-haegyeolbeob-4kec</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-cache-error?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-cache-error" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-cache-error&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API cache_error (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API cache_error invalid_request_error는 cache_control 사용 시 형식 또는 위치 오류에 발생합니다 (2026 기준).&lt;/strong&gt; Prompt Caching 오류이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cache_error&lt;/code&gt; 에러 서브타입는 cache_control 사용 시 형식 또는 위치 오류을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;cache_control이 messages 배열의 4번째 break-point 초과&lt;/li&gt;
&lt;li&gt;ephemeral 외 type 사용 (현재 ephemeral만 지원)&lt;/li&gt;
&lt;li&gt;cache_control을 system 또는 messages 외에 적용&lt;/li&gt;
&lt;li&gt;TTL 미지원 (자동 5분 만료)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Cache static prefix (system + few-shot examples)
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LONG_STATIC_INSTRUCTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# 1000+ tokens
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cache_control&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ephemeral&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;# cache this
&lt;/span&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Reuse within 5 minutes for 90% cost savings on cached portion
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  해결 코드 (TypeScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LONG_STATIC_INSTRUCTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cache_control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ephemeral&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  재시도하지 마세요
&lt;/h2&gt;

&lt;p&gt;이 에러는 &lt;strong&gt;클라이언트 측 문제&lt;/strong&gt;라 재시도해도 같은 결과입니다. 위 원인을 확인하고 요청을 수정한 뒤 재발송하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  비용 영향
&lt;/h2&gt;

&lt;p&gt;이 에러는 요청이 처리되지 않았으므로 비용이 청구되지 않습니다. 단, 잘못된 모델로 요청을 반복하다가 다른 에러가 발생할 수 있으니 모니터링이 필요합니다.&lt;/p&gt;

&lt;p&gt;자세한 비용 절감 패턴은 &lt;a href="https://dev.to/claude-api-cost-prompt-caching-break-even"&gt;Claude API Cost and Prompt Caching Break-Even&lt;/a&gt; 또는 무료 &lt;a href="https://dev.to/calculator"&gt;비용 계산기&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  관련 에러
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-400"&gt;400 invalid_request_error&lt;/a&gt; — 잘못된 요청 형식&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-401"&gt;401 authentication_error&lt;/a&gt; — 인증 실패&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-403"&gt;403 permission_error&lt;/a&gt; — 권한 부족&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-429"&gt;429 rate_limit_error&lt;/a&gt; — Rate limit 초과&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-529"&gt;529 overloaded_error&lt;/a&gt; — API 일시 과부하&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  자주 묻는 질문
&lt;/h2&gt;

&lt;h3&gt;
  
  
  cache_error 에러가 떴을 때 비용이 청구되나요?
&lt;/h3&gt;

&lt;p&gt;처리되지 않은 요청이므로 청구되지 않습니다. 단, 무한 재시도 루프는 다른 에러로 비용을 발생시킬 수 있습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  cache_error와 다른 에러의 차이는?
&lt;/h3&gt;

&lt;p&gt;cache_error는 클라이언트 측 문제로 &lt;strong&gt;요청 수정 없이는 재시도해도 같은 결과&lt;/strong&gt;입니다. 5xx 에러 (500/529)는 일시적 서버 이슈라 재시도가 효과적입니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bedrock/Vertex에서도 같은 에러 코드인가요?
&lt;/h3&gt;

&lt;p&gt;네, Anthropic의 &lt;code&gt;error.type&lt;/code&gt; 명명 규칙은 모든 deployment (Direct API, AWS Bedrock, GCP Vertex AI)에서 동일합니다. 다만 HTTP 상태 코드는 platform 별로 wrapping되어 다를 수 있습니다 (예: Bedrock은 에러 type을 다른 prefix로 변경).&lt;/p&gt;




&lt;h2&gt;
  
  
  다음 단계
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;프로덕션 코드에 retry 로직을 추가하려면 &lt;a href="https://dev.to/claude-agent-sdk-guide"&gt;Production Patterns for Claude Agents&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;비용을 모니터링하려면 &lt;a href="https://dev.to/claude-%EB%B9%84%EC%9A%A9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;Claude API 비용 모니터링 가이드&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;에러 분류 자동화는 무료 &lt;a href="https://dev.to/cheatsheet-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;/cheatsheet-한국어&lt;/a&gt;에서 30개 프롬프트로&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API billing_error (permission_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Fri, 03 Jul 2026 01:31:38 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-billingerror-permissionerror-weoningwa-haegyeolbeob-4pj3</link>
      <guid>https://dev.to/claudeguide/claude-api-billingerror-permissionerror-weoningwa-haegyeolbeob-4pj3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-billing-error?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-billing-error" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-billing-error&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API billing_error (permission_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API billing_error permission_error는 조직의 결제 정보 만료, 크레딧 부족, 또는 계정 정지 시에 발생합니다 (2026 기준).&lt;/strong&gt; 결제/크레딧 부족이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;billing_error&lt;/code&gt; 에러 서브타입는 조직의 결제 정보 만료, 크레딧 부족, 또는 계정 정지 시을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"permission_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"permission_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;선불 크레딧 잔액 0 (Console → Billing 확인)&lt;/li&gt;
&lt;li&gt;신용카드 만료/거절 (자동 충전 실패)&lt;/li&gt;
&lt;li&gt;Anthropic 약관 위반으로 일시 정지&lt;/li&gt;
&lt;li&gt;조직 admin이 spending limit을 0으로 설정&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Detect billing errors and surface to ops, not retry
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PermissionDeniedError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;billing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;credit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="c1"&gt;# Alert ops/finance — do NOT retry
&lt;/span&gt;        &lt;span class="nf"&gt;notify_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Anthropic billing issue: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;BillingError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Top up credits at console.anthropic.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  해결 코드 (TypeScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="sr"&gt;/billing|credit/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;notifyOps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Billing issue: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BillingError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Top up at console.anthropic.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  재시도하지 마세요
&lt;/h2&gt;

&lt;p&gt;이 에러는 &lt;strong&gt;클라이언트 측 문제&lt;/strong&gt;라 재시도해도 같은 결과입니다. 위 원인을 확인하고 요청을 수정한 뒤 재발송하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  비용 영향
&lt;/h2&gt;

&lt;p&gt;이 에러는 요청이 처리되지 않았으므로 비용이 청구되지 않습니다. 단, 잘못된 모델로 요청을 반복하다가 다른 에러가 발생할 수 있으니 모니터링이 필요합니다.&lt;/p&gt;

&lt;p&gt;자세한 비용 절감 패턴은 &lt;a href="https://dev.to/claude-api-cost-prompt-caching-break-even"&gt;Claude API Cost and Prompt Caching Break-Even&lt;/a&gt; 또는 무료 &lt;a href="https://dev.to/calculator"&gt;비용 계산기&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  관련 에러
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-400"&gt;400 invalid_request_error&lt;/a&gt; — 잘못된 요청 형식&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-401"&gt;401 authentication_error&lt;/a&gt; — 인증 실패&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-403"&gt;403 permission_error&lt;/a&gt; — 권한 부족&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-429"&gt;429 rate_limit_error&lt;/a&gt; — Rate limit 초과&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/claude-api-error-529"&gt;529 overloaded_error&lt;/a&gt; — API 일시 과부하&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  자주 묻는 질문
&lt;/h2&gt;

&lt;h3&gt;
  
  
  billing_error 에러가 떴을 때 비용이 청구되나요?
&lt;/h3&gt;

&lt;p&gt;처리되지 않은 요청이므로 청구되지 않습니다. 단, 무한 재시도 루프는 다른 에러로 비용을 발생시킬 수 있습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  billing_error와 다른 에러의 차이는?
&lt;/h3&gt;

&lt;p&gt;billing_error는 클라이언트 측 문제로 &lt;strong&gt;요청 수정 없이는 재시도해도 같은 결과&lt;/strong&gt;입니다. 5xx 에러 (500/529)는 일시적 서버 이슈라 재시도가 효과적입니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bedrock/Vertex에서도 같은 에러 코드인가요?
&lt;/h3&gt;

&lt;p&gt;네, Anthropic의 &lt;code&gt;error.type&lt;/code&gt; 명명 규칙은 모든 deployment (Direct API, AWS Bedrock, GCP Vertex AI)에서 동일합니다. 다만 HTTP 상태 코드는 platform 별로 wrapping되어 다를 수 있습니다 (예: Bedrock은 에러 type을 다른 prefix로 변경).&lt;/p&gt;




&lt;h2&gt;
  
  
  다음 단계
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;프로덕션 코드에 retry 로직을 추가하려면 &lt;a href="https://dev.to/claude-agent-sdk-guide"&gt;Production Patterns for Claude Agents&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;비용을 모니터링하려면 &lt;a href="https://dev.to/claude-%EB%B9%84%EC%9A%A9-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;Claude API 비용 모니터링 가이드&lt;/a&gt;를&lt;/li&gt;
&lt;li&gt;에러 분류 자동화는 무료 &lt;a href="https://dev.to/cheatsheet-%ED%95%9C%EA%B5%AD%EC%96%B4"&gt;/cheatsheet-한국어&lt;/a&gt;에서 30개 프롬프트로&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>Claude API batch_error (invalid_request_error): 원인과 해결법</title>
      <dc:creator>Sangmin Lee</dc:creator>
      <pubDate>Fri, 03 Jul 2026 01:30:53 +0000</pubDate>
      <link>https://dev.to/claudeguide/claude-api-batcherror-invalidrequesterror-weoningwa-haegyeolbeob-2515</link>
      <guid>https://dev.to/claudeguide/claude-api-batcherror-invalidrequesterror-weoningwa-haegyeolbeob-2515</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://claudeguide.io/claude-api-error-batch-error?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=claude-api-error-batch-error" rel="noopener noreferrer"&gt;claudeguide.io/claude-api-error-batch-error&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Claude API batch_error (invalid_request_error): 원인과 해결법
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Claude API batch_error invalid_request_error는 Batch API job 생성/조회/cancellation 시 형식 오류에 발생합니다 (2026 기준).&lt;/strong&gt; Batch API 요청 오류이며, 재시도하지 말고 요청 자체를 수정해야 합니다. 이 글은 5가지 흔한 원인과 Python/TypeScript 코드 예시를 다룹니다.&lt;/p&gt;

&lt;p&gt;전반적인 Claude API 에러 처리 패턴은 &lt;a href="https://dev.to/claude-api-error-handling"&gt;Claude API Error Handling 가이드&lt;/a&gt;를 참고하세요.&lt;/p&gt;




&lt;h2&gt;
  
  
  무엇을 의미하는가?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;batch_error&lt;/code&gt; 에러 서브타입는 Batch API job 생성/조회/cancellation 시 형식 오류을 의미합니다. Anthropic API의 에러 응답 본문에는 &lt;code&gt;error.type&lt;/code&gt;이 &lt;code&gt;"invalid_request_error"&lt;/code&gt;로 명시되며, &lt;code&gt;error.message&lt;/code&gt;에 구체적 사유가 옵니다.&lt;/p&gt;

&lt;p&gt;응답 예시:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  흔한 원인 5가지
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Batch당 10,000+ requests (한도 초과)&lt;/li&gt;
&lt;li&gt;단일 batch 250MB 이상&lt;/li&gt;
&lt;li&gt;Custom_id 중복 (각 request 고유해야 함)&lt;/li&gt;
&lt;li&gt;29일 만료된 batch_id 조회 시도&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  해결 코드 (Python)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
# Validate batch before submission
def validate_batch(requests: list[dict]):
    if len(requests)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>troubleshooting</category>
    </item>
  </channel>
</rss>
