---
title: "A2A v0.3.0 JSON-RPC: message/send answers with one final Message"
method: POST
path: "/v1/a2a"
tags: ["A2A"]
---

# A2A v0.3.0 JSON-RPC: message/send answers with one final Message

`POST /v1/a2a`

## Request

- Base URL: `https://api.voidly.ai`
- URL: `https://api.voidly.ai/v1/a2a`
- Auth: one of:
  - none
  - API key in header `X-Agent-Key`

A2A v0.3.0 JSON-RPC 2.0 over HTTP POST (Content-Type application/json, at most 16 KiB). message/send takes one DataPart {skill, ...inputs} or one short TextPart ("country IR", "incidents IR" or "start") and answers with one final Message: a JSON data part, plus a text part for country.status, incidents.search, agent.start, watch.add and watch.read. Other plain text of up to 200 characters gets a text-only help reply; empty text, longer text or an invalid JSON skill object is refused with -32602. Synchronous only: no task is stored, nothing streams, and there are no push notifications. Skills: country.status, incidents.search, agent.start, watch.add, watch.read, directory.search, catalog.search and capability.lookup; the agent card lists each skill's inputs. Public skills need no key; watch.add and watch.read read only the X-Agent-Key HTTP header. country.status and incidents.search return the same dated records as /v1/answers and /data/incidents, not live reachability checks. Claim verification, per-domain checks, messaging, checkout, signing and payment are not offered. 30 calls a minute per network plus each forwarded route's own limits and switches; the safety desk refuse list is checked on every call. GET answers 405.

## Request body

- A2AJsonRpcRequest
  - `jsonrpc` '2.0', required
  - `id` union, required: Required; a request without an id is refused -32600.
    - string
    - integer
  - `method` string, required: message/send. tasks/get and tasks/cancel answer -32001, message/stream and tasks/resubscribe -32004, tasks/pushNotificationConfig/* -32003, agent/getAuthenticatedExtendedCard -32007, anything else -32601.
  - `params` object
    - `message` A2AMessage, required
      - `kind` 'message', required
      - `role` 'user' | 'agent', required
      - `messageId` string, required
      - `contextId` string
      - `parts` A2APart[], required
        - `kind` 'text' | 'data', required
        - `text` string: kind text.
        - `data` object: kind data. In a request: {skill, ...inputs}.
    - `configuration` object: Optional: blocking, acceptedOutputModes, historyLength. pushNotificationConfig answers -32003.
    - `metadata` object

## Response `200`

A JSON-RPC result (one final Message) or a JSON-RPC error that is not tied to an HTTP status (-32700, -32600, -32601, -32602, -32603, -32001, -32003, -32004, -32005, -32007).

- A2AJsonRpcResponse: Exactly one of result or error. A result is one final Message: a JSON data part, plus a text part for country.status, incidents.search, agent.start, watch.add and watch.read; the help reply to unrecognised text is text only.
  - `jsonrpc` '2.0', required
  - `id` union, required: The request id; null when the request could not be read.
    - string, nullable
    - integer
  - `result` A2AMessage
    - `kind` 'message', required
    - `role` 'user' | 'agent', required
    - `messageId` string, required
    - `contextId` string
    - `parts` A2APart[], required
      - `kind` 'text' | 'data', required
      - `text` string: kind text.
      - `data` object: kind data. In a request: {skill, ...inputs}.
  - `error` A2AJsonRpcError
    - `code` integer, required: -32700 parse error, -32600 invalid request, -32601 method not found, -32602 invalid params (data.code names the refused input), -32603 internal (data.code read_unavailable), -32001 task not found, -32003 push notifications not supported, -32004 unsupported operation, -32005 incompatible content types, -32007 no authenticated extended card, -32029 rate limited, -32030 safety desk refusal, -32031 X-Agent-Key required or invalid, -32032 switched off.
    - `message` string, required
    - `data` object

## Other responses

- `400`: INVALID_A2A_PATH: the URL carries a query string or other extra parts.
- `401`: -32031: X-Agent-Key required or invalid for watch.add or watch.read.
- `403`: -32030: refused by the safety desk.
- `413`: -32600: request body over 16 KiB, or not valid UTF-8.
- `415`: -32600: Content-Type is not application/json.
- `429`: -32029 with a Retry-After header when a forwarded route rate limits, or the AppError body RATE_LIMIT_EXCEEDED (no Retry-After) when this endpoint's own 30 calls a minute per network is exceeded.
- `503`: -32032 when a forwarded route is switched off (for example the starter or inbox delivery), or {"error":{"code":"A2A_READ_ONLY_DISABLED"}} when this endpoint is switched off.

## Changes

- **2026-10-25** `a79d866dc548`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/voidly/apis/voidly-api/changes/v1/a2a/post.md)

---

[API](https://skmtc.dev/voidly/apis/voidly-api.md) - [All operations](https://skmtc.dev/voidly/apis/voidly-api/llms.txt) - [OpenAPI document](https://skmtc.dev/voidly/apis/voidly-api/revisions/c085ac335933?raw)
