Fetch Top Sources Results by Task ID#
Retrieve the results of a previously created top sources task using its Task ID.
✅ All code examples tested: Verified against FortiAnalyzer v7.4.8, v7.6.4, v8.0.0.
Overview#
This endpoint fetches completed top sources results - useful for:
Retrieving results from a previously submitted task
Implementing asynchronous result fetching patterns
Building decoupled task submission and result retrieval workflows
Allowing multiple result retrievals from the same task
Enabling result caching and delayed processing
This endpoint is part of the two-step FortiView workflow. First create a task with Create Top Sources Task, then use this endpoint to fetch the results.
Endpoint Details#
Method: POST
URL: /jsonrpc
API Path: /fortiview/adom/{adom}/top-sources/run/{taskID}
ADOM Support: Yes
Requires Authentication: Yes
Minimum Version: 7.4.0
Prerequisites#
Active session or valid API key
Valid Task ID from a previously created top sources task
Read access to FortiView data in specified ADOM
Task must be completed (status: “done”)
Request Format#
Parameters#
Parameter |
Type |
Required |
Default |
Description |
|---|---|---|---|---|
|
|
Yes |
- |
ADOM name (e.g., “root”) |
|
|
Yes |
- |
Task ID from create task operation |
|
|
No |
|
API version |
Request Example#
{
"method": "get",
"params": [{
"url": "/fortiview/adom/root/top-sources/run/12450",
"apiver": 3
}],
"session": "{{session_id}}",
"id": 1
}
{
"result": [{
"data": {
"tid": 12450,
"status": "done",
"percentage": 100,
"total": 10,
"sources": [
{
"srcip": "10.0.1.150",
"hostname": "LAPTOP-USER01",
"sessions": 4523,
"bytes": 2147483648,
"bandwidth": 45678901,
"country": "Reserved"
},
{
"srcip": "10.0.1.75",
"hostname": "DESKTOP-IT01",
"sessions": 3891,
"bytes": 1879048192,
"bandwidth": 39012345,
"country": "Reserved"
},
{
"srcip": "10.0.1.45",
"hostname": "SERVER-APP01",
"sessions": 3204,
"bytes": 1610612736,
"bandwidth": 33456789,
"country": "Reserved"
}
]
},
"status": {
"code": 0,
"message": "OK"
}
}]
}
Response Fields#
Field |
Type |
Description |
|---|---|---|
|
|
Task ID |
|
|
Task status: “done”, “running”, “error” |
|
|
Completion percentage (0-100) |
|
|
Total number of sources returned |
|
|
Array of top source objects |
Source Object Fields#
Field |
Type |
Description |
|---|---|---|
|
|
Source IP address |
|
|
Resolved hostname (if available) |
|
|
Number of sessions |
|
|
Total bytes transferred |
|
|
Bandwidth usage (bps) |
|
|
GeoIP country |
Complete Python Example#
import json
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def fetch_top_sources_result(session_id, adom, task_id):
"""
Fetch top sources results by Task ID
Args:
session_id: Active session ID
adom: ADOM name
task_id: Task ID from create task operation
Returns:
dict: Task result data including sources
"""
url = "https://faz.example.com/jsonrpc"
payload = {
"method": "get",
"params": [{
"url": f"/fortiview/adom/{adom}/top-sources/run/{task_id}",
"apiver": 3
}],
"session": session_id,
"id": 1
}
response = requests.post(url, json=payload, verify=False)
result = response.json()
if result['result'][0]['status']['code'] == 0:
data = result['result'][0]['data']
if data['status'] == 'done' and data['percentage'] == 100:
return data
else:
raise Exception(f"Task not complete: {data['status']} - {data['percentage']}%")
else:
raise Exception(f"API error: {result['result'][0]['status']['message']}")
# Example: Fetch results for task ID 12450
result = fetch_top_sources_result(
session_id="your_session_id",
adom="root",
task_id=12450
)
# Display results
print(f"Task Status: {result['status']}")
print(f"Total Sources: {result['total']}\n")
for i, src in enumerate(result['sources'], 1):
print(f"{i}. {src['srcip']} ({src.get('hostname', 'Unknown')})")
print(f" Sessions: {src['sessions']:,}")
print(f" Bytes: {src['bytes']:,} ({src['bytes']/1024/1024/1024:.2f} GB)")
print(f" Bandwidth: {src['bandwidth']/1000000:.2f} Mbps")
print()
Use Cases#
Delayed Result Processing#
# Submit task and save TID for later
from create_task import create_top_sources_task
tid = create_top_sources_task(
session_id=session,
adom="root",
time_range={"last-n-hours": 24}
)
# Store TID for later retrieval
with open('task_ids.txt', 'a') as f:
f.write(f"{tid}\n")
# Later: Retrieve results
tid = 12450 # From saved file
result = fetch_top_sources_result(
session_id=session,
adom="root",
task_id=tid
)
Multiple Result Retrievals#
# Fetch same results multiple times without re-running query
task_id = 12450
# First retrieval: Full analysis
result1 = fetch_top_sources_result(session, "root", task_id)
for src in result1['sources']:
# Detailed processing
analyze_source(src)
# Second retrieval: Different analysis
result2 = fetch_top_sources_result(session, "root", task_id)
for src in result2['sources']:
# Generate reports
create_report(src)
Batch Task Result Collection#
# Collect results from multiple tasks
task_ids = [12450, 12451, 12452, 12453]
all_sources = []
for tid in task_ids:
try:
result = fetch_top_sources_result(
session_id=session,
adom="root",
task_id=tid
)
all_sources.extend(result['sources'])
print(f"✓ Retrieved {result['total']} sources from task {tid}")
except Exception as e:
print(f"✗ Task {tid} failed: {e}")
# Aggregate analysis
print(f"\nTotal sources collected: {len(all_sources)}")
top_consumer = max(all_sources, key=lambda x: x['bytes'])
print(f"Top consumer: {top_consumer['srcip']} - {top_consumer['bytes']/1024/1024/1024:.2f} GB")
Result Validation and Re-fetch#
import time
def get_completed_results(session_id, adom, task_id, max_retries=5):
"""
Fetch results with retry if task not complete
"""
for attempt in range(max_retries):
try:
result = fetch_top_sources_result(session_id, adom, task_id)
return result['sources']
except Exception as e:
if "Task not complete" in str(e):
print(f"Task still processing, retry {attempt+1}/{max_retries}...")
time.sleep(3)
else:
raise
raise TimeoutError(f"Task {task_id} did not complete after {max_retries} retries")
# Usage
sources = get_completed_results(
session_id=session,
adom="root",
task_id=12450
)
Error Handling#
{
"result": [{
"status": {
"code": -3,
"message": "Invalid task ID"
}
}]
}
Common causes:
Task ID does not exist
Task has expired (tasks have limited lifetime)
Incorrect ADOM specified
Insufficient permissions
{
"result": [{
"data": {
"tid": 12450,
"status": "running",
"percentage": 65
},
"status": {
"code": 0,
"message": "OK"
}
}]
}
Handling:
Implement polling with retry logic
Wait for status: “done” and percentage: 100
Use exponential backoff between retries
Best Practices#
💡 Tip: Check task status before processing results. Status should be “done” and percentage should be 100.
💡 Tip: Task IDs have a limited lifetime. Fetch results promptly after task completion.
⚠️ Warning: Multiple calls to fetch results do not re-run the query. Results are cached from the original task execution.
💡 Tip: Use this endpoint for building asynchronous workflows where task submission and result retrieval are separated.
Task Lifecycle#
Tasks go through the following states:
Created - Task submitted, TID assigned
Running - Task executing (percentage < 100)
Done - Task complete (percentage = 100)
Expired - Task results no longer available
Typical task lifetime: 15-30 minutes depending on FortiAnalyzer configuration.