Claude API troubleshooting · Official documentation reviewed October 9, 2026
A working Haiku 4.5 integration can fail after changing only the model name. A 400 response points to a request compatibility problem. A successful response with no visible answer can instead be a parsing, generation-budget or conversation-flow problem. Start by identifying which failure you actually have; repeatedly resending the same request is not a migration strategy.
This guide covers direct Claude Messages API integrations moving to claude-haiku-5-5. Claude apps, Claude Code login, Managed Agents and cloud-platform adapters have different interfaces. This is a source-based troubleshooting guide, not a HiseHub model-performance test. The small parser below was checked with artificial local fixtures; no paid inference or provider account was used.
First separate the three failure stages
| What you observe | First evidence to inspect | What it does not prove |
|---|---|---|
| HTTP 400 / invalid request | The actual serialized request and the error’s named field | That the model is overloaded, or a paid subscription is missing |
| HTTP 200, no visible text | Every content block and the final stop reason | That there was no generation, or no charge |
| A larger-than-expected token bill | New-model token counts, cache usage and the full prompt tier | That the same text has the same token count as Haiku 4.5 |
Keep a sanitized record of the endpoint, model ID, SDK or wrapper version, request field names, HTTP status and error category. For successful responses, add block types, stop reason and usage totals. Do not paste API keys, raw customer prompts, thinking signatures or complete private conversations into public support threads.
If the API returns 400, inspect what your wrapper actually sends
Anthropic’s Haiku migration guide identifies incompatible legacy settings. In particular, replace manual thinking.type="enabled" with thinking.type="adaptive"; remove budget_tokens. Omit temperature, top_p and top_k rather than carrying old sampling defaults forward. A final assistant prefill is also rejected; finish the request’s messages with a user turn.
A setting can survive in a provider adapter even after you remove it from your own function. Inspect the request at the client boundary, with sensitive values redacted. A saved preset, inherited default or a proxy’s compatibility layer is a separate place to check. If a plain request succeeds but the full application fails, add features back one at a time; do not change the prompt, tools, effort and output cap simultaneously.
Here is an intentionally small request body for a direct Messages API diagnostic. It is not a complete HTTP client and does not contain credentials. Sending it to a provider can incur charges; HiseHub did not run it.
{
"model": "claude-haiku-5-5",
"max_tokens": 2048,
"thinking": {"type": "adaptive"},
"output_config": {"effort": "medium"},
"messages": [
{"role": "user", "content": "Return the word ready."}
]
}
That output cap is an example, not a recommended production budget. Keep authentication and request headers in your existing supported client. If you use Bedrock, Google Cloud or another platform, use its documented model identity and adapter, not a copied first-party endpoint or request envelope.
If HTTP 200 looks empty, read blocks by type
With adaptive thinking, the first content block need not be ordinary answer text. An application that reads only content[0].text can miss a later text block. Reading block types is a client check, not evidence that the model produced a useful answer.
The following Python function accepts a complete response already decoded into a dictionary. It deliberately does not display thinking content or run tools. SDK objects and streaming events need their own adapters.
def inspect_reply(message):
blocks = message.get("content", [])
text = "".join(
block.get("text", "")
for block in blocks
if block.get("type") == "text"
)
return {
"text": text,
"stop_reason": message.get("stop_reason"),
"has_tool_use": any(
block.get("type") == "tool_use" for block in blocks
),
"missing_text": not bool(text.strip()),
}
We checked this exact function against four synthetic, locally constructed messages: thinking followed by text, thinking only with a token-limit stop, a tool-use block, and an empty completed turn. It selects later text and retains the stop/tool signals. That proves only the parser behavior on those fixtures—not API compatibility, model quality, actual latency, complete tool handling or live billing.
Next inspect the stop reason. max_tokens means the output cap was reached; tool_use means a tool step remains. refusal is a declined request, not a generic blank-answer bug. An empty end_turn can require inspecting how the conversation was continued. Do not label these four states “success” merely because the HTTP status is 200, or send all four into an unlimited retry loop.
For streaming, make the decision from the completed stream’s final status, not from the first event or a temporarily empty text buffer. Preserve tool results and conversation structure through your supported SDK. This short function is an inspection aid, not a replacement for an agent loop.
Do not reuse an answer-only output budget
Thinking and visible text share the max_tokens budget. The thinking and cost-control documentation distinguishes that hard output cap from effort, which is guidance rather than a guaranteed token count. A small limit inherited from a non-thinking request can run out before visible text appears.
Choose between a larger cap and less effort according to what the task needs; neither is automatically the cheaper path to a usable result. First remove a parser error, then compare a bounded sample of your own representative tasks. Record whether the result was accepted as well as generated-token usage. Rejections and retries still belong in the cost of the task. Our cost-per-accepted-result worksheet keeps that distinction visible.
Recount the prompt before trusting the cheaper headline price
The new tokenizer can count approximately 30% more tokens for the same text than Haiku 4.5; the exact change is content-dependent. This is not a multiplier to hardcode into a billing system. Recount with the new model and keep the actual input count. Anthropic’s token-counting guide distinguishes preflight estimates from response usage; neither a character count nor an old-model count certifies the new bill.
The Haiku 5.5 pricing table has two Standard text-token tiers: input/output at $0.10/$0.50 per million up to 100,000 prompt tokens, and $0.50/$2.50 above that boundary. The larger rates apply to the request’s tier, not merely the one token above it. Include billed thinking in output; cached input, writes and tools require their own accounting.
Hypothetical boundary example, no cache or tools: a request with 100,000 input tokens and 4,000 total billed output tokens has a $0.012 token subtotal. At 100,001 input tokens with the same output, the long-tier subtotal is $0.0600005. At 200 such requests, those token-only scenarios are $2.40 and approximately $12.00. They are chosen counts, not measured tokenization or a predicted workload.
The practical check is whether your remeasured full prompt crosses the tier. An illustrative 80,000-token old prompt becoming 104,000 would cross it; that arithmetic does not establish that your prompt will grow by exactly 30%. Use the Haiku long-tier calculator example to inspect the stated scenario. It excludes cache-write/storage/tool fees, tax and platform differences; it is not an invoice or a claim that a Claude app subscription pays every API request.
Resume conversations deliberately
Do not treat thinking blocks as portable text. The migration documentation adds account and history constraints: reuse them through their originating or linked account, and keep earlier request context unchanged where the binding rules apply. A newly written system prompt, changed tool schema or edited earlier message can turn a replay into a different request. Check the documented account-age exception rather than assuming every account enforces the same prefix behavior.
For a first diagnostic, start a fresh, non-private test conversation instead of replaying a production transcript across models or accounts. If a clean request works and replay fails, investigate history and bindings as a separate branch. Do not “repair” signatures, delete required tool results or strip history indiscriminately just to silence an error.
A small rollout checklist that catches different failures
- Plain answer: validate the final request fields and parse every returned block type.
- Tool round trip: verify that the tool result returns to the correct conversation; record whether a final answer actually follows.
- Longest ordinary prompt: recount with the new model and check the pricing tier before evaluating cost.
- Tight output cap: make sure truncated or thinking-only output is reported as incomplete, not accepted.
- Continued conversation: check history/account bindings independently of the fresh-request case.
- Failure handling: impose a retry/spend bound and distinguish rejection, refusal, truncation and tool continuation.
Define what an accepted result means for each task before comparing models. Keep the previous route available until your own acceptance checks pass. The checklist is an editorial rollout plan; HiseHub did not execute a provider migration for you. A lower listed token rate or a benchmark position does not verify your adapter, prompts or error handling.
Scope, sources and related decisions
Reviewed October 9, 2026 against current primary documentation. Haiku 5.5’s API release was October 7; this article is not a claim of a new October 9 launch or consumer-plan access. Local synthetic parser checks and the calculator’s displayed arithmetic are distinct from paid inference. Model output, real account access and invoices were not tested.
- Anthropic: Haiku 5.5 migration changes
- Anthropic: Haiku 5.5 identity and pricing
- Anthropic: token counting
- Anthropic: thinking steering and cost
- Anthropic: stop reasons
For a different decision, see Sonnet 5.5 vs Opus 5.5, the Model Access Map, or our Claude Code billing-route guide. They address model selection, documented access and who pays—not the request-parser failure diagnosed here.
