Skip to content

Headless execution and continuous integration

A scenario built in the interface runs with no window from the command line. That is the route that turns your API tests into a pipeline step.

The "Find pets by status" scenario in the editor: an Input/Param action named status, the "Finds Pets by status" request and a Log

Terminal window
restorm \
--open ./projet.restorm \
--run "Find pets by status" \
--headless \
--param status=available
ArgumentRole
--open <path>, -oThe project to open. Mandatory with --run
--run <target>The scenario to run. Its presence activates command-line mode
--by <name|id>How --run designates the scenario: by name (the default) or by identifier
--headlessNo window at all. Without it, the window appears while the log scrolls past on the console
--param name=valueA value for a scenario input parameter (an Input / Param box). Repeatable
--all-logsIncludes the engine’s entries; by default only the Log action’s are emitted
--out <file>Also writes the log to a file, as it goes
--clear-settings, -clsResets the preferences before launching

A malformed --param (with no =) is reported on the error output and ignored. name= (an empty value) is accepted.

Values are converted according to the parameter’s declared type — see Variables and data.

CodeMeaning
0The scenario finished correctly
1Failure, cancellation, or an engine error
2Target not found, --out file unreachable, or --run without --open
3Entitlement denied: RESTORM_TOKEN missing, invalid or revoked, insufficient plan, or verification endpoint unreachable

It is this convention that makes the result directly usable by a CI runner.

The log is written to standard output, one entry at a time, as soon as it is produced, as a YAML sequence:

- message: "🔵 [2026-07-29 10:30:00.123] Commande créée"
data: { id: 4271 }

Levels are prefixed with a badge: ⚪ debug, 🔵 info, 🟠 warn, 🔴 error. Lines are never wrapped — the output stays grep-able. Errors go to standard error.

It is exactly the text the interface’s “copy the log” button produces: the same format on both sides.

Use the environment variable secret source: the secret is injected by your CI’s vault, Restorm only reads it, and nothing is written into the project. See Secrets.

name: Tests d'API
on: [push]
jobs:
api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Installer Restorm
env:
RESTORM_VERSION: '1.4.2' # the version you want to pin
run: |
curl -sSL -o restorm.deb \
"https://dl.restorm.app/restorm_${RESTORM_VERSION}_amd64.deb"
sudo apt-get install -y ./restorm.deb
- name: Exécuter les tests de fumée
env:
RESTORM_TOKEN: ${{ secrets.RESTORM_TOKEN }}
API_TOKEN: ${{ secrets.API_TOKEN }}
run: |
xvfb-run -a restorm \
--open ./api.restorm \
--run "Find pets by status" \
--headless \
--all-logs \
--out run.log \
--param status=available
- name: Publier le journal
if: always()
uses: actions/upload-artifact@v4
with:
name: journal-restorm
path: run.log
tests-api:
image: ubuntu:24.04
variables:
RESTORM_TOKEN: $RESTORM_TOKEN
RESTORM_VERSION: '1.4.2' # the version you want to pin
before_script:
- apt-get update && apt-get install -y curl xvfb
- curl -sSL -o restorm.deb "https://dl.restorm.app/restorm_${RESTORM_VERSION}_amd64.deb"
- apt-get install -y ./restorm.deb
script:
- >
xvfb-run -a restorm
--open ./api.restorm
--run "Find pets by status"
--headless --all-logs --out run.log
--param status=$PET_STATUS
artifacts:
when: always
paths: [run.log]
  • Toast actions do nothing; the run carries on as normal.
  • Parameters cannot be asked for interactively: supply them all with --param, or let them take their default value.
  • The MCP server never starts on a machine with no display, whatever the setting says.

The RESTORM_TOKEN token (prefixed rstk_) is generated from your account’s dashboard. It is attached to the organisation, not to a person: it is the token you put in the CI’s vault. See Accounts and signing in.