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 schedules, and booked runs (GraphQL scheduleBookings field)read: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 the script tree, script bodies, script executions and their logsread:python-scripts
scripts:writeCreate, save, move or rename Python scripts. A saved script is code that runs on the Core host whenever a schedule or user executes it, so granting this lets the plugin put code on your system. It cannot delete a script, or force a save over a newer version someone else has saved since it read the scriptwrite: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
events:readRead event-viewer data, including a schedule run’s recorded events (GraphQL scheduleRunEvents field). AI clients (Ask Revo, MCP) holding it can also list recent schedule runs (GraphQL recentScheduleRuns field; AI clients only)read:event-viewer
notifications:readRead active notifications and pending errors (GraphQL notifications field). AI clients (Ask Revo, MCP) holding it can also read notification history (GraphQL notificationHistory and notificationHistorySummary fields; AI clients only, and the user also needs read:tenant-settings)user:access
notifications:writeDismiss a notificationuser:access