Skip to Content
A2A Public APIError Handling

Error Handling

Error response format

{ "jsonrpc": "2.0", "error": { "code": -32010, "message": "Agent not found: unknown-agent", "data": { "agentId": "unknown-agent", "suggestion": "Use GET /v1/a2a/agents to list available agents" } } }

Error codes

CodeConstantDescriptionRetryable
-32700PARSE_ERRORInvalid JSONNo
-32600INVALID_REQUESTMalformed JSON-RPC requestNo
-32601METHOD_NOT_FOUNDUnknown JSON-RPC methodNo
-32602INVALID_PARAMSInvalid method parametersNo
-32603INTERNAL_ERRORServer-side errorYes (with backoff)
-32001TASK_NOT_FOUNDTask ID does not existNo
-32002TASK_NOT_CANCELABLETask in terminal stateNo
-32010AGENT_NOT_FOUNDAgent slug/ID not foundNo
-32011AGENT_DISABLEDAgent is disabledNo
-32012UNAUTHORIZEDInvalid or expired tokenNo (re-auth required)
-32013FORBIDDENInsufficient capabilitiesNo
-32014QUOTA_EXCEEDEDRate limit or budget exceededYes (after backoff)
-32015CROSS_TENANT_REJECTEDCross-tenant invocation without consentNo
-32016SKILL_NOT_AUTHORIZEDToken not scoped for requested skillNo

Retry guidance

The SDK handles retries automatically for retryable errors (-32603, -32014). For manual implementations:

async function invokeWithRetry(request: InvokeRequest, maxRetries = 3) { for (let attempt = 0; attempt <= maxRetries; attempt++) { try { return await fetch('/v1/a2a/invoke', { body: request }); } catch (err) { if (!isRetryable(err) || attempt === maxRetries) throw err; await sleep(Math.pow(2, attempt) * 1000); } } } function isRetryable(err: JsonRpcError): boolean { return [-32603, -32014].includes(err.error.code); }
Last updated on