List messages
curl --request GET \
--url https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages', 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.phylo.bio/v1/experimental/tasks/{task_id}/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"type": "list",
"data": [
{
"id": "msg_a4f9b5cc30d8",
"type": "message",
"task_id": "tsk_017ilCeuDpMWTSH9Ah1syUGJ",
"created_at": "2026-08-12T21:21:03.412000Z",
"role": "user",
"content": [
{
"type": "text",
"text": "I'm a clinical genomics analyst working up Patient001. There are 3 BRCA1 pathogenic-flagged variants in the attached VCF. For each variant: describe ClinVar significance, flag PARP inhibitor eligibility, note any conflicts in the literature. Cite ClinVar VCV/RCV IDs and PMIDs."
}
],
"platform": "api"
},
{
"id": "msg_1a0ef0fa8e26",
"type": "message",
"task_id": "tsk_017ilCeuDpMWTSH9Ah1syUGJ",
"created_at": "2026-08-12T21:21:08.735000Z",
"role": "assistant",
"status": "completed",
"completed_at": "2026-08-12T21:31:37.204000Z",
"content": [
{
"type": "text",
"text": "Loaded the genetic-variant-annotation skill. For these 3 BRCA1 variants I'll (1) query ClinVar's REST API directly for each rsID to get current assertions, review status, star ratings, and conditions, and (2) cross-reference NCBI's ClinVar records for conflicting submissions and literature PMIDs."
},
{
"type": "tool_use",
"id": "toolu_01RkjLRcNtbVHBBwWDDk7gmF",
"name": "Skill",
"input": {
"action": "load",
"name": "genetic-variant-annotation"
}
},
{
"type": "tool_result",
"tool_use_id": "toolu_01RkjLRcNtbVHBBwWDDk7gmF",
"content": "# Skill: genetic-variant-annotation\n\n**Category**: genomics_genetics\n\n**Description**: Annotate genomic variants in VCF files with functional effects, clinical significance, and pathogenicity predictions. … (truncated)"
},
{
"type": "text",
"text": "Here is the full structured report. Two deliverables are saved: `report_Patient001_BRCA1_variants.md` and `Patient001_BRCA1_variant_report.json`. All three variants are confirmed pathogenic by ClinVar (3-star review); PARP inhibitor eligibility applies for HBOC and ovarian indications."
}
],
"platform": "api",
"input": {
"user_message_id": "msg_a4f9b5cc30d8",
"file_ids": []
}
}
],
"has_more": false,
"first_id": "msg_a4f9b5cc30d8",
"last_id": "msg_1a0ef0fa8e26"
}Messages
List messages
List a task’s messages in order, oldest first.
GET
/
experimental
/
tasks
/
{task_id}
/
messages
List messages
curl --request GET \
--url https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages', 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.phylo.bio/v1/experimental/tasks/{task_id}/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.phylo.bio/v1/experimental/tasks/{task_id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"type": "list",
"data": [
{
"id": "msg_a4f9b5cc30d8",
"type": "message",
"task_id": "tsk_017ilCeuDpMWTSH9Ah1syUGJ",
"created_at": "2026-08-12T21:21:03.412000Z",
"role": "user",
"content": [
{
"type": "text",
"text": "I'm a clinical genomics analyst working up Patient001. There are 3 BRCA1 pathogenic-flagged variants in the attached VCF. For each variant: describe ClinVar significance, flag PARP inhibitor eligibility, note any conflicts in the literature. Cite ClinVar VCV/RCV IDs and PMIDs."
}
],
"platform": "api"
},
{
"id": "msg_1a0ef0fa8e26",
"type": "message",
"task_id": "tsk_017ilCeuDpMWTSH9Ah1syUGJ",
"created_at": "2026-08-12T21:21:08.735000Z",
"role": "assistant",
"status": "completed",
"completed_at": "2026-08-12T21:31:37.204000Z",
"content": [
{
"type": "text",
"text": "Loaded the genetic-variant-annotation skill. For these 3 BRCA1 variants I'll (1) query ClinVar's REST API directly for each rsID to get current assertions, review status, star ratings, and conditions, and (2) cross-reference NCBI's ClinVar records for conflicting submissions and literature PMIDs."
},
{
"type": "tool_use",
"id": "toolu_01RkjLRcNtbVHBBwWDDk7gmF",
"name": "Skill",
"input": {
"action": "load",
"name": "genetic-variant-annotation"
}
},
{
"type": "tool_result",
"tool_use_id": "toolu_01RkjLRcNtbVHBBwWDDk7gmF",
"content": "# Skill: genetic-variant-annotation\n\n**Category**: genomics_genetics\n\n**Description**: Annotate genomic variants in VCF files with functional effects, clinical significance, and pathogenicity predictions. … (truncated)"
},
{
"type": "text",
"text": "Here is the full structured report. Two deliverables are saved: `report_Patient001_BRCA1_variants.md` and `Patient001_BRCA1_variant_report.json`. All three variants are confirmed pathogenic by ClinVar (3-star review); PARP inhibitor eligibility applies for HBOC and ovarian indications."
}
],
"platform": "api",
"input": {
"user_message_id": "msg_a4f9b5cc30d8",
"file_ids": []
}
}
],
"has_more": false,
"first_id": "msg_a4f9b5cc30d8",
"last_id": "msg_1a0ef0fa8e26"
}Your messages have
role: "user" and the agent’s have role: "assistant". Each agent reply is a single message whose content[] holds the whole reply: text, tool calls, and results. A reply still in progress has status: "streaming" with the content so far.
limit (default 200, max 500) bounds the underlying events read, not the messages returned, so expect fewer messages than limit. The first page is the most recent stretch of the conversation.Authorizations
Requires an API key. See the Authentication guide.
Path Parameters
Query Parameters
Required range:
1 <= x <= 500