Authentication
On GitHub Actions, prefer OIDC via the publishedtestdriverai/action —
there’s no TD_API_KEY secret to store, copy, or rotate. The action proves the
workflow is running inside your org and TestDriver exchanges that proof for your
team’s key at run time. See the GitHub Actions tab below.
For other CI providers (or self-hosted runners without OIDC), fall back to a
stored API key from console.testdriver.ai/team,
added as a TD_API_KEY secret in your CI provider’s settings.
Never commit your API key directly in code. Always use OIDC or your CI provider’s secrets management.
CI Provider Examples
- GitHub Actions
- GitLab CI
- CircleCI
- Azure Pipelines
- Jenkins
Authenticate with OIDC via testdriverai/action (recommended)
Use the published testdriverai/action — it mints the OIDC token, exchanges it for your team’s API key, and exports TD_API_KEY for the steps that follow. No TD_API_KEY secret to store or rotate.One-time setup: authorize the TestDriver GitHub App for your org so the org → team binding exists. If your org authorized the App before OIDC support shipped, re-authorize once. If the App isn’t authorized, the action fails with a console link (or falls back to the
api-key secret if you provide one)..github/workflows/testdriver.yml
Stored-key fallback
Only if you can’t use OIDC (e.g. self-hosted runners without an OIDC provider). Add the key as a secret and pass it viaenv:- Navigate to your GitHub repository
- Go to Settings → Secrets and variables → Actions
- Click New repository secret
- Name:
TD_API_KEY, Value: your API key - Click Add secret
Basic Workflow
Create.github/workflows/testdriver.yml:.github/workflows/testdriver.yml
Parallel Execution
Use matrix strategy to run tests in parallel:.github/workflows/testdriver-parallel.yml
Multi-Platform Testing
.github/workflows/testdriver-multiplatform.yml
Reading Platform in Tests
When using multi-platform testing, read theTD_OS environment variable in your test:
tests/cross-platform.test.mjs
Concurrency limits
Your plan allows a fixed number of sandboxes running at once. When a test asks for a sandbox and you’re already at that limit, the request is queued rather than failed immediately: the SDK waits for a slot to free up, retrying every 10 seconds, then proceeds automatically once one opens. This is what lets a parallel CI matrix (many jobs starting at once) work on a plan with fewer slots than jobs — the extra jobs simply wait their turn instead of erroring. By default the SDK waits up to 60 seconds for a slot before giving up with a concurrency-limit error. Control that ceiling withTD_CONCURRENCY_MAX_WAIT:
| Value | Behavior |
|---|---|
| unset | Wait up to 60 seconds (the default). |
TD_CONCURRENCY_MAX_WAIT=300 | Wait up to 300 seconds (5 minutes) before giving up. |
TD_CONCURRENCY_MAX_WAIT=0 | Don’t queue — fail on the first denial. |
Viewing Results
All test runs are automatically recorded and visible in your TestDriver dashboard at console.testdriver.ai:- All test runs with pass/fail status
- Video replays of each test
- Error messages and screenshots on failure
- Git commit and branch information
- Duration trends over time

