Qovr Documentation

Learn how to use Qovr to create, run, and monitor end-to-end tests with visual evidence.

Quick Start

1

Create a Project

Go to Dashboard → Projects → Create Project. Give it a name and description.

2

Add an Environment

Configure the base URL and authentication settings for your test environment.

3

Create a Journey

Define the steps of your test: navigate, click, type, and assertions.

4

Run Your Test

Click "Run Now" and watch the results with screenshots for each step.

Core Concepts

Projects

Projects are containers for your tests. Each project can have multiple team members with different roles: Owner, Admin, Member, or Viewer.

Environments

Environments define where your tests run. Configure base URLs and authentication (none, basic auth, bearer token, or cookies) for each environment.

Journeys

Journeys are test scenarios composed of steps. Each step is an action like navigating to a URL, clicking an element, or asserting content.

Runs

A run is a single execution of a journey. It captures screenshots, console logs, and network requests for debugging.

Step Types

TypeDescriptionRequired Fields
navigateGo to a URLvalue (URL)
clickClick an elementselector
typeType text into an inputselector, value
waitWait for a durationvalue (milliseconds)
assert_visibleCheck element is visibleselector
assert_textCheck element contains textselector, value
assert_url_containsCheck URL contains stringvalue

Scheduled Runs

Set up automated test runs on a schedule using cron expressions:

*/15 * * * * - Every 15 minutes
0 9 * * 1-5 - Weekdays at 9 AM
0 0 * * * - Daily at midnight
0 9 1 * * - Monthly on the 1st at 9 AM

AI Failure Analysis

When a test fails, our AI analyzes the failure and suggests fixes. Access it via:

POST /api/ai/explain-failure
{
  "runId": "RUN_ID"
}

CI/CD Integration

Trigger test runs from your CI/CD pipeline using the API:

# Trigger a run
curl -X POST https://qovr.dev/api/journeys/{journeyId}/run \
  -H "Authorization: Bearer {your-api-token}" \
  -H "Content-Type: application/json"

# Check run status
curl https://qovr.dev/api/runs/{runId} \
  -H "Authorization: Bearer {your-api-token}"

Slack Integration

Get notified in Slack when tests fail:

  1. Go to Dashboard → Integrations → Slack
  2. Create an Incoming Webhook in your Slack workspace
  3. Paste the webhook URL in Qovr
  4. Choose when to notify (failures, all runs, etc.)

Email Notifications

Configure email notifications to receive alerts when tests complete:

  1. Go to Dashboard → Integrations → Email
  2. Add recipient email addresses
  3. Choose notification triggers (failures, all runs)

Webhooks

Receive test results via webhook to your own endpoint:

{
  "event": "run.completed",
  "timestamp": "2026-01-03T10:30:00Z",
  "data": {
    "runId": "run_123",
    "status": "fail",
    "durationMs": 5432,
    "projectName": "My App",
    "journeyName": "Login Flow",
    "errorText": "Element not found",
    "url": "https://qovr.dev/dashboard/runs/run_123"
  }
}

Optionally configure a secret for HMAC-SHA256 signature verification via the X-Qovr-Signature header.

GitHub Actions

Run tests in your CI/CD pipeline:

name: E2E Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Run E2E Tests
        run: |
          curl -X POST https://qovr.dev/api/journeys/${{ secrets.JOURNEY_ID }}/run \
            -H "Authorization: Bearer ${{ secrets.QOVR_API_KEY }}" \
            -H "Content-Type: application/json"
      
      - name: Check Results
        run: |
          # Poll for results
          sleep 30
          curl https://qovr.dev/api/runs/latest?journeyId=${{ secrets.JOURNEY_ID }} \
            -H "Authorization: Bearer ${{ secrets.QOVR_API_KEY }}"

API Authentication

All API requests require authentication via Bearer token:

curl https://qovr.dev/api/projects \
  -H "Authorization: Bearer YOUR_API_KEY"

Get your API key from Settings → API Keys

Projects API

List Projects

GET /api/projects

Create Project

POST /api/projects
{
  "name": "My Project",
  "description": "Optional description"
}

Get Project

GET /api/projects/:id

Update Project

PATCH /api/projects/:id
{
  "name": "Updated Name",
  "description": "Updated description"
}

Delete Project

DELETE /api/projects/:id

Need Help?

Can't find what you're looking for? We're here to help!