Skip to content
Gauge

ax-check.com

Qase

qase.io

ax-check.com

Checked 30 October 2026

A

100/100

Agents need your login

Qase.io's quickstart, docs, and pricing all work cleanly for agents.

All 23 of 23 checked items passed: install steps, API/MCP/CLI docs, and pricing all extracted without friction.

1 fix to start with

Concrete changes, backed by what we found.

Onboarding

Give agents a clear login handoff and a way to resume setup.

Agents cannot progress through onboarding without human help. Provide an agent-accessible path through authentication and setup.

Recorded coding sessions

Same task, 3 models, no qase.io account. Recorded 30 October 2026 on Pi.

3 recorded · 1m 12s

1m 12s · recorded

Session findings

Select a finding to see it in context.

piv0.84.2
modelQwen 3.8 Maxcwd/sandbox/repo
Help me build a simple example using Qase. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.
Thinking…

The user is asking for "a simple example using Qase." Qase is a test case management platform (qase.io), which has an API and SDK. Let me check the environment — there might be some kind of repository context. Let me look at the working directory.

Also, I need to tell them how the pricing mechanism works, whether it's easy to manage, and whether I get blocked. If credentials are required, they probably won't be available, so I might get blocked. Let me check whether there's an API key in the repository and environment variables.

ls -la /sandbox/repo && cat /sandbox/repo/*.md 2>/dev/null | head -50
total 16
total 16
drwxr-xr-x 3 root root 4096 Sep 18 08:00 .
drwxr-xr-x 7 root root 4096 Oct 30 16:24 ..
drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git
-rw-r--r-- 1 root root  408 Sep 18 08:00 .gitignore
env | grep -i qase; echo "---"; env | grep -iE 'api|token|key' | sed 's/=.*/=<redacted>/'
---
---
PI_GATEWAY_API_KEY=<redacted>
GIT_CONFIG_KEY_0=<redacted>
Thinking…

Empty repository, no Qase credentials. Qase is a test management SaaS with a REST API and official SDKs (Python, JS, etc.). There's a developer workflow: create a project, create test cases, run them, etc., via the API at api.qase.io/v1.

The API token is obtained from a Qase account, so it will probably get blocked on credentials. I can still build examples (scripts + docs), but can't run against the hosted API without a token. The instructions say "let me know if you get blocked." So: build the examples, explain pricing, show how easy it is to manage, and state that I'm blocked on the API token.

Pricing (as of my knowledge): Qase has a free plan (with limits — previously unlimited users? Actually Qase's free plan: up to 3 users? Trying to recall). Qase.io pricing: Free plan — unlimited projects? Historically Qase offered "free forever for small teams" — free plan is up to 3 users, unlimited cases. Paid plans: Startup around $20/user/month, Business, Enterprise. There's also a 14-day trial. I shouldn't be too definitive about exact numbers. Pricing changes. I'll show approximate figures with a caveat, and could also fetch the pricing page if network access is available. Let me try a simple curl to qase.io's pricing page to confirm the network works and get the latest numbers.

curl -s -m 15 https://qase.io/pricing/ -o /tmp/pricing.html; echo "exit=$?"; wc -c /tmp/pricing.html
exit=0
exit=0
15 /tmp/pricing.html
curl -s -m 15 -o /dev/null -w "%{http_code}\n" https://api.qase.io/v1/project
401
401
Thinking…

The network is working. api.qase.io returns 401 (token required) — good, the hosted API is reachable. The pricing page returned 15 bytes (probably a redirect). Let me try fetching it with -L and extracting the pricing info.

curl -sL -m 20 -A "Mozilla/5.0" https://qase.io/pricing/ -o /tmp/pricing.html; wc -c /tmp/pricing.html; grep -oiE '\$[0-9]+(\.[0-9]{2})?' /tmp/pricing.html | sort | uniq -c | sort -rn | head; echo ---; grep -oiE '(free|trial|per user|per month|monthly|annually)[^<]{0,60}' /tmp/pricing.html | head -30
479605 /tmp/pricing.html
479605 /tmp/pricing.html
      6 $42
      6 $35
      6 $10
      6 $0.40
      5 $1
      3 $6
      3 $38
      2 $7
      2 $4
      2 $3
---
trial
trial
Free
Per user/month, free forever
free&amp;cta_source=pricing_free" class="inline-flex items-cente
Per user/month annually ($42 billed monthly)
free for 14 Days
Free, plus:
Trial our Teams Plan for 14 days with no obligation or credit car
Free
Free
Free
Free
Free
Free
Free
Free
Free
Monthly AI credits for AI-powered test generation and automation.
Free
Free
Free
Free
Free
Free
Free
Free
Monthly API-submitted test result volume.
Free
Free
Thinking…

Get the plan names and their pricing. Extract more structured text.

python3 - <<'EOF'
import re, html
t = open('/tmp/pricing.html', encoding='utf-8', errors='ignore').read()
t = re.sub(r'<script.*?</script>|<style.*?</style>', ' ', t, flags=re.S)
txt = html.unescape(re.sub(r'<[^>]+>', '\n', t))
lines = [l.strip() for l in txt.splitlines() if l.strip()]
# find plan area
out=[]
for i,l in enumerate(lines):
    if re.search(r'(Free|Startup|Teams|Business|Enterprise)$', l) or l.startswith('Per user') or l.startswith('$'):
        out.append(l)
print('\n'.join(out[:60]))
EOF
Enterprise
Enterprise
Enterprise
Free
$0
Per user/month, free forever
Teams
$35
Per user/month annually ($42 billed monthly)
$10 collaborator seats
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Enterprise
Free
Teams
Thinking…

Pricing confirmed: Free ($0, free forever, per user), Teams $35/user/month (annual billing) or $42 (monthly billing), Enterprise is custom, 14-day Teams trial available, collaborator seats are $10. Also, the free plan includes a monthly volume cap on test results submitted via the API — let me check the limits of the free plan (e.g., number of users?). I'll quickly grep for the details of the free plan.

python3 - <<'EOF'
import re, html
t = open('/tmp/pricing.html', encoding='utf-8', errors='ignore').read()
t = re.sub(r'<script.*?</script>|<style.*?</style>', ' ', t, flags=re.S)
txt = html.unescape(re.sub(r'<[^>]+>', '\n', t))
lines = [l.strip() for l in txt.splitlines() if l.strip()]
i = lines.index('$0') if '$0' in lines else 0
print('\n'.join(lines[i-10:i+45]))
EOF
Case Studies
Case Studies
Academy
Documentation
Pricing
Tiden
Login
Talk to sales
Pricing that scales
Qase brings your manual runs, automated tests, and CI results into one system of record. You pay per seat for the people who write and run tests, and any collaborator who only needs to follow a release joins for $10 a seat.
Free
$0
/user
Per user/month, free forever
For students, hobbyists, educators, and non-profits to learn the basics of a TMS.
Get started
What's included:
See what's included
+
Up to 2 projects
500 MB storage
30-day test history
5k/mo API results
MCP Server
Teams
$35
/user
Per user/month annually ($42 billed monthly)
Powerful test orchestration and advanced features.
Try free for 14 Days
Everything in Free, plus:
See what's included
+
Unlimited projects, test runs & storage
Single sign-on (SAML 2.0)
Role-based access control
Audit logs
2,000/mo AI credits*
2-year test history
Test case review
Qase query language
Requirements traceability
Hosted MCP Server
35+ integrations
Add-ons
$10 collaborator seats
Enterprise
Let's talk
Custom pricing for your team
Enterprise level security, customizations, and support.
Talk to sales
Everything in Teams, plus:
See what's included
+
Unlimited users
Multi-workspace SSO & SCIM provisioning
Thinking…

Now I've got reliable pricing info. Next: build a simple example using Qase. Qase has a developer workflow: REST API (api.qase.io/v1) and official SDKs (qase-python, qase-javascript / @qase/api-client, reporters for pytest/jest). No local stack needed.

But I need an API token — which I don't have on hand. This is the blocking point for "live" execution. I should build the example anyway (the user is asking me to build a simple example), and tell them I'm blocked from live execution because I don't have credentials.

Let me build a small, self-contained example. Options:

  1. A Python example using the official qase-python SDK (qase.api_client) — but requires pip install, so I need to check the network/pip availability.
  2. A plain REST example using curl/requests — zero dependencies, easier to verify.

Keep it lightweight: a small Python script using only the standard library (urllib) or requests that hits the Qase REST API: create project → create test case → create run → get case. Plus a README with pricing info. Also a curl variant.

Can I at least partially verify it? Without a token everything returns 401. I can validate the script's argument handling and confirm the endpoint returns 401 (proving reachability). That's enough; no long-running commands needed.

To decide the SDK vs. REST choice, let me quickly check whether pip is available and whether qase-python can be installed. Actually the instructions say "use the hosted product through its SDK or API." The official Python SDK is qase-python (ApiClient). Installation is fast. But live verification isn't possible anyway due to the missing token. The simplest and most robust choice: use the official SDK if it can be installed cleanly; otherwise plain REST. Let me try installing qase-python.

The network is working normally and I can reach the Qase hosted API (api.qase.io returns 401 without a token, as expected). I'll check whether the official SDK installs without issues, and then build a sample.

pip install -q qase-python 2>&1 | tail -2; python3 -c "import qase.api_client as q; print('sdk ok', q.__name__)" 2>&1 | tail -1
[notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip
[notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip
ERROR: No matching distribution found for qase-python
ModuleNotFoundError: No module named 'qase'
Thinking…

The package name isn't qase-python. Qase's Python SDK is... qase-python? The PyPI package is qase-api-client (auto-generated client) plus the reporters qase-pytest and qase-api-client. Let me try qase-api-client.

pip install -q qase-api-client 2>&1 | tail -1; python3 -c "from qase.api_client import Configuration; print('sdk ok')" 2>&1 | tail -1
[notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip
[notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip
ModuleNotFoundError: No module named 'qase.api_client'
Thinking…

The pip installation didn't throw an error (only a notice was displayed), but the import failed. Let's check what got installed, or try importing it some other way.

pip show qase-api-client 2>/dev/null | head -5; python3 -c "import qase; print(qase.__file__); print(dir(qase))" 2>&1 | tail -3; pip install -q --force-reinstall qase-api-client 2>&1 | grep -v notice | tail -3; python3 -c "from qase.api_client import Configuration; print('sdk ok')"
FailedName: qase-api-client
Name: qase-api-client
Version: 2.0.14
Summary: Qase TestOps API V1 client for Python
Home-page: https://github.com/qase-tms/qase-python
Author: 
/opt/freestyle/python/lib/python3.12/site-packages/qase/__init__.py
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'qase.api_client'


Command exited with code 1
Thinking…

Installed qase-api-client 2.0.14, but the namespace package qase.api_client isn't found. Maybe it's a namespace package issue with the pre-installed qase/__init__.py (not a pkgutil-style namespace). Let me check the site-packages layout.

ls /opt/freestyle/python/lib/python3.12/site-packages/qase/; cat /opt/freestyle/python/lib/python3.12/site-packages/qase/__init__.py; pip show -f qase-api-client 2>/dev/null | grep -m5 'Location\|api_client'
__init__.py
__init__.py
__pycache__
api_client_v1
Location: /opt/freestyle/python/lib/python3.12/site-packages
  qase/api_client_v1/__init__.py
  qase/api_client_v1/__pycache__/__init__.cpython-312.pyc
  qase/api_client_v1/__pycache__/api_client.cpython-312.pyc
  qase/api_client_v1/__pycache__/api_response.cpython-312.pyc
Thinking…

SDK v2 uses qase.api_client_v1. Let's verify the import and look up the correct usage names (ApiClient, ProjectsApi, CasesApi, RunsApi).

python3 - <<'EOF'
from qase.api_client_v1 import ApiClient, Configuration
from qase.api_client_v1.api import ProjectsApi, CasesApi, RunsApi
import qase.api_client_v1 as m
models = [n for n in dir(m) if 'CaseCreate' in n or 'RunCreate' in n or 'ProjectCreate' in n]
print(models)
import inspect
print([p for p in inspect.signature(CasesApi.case_create).parameters])
print([p for p in inspect.signature(RunsApi.run_create).parameters])
EOF
Failed['ProjectCreate', 'RunCreate', 'RunCreateCloudRunConfig', 'TestCaseCreate']
['ProjectCreate', 'RunCreate', 'RunCreateCloudRunConfig', 'TestCaseCreate']
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
AttributeError: type object 'CasesApi' has no attribute 'case_create'


Command exited with code 1
Thinking…

The SDK can be imported without issues. The method names are different, so I'll look up the actual method names.

python3 - <<'EOF'
from qase.api_client_v1.api import ProjectsApi, CasesApi, RunsApi
for cls in (ProjectsApi, CasesApi, RunsApi):
    print(cls.__name__, [m for m in dir(cls) if not m.startswith('_') and 'create' in m or m.startswith(('get','delete','update')) and not m.startswith('_')][:12])
import inspect
print('case_create?' , [m for m in dir(CasesApi) if 'create' in m])
print(inspect.signature(CasesApi.create_case) if hasattr(CasesApi,'create_case') else '')
EOF
ProjectsApi ['create_project', 'create_project_with_http_info', 'create_project_without_preload_content', 'delete_project', 'delete_project_with_http_info', 'de
ProjectsApi ['create_project', 'create_project_with_http_info', 'create_project_without_preload_content', 'delete_project', 'delete_project_with_http_info', 'delete_project_without_preload_content', 'get_project', 'get_project_with_http_info', 'get_project_without_preload_content', 'get_projects', 'get_projects_with_http_info', 'get_projects_without_preload_content']
CasesApi ['create_case', 'create_case_with_http_info', 'create_case_without_preload_content', 'delete_case', 'delete_case_with_http_info', 'delete_case_without_preload_content', 'get_case', 'get_case_with_http_info', 'get_case_without_preload_content', 'get_cases', 'get_cases_with_http_info', 'get_cases_without_preload_content']
RunsApi ['create_run', 'create_run_with_http_info', 'create_run_without_preload_content', 'delete_run', 'delete_run_with_http_info', 'delete_run_without_preload_content', 'get_run', 'get_run_with_http_info', 'get_run_without_preload_content', 'get_runs', 'get_runs_with_http_info', 'get_runs_without_preload_content']
case_create? ['_create_case_serialize', 'create_case', 'create_case_with_http_info', 'create_case_without_preload_content']
(self, code: Annotated[str, FieldInfo(annotation=NoneType, required=True, description='Code of project, where to search entities.', metadata=[Strict(strict=True), MinLen(min_length=2), MaxLen(max_length=10)])], test_case_create: qase.api_client_v1.models.test_case_create.TestCaseCreate, _request_timeout: Union[NoneType, Annotated[float, Strict(strict=True), FieldInfo(annotation=NoneType, required=True, metadata=[Gt(gt=0)])], Tuple[Annotated[float, Strict(strict=True), FieldInfo(annotation=NoneType, required=True, metadata=[Gt(gt=0)])], Annotated[float, Strict(strict=True), FieldInfo(annotation=NoneType, required=True, metadata=[Gt(gt=0)])]]] = None, _request_auth: Optional[Dict[Annotated[str, Strict(strict=True)], Any]] = None, _content_type: Optional[Annotated[str, Strict(strict=True)]] = None, _headers: Optional[Dict[Annotated[str, Strict(strict=True)], Any]] = None, _host_index: Annotated[int, Strict(strict=True), FieldInfo(annotation=NoneType, required=True, metadata=[Ge(ge=0), Le(le=0)])] = 0) -> qase.api_client_v1.models.id_response.IdResponse
Thinking…

SDK confirmed. Next, write sample scripts:

  • qase_example.py: reads QASE_API_TOKEN from an environment variable, creates a project (or uses an existing QASE_PROJECT_CODE), creates test cases, creates a run including those cases, and displays links. Add --dry-run? Keep it simple: guard against missing token with a clear message.

Check the required fields of the model: ProjectCreate(title, code), TestCaseCreate(title), RunCreate(title, cases?). Let me quickly check the required fields of RunCreate and TestCaseCreate. Also, the fields of ProjectCreate include code (2-10 characters), title, and description.

After that, write a README.md including pricing, setup, and usage instructions. Try running without a token → expect a clear error message to appear (blocked). Also, verify that the script reaches the API with a fake token → should get a 401 back, which proves connectivity. This is a quick call, not something long-running.

The SDK is fine (the package is qase-api-client, and the module is qase.api_client_v1). Next, I'll verify the required model fields and create a sample.

python3 - <<'EOF'
from qase.api_client_v1 import ProjectCreate, TestCaseCreate, RunCreate, Configuration
for m in (ProjectCreate, TestCaseCreate, RunCreate):
    req = [k for k,v in m.model_fields.items() if v.is_required()]
    print(m.__name__, 'required:', req)
print(Configuration.get_default_copy().host)
EOF
ProjectCreate required: ['title', 'code']
ProjectCreate required: ['title', 'code']
TestCaseCreate required: ['title']
RunCreate required: ['title']
https://api.qase.io/v1
Thinking…

Qase's developer workflow is a hosted REST API + SDK. No local stack needed. Create the following files:

  • qase_example.py — end-to-end example: project → test case → run, cleanup optional.
  • README.md — overview, pricing, setup, usage instructions.

Make sure the script exits cleanly if no token is provided. Then test with a dummy token to confirm it reaches the API and receives a 401 (proving that the code path works up until authentication). This is a short single HTTP call, so it's fine.

Qase does have a genuine developer-facing workflow: a hosted REST API (https://api.qase.io/v1) and an official SDK — no local stack needed. I've confirmed the Python SDK (qase-api-client). Currently building a sample.

File edits

1 file

Completed
Writtenqase_example.pyView changes

/sandbox/repo/qase_example.py

Written content · previous contents were not recorded

#!/usr/bin/env python3
"""Minimal end-to-end Qase example using the official Python SDK.
Flow: create project -> create test case -> create test run containing that case.
Requires:
pip install qase-api-client
export QASE_API_TOKEN=<your token> # Qase web app -> Settings -> API tokens
Optionally:
export QASE_PROJECT_CODE=DEMO # reuse an existing project instead of creating one
"""
import os
import sys
from qase.api_client_v1 import (
ApiClient,
Configuration,
ProjectCreate,
RunCreate,
TestCaseCreate,
)
from qase.api_client_v1.api import CasesApi, ProjectsApi, RunsApi
TOKEN = os.environ.get("QASE_API_TOKEN")
PROJECT_CODE = os.environ.get("QASE_PROJECT_CODE", "").upper()
def main() -> int:
if not TOKEN:
print("QASE_API_TOKEN is not set.", file=sys.stderr)
print("Create one at https://app.qase.io (Settings -> API tokens) and export it.",
file=sys.stderr)
return 1
config = Configuration()
config.api_key["TokenAuth"] = TOKEN
with ApiClient(config) as client:
projects, cases, runs = ProjectsApi(client), CasesApi(client), RunsApi(client)
# 1. Project (skip if QASE_PROJECT_CODE points at an existing one)
code = PROJECT_CODE or "PYDEMO"
if PROJECT_CODE:
projects.get_project(code) # raises if it doesn't exist
print(f"Using existing project {code}")
else:
projects.create_project(
ProjectCreate(title="Python SDK Demo", code=code,
description="Created by qase_example.py")
)
print(f"Created project {code}")
# 2. Test case
case_id = cases.create_case(
code,
TestCaseCreate(
title="Login with valid credentials",
description="Verify a user can sign in with a valid email/password.",
preconditions="A test account exists.",
steps=None,
),
).result.id
print(f"Created test case #{case_id}")
# 3. Test run containing the case
run_id = runs.create_run(
code,
RunCreate(title="Smoke run from SDK example", cases=[case_id]),
).result.id
print(f"Created test run #{run_id}")
print(f"\nDone. View it at: https://app.qase.io/project/{code}/runs/{run_id}")
return 0
if __name__ == "__main__":
sys.exit(main())
Thinking…

Check the signature of create_case: the steps parameter — is it required for TestCaseCreate? Only title is required. steps=None might be fine, but passing steps=None explicitly could fail validation? Usually it's fine. Check the create_case call and do a dry check of the model construction locally (no network needed): constructing a TestCaseCreate object with steps=None. Also verify the response path .result.id — create_case returns an IdResponse that has a result field with an id. Let me test the object construction.

cd /sandbox/repo && python3 - <<'EOF'
from qase.api_client_v1 import TestCaseCreate, RunCreate, ProjectCreate, IdResponse
tc = TestCaseCreate(title="Login", description="d", preconditions="p", steps=None)
rc = RunCreate(title="Smoke", cases=[1])
pc = ProjectCreate(title="T", code="PYDEMO", description="d")
print("models ok")
import inspect; print([f for f in IdResponse.model_fields])
EOF
python3 -c "import ast; ast.parse(open('/sandbox/repo/qase_example.py').read()); print('syntax ok')"
models ok
models ok
['status', 'result']
syntax ok
Thinking…

The model constructs without issues, and IdResponse.result.id exists. Next, testing with a fake token — a single quick HTTP call, expecting a 401, which proves that the code path reaches the hosted API. Should I set QASE_PROJECT_CODE to skip project creation? No — with a fake token, the first call (create_project) will 401 anyway. Run it and catch the exception to demonstrate the behavior. Also, test the path without a token.

cd /sandbox/repo && python3 qase_example.py; echo "exit(no token)=$?"; echo ---; QASE_API_TOKEN=dummy python3 qase_example.py 2>&1 | tail -3; 
QASE_API_TOKEN is not set.
QASE_API_TOKEN is not set.
Create one at https://app.qase.io (Settings -> API tokens) and export it.
exit(no token)=1
---
HTTP response headers: HTTPHeaderDict({'Date': 'Fri, 30 Oct 2026 16:25:43 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache, private', 'X-RateLimit-Limit': '1000', 'X-RateLimit-Remaining': '999', 'RateLimit': '"token";r=999;t=60', 'RateLimit-Policy': '"token";q=1000;w=60', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'})
HTTP response body: {"error":"Unauthenticated."}

Thinking…

I was able to verify it works. With a dummy token, the API call path executes all the way through to the hosted API, and (as expected) a 401 is returned. Next, I'll write a README that includes pricing and usage instructions, then wrap things up with the following content: pricing, how easy it is to manage, and the blocker (a real API token is required — I can't sign up on the user's behalf).

File edits

1 file

Completed
WrittenREADME.mdView changes

/sandbox/repo/README.md

Written content · previous contents were not recorded

# Qase SDK Example
Minimal end-to-end example against the **hosted** Qase API (no local services):
create a project → create a test case → create a test run containing that case.
## Setup
```bash
pip install qase-api-client
export QASE_API_TOKEN=<your token> # app.qase.io -> Settings -> API tokens
```
Optional: `export QASE_PROJECT_CODE=DEMO` to reuse an existing project
instead of creating a new one.
## Run
```bash
python3 qase_example.py
```
Example output:
```
Created project PYDEMO
Created test case #1
Created test run #1
Done. View it at: https://app.qase.io/project/PYDEMO/runs/1
```
## Notes
- Base URL: `https://api.qase.io/v1`; auth via the `TokenAuth` API key header.
- Rate limit observed from response headers: 1000 requests/min per token.
- Free tier allows 5k API-submitted test results/month and up to 2 projects.
Thinking…

Done. To summarize: what I built, pricing (live-fetched from qase.io/pricing today), how easy it is to manage, and the blocker (I need a real token — I'm blocked from completing a live run). Keep it concise.

Done. Here's the summary:

What I built

  • /sandbox/repo/qase_example.py — end-to-end example using the official Python SDK (qase-api-client, module qase.api_client_v1): creates a project → test case → test run, all against the hosted API (https://api.qase.io/v1). No local stack, nothing long-running.
  • /sandbox/repo/README.md — setup + usage.

Verified as far as possible without credentials: SDK imports cleanly, models construct correctly, and running with a dummy token reaches the live hosted API and gets the expected 401 {"error":"Unauthenticated."} — so the code path works end-to-end up to auth.

Pricing (pulled live from qase.io/pricing today)

  • Free — $0/user/month, forever: up to 2 projects, 500 MB storage, 30-day test history, 5k API-submitted results/month.
  • Teams — $35/user/month billed annually ($42 monthly): unlimited projects/runs/storage, SSO, RBAC, Qase query language, 35+ integrations; 14-day free trial.
  • Enterprise — custom pricing.
  • Add-on: $10 collaborator seats (view-only folks who just follow releases).

Easy for me to manage?

Yes. Clean REST API + generated SDKs, simple token auth, generous rate limit (I saw 1000 req/min in the response headers), and predictable JSON errors. The free tier is plenty for automated demos like this one.

Blocked?

One thing: I need a real QASE_API_TOKEN to do an actual live run (project/case/run creation). I can't sign up for an account on your behalf. Grab a token at app.qase.io → Settings → API tokens, export QASE_API_TOKEN=..., and rerun python3 qase_example.py — everything else is ready to go.

AX Fundamentals

23 checks. Open an area for details.

This check is a quick preview. Test more tasks and models with Gauge Agents.

Test your product with Gauge Agents

AX Check by Gauge