curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/research/runs/{runId}/events \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/research/runs/{runId}/events"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/research/runs/{runId}/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"runId": "68a205cc9c41d20014b40888",
"events": [
{
"seq": 3,
"type": "run.status_changed",
"payload": {
"from": "planning",
"to": "running"
},
"ts": "2026-08-25T10:00:41.000Z"
},
{
"seq": 4,
"type": "tool.started",
"payload": {
"tool": "web_search",
"input": {
"query": "European fintech Series A 2026 Head of Sales"
}
},
"ts": "2026-08-25T10:01:05.000Z"
},
{
"seq": 5,
"type": "progress",
"payload": {
"message": "Reviewing 18 candidate companies"
},
"ts": "2026-08-25T10:02:10.000Z"
}
],
"nextSinceSeq": null,
"status": "running"
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}A research run's progress events
The run’s progress log in ascending seq order (the durable source of truth for what the agent did). Poll with sinceSeq set to the last seq you have seen: only newer events come back. A full page sets nextSinceSeq to its last seq (pass it as the next sinceSeq); otherwise it is null and you are caught up. status is the run’s current status so a poller can stop when it is completed, failed or cancelled. Event types: run.status_changed, plan.created, tool.started, tool.finished, progress, partial_result, artifact, run.completed, run.failed, run.cancelled; payload depends on the type. Rate limit: 30 requests per minute, 1000 per day.
Errors:
404RESEARCH_RUN_NOT_FOUND— No research run with that id belongs to the token owner.422VALIDATION_FAILED—runIdis not a 24-character hex id,sinceSeqis not an integer of 0 or more, orlimitis outside 1-500.429RATE_LIMITED— Per-user quota for this endpoint family exceeded (30 per minute, 1000 per day); retry after the Retry-After / RateLimit-Reset seconds.
Requires one of the following token scopes: research.
curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/research/runs/{runId}/events \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/research/runs/{runId}/events"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/research/runs/{runId}/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"runId": "68a205cc9c41d20014b40888",
"events": [
{
"seq": 3,
"type": "run.status_changed",
"payload": {
"from": "planning",
"to": "running"
},
"ts": "2026-08-25T10:00:41.000Z"
},
{
"seq": 4,
"type": "tool.started",
"payload": {
"tool": "web_search",
"input": {
"query": "European fintech Series A 2026 Head of Sales"
}
},
"ts": "2026-08-25T10:01:05.000Z"
},
{
"seq": 5,
"type": "progress",
"payload": {
"message": "Reviewing 18 candidate companies"
},
"ts": "2026-08-25T10:02:10.000Z"
}
],
"nextSinceSeq": null,
"status": "running"
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Your API token (af_…) as the Basic-auth username, with an empty password.
Path Parameters
The research run id (24-character hex), as returned in run.runId by POST /business/research/runs.
Query Parameters
Return only events whose seq is strictly greater than this value; pass the last seq you received (or nextSinceSeq) to poll incrementally, omit it for the first page.
x >= 0Maximum number of events per page, 1 to 500 (default 100); when a page comes back full, nextSinceSeq carries the last seq to continue from.
1 <= x <= 500