RMM Setup
The bootstrap script needs exactly one secret from your RMM: your ZenPrint API key. The server URL is already baked into the script when you download it, and your tenant is identified by the key itself.
How endpoints get a client and location
ZenPrint figures out which client and location an endpoint belongs to from what your RMM reports. There are two shapes, and they differ only in whether you do anything by hand.
- RMMs with a fixed organization and site structure, such as NinjaOne. The bootstrap reports the org and site, and ZenPrint creates the client and location automatically. No manual mapping. (Datto RMM, ConnectWise Automate, N-able N-central/N-sight, and Tactical RMM share this shape; only NinjaOne is wired today.)
- RMMs that organize endpoints by groups, folders, or tags with no fixed site, such as Level.io. There’s nothing for ZenPrint to derive a location from, so you map each reported group path to a client and location once, under Settings → Group Mapping (see Clients and Locations). (Kaseya machine groups, Action1, and Automox share this shape; Level.io is the one wired today.)
Either way the onboarding rhythm is the same: an endpoint registers on its first check-in (which the bootstrap runs before whatever mode you scheduled), and printer discovery happens on the next scan once it has a location. For NinjaOne the location resolves automatically on that first check-in. For group-based RMMs the location arrives when you create the mapping. See Scripts → scan for why.
NinjaOne
TODO: screenshot trail through Administration → Organizations → Organization custom fields, with the secure field highlighted.
-
Generate the key in ZenPrint. Settings → API Keys → Create API Key. Leave it as a full-access key (the bootstrap needs to write, so don’t tick read-only). Copy the key, since it’s shown once.
-
Create the NinjaOne custom field. Administration → Organizations → Organization custom fields → Add.
- Name:
zenprintApiKey - Type: Secure (prevents the value from showing in the UI)
- Role: Automations (so scripts can read it)
- Name:
-
Populate the field per-organization. Open each NinjaOne organization you want to onboard and paste the API key into the
zenprintApiKeyfield. -
Download the bootstrap script. In ZenPrint: Settings → Scripts → Download the bootstrap for your RMM. Save it as a script in NinjaOne.
-
Schedule it. Attach the script to the organizations from step 3, with a schedule per mode. See Scripts for the recommended cadence.
The first time the script runs, check-in registers the endpoint with ZenPrint, and from then on the bootstrap pulls the latest sub-script for whatever mode you run. You don’t redeploy the bootstrap when ZenPrint updates; it’s a thin loader that always fetches the latest.
Level.io
The shape is close to NinjaOne, with two Level.io specifics: Level.io can’t pass arguments or inject secrets into a script, so both the API key and the mode are supplied with the {x} picker, and there’s an extra group mapping step because Level.io has no organization/site structure ZenPrint can read automatically.
-
API key field. In Level.io, create an Admin Only custom field holding your ZenPrint API key (it starts with
zpk_). You’ll reference this field with the{x}picker in step 2, so the name is up to you. Download the bootstrap from Settings → Scripts in ZenPrint. Security note: Level.io echoes the substituted script source into its run logs, so the key may appear there. Confirm with Level.io whether Admin Only field values are masked in script output before using a long-lived production key, and rotate the key if you’re unsure. -
Deploy the bootstrap. Add the bootstrap script to your Level.io library once. Level.io can’t pass arguments to a script, so the mode is supplied through an automation variable instead of
-Mode. Create one automation per scheduled mode (Scan, Reconcile, Poll, plus Capture on demand; Cleanup is offboarding-only, so add it when you need it rather than on a schedule). In each automation:-
Define an automation variable holding the mode value (one of
Scan,Reconcile,Capture,Poll,Cleanup). -
Open the script in the Level.io editor and set two values with the
{x}picker. The device context is already pre-filled with fixed Level.io system-variable tokens ({{level_device_id}},{{level_group_path}}in the CONFIGURATION block) — leave those alone.Set this ( {x}picker)To REPLACE_VIA_{x}_PICKER(Mode selection block, near top)the mode automation variable you defined above REPLACE_VIA_{x}_PICKER_API_KEY(CONFIGURATION block, top)the Admin Only API key field from step 1
The same library script serves every mode, so you only update one script when ZenPrint ships a new bootstrap. If you leave the mode or API key unset the run fails with a clear error; the group path is optional (an ungrouped device just stays unassigned).
-
-
Run reconcile once. Check-in registers the endpoints. With
level_group_pathwired, each endpoint reports its group path but still lands unassigned until you map that path to a client and location. -
Map the groups. Go to Settings → Group Mapping and map each reported group path to a client and location. You can create the client and location right there. See Clients and Locations → Group mapping for the full walkthrough. As soon as you save a mapping, the endpoints waiting on that path are routed to the location immediately.
Once the groups are mapped, Level.io behaves like any other RMM: the next scan discovers each site’s printers, and reconcile and capture work the same way.