Datto RMM Variables — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Datto RMM Variables (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Variables in Datto RMM store key-value configuration data at account or site level. They're used to customize component scripts, store configuration values, and maintain environment-specific settings. This skill covers variable management, scoping, and usage patterns.
supplied at execution time, not stored variables; use datto-rmm-jobs.
store again; use datto-rmm-devices or autotask-configuration-items.
| Scope | Description | Use Case |
|---|---|---|
| Account | Available to all sites | Global configuration |
| Site | Available to specific site | Client-specific settings |
Account Variables (Global)
│
▼ (inherited by)
Site Variables
│
▼ (used in)
Jobs/ComponentsSite variables can override account variables with the same name.
All variables are stored as strings but can represent:
Recommended Format: SCREAMING_SNAKE_CASE (e.g. BACKUP_PATH, ADMIN_EMAIL, LOG_RETENTION_DAYS).
Reserved prefixes - names starting with these are rejected (400 Invalid name):
CS_ - Datto internal useDATTO_ - System variablesA Variable has id, name, value, optional description, scope (account|site), and siteUid when site-scoped. See references/fields.md for the full interface.
Account variables can be overridden by site variables - check site scope first, then fall back to account:
async function getEffectiveVariable(client, siteUid, variableName) {
// Try site variable first
const siteVars = await client.request(`/api/v2/site/${siteUid}/variables`);
const siteVar = siteVars.variables?.find(v => v.name === variableName);
if (siteVar) {
return {
name: variableName,
value: siteVar.value,
scope: 'site',
source: `Site: ${siteUid}`
};
}
// Fall back to account variable
const accountVars = await client.request('/api/v2/account/variables');
const accountVar = accountVars.variables?.find(v => v.name === variableName);
if (accountVar) {
return {
name: variableName,
value: accountVar.value,
scope: 'account',
source: 'Account'
};
}
return {
name: variableName,
value: null,
error: 'Variable not found'
};
}Bulk site-variable setup, an account+site audit report, an override finder that scans every site for a given variable name, a template applier for standardized onboarding, and a create-or-update "safe set" helper are in references/examples.md.
GET /api/v2/account/variables - list account-scoped variablesGET /api/v2/site/{siteUid}/variables - list site-scoped variablesPOST /api/v2/account/variables / POST /api/v2/site/{siteUid}/variables - createPUT /api/v2/account/variable/{variableId} / PUT /api/v2/site/{siteUid}/variable/{variableId} - updateDELETE .../variable/{variableId} - delete (account or site path)See references/api.md for full request/response examples.
PUT to update instead of retrying POST.POST.See references/errors.md for the full variable API error table.
| Category | Examples | Purpose |
|---|---|---|
| Backup | BACKUP_PATH, BACKUP_RETENTION_DAYS | Backup configuration |
| Logging | LOG_PATH, LOG_LEVEL | Log settings |
| Alerting | ALERT_EMAIL, ALERT_THRESHOLD | Alert configuration |
| Security | AV_SCAN_SCHEDULE, FIREWALL_ENABLED | Security settings |
| Client | CLIENT_CODE, CLIENT_CONTACT | Client identification |
Variables are referenced in component scripts as environment variables:
PowerShell:
$backupPath = $env:BACKUP_PATH
$retentionDays = $env:LOG_RETENTION_DAYS
# Use the variables
Get-ChildItem -Path $backupPath -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retentionDays) } |
Remove-ItemBash:
BACKUP_PATH="${BACKUP_PATH:-/backup}"
RETENTION_DAYS="${LOG_RETENTION_DAYS:-30}"
find "$BACKUP_PATH" -type f -mtime +$RETENTION_DAYS -delete~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.