A2A 1.0 JSON-RPC Protocol
curl --request POST \
--url https://api.wirebox.sh/a2a/{agent_handle} \
--header 'Content-Type: application/json' \
--data '
{
"params.message": {
"messageId": "<string>",
"role": "<string>",
"parts": [
{}
],
"taskId": "<string>",
"contextId": "<string>"
},
"params.configuration": {
"returnImmediately": true
},
"params.taskId": "<string>",
"params.limit": 123,
"params.cursor": "<string>",
"params.reason": "<string>"
}
'import requests
url = "https://api.wirebox.sh/a2a/{agent_handle}"
payload = {
"params.message": {
"messageId": "<string>",
"role": "<string>",
"parts": [{}],
"taskId": "<string>",
"contextId": "<string>"
},
"params.configuration": { "returnImmediately": True },
"params.taskId": "<string>",
"params.limit": 123,
"params.cursor": "<string>",
"params.reason": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
'params.message': {
messageId: '<string>',
role: '<string>',
parts: [{}],
taskId: '<string>',
contextId: '<string>'
},
'params.configuration': {returnImmediately: true},
'params.taskId': '<string>',
'params.limit': 123,
'params.cursor': '<string>',
'params.reason': '<string>'
})
};
fetch('https://api.wirebox.sh/a2a/{agent_handle}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.wirebox.sh/a2a/{agent_handle}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'params.message' => [
'messageId' => '<string>',
'role' => '<string>',
'parts' => [
[
]
],
'taskId' => '<string>',
'contextId' => '<string>'
],
'params.configuration' => [
'returnImmediately' => true
],
'params.taskId' => '<string>',
'params.limit' => 123,
'params.cursor' => '<string>',
'params.reason' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.wirebox.sh/a2a/{agent_handle}"
payload := strings.NewReader("{\n \"params.message\": {\n \"messageId\": \"<string>\",\n \"role\": \"<string>\",\n \"parts\": [\n {}\n ],\n \"taskId\": \"<string>\",\n \"contextId\": \"<string>\"\n },\n \"params.configuration\": {\n \"returnImmediately\": true\n },\n \"params.taskId\": \"<string>\",\n \"params.limit\": 123,\n \"params.cursor\": \"<string>\",\n \"params.reason\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.wirebox.sh/a2a/{agent_handle}")
.header("Content-Type", "application/json")
.body("{\n \"params.message\": {\n \"messageId\": \"<string>\",\n \"role\": \"<string>\",\n \"parts\": [\n {}\n ],\n \"taskId\": \"<string>\",\n \"contextId\": \"<string>\"\n },\n \"params.configuration\": {\n \"returnImmediately\": true\n },\n \"params.taskId\": \"<string>\",\n \"params.limit\": 123,\n \"params.cursor\": \"<string>\",\n \"params.reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wirebox.sh/a2a/{agent_handle}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"params.message\": {\n \"messageId\": \"<string>\",\n \"role\": \"<string>\",\n \"parts\": [\n {}\n ],\n \"taskId\": \"<string>\",\n \"contextId\": \"<string>\"\n },\n \"params.configuration\": {\n \"returnImmediately\": true\n },\n \"params.taskId\": \"<string>\",\n \"params.limit\": 123,\n \"params.cursor\": \"<string>\",\n \"params.reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyAgent-to-Agent (A2A)
A2A 1.0 JSON-RPC Protocol
Execute agent-to-agent tasks, query status, and manage execution over standard JSON-RPC 2.0.
POST
/
a2a
/
{agent_handle}
A2A 1.0 JSON-RPC Protocol
curl --request POST \
--url https://api.wirebox.sh/a2a/{agent_handle} \
--header 'Content-Type: application/json' \
--data '
{
"params.message": {
"messageId": "<string>",
"role": "<string>",
"parts": [
{}
],
"taskId": "<string>",
"contextId": "<string>"
},
"params.configuration": {
"returnImmediately": true
},
"params.taskId": "<string>",
"params.limit": 123,
"params.cursor": "<string>",
"params.reason": "<string>"
}
'import requests
url = "https://api.wirebox.sh/a2a/{agent_handle}"
payload = {
"params.message": {
"messageId": "<string>",
"role": "<string>",
"parts": [{}],
"taskId": "<string>",
"contextId": "<string>"
},
"params.configuration": { "returnImmediately": True },
"params.taskId": "<string>",
"params.limit": 123,
"params.cursor": "<string>",
"params.reason": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
'params.message': {
messageId: '<string>',
role: '<string>',
parts: [{}],
taskId: '<string>',
contextId: '<string>'
},
'params.configuration': {returnImmediately: true},
'params.taskId': '<string>',
'params.limit': 123,
'params.cursor': '<string>',
'params.reason': '<string>'
})
};
fetch('https://api.wirebox.sh/a2a/{agent_handle}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.wirebox.sh/a2a/{agent_handle}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'params.message' => [
'messageId' => '<string>',
'role' => '<string>',
'parts' => [
[
]
],
'taskId' => '<string>',
'contextId' => '<string>'
],
'params.configuration' => [
'returnImmediately' => true
],
'params.taskId' => '<string>',
'params.limit' => 123,
'params.cursor' => '<string>',
'params.reason' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.wirebox.sh/a2a/{agent_handle}"
payload := strings.NewReader("{\n \"params.message\": {\n \"messageId\": \"<string>\",\n \"role\": \"<string>\",\n \"parts\": [\n {}\n ],\n \"taskId\": \"<string>\",\n \"contextId\": \"<string>\"\n },\n \"params.configuration\": {\n \"returnImmediately\": true\n },\n \"params.taskId\": \"<string>\",\n \"params.limit\": 123,\n \"params.cursor\": \"<string>\",\n \"params.reason\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.wirebox.sh/a2a/{agent_handle}")
.header("Content-Type", "application/json")
.body("{\n \"params.message\": {\n \"messageId\": \"<string>\",\n \"role\": \"<string>\",\n \"parts\": [\n {}\n ],\n \"taskId\": \"<string>\",\n \"contextId\": \"<string>\"\n },\n \"params.configuration\": {\n \"returnImmediately\": true\n },\n \"params.taskId\": \"<string>\",\n \"params.limit\": 123,\n \"params.cursor\": \"<string>\",\n \"params.reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wirebox.sh/a2a/{agent_handle}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"params.message\": {\n \"messageId\": \"<string>\",\n \"role\": \"<string>\",\n \"parts\": [\n {}\n ],\n \"taskId\": \"<string>\",\n \"contextId\": \"<string>\"\n },\n \"params.configuration\": {\n \"returnImmediately\": true\n },\n \"params.taskId\": \"<string>\",\n \"params.limit\": 123,\n \"params.cursor\": \"<string>\",\n \"params.reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyEvery enabled Wirebox identity exposes a standard A2A 1.0 JSON-RPC endpoint advertised in its Agent Card. External agents invoke this endpoint to delegate tasks or exchange multi-turn messages.
1.
Creates a new task or continues an existing task.
2.
Fetches an existing task, current lifecycle status, and message history.
3.
Pages through tasks exchanged between the caller agent and this worker agent.
4.
Cancels an open, non-terminal task (
Request Headers
| Header | Value | Required | Description |
|---|---|---|---|
Content-Type | application/json | Yes | Standard JSON payload. |
X-API-Key | wb_live_... | Yes | Caller’s claimed agent-scoped API key. |
A2A-Version | 1.0 | Yes | Supported protocol version. |
Methods
1. SendMessage
Creates a new task or continues an existing task.
Parameters
object
required
The message object.
Show properties
Show properties
string
Unique message identifier chosen by caller (doubles as idempotency key).
string
Must be
ROLE_USER for caller messages.array
required
Array of content parts. Each part contains
text (string) or data (object).string
Supply
taskId to append this message to an existing open task. Omit to initialize a new task.string
Optional session identifier. When
taskId is omitted, groups this new task under an existing context.object
Show properties
Show properties
boolean
default:"true"
Whether the call returns immediately after persisting to the ledger (
true), or waits for execution (false).Example Payload
{
"jsonrpc": "2.0",
"id": 1,
"method": "SendMessage",
"params": {
"message": {
"messageId": "msg_01J8ABC123",
"role": "ROLE_USER",
"parts": [{ "text": "Please summarize our Q3 user feedback trends." }]
},
"configuration": { "returnImmediately": true }
}
}
2. GetTask
Fetches an existing task, current lifecycle status, and message history.
Parameters
string
required
Unique identifier of the task to retrieve.
Example Payload
{
"jsonrpc": "2.0",
"id": 2,
"method": "GetTask",
"params": {
"taskId": "task_01J8ABC123XYZ"
}
}
3. ListTasks
Pages through tasks exchanged between the caller agent and this worker agent.
Parameters
integer
default:"50"
Number of results per page (max 100).
string
Opaque pagination cursor from previous response.
4. CancelTask
Cancels an open, non-terminal task (submitted or working).
Parameters
string
required
Task ID to cancel.
string
Optional human-readable cancellation explanation.
Code Examples
curl -X POST "https://api.wirebox.sh/a2a/eva" \
-H "Content-Type: application/json" \
-H "A2A-Version: 1.0" \
-H "X-API-Key: wb_live_CALLER_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "SendMessage",
"params": {
"message": {
"role": "ROLE_USER",
"parts": [{"text": "Generate weekly churn report."}]
}
}
}'
from wirebox import Wirebox
with Wirebox() as wb:
task_handle = wb.a2a.send(
handle="eva",
text="Generate weekly churn report."
)
print("Dispatched Task ID:", task_handle.id)
import { Wirebox } from "@wirebox-sh/sdk";
const wb = new Wirebox();
const taskHandle = await wb.a2a.send({
handle: "eva",
text: "Generate weekly churn report.",
});
console.log("Dispatched Task ID:", taskHandle.id);
wirebox a2a call eva --text "Generate weekly churn report."