Skip to content

Search these docs, or ask Revo a question — answers link the pages they came from.

REST API


The Revolution REST API is available to external plugins using a plugin JWT, obtained from the token endpoint (POST /api/v1/{tenantId}/external-plugin/oauth/token — RFC 6749 with private_key_jwt client authentication; a UI plugin uses authorization_code + PKCE and a service plugin uses client_credentials, as Authentication describes). Tokens are tenant-bound: they are only valid on routes for the tenant they were issued for.

These apply to every operation except the token exchange (which is standard OAuth and always returns its RFC 6749 shapes) and are not repeated in the per-endpoint reference:

  • X-Envelope (header, optional) — responses are raw JSON payloads by default, and errors return a compact { "message": "...", "code": "..." } body. Send X-Envelope: true to receive the wrapped ApiResponse shape (state / data / isSuccess / …) for successes and errors alike.
  • api-version (query, optional) — the version is already in the URL path (/api/v1/...); the query parameter never needs to be sent.

Prefer machine-readable? Download the spec: plugin-v1.openapi.json — generated from the running API surface, and regenerated when the plugin-accessible endpoints change.

These are every scope a plugin can be granted — the whole vocabulary, and the only values the API accepts. Ask your customer for the ones you need and no more: a service plugin’s grant is its reach, with no user to narrow it.

Each scope is a subdivision of the user capability it rolls up under, which is what stops a plugin out-reaching the capability model. For a user-interface plugin that matters directly: its scopes are intersected with the capabilities of whoever launched it, so a granted scope whose capability that operator lacks does nothing for them.

ScopeWhat it allowsRolls up under
devices:readRead the device inventoryread:system-builder
devices:writeAdd, update or remove devices and device locationswrite:system-builder
devices:executeRun an operation on a device — physical motionexecute:system-builder
device-pools:readRead device poolsread:system-builder
device-pools:writeCreate, update or delete device poolswrite:system-builder
schedules:readRead schedules, their operations, the explorer tree, recent and exported schedulesread:schedule-editor
schedules:writeCreate, edit, move, import or delete schedules and their operationswrite:schedule-editor
schedules:executeStart a schedule, or act on a running oneexecute:schedule-editor
scripts:readRead script executions and their logsread:python-scripts
scripts:executeExecute a Python scriptexecute:python-scripts
storage:readRead stores, storage devices and the storage-manager overviewread:storage-manager
storage:writeCreate, update or delete stores, storage columns and position assignmentswrite:storage-manager
system:readRead system initialisation state and the active-schedule summaryread:system-builder
initialisation:executeInitialise devices — homing moves hardwareexecute:system-builder
transfers:executeRun an ad-hoc transfer between two locations — moves a transport armexecute:system-builder
simulator:readRead the simulator frameworkread:system-builder
simulator:writeCreate, update or delete the simulator frameworkwrite:system-builder
labware:readRead labware definitions and labware templatesread:system-builder
labware:writeCreate, update or delete labware definitionswrite:system-builder
notifications:writeDismiss a notificationuser:access