NAS Volume Browser API Reference
Overview
Key Points
- The volume_browser API is asynchronous - create a job, then poll for results
- You must include
?fields=id,status,resultwhen polling or the result won't be returned - Use empty string
""for the root directory path (not/) - The NAS service VM must be running to browse volumes
The volume_browser API provides file system browsing capabilities for NAS volumes. This is useful for automation, integrations, and building custom file management tools.
Prerequisites
- A running NAS service with at least one online volume
- API access with appropriate permissions
- The volume's SHA1 key identifier (found in the volume dashboard URL or API)
How It Works
Browsing a volume is a two-step process:
- POST to
/api/v4/volume_browserto create a browse job - GET to
/api/v4/volume_browser/{job_id}?fields=id,status,resultto poll for results
Step 1: Create a Browse Request
Endpoint
Request Body
{
"volume": "62db5fcd888082246b9346c0e65311334d91ed2c",
"query": "get-dir",
"params": {
"dir": "",
"limit": 1000,
"offset": null,
"filter": {
"extensions": ""
},
"volume": "62db5fcd888082246b9346c0e65311334d91ed2c",
"sort": ""
}
}
Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
volume |
string | Yes | Volume key (SHA1 hash identifier) |
query |
string | Yes | Operation type: get-dir, rename, delete, paste |
params |
object | Yes | Query parameters (see below) |
Params Object
| Field | Type | Description |
|---|---|---|
dir |
string | Directory path to browse. Use "" for root. |
limit |
integer | Maximum number of entries to return (e.g., 1000) |
offset |
integer/null | Pagination offset, null for first page |
filter.extensions |
string | Filter by file extensions (empty string for all) |
volume |
string | Volume key (must match top-level volume) |
sort |
string | Sort field (empty string for default) |
Response
{
"location": "/v4/volume_browser/9a00434b882b9933512cc9d3abfd557a182d8fd3",
"dbpath": "volume_browser/9a00434b882b9933512cc9d3abfd557a182d8fd3",
"$row": 1,
"$key": "9a00434b882b9933512cc9d3abfd557a182d8fd3"
}
The $key field contains the job ID needed for polling.
Step 2: Poll for Results
Endpoint
Critical: Request the Result Field
The result field is NOT returned by default. You must explicitly request it with ?fields=id,status,result. Without this parameter, you will only receive status information.
Without ?fields=id,status,result:
{
"id": "9a00434b882b9933512cc9d3abfd557a182d8fd3",
"query": "get-dir",
"status": "complete",
"command": ""
}
With ?fields=id,status,result:
{
"id": "9a00434b882b9933512cc9d3abfd557a182d8fd3",
"status": "complete",
"result": [
{"name": "documents", "size": 4096, "date": 1706120819, "type": "directory"},
{"name": "file.txt", "size": 1024, "date": 1769198797, "type": "file"}
]
}
Status Values
| Status | Description |
|---|---|
running |
Job is still processing |
complete |
Job finished successfully |
error |
Job failed (check result for error message) |
Polling Strategy
1. POST to create job
2. Wait 200-500ms
3. GET with ?fields=id,status,result
4. If status == "running", wait and retry (up to 30 attempts)
5. If status == "complete", process result
6. If status == "error", handle error
Result Format
When status is complete, the result field contains an array of file/directory entries:
[
{
"name": "document.pdf",
"n_name": "document.pdf",
"size": 102400,
"date": 1769136871,
"type": "file"
},
{
"name": "images",
"n_name": "images",
"size": 4096,
"date": 1769197982,
"type": "directory"
}
]
Entry Fields
| Field | Type | Description |
|---|---|---|
name |
string | File or directory name |
n_name |
string | Normalized name (lowercase) |
size |
integer | Size in bytes |
date |
integer | Modification time (Unix timestamp) |
type |
string | "file" or "directory" |
Empty Directories
For empty directories, result will be an empty array:
Examples
cURL
# Step 1: Create browse job
JOB_ID=$(curl -s -X POST "https://your-vergeos.example.com/api/v4/volume_browser" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"volume": "62db5fcd888082246b9346c0e65311334d91ed2c",
"query": "get-dir",
"params": {
"dir": "",
"limit": 1000,
"offset": null,
"filter": {"extensions": ""},
"volume": "62db5fcd888082246b9346c0e65311334d91ed2c",
"sort": ""
}
}' | jq -r '."$key"')
# Step 2: Poll for results (IMPORTANT: include fields parameter)
sleep 1
curl -s "https://your-vergeos.example.com/api/v4/volume_browser/${JOB_ID}?fields=id,status,result" \
-H "Authorization: Bearer $TOKEN" | jq
Python
import requests
import time
def browse_volume(base_url, token, volume_key, path=""):
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Step 1: Create browse job
payload = {
"volume": volume_key,
"query": "get-dir",
"params": {
"dir": path, # Use "" for root
"limit": 1000,
"offset": None,
"filter": {"extensions": ""},
"volume": volume_key,
"sort": ""
}
}
response = requests.post(
f"{base_url}/api/v4/volume_browser",
headers=headers,
json=payload,
verify=False
)
job_id = response.json()["$key"]
# Step 2: Poll for results
for _ in range(30):
time.sleep(0.5)
# IMPORTANT: Request the result field explicitly
response = requests.get(
f"{base_url}/api/v4/volume_browser/{job_id}?fields=id,status,result",
headers=headers,
verify=False
)
data = response.json()
if data["status"] == "complete":
return data.get("result") or []
elif data["status"] == "error":
raise Exception(f"Browse failed: {data.get('result')}")
raise TimeoutError("Browse operation timed out")
Troubleshooting
Common Issues
Result field is empty or missing
- You must include
?fields=id,status,resultin your GET request - Without this parameter, only status information is returned
"VM must be in running state to issue a query"
- The NAS service VM is not running
- Navigate to NAS > NAS Services and start the service
"Error getting volumes VM service: No such file or directory"
- The volume's NAS service doesn't exist or was deleted
- Verify the volume is associated with a valid NAS service
"Resource '/v4/volume_browser/' not found"
- Empty job ID in poll request
- Ensure you extract
$keycorrectly from the POST response
Common Mistakes
- Using
pathinstead ofdir- The field is nameddir, notpath - Sending params as JSON string - The
paramsfield must be an object, not a JSON-encoded string - Missing params fields - All fields in the params object are expected
- Forgetting
?fields=id,status,result- Without this, no file data is returned
Requirements
- The NAS service VM must be running to browse volumes
- The volume must be online (mounted)
- User must have read permissions on the volume
Additional Resources
Feedback
Need Help?
If you need further assistance or have any questions about this article, please don't hesitate to reach out to the VergeOS Support Team.
