Skip to content

Playwright reporter configuration

Every setting is an option of the reporter in playwright.config, and most have a PROBARA_* environment variable too. Keep the token in the environment, the project in the config (or the environment), and set the rest where it fits your pipeline.

  1. Create an app token from the Playwright card in Workspace › Integrations (get started) and store it as a CI secret named PROBARA_API_TOKEN.
  2. Set the Project ID: projectId in the reporter options, or PROBARA_PROJECT. It is a capital letter followed by capital letters or digits (SHOP, E2E); any other value turns reporting off with an error.
  3. Leave the rest to its default. The run is named after the CI build, and its branch, commit and build URL come from the CI.
playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
reporter: [['list'], ['@probara/playwright-reporter', { projectId: 'SHOP' }]],
});

apiToken exists for code that reads the token from its own secret store. Do not write the token into playwright.config: the file is committed.

The first source that sets a value wins:

OrderSourceExample
1An option in playwright.config{ run: { name: 'Release 2.4' } }
2A PROBARA_* variablePROBARA_RUN_NAME=Nightly
3CI detectionCI #42 from the workflow and run number
4The defaultAutomated run 2026-09-29 14:05 UTC
  • An option set to undefined never hides its variable, and a blank variable counts as unset. To let a variable override an option, leave the option out (or pass process.env.X ?? default).
  • Booleans accept true, 1, yes, on and false, 0, no, off. Lists are comma-separated in variables (PROBARA_RUN_TAGS=nightly,smoke), and records are key=value pairs (PROBARA_RUN_ULIDS=WEB=<ulid>,API=<ulid>).
  • CI detection only fills the run’s name and its source (branch, commit, build URL, and in GitHub Actions the workflow run that groups parallel jobs): see what each CI fills in.

Options and variables can be mixed. This config sets the project and the tags, and the pipeline adds the environment with PROBARA_ENVIRONMENT=staging:

reporter: [
['list'],
['@probara/playwright-reporter', { projectId: 'SHOP', run: { tags: ['e2e', 'nightly'] } }],
],
OptionVariableTypeDefaultWhat it does
enabledPROBARA_ENABLEDbooleanonfalse turns reporting off: nothing is sent, and nothing is logged
apiTokenPROBARA_API_TOKENstringnone (required)The app token. Keep it in the environment
projectIdPROBARA_PROJECTstringnone (required)The Project ID (capital letters and digits), such as SHOP
baseUrlPROBARA_BASE_URLstringhttps://app.probara.netThe Probara host to report to (base URL)
run.ulidPROBARA_RUN_ULIDstringnone: a new runReport into an existing run (sharding)
run.namePROBARA_RUN_NAMEstringthe CI build name, else Automated run <date>Name of a new run
run.descriptionPROBARA_RUN_DESCRIPTIONstringnoneDescription of a new run
run.environmentPROBARA_ENVIRONMENTstringnoneEnvironment of a new run by name, created when none matches (run options)
run.environmentIdPROBARA_ENVIRONMENT_IDstringnoneEnvironment of a new run by ULID
run.milestonePROBARA_MILESTONEstringnoneMilestone of a new run by display id (M-3) or name
run.milestoneIdPROBARA_MILESTONE_IDstringnoneMilestone of a new run by ULID
run.planPROBARA_PLANstringnoneTest plan of a new run by display id (PLAN-2) or name: the run starts with its cases
run.configurationsPROBARA_CONFIGURATIONS{ group, name }[]noneConfigurations of a new run by name (Browser=Chrome,OS=Linux), each group once
run.configurationUlidsPROBARA_CONFIGURATION_ULIDSstring[]noneConfigurations of a new run by ULID
run.tagsPROBARA_RUN_TAGSstring[]noneTags of a new run
run.ulidsPROBARA_RUN_ULIDSRecord<string, string>noneThe run to reuse in each project (WEB=<ulid>,API=<ulid>) (several projects)
projectsPROBARA_PROJECTSstring[]noneOther projects results may go to (WEB,API) (several projects)
source—false | object (GitHub fields below)detected from the CIfalse sends no source; an object overrides the detected fields one by one
source.branchPROBARA_BRANCHstringdetected from the CIBranch of the run source
source.commitPROBARA_COMMITstringdetected from the CICommit of the run source
source.buildUrlPROBARA_BUILD_URLstringdetected from the CICI build URL of the run source
createMissingCasesPROBARA_CREATE_MISSING_CASESbooleantrueCreate a case for a test that matches none (missing cases)
suiteUlidPROBARA_SUITE_ULIDstringthe project rootSuite that created cases go under
closeRunPROBARA_CLOSE_RUNbooleantrue for a new run, false for a reused oneClose the run at the end
closeRuns—Record<string, boolean>noneClose the run of each project ({ SHOP: true, WEB: false }) when closeRun is not set
uploadAttachmentsPROBARA_UPLOAD_ATTACHMENTSbooleantruefalse uploads no file (attachments)
captureOutputPROBARA_CAPTURE_OUTPUTbooleanfalseAttach each attempt’s stdout and stderr as stdout.log and stderr.log
statusMappingPROBARA_STATUS_MAPPING{ passed, failed, skipped, blocked }noneSend a status as another (failed=blocked) (statuses)
statusFilterPROBARA_STATUS_FILTERstring[]noneSend no result with these statuses, after the mapping (skipped)
resultsFilePROBARA_RESULTS_FILEstringnoneJSON file for what could not be sent (results file)
assignFailedToPROBARA_ASSIGN_FAILED_TOstring[]noneAssign each failed result without an assignee to one of these members, in turn (assigning failures)
debugPROBARA_DEBUGbooleanfalseLog every request (debugging)
rootDir—stringPlaywright’s rootDirDirectory the file paths of automation keys are relative to (keys)
chunkSize—number500Results per report request, 1 to 500
timeoutMs—number30000Timeout of one HTTP attempt, in milliseconds, 1 to 600000 (network)
maxRetries—number4Retries of a failed request, 0 to 10
attachmentConcurrency—number2Results whose attachments upload at the same time, 1 to 8

The reporter sends its own name and version in the User-Agent (such as probara-playwright-reporter/0.1.0 probara-core/0.2.0 node/22.12.0); there is no option for it.

In GitHub Actions the source also gets these fields, detected from GITHUB_* variables:

OptionVariableTypeDefaultWhat it does
source.provider—stringdetected from GitHub Actionsgithub_actions (detected) or other
source.repository—stringdetected from GitHub ActionsRepository of the run source, owner/name
source.commitAuthor—stringdetected from GitHub ActionsWho triggered the build
source.pullRequestNumber—numberdetected from GitHub ActionsPull request of the build
source.workflow—stringdetected from GitHub ActionsCI workflow of the run source
source.ciRunId—stringdetected from GitHub ActionsCI run id: the jobs of one GitHub Actions run share one run
source.ciRunAttempt—numberdetected from GitHub ActionsAttempt of the CI run: a re-run reports into a run of its own
source.ciJob—stringdetected from GitHub ActionsCI job of the run source

For code and tests, the reporter also takes the runtime options of @probara/core, the library it is built on. They have no variable, and a playwright.config rarely needs them:

OptionTypeDefaultWhat it does
logger{ debug, info, warn, error }[probara] lines on stderrWhere the reporter logs
envRecord<string, string>process.envWhere PROBARA_* and CI variables are read from
fetchfunctionthe global fetchThe HTTP client
sleepfunctionsetTimeoutWaits between retries
randomfunctionMath.randomJitter of the retry backoff
nowfunctionthe current timeClock of the default run name and of Retry-After dates
SetupWhat the reporter does
No token and no project, or enabled: falseStays off and quiet: nothing is sent, nothing is logged (except at debug).
Only one of them, or an invalid valueReporting is off; each problem is logged, and the tests run as usual.
A token and a project, every value validReports.

A value of the wrong type, such as run.tags: 'nightly' instead of a list, is an invalid value:

reporter: [['@probara/playwright-reporter', { projectId: 'SHOP', run: { tags: 'nightly' } }]],
$ npx playwright test
[probara] Probara reporting is off: run.tags must be a list of strings

Problems name the option or the variable at fault, never its value, so a token never shows up in the log.

Set enabled: false or PROBARA_ENABLED=false, or leave the token out: the reporter sends nothing and stays quiet. Builds that get no secrets, such as pull requests from forks on most CIs, report nothing on their own. To keep what a run would have sent, even with reporting off, set a results file.

baseUrl (PROBARA_BASE_URL) is the Probara host the reporter talks to: the URL of the app, without a path. It defaults to https://app.probara.net, and requests go to that host and nowhere else. Leave it unset unless Probara gives you another host.

The reporter talks HTTPS to one host, the base URL, from Playwright’s main process.

SettingDefaultRangeWhat it bounds
timeoutMs30000 ms1 to 600000One attempt of a request, the response body included
Uploads120000 ms, or timeoutMs if larger—One attempt of an attachment upload (a large file on a slow link)

A timed-out attempt is retried like a network error.

AnswerWhat happens
Network error, timeout, 408, 429, 500, 502, 503, 504Retried
409 with a Retry-After (the same request is still in flight)Retried
A 201 whose body never arrivedRetried; the idempotency key replays it
Any other answer (400, 401, 403, 404, 409, 413, 422…)Not retried: the request fails
  • maxRetries (0 to 10, default 4) sets the retries after the first attempt: 5 attempts in all by default.
  • The wait before retry n is 1 s × 2ⁿ⁻¹, at most 30 s, plus up to 20 % of random jitter.
  • A Retry-After header (seconds or an HTTP date) replaces that wait, capped at 120 s.
  • Each retry is logged, with the attempt and the wait.

With the defaults, a request that keeps failing gives up after about 15 s of waiting (1 + 2 + 4 + 8 s, up to 18 s with the jitter), plus the attempts themselves, each at most timeoutMs. The worst case is a Retry-After on every answer: 120 s before each retry, so 8 minutes of waiting with the default 4 retries (20 minutes with maxRetries: 10). That is per request, and a failed report stops the later ones of its project. Playwright waits for the reporter before it exits, so lower maxRetries or timeoutMs to bound a CI step.

Probara limits API requests per organization (60 requests per minute on Free, 1,200 on Pro, and 3,000 on Enterprise), for every token of the organization together. What a run costs:

RequestHow many
Report1 per chunk of up to 500 results (chunkSize)
Attachment stage1 per result with files (per 20 files or 64 MiB)
Attachment commit1 per result with files
Close1, when attachments were queued (otherwise the last report closes the run)

A run of 2000 attempts without files costs 4 requests; one where 100 attempts have a trace costs about 200 more. 429 answers are retried after their Retry-After. To spread uploads, lower attachmentConcurrency; to send fewer files, keep traces and videos for failures (retain-on-failure) or set uploadAttachments: false.

  • Results go out in chunks of chunkSize (1 to 500, default 500), one after another, in the order the attempts ended. A run case keeps the last outcome recorded, so the order matters. A chunk also stays within Probara’s totals of steps and tags per report.
  • The first chunk creates the run (unless run.ulid names one); the others reuse it.
  • When a chunk fails after its retries, the later chunks of that project are not sent and the run is left open; a results file keeps them.
  • Uploads start once their report is recorded, attachmentConcurrency results at a time (1 to 8, default 2), and the run is closed after the uploads.

Every report, run creation, run close and attachment commit carries an Idempotency-Key, the same on each retry of that request. A retried report whose first attempt was recorded after all is replayed by Probara, never recorded twice (idempotency). Running playwright test again is a new run, with every result recorded again.

The reporter uses Node’s built-in fetch and has no proxy option of its own:

Node.jsProxy support
22.21 or later, 24 or laterSet NODE_USE_ENV_PROXY=1 with HTTPS_PROXY (and NO_PROXY); fetch goes through it
22.12 to 22.20Not supported: fetch ignores HTTPS_PROXY and HTTP_PROXY
Terminal window
NODE_USE_ENV_PROXY=1 HTTPS_PROXY=http://proxy.example.com:8080 npx playwright test

The setting applies to the whole Node process (Node’s docs): put localhost in NO_PROXY if your tests reach a local server through fetch. On older Node versions, upgrade Node or allow app.probara.net through the firewall.

When your network inspects TLS with a private certificate authority (a corporate proxy, say), give Node the CA certificate (PEM) when it starts:

Terminal window
NODE_EXTRA_CA_CERTS=/etc/ssl/certs/company-ca.pem npx playwright test

Node reads NODE_EXTRA_CA_CERTS once at startup, so set it in the environment of the step. On Node 22.19 and later, NODE_USE_SYSTEM_CA=1 trusts the operating system’s certificate store instead. There is no option to turn TLS verification off.

Next: link your tests to cases, or see the run options.