curl --request POST \
--url https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": "<string>",
"method": "SendMessage",
"params": {
"message": {
"messageId": "<string>",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
},
"tenant": "<string>",
"configuration": {
"acceptedOutputModes": [
"<string>"
],
"historyLength": 1073741823,
"returnImmediately": true
},
"metadata": {}
}
}
'import requests
url = "https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}"
payload = {
"jsonrpc": "2.0",
"id": "<string>",
"method": "SendMessage",
"params": {
"message": {
"messageId": "<string>",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": ["<string>"],
"referenceTaskIds": ["<string>"]
},
"tenant": "<string>",
"configuration": {
"acceptedOutputModes": ["<string>"],
"historyLength": 1073741823,
"returnImmediately": True
},
"metadata": {}
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: '<string>',
method: 'SendMessage',
params: {
message: {
messageId: '<string>',
parts: [],
contextId: '<string>',
taskId: '<string>',
metadata: {},
extensions: ['<string>'],
referenceTaskIds: ['<string>']
},
tenant: '<string>',
configuration: {
acceptedOutputModes: ['<string>'],
historyLength: 1073741823,
returnImmediately: true
},
metadata: {}
}
})
};
fetch('https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}', 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.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}",
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([
'jsonrpc' => '2.0',
'id' => '<string>',
'method' => 'SendMessage',
'params' => [
'message' => [
'messageId' => '<string>',
'parts' => [
],
'contextId' => '<string>',
'taskId' => '<string>',
'metadata' => [
],
'extensions' => [
'<string>'
],
'referenceTaskIds' => [
'<string>'
]
],
'tenant' => '<string>',
'configuration' => [
'acceptedOutputModes' => [
'<string>'
],
'historyLength' => 1073741823,
'returnImmediately' => true
],
'metadata' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"<string>\",\n \"method\": \"SendMessage\",\n \"params\": {\n \"message\": {\n \"messageId\": \"<string>\",\n \"parts\": [],\n \"contextId\": \"<string>\",\n \"taskId\": \"<string>\",\n \"metadata\": {},\n \"extensions\": [\n \"<string>\"\n ],\n \"referenceTaskIds\": [\n \"<string>\"\n ]\n },\n \"tenant\": \"<string>\",\n \"configuration\": {\n \"acceptedOutputModes\": [\n \"<string>\"\n ],\n \"historyLength\": 1073741823,\n \"returnImmediately\": true\n },\n \"metadata\": {}\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"<string>\",\n \"method\": \"SendMessage\",\n \"params\": {\n \"message\": {\n \"messageId\": \"<string>\",\n \"parts\": [],\n \"contextId\": \"<string>\",\n \"taskId\": \"<string>\",\n \"metadata\": {},\n \"extensions\": [\n \"<string>\"\n ],\n \"referenceTaskIds\": [\n \"<string>\"\n ]\n },\n \"tenant\": \"<string>\",\n \"configuration\": {\n \"acceptedOutputModes\": [\n \"<string>\"\n ],\n \"historyLength\": 1073741823,\n \"returnImmediately\": true\n },\n \"metadata\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": \"<string>\",\n \"method\": \"SendMessage\",\n \"params\": {\n \"message\": {\n \"messageId\": \"<string>\",\n \"parts\": [],\n \"contextId\": \"<string>\",\n \"taskId\": \"<string>\",\n \"metadata\": {},\n \"extensions\": [\n \"<string>\"\n ],\n \"referenceTaskIds\": [\n \"<string>\"\n ]\n },\n \"tenant\": \"<string>\",\n \"configuration\": {\n \"acceptedOutputModes\": [\n \"<string>\"\n ],\n \"historyLength\": 1073741823,\n \"returnImmediately\": true\n },\n \"metadata\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": "<string>",
"result": {
"task": {
"id": "<string>",
"status": {
"state": "TASK_STATE_SUBMITTED",
"message": {
"messageId": "<string>",
"role": "ROLE_USER",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
},
"timestamp": "<string>"
},
"contextId": "<string>",
"artifacts": [
{
"artifactId": "<string>",
"parts": [],
"name": "<string>",
"description": "<string>",
"metadata": {},
"extensions": [
"<string>"
]
}
],
"history": [
{
"messageId": "<string>",
"role": "ROLE_USER",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
}
],
"metadata": {}
},
"message": {
"messageId": "<string>",
"role": "ROLE_USER",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
}
}
}Invoke or observe an installed Agent through A2A v1
A2A v1 JSON-RPC bound to one exact installed placement. SendMessage creates or reuses the canonical ConversationBinding and Session; task reads, cancellation, listing, and SSE subscription are projections of and mutations through that same Session authority. The bearer must be a person Principal credential issued for audience a2a; every operation re-checks the active placement and live PermissionAssignments.
Checkfu support posture: preview; hosted. Required evidence journey: a2a-serve. Deployment-specific readiness and the latest proven release are available from GET /v1/support/capabilities.
curl --request POST \
--url https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": "<string>",
"method": "SendMessage",
"params": {
"message": {
"messageId": "<string>",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
},
"tenant": "<string>",
"configuration": {
"acceptedOutputModes": [
"<string>"
],
"historyLength": 1073741823,
"returnImmediately": true
},
"metadata": {}
}
}
'import requests
url = "https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}"
payload = {
"jsonrpc": "2.0",
"id": "<string>",
"method": "SendMessage",
"params": {
"message": {
"messageId": "<string>",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": ["<string>"],
"referenceTaskIds": ["<string>"]
},
"tenant": "<string>",
"configuration": {
"acceptedOutputModes": ["<string>"],
"historyLength": 1073741823,
"returnImmediately": True
},
"metadata": {}
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: '<string>',
method: 'SendMessage',
params: {
message: {
messageId: '<string>',
parts: [],
contextId: '<string>',
taskId: '<string>',
metadata: {},
extensions: ['<string>'],
referenceTaskIds: ['<string>']
},
tenant: '<string>',
configuration: {
acceptedOutputModes: ['<string>'],
historyLength: 1073741823,
returnImmediately: true
},
metadata: {}
}
})
};
fetch('https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}', 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.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}",
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([
'jsonrpc' => '2.0',
'id' => '<string>',
'method' => 'SendMessage',
'params' => [
'message' => [
'messageId' => '<string>',
'parts' => [
],
'contextId' => '<string>',
'taskId' => '<string>',
'metadata' => [
],
'extensions' => [
'<string>'
],
'referenceTaskIds' => [
'<string>'
]
],
'tenant' => '<string>',
'configuration' => [
'acceptedOutputModes' => [
'<string>'
],
'historyLength' => 1073741823,
'returnImmediately' => true
],
'metadata' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"<string>\",\n \"method\": \"SendMessage\",\n \"params\": {\n \"message\": {\n \"messageId\": \"<string>\",\n \"parts\": [],\n \"contextId\": \"<string>\",\n \"taskId\": \"<string>\",\n \"metadata\": {},\n \"extensions\": [\n \"<string>\"\n ],\n \"referenceTaskIds\": [\n \"<string>\"\n ]\n },\n \"tenant\": \"<string>\",\n \"configuration\": {\n \"acceptedOutputModes\": [\n \"<string>\"\n ],\n \"historyLength\": 1073741823,\n \"returnImmediately\": true\n },\n \"metadata\": {}\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"<string>\",\n \"method\": \"SendMessage\",\n \"params\": {\n \"message\": {\n \"messageId\": \"<string>\",\n \"parts\": [],\n \"contextId\": \"<string>\",\n \"taskId\": \"<string>\",\n \"metadata\": {},\n \"extensions\": [\n \"<string>\"\n ],\n \"referenceTaskIds\": [\n \"<string>\"\n ]\n },\n \"tenant\": \"<string>\",\n \"configuration\": {\n \"acceptedOutputModes\": [\n \"<string>\"\n ],\n \"historyLength\": 1073741823,\n \"returnImmediately\": true\n },\n \"metadata\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/a2a/v1/workspaces/{workspace}/agent-installations/{installation}/surface-scopes/{surface}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": \"<string>\",\n \"method\": \"SendMessage\",\n \"params\": {\n \"message\": {\n \"messageId\": \"<string>\",\n \"parts\": [],\n \"contextId\": \"<string>\",\n \"taskId\": \"<string>\",\n \"metadata\": {},\n \"extensions\": [\n \"<string>\"\n ],\n \"referenceTaskIds\": [\n \"<string>\"\n ]\n },\n \"tenant\": \"<string>\",\n \"configuration\": {\n \"acceptedOutputModes\": [\n \"<string>\"\n ],\n \"historyLength\": 1073741823,\n \"returnImmediately\": true\n },\n \"metadata\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": "<string>",
"result": {
"task": {
"id": "<string>",
"status": {
"state": "TASK_STATE_SUBMITTED",
"message": {
"messageId": "<string>",
"role": "ROLE_USER",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
},
"timestamp": "<string>"
},
"contextId": "<string>",
"artifacts": [
{
"artifactId": "<string>",
"parts": [],
"name": "<string>",
"description": "<string>",
"metadata": {},
"extensions": [
"<string>"
]
}
],
"history": [
{
"messageId": "<string>",
"role": "ROLE_USER",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
}
],
"metadata": {}
},
"message": {
"messageId": "<string>",
"role": "ROLE_USER",
"parts": [],
"contextId": "<string>",
"taskId": "<string>",
"metadata": {},
"extensions": [
"<string>"
],
"referenceTaskIds": [
"<string>"
]
}
}
}Authorizations
A Checkfu Principal credential issued with audience a2a; ordinary API-MCP credentials are rejected.
Headers
A2A service version. Omission selects the protocol-defined legacy 0.3 default, which this v1 endpoint rejects with JSON-RPC VERSION_NOT_SUPPORTED.
1.0 Path Parameters
^wrkspc_[0-9a-f]{32}$^aini_[0-9a-f]{32}$^surf_[0-9a-f]{32}$