Conceptos
Errores
El envoltorio de error, los códigos estables, y qué hacer con cada uno.
Todo error sale con la misma forma:
{
"error": {
"code": "validation_error",
"message": "…",
"details": []
}
}
code es el contrato. Ramifica sobre él, nunca sobre el estado HTTP ni
sobre el mensaje: el mensaje está escrito para una persona y puede cambiar de
redacción sin previo aviso.
code | HTTP | cuándo |
|---|---|---|
unauthorized | 401 | credencial ausente, mal formada, desconocida o revocada |
forbidden | 403 | la credencial no tiene el permiso necesario |
not_found | 404 | no existe esa fila en esta agencia |
validation_error | 422 | cuerpo inválido, campo desconocido, transición ilegal |
rate_limited | 429 | por encima del presupuesto de la credencial |
internal_error | 500 | fallo inesperado (no se devuelven detalles) |
404 en vez de 403, a propósito
Un identificador que existe en otra agencia se responde 404 not_found,
nunca 403. Un 403 confirmaría que esa fila existe en algún sitio, y eso ya
es información: se puede recorrer un espacio de identificadores y aprender el
tamaño de la cartera del vecino. La API no confirma nada que esté fuera de tu
agencia.
Los cuerpos son estrictos
Un campo que la API no conoce es un 422, no un campo ignorado en silencio.
Un budget_maxx mal escrito falla en el momento, en vez de guardarse a medias y
descubrirse tres semanas después cuando alguien nota que el embudo no cuadra.
Las columnas de sistema — brokerage_id, id, las marcas de tiempo,
public_slug — no se alcanzan desde ningún cuerpo.
Cuando la etapa está bloqueada
Es el 422 más frecuente, y el que más información trae:
{
"error": {
"code": "validation_error",
"message": "La etapa actual tiene 4 paso(s) pendiente(s).",
"details": {
"reason": "stage_gate_blocked",
"pending_actions": [
{ "id": "ofertaPreparada", "label": "Oferta preparada con el comprador" },
{ "id": "ofertaEnviada", "label": "Oferta enviada al vendedor" },
{ "id": "respuestaVendedor", "label": "Respuesta del vendedor recibida" },
{ "id": "precioAcordado", "label": "Precio acordado" }
]
}
}
}
Nada se escribió. La transición se valida antes de tocar la fila, así que un rechazo deja la operación exactamente donde estaba. Ver Etapas.
En MCP los errores tienen dos niveles
El conector distingue dos cosas que no significan lo mismo:
- error JSON-RPC — la trama no tiene sentido: método desconocido,
paramsmal formados. Es un fallo de protocolo. isError: truedentro del resultado — la llamada funcionó y la respuesta es « no, y por esto »: un expediente que no existe, una compuerta de etapa, un permiso no concedido.
La segunda forma es deliberada: el que llama es un modelo de lenguaje, y un código de protocolo le esconde la razón. Diciéndosela, puede contarle al agente qué falta en vez de reintentar lo mismo.