Initial repository setup for TrueNAS Scale configuration management and disaster recovery. This system provides automated collection, versioning, and documentation of TrueNAS configuration state. Key components: - Configuration collection scripts with API integration - Disaster recovery exports (configs, storage, system state) - Comprehensive documentation and API reference - Sub-agent architecture for specialized operations Infrastructure protected: - Storage pools and datasets configuration - Network configuration and routing - Sharing services (NFS, SMB, iSCSI) - System tasks (snapshots, replication, cloud sync) - User and group management Security measures: - API keys managed via environment variables - Sensitive data excluded via .gitignore - No credentials committed to repository 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
704 lines
14 KiB
Markdown
704 lines
14 KiB
Markdown
# TrueNAS Scale API v2.0 Reference
|
|
|
|
**Target Server:** 192.168.2.150
|
|
**API Version:** 2.0
|
|
**Documentation Type:** Collection-Focused Reference
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
1. [Authentication](#authentication)
|
|
2. [API Basics](#api-basics)
|
|
3. [System Endpoints](#system-endpoints)
|
|
4. [Storage Endpoints](#storage-endpoints)
|
|
5. [Sharing Endpoints](#sharing-endpoints)
|
|
6. [Network Endpoints](#network-endpoints)
|
|
7. [Service Endpoints](#service-endpoints)
|
|
8. [Task Endpoints](#task-endpoints)
|
|
9. [User Management](#user-management)
|
|
10. [Error Codes](#error-codes)
|
|
11. [Examples](#examples)
|
|
|
|
---
|
|
|
|
## Authentication
|
|
|
|
### API Key Generation
|
|
|
|
**Method 1: Web UI**
|
|
1. Log in to TrueNAS Scale: `https://192.168.2.150`
|
|
2. Navigate to: **Account** → **API Keys**
|
|
3. Click **Add**
|
|
4. Configure:
|
|
- Name: `homelab-collection`
|
|
- Username: `admin` (or your user)
|
|
- Expiration: Optional
|
|
5. Click **Save**
|
|
6. **IMPORTANT:** Copy the key immediately (shown only once)
|
|
|
|
**Method 2: CLI (if logged in via SSH)**
|
|
```bash
|
|
midclt call auth.generate_token 120 # 120 seconds validity
|
|
```
|
|
|
|
### Authentication Headers
|
|
|
|
**All API requests require:**
|
|
```http
|
|
Authorization: Bearer <API_KEY>
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Example:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/system/info" \
|
|
-H "Authorization: Bearer 1-YourAPIKeyHere" \
|
|
-H "Content-Type: application/json" \
|
|
--insecure # Only if using self-signed certificate
|
|
```
|
|
|
|
### Testing Authentication
|
|
|
|
```bash
|
|
# Test 1: Get system version (minimal permissions)
|
|
curl -X GET "https://192.168.2.150/api/v2.0/system/version" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
-H "Content-Type: application/json" \
|
|
--insecure
|
|
|
|
# Expected response:
|
|
# {"fullversion": "TrueNAS-SCALE-23.10.1", "version": "23.10.1"}
|
|
|
|
# Test 2: Get system info (more detailed)
|
|
curl -X GET "https://192.168.2.150/api/v2.0/system/info" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
-H "Content-Type: application/json" \
|
|
--insecure | jq .
|
|
```
|
|
|
|
---
|
|
|
|
## API Basics
|
|
|
|
### Base URL
|
|
```
|
|
https://192.168.2.150/api/v2.0
|
|
```
|
|
|
|
### Response Format
|
|
All responses are JSON-formatted.
|
|
|
|
**Success Response:**
|
|
```json
|
|
{
|
|
"id": 1,
|
|
"name": "example",
|
|
"status": "SUCCESS"
|
|
}
|
|
```
|
|
|
|
**Error Response:**
|
|
```json
|
|
{
|
|
"error": "Error message",
|
|
"errname": "EINVAL",
|
|
"extra": null
|
|
}
|
|
```
|
|
|
|
### Query Parameters
|
|
|
|
**Filtering:**
|
|
```bash
|
|
# Get datasets with specific properties
|
|
curl -X GET "https://192.168.2.150/api/v2.0/pool/dataset?name=Vauly" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
### HTTP Methods
|
|
|
|
| Method | Purpose | Idempotent | Collection Use |
|
|
|--------|---------|------------|----------------|
|
|
| GET | Retrieve data | Yes | Primary method |
|
|
| POST | Create resource | No | Not used |
|
|
| PUT | Update resource | Yes | Not used |
|
|
| DELETE | Remove resource | Yes | Not used |
|
|
|
|
**Collection scripts use GET only** (read-only operations).
|
|
|
|
---
|
|
|
|
## System Endpoints
|
|
|
|
### GET /api/v2.0/system/info
|
|
**Description:** Get comprehensive system information
|
|
|
|
**Request:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/system/info" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"version": "TrueNAS-SCALE-23.10.1",
|
|
"hostname": "truenas",
|
|
"physmem": 68719476736,
|
|
"model": "AMD Ryzen",
|
|
"cores": 16,
|
|
"physical_cores": 8,
|
|
"loadavg": [0.5, 0.6, 0.7],
|
|
"uptime": "10 days, 5:30:15",
|
|
"uptime_seconds": 896415.0,
|
|
"boottime": "2025-12-04T10:30:00",
|
|
"datetime": "2025-12-14T15:30:15",
|
|
"timezone": "America/New_York"
|
|
}
|
|
```
|
|
|
|
**Key Fields:**
|
|
- `version`: TrueNAS Scale version
|
|
- `physmem`: Physical memory in bytes
|
|
- `cores`: Total CPU cores
|
|
- `uptime_seconds`: System uptime
|
|
- `loadavg`: 1, 5, 15-minute load averages
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/system/version
|
|
**Description:** Get TrueNAS version string
|
|
|
|
**Request:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/system/version" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"fullversion": "TrueNAS-SCALE-23.10.1",
|
|
"version": "23.10.1"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/system/advanced
|
|
**Description:** Get advanced system settings
|
|
|
|
**Response includes:**
|
|
- Boot scrub interval
|
|
- Console settings
|
|
- Power management
|
|
- Syslog configuration
|
|
- Debug settings
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/system/general
|
|
**Description:** Get general system configuration
|
|
|
|
**Response includes:**
|
|
- Web UI settings (ports, protocols)
|
|
- Timezone and language
|
|
- Keyboard map
|
|
- Certificate configuration
|
|
|
|
---
|
|
|
|
## Storage Endpoints
|
|
|
|
### GET /api/v2.0/pool
|
|
**Description:** List all storage pools
|
|
|
|
**Request:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/pool" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"name": "Vauly",
|
|
"guid": "1234567890123456789",
|
|
"status": "ONLINE",
|
|
"path": "/mnt/Vauly",
|
|
"scan": {
|
|
"function": "SCRUB",
|
|
"state": "FINISHED",
|
|
"start_time": "2025-12-10T02:00:00",
|
|
"end_time": "2025-12-10T06:30:00",
|
|
"percentage": 100.0,
|
|
"errors": 0
|
|
},
|
|
"is_decrypted": true,
|
|
"healthy": true,
|
|
"size": 3221225472000,
|
|
"allocated": 67108864000,
|
|
"free": 3154116608000,
|
|
"fragmentation": "1%",
|
|
"topology": {
|
|
"data": [],
|
|
"cache": [],
|
|
"log": [],
|
|
"spare": []
|
|
}
|
|
}
|
|
]
|
|
```
|
|
|
|
**Key Fields:**
|
|
- `name`: Pool name (e.g., "Vauly")
|
|
- `status`: Pool health status
|
|
- `healthy`: Boolean health indicator
|
|
- `size`: Total pool size in bytes
|
|
- `free`: Available space in bytes
|
|
- `scan`: Last scrub information
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/pool/dataset
|
|
**Description:** List all datasets and zvols
|
|
|
|
**Request:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/pool/dataset" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": "Vauly/iso-vault",
|
|
"type": "FILESYSTEM",
|
|
"name": "Vauly/iso-vault",
|
|
"pool": "Vauly",
|
|
"encrypted": false,
|
|
"mountpoint": "/mnt/Vauly/iso-vault",
|
|
"compression": {
|
|
"parsed": "lz4",
|
|
"value": "lz4"
|
|
},
|
|
"used": {
|
|
"parsed": 67108864000,
|
|
"value": "62.5G"
|
|
},
|
|
"available": {
|
|
"parsed": 3154116608000,
|
|
"value": "2.9T"
|
|
}
|
|
}
|
|
]
|
|
```
|
|
|
|
**Query specific dataset:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/pool/dataset?id=Vauly/iso-vault" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/disk
|
|
**Description:** Get disk inventory
|
|
|
|
**Response includes:**
|
|
- Disk serial numbers
|
|
- Model information
|
|
- Size and type (HDD/SSD)
|
|
- Current pool assignment
|
|
- SMART status
|
|
- Temperature readings
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/disk/temperature
|
|
**Description:** Get current disk temperatures
|
|
|
|
**Request:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/disk/temperature" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"sda": 35,
|
|
"sdb": 32,
|
|
"sdc": 34,
|
|
"sdd": 36
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/pool/scrub
|
|
**Description:** Get scrub status and history
|
|
|
|
**Response includes:**
|
|
- Current scrub state
|
|
- Start/end times
|
|
- Bytes processed
|
|
- Error count
|
|
- Completion percentage
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/smart/test/results
|
|
**Description:** Get SMART test results for all disks
|
|
|
|
**Response includes:**
|
|
- Test type (short/long)
|
|
- Test status
|
|
- Completion time
|
|
- Any errors found
|
|
|
|
---
|
|
|
|
## Sharing Endpoints
|
|
|
|
### GET /api/v2.0/sharing/nfs
|
|
**Description:** Get all NFS share configurations
|
|
|
|
**Request:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/sharing/nfs" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"path": "/mnt/Vauly/iso-vault",
|
|
"comment": "ISO storage for Proxmox",
|
|
"networks": ["192.168.2.0/24"],
|
|
"hosts": [],
|
|
"ro": false,
|
|
"maproot_user": "root",
|
|
"maproot_group": "root",
|
|
"security": ["SYS"],
|
|
"enabled": true
|
|
}
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/sharing/smb
|
|
**Description:** Get all SMB/CIFS share configurations
|
|
|
|
**Response includes:**
|
|
- Share name and path
|
|
- Access permissions
|
|
- Guest access settings
|
|
- Host allow/deny lists
|
|
- Enable status
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/sharing/iscsi/target
|
|
**Description:** Get iSCSI target configurations
|
|
|
|
### GET /api/v2.0/sharing/iscsi/extent
|
|
**Description:** Get iSCSI extent configurations
|
|
|
|
---
|
|
|
|
## Network Endpoints
|
|
|
|
### GET /api/v2.0/interface
|
|
**Description:** Get network interface configurations
|
|
|
|
**Response includes:**
|
|
- Interface name and type
|
|
- IP addresses (IPv4/IPv6)
|
|
- MTU settings
|
|
- Link state
|
|
- DHCP configuration
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/network/configuration
|
|
**Description:** Get global network configuration
|
|
|
|
**Response includes:**
|
|
- Hostname and domain
|
|
- Default gateway
|
|
- DNS servers
|
|
- Service announcement settings
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/staticroute
|
|
**Description:** Get static route configurations
|
|
|
|
---
|
|
|
|
## Service Endpoints
|
|
|
|
### GET /api/v2.0/service
|
|
**Description:** Get status of all services
|
|
|
|
**Request:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/service" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": 1,
|
|
"service": "ssh",
|
|
"enable": true,
|
|
"state": "RUNNING",
|
|
"pids": [1234]
|
|
},
|
|
{
|
|
"id": 2,
|
|
"service": "nfs",
|
|
"enable": true,
|
|
"state": "RUNNING",
|
|
"pids": [5678, 5679]
|
|
}
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
### GET /api/v2.0/ssh
|
|
**Description:** Get SSH service configuration
|
|
|
|
**Response includes:**
|
|
- TCP port
|
|
- Root login settings
|
|
- Password authentication
|
|
- SFTP log settings
|
|
|
|
---
|
|
|
|
## Task Endpoints
|
|
|
|
### GET /api/v2.0/cronjob
|
|
**Description:** Get cron job configurations
|
|
|
|
### GET /api/v2.0/pool/snapshottask
|
|
**Description:** Get snapshot task configurations
|
|
|
|
### GET /api/v2.0/rsynctask
|
|
**Description:** Get rsync task configurations
|
|
|
|
### GET /api/v2.0/cloudsync
|
|
**Description:** Get cloud sync task configurations
|
|
|
|
### GET /api/v2.0/replication
|
|
**Description:** Get ZFS replication task configurations
|
|
|
|
---
|
|
|
|
## User Management
|
|
|
|
### GET /api/v2.0/user
|
|
**Description:** Get all user accounts
|
|
|
|
**Response includes:**
|
|
- Username and UID
|
|
- Home directory
|
|
- Shell
|
|
- Group memberships
|
|
- SSH public keys
|
|
|
|
### GET /api/v2.0/group
|
|
**Description:** Get all groups
|
|
|
|
---
|
|
|
|
## Error Codes
|
|
|
|
### HTTP Status Codes
|
|
|
|
| Code | Meaning | Description |
|
|
|------|---------|-------------|
|
|
| 200 | OK | Request successful |
|
|
| 400 | Bad Request | Invalid request syntax |
|
|
| 401 | Unauthorized | Invalid or missing API key |
|
|
| 403 | Forbidden | Insufficient permissions |
|
|
| 404 | Not Found | Resource doesn't exist |
|
|
| 429 | Too Many Requests | Rate limit exceeded |
|
|
| 500 | Internal Server Error | Server-side error |
|
|
|
|
### TrueNAS Error Names
|
|
|
|
| Error Name | Description | Common Cause |
|
|
|------------|-------------|--------------|
|
|
| `EINVAL` | Invalid argument | Wrong parameter type or value |
|
|
| `ENOENT` | No such file or directory | Resource doesn't exist |
|
|
| `EACCES` | Permission denied | Insufficient permissions |
|
|
| `EFAULT` | General fault | Internal middleware error |
|
|
|
|
---
|
|
|
|
## Examples
|
|
|
|
### Complete Health Check Script
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# truenas-health-check.sh
|
|
|
|
TRUENAS_HOST="192.168.2.150"
|
|
TRUENAS_API_KEY="${TRUENAS_API_KEY:?API key not set}"
|
|
|
|
API_BASE="https://${TRUENAS_HOST}/api/v2.0"
|
|
CURL_OPTS="-s -H 'Authorization: Bearer ${TRUENAS_API_KEY}' --insecure"
|
|
|
|
echo "=== TrueNAS Health Check ==="
|
|
|
|
# System version
|
|
echo "System Version:"
|
|
curl ${CURL_OPTS} "${API_BASE}/system/version" | jq -r '.fullversion'
|
|
|
|
# Pool status
|
|
echo "Pool Status:"
|
|
curl ${CURL_OPTS} "${API_BASE}/pool" | \
|
|
jq -r '.[] | "\(.name): \(.status) (Healthy: \(.healthy))"'
|
|
|
|
# Disk temperatures
|
|
echo "Disk Temperatures:"
|
|
curl ${CURL_OPTS} "${API_BASE}/disk/temperature" | \
|
|
jq -r 'to_entries[] | "\(.key): \(.value)°C"'
|
|
|
|
# Service status
|
|
echo "Service Status:"
|
|
curl ${CURL_OPTS} "${API_BASE}/service" | \
|
|
jq -r '.[] | select(.enable == true) | "\(.service): \(.state)"'
|
|
```
|
|
|
|
### Export Pool Configuration
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# export-pool-config.sh
|
|
|
|
POOL_NAME="Vauly"
|
|
OUTPUT_DIR="./pool-export-$(date +%Y%m%d)"
|
|
|
|
mkdir -p "${OUTPUT_DIR}"
|
|
|
|
# Pool info
|
|
curl -s -X GET "https://192.168.2.150/api/v2.0/pool" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure | jq ".[] | select(.name == \"${POOL_NAME}\")" \
|
|
> "${OUTPUT_DIR}/pool-${POOL_NAME}.json"
|
|
|
|
# Datasets
|
|
curl -s -X GET "https://192.168.2.150/api/v2.0/pool/dataset" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure | jq ".[] | select(.pool == \"${POOL_NAME}\")" \
|
|
> "${OUTPUT_DIR}/datasets-${POOL_NAME}.json"
|
|
|
|
echo "Pool configuration exported to: ${OUTPUT_DIR}"
|
|
```
|
|
|
|
### Monitor Specific Dataset
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# monitor-dataset.sh
|
|
|
|
DATASET="Vauly/iso-vault"
|
|
API_BASE="https://192.168.2.150/api/v2.0"
|
|
|
|
# URL encode the dataset name
|
|
ENCODED_DATASET=$(echo "${DATASET}" | sed 's/\//%2F/g')
|
|
|
|
curl -s -X GET "${API_BASE}/pool/dataset?id=${ENCODED_DATASET}" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure | jq '{
|
|
name: .name,
|
|
type: .type,
|
|
mountpoint: .mountpoint,
|
|
used: .used.value,
|
|
available: .available.value,
|
|
compression: .compression.value
|
|
}'
|
|
```
|
|
|
|
---
|
|
|
|
## Middleware CLI Alternative
|
|
|
|
For commands requiring higher privileges or unavailable via API:
|
|
|
|
```bash
|
|
# Connect via SSH
|
|
ssh admin@192.168.2.150
|
|
|
|
# Use midclt for middleware calls
|
|
midclt call system.info
|
|
midclt call pool.query
|
|
midclt call pool.dataset.query '[["pool", "=", "Vauly"]]'
|
|
|
|
# Complex queries with filters
|
|
midclt call disk.query '[["pool", "=", "Vauly"]]' \
|
|
'{"select": ["name", "serial", "model", "size"]}'
|
|
```
|
|
|
|
---
|
|
|
|
## Version Compatibility
|
|
|
|
**This documentation is based on:**
|
|
- TrueNAS Scale 23.10.x (Cobia)
|
|
- API version 2.0
|
|
|
|
**Check API version:**
|
|
```bash
|
|
curl -X GET "https://192.168.2.150/api/v2.0/system/version" \
|
|
-H "Authorization: Bearer ${TRUENAS_API_KEY}" \
|
|
--insecure
|
|
```
|
|
|
|
---
|
|
|
|
## Additional Resources
|
|
|
|
**Official Documentation:**
|
|
- API Docs: https://www.truenas.com/docs/api/scale_rest_api.html
|
|
- WebSocket API: https://www.truenas.com/docs/api/scale_websocket_api.html
|
|
|
|
**Community:**
|
|
- Forums: https://forums.truenas.com/
|
|
- GitHub: https://github.com/truenas/middleware
|
|
|
|
**Tools:**
|
|
- API Explorer: `https://192.168.2.150/api/docs/` (built-in)
|
|
|
|
---
|
|
|
|
**Document Version:** 1.0.0
|
|
**Last Updated:** 2025-12-14
|
|
**API Version:** 2.0
|
|
**Maintained By:** Scribe Agent
|
|
**Homelab Repository:** /home/jramos/homelab
|