# QA Sphere Docs - [Introduction](/docs): Welcome to QA Sphere Documentation - Test Management System - [Overview](/docs/tms): Test Management System Description - [Quick Start](/docs/quick-start): Dive in into managing your tests - [Test Run Configuration](/docs/test-run-configuration): Set up test runs - [Test Plans](/docs/tms/test-plans): Group related test runs into a single plan to execute and track them together - [AI Features](/docs/tms/ai-features): Generate, review, and interrogate your test case library with QA Sphere's built-in AI - Integrations: Connect QA Sphere with issue trackers and other tools - [Overview](/docs/integrations-intro): Integrations Overview - [GitHub Integration](/docs/github): Creating GitHub Issues from QA Sphere - [Jira Integration](/docs/jira): Creating Jira Issues from QA Sphere - [Linear Integration](/docs/linear): Creating Linear Issues from QA Sphere - Custom Issue Trackers - [Overview](/docs/custom-issue-trackers): Configure and use custom issue trackers with QA Sphere - [Jira (Custom Integration)](/docs/jira-custom): Creating Jira Issues from QA Sphere using Custom Issue Tracker - [Trello](/docs/trello): Creating Trello Cards from QA Sphere using Custom Issue Tracker - [GitLab](/docs/gitlab): Creating GitLab Issues from QA Sphere using Custom Issue Tracker - [Notion](/docs/notion): Creating Notion Issues from QA Sphere using Custom Issue Tracker - [YouTrack](/docs/youtrack): Creating YouTrack Issues from QA Sphere using Custom Issue Tracker - [ClickUp](/docs/clickup): Creating ClickUp Tasks from QA Sphere using Custom Issue Tracker - [Zendesk](/docs/zendesk): Creating Zendesk Tickets from QA Sphere using Custom Issue Tracker - [Sentry.io](/docs/sentry): Creating Sentry Issues from QA Sphere using Custom Issue Tracker - [Zoho Desk](/docs/zoho-desk): Creating Zoho Desk Tickets from QA Sphere using Custom Issue Tracker - [Document 360](/docs/document360): Creating Document 360 Tickets from QA Sphere using Custom Issue Tracker - [Nuclino](/docs/nuclino): Creating Nuclino Items from QA Sphere using Custom Issue Tracker - [Slack Integration](/docs/slack): Get test run and result notifications in your Slack channels - [MCP Server](/docs/integrations/mcp): Connect Claude, Cursor, and other AI clients to your QA Sphere workspace over the Model Context Protocol - Result Upload - [Result Upload](/docs/integrations/result-upload): Upload JUnit XML, Playwright JSON, and Allure results to QA Sphere test runs - [Playwright Integration](/docs/cli-usage-playwright): Use the QAS CLI to upload Playwright test results to QA Sphere - [Cypress Integration](/docs/cli-usage-cypress): Use the QAS CLI to upload Cypress test results to QA Sphere - [Python (pytest) Integration](/docs/cli-usage-pytest): Use the QAS CLI to upload pytest test results to QA Sphere - [WebdriverIO Integration](/docs/cli-usage-webdriverio): Use the QAS CLI to upload WebdriverIO test results to QA Sphere - [Uploading Playwright Results with Auto Test Case Creation](/docs/integrations/result-upload/playwright-create-tcases-guide): How to use --create-tcases to automatically create QA Sphere test cases when uploading Playwright results - CI/CD Integrations - [CI/CD Examples](/docs/integrations/ci-cd): Integrate QA Sphere with your CI/CD pipelines - [GitHub Actions Integration](/docs/integrations/ci-cd/github-actions): Automate test result uploads from GitHub Actions workflows to QA Sphere using the QAS CLI tool - [GitLab CI/CD Integration](/docs/integrations/ci-cd/gitlab): Automate test result uploads from GitLab pipelines to QA Sphere using the QAS CLI tool - [Bitbucket Pipelines Integration](/docs/integrations/ci-cd/bitbucket): Automate test result uploads from Bitbucket Pipelines to QA Sphere using the QAS CLI tool - Import & Export - [Import](/docs/import): Importing test cases - [Import with AI](/docs/import-with-ai): Using AI to import test cases from spreadsheets - [Export](/docs/export): Exporting test cases - API: v0 api docs - [Overview](/docs/api/api_intro): Overview of the QA Sphere Public API - [Authentication](/docs/api/authentication): How to authenticate with the QA Sphere API - [HTML Support](/docs/api/html-support): Understanding HTML sanitization and supported markup in QA Sphere API - Endpoints: API endpoint documentation - [Audit Logs](/docs/api/audit_logs): How to retrieve audit logs using the public API - [Folders](/docs/api/folders): How to list folders in a project using the public API - [Milestones](/docs/api/milestone): How to list milestones in a project using the public API - [Test Plans](/docs/api/plan): How to manage test plans using the public API - [Projects](/docs/api/projects): Get project information in your account - [Requirements](/docs/api/requirements): How to work with requirements using the public API - [Results](/docs/api/result): How to add result for a test case in a run using public API - [Runs](/docs/api/run): How to manage test runs using the public API - [Settings](/docs/api/settings): How to check and update different settings using public API - [Shared Preconditions](/docs/api/shared_preconditions): How to work with shared preconditions using the public API - [Shared Steps](/docs/api/shared_steps): How to work with shared steps using the public API - [Tags](/docs/api/tag): How to work with test case tags using the public API - [Test Cases](/docs/api/tcases): How to work with test cases using the public API - [Custom Fields](/docs/api/tcases_custom_fields): How to work with custom fields using the public API - [Upload Files](/docs/api/upload_file): How to upload files using public API - [Users](/docs/api/users): How to retrieve user information using the public API - CLI - [Overview](/docs/cli): Command-line interface for QA Sphere — install, authenticate, upload results, and access the public API - [Auth](/docs/cli/auth): Authenticate the QA Sphere CLI via OAuth login or an API token - [Public API](/docs/cli/public-api): Call the full QA Sphere REST API from the command line - [Agent Skill](/docs/cli/agent-skill): Register the QA Sphere CLI with Claude Code, Cursor, and other AI coding agents - Reports - [Reports Overview](/docs/reports-overview): Comprehensive guide to QA Sphere reporting capabilities - [View Results](/docs/reports/view-results-report): Comprehensive analysis of test case execution results across test runs - [Detailed Results](/docs/reports/detailed-results-report): Full result detail for a test run, including tester comments, attachments, and linked issues - [Test Runs Scorecard](/docs/reports/run-scorecard-report): Compare and analyze multiple test runs to identify trends and patterns - [Effort by Team Member](/docs/reports/effort-by-team-member-report): Analyze individual team member testing effort, productivity, and workload distribution - [Traceability](/docs/reports/traceability-report): Map test cases to requirements to ensure complete test coverage - [Test Case Duration](/docs/reports/test-case-duration-report): Analyze test execution times to optimize test suites and CI/CD pipelines - [Test Case Success Rate](/docs/reports/test-case-success-rate-report): Identify unreliable tests and track test quality across multiple executions - [Automation Coverage](/docs/reports/automation-coverage-report): Track test automation progress and identify manual testing gaps - Administration - [Overview](/docs/administration-intro): Administration - [Users and Permissions](/docs/users-permissions): Users and Permissions - [Security](/docs/administration/security): Sign-in methods, two-factor authentication, IP restrictions, and audit logging for your workspace - [Billing](/docs/billing): Understanding QA Sphere's flexible pricing plans - Release Notes - [Overview](/docs/release-notes): Latest updates and improvements to QA Sphere - [August '26: 26W32](/docs/26W32): Release Notes for QA Sphere 26W32 update - [July '26: 26W28](/docs/26W28): Release Notes for QA Sphere 26W28 update - [June '26: 26W22](/docs/26W22): Release Notes for QA Sphere 26W22 update - [May '26: 26W17](/docs/26W17): Release Notes for QA Sphere 26W17 update - [April '26: 26W14](/docs/26W14): Release Notes for QA Sphere 26W14 update - [March '26: 26W10](/docs/26W10): Release Notes for QA Sphere 26W10 update - [February '26: 26W06](/docs/26W06): Release Notes for QA Sphere 26W06 update - [January '26: 26W02](/docs/26W02): Release Notes for QA Sphere 26W02 update - 2025 - [2025 Release Notes](/docs/release-notes/2025): QA Sphere release notes for 2025. - [December '25: 25W48](/docs/25W48): Release Notes for QA Sphere 25W48 update - [November '25: 25W45](/docs/25W45): Release Notes for QA Sphere 25W45 update - [October '25: 25W40](/docs/25W40): Release Notes for QA Sphere 25W40 update - [September '25: 25W36](/docs/25W36): Release Notes for QA Sphere 25W36 update - [August '25: 25W32](/docs/25W32): Release Notes for QA Sphere 25W32 update - [July '25: 25W27](/docs/25W27): Release Notes for QA Sphere 25W27 update - [June '25: 25W24](/docs/25W24): Release Notes for QA Sphere 25W24 update - [June '25: 25W21](/docs/25W21): Release Notes for QA Sphere 25W21 update - [May '25: 25W17](/docs/25W17): Release Notes for QA Sphere 25W17 update - [April '25: 25W13](/docs/25W13): Release Notes for QA Sphere 25W13 update - [March '25: 25W10](/docs/25W10): Release Notes for QA Sphere 25W10 update - [February '25: 25W07](/docs/25W07): Release Notes for QA Sphere 25W07 update - [January '25: 25W03](/docs/25W03): Release Notes for QA Sphere 25W03 update - 2024 - [2024 Release Notes](/docs/release-notes/2024): QA Sphere release notes for 2024. - [December '24: 24W52](/docs/24W52): Release Notes for QA Sphere 24W52 update - [December '24: 24W48](/docs/24W48): Release Notes for QA Sphere 24W48 update - [SAML SSO](/docs/saml): Sign in to QA Sphere through your identity provider using SAML 2.0 single sign-on - [SCIM](/docs/scim): Provision and deprovision QA Sphere users from your identity provider using SCIM 2.0 - [Webhooks](/docs/webhooks): Receive real-time notifications when events occur in QA Sphere - [Help and Support](/docs/help-and-support): Contact us for assistance or more details # Help and Support URL: /docs/help-and-support Have you encountered any issues or have feedback to share about QA Sphere? We're here to help. ## From Inside QA Sphere The quickest route is the **Help & Feedback** page in the app. It has a built-in form for bug reports, feature requests, and questions, and you can **attach files** — a screenshot or a log usually saves a whole round trip of questions. Help and Feedback page with built-in form for bug reports and feature requests Submitting from inside the app is preferable to email because your workspace and account details come through with the request, so we do not have to ask which instance you are on. ## By Email You can also reach us directly at [sorted@qasphere.com](mailto:sorted@qasphere.com). When reporting a problem, these details help us get to an answer faster: * Your workspace URL (for example `acme.eu1.qasphere.com`) * What you expected to happen, and what happened instead * The time the problem occurred, and any error message shown * A screenshot, if the problem is visible on screen We aim to respond to all inquiries within 24-48 hours. Response times depend on your plan's support level — see [Billing](/docs/billing). ## New to QA Sphere? New workspaces show an **onboarding widget** on the main page with guided videos, useful links, and a contact form, which is the fastest way to get oriented. The [Quick Start](/docs/quick-start) guide covers the same ground in writing. ## Before You Write Some questions have a faster answer than a support ticket: * **Something changed in the interface?** Check the [Release Notes](/docs/release-notes) — the feature may have moved or been renamed. * **API or CLI trouble?** The [API Overview](/docs/api/api_intro) covers authentication, rate limits, and error codes, and the [CLI](/docs/cli) page covers installation and auth. * **Sign-in problems?** [Security](/docs/administration/security) covers sign-in methods and 2FA; [SAML SSO](/docs/saml) has a troubleshooting table keyed by error message. * **Billing or plan questions?** See [Billing](/docs/billing). Your feedback is valuable to us and helps improve QA Sphere for everyone. Thank you for using QA Sphere! --- # Introduction URL: /docs ## Welcome to QA Sphere Documentation This documentation is organized into sections to help you get started quickly and find the information you need. ### Test Management System Learn the fundamentals of QA Sphere with the [Test Management System](/docs/tms) guide — how to create projects, manage test cases, and execute test runs. * [Quick Start](/docs/quick-start) - Get up and running in minutes * [Test Run Configuration](/docs/test-run-configuration) - Configure and manage your test executions * [Test Plans](/docs/tms/test-plans) - Group related test runs into a release cycle * [AI Features](/docs/tms/ai-features) - Bulk generation, the test case assistant, duplicate detection, and AI rules ### Integrations Connect QA Sphere with your favorite tools using [Integrations](/docs/integrations-intro) to streamline bug reporting, defect management, and team notifications. * Issue trackers: Jira, GitHub Issues, Linear, GitLab, and more * [Slack](/docs/slack) - Test run and result notifications in your channels * [MCP Server](/docs/integrations/mcp) - Connect Claude, Cursor, and other AI clients to your test data * [Webhooks](/docs/webhooks) - Send events to any HTTP endpoint ### Import & Export Migrate your existing test cases to QA Sphere or export your data with [Import & Export](/docs/import). * [CSV Import](/docs/import) - Self-service import, plus built-in importers for Qase, Testomat, and Zebrunner * [Import with AI](/docs/import-with-ai) - Use AI to parse and import existing spreadsheets * [Export](/docs/export) - Export your test cases and data ### REST API Build custom integrations using the [QA Sphere REST API](/docs/api/api_intro). * Authentication, test cases, test runs, results, and more ### CLI Drive QA Sphere from the terminal with the [CLI](/docs/cli) — install once, then auth, call the API, upload results, and wire up CI/CD. * [Auth](/docs/cli/auth), [Public API](/docs/cli/public-api), [Result Upload](/docs/integrations/result-upload), [Agent Skill](/docs/cli/agent-skill) * CI/CD integrations for GitHub Actions, GitLab CI/CD, Bitbucket Pipelines ### Reports Transform your test data into actionable insights with the Overview dashboard and eight built-in [Reports](/docs/reports-overview). * View Results, Detailed Results, Run Scorecard, Traceability, Effort by Team Member, and more ### Administration Configure QA Sphere for your team with [Administration](/docs/administration-intro) — manage users, permissions, security, and billing. * [Users & Permissions](/docs/users-permissions) - Roles, project access, and suspending users * [Security](/docs/administration/security) - Sign-in methods, 2FA enforcement, IP allow lists, audit log * [SAML SSO](/docs/saml) and [SCIM Provisioning](/docs/scim) - Identity provider integration * [Billing Plans](/docs/billing) - Plans, trial, and subscription management ### Release Notes Stay up to date with the latest features and improvements in the Release Notes section of the sidebar. ### Help & Support Get [help and support](/docs/help-and-support) when you need it. --- # SAML SSO URL: /docs/saml QA Sphere supports SAML 2.0 single sign-on, so your team can sign in through identity providers like Okta, Microsoft Entra ID, Auth0, Google Workspace, or JumpCloud instead of managing separate passwords. Combined with [SCIM provisioning](https://qasphere.com/docs/scim), your IdP becomes the single source of truth for who can access QA Sphere. SAML SSO is available on the **Business plan and above**. Configuration requires the **Admin** or **Owner** role. ## Service Provider Details QA Sphere does not publish an SP metadata file — register it in your IdP by entering these two values manually. Both are shown with copy buttons in **Settings → Security** once you enable SAML: | Field | Value | | ------------------------------- | --------------------------------------------------------------------- | | **Audience URI (SP Entity ID)** | `urn:hypersequent:qasphere:{workspace-id}` | | **Single Sign-On URL (ACS)** | `https://{your-company}.{your-region-code}.qasphere.com/api/saml/acs` | Copy the exact values from the Security page rather than constructing them yourself — the Entity ID embeds your workspace's unique ID. When configuring the IdP application, keep in mind: * QA Sphere sends the sign-in request via the **HTTP-Redirect** binding, so your IdP's SAML metadata must advertise an HTTP-Redirect single sign-on endpoint. The response comes back as a standard browser POST to the ACS URL. * Assertions must be **signed** by the IdP. QA Sphere verifies every response against the certificates in your IdP metadata. * Do not require **signed AuthnRequests** and do not enable **assertion encryption** — QA Sphere has no SP certificate, so neither is supported. ### Attribute Mapping QA Sphere resolves the signing-in user by email. Configure your IdP to release: | Attribute | Purpose | | --------------------------------------------- | ------------------------------------------------------------- | | `email` (also accepts `mail`, `emailAddress`) | **Required.** Matched against the QA Sphere account email. | | `firstName` / `givenName`, `lastName` / `sn` | Optional. Used as the display name when a new user registers. | | `displayName` or `name` | Optional fallback if first/last name attributes are absent. | If no email attribute is present, QA Sphere falls back to the NameID — but only when it is an email address. Some IdPs (ADFS in particular) put an opaque identifier in the NameID rather than an email, so always map an explicit email attribute. ## Configuring QA Sphere 1. Go to **Settings → Security** and turn on **Sign in with SAML SSO**. 2. Choose how QA Sphere reads your IdP metadata: * **Metadata URL** (recommended) — QA Sphere fetches the URL when you save and re-fetches it daily, so IdP certificate rotation is picked up automatically. The URL must be publicly reachable — addresses on private networks are rejected. * **Metadata XML** — paste the metadata document (or use **Load from file…**), up to 1 MiB. It is used as-is: after your IdP rotates certificates or changes endpoints, you must paste the updated metadata yourself. 3. Copy the **Audience URI** and **Single Sign-On URL** from the same page into your IdP application. Settings save automatically on change. The metadata is fetched and validated immediately, so mistakes surface right away — for example, metadata without an HTTP-Redirect sign-on endpoint or without a signing certificate is rejected on save. Once saved, use the **Test SSO login** link on the Security page: it starts the sign-in flow in a new tab, and landing back on the Security page confirms the round trip works. ## How Users Sign In Members sign in with the **Sign in with SSO** button on your workspace's sign-in page. QA Sphere matches the asserted email against existing accounts and starts a regular session. Multi-factor authentication is your IdP's responsibility — QA Sphere does not run its own 2FA challenge for SAML sign-ins. New users are not created automatically on first sign-in. Someone must exist in QA Sphere before SAML lets them in: * **Invite them** from **Settings → Members**. The invitation email opens the registration page, where **Register with SSO** completes sign-up through the IdP. The invitation email must match the email asserted by the IdP. * **Or provision them via [SCIM](https://qasphere.com/docs/scim)** to automate the whole lifecycle. Users without an account see an error asking them to request an invitation from an admin. ## Enforcing SSO To make SAML the only way in, turn off **Password Authentication** and **Sign in with Google** in **Settings → Security** — at least one method must always remain enabled. Disabling a method signs out every user who has no remaining allowed sign-in method. ## Limitations * Sign-in is SP-initiated only: users start from the QA Sphere sign-in page (or an invitation link), not from the IdP dashboard. * One IdP configuration per workspace. * Single Logout (SLO) is not supported — signing out of QA Sphere does not end the IdP session, and vice versa. * No just-in-time provisioning — use invitations or [SCIM](https://qasphere.com/docs/scim). The ACS URL contains your workspace subdomain. If your workspace URL changes, update the Single Sign-On URL in your IdP application, or sign-in will break. ## Troubleshooting | Symptom | Likely cause | | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | "no HTTP-Redirect SSO Location found in metadata" | Your IdP metadata only advertises an HTTP-POST sign-on endpoint. Enable the HTTP-Redirect binding in the IdP application. | | "could not fetch SAML metadata from URL" | The metadata URL is unreachable from the internet, returns a non-200 status, or points to a private address. | | "saml audience mismatch" | The Audience URI in your IdP doesn't match the value shown in **Settings → Security**. | | "saml assertion invalid" | Signature verification failed — usually stale certificates. Re-save the metadata URL or paste the current metadata XML. | | "saml assertion expired" | The assertion's validity window doesn't match QA Sphere's clock. Check your IdP's clock settings. With Auth0 this can appear intermittently — retrying usually works. | | "no account for … ask an admin to invite you" | The user doesn't exist in QA Sphere yet. Invite them or provision via SCIM. | | "register token email does not match…" | The invitation was sent to a different email than the IdP asserts. Re-invite using the IdP email. | | "saml login is disabled for this tenant" | The **Sign in with SAML SSO** toggle is off, or your subscription no longer includes advanced authentication. | If you get stuck, contact [QA Sphere support](https://qasphere.com/docs/help-and-support) with the error message and the time of the failed sign-in attempt — the exact reason a sign-in was rejected is recorded on our side. --- # SCIM URL: /docs/scim QA Sphere supports [SCIM 2.0](https://datatracker.ietf.org/doc/html/rfc7644) (System for Cross-domain Identity Management) so identity providers like Okta, Microsoft Entra ID, and Authentik can automatically provision, update, and deactivate user accounts. Instead of managing users manually in QA Sphere, your IdP keeps them in sync — a new hire is created when assigned, attribute changes are pushed automatically, and a departing employee is deactivated when their access is removed. ## Base URL ``` https://{your-company}.{your-region-code}.qasphere.com/api/scim/v2 ``` ## Authentication SCIM uses the same API keys as the rest of QA Sphere. Generate one in **Settings → API Keys** under an account with the **Admin** role. See the [API authentication guide](https://qasphere.com/docs/api/authentication) for details on creating keys. Configure your identity provider with one of the following `Authorization` header formats — most IdPs default to **Bearer**: ``` Authorization: Bearer {your-api-key} Authorization: Basic {base64("ApiKey:" + your-api-key)} ``` SCIM requests act on your tenant's user directory. Store the API key in your IdP's secret manager and rotate it like any other production credential. ## Configuring Your Identity Provider In your IdP's SCIM application, set: | Field | Value | | ----------------- | -------------------------------------------------------------------- | | **SCIM endpoint** | `https://{your-company}.{your-region-code}.qasphere.com/api/scim/v2` | | **Auth scheme** | Bearer token (or HTTP Basic, depending on the connector) | | **Token** | Your QA Sphere API key | Once connected, the IdP can: * **Create users** by assigning the QA Sphere app to a user or group * **Update users** when their name or email changes upstream * **Deactivate users** by unassigning them or disabling them in the IdP * **Reactivate users** by re-enabling them ## How User Lifecycle Works ### Provisioning When the IdP creates a user, QA Sphere creates an account with the provided name and email. Passwords are never set via SCIM — the new user sets their initial password through the **Forgot password** flow on the sign-in page. New users are created with the **User** role and granted access to **all projects** in the workspace. Role and project access changes are not driven by SCIM — adjust them directly in QA Sphere under **Settings → Members**. ### Updating The IdP can update the user's `name`, `email`, `externalId`, and the `active` flag. Email changes update the user's login email and end any active sessions; the user signs back in with the new address. ### Deactivation and Reactivation Setting `active: false` **suspends** the user. Their account is preserved along with all historical test cases, runs, results, and audit history they authored — they simply cannot sign in. Setting `active: true` restores access. QA Sphere does not support hard-deleting users via SCIM. This is intentional: removing a user would orphan the QA history they contributed. ## Supported Attributes QA Sphere maps a focused subset of the SCIM User schema. Because QA Sphere stores a single name and a single email per user, several SCIM attributes collapse onto the same field: | SCIM attribute | QA Sphere field | | ----------------------------------------------------------------------------------------- | ---------------------------- | | `userName` | Email (also used to sign in) | | `emails[]` — entry marked `primary: true`, or the first non-empty entry | Email | | `displayName` (falls back to `name.formatted`, then `name.givenName` + `name.familyName`) | Name | | `active` | Account enabled | | `externalId` | IdP correlation ID | Other attributes in the request payload are accepted but ignored. ## Constraints A few rules are enforced to keep the directory consistent with QA Sphere's user model: * **`userName` must be a valid email address.** QA Sphere has no separate username — the email is the identifier used to sign in. * **`userName` must match the primary email.** If `emails` is included in the payload, its primary value must equal `userName`; otherwise the request is rejected with `400 Bad Request`. * **Email must be unique across the workspace.** Conflicts return `409 Conflict`. * **Workspace owners cannot be modified by non-owner callers**, and an owner cannot be deactivated through SCIM. Transfer ownership in QA Sphere first if you need to deprovision an owner. * **You cannot deactivate the user whose API key is being used.** Use a different admin's key, or have another admin perform the change. ## Auditing Every SCIM-driven change is recorded in the QA Sphere audit log under **Settings → Audit Log**, including user creation, attribute updates, deactivation, and reactivation. Filter by the SCIM-specific event types to review IdP activity. ## Troubleshooting | Symptom | Likely cause | | ------------------------------------------- | ---------------------------------------------------------------------------------------- | | `401 Unauthorized` | API key missing, malformed, or revoked. Re-issue from **Settings → API Keys**. | | `403 Forbidden` | The API key's owner is not an Admin, or you're trying to modify a workspace owner. | | `400` "`userName` must be an email address" | Configure your IdP to send the user's email as `userName`. | | `400` "primary email must match userName" | Map the same value to both `userName` and the email entry in your IdP attribute mapping. | | `409 Conflict` | A user with that `userName` already exists in QA Sphere. | If you need help, contact [QA Sphere support](https://qasphere.com/docs/help-and-support) and include the SCIM request and response (with secrets redacted). --- # Webhooks URL: /docs/webhooks Webhooks allow you to receive real-time HTTP notifications when events occur in QA Sphere. When an event triggers, QA Sphere sends an HTTP POST request to your configured endpoint with details about the event. ## Creating a Webhook Navigate to **Settings > Integrations > Webhooks** and click **Create Webhook**. ### Connection Settings | Field | Description | | --------------- | --------------------------------------------------------------- | | **Name** | A descriptive name for your webhook | | **Endpoint** | The HTTPS URL where webhook payloads will be sent | | **Secret** | Optional shared secret for signature verification (recommended) | | **Event Types** | Select which events should trigger this webhook | | **Enabled** | Toggle to enable or disable the webhook | ### Request Customization You can customize the HTTP request sent to your endpoint: * **Headers**: Add custom headers (one per line, format: `Header-Name: value`) * **Payload**: Define a custom JSON payload template with variable substitution ### Project Permissions Control which projects trigger the webhook: * **All Projects**: Webhook fires for events in any project * **Specific Projects**: Select individual projects to monitor ## Event Types | Event | Description | | ----------------- | ---------------------------------------------------------------------------------------------- | | `plan_created` | A test plan was created | | `plan_updated` | A test plan was updated, closed, reopened, or deleted | | `run_created` | A test run was created | | `run_updated` | A test run was updated, closed, reopened, or deleted | | `tcase_created` | A single test case was created | | `tcases_created` | Multiple test cases were created in a batch operation (e.g. copy multiple, Bulk AI generation) | | `tcase_edited` | A single test case was edited | | `tcases_edited` | Multiple test cases were edited in a batch operation | | `result_created` | A single test result was recorded | | `results_created` | Multiple test results were recorded in a batch operation | ## Template Variables Use template variables in your custom payload and headers using the `${variable}` syntax. ### Universal Variables Available for all event types: | Variable | Type | Description | | ------------------- | ------- | ---------------------------------------------------- | | `${event_type}` | string | The event type (e.g., `plan_created`, `run_updated`) | | `${timestamp}` | string | RFC3339 timestamp when the event occurred | | `${project_id}` | string | The project's unique identifier | | `${project_code}` | string | The project's short code (e.g., `PRJ`) | | `${id}` | string | The entity's unique identifier | | `${name}` | string | The entity's title or name | | `${url}` | string | Direct URL to view the entity in QA Sphere | | `${event_creator}` | string | Name of the user who performed the action | | `${event_created}` | string | RFC3339 timestamp when the action occurred | | `${entity_creator}` | string | Name of the user who originally created the entity | | `${entity_created}` | string | RFC3339 timestamp when the entity was created | | `${is_deleted}` | boolean | Whether the entity is deleted (`true` or `false`) | ### Plan-Specific Variables | Variable | Type | Description | | ---------------------- | ------ | ---------------------------------------------------------- | | `${event_description}` | string | Description of the action (e.g., "Plan created") | | `${configuration}` | string | Comma-separated list of configuration names | | `${completed_on}` | string | RFC3339 timestamp when the plan was closed (empty if open) | ### Run-Specific Variables | Variable | Type | Description | | ---------------------- | ------ | --------------------------------------------------------- | | `${event_description}` | string | Description of the action (e.g., "Run created") | | `${assigned_to}` | string | Name of the assigned user (empty if unassigned) | | `${configuration}` | string | Configuration name (empty if none) | | `${completed_on}` | string | RFC3339 timestamp when the run was closed (empty if open) | ### Test Case-Specific Variables | Variable | Type | Description | | ------------------- | ------ | ---------------------------------------- | | `${tcase_seq}` | string | Test case sequence number | | `${tcase_priority}` | string | Priority level (`low`, `medium`, `high`) | ### Result-Specific Variables | Variable | Type | Description | | ---------------------- | ------ | ------------------------------------------------------------------ | | `${event_description}` | string | Description including test case and run titles | | `${result_status}` | string | Result status (e.g., `passed`, `failed`, `skipped`, `blocked`) | | `${result_comment}` | string | Comment added to the result (empty string if no comment was added) | | `${result_links}` | string | Comma-separated list of link URLs (empty if no links) | ### Bulk Event Variables For `results_created` events: | Variable | Type | Description | | ---------- | ----- | ---------------------------------------------- | | `${ids}` | array | Array of result IDs (when used as exact value) | | `${items}` | array | Array of item objects with individual details | Each item in `${items}` contains: * `id` - Result ID * `url` - URL to view the result * `result_status` - Result status (e.g., `passed`, `failed`) * `result_comment` - Comment added to the result * `result_links` - Comma-separated list of link URLs ## Payload Examples ### Default Payload When no custom payload is specified, QA Sphere sends: ```json { "event_type": "run_created", "timestamp": "2026-01-21T11:07:57Z", "data": { "id": "22", "name": "UI Testing Test Run", "url": "https://example.qasphere.com/project/DB/run/22", "project_id": "1CJjW1Amf_a8hximyr325zz", "project_code": "DB", "event_description": "Run created", "event_creator": "Nick Lapis-Trout", "event_created": "2026-01-21T11:07:57Z", "entity_creator": "Nick Lapis-Trout", "entity_created": "2026-01-21T11:07:57Z", "is_deleted": false, "assigned_to": "Nick Lapis-Trout", "configuration": "Android", "completed_on": "" } } ``` ### Custom Payload with Variables ```json { "event": "${event_type}", "project": "${project_code}", "entity": { "id": "${id}", "name": "${name}", "url": "${url}" }, "actor": "${event_creator}", "deleted": "${is_deleted}" } ``` ### Typed Variable Substitution When a variable is the **exact and only value** of a JSON field, it preserves its type: ```json { "deleted": "${is_deleted}", "result_ids": "${ids}" } ``` Results in: ```json { "deleted": true, "result_ids": ["123", "456", "789"] } ``` When a variable is **embedded in a string**, it becomes a string: ```json { "message": "Entity ${id} was ${event_type}" } ``` Results in: ```json { "message": "Entity 42 was run_created" } ``` ## Integration Examples ### Slack QA Sphere also offers a native [Slack integration](/docs/slack) with ready-made notifications, slash commands, and link previews — no webhook configuration needed. Use a webhook only if you need full control over the message format. To send webhook notifications to Slack, create a [Slack Incoming Webhook](https://api.slack.com/messaging/webhooks) and use it as your endpoint. Configure a custom payload using Slack's Block Kit format: **Event Types**: Select `tcase_created` to notify when new test cases are added. **Custom Payload**: ```json { "text": "${event_creator} created a new test case in ${project_code}", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*${event_creator}* created a new test case:" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": "*<${url}|${name}>*\nProject: ${project_code}\nPriority: ${tcase_priority}" } } ] } ``` This produces a Slack message like: > **John Doe** created a new test case: > > *** > > **[Verify login with valid credentials](https://example.qasphere.com/project/PRJ/tcase/42)** > Project: PRJ > Priority: high The `text` field serves as a fallback for notifications and accessibility. Always include it alongside `blocks`. ## Request Headers QA Sphere automatically includes these headers with every webhook request: | Header | Description | | --------------------- | ----------------------------------------------------- | | `Content-Type` | Always `application/json` | | `X-Webhook-ID` | Unique identifier for this delivery (for idempotency) | | `X-Webhook-Timestamp` | Unix timestamp when the request was sent | | `X-Webhook-Signature` | HMAC-SHA256 signature (only if secret is configured) | ### Custom Headers Add custom headers in the webhook configuration: ``` Authorization: Bearer your-token X-Custom-Header: custom-value X-Project: ${project_code} ``` **Reserved Headers** The following headers cannot be overridden: `X-Webhook-Timestamp`, `X-Webhook-Signature`, `X-Webhook-ID`, `Host`, and proxy-related headers. ## Signature Verification When a secret is configured, QA Sphere signs the payload using HMAC-SHA256. **We strongly recommend verifying signatures** to ensure requests originate from QA Sphere. ### Signature Format The signature is provided in the `X-Webhook-Signature` header: ``` sha256= ``` ### Verification Steps 1. Get the timestamp from `X-Webhook-Timestamp` 2. Get the raw request body 3. Concatenate: `{timestamp}.{body}` 4. Compute HMAC-SHA256 using your secret 5. Compare with the signature (use constant-time comparison) ### Example (Node.js) ```javascript const crypto = require('crypto') function verifySignature(payload, timestamp, signature, secret) { const message = `${timestamp}.${payload}` const expectedSignature = 'sha256=' + crypto.createHmac('sha256', secret).update(message).digest('hex') return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature)) } ``` ### Example (Python) ```python import hmac import hashlib def verify_signature(payload, timestamp, signature, secret): message = f"{timestamp}.{payload}" expected = "sha256=" + hmac.new( secret.encode(), message.encode(), hashlib.sha256 ).hexdigest() return hmac.compare_digest(signature, expected) ``` ### Example (Go) ```go import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" ) func verifySignature(payload string, timestamp int64, signature, secret string) bool { message := fmt.Sprintf("%d.%s", timestamp, payload) h := hmac.New(sha256.New, []byte(secret)) h.Write([]byte(message)) expected := "sha256=" + hex.EncodeToString(h.Sum(nil)) return hmac.Equal([]byte(signature), []byte(expected)) } ``` ## Delivery Behavior ### Retry Policy QA Sphere retries failed deliveries with exponential backoff: | Attempt | Delay | | ------- | ---------- | | 1 | Immediate | | 2 | 30 seconds | | 3 | 2 minutes | After three failed attempts, the delivery is abandoned and will not be retried. ### Retry Conditions Retries occur for: * Network errors * 5XX server errors * 429 (Rate Limit) responses Retries **do not** occur for: * 4XX client errors (except 429) ### Timeouts * Connection timeout: 10 seconds * Total request timeout: 30 seconds ### Bulk Events When many items are created in a single operation (more than 5 items), QA Sphere sends a **summary event** instead of individual item details: * The `${name}` variable contains a summary (e.g., "10 results created") * The `${items}` array is omitted * The `${ids}` array (for results) contains all IDs ## Security Considerations ### HTTPS Required Webhook endpoints must use HTTPS. HTTP endpoints are not allowed. ## Testing Webhooks Use the **Test Webhook** button in the webhook configuration to send a test request. Test requests include: ```json { "event_type": "test", "timestamp": "2026-01-21T11:07:57Z", "test": true, "data": { "text": "This is a test message" } } ``` **Best Practices** 1. Always configure and verify webhook signatures 2. Respond to webhooks quickly (within 10 seconds) 3. Process webhook payloads asynchronously if needed 4. Use the `X-Webhook-ID` header for idempotency 5. Return 2XX status codes to acknowledge receipt **Need Help?** Contact [support](mailto:sorted@qasphere.com) for assistance with webhook configuration. --- # Overview URL: /docs/administration-intro QA Sphere provides you with many capabilities and options to customize and configure the application for your team and to manage projects, users and permissions based on your workflow. You can manage all settings, projects and users from QA Sphere's Admin section. This admin guide focuses on QA Sphere's more advanced customization options and how to configure advanced user permissions and authentication workflows: * [Users & Permissions](https://qasphere.com/docs/users-permissions): Learn about QA Sphere's flexible user permissions and roles to customize user and project access, and how to suspend or restore access without losing history. * [Security](https://qasphere.com/docs/administration/security): Configure sign-in methods, two-factor authentication and its enforcement, IP allow lists, and the audit log. * [Billing Plans](https://qasphere.com/docs/billing): Describes all available billing plans and how to upgrade, downgrade, or reactivate your QA Sphere subscription. ## Related Pages Two administration topics have their own top-level pages because they involve configuration on your identity provider as well as in QA Sphere: * [SAML SSO](/docs/saml) — sign in through Okta, Microsoft Entra ID, Auth0, Google Workspace, or another SAML 2.0 provider * [SCIM Provisioning](/docs/scim) — create, update, and deactivate QA Sphere users automatically from your identity provider Both are available on the Business plan and above. --- # Billing URL: /docs/billing ## Start for Free, Pay as You Grow At QA Sphere, we believe in allowing teams to experience the full potential of our platform before making a financial commitment. Our pricing strategy is built on three key principles: 1. **Accessibility**: Start using QA Sphere without any upfront costs. 2. **Scalability**: Choose plans that grow with your team and project needs. 3. **Flexibility**: Switch between plans at any time as your requirements change. ## Plan Comparison | | Free | Standard | Business | Enterprise | | ---------------------------- | ------- | ------------------ | ------------------ | ---------- | | **Price** | $0 | $12 / user / month | $24 / user / month | Custom | | Number of users | Up to 3 | Unlimited | Unlimited | Unlimited | | Unlimited viewers | — | Yes | Yes | Yes | | Unlimited projects | — | Yes | Yes | Yes | | Attachment space | 1 GB | 200 GB | 1 TB+ | Custom | | AI credits | Limited | Yes | Extended | Extended | | Shared steps & preconditions | Yes | Yes | Yes | Yes | | Parametrization | Yes | Yes | Yes | Yes | | API, CLI, MCP & integrations | Yes | Yes | Yes | Yes | | Two-factor authentication | Yes | Yes | Yes | Yes | | SSO with Google | — | Yes | Yes | Yes | | SAML 2.0 SSO | — | — | Yes | Yes | | SCIM provisioning | — | — | Yes | Yes | | Advanced authentication | — | — | Yes | Yes | | Audit log | Basic | Basic | Extended | Extended | | Support | Basic | Standard | Priority | Dedicated | The [pricing page](https://qasphere.com/pricing) carries the current, authoritative version of this table. ## Pricing Tiers Explained ### Free Tier: Perfect for Small Teams and Startups Our Free tier is designed for small teams just starting their QA journey or for those who want to explore QA Sphere's capabilities before scaling up. **Key Features:** * Up to 3 users * Limited AI credits * 1 GB attachment space * Access to the API, CLI, MCP server, and integrations * Two-factor authentication * Basic Support This tier is ideal for: * Startups in their early stages * Small development teams handling their own QA * Individuals or freelancers managing multiple small projects ### Standard Tier: Growing with Your Team As your team expands and your QA processes become more sophisticated, the Standard tier offers enhanced capabilities to support your growth. **Price: $12 per user per month** **Key Features:** * Unlimited viewers (great for stakeholders who need to monitor progress) * Unlimited projects * AI credits for test case generation, the AI assistant, and duplicate detection * SSO with Google, with an optional approved-domain allowlist * 200 GB attachment space * Standard support This tier is perfect for: * Medium-sized teams with multiple ongoing projects * Organizations looking to streamline their QA processes * Teams that need more storage and viewer access ### Business Tier: For Complex QA Needs Larger teams with intricate QA processes will find the Business tier provides the advanced features needed to manage complex testing environments. **Price: $24 per user per month** **Key Features:** * All Standard tier features * Extended AI credits * [SAML 2.0 SSO](/docs/saml) with Okta, Microsoft Entra ID, and other identity providers * [SCIM 2.0 provisioning](/docs/scim) for automated user provisioning and deprovisioning * [Advanced authentication](https://qasphere.com/docs/administration/security): workspace-wide 2FA enforcement and an IP allow list * Extended audit log, with a [SIEM-ready audit log API](/docs/api/audit_logs) * 1 TB+ attachment space for extensive documentation * Priority support for quick issue resolution Ideal for: * Large QA teams working on multiple complex projects * Organizations with strict security and user management requirements * Teams needing extensive storage for test artifacts and results ### Enterprise Tier: Tailored Solutions For organizations with unique needs or specific compliance requirements, our Enterprise tier offers a customizable solution. **Key Features:** * All Business tier features * Tailored features to meet organizational or compliance needs * Custom storage and dedicated support This tier is designed for: * Large corporations with specific compliance needs * Organizations requiring custom integrations or features * Teams needing a tailored QA solution that fits into their existing workflows Enterprise plans are arranged directly — contact [sorted@qasphere.com](mailto:sorted@qasphere.com) to discuss requirements. ## Free Trial New workspaces start on a **30-day free trial** of the paid functionality, with no credit card required. During the trial you can change subscription settings such as user count, so you can size the plan against the team that will actually use it before you commit. ### When the Trial Ends If you have not subscribed by the time the trial expires, what happens depends on whether your workspace fits inside the Free tier: * **Within Free-tier limits** (3 users or fewer) — the workspace may be transferred to the Free plan and you keep working. * **Over Free-tier limits** — access is **suspended**, and the account is **deleted 14 days after suspension**. If your trial workspace has more than three users, it will not roll over to the Free tier on its own. Either subscribe or reduce the workspace to within Free-tier limits before the trial expires. Once suspended, you have 14 days to act before the account and its data are deleted. The [Terms of Use](https://qasphere.com/legal/terms) are the authoritative statement of this behaviour. ## Managing Your Subscription Billing is managed in **Settings → Billing**. * **Change plan** — move between plans at any time. You are not locked into a tier that no longer matches your needs. * **Adjust seats** — change the number of users on the subscription as the team grows or shrinks. * **Billing contact and address** — enter your full billing address in the billing contact form. The phone field detects and pre-fills the country code. * **Reactivate** — a cancelled subscription can be reactivated without recreating the workspace, keeping all existing projects, test cases, and history. Billing contact form with full address fields and auto-detected country code ### Viewers Do Not Consume Seats On paid plans, **Viewer** accounts are unlimited and free. Product managers, developers, and other stakeholders who only need to follow quality status can be added without affecting your bill. Only roles above Viewer count toward the per-user price. On free accounts the paid-seat and viewer distinction does not apply; the overall user limit governs instead. See [Users and Permissions](https://qasphere.com/docs/users-permissions) for what each role can do. ## Choosing the Right Plan When selecting a plan, consider the following factors: 1. **Team Size**: How many active users will need access to QA Sphere? Remember that viewers are unlimited and free. 2. **Project Complexity**: Do you manage multiple projects or have complex testing requirements? 3. **Storage Needs**: How much documentation and test artifact storage do you require? 4. **AI Usage**: How heavily will you use AI generation and the AI assistant? See [AI Features](/docs/tms/ai-features) for what consumes credits. 5. **Security Requirements**: Do you need SAML SSO, SCIM provisioning, 2FA enforcement, or an IP allow list? Those are Business-tier features. 6. **Support Level**: What level of support does your team need to operate efficiently? Remember, you can start with the Free tier to explore QA Sphere's capabilities and upgrade as your needs grow. Our flexible structure ensures that you're never locked into a plan that doesn't serve your current needs. --- # Security URL: /docs/administration/security Workspace-wide security is configured in **Settings → Security**. This page covers the controls available there and how they interact. Configuring them requires the **Admin** or **Owner** role. ## Sign-In Methods QA Sphere supports several ways in, and you choose which are enabled for your workspace: | Method | Availability | Notes | | ------------------ | ----------------------- | ----------------------------------------------------------------------------------------------------- | | **Password** | All plans | Email and password, with optional two-factor authentication | | **Google Sign-In** | All paid plans | Can be restricted to approved email domains | | **SAML 2.0 SSO** | Business plan and above | Okta, Microsoft Entra ID, Auth0, Google Workspace, JumpCloud, and others — see [SAML SSO](/docs/saml) | At least one sign-in method must remain enabled at all times. Disabling a method signs out every user who has no remaining allowed method, so check who depends on a method before turning it off. To make SSO the only way in, turn off both **Password Authentication** and **Sign in with Google** once SAML is verified. ### Restricting Google Sign-In to Your Domains Google Sign-In accepts any Google account by default. Add an allowlist of approved email domains to limit it to accounts you control, so a personal Gmail address cannot be used to reach an invited seat. The allowlist is part of the Google Sign-In configuration, so it is available wherever Google Sign-In is. Security settings showing Google Sign-In domain allowlist configuration If your organization uses several verified domains, list all of them. Users whose Google account falls outside the allowlist are rejected at sign-in. ## Two-Factor Authentication Two-factor authentication is available on **every plan**, and any user can enable it for their own account from their profile. ### Enforcing 2FA Workspace-Wide On the **Business plan**, admins can require 2FA for everyone in the workspace. When you enable enforcement: * Users who already have 2FA configured are unaffected. * Users without 2FA are signed out and must complete 2FA setup on their next sign-in. QA Sphere enforce 2FA setting Enforcement signs out every user who has not yet set up 2FA. Announce it before you enable it, or you will field a wave of confused messages from people who cannot get back in. The 2FA status of each member is visible and sortable in **Settings → Members**, which is the quickest way to see who still needs to enrol before you enforce. 2FA applies to password sign-ins. For SAML sign-ins, multi-factor authentication is your identity provider's responsibility — QA Sphere does not run its own challenge on top of a SAML assertion. ## IP Allow List On the **Business plan**, workspace access can be restricted to a list of approved IP addresses or CIDR ranges — useful when access should only be possible from an office network or a corporate VPN. QA Sphere IP allow list configuration Before enabling it, work through the list of everything that reaches your workspace: * **Your own current address**, or you will lock yourself out along with everyone else * **Remote and travelling team members**, whose addresses change * **CI/CD runners** that upload results through the [CLI](/docs/cli) or call the [public API](/docs/api/api_intro) — cloud runners often use wide, changing ranges * **Webhook and integration callbacks**, if they originate from your own infrastructure Before switching the allow list on, confirm whether it also covers API and CLI traffic in your configuration. If it does, a pipeline that uploads test results will start failing as soon as its runner's egress addresses fall outside the list. Test it against a non-critical pipeline first. ## Managing User Access ### Suspending and Restoring Users Admins can **suspend** a user instead of deleting them. A suspended user cannot sign in, but their account and everything they authored — test cases, runs, results, audit history — is preserved intact. Restoring access is a single action. Suspend and unsuspend user controls in member settings Suspend rather than delete when someone leaves a team temporarily, when an account may be compromised, or when you want to free a seat without losing attribution. See [Users and Permissions](https://qasphere.com/docs/users-permissions) for roles and project access. API keys owned by a suspended user stop working: requests made with them return `403`. If a departing user's key is used by a pipeline, reissue the key under a different account before suspending them. ### Automated Provisioning On the Business plan, [SCIM 2.0](/docs/scim) lets your identity provider create, update, and deactivate QA Sphere users automatically. Setting `active: false` from the IdP suspends the user in the same way as the manual action above; `active: true` restores them. ## Audit Log Every significant action in the workspace is recorded in the audit log, viewable under **Settings → Audit Log**. It covers user and permission changes, integration and webhook configuration changes, SCIM-driven changes, and **rejected authentication attempts**, which can be filtered specifically when investigating suspicious sign-in activity. For SIEM ingestion, the audit log is available through the public API, and you can create API keys restricted to only that endpoint by naming them with the `SIEM-LOG-ONLY` prefix — a key named `SIEM-LOG-ONLY-splunk` can read audit logs and nothing else. See the [Audit Logs API](/docs/api/audit_logs). ## What Each Plan Includes | Control | Free | Standard | Business | Enterprise | | ----------------------------------------------------------------------------------- | ----- | -------- | -------- | ---------- | | Two-factor authentication (per user) | Yes | Yes | Yes | Yes | | Google Sign-In (and its domain allowlist) | — | Yes | Yes | Yes | | SAML 2.0 SSO | — | — | Yes | Yes | | SCIM provisioning | — | — | Yes | Yes | | Audit log | Basic | Basic | Extended | Extended | | **Advanced authentication**: 2FA enforcement, IP allow list, audit log API for SIEM | — | — | Yes | Yes | See [Billing](https://qasphere.com/docs/billing) for full plan details. --- # Users and Permissions URL: /docs/users-permissions Effective user management and role-based access control are crucial for maintaining security and efficiency in your QA processes. QA Sphere offers a flexible and robust permissions system that allows you to fine-tune access levels for each member of your team. This guide will walk you through the various roles available in QA Sphere and how to manage them. ## Understanding QA Sphere Roles QA Sphere provides five distinct roles, each with its own set of permissions and responsibilities. These roles are designed to cater to different levels of involvement and authority within your QA process. ### 1. Owner The Owner role is the highest level of authority in QA Sphere. **Key Characteristics:** * There can only be one Owner per QA Sphere instance. * The Owner is typically the first user who set up the QA Sphere account. * This role cannot be deleted. **Permissions:** * Has unrestricted access to all features and settings. * Can change anything within the system. * Can assign the Owner role to another user (in which case, the current Owner becomes an Admin). **Best Practices:** * Reserve this role for the highest level of management or the primary stakeholder of the QA process. * Consider transitioning to an Admin role once the system is set up and stable, to reduce the risk of accidental system-wide changes. ### 2. Admin The Admin role is designed for users who need comprehensive control over the QA Sphere instance, but with some limitations compared to the Owner. **Permissions:** * Can change almost anything in the system. * Has access to all projects and global settings. * Can manage users, including creating new users and assigning roles. * Cannot delete the Owner or change the Owner's permissions. **Best Practices:** * Assign this role to QA managers or team leads who need to oversee multiple projects and manage team members. * Limit the number of Admins to maintain better control and security. ### 3. User The User role is suitable for team members actively involved in the QA process across one or more projects. **Permissions:** * Can work on specific projects or all projects (as assigned by an Admin or Owner). * Can create and manage test runs, milestones, and test cases within their assigned projects. * Cannot add new projects, rename/complete/delete projects, manage users, or change global settings. **Best Practices:** * This should be the default role for most team members involved in creating and executing tests. * Regularly review User project assignments to ensure they have access to all necessary projects. ### 4. Test Runner The Test Runner role is designed for team members primarily responsible for executing test runs. **Permissions:** * Can work on test runs of specific projects (or all projects, as assigned). * Can update test run status and results. * Cannot modify test cases or create new ones. * Cannot change project settings or manage users. **Best Practices:** * Assign this role to team members focused on test execution, such as QA testers or automated testing systems. * Ensure Test Runners have clear guidelines on how to report and document test results. ### 5. Viewer The Viewer role provides read-only access to QA Sphere, suitable for stakeholders who need to monitor progress but should not make changes. **Permissions:** * Can view information in specific projects or all projects (as assigned). * All access is read-only; cannot make any changes to test cases, runs, or settings. **Best Practices:** * Use this role for external stakeholders, clients, or team members who need to stay informed but are not directly involved in the QA process. * Regularly review Viewer access to ensure they only have visibility to relevant projects. Viewer seats are **unlimited and free** on paid plans. Stakeholders who only need to follow quality status should be Viewers — they do not count toward your per-user bill. See [Billing](https://qasphere.com/docs/billing#viewers-do-not-consume-seats). ## Project Access A role decides *what* a user can do; project access decides *where* they can do it. Users, Test Runners, and Viewers are granted access either to **all projects** or to a specific set of projects, chosen when you invite them and changeable at any time from **Settings → Members**. Owners and Admins always have access to every project, so project access does not apply to them. The **Access** column in the Members table shows each user's current scope, and the table can be sorted by it — useful when reviewing who can reach a sensitive project. ## Managing Users and Permissions As an Owner or Admin, you have the responsibility of managing users and their permissions. Here's how to effectively manage your team in QA Sphere: 1. **Adding New Users:** * Navigate to the **Settings** Settings wheel > **Members**. * Use **Email** field to invite new users to the team * Assign the appropriate role and project access and click **Send Invite**. 2. **Modifying User Roles:** * Navigate to the **Settings** Settings wheel > **Members**. * Click Edit * Change **Role** in the appropriate field 3. **Reviewing the Member List:** * The Members table can be sorted by Name/Email, Role, 2FA, and Access. Sorting cycles ascending → descending → reset, and the indicators stay visible. * Sorting by **2FA** is the quickest way to see who has not yet enrolled, which matters before you [enforce two-factor authentication](https://qasphere.com/docs/administration/security#enforcing-2fa-workspace-wide). 4. **Best Practices for User Management:** * Regularly audit user roles and permissions to ensure they align with current responsibilities. * Implement a process for reviewing and updating permissions when team members change roles. * Use groups to manage permissions for multiple users with similar roles more efficiently. * Always follow the principle of least privilege: give users only the permissions they need to perform their tasks. ## Suspending and Restoring Access When someone should lose access but their history should be kept, **suspend** them instead of deleting the account. A suspended user cannot sign in, while everything they authored — test cases, runs, results, and audit history — stays intact and correctly attributed. Restoring access is a single action. Suspend and unsuspend user controls in member settings Suspend rather than delete when a team member is on extended leave, when an account may be compromised, or when you want to free a seat without losing attribution. API keys owned by a suspended user stop working and return `403`. If one of that user's keys is used by a CI pipeline or an integration, reissue it under a different account before suspending them. On the Business plan, [SCIM 2.0](/docs/scim) can drive this automatically from your identity provider: unassigning a user in the IdP suspends them in QA Sphere, and reassigning them restores access. ## Authentication and Workspace Security Roles control what a user can do once they are in. How they get in, and who is allowed to try, is configured separately: * **[Security](https://qasphere.com/docs/administration/security)** — sign-in methods, two-factor authentication and its enforcement, IP allow lists, and the audit log * **[SAML SSO](/docs/saml)** — sign in through your identity provider (Business plan and above) * **[SCIM provisioning](/docs/scim)** — automate the user lifecycle from your IdP (Business plan and above) ## Conclusion Understanding and properly utilizing QA Sphere's role-based access control is key to maintaining a secure and efficient QA environment. By carefully assigning roles and permissions, you can ensure that each team member has the access they need while maintaining the integrity and security of your QA processes. Remember, the goal is to balance accessibility with security. Regularly review and adjust your user permissions to adapt to your team's changing needs and to maintain optimal workflow in your QA processes. --- # Overview URL: /docs/api/api_intro Welcome to the QA Sphere API documentation. Our API allows you to programmatically manage test cases, runs, and results in your QA Sphere projects. ## Authentication All API requests require authentication using an API key. See the [Authentication](https://qasphere.com/docs/api/authentication) guide to get started. ## Base URL ``` https://{your-company}.{your-region-code}.qasphere.com/api/public/v0 ``` ## Response Format All responses are returned in JSON format. Successful responses typically include: * Status codes in the 2XX range * Data specific to the endpoint * Pagination information where applicable Error responses include: * Status codes in the 4XX or 5XX range * Error message explaining the issue * Additional context where available ## Rate Limiting API requests are rate limited to protect the service and ensure fair usage. * **20 requests per second** sustained, per user, with a **burst capacity of 40** The limit is applied **per user, not per API key**. Every API key you create belongs to the user who created it, and all of that user's API keys and OAuth authorizations draw from the same 20 requests per second. Creating additional API keys under the same account will not raise your throughput — if you need more, distribute the work across separate user accounts. The limit uses a token bucket with a capacity of 40 that refills at 20 tokens per second, and each request consumes one token. A client that has been idle for at least two seconds can therefore issue up to 40 requests at once; after the bucket is drained, sustained traffic is capped at 20 requests per second. There is no saving up beyond the 40-token capacity. ### Handling a 429 When you exceed the limit, the API returns `429 Too Many Requests`: ```json { "message": "Too many requests, please try again later." } ``` The response includes a `Retry-After` header giving the number of seconds to wait before the next request will be accepted: ``` HTTP/1.1 429 Too Many Requests Retry-After: 1 X-RateLimit-Scope: public_api ``` Wait at least that long before retrying. If the header is missing, fall back to exponential backoff. `X-RateLimit-Scope: public_api` marks a `429` that came from the per-user throughput limit — your credentials were accepted and only your request rate was too high, so retrying after `Retry-After` will succeed. ### Repeated authentication failures A `429` **without** the `X-RateLimit-Scope` header means the requests reaching us are being rejected before they are authenticated. Sending invalid credentials repeatedly gets your IP rate limited even though no single request succeeds, so make sure retry logic stops on `401` instead of retrying it — waiting out a single `Retry-After` will not clear this one while the failures continue. ### OAuth device flow limits The device flow is limited separately and does **not** use `429`. Both endpoints reject with `400` and an RFC 8628 `slow_down` error, and neither sends a `Retry-After` header: ```json { "error": "slow_down", "error_description": "polling too frequently" } ``` | Limit | Scope | Applies to | Handled by | | --------------- | --------------- | --------------------------------------------------------------- | --------------------------------- | | 1 per 5 seconds | Per device code | Polling the token endpoint (RFC 8628 §3.4) | The OAuth client or tool | | 10 per minute | Per IP address | Requesting a code from the device authorization endpoint (§3.1) | The person starting authorization | Token polling is normally performed by the OAuth client or tool, not by the person authorizing it. The client must start with the `interval` returned by the device authorization endpoint. If the token endpoint returns `slow_down`, it must increase that interval by 5 seconds before continuing to poll, as RFC 8628 §3.5 describes. The [QA Sphere CLI](https://github.com/Hypersequent/qas-cli) handles this automatically. Requesting a new device code starts a new authorization attempt and is under the user's control. If that endpoint returns `slow_down`, wait before starting another attempt instead of repeatedly requesting new codes. ### Staying under the limit * Retry on `429` with exponential backoff, honoring `Retry-After` * For ordinary public API requests, do not retry `4xx` responses other than `429`. OAuth device flow clients must continue on `authorization_pending` and retry more slowly on `slow_down` * Use batch endpoints instead of many individual requests where one exists * Cache responses that change infrequently, such as project and folder listings * Keep client-side concurrency modest; parallel workers share the same per-user budget If you use the [QA Sphere CLI](https://github.com/Hypersequent/qas-cli), all of this is handled for you, from v0.8.0 onward. Earlier versions do not recognize `429` and will fail against these limits, so upgrade if you are on v0.7.0 or older. **Getting Started** 1. [Create an API key](https://qasphere.com/docs/api/authentication#creating-an-api-key) 2. Test the authentication with the [tags endpoint](https://qasphere.com/docs/api/tag) 3. Explore the available endpoints based on your needs **Need Help?** * Contact [support](mailto:sorted@qasphere.com) for assistance * Report issues through your account dashboard --- # Authentication URL: /docs/api/authentication The QA Sphere API uses API keys for authentication. Each request to the API must include a valid API key that is associated with your account. You can manage your API keys through the QA Sphere web application settings. Api Key Screenshot ## Creating an API Key 1. Log into your QA Sphere account 2. Navigate to Settings 3. Select the API Keys section 4. Click "Add API Key" 5. Save your API key securely - you won't be able to see it again ## Restricted API Keys API keys can be restricted to specific endpoints based on their name prefix. This follows the security principle of least-privilege access. | Name Prefix | Allowed Endpoints | Use Case | | --------------- | ------------------------------- | --------------------------- | | `SIEM-LOG-ONLY` | `GET /api/public/v0/audit-logs` | SIEM audit log integrations | For example, naming an API key `SIEM-LOG-ONLY-splunk` restricts it to only access the audit logs endpoint. Any attempt to access other endpoints will return `403 Forbidden`. ## Using Your API Key ### Request Headers To authenticate your requests, send the API key in the `Authorization` header using the `Bearer` scheme: ```bash curl \ -H "Authorization: Bearer your.api.key.here" \ https://your-company.your-region-code.qasphere.com/api/public/v0/project/BD/run/1/tcase ``` **Legacy format** Earlier API keys were used with the `Authorization: ApiKey your.api.key.here` header. These are still supported for backward compatibility, but prefer the newer Bearer scheme for all integrations. ```bash curl \ -H "Authorization: ApiKey your.api.key.here" \ https://your-company.your-region-code.qasphere.com/api/public/v0/project/BD/run/1/tcase ``` Never share your API key or commit it to version control. Use environment variables or secure secret management systems to store your API key. ## Error Responses | Status Code | Scenario | Description | | ----------- | ------------------------ | --------------------------------------------------------------------------------------------------- | | 401 | Missing Authorization | No `Authorization` header in the request, or an unrecognized scheme | | 401 | Invalid API Key Format | Malformed token | | 401 | Invalid Credentials | The token was parsed but did not match any active API key, or the request host doesn't match tenant | | 403 | Suspended Tenant or User | The tenant or the user that owns the API key is suspended | | 403 | Network Access Denied | Request originated from an IP outside the tenant's allowlist (when configured) | | 403 | Restricted Endpoint | An endpoint-restricted key (e.g. `SIEM-LOG-ONLY-*`) was used against a non-permitted endpoint | ## Best Practices ### DO * Store API keys securely using environment variables or secret management systems * Use different API keys for different environments (development, staging, production) * Rotate API keys periodically * Monitor API key usage for unusual patterns * Include proper error handling for authentication failures ### DON'T * Share API keys between different applications * Commit API keys to version control * Use production API keys in development environments * Embed API keys directly in client-side code * Use a single API key across multiple services ## Session Management * API keys do not expire automatically * The system tracks the last activity timestamp for each tenant * Activity is updated when API calls are made (maximum once per 24 hours) * Tenant suspension will invalidate all API keys for that tenant ## Troubleshooting If you're experiencing authentication issues: 1. Verify the API key and authorization scheme ``` Authorization: Bearer your.api.key.here ``` The legacy `Authorization: ApiKey ` scheme is also accepted (see [Request Headers](#request-headers)). 2. Ensure your tenant account is not suspended 3. Verify you're using HTTPS for all API requests 4. Check the response headers for additional error information If you need to regenerate an API key, you can do so from the QA Sphere web application settings. Remember to update all services using the old key. --- # HTML Support URL: /docs/api/html-support QA Sphere provides rich text formatting capabilities for certain fields in the API through HTML support. The API automatically sanitizes HTML content in requests to ensure security while preserving formatting capabilities. This sanitization process: * **Allows** a carefully curated subset of HTML elements and attributes * **Removes** any unsupported HTML tags, attributes, JavaScript, and other potentially malicious content * **Preserves** safe formatting and structure for rich text content ## Supported HTML Elements The following HTML elements are supported and will be preserved during sanitization: ### Text Formatting * `` - Bold text * `` - Italic text * `` - Underlined text * `` - Strikethrough text * `` - Inline code formatting ### Headings * `

` through `

` - All heading levels ### Structure and Layout * `

` - Paragraphs * `
` - Line breaks * `


` - Horizontal rules * `
` - Block quotes * `
` - Preformatted text

### Lists

* `