# Error 400 de Claude en AWS Bedrock: qué significa cada mensaje

> El 400 solo indica que Bedrock rechazó la solicitud; la corrección depende del mensaje exacto y de si llamas desde Claude Code o desde tu propio código.

- URL: https://blog.laozhang.ai/es/posts/aws-claude-400-error
- Published: 2026-09-21
- Updated: 2026-09-25
- Author: LaoZhang AI Team (https://blog.laozhang.ai/es/about)
- Topic: Guías de API
- Tags: Claude, Amazon Bedrock, Claude Code, Errores de API

---
## El 400 no es el diagnóstico: el mensaje sí

Un `HTTP 400` de Claude en Amazon Bedrock solo dice que la solicitud no se aceptó. Lo que decide qué tocar es el código de excepción (`ValidationException`, `ServiceQuotaExceededException`, `IncompleteSignature`…) y, sobre todo, el texto que viene detrás. `Extra inputs are not permitted`, `Input is too long for requested model.` y `data retention mode 'default' is not available for this model` son tres 400 sin nada en común: el primero se arregla en el gateway, el segundo compactando la conversación y el tercero solo lo puede resolver quien administra la cuenta de AWS.

Antes de buscar la causa, sitúate en una de estas dos ramas:

- **Usas Claude Code** con `CLAUDE_CODE_USE_BEDROCK=1`, con Mantle (`CLAUDE_CODE_USE_MANTLE=1`), detrás de un proxy o gateway corporativo o a través de un servicio de terceros que ofrece «Claude en AWS». Claude Code habla con Bedrock únicamente mediante la API Invoke (`InvokeModel` / `InvokeModelWithResponseStream`) y no admite la API Converse ([documentación de Claude Code](https://code.claude.com/docs/en/amazon-bedrock#region-issues)). Los consejos sobre el formato de Converse no te sirven.
- **Llamas a Bedrock desde tu propio código** con `InvokeModel`, `Converse` o la API Messages de Anthropic en Bedrock. Aquí el formato del cuerpo sí es sospechoso, y cada API tiene el suyo.

Dentro de Claude Code, `/status` muestra el proveedor y la región que se están usando de verdad (`Amazon Bedrock`, `Amazon Bedrock (Mantle)` o ambos). Si lo que ves es un 403, un 429 o un 529, no estás ante un problema de 400; al final encontrarás a dónde ir en cada caso.

## Tabla rápida: mensaje, causa y corrección

Busca en tu log el fragmento que coincida. Las versiones mínimas y los identificadores son los de la documentación oficial a 24 de septiembre de 2026 y cambian a menudo.

| Fragmento del mensaje | Dónde aparece | Causa | Qué hacer |
| --- | --- | --- | --- |
| `Extra inputs are not permitted ... context_management` o `effort`; `Unexpected value(s) for the anthropic-beta header` | Claude Code tras un gateway o proxy | El intermediario reenvía campos beta del cuerpo pero elimina la cabecera `anthropic-beta` | Que el gateway reenvíe `anthropic-beta`; como alternativa, `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` |
| `"thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive"...` | Claude Code o Agent SDK | Tu versión es anterior a la mínima del modelo elegido | `claude update` y reiniciar; si no puedes, `/model` → Opus 4.6 o Sonnet 4.6 |
| `max_tokens must be greater than thinking.budget_tokens` | Claude Code en Bedrock | `MAX_THINKING_TOKENS` supera el límite de salida | Bajar `MAX_THINKING_TOKENS` o subir `CLAUDE_CODE_MAX_OUTPUT_TOKENS` |
| `Input is too long for requested model.` | Claude Code y código propio | Entrada más salida solicitada superan el límite del modelo | `/compact`, `/clear`, revisar `/context`; en código, recortar entrada o `max_tokens` |
| `tool use concurrency issues`, `orphaned tool_result`, `duplicate tool_use ID`, `thinking blocks ... cannot be modified` | Claude Code, cualquier proveedor | El historial de herramientas y razonamiento quedó incoherente | `/rewind` o Esc dos veces; con Opus 4.7/4.8, actualizar antes a v2.1.156 o superior |
| `on-demand throughput isn't supported` | Bedrock | Se usó un ID de modelo base donde hace falta un perfil de inferencia | Usar el ID del perfil de inferencia |
| 400 que nombra el ID del modelo, con Mantle activo | Claude Code con Mantle | Ese modelo no se sirve en Mantle o el ID tiene formato Invoke | ID tipo `anthropic.claude-sonnet-5` o activar ambos endpoints |
| `data retention mode 'default' is not available for this model` | Claude Fable 5 / 5.1 | El modo de retención efectivo de la cuenta en esa región es inferior a `aws_review` | Decisión del administrador de AWS (ver más abajo) |
| `The provided model identifier is invalid` | Código propio y clientes de terceros | ID incorrecto, modelo no disponible en la región o cuenta de revendedor no inscrita con Anthropic | Corregir ID y región; si es revendedor, lo resuelve el revendedor |
| `Access to Anthropic models is not allowed from unsupported countries, regions, or territories` | Cualquier API | Dirección fiscal o de facturación de la cuenta, o ubicación del equipo que llama | No se arregla cambiando de región de AWS |
| `Malformed input request: extraneous key [...] is not permitted` | Código propio | El cuerpo lleva un campo que esa API o ese modelo no admite | Ajustar el cuerpo al formato de la operación |
| `ServiceQuotaExceededException` | `InvokeModel` | Se superó una cuota de servicio de la cuenta | Reenviar más tarde o pedir aumento de cuota |

## Claude Code en Bedrock: los 400 que más se repiten

### `Extra inputs are not permitted` y la cabecera `anthropic-beta`

Claude Code envía campos que solo existen en beta, como `context_management` o `effort`, junto con una cabecera `anthropic-beta` que los activa. Si entre Claude Code y la API hay un proxy o un gateway que reenvía el cuerpo pero descarta esa cabecera, el servidor recibe campos que no reconoce y responde con `API Error: 400 ... Extra inputs are not permitted` o con `Unexpected value(s) for the anthropic-beta header` ([referencia de errores de Claude Code](https://code.claude.com/docs/en/errors#extra-inputs-are-not-permitted)).

La corrección de fondo es configurar el gateway para que reenvíe `anthropic-beta`. Si no controlas el gateway, la alternativa documentada es arrancar Claude Code con la variable ya definida, en el shell o en el bloque `env` de `~/.claude/settings.json`:

```json
{
  "env": {
    "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1"
  }
}
```

Tiene que estar presente antes de que arranque el proceso; exportarla en otra terminal con la sesión abierta no sirve. Conviene saber lo que cuesta ([variables de entorno](https://code.claude.com/docs/en/env-vars)):

- Quita las cabeceras `anthropic-beta` propias de Anthropic y los campos beta de los esquemas de herramientas (por ejemplo `defer_loading` o `eager_input_streaming`), pero conserva `name`, `description`, `input_schema` y `cache_control`, así que el almacenamiento en caché de prompts sigue funcionando.
- Desactiva la búsqueda de herramientas MCP: todas las herramientas MCP se cargan al inicio y se ignora lo que tengas en `ENABLE_TOOL_SEARCH` (desde v2.1.227, la configuración gestionada puede mantener la búsqueda activa). Con muchos servidores MCP eso consume más contexto y te acerca al error de entrada demasiado larga; si es tu caso, revisa [Claude Code y la sobrecarga de contexto por MCP: cómo elegir servidores y comprimir resultados](https://blog.laozhang.ai/es/posts/claude-code-mcp-context-overload).
- No arregla errores de ID de modelo, permisos, cuota ni retención de datos. Si después de ponerla el mensaje cambia a otro, ese otro es el problema real.

Sin gateway de por medio también puede aparecer. En un issue abierto desde el 4 de marzo de 2026, varios usuarios de `claude-code-action` con Bedrock y un perfil de inferencia de aplicación para Sonnet 4.5 reciben `API Error: 400 output_config.effort: Extra inputs are not permitted`; según sus comentarios, cambiar a Sonnet u Opus 4.6 lo resolvió ([issue #1005](https://github.com/anthropics/claude-code-action/issues/1005)). Son informes de usuarios, no una indicación oficial, pero muestran que el mismo campo puede rechazarse porque el modelo no lo acepta. Antes de tocar variables, comprueba con `/status` qué modelo se está resolviendo.

Si usas la ruta «AWS Claude» de LaoZhang API, su propia [FAQ sobre el 400 en Claude Code](https://docs.laozhang.ai/en/faq/claude-code-aws-400-validation-error) recomienda la misma variable. Solo aplica a esa ruta. LaoZhang retiró sus modelos Claude el 24 de septiembre de 2026 y [los volvió a ofrecer el 18 de octubre de 2026](https://docs.laozhang.ai/en/announcements/claude-models-2026-10).

*Aviso: [laozhang.ai es un servicio propio](https://blog.laozhang.ai/es/about#laozhang). Sus precios son nuestra tarifa, no una comparación independiente.*

### `thinking.type.enabled is not supported for this model`

El mensaje completo es `API Error: 400 ... "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior.` Significa que tu Claude Code es más antiguo que el mínimo del modelo seleccionado y todavía envía el razonamiento en el formato viejo ([referencia](https://code.claude.com/docs/en/errors#thinking-type-enabled-is-not-supported-for-this-model)).

| Modelo | Versión mínima de Claude Code |
| --- | --- |
| Opus 4.7 | v2.1.111 |
| Opus 4.8 | v2.1.154 |
| Sonnet 5 | v2.1.197 |
| Opus 5 | v2.1.219 |
| Opus 5.5 | v2.1.280 |

Ejecuta `claude update` y reinicia. Si no puedes actualizar (por ejemplo, porque la versión está fijada en tu empresa), usa `/model` y elige Opus 4.6 o Sonnet 4.6. En el Agent SDK el mínimo es el del paquete del SDK: Opus 5.5 necesita el SDK de TypeScript v0.3.280 o superior.

Ten en cuenta que, sin fijar modelo, el modelo principal por defecto de Claude Code en Bedrock es Opus 5.5 desde v2.1.280 (antes era Opus 5), y que un alias puede apuntar a un modelo que tu cuenta aún no tiene habilitado. La documentación recomienda fijarlo con `ANTHROPIC_MODEL` o con `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL` y `ANTHROPIC_DEFAULT_HAIKU_MODEL` ([fijar versiones de modelo](https://code.claude.com/docs/en/amazon-bedrock#4-pin-model-versions)). Para ver en conjunto dónde van estas variables, consulta [Configuración de Claude Code API: claves, settings.json, modelos y gateways](https://blog.laozhang.ai/es/posts/claude-code-api-configuration).

### `max_tokens must be greater than thinking.budget_tokens`

En la API de Anthropic, Claude Code ajusta estos valores solo. En Bedrock y en Google Cloud el error aparece cuando `MAX_THINKING_TOKENS` supera el límite de salida del proveedor o cuando el modo plan eleva el presupuesto de razonamiento ([referencia](https://code.claude.com/docs/en/errors#thinking-budget-exceeds-output-limit)). Baja `MAX_THINKING_TOKENS` o sube `CLAUDE_CODE_MAX_OUTPUT_TOKENS` por encima del presupuesto.

`MAX_THINKING_TOKENS=0` omite el parámetro `thinking` en proveedores de terceros, pero no es una salida universal: Opus 5.5 y los modelos Fable no permiten desactivar el razonamiento. En el lado de AWS, Claude Fable 5.1, Mythos 5.1, Mythos 5 y Fable 5 devuelven 400 si reciben `thinking.type` con `"enabled"` o `"disabled"`; aceptan `{"type": "adaptive"}` con `output_config.effort` o que no se envíe `thinking` ([razonamiento extendido en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/claude-messages-extended-thinking.html)).

### `Input is too long for requested model.`

Es la forma en que Bedrock dice lo que la API de Anthropic llama `Prompt is too long`. Llega como `ValidationException`, y el límite cuenta los tokens de entrada más la salida que pides ([AWS re:Post](https://repost.aws/knowledge-center/bedrock-validation-exception-errors)).

Desde v2.1.217, Claude Code reconoce esta redacción y compacta automáticamente como con `Prompt is too long`. En versiones anteriores la compactación automática no se activaba y hasta `/compact` fallaba con el mismo error. Por eso, lo primero es actualizar. Después:

1. `/context` para ver qué ocupa la ventana.
2. `/compact` si quieres conservar el hilo, o `/clear` si puedes empezar de nuevo.
3. `/mcp disable <nombre>` para los servidores MCP que no uses y recortar un `CLAUDE.md` demasiado grande.

Si activaste `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`, recuerda que carga todas las herramientas MCP al inicio: puede ser justo lo que llena la ventana.

### Historial roto: `tool_use`, `tool_result` y bloques de razonamiento

Estos mensajes significan lo mismo, aunque no lo parezca:

```text
API Error: 400 due to tool use concurrency issues. Run /rewind to recover the conversation.
API Error: 400 orphaned tool_result in conversation history. Run /rewind to recover the conversation.
API Error: 400 duplicate tool_use ID in conversation history. Run /rewind to recover the conversation.
API Error: 400 ... unexpected `tool_use_id` found in `tool_result` blocks
API Error: 400 ... thinking blocks ... cannot be modified
```

La secuencia de bloques `tool_use`, `tool_result` y `thinking` guardada en el historial ya no cuadra, normalmente porque se interrumpió una llamada a herramienta o se editó un turno a mitad de respuesta ([referencia](https://code.claude.com/docs/en/errors#tool-use-or-thinking-block-mismatch)). No depende de Bedrock y reintentar tal cual repite el error, porque el historial defectuoso se reenvía entero.

Ejecuta `/rewind` o pulsa Esc dos veces para volver a un punto de control anterior al turno dañado. Con Opus 4.7 u Opus 4.8, actualiza primero si tu versión es anterior a v2.1.156: esas versiones pueden provocar el error durante el uso normal de herramientas y `/rewind` no lo elimina.

### ID de modelo, prefijo de región y Mantle

Con la API Invoke, Claude Code convierte los modelos por defecto en IDs de perfil de inferencia entre regiones y elige el prefijo según tu región: `us-gov-*` → `us-gov.`, `us-*` → `us.`, `eu-*` → `eu.`, `ap-*` → `apac.`, y `global.` en el resto. Desde v2.1.224 puedes indicar tu preferencia con `ANTHROPIC_BEDROCK_REGION_PREFIX` (`us`, `eu`, `apac`, `jp`, `au` o `global`), pero es una preferencia, no una garantía ([prefijos de perfiles de inferencia](https://code.claude.com/docs/en/amazon-bedrock#cross-region-inference-profile-prefixes)).

El detalle que provoca 400 difíciles de entender: cuando Claude Code no puede consultar qué perfiles de inferencia tiene tu cuenta, aplica el prefijo sin comprobarlo. Si esa familia de perfiles no está habilitada, todas las solicitudes fallan con 400. Por eso no basta con añadir `us.` o `global.` al azar: mira qué perfiles existen en tu región y fija el ID exacto.

```bash
aws bedrock list-inference-profiles --region eu-west-1
```

Claude Code nunca reescribe los IDs de perfil ni los ARN que configures tú. Si usas perfiles de inferencia de aplicación, el permiso `bedrock:GetInferenceProfile` le permite resolver el ARN al modelo base y elegir el formato de solicitud correcto.

Si el mensaje dice `on-demand throughput isn't supported`, estás pasando el ID del modelo base donde hace falta un perfil de inferencia: usa el ID del perfil que devuelve el comando anterior.

Con Mantle las reglas cambian. Los IDs llevan el prefijo `anthropic.` y no tienen sufijo de versión, por ejemplo `anthropic.claude-sonnet-5`. Un 400 que nombra el ID del modelo significa que ese modelo no se sirve en Mantle; los IDs de perfil de Invoke como `us.anthropic.claude-sonnet-4-6` no funcionan ahí. Usa un ID con formato Mantle o activa a la vez `CLAUDE_CODE_USE_BEDROCK` y `CLAUDE_CODE_USE_MANTLE` para que Claude Code envíe cada modelo al endpoint donde existe ([errores del endpoint Mantle](https://code.claude.com/docs/en/amazon-bedrock#mantle-endpoint-errors)). Si `/status` no muestra `Amazon Bedrock (Mantle)`, la variable no está llegando al proceso.

## `data retention mode 'default' is not available` con Claude Fable

En Claude Code aparece como `API Error: 400 data retention mode 'default' is not available for this model`, por ejemplo con `global.anthropic.claude-fable-5` ([issue #66594](https://github.com/anthropics/claude-code/issues/66594), abierto desde junio de 2026). No es un fallo de Claude Code ni se arregla con variables de entorno.

Bedrock ordena los modos de retención de datos así: `none` < `default` < `aws_review` < `provider_data_share`, e `inherit` delega en el nivel superior. Claude Fable 5 y Fable 5.1 exigen como mínimo `aws_review`. Si el modo efectivo es `none` o `default`, las solicitudes a `bedrock-runtime` devuelven `ValidationException`, y en `bedrock-mantle` el modelo figura como no disponible con el motivo `This model is not available under data retention mode 'default'.` ([retención de datos en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/data-retention.html)).

Lo que implica cambiarlo, según AWS:

- Con `aws_review`, las entradas y salidas de los modelos que exigen revisión humana se conservan dentro de AWS hasta 30 días y AWS puede revisarlas. No se comparten con el proveedor del modelo.
- `provider_data_share` es un modo heredado que hoy se comporta igual (no se comparte nada); para configuraciones nuevas AWS indica `aws_review`.
- En `bedrock-runtime` el ajuste es de cuenta y por región: no existe ámbito de proyecto, afecta a todas las solicitudes de esa región y no se propaga a otras.
- Los modelos que permiten `none`, como Opus 4.8, no empiezan a conservar datos por tener un ajuste de cuenta más permisivo.
- En el lanzamiento no había interfaz en la consola: se configura por API o SDK, y una SCP de la organización puede impedir fijar cualquier modo distinto de `none`.

Como es una decisión de cumplimiento que afecta a toda la cuenta en esa región, llévala a quien administra AWS en tu organización. Para comprobar el modo actual en una región, o para que el administrador lo cambie, la documentación de AWS usa el plano de control de Bedrock (acciones IAM `bedrock:GetAccountDataRetention` y `bedrock:PutAccountDataRetention`):

```bash
# Consultar el modo actual (ejemplo de la documentación de AWS, no probado)
curl https://bedrock.us-east-1.amazonaws.com/data-retention \
  -H "Authorization: Bearer $AWS_BEARER_TOKEN_BEDROCK"

# Cambiarlo: solo tras la aprobación del responsable de la cuenta
curl -X PUT https://bedrock.us-east-1.amazonaws.com/data-retention \
  -H "Authorization: Bearer $AWS_BEARER_TOKEN_BEDROCK" \
  -H "Content-Type: application/json" \
  -d '{ "mode": "aws_review" }'
```

Si la política de tu organización no permite `aws_review`, Fable no está disponible para esa cuenta y región; cambia a un modelo que admita tu modo actual. Si estabas pensando en migrar a Fable, el precio es otra parte de la decisión: [Claude Fable 5.1 vs Opus 5: precio y coste real por tarea](https://blog.laozhang.ai/es/posts/claude-fable-5-1-migration-pricing-cache-effort).

## Si llamas a Bedrock desde tu propio código

### Cada API espera un cuerpo distinto

Muchos 400 en código propio vienen de copiar un JSON de una API y enviarlo a otra.

![Esquema de las tres formas de llamar a Claude en Bedrock: Converse lleva modelId fuera del cuerpo y messages e inferenceConfig.maxTokens dentro; InvokeModel lleva modelId fuera y anthropic_version, max_tokens y messages dentro; /anthropic/v1/messages lleva la cabecera anthropic-version y model, max_tokens y messages en el cuerpo](https://blog.laozhang.ai/posts/es/aws-claude-400-error/img/formatos-api-bedrock.webp)

- **`InvokeModel` con el formato Messages de Claude**: el modelo va en el `modelId` de la operación. El cuerpo necesita `"anthropic_version": "bedrock-2023-05-31"`, `max_tokens` y `messages` con turnos `user`/`assistant`; las instrucciones de sistema van en un campo `system` aparte ([parámetros de Claude en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html)).
- **`Converse`**: `modelId` en la ruta, contenido como `[{"text": "..."}]`, `system` como lista en el nivel superior y el límite de salida en `inferenceConfig.maxTokens`. Los campos propios del modelo van en `additionalModelRequestFields`. Si usas el ARN de un prompt de Prompt Management, no puedes enviar `additionalModelRequestFields`, `inferenceConfig`, `system` ni `toolConfig` ([Converse](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)).
- **API Messages de Anthropic en Bedrock**: en `bedrock-runtime` la base es `https://bedrock-runtime.{region}.amazonaws.com/anthropic` (la que AWS recomienda para aplicaciones nuevas); en `bedrock-mantle`, `https://bedrock-mantle.{region}.api.aws/anthropic/v1/messages`, que exige la cabecera `anthropic-version: 2023-06-01`. Aquí `model` va dentro del cuerpo: `us.anthropic.claude-sonnet-5` en el ejemplo de runtime, `anthropic.claude-sonnet-5` en el de Mantle ([API Messages en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-messages-api.html)).

La confusión más frecuente: `2023-06-01` es el valor de la cabecera de la API Messages, no el `anthropic_version` del cuerpo de `InvokeModel`, que es `bedrock-2023-05-31`. Y un campo que la operación no conoce, como `inferenceConfig` dentro de un cuerpo de `InvokeModel`, suele terminar en `Malformed input request: extraneous key [...] is not permitted`. Si el cuerpo tiene que llevar instrucciones de sistema y recibes un rechazo sobre `messages[n].role`, mira [Corrige API 400 por rol no admitido sin romper las instrucciones del sistema](https://blog.laozhang.ai/es/posts/api-400-role-system-is-not-supported-on-this-model).

### Un ejemplo mínimo que muestra el código y el mensaje

Este fragmento en Python sigue la documentación de AWS; no se ha probado contra una cuenta real. Lee la región y el ID del modelo de variables de entorno y, si falla, imprime el estado, el código de excepción y el mensaje, que es lo que necesitas para la tabla de arriba.

```python
# Ejemplo derivado de la documentación de AWS, no probado en una cuenta real.
import json
import os

import boto3
from botocore.exceptions import ClientError

client = boto3.client("bedrock-runtime", region_name=os.environ["AWS_REGION"])

body = {
    "anthropic_version": "bedrock-2023-05-31",
    "max_tokens": 256,
    "messages": [{"role": "user", "content": "Responde solo: ok"}],
}

try:
    resp = client.invoke_model(
        modelId=os.environ["BEDROCK_MODEL_ID"],  # p. ej., el ID de un perfil de inferencia
        body=json.dumps(body),
    )
    print(json.loads(resp["body"].read())["content"][0]["text"])
except ClientError as e:
    err = e.response["Error"]
    status = e.response["ResponseMetadata"]["HTTPStatusCode"]
    print(status, err["Code"], err["Message"])
```

Si esta solicitud mínima funciona y la tuya no, la diferencia está en lo que añades encima: historial, herramientas u opciones.

### Mensajes de `ValidationException` que no son de formato

AWS agrupa bajo `ValidationException` problemas que no tienen nada que ver con el JSON ([AWS re:Post](https://repost.aws/knowledge-center/bedrock-validation-exception-errors)):

- **`The provided model identifier is invalid`**: ID mal escrito o modelo no disponible en esa región. Hay un caso que no se arregla desde tu lado: si tu cuenta de AWS se gestiona a través de un socio de AWS Marketplace o un revendedor que no está inscrito en el programa de socios de Anthropic o en el Amazon Bedrock Authorized Reseller Program, recibirás este mismo mensaje. No lo corrigen cambios de código, de IAM ni solicitudes de acceso al modelo; tiene que inscribirse el revendedor.
- **`Your AWS account is not authorized to invoke this API operation`**: al usuario o rol de IAM le falta permiso para invocar modelos, aunque llegue como `ValidationException`.
- **`Access to Anthropic models is not allowed from unsupported countries, regions, or territories`**: cuenta la dirección fiscal y de facturación de la cuenta, además de la ubicación del equipo que hace la llamada. Cambiar de región de AWS no lo resuelve.
- **`"claude-..." is not supported on this API. Please use the Messages API instead.`**: el modelo solo acepta el formato Messages y estás enviando otro.
- **`Guardrail was enabled but input is in incorrect format`**: la solicitud usa una barrera de protección (guardrail) y la entrada no tiene el formato que esta espera.

Además de `ValidationException`, Bedrock usa el 400 para `IncompleteSignature` (firma incompleta, normalmente por credenciales o SDK), `InvalidAction`, `NotAuthorized` (IAM o SCP) y `RequestExpired` (el reloj del equipo va desfasado) ([códigos de error de la API de Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html)). También `ServiceQuotaExceededException`, que es el único de esta lista que AWS dice que puedes reenviar más tarde ([InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html)).

## Cuándo reintentar, cuándo parar y cuándo llamar al administrador

Un 400 de validación no se arregla reenviando la misma solicitud: el cuerpo, el historial o la cuenta siguen igual y el resultado también. Solo tiene sentido esperar y reenviar con `ServiceQuotaExceededException`. Para decidir entre reintentar, cambiar de modelo o detenerte en otros errores, tienes [¿Reintentar la API LLM o cambiar de modelo? Cinco comprobaciones](https://blog.laozhang.ai/es/posts/llm-api-retry-vs-fallback-model).

| Situación | Qué hacer |
| --- | --- |
| Campos beta, versión de Claude Code, presupuesto de razonamiento, contexto, historial roto, formato del cuerpo | Lo corriges tú; reenviar sin cambios no sirve |
| Prefijo o perfil de inferencia no habilitado, modelo no habilitado en la región | Tú, si tienes permisos para habilitarlo; si no, el administrador de AWS |
| Retención de datos, SCP, permisos de IAM, cuota, dirección fiscal | Administrador de AWS o responsable de cumplimiento |
| Cuenta a través de un revendedor no inscrito | El revendedor |
| `ServiceQuotaExceededException` | Reenviar más tarde o solicitar más cuota |

Cuando el mensaje no encaja en ninguna fila, aísla el cambio que provoca el rechazo.

![Diagrama para aislar el rechazo: se parte de una solicitud mínima; si falla, se leen el código y el mensaje y se revisan API, modelo, región y cuenta; si funciona, se añaden historial, herramientas y opciones de uno en uno, probando después de cada cambio](https://blog.laozhang.ai/posts/es/aws-claude-400-error/img/aislar-solicitud-minima.webp)

Parte de la solicitud mínima del ejemplo anterior con el mismo modelo y la misma región. Si falla, el problema está en la API, el ID, la región o la cuenta, no en tu aplicación. Si funciona, añade el historial, luego las herramientas y después las opciones, de una en una. El primer cambio que devuelve 400 es el que tienes que corregir.

### Errores que no son un 400

- **403** en Claude Code sobre Bedrock aparece como «AWS authentication failed»: credenciales caducadas o `AccessDeniedException` por falta de permisos de IAM. Si dice que no tienes acceso al ID del modelo, hay que habilitar el modelo para esa cuenta y región ([referencia](https://code.claude.com/docs/en/errors#aws-authentication-failed)). En Mantle, un 403 con credenciales válidas significa que la cuenta no tiene acceso a ese modelo.
- **429** es `ThrottlingException`, un límite de uso. Consulta [Claude Rate Exceeded: qué límite has alcanzado y cómo resolverlo](https://blog.laozhang.ai/es/posts/claude-rate-exceeded-error).
- **529** es `overloaded_error`: sobrecarga temporal del servicio, no un problema de tu solicitud.
- **404** con `FTUFormNotFilled` indica que no se envió el formulario de caso de uso de Anthropic en la cuenta.

## Cómo comprobar que de verdad quedó resuelto

- En Claude Code, `/status` debe mostrar el proveedor, la región y el modelo que esperabas. Después, repite la acción que fallaba, no un «hola» en una sesión nueva: un historial roto o un contexto lleno solo se comprueban en la conversación original.
- Si activaste `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`, verifica que la variable llega al proceso y vigila `/context`: sin búsqueda de herramientas MCP, la ventana se llena antes.
- En código propio, registra siempre el estado, el código de excepción y el mensaje juntos. Si el 400 desaparece pero surge otro código, estás ante un problema distinto: empieza de nuevo por su mensaje.
- Tras un cambio de retención, comprueba con la consulta `GET` que el modo es el esperado en la región donde invocas el modelo; el ajuste no se aplica a otras regiones.

## Preguntas frecuentes

### ¿Qué significa el error 400 en Claude Code?

Que el servidor rechazó la solicitud por algo que contiene o por el estado de la cuenta. En Claude Code sobre Bedrock las causas más habituales son un gateway que elimina la cabecera `anthropic-beta`, una versión anterior a la mínima del modelo, un presupuesto de razonamiento mayor que la salida permitida, un contexto demasiado largo, un historial de herramientas incoherente, un ID o prefijo de modelo no habilitado o el modo de retención de datos con Fable. El texto después de `API Error: 400` te dice cuál.

### ¿Sigue pasando lo de `invalid beta flag`?

Los informes de `API Error: 400 invalid beta flag` son antiguos: uno de enero de 2026 corresponde a una regresión de Claude Code 2.1.23, en un issue ya cerrado ([#21676](https://github.com/anthropics/claude-code/issues/21676)). No hace falta bajar de versión. Si hoy te aparece algo parecido, actualiza Claude Code y trátalo como el caso de la cabecera `anthropic-beta` descrito arriba.

### ¿Puedo usar `provider_data_share` para que funcione Fable?

AWS indica que `provider_data_share` es un modo heredado y que, si ya lo tienes configurado, satisface el requisito de Fable. Para configuraciones nuevas recomienda `aws_review`, que describe lo que ocurre en realidad: los datos se conservan en AWS y no se comparten con el proveedor del modelo. En ambos casos es una decisión de la cuenta que debe aprobar su responsable.

### Mi cuenta tiene acceso al modelo, pero recibo `The provided model identifier is invalid`. ¿Por qué?

Revisa tres cosas por orden: que el ID exista en la región a la que llamas (y si hace falta un perfil de inferencia con su prefijo), que no estés usando un ID con formato Invoke en Mantle o al revés, y si tu cuenta de AWS se gestiona a través de un revendedor. En este último caso, si el revendedor no está inscrito con Anthropic, ningún cambio de tu lado lo arregla.

## Fuentes

Páginas externas que cita esta guía, en el orden en que aparecen. Última actualización: 2026-09-25.

- [documentación de Claude Code](https://code.claude.com/docs/en/amazon-bedrock) (code.claude.com)
- [referencia de errores de Claude Code](https://code.claude.com/docs/en/errors) (code.claude.com)
- [variables de entorno](https://code.claude.com/docs/en/env-vars) (code.claude.com)
- [issue #1005](https://github.com/anthropics/claude-code-action/issues/1005) (github.com)
- [razonamiento extendido en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/claude-messages-extended-thinking.html) (docs.aws.amazon.com)
- [AWS re:Post](https://repost.aws/knowledge-center/bedrock-validation-exception-errors) (repost.aws)
- [issue #66594](https://github.com/anthropics/claude-code/issues/66594) (github.com)
- [retención de datos en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/data-retention.html) (docs.aws.amazon.com)
- [parámetros de Claude en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html) (docs.aws.amazon.com)
- [Converse](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html) (docs.aws.amazon.com)
- [API Messages en Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-messages-api.html) (docs.aws.amazon.com)
- [códigos de error de la API de Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html) (docs.aws.amazon.com)
- [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html) (docs.aws.amazon.com)
- [#21676](https://github.com/anthropics/claude-code/issues/21676) (github.com)
