Roles and permissions in Harmony
This page is for workspace administrators, integration leads, and support staff who need to manage access in Harmony. It explains workspace roles and permissions, API token scopes for (third party) integrations, and touch point codes for shared devices.
Scopes and roles
A scope is a single permission, such as "view master data" or "create and update
locations". Each is either a read or a write permission. Every API
endpoint declares the scope it requires, and a request without that scope is rejected.
A role is a predefined bundle of scopes. People are assigned roles, not scopes.
Roles are not additive. A membership carries exactly one role, and Harmony has no team
construct, so there is no mechanism by which permissions accumulate. Individual scopes
are assignable in one place only: API tokens. A token can therefore be scoped more
narrowly than any role. Touch points are a third case: they hold a fixed set that
cannot be edited.
Where a role applies
A role is a property of a membership rather than of a user account. One user may be an
Owner of one workspace, a Maintainer of a second, and have no membership of a third.
Role changes apply only to the workspace in which they are made.
flowchart LR
U(["One user account"])
U -- "membership: Owner" --> A["Workspace A"]
U -- "membership: Maintainer" --> B["Workspace B"]
U ~~~ C["Workspace C<br/>no membership"]
classDef noAccess stroke-dasharray:4 3
class C noAccess
An Observer or Operator membership can also be limited to a subset of the workspace's
locations, in which case the role's permissions apply only to those locations. Use it
when an operator may only send data on behalf of their own site, or when an observer may
only see one location or a specific set of them.
The five roles
Harmony defines five roles. Observer, Maintainer, Admin and Owner form an ascending
hierarchy, each containing the permissions of the one below it. Operator does not fit
that hierarchy; it is a separate set of permissions.
flowchart LR
Ob["Observer"] --> Ma["Maintainer"] --> Ad["Admin"] --> Ow["Owner"]
Op["Operator<br/>separate scope set,<br/>not part of the hierarchy"]
classDef aside stroke-dasharray:4 3
class Op aside
A short description of each role is given below. For a more detailed overview of all permissions, see: Permission reference
Observer
Read-only. An Observer can see operational data but cannot change anything.
Use for people who report on operations rather than run them: supply chain analysts,
warehouse managers, and colleagues investigating a discrepancy. Observer is the default
role for new invitations and the appropriate starting point when the access a person
needs is not yet established.
Operator
The role for personnel performing scanning work at a read point, packing bench or gate.
It is scoped to carrying out an operational task rather than to reviewing one.
Operator is not a superset of Observer. It is a separate set of permissions that
deliberately omits most of Observer's reporting access, with the effect that an
Operator produces data without being able to review it afterwards. Consult the
permission reference rather than assuming an Operator can see whatever an Observer can.
Operators are also routed differently in the web application: authentication as an
Operator redirects to the Operator Hub rather than the full workspace interface.
Use for store and warehouse personnel performing counts, packing, goods-in and
goods-out, and for fixed tablets at a tunnel or gate.
Maintainer
Maintainers can edit workspace configuration, locations, read points and readers, and
inspect hook and location logs. The role is mainly used by internal staff and support
engineers.
Admin
Operational control of the workspace, covering members, credentials, and
integrations. Admin holds everything except the commercial settings reserved for Owner
and the Owner role itself, which an Admin can neither grant nor modify.
Use for the person who runs the workspace: integration lead, rollout project manager,
or the IT contact responsible for issuing API credentials.
Owner
Unrestricted access, including the commercial settings and the Owner role itself. Nedap recommends at
least two Owners per workspace so that account control survives personnel changes.
Use for the party commercially and organizationally accountable for the workspace.
Touch points
A touch point is a screen or handheld paired to a single read point: a tablet at a
packing bench, a handheld at goods-in, the display beside a tunnel. It is not a user
account and has no role. It gets its own token, tied to one read point, with a fixed set
of permissions.
This section covers what a touch point may do. For the device-side setup, including
generating the code and adding the touch point to an iPad home screen, see
Run as Touchpoint.
Pairing with a code
Pairing runs through a one-time code, so nobody has to put Harmony credentials on the
device.
- Someone with "Associate and configure touch points" (Maintainer and up) generates a
code for a read point. - The code is entered on the device.
- Harmony issues the device a token and records it against the read point.
What the code is:
- Nine characters, lowercase letters and digits, from a cryptographic random generator.
- Valid for 72 hours from creation.
- Single use. Redeeming it deletes it.
- One touch point per read point. Generating a second code for a read point that is
already paired returns a conflict, and so does redeeming one. - Redemption is unauthenticated, so the code alone is enough. Each attempt is delayed by
one second to slow down guessing. - Expired codes are removed automatically seven days after they lapse.
This is what makes it workable for external users. You can send someone a code, or read
it out over the phone, and they can bring a device online without an account, without a
password, and without you issuing an API token.
What a touch point may do
The token itself carries no scopes. Every request is checked against a fixed allow-list
of 18 scopes, shown in the Touch point column of the permission reference. In practice it
covers running the station: triggering reads, capturing and querying EPCIS events,
working with documents, requesting serial numbers, read access to master data and
locations, and the iD Cloud API.
A touch point is close to Operator but is not the same set, and neither contains the
other. They share 11 permissions. An Operator additionally sees read points, read point
actions and associated readers, none of which a touch point can list. A touch point
additionally queries EPCIS events and sees EPC status, device state, device observations
and location maps, none of which an Operator has. Only Admin and Owner hold everything a
touch point does.
The list is not configurable. A touch point cannot be widened or narrowed per device,
and a code cannot hand out a subset of it. Every touch point in every workspace gets the
same 18 permissions, so a read point is the only thing that scopes a device down.
Ending access
A touch point holds "Disassociate a touch point", so it can unpair itself. Anyone with
that permission can also do it from Harmony, which clears the token from the read point
and, for a paired native device, releases the reader.
The token is issued with a nine-year expiry, the same as an API token. Disassociation is
what ends access, not expiry.
Permission reference
Which roles hold which permission. A filled bullet (●) means granted, an empty bullet
(○) not granted. The last column is not a role: it is the fixed permission set of a
touch point, listed here because it is the only way to compare it against the roles.
| Area | Capability | Observer | Operator | Maintainer | Admin | Owner | Touch point |
|---|---|---|---|---|---|---|---|
| Applications | View applications assigned to a read point | ○ | ● | ● | ● | ● | ● |
| Applications | View applications | ○ | ○ | ● | ● | ● | ○ |
| Applications | Create and edit applications | ○ | ○ | ○ | ● | ● | ○ |
| Applications | Assign applications to read points | ○ | ○ | ● | ● | ● | ○ |
| Documents | View documents | ○ | ● | ● | ● | ● | ● |
| Documents | Create, edit and delete documents | ○ | ● | ○ | ● | ● | ● |
| Documents | Bulk document import and deletion | ○ | ○ | ○ | ● | ● | ○ |
| Events and traceability data | Query EPCIS events | ● | ○ | ● | ● | ● | ● |
| Events and traceability data | Capture EPCIS events | ○ | ● | ○ | ● | ● | ● |
| Events and traceability data | View EPC status | ● | ○ | ● | ● | ● | ● |
| Events and traceability data | Update EPC status | ○ | ○ | ○ | ● | ● | ○ |
| Events and traceability data | View EPC device observations | ● | ○ | ● | ● | ● | ● |
| Events and traceability data | View EPC device state | ● | ○ | ● | ● | ● | ● |
| Events and traceability data | View EPC/TID bindings | ○ | ○ | ○ | ● | ● | ○ |
| Events and traceability data | Register EPC/TID bindings | ○ | ○ | ○ | ● | ● | ○ |
| Events and traceability data | View consolidations | ● | ○ | ● | ● | ● | ○ |
| Events and traceability data | Create and update consolidations | ○ | ○ | ○ | ● | ● | ○ |
| Hooks and background jobs | View hook job status and logs | ○ | ○ | ● | ● | ● | ○ |
| Hooks and background jobs | Enqueue, cancel and delete hook jobs | ○ | ● | ● | ● | ● | ● |
| Hooks and background jobs | View hook definitions | ○ | ○ | ● | ● | ● | ○ |
| Hooks and background jobs | Create and edit hook definitions | ○ | ○ | ○ | ● | ● | ○ |
| Hooks and background jobs | View background jobs | ○ | ○ | ● | ● | ● | ○ |
| Integrations | Access the iD Cloud API | ○ | ○ | ○ | ● | ● | ● |
| Integrations | View third-party integrations | ○ | ○ | ○ | ● | ● | ○ |
| Integrations | Send requests to third-party integrations | ○ | ○ | ○ | ● | ● | ○ |
| Integrations | View iD Cloud integration settings | ○ | ○ | ○ | ● | ● | ○ |
| Integrations | Configure the iD Cloud integration | ○ | ○ | ○ | ● | ● | ○ |
| Integrations | Send email | ○ | ○ | ○ | ● | ● | ○ |
| Locations and master data | View locations | ● | ● | ● | ● | ● | ● |
| Locations and master data | View location maps | ● | ○ | ● | ● | ● | ● |
| Locations and master data | Create and edit locations | ○ | ○ | ● | ● | ● | ○ |
| Locations and master data | Create and edit location maps | ○ | ○ | ● | ● | ● | ○ |
| Locations and master data | View master data | ● | ● | ● | ● | ● | ● |
| Locations and master data | Create, edit and delete master data | ○ | ○ | ● | ● | ● | ○ |
| Read points | View read points | ● | ● | ● | ● | ● | ○ |
| Read points | Create and configure read points | ○ | ○ | ● | ● | ● | ○ |
| Read points | View triggers sent to a read point | ● | ○ | ● | ● | ● | ○ |
| Read points | Trigger a read point (start and stop reading) | ○ | ● | ● | ● | ● | ● |
| Read points | View read point actions | ● | ● | ● | ● | ● | ○ |
| Read points | Create read point actions | ○ | ○ | ○ | ● | ● | ○ |
| Read points | View read point logs | ● | ○ | ● | ● | ● | ○ |
| Read points | Submit read point logs | ○ | ○ | ○ | ● | ● | ○ |
| Read points | View open read point screens | ○ | ● | ● | ● | ● | ● |
| Read points | Register open read point screens | ○ | ● | ● | ● | ● | ● |
| Readers and touch points | View associated readers | ● | ● | ● | ● | ● | ○ |
| Readers and touch points | Associate and disassociate readers | ○ | ○ | ● | ● | ● | ○ |
| Readers and touch points | Accept third-party reader heartbeats | ○ | ○ | ○ | ● | ● | ○ |
| Readers and touch points | Associate and configure touch points | ○ | ○ | ● | ● | ● | ○ |
| Readers and touch points | Disassociate a touch point | ○ | ○ | ● | ● | ● | ● |
| Serialisation | View serialisation ranges | ○ | ○ | ● | ● | ● | ○ |
| Serialisation | Create serialisation ranges | ○ | ○ | ● | ● | ● | ○ |
| Serialisation | Request serial numbers | ○ | ● | ● | ● | ● | ● |
| Workspace administration | View workspace members | ○ | ○ | ● | ● | ● | ○ |
| Workspace administration | Invite, remove and re-role members | ○ | ○ | ○ | ● | ● | ○ |
| Workspace administration | View API tokens | ○ | ○ | ○ | ● | ● | ○ |
| Workspace administration | Create and revoke API tokens | ○ | ○ | ○ | ● | ● | ○ |
| Workspace administration | View workspace variables | ○ | ○ | ○ | ● | ● | ○ |
| Workspace administration | Create, edit and delete workspace variables | ○ | ○ | ○ | ● | ● | ○ |
| Workspace administration | View workspace details | ○ | ○ | ● | ● | ● | ○ |
| Workspace administration | Change notification settings | ○ | ○ | ● | ● | ● | ○ |
| Workspace administration | Change workspace settings | ○ | ○ | ○ | ○ | ● | ○ |
| Workspace administration | Configure overhead traffic | ○ | ○ | ○ | ● | ● | ○ |
| Workspace administration | View billing details | ○ | ○ | ○ | ○ | ● | ○ |
| Workspace administration | Change billing details | ○ | ○ | ○ | ○ | ● | ○ |
| Workspace administration | View the subscription | ○ | ○ | ○ | ○ | ● | ○ |
| Workspace administration | Change the subscription | ○ | ○ | ○ | ○ | ● | ○ |
| Workspace administration | Change feature flags | ○ | ○ | ○ | ○ | ● | ○ |
API tokens
API tokens authenticate machines and integrations. Only Admin and Owner may create
them, and each token is bound to one workspace.
Choosing scopes
The creation form takes individual scopes or whole categories. Sixteen categories are
available to tokens: EPCIS, EPC Status, EPC Device Observations, EPC Device State, EPC
TID Bindings, Consolidations, Documents, Read Points, Locations, Master Data, Readers,
Serialisation, Variables, Third Party, Integration (email), and hook jobs.
Some permissions are closed to tokens entirely, full-access tokens included, an overview of which scopes are allowed can be found below. The scope value is what appears in the API token form and in a token's scope claim. 39 of the 67 scopes can be granted to an API token (●); the rest are interface-only (○).
| Area | Capability | Scope | API token |
|---|---|---|---|
| Applications | View applications assigned to a read point | read:readpoint:applications | ○ |
| Applications | View applications | read:applications | ○ |
| Applications | Create and edit applications | write:applications | ○ |
| Applications | Assign applications to read points | manage:applications | ○ |
| Documents | View documents | read:documents | ● |
| Documents | Create, edit and delete documents | write:documents | ● |
| Documents | Bulk document import and deletion | manage:documents | ● |
| Events and traceability data | Query EPCIS events | read:epcis | ● |
| Events and traceability data | Capture EPCIS events | write:epcis | ● |
| Events and traceability data | View EPC status | read:epcstatus | ● |
| Events and traceability data | Update EPC status | write:epcstatus | ● |
| Events and traceability data | View EPC device observations | read:epcdeviceobservations | ● |
| Events and traceability data | View EPC device state | read:epcdevicestate | ● |
| Events and traceability data | View EPC/TID bindings | read:epctidbinding | ● |
| Events and traceability data | Register EPC/TID bindings | write:epctidbinding | ● |
| Events and traceability data | View consolidations | read:consolidations | ● |
| Events and traceability data | Create and update consolidations | write:consolidations | ● |
| Hooks and background jobs | View hook job status and logs | read:hook:jobs | ● |
| Hooks and background jobs | Enqueue, cancel and delete hook jobs | write:hook:jobs | ● |
| Hooks and background jobs | View hook definitions | read:hooks | ○ |
| Hooks and background jobs | Create and edit hook definitions | write:hooks | ○ |
| Hooks and background jobs | View background jobs | read:backgroundjobs | ○ |
| Integrations | Access the iD Cloud API | read:thirdparty:idcloud | ● |
| Integrations | View third-party integrations | read:thirdparty | ○ |
| Integrations | Send requests to third-party integrations | write:thirdparty | ● |
| Integrations | View iD Cloud integration settings | read:idcloudIntegration | ○ |
| Integrations | Configure the iD Cloud integration | write:idcloudIntegration | ○ |
| Integrations | Send email | write:email | ● |
| Locations and master data | View locations | read:locations | ● |
| Locations and master data | View location maps | read:location:maps | ● |
| Locations and master data | Create and edit locations | write:locations | ● |
| Locations and master data | Create and edit location maps | write:location:maps | ● |
| Locations and master data | View master data | read:masterdata | ● |
| Locations and master data | Create, edit and delete master data | write:masterdata | ● |
| Read points | View read points | read:readpoints | ● |
| Read points | Create and configure read points | write:readpoints | ● |
| Read points | View triggers sent to a read point | read:readpoint:triggers | ● |
| Read points | Trigger a read point (start and stop reading) | write:readpoint:triggers | ● |
| Read points | View read point actions | read:readpoint:actions | ● |
| Read points | Create read point actions | write:readpoint:actions | ● |
| Read points | View read point logs | read:readpoint:logs | ● |
| Read points | Submit read point logs | write:readpoint:logs | ○ |
| Read points | View open read point screens | read:readpoint:screensopen | ○ |
| Read points | Register open read point screens | write:readpoint:screensopen | ○ |
| Readers and touch points | View associated readers | read:readers | ● |
| Readers and touch points | Associate and disassociate readers | write:readers | ● |
| Readers and touch points | Accept third-party reader heartbeats | write:readers:thirdparty | ● |
| Readers and touch points | Associate and configure touch points | write:touchpoints | ○ |
| Readers and touch points | Disassociate a touch point | disassociate:touchpoints | ○ |
| Serialisation | View serialisation ranges | read:serialisation | ● |
| Serialisation | Create serialisation ranges | write:serialisation | ● |
| Serialisation | Request serial numbers | write:serialnumbers | ● |
| Workspace administration | View workspace members | read:members | ○ |
| Workspace administration | Invite, remove and re-role members | write:members | ○ |
| Workspace administration | View API tokens | read:apitokens | ○ |
| Workspace administration | Create and revoke API tokens | write:apitokens | ○ |
| Workspace administration | View workspace variables | read:variables | ● |
| Workspace administration | Create, edit and delete workspace variables | write:variables | ● |
| Workspace administration | View workspace details | read:workspace | ○ |
| Workspace administration | Change notification settings | write:workspace:notifications | ○ |
| Workspace administration | Change workspace settings | write:workspace | ○ |
| Workspace administration | Configure overhead traffic | write:workspace:overheadtraffic | ○ |
| Workspace administration | View billing details | read:workspace:billing | ○ |
| Workspace administration | Change billing details | write:workspace:billing | ○ |
| Workspace administration | View the subscription | read:workspace:subscription | ○ |
| Workspace administration | Change the subscription | write:workspace:subscription | ○ |
| Workspace administration | Change feature flags | write:workspace:features | ○ |
Lifetime and revocation
Token lifetime is fixed at nine years from creation and is not configurable. There is no
expiry field, no maximum-lifetime policy and no rotation reminder, so rotation is a
manual process the workspace administrator owns. Issuing several narrowly scoped tokens
rather than one broad one keeps the cost of rotating any single credential low.
Revocation is immediate. Every request checks the token against the revocation list. The
token value appears once, at creation, and later listings show only its final five
characters, so record it in a secrets manager straight away.
Updated 1 day ago