Tests
Create and manage tests via the Smoketest API.
This API manages reusable Tests: editable, markdown-backed test descriptions attached to a project. It can create, update, delete, and run them. Attempt-owned generated Tests from Jira or Linear remain immutable and app-managed, so they do not appear in this collection unless someone explicitly saves an independent reusable copy. To inspect execution, see Runs.
Named saved browser sessions are connected to Personas in the web app. A Test explicitly selects an Environment and a connected Persona, and uses that Persona’s sessions when its Run starts. Session IDs and storage contents are not exposed through this /v1 Test API.
The test object
{
"id": "018eaaaa-abcd-7000-8000-abc123456789",
"workspaceId": "018e1234-abcd-7000-8000-abc123456789",
"projectId": "018e5678-abcd-7000-8000-abc123456789",
"name": "User can log in",
"description": "Open the homepage. Click Login. Enter email 'test@example.com' and password 'hunter2'. Click Sign In. Verify the dashboard heading is visible.",
"url": "https://acme.com",
"environmentId": null,
"personaId": null,
"device": "desktop",
"trigger": "on_demand",
"schedule": null,
"scheduleTimezone": null,
"emailInboxEnabled": false,
"httpAuthEnabled": false,
"httpAuthUsername": null,
"httpAuthPasswordConfigured": false,
"tags": [
{
"id": "018e7777-abcd-7000-8000-abc123456789",
"name": "Smoke",
"slug": "smoke"
}
],
"createdAt": "2026-03-10T12:00:00.000Z",
"updatedAt": "2026-05-15T09:45:00.000Z"
}| Field | Type | Description |
|---|---|---|
id | UUID | Unique identifier |
workspaceId | UUID | Workspace this test belongs to |
projectId | UUID | Parent project |
name | string | Short display name |
description | string | Markdown-backed test steps and expected outcome, written in words |
url | string | URL the agent opens to start the run |
personaId | UUID or null | Explicit Persona connected to the selected Environment |
environmentId | UUID | null | Environment group for the selected Persona |
device | "desktop" | "mobile" | "both" | Viewport to run against |
trigger | "on_demand" | "schedule" | "api" | How this test is normally triggered |
schedule | string | null | Cron expression — only set when trigger = "schedule" |
scheduleTimezone | string | null | IANA timezone for scheduled tests |
emailInboxEnabled | boolean | Whether the agent can receive inbound email during a run. A Run whose Persona has its own inbox uses that address instead |
httpAuthEnabled | boolean | Whether HTTP Basic Auth is enabled for this test |
httpAuthUsername | string | null | HTTP auth username — only set when httpAuthEnabled is true |
httpAuthPasswordConfigured | boolean | Whether an HTTP auth password has been stored (the password itself is write-only) |
tags | array | Project-scoped tags assigned to the test |
createdAt | ISO 8601 | Creation timestamp |
updatedAt | ISO 8601 | Last updated timestamp |
Test descriptions can include Shared Step chips inserted by the app. The stored markdown token is a block-level link such as [Log in](smoketest-shared-step:018effff-abcd-7000-8000-abc123456789). Runs expand the latest Shared Step description and return 422 if a token points to a missing or cross-project Shared Step.
List tests
Query parameters
projectIdtagprojectId.# All tests in the workspace
curl "https://api.smoketest.sh/v1/tests" \
-H "Authorization: Bearer $SMOKETEST_API_KEY"
# Filtered by project
curl "https://api.smoketest.sh/v1/tests?projectId=018e5678-abcd-7000-8000-abc123456789" \
-H "Authorization: Bearer $SMOKETEST_API_KEY"
# Filtered by project tag
curl "https://api.smoketest.sh/v1/tests?projectId=018e5678-abcd-7000-8000-abc123456789&tag=Smoke" \
-H "Authorization: Bearer $SMOKETEST_API_KEY"Sample response
[
{
"id": "018eaaaa-abcd-7000-8000-abc123456789",
"workspaceId": "018e1234-abcd-7000-8000-abc123456789",
"projectId": "018e5678-abcd-7000-8000-abc123456789",
"name": "User can log in",
"description": "Open the homepage. Click Login. Enter email 'test@example.com' and password 'hunter2'. Click Sign In. Verify the dashboard heading is visible.",
"url": "https://acme.com",
"environmentId": null,
"personaId": null,
"device": "desktop",
"trigger": "on_demand",
"schedule": null,
"scheduleTimezone": null,
"tags": [{ "id": "018e7777-abcd-7000-8000-abc123456789", "name": "Smoke", "slug": "smoke" }],
"createdAt": "2026-03-10T12:00:00.000Z",
"updatedAt": "2026-05-15T09:45:00.000Z"
}
]Create a test
Body
projectIdnamedescriptionurlpersonaIdenvironmentIddevice"desktop", "mobile", or "both" — default: "both"trigger"on_demand", "schedule", or "api" — default: "on_demand"scheduletrigger = "schedule"scheduleTimezoneemailInboxEnabledhttpAuthEnabledhttpAuthUsernamehttpAuthEnabled is truehttpAuthPasswordcurl -X POST https://api.smoketest.sh/v1/tests \
-H "Authorization: Bearer $SMOKETEST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "018e5678-abcd-7000-8000-abc123456789",
"name": "User can log in",
"description": "Open the homepage. Click Login. Enter email '\''test@example.com'\'' and password '\''hunter2'\''. Click Sign In. Verify the dashboard heading is visible.",
"url": "https://acme.com",
"device": "desktop"
}'Get a test
Path parameters
idcurl https://api.smoketest.sh/v1/tests/018eaaaa-abcd-7000-8000-abc123456789 \
-H "Authorization: Bearer $SMOKETEST_API_KEY"Update a test
All body fields are optional.
Path parameters
idBody
namedescriptionurlpersonaIdenvironmentIddevice"desktop", "mobile", or "both"trigger"on_demand", "schedule", or "api"scheduletrigger = "schedule"scheduleTimezoneemailInboxEnabledhttpAuthEnabledhttpAuthUsernamehttpAuthPasswordcurl -X PATCH https://api.smoketest.sh/v1/tests/018eaaaa-abcd-7000-8000-abc123456789 \
-H "Authorization: Bearer $SMOKETEST_API_KEY" \
-H "Content-Type: application/json" \
-d '{"device": "mobile", "scheduleTimezone": "Europe/Berlin"}'Delete a test
Path parameters
idReturns 204 No Content.
curl -X DELETE https://api.smoketest.sh/v1/tests/018eaaaa-abcd-7000-8000-abc123456789 \
-H "Authorization: Bearer $SMOKETEST_API_KEY"Trigger a run
To start a run for a test, see Trigger a run in the Runs reference — that page also covers polling for the result.
Trigger runs by tag
Use a project tag to start one run for every matching test in that project. The endpoint fails instead of partially starting a group when no tests match or billing/concurrency limits would block the whole group.
Body
projectIdtagstartUrlcurl -X POST https://api.smoketest.sh/v1/tests/run \
-H "Authorization: Bearer $SMOKETEST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"projectId": "018e5678-abcd-7000-8000-abc123456789",
"tag": "Smoke",
"startUrl": "https://preview-acme.vercel.app"
}'Sample response
{
"projectId": "018e5678-abcd-7000-8000-abc123456789",
"tag": "Smoke",
"count": 2,
"runs": [
{
"id": "018e9999-abcd-7000-8000-abc123456789",
"testId": "018eaaaa-abcd-7000-8000-abc123456789",
"startUrl": "https://preview-acme.vercel.app/",
"status": "pending",
"createdAt": "2026-06-09T12:00:00.000Z",
"test": {
"id": "018eaaaa-abcd-7000-8000-abc123456789",
"projectId": "018e5678-abcd-7000-8000-abc123456789",
"name": "User can log in"
},
"links": {
"dashboardRun": "https://smoketest.sh/p/my-app/runs/018e9999-abcd-7000-8000-abc123456789",
"dashboardTest": "https://smoketest.sh/p/my-app/tests/018eaaaa-abcd-7000-8000-abc123456789"
}
}
]
}When setting environmentId, include personaId explicitly (or null for no Persona). The Persona must be connected to the Environment in the same project. This applies to manual and scheduled Tests; automatic ticket Persona selection occurs only for Attempts.