Steps and shared steps
Manage shared steps and read step definitions with an API key
Shared steps are reusable step groups that can be inserted into multiple tests. The routes in this group operate on shared steps directly (not on per-test steps — use Tests for those).
There is no standalone steps or sharedSteps API key scope. For API keys,
these routes are controlled via the tests scope: any operation that requires
read access maps to tests:read; create, update, and delete operations map
to tests:update. See Authentication and
Scopes.
All routes require x-project-id and resolve the branch from x-branch-id
(or the project default branch if the header is omitted). PUT and DELETE
requests require an active subscription and otherwise return
403 { "message": "LICENSE_REQUIRED" }; GET requests do not.
List shared steps
GET /v1/steps/sharedRequires tests:read. Returns shared steps on the active branch, with
pagination.
Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
limit | integer | 50 | Results per page. Minimum 1. |
page | integer | 0 | Zero-based page index. |
search | string | — | Substring search on step name. |
type | string | all | all, ui, or api. |
Response
{
"data": [
{
"id": "step-uuid",
"name": "Log in as admin",
"action": { "name": "group", "description": "Log in as admin" },
"shared": true,
"group": true
}
],
"pagination": {
"page": 0,
"limit": 50,
"total": 4,
"totalPages": 1,
"hasMore": false
}
}Screenshot data is stripped from action payloads in all list and detail responses.
Get a shared step
GET /v1/steps/:stepIdRequires tests:read. :stepId is the canonical step ID. Returns the shared
step with its action on the active branch.
Response
{
"data": {
"id": "step-uuid",
"name": "Log in as admin",
"action": { "name": "group", "description": "Log in as admin" },
"shared": true,
"group": true
}
}Status codes
| Status | Meaning |
|---|---|
200 | Step found |
404 | Shared step not found on this branch |
Get a shared group step's children
GET /v1/steps/:stepId/childrenRequires tests:read. :stepId is the canonical step ID of a shared group.
Returns the parent step and its child steps.
Response
{
"data": {
"step": {
"id": "step-uuid",
"name": "Log in as admin",
"group": true,
"shared": true
},
"children": [
{
"id": "child-step-uuid",
"name": "Go to login page",
"action": { "name": "goto", "url": "/login" },
"order": 0
}
]
}
}Status codes
| Status | Meaning |
|---|---|
200 | Group found |
404 | Shared group step not found |
Get step usage
GET /v1/steps/:stepId/usageRequires tests:read. :stepId is the canonical step ID. Returns the tests
that use the shared step on the active branch.
Response
{
"data": [
{ "id": "test-uuid", "name": "Login flow" },
{ "id": "test-uuid-2", "name": "Checkout flow" }
]
}Update a shared step
PUT /v1/steps/:stepId/updateRequires tests:update. :stepId is the canonical step ID. Accepts
multipart/form-data.
The server applies copy-on-write: if the action changes and other branches reference this step, a new step record is created rather than mutating the shared one.
Form fields
| Field | Required | Notes |
|---|---|---|
stepData | yes | JSON string with the fields to update. |
files | no | Binary file upload for setInputFiles action (one file per request). |
stepData JSON fields
| Field | Type | Notes |
|---|---|---|
name | string | New display name. |
action | object | New action payload. Structure depends on the action type and is generated by the step editor. |
metadata | object | Step metadata (e.g. screenshot references). |
condition | object | Step condition (skip, always-run, or conditional). |
All fields are optional. Omit a field to leave it unchanged.
Response
{
"data": {
"id": "step-uuid",
"name": "Log in as admin",
"action": { "name": "group", "description": "Log in as admin" }
}
}Update a shared group step's children
PUT /v1/steps/:stepId/childrenRequires tests:update. :stepId is the revision-step ID of the group (the
revisionStepId value returned in step list responses). Accepts
multipart/form-data. Replaces the children of a shared group step with the
provided array. Steps with a matching revisionStepId are updated in place;
steps without one are created; steps in the existing group that are not in the
submitted array are deleted.
Form fields
| Field | Required | Notes |
|---|---|---|
children | yes | JSON-stringified array of child step objects. Each item may include id, name, action, metadata, condition, order, frame, group, shared, and revisionStepId. |
files | no | Binary file uploads for setInputFiles child actions. |
Response
{
"data": {
"step": { "id": "step-uuid", "name": "Log in as admin" },
"children": [
{ "id": "child-uuid", "name": "Go to login page", "order": 0 }
]
}
}Delete a shared step
DELETE /v1/steps/:stepIdRequires tests:update. :stepId is the canonical step ID. Returns 400 if
the step is still referenced by any test on any branch, listing the affected
tests.
Response
{
"message": "Shared step deleted successfully",
"data": { "id": "step-uuid", "shared": true, "group": true }
}Status codes
| Status | Meaning |
|---|---|
200 | Deleted |
400 | Step is in use; response body lists affected tests and branches |
404 | Shared step not found |