The numbers, paths, and limits.

Everything on this page is a specific, checkable fact with a source — binary paths, exact value ranges, character caps, port numbers, scope blast radius. Where NinjaOne does not publish a number, this page says so instead of inventing one.

01 · Agent on disk

Where the agent actually lives

The first thing to know when a script's custom-field write silently does nothing: the CLI is not on PATH, and it is not in the same place on every platform.

OSCLI binaryField note
WindowsC:\ProgramData\NinjaRMMAgent\ninjarmm-cli.exeAgent and Patcher services write logs plus policy, scripting, and JSON output here. First place to look when a script's custom-field write silently no-ops.
macOS/Applications/NinjaRMMAgent/programdata/ninjarmm-cliNo .exe. Invoke by absolute path; the binary is not on PATH for script contexts.
Linux/opt/NinjaRMMAgent/programdata/ninjarmm-cliMust be prefixed with ./ when invoked from its own directory. Same argument grammar as Windows.

02 · Command surface

ninjarmm-cli, completely

CommandSyntaxPurpose
helpninjarmm-cli helpPrint the command reference the agent actually supports on this build.
getninjarmm-cli get <attribute>Read a device custom field value.
setninjarmm-cli set <attribute> <value>Write a device custom field value.
optionsninjarmm-cli options <attribute>List valid values for a dropdown or multi-select. Use this instead of guessing GUIDs.
templatesninjarmm-cli templates [--ids|--names]Enumerate documentation templates.
documentsninjarmm-cli documents "<template>" [--ids|--names]Enumerate documents under a template.
org-setninjarmm-cli org-set "<template>" "<document>" <field> "<value>"Write an organization documentation field from an endpoint script.
org-clearninjarmm-cli org-clear "<template>" "<document>" <field>Clear an organization documentation field.

Flags

FlagEffectExample / caveat
--stdinPipe input into a setdir | ninjarmm-cli set --stdin fieldName
--direct-outForce stdout on WindowsMay lose Unicode. Only reach for it when output is being swallowed by the normal channel.

PowerShell: modern vs legacy

ModernLegacyWhy it matters
Get-NinjaProperty [-Name] <String[]> [[-Type] <String>] [[-DocumentName] <String>]Ninja-Property-Get $AttributeNameThe modern form converts the value to the declared type. The legacy form hands back a raw string and is where most type bugs originate.
Set-NinjaPropertyNinja-Property-Set $AttributeName $ValueBoth still function. Mixing the two across one script library is how field formats drift.
Ninja-Property-Options $AttributeNameResolve dropdown option GUIDs at runtime rather than hardcoding them.
Ninja-Property-Clear $AttributeNameClearing is a distinct operation. Setting an empty string is not the same thing.

Exit codes

0Success
1Error

Two codes. There is no granular failure signal — if you need to know why a write failed you must capture stderr yourself.

Hard constraints

  • PowerShell 1 and 2 are not supported.
  • The CLI can only reach documentation templates that contain at least one populated field. An empty template is invisible to scripts.
  • Secure (encrypted) documentation fields are write-only.

03 · Type system

Custom field types and their exact limits

This is the table that prevents most NinjaOne scripting bugs. The ranges are real: Numeric is a signed 32-bit integer, so a byte count on a modern volume overflows it.

TypeAccepted formatLimitGotcha
CheckBox0, 1, true, falseBoolean onlyAnything else is rejected. A PowerShell $true stringifies to 'True' — pass 1 or the lowercase literal.
NumericInteger-2,147,483,648 to 2,147,483,647Signed 32-bit. Byte counts on large volumes overflow this — store GB, or use Decimal.
DecimalFloat-9,999,999.999999 to 9,999,999.999999Six decimal places, seven integer digits. Locale-formatted numbers with a comma separator fail.
Text / TextMultiLineString10,000 characters via CLIUse a backtick-n for line breaks. Dumping raw command output here truncates silently at the cap.
TextEncryptedString200 charactersWrite-only for documentation fields. You cannot read it back to verify — log the fact of the write, not the value.
URLMust start https://200 charactershttp:// is rejected. Long pre-signed URLs blow the 200-char cap.
TextEmailRFC 5322[email protected]Display-name forms ('Name <[email protected]>') are not accepted.
TextIpAddressIPv4 or IPv6192.168.1.100A single field, not a list. Multi-homed hosts need a Text field or one field per NIC.
TextPhoneE.164+1234567890Leading + required. Formatted US numbers with parentheses fail.
Date / DateTime / TimeUnix epoch seconds, or yyyy-MM-dd / yyyy-MM-ddTHH:mm:ss / HH:mm:ssUTC onlyNo timezone offset is parsed. Convert local time to UTC before writing or every timestamp is wrong by your offset.
DropdownGUID or exact option nameSingle selectionExact name match. Resolve with `options` rather than hardcoding, because renaming an option breaks every script that hardcoded the string.
MultiSelectComma-separated GUIDsMultiple selectionsGUIDs, not names. This is the single most common cause of a silently empty multi-select.
Attachment / WYSIWYGJSON objectRead-onlyCannot be written from a script. Plan documentation flows around this.

04 · API

OAuth scopes and their blast radius

Scope selection is a security decision, not a configuration detail. Management scope can run scripts on endpoints — that is arbitrary code execution, and the client secret should be handled accordingly.

ScopeGrantsBlast radius
MonitoringRead-only access to monitoring data and organization structure.Safe default for reporting, dashboards, CMDB sync, and any integration you did not write.
ManagementCreate and modify organizations and devices, run scripts.This is arbitrary code execution on endpoints. Treat a Management-scoped client secret as a domain-admin-equivalent credential.
ControlRemote access via API.Interactive session initiation. Separate it from Management; almost nothing needs both.
ProtocolOAuth 2.0
Grant typesAuthorization Code, Implicit, Client CredentialsClient Credentials is the server-to-server path. Restrict the app to it so an interactive flow can never be used.
Refresh tokenOptional scopeRequested separately; without it a long-lived integration re-authenticates.
Configured atAdministration → Apps → API
Who can configureSystem administrators onlyA practical constraint on delegating integration work.

What NinjaOne does not publish

NinjaOne does not publish rate limits, page-size caps, or regional base URLs on the open web; the interactive reference sits behind a tenant login. Third-party integrators consistently report per-endpoint throttling that requires batching and caching. Do not quote a specific rate-limit number to a customer — say it is per-endpoint, undocumented publicly, and must be measured in their tenant.

05 · Network reality

What actually breaks a rollout

The allowlist answers “what do we permit”. This answers what happens when the answer is complicated, which is the real conversation — an enterprise network is never a flat egress rule. Every case below produces a symptom that looks like a product defect and is actually a network control.

Run these with the network team in week one, not at contract stage. Every item above produces a symptom that looks like a product defect and is actually a network control — and each one is far cheaper to answer before deployment than to diagnose after it.

TLS inspection / SSL decryption on the egress path

field

The proxy terminates TLS and re-signs with its own CA. Where an agent pins or otherwise validates the expected certificate chain, the substituted certificate causes the connection to fail rather than degrade.

Reported as: Agents install successfully and then never check in, or check in from some network segments and not others. Reads as an agent bug; is a network control.

Ask them:Do you perform TLS inspection on outbound traffic, and is there an existing bypass list for management and security agents?

Basis: Standard behaviour for agents on an inspected egress path. Confirm the specific bypass requirement with NinjaOne support for the customer's configuration rather than asserting it.

Authenticating proxy (NTLM, Kerberos, or basic)

field

A service running as SYSTEM has no interactive user credential to present. Proxies requiring per-user authentication will reject it even when the URL is allowlisted.

Reported as: Works when a technician tests it signed in, fails when it runs as a service. The most misdiagnosed network problem in endpoint management.

Ask them:Does the proxy require authentication, and is there an unauthenticated bypass for machine-account traffic?

Basis: General consequence of running under a machine context behind an authenticating proxy.

Split-tunnel VPN

verified

Because the agent needs only outbound 443 to the control plane and no route to the corporate network, it works on a split tunnel without being routed through the VPN — which is usually the desired outcome, since forcing management traffic through the tunnel consumes concentrator capacity for no benefit.

Reported as: Usually none. Worth raising proactively, because a network team assuming the agent needs the tunnel will size for traffic that does not need to be there.

Ask them:Is the VPN split or full tunnel, and is there a reason management traffic should be forced through it?

DNS filtering or a secure web gateway with category blocking

verified

Control-plane hostnames may fall into an uncategorised or newly-registered-domain bucket and be blocked before any firewall rule is consulted. The connect-* rendezvous shards are the most likely to be missed because there are 72 of them.

Reported as: Console and agent work while remote sessions fail for an apparently random subset of devices — each device pins to a shard, so the affected set looks arbitrary from the outside.

Ask them:What DNS filtering or web gateway is in path, and can we allowlist by domain there as well as at the firewall?

IPv6-only or IPv6-preferred segments

field

Where an allowlist was written as IPv4 literals, an endpoint preferring IPv6 can bypass the permitted path entirely and be denied by a default rule.

Reported as: A subset of otherwise identical machines cannot reach the platform, frequently on a newer network segment.

Ask them:Are any segments IPv6-enabled, and is the allowlist expressed as hostnames rather than IPv4 addresses?

Basis: General consequence of IP-literal allowlisting. Hostname-based rules avoid it entirely, which is why they are the recommendation.

The network team will only allow IP literals

verified

Documented gateway addresses exist for environments that cannot do hostname-based rules, but IP sets change over time and a static list becomes a maintenance obligation the customer owns.

Reported as: Works at deployment, degrades months later as infrastructure moves. The failure arrives long after anyone connects it to the firewall change.

Ask them:Can you allowlist by hostname or wildcard? If IP literals are mandatory, who owns re-verifying that list, and how often?

A strict 443-only egress policy

verified

Where a third-party software vendor publishes update payloads only over anonymous FTP or HTTP, the agent may fall back to 21/FTP or 80/HTTP after repeated HTTPS attempts fail.

Reported as: Most patching works; specific third-party applications never update. Surfaces weeks later as a compliance gap nobody can explain.

Ask them:Is outbound 21 and 80 permitted for patch payload retrieval, and if not, which third-party applications are in scope for patching?

Not an official source: NinjaOne's canonical allowlist article (ninjarmm.zendesk.com/hc/articles/211406886) requires an authenticated support account and returns HTTP 403 to anonymous requests, so it could not be cited directly. This is a partner's published mirror of that list. Treat the hostnames as a starting point and re-verify inside your own tenant before handing them to a network team.

06 · Tools

Working tools, not diagrams

Three things you would otherwise do by hand in front of a customer: validate a field value before a script writes it, generate a firewall allowlist for a network team, and size patch rings against a real fleet.

Custom field format validator

Paste the value your script is about to write. Most "the field just stays empty" tickets are a format rejection, not a permissions problem.

Format
Comma-separated GUIDs
Limit
Multiple selections
Gotcha
GUIDs, not names. This is the single most common cause of a silently empty multi-select.

Firewall allowlist builder

Generate a paste-ready list for a network team. Toggle wildcard support — if their firewall handles *.rmmservice.com the per-host list collapses dramatically.

# Wildcards (use these if your firewall supports them)
https://*.rmmservice.com
https://ninja-attachments.s3.us-west-2.amazonaws.com/*

# NinjaOne Remote
https://nc-[1-8]-us-west-2.ninjarmm.net

# Backup
https://ninja-backup-uswest1.s3.us-west-1.amazonaws.com
https://ninja-backup-uswest2.s3.us-west-2.amazonaws.com
https://ninja-backup-useast1.s3.us-east-1.amazonaws.com
https://ninja-backup-useast2.s3.us-east-2.amazonaws.com

# NMS agent
https://agent-app.ninjarmm.com

# IP gateways
52.33.253.235
34.212.188.161
35.163.67.164

NinjaOne's canonical allowlist article requires a logged-in support account and returns 403 to anonymous fetches. The list above is reconciled from a partner mirror of that article and should be re-verified inside your own tenant before you hand it to a network team. Hostnames here are the US-West estate; EU, CA, and OC instances differ.

PortUseDetail
443/TCPAll normal trafficTLS 1.2, Perfect Forward Secrecy, FIPS 140-2 validated modules.
80/TCPInitial connect, then redirectThe portal and API answer on 80 only to immediately redirect to 443.
21/FTP, 80/HTTPThird-party patch fallbackSome vendors only offer anonymous FTP/HTTP for update payloads; the agent may fall back after repeated 443 failures. Worth knowing before you tell a security team '443 only'.

Patch ring planner

Enter a fleet size to get device counts per ring and a full-rollout duration you can defend in a change board.

RingShareDevicesSoakPopulation
Ring 0 — canary1-2%24–4824-48hIT's own devices. If it breaks here, nobody files a ticket.
Ring 1 — pilot5-10%120–2403-5 daysVolunteers across every hardware model and OS build you actually run.
Ring 2 — broad70-80%1680–19207 daysGeneral population, business hours excluded.
Ring 3 — sensitive10-20%240–480after Ring 2 clearsServers, executives, clinical or OT devices, anything with a change window.

Ring 0 through Ring 2 clears in roughly 12days. A "patch within 72 hours" SLA is therefore incompatible with a real soak — say that out loud in the room rather than agreeing to both.

What NinjaOne actually documents

  • Approval states: Auto, Manual, Reject
  • Documented ring example: Ring 1 / Ring 2 / Ring 3 — Named as an example only. NinjaOne does not prescribe ring sizes.
  • Only hard timing number: ≥ 1 hour between scan and install — The single numeric interval NinjaOne's ring guidance actually commits to.

What is field interpretation

NinjaOne's ring documentation deliberately gives no device percentages, no minimum soak duration, and no escalation criteria. If you present ring sizing to a customer, present it as your operating model, not as a NinjaOne recommendation. Saying 'the vendor does not prescribe this, here is what I would run and why' is more credible than inventing a spec.

Standard deployment-ring practice adapted from Microsoft's servicing-ring guidance. Defensible as an operating model; not a NinjaOne product claim. Adjust soak to the customer's incident-detection latency — a soak shorter than the time it takes users to report a problem is theatre.

Not an official source: NinjaOne's canonical allowlist article (ninjarmm.zendesk.com/hc/articles/211406886) requires an authenticated support account and returns HTTP 403 to anonymous requests, so it could not be cited directly. This is a partner's published mirror of that list. Treat the hostnames as a starting point and re-verify inside your own tenant before handing them to a network team.