Complete QA audits — we review your project and send back a detailed report.Request a complete audit ›
Docs / Getting started

Welcome to GoQA

GoQA turns plain-language requirements, live URLs, screenshots, and OpenAPI specs into comprehensive BDD test suites — and crawls any web application to surface accessibility, performance, SEO, and security defects in minutes. This documentation covers every feature available in v0.4.0.

Quick start (3 steps)

Get your first test cases in under two minutes — no setup, no CLI, no configuration file required.

  1. Open the Test Cases workbench at /test-cases. Paste acceptance criteria, a URL, a screenshot, or an OpenAPI spec into the input panel.
  2. Click a test-type tile (e.g. Functional, E2E, Security) to generate BDD scenarios for that category.
  3. Mark Pass / Fail on each case, then export as JSON, Excel, or Gherkin — or open the set in the Test Repository preview (not saved).
Tip: sign up free to save generated test case sets to your account. Anonymous sessions are capped at 50 cases per request.

Account creation

Visit /signup to create a free account with email and password, or sign in with Google or Microsoft where those providers are enabled. Confirm your email address from the link GoQA sends before signing in; if it never arrived or has expired, try to log in and choose Resend confirmation email. New accounts are on the Starter plan.

Forgot your password? Use Forgot password? on /login (or /forgot-password). GoQA emails a link to set a new password; open it in the same browser you requested it from. Signed in, you can change your password (or set one, if you sign in with Google or Microsoft) from Settings → Password.

The Dashboard shows a short onboarding tour until you finish or skip it. See Onboarding tour.

Plan overview

Full pricing at /pricing. Summary:

Accounts still on the retired Pro plan keep their subscription and can manage it from /pricing.

Your current plan, monthly usage, and upgrade CTA are shown at the top of the Dashboard. The usage bar turns amber at 80% of your monthly generation limit and red at 95%.

Test Case Generation — overview

The Test cases workbench is the primary surface for turning a specification into BDD test scenarios (test cases, not automation code). It supports four input methods, 18 test-type categories, AI refinement of single cases, and a coverage score per result.

Input methods

Switch between tabs in the input panel to choose your source:

Import a Chrome recording: record a flow in Chrome DevTools → Recorder, choose Export → JSON, then Import Chrome recording in Saved Test Cases. GoQA saves it as a test case whose steps replay without the AI (see Run a case in a browser), using the recording's accessible selectors (names, roles and text), and the AI heals a step when the page changes. Steps found only by CSS or XPath, clicks that look like they delete data or spend money, and pages on other sites are left for the AI to plan. A password typed in the recording is never stored. A case can have up to 15 steps.

Import CSV or Excel: bring cases from TestRail, Qase or a spreadsheet. The file needs a header row; GoQA reads Title, Steps (one per line; numbering is removed), Expected, Preconditions and Section (or Suite, Category), and leaves every other column out. TestRail's "separated steps" export works too: a row without a title adds its step to the case above. GoQA's own Excel export imports back as it is. Up to 200 cases per file and 15 steps per case; the file stays under 1 MB.

Test data (data-driven runs): on a saved case, Add test data takes CSV (or rows pasted from a spreadsheet): a header row of column names, then up to 10 rows. Write <column> in a step, as in a Gherkin Scenario Outline, and each row runs the case once with its values. Run in browser runs every row or the one you choose; Run all and scheduled runs run every row, and each row counts as one case run (one crawl credit on Free and Starter). Rows are planned by the AI each time and never use recorded steps. Columns named like passwords or secrets are refused. Run history and its flaky-case summary show each row on its own line, and the .feature export writes the case as a Scenario Outline with an Examples table.

Test types & output formats

Click any of the 18 category tiles to generate cases for that type. One type generates at a time; the other tiles are disabled until it finishes.

AI Test Coverage Score

Each result panel shows a 0–100 score for the cases in that panel: 70 points for how many of the 18 test types its cases cover, and 10 points each for a happy path, an error path and an edge case (recognised from keywords in the case titles). Click the score to see the types the panel does not cover. Generating another type adds a separate panel with its own score.

The score is calculated in your browser; it is not saved.

Refine with AI

Once test cases are generated, click “Refine with AI” on any individual test case to open an inline editing prompt. Type natural-language instructions such as:

The refined case replaces the original in the panel. Refine always returns one test case, not automation code, and the change is not saved to your stored test case set.

Run a case in a browser

Signed in, open a saved set under Saved Test Cases. Each case with steps has a Site field (filled with the set's URL when it has one) and a Run in browser button. GoQA opens the site in Chromium and performs the steps one by one: for each step, AI reads the page and picks one action (open a page, click, type, choose an option, press Enter/Tab/Escape, or check that text, the address or the title is there).

Exporting results

In a saved set, Export Playwright downloads a Playwright Test file (.spec.ts). Each case with recorded steps becomes a test that repeats the recorded run's actions (open the page, click, type, choose, press, check text, address or title) and acts on the live site as that run did. Cases without a recording are test.fixme with their steps as comments, so they show as not implemented, never as passing.

Three export formats, no proprietary runtime required:

Mark Pass / Fail / Blocked / Skipped on each case before exporting to include execution status in the output. Failed and Blocked cases expose a notes textarea for defect links or root-cause comments.

AI Website Auditor — run an audit

Open /ai-testing, type or paste any URL — bare domains like example.com are auto-upgraded to https:// — and click Run AI Test. No sign-up is needed for a first audit. You can also kick off an audit straight from the homepage: enter a URL in the top launcher and we'll redirect to /ai-testing?url=… with the crawl already running.

The crawler streams page discoveries live; heavier panes (screenshots, security, a11y, performance, SEO, forms, network) render once the crawl completes.

Responsible testing: only audit sites you own or are authorized to test. The security scanner is non-destructive, but unauthorized testing may be illegal in your jurisdiction.

WCAG accessibility — what the automated check covers

The accessibility check runs axe-core with the tags wcag2a, wcag2aa, wcag2aaa, wcag21a, wcag21aa, wcag21aaa, wcag22a, wcag22aa, section508, EN-301-549, ACT, best-practice and experimental. Each violation reports its WCAG success criteria (for example 1.4.3), conformance level, impact, the failing DOM nodes and a link to the rule reference. Rules axe could not decide are listed per page as needing manual review.

The Accessibility results (on the crawl page, in saved reports on the dashboard and in shared reports) start with a WCAG 2.2 conformance summary. Choose a level (A, AA or AAA, default AA) and it says whether any success criterion at that level fails on the pages checked. It then lists each affected criterion with its name, level, result (Fails, or Needs review when axe could not decide), the number of pages and the axe rules involved. Pages where the check could not run are counted separately, and best-practice rules outside WCAG are counted but not used for the verdict. With no failures it says so and that a manual review is still needed; it never reports a site as conformant.

Automated checks are not a conformance audit. axe-core rules exist for only some success criteria. Many criteria — for example focus order and visible focus, keyboard traps, reflow, captions, consistent help, redundant entry and accessible authentication — need manual testing, and a page with no violations is not thereby WCAG-conformant.

Crawling as a signed-in user

Signed in to GoQA, open Crawl as a signed-in user under the address on AI Testing and paste the Cookie header of a session on your site: sign in there with a test account, open your browser's developer tools, pick any request to the site in the Network tab and copy its Cookie request header.

Multi-environment compare mode

In AI Testing, enable Compare Mode to audit two URLs side-by-side — for example, staging.example.com versus example.com. The diff view categorises every finding as:

Compare Mode runs accessibility, security, and broken-link checks on both targets. Performance and screenshot checks are run independently per URL.

Scheduled audits

Create a schedule at Settings → Scheduled Audits with a URL, a frequency (daily, weekly or monthly) and, optionally, a Slack, Discord, Teams or Google Chat webhook. Schedule only websites you own or have permission to test.

Shareable report URLs

In the Dashboard, open an audit and click Share. GoQA creates a secret token and a public link:

https://goqa.ai/report/[token]

Anyone with the link can open a summary of that audit without signing in: the site, the numbers of pages, security findings, accessibility issues and broken links, the first security findings, accessibility issues and broken links, and a few screenshots. Turning sharing off removes the token at once, and the link stops working. The Share button does not remember an existing link after the page reloads; sharing again creates a new link and the old one stops working.

Privacy: only audits you share are public, and only while shared.

Embeddable audit badge

A shared report page shows the badge and its embed code. The badge is an SVG served at:

https://goqa.ai/badge/[token]

The badge shows the date of the audit it belongs to. It does not follow later audits: a new audit needs its own share link and badge. Browsers and CDNs may cache it for up to an hour.

Screenshot baselines

In the screenshot panel of an audit, “Set as baseline” records that screenshot as the reference for its page URL in your account. Every later signed-in or scheduled audit that screenshots the same page compares it with the baseline pixel by pixel: the saved audit's Visual changes tab on the Dashboard shows the baseline, the new screenshot, the changed pixels in red and the percentage changed. A page counts as changed from 0.5% of its pixels. Setting a new baseline for a page replaces the old one.

AI Assurance — overview

AI Assurance runs readiness assessments for LLM applications, RAG apps, chatbots and AI agents. It produces risk findings and test evidence you can reproduce, and a release gate that turns them into a pass, block or needs-approval decision.

What it is not: This is a readiness assessment with risk findings and test evidence. It is not a compliance certification and does not guarantee that a system is safe. Policy packs are technical test packs, not legal advice.

There are two workflows: LLM Testing and Agent Testing. Both start from a target you are authorized to test and follow the same six steps.

How an AI readiness assessment works

  1. Step 1 of 6: Authorize the target

    An admin or owner confirms they may test the declared scope: a chat page URL, an API endpoint or a trace source. Changing the scope withdraws the authorization.

  2. Step 2 of 6: Select an approved plan

    GoQA builds a bounded plan from reviewed test templates that fit your target. Every case shows where it came from; you can deselect cases before running.

  3. Step 3 of 6: Run bounded tests

    Runs stay inside limits on prompts, request rate, tokens, cost and time, and can be cancelled at any point.

  4. Step 4 of 6: Review evidence and findings

    Each result keeps the input, the output, the evaluator and its version. Findings are named precisely (for example unsupported claim or policy violation); uncertain or critical judgements go to a human reviewer.

  5. Step 5 of 6: Remediate and retest

    Fix the issue and run again. Confirmed failures can become regression cases so later runs check them automatically.

  6. Step 6 of 6: Apply a release gate

    A gate turns the assessment into pass, block or needs approval — for example block on any unresolved critical finding. It supports a release decision; it is not a certification.

In order: authorize the target → select an approved plan → run bounded tests → review evidence and findings → remediate and retest → apply a release gate.

Availability: AI Assurance is in limited preview. Starter includes limited self-serve testing of APIs and agent traces, switched on in stages; GoQA enables anything more per workspace when you request access. See Pricing for availability, or request access by email. Each capability (URL runner, API targets, trace ingestion, the OpenAI judge) is switched on separately, so a workspace may have some channels and not others.

URL-only testing is not available yet. It runs a browser against your site from GoQA's workers, and stays switched off until its network sandbox is deployed and independently reviewed. The limited preview covers API-connected and trace-connected testing.

Starter self-serve

Starter self-serve, switched on in stages: test an OpenAI-compatible API you own and your agent's traces, with 20 runs and 500 traces a month, up to 25 prompts a run, 2 API and 2 trace targets, 2 active ingest keys, evidence kept 30 days and you as the only member. URL-only testing and the OpenAI judge are not included; complete audits are requested by email to team@goqa.ai.

GoQA switches Starter self-serve on in stages. When it is on for you, opening AI Assurance gives you one Starter workspace, and its dashboard shows this month's usage against each limit. It needs a confirmed email address.

Starter self-serve limits (enforced by GoQA's database for every request)
LimitStarter
Runs per calendar month (UTC), per user; deleting runs does not give them back20
Runs in progress at a time1
Prompts per runUp to 25
API targets and trace targets in use (archive one to add another)2 and 2
Active ingest keys2
New traces ingested per calendar month (UTC), per user500
Evidence retentionUp to 30 days
Workspace members1 (you)

Each API target still needs the same authorization as any other: verified ownership of its origin by a DNS TXT record or an HTTPS file, and a recorded authorization. The offline demo counts as a run but its sample-trace target does not use a trace-target slot. When a limit is reached, GoQA says which one and when the monthly counts reset (00:00 UTC on the first of the month); traces sent over the monthly limit are refused with HTTP 429 and a Retry-After header.

Not part of Starter self-serve: URL-only testing, the OpenAI judge (judge-evaluated cases go to human review), team members and longer retention. For those, or for a complete or deep audit by the GoQA team, email team@goqa.ai.

LLM Testing

LLM Testing assesses chatbots, RAG apps and LLM features through their visible interface (URL-only) or an OpenAI-compatible chat endpoint (API-connected). Built-in suites cover:

Failures are named precisely — for example unsupported claim, incorrect answer, insufficient retrieval, citation mismatch, unsafe overconfidence, policy violation, format violation or regression — and never collapsed into a generic label.

Agent Testing

Agent Testing checks what an agent does, not only what it says. It has two modes:

Trace detections describe measured mismatches between the trace and the agent's behavior — for example “Completion claim not supported by any successful tool result”. They never allege intent. Select up to 50 stored traces per evaluation on the Agent Testing page.

API & trace setup

Create a target in the target wizard. Choose how much evidence GoQA can collect. URL-only testing is not available yet, so connect an API or send traces.

Three levels of evidence

Each level adds evidence and the workflow stays the same. URL-only testing is not available yet; connect an API or send traces.

  1. Evidence depth 1 of 3

    URL-only (black-box)

    URL-only testing is not available yet. When released, GoQA will interact with your chat page only through the visible interface, within the scope you declare.

    Can show

    • Visible answers to bounded, defensive test prompts
    • Refusal quality and disclosure behavior shown in the UI
    • Visible citations, error states and response timing

    Cannot show

    URL-only testing observes externally visible behavior. It cannot prove hidden prompts, temperature, retrieval documents, tool calls, guardrails, memory, or internal reasoning. Findings describe observable behavior and potential risks. Connect an API or trace source for deeper evidence.

  2. Evidence depth 2 of 3

    API-connected

    GoQA calls your OpenAI-compatible chat endpoint directly. Credentials are encrypted and never shown again.

    Can show

    • Exact model responses with token usage, cost and latency
    • Configuration sensitivity (temperature, top_p, max tokens, seed)
    • Structured output and schema checks

    Cannot show

    • Retrieval documents, tool calls or memory inside your application unless the API returns them
    • Behavior of UI layers in front of the API
  3. Evidence depth 3 of 3

    SDK / trace-connected

    Your server sends run, retrieval, tool, agent-step, latency, token, cost and error events through the GoQA SDK.

    Can show

    • Full agent trajectories: tool selection, arguments, order, approvals and delegation
    • Completion claims checked against recorded tool results
    • Loops, budgets, errors and recovery from reported events

    Cannot show

    • Anything your code does not report (uninstrumented tools, hidden prompts, memory stores)
    • Whether reported timings, tokens or costs are accurate — GoQA does not re-measure them
  1. URL-only (not available yet) — enter the https URL of the chat page and up to five extra origins it needs. Private, loopback and internal addresses are rejected, and URLs may not contain credentials.
  2. API-connected — enter the OpenAI-compatible endpoint, path and model. An admin or owner stores the credential; it is encrypted (AES-256-GCM) and never shown again, not even in part.
  3. SDK / trace-connected — create the trace target, then an admin or owner creates an ingest key on the target page. The key is shown once. See SDK, traces & retention.

Before any run, URL and API targets need verified ownership of every origin in their scope, then an authorization. On the target's Authorization tab an admin or owner proves control of each origin in one of two ways:

A proof lasts at most 90 days after its last successful check, and an admin or owner can revoke it at any time. GoQA checks it again when a run starts and at least every 10 minutes while the run goes on; if the record or file is gone, the run stops before sending anything more and the verification is marked failed. Signed letters or contracts are not accepted as proof, because GoQA cannot check them: if the system belongs to someone else, its owner publishes the record or file. Reserved names such as .test or .invalid cannot be verified. See Security & authorization.

Selector mapping

For URL-only targets GoQA must know which elements on the page form the chat. On the target page, run detection: GoQA opens the page in an isolated browser, finds candidate elements without typing anything, and validates them.

SelectorRequiredWhat it points at
Chat inputYesThe text box a visitor types into.
Response areaYesThe element that contains assistant replies.
Send buttonNoNeeded unless pressing Enter sends the message.
Reset / new chatNoClears the conversation between test cases.

Review the detected selectors, adjust any that are wrong, and save. Detection can only be applied when it finished cleanly and the selectors validated. If GoQA finds a login wall or CAPTCHA it stops: it never enters credentials, solves CAPTCHAs or bypasses access controls.

Suites & policy packs

Test plans are built only from approved, versioned templates in the GoQA AI Test Knowledge Base, reviewed by GoQA staff with a reviewer different from the author. GoQA matches templates to your target (channel, application kind, declared features such as retrieval or tools, domain and locale), ranks them and bounds the plan by your budget. Every case records the template version, evaluator and rationale it came from, and you can deselect cases before running. No free-form hostile prompts are generated.

Policy packs you can add to a target:

Policy packs are technical test packs, not legal advice. Passing one does not mean a system complies with any law or standard.

In Suites editors can keep reusable datasets, including a regression dataset built from confirmed findings.

Evaluators & OpenAI-as-judge

Each case names its evaluator and version. Deterministic evaluators check status, latency, JSON schemas, required and prohibited content, canary-token leaks, citation presence, tool-call contracts, response length and refusals; trace detectors check agent trajectories. Rubric-based cases use an LLM judge only when all of these hold: GoQA has enabled the judge for the workspace, a workspace owner has consented in AI Assurance settings, and the target's data classification is at or below the classification that owner allowed.

Consent and data classification. Only a workspace owner can consent to sending redacted test material to OpenAI, after reading the disclosure, and chooses the highest classification that may be sent (public, internal or confidential). The consent covers one processor (OpenAI) and one purpose (grading test results with the judge). Admins and owners classify each target; unclassified and restricted targets are never sent. Consent is recorded in the audit log, checked again before every judge request, and can be revoked at any time; revocation stops the next judge request, including in a run in progress, and each stored judge result names the consent it was sent under. Without consent, cases that need a judge are marked needs review instead of being scored.

Findings, reports & release gates

A run stores an immutable, redacted result for every case: input, output, evaluator and version, verdict and evidence. Failed cases become findings with severity, likelihood, confidence and remediation guidance.

A release gate decides pass, block or needs approval:

SettingDefaultEffect
Block on criticalOnBlocks while any critical finding is open or confirmed.
Minimum coverage0Blocks when conclusive case coverage is below the threshold.
Maximum regressions0Blocks when more regression cases fail than allowed.
Maximum open high findingsNo limitBlocks above the limit when set.
Human approval for categoriesNoneNeeds approval while a listed risk category has an unapproved finding.

Block wins over needs approval, which wins over pass, and every triggered condition is listed. A gate supports a release decision; it is not a certification.

URL-only testing

URL-only testing drives a real browser against your own web application and reports what a user could see: visible answers to bounded, defensive test prompts, refusal quality, disclosure behaviour, citations, error states and timing.

URL-only testing observes externally visible behavior. It cannot prove hidden prompts, temperature, retrieval documents, tool calls, guardrails, memory, or internal reasoning. Findings describe observable behavior and potential risks. Connect an API or trace source for deeper evidence.

Why an unverified URL is refused

Proving you control the site

Prove control of every origin in the scope. You can do this before the capability is switched on for your workspace — ownership and enablement are separate, and doing it first means nothing is waiting on you afterwards.

DNS TXT record — covers every origin on that hostname

  1. Add a TXT record named _goqa-challenge.<your-hostname> — most registrars want just "_goqa-challenge" in the host field and append the domain themselves.
  2. Set its value to exactly goqa-verification=<the token GoQA gives you>, with no quotes of your own.
  3. Save it, then ask GoQA to check. It resolves the record itself; a missing record or a wrong value is a definite failure, and a timeout is not.

HTTPS verification file — covers that exact origin

  1. Serve a file at <your-origin>/.well-known/goqa-verification.txt.
  2. Its body must contain a line reading exactly goqa-verification=<the token GoQA gives you>.
  3. It is fetched over HTTPS to a public address, with redirects not followed and a small size cap, so a redirect to someone else's site proves nothing.

A verification lasts 90 days from its last successful check, and an admin or owner can revoke it at any time.

What bounds a run

Getting it enabled

URL-only testing is enabled per workspace, after a sandbox proof, verified ownership, an agreed pilot scope and time box, and an independent review. It is never switched on globally. Request it by email and say which origins you want tested.

An owner or admin can start and check an ownership challenge from Integrations at any time — it does not wait on the capability being switched on, and doing it first means nothing is pending afterwards.

Security & authorization boundaries

SDK, trace ingestion & retention

Send traces from your server — never from browser code — with the GoQA JavaScript trace SDK and an ingest key. Integrations has the SDK quick-start with your workspace's endpoint.

import { createGoqaTraceClient } from "./goqa-trace-sdk/client.js";

const goqa = createGoqaTraceClient({
  endpoint: "https://goqa.ai",
  ingestKey: process.env.GOQA_INGEST_KEY,
});
const trace = goqa.startTrace({ sessionId: "sess-42" });
const call = trace.toolCall({ name: "issue_refund", arguments: { orderId: "ORD-4471" } });
trace.toolResult({ callEventId: call, status: "ok", output: { id: "re_1" } });
trace.assistantMessage("I've refunded order ORD-4471.");
await trace.end();

Retention. Completed, failed and cancelled runs and their evidence are deleted after the workspace retention period — 90 days by default, adjustable by the owner from 7 to 730 days in AI Assurance settings. The audit log is kept separately (400 days by default).

Limitations

URL-only limitation: URL-only testing observes externally visible behavior. It cannot prove hidden prompts, temperature, retrieval documents, tool calls, guardrails, memory, or internal reasoning. Findings describe observable behavior and potential risks. Connect an API or trace source for deeper evidence.

This is a readiness assessment with risk findings and test evidence. It is not a compliance certification and does not guarantee that a system is safe. Policy packs are technical test packs, not legal advice.

Test Repository (preview) — suites

/test-repository is a preview of test management. It opens with sample suites. You can import a saved test case set from the Test Cases workbench (“Move to Repository”), create suites, add and delete cases, set each case's status by hand, filter by status, type or priority, and export to Excel.

Nothing in the Test Repository is saved yet, whether or not you are signed in: suites, cases and statuses live in the open browser tab and are gone when you reload or leave the page. Export to Excel to keep a copy. Your generated test case sets are saved separately, in your account, from the Test Cases workbench.

Execution cycles (simulated)

The Cycles view runs a cycle template (for example Smoke or Full Regression) over the cases in the repository. GoQA does not execute your tests: each case that is still pending gets a random pass or fail result and a random duration, so the cycle log and its summary counts are a demonstration, not a measurement of your application. Cases you already marked keep their status.

Trends (sample data)

The Trends & Graphs view shows fixed sample numbers so you can see the layout. It is not calculated from your cycles or statuses, and GoQA does not compute flakiness percentages.

What is saved

Only generated test case sets (Test Cases workbench) and website audit results are saved to your account. Repository suites, statuses and cycles are not. Results from your own test pipeline cannot be uploaded to GoQA; a pipeline can start a GoQA website audit through the API.

Teams — creating a team and inviting members

Any signed-in account can create a team in Settings → Team and add members by email with a role (admin, editor or viewer). GoQA does not send an invitation email: it shows a join link, which you send to the person yourself. When they open it while signed in with that email's account, they join the team. The team owner sees pending and active members and can change a member's role or remove them.

Roles

A member's role (admin, editor or viewer) is recorded on the team and shown in the member list. Roles do not grant or restrict access to anything yet, because teams do not share data (next section).

What teams share

Nothing yet. Test cases, website audit results, scheduled audits, notification settings and credits belong to the account that created them, and row-level security keeps them visible to that account only — also between members of the same team. There is no shared dashboard and no workspace switcher in GoQA's core app. (AI Assurance has its own workspaces, described in its sections above.)

Integrations — CI/CD pipelines

A pipeline can audit a site (for example a staging deploy) and stop the release when the audit finds problems. Create a key in Settings → API keys and store it as a secret in your CI (AWS Secrets Manager, Parameter Store or GitHub secrets), never in the repository. API audits use your plan's pages and credits like scheduled audits, run one at a time per account (up to 3 queued), and also send your notifications and AWS events (api_audit.completed, api_audit.failed, …).

The audit script

goqa-audit.mjs (Node 18+, no dependencies) starts the audit, waits for it, prints the findings and exits 1 when they cross your thresholds (2 when the audit could not complete, for example out of credits). Options: --fail-on-security high|any|none (default high: high or critical findings fail), --max-accessibility N, --max-broken-links N, --max-visual-changes N (fail when more than N pages changed against the screenshot baseline you set for them; pages without a baseline are not compared), --new-only (apply those limits only to findings the previous audit of the same URL did not have, so known issues do not block every build), --report report.json (save the full report), --junit goqa.xml (JUnit XML with one test per check, for CodeBuild test reports, GitHub test reporters or Jenkins) and --timeout 30 (minutes). On GitHub Actions it also writes a findings table to the job summary and marks failed checks as error annotations. Commit a copy to your repository to pin the version you run.

AWS CodeBuild and CodePipeline

A buildspec.yml for a CodeBuild project (any standard image with Node 18 or later). In CodePipeline, add it as a Test action after your deploy stage; a failed audit fails the action and stops the pipeline.

version: 0.2
env:
  secrets-manager:
    GOQA_API_KEY: goqa/api-key        # a Secrets Manager secret holding the key
  variables:
    GOQA_URL: https://staging.example.com
phases:
  build:
    commands:
      - curl -fsSLo goqa-audit.mjs https://goqa.ai/ci/goqa-audit.mjs
      - node goqa-audit.mjs --fail-on-security high --max-broken-links 0 --report goqa-report.json --junit goqa-junit.xml
reports:
  goqa:                               # shows each check in CodeBuild → Reports
    files:
      - goqa-junit.xml
    file-format: JUNITXML
artifacts:
  files:
    - goqa-report.json

GitHub Actions

- name: GoQA audit
  env:
    GOQA_API_KEY: ${{ secrets.GOQA_API_KEY }}
  run: |
    curl -fsSLo goqa-audit.mjs https://goqa.ai/ci/goqa-audit.mjs
    node goqa-audit.mjs --url https://staging.example.com --fail-on-security high

The API

OpenAPI specs

In the Test Cases workbench, choose the OpenAPI spec tab and enter the URL of an OpenAPI 3 document in JSON. GoQA fetches it and turns each operation into lines of text: method and path, summary or description, required parameter names, documented response codes and whether security applies. You can edit that text before generating. Request and response schemas and security scheme details are not read.

Postman collections: the same field takes the address of a Postman collection (v2.0 or v2.1 JSON, for example a raw file on GitHub). Its requests are read as endpoints, with the collection's own variables, path variables and query values. Requests that use a variable with no value, call another host than the collection's main API, or have auth (their own, their folder's or the collection's, or an Authorization or API-key header) are listed as not run. Saved example responses document the status codes, and a JSON example is checked loosely: a field that changes type fails, a missing or extra field does not. Postman environments and test scripts are not used. CI runs (/api/v1/api-checks and the CI script) accept a collection address the same way.

Run API checks (signed in) calls the live API. GoQA requests each GET endpoint once, at the spec's server address or the API address you enter, and checks the answer against the spec:

Path and required query parameters use the spec's example, default or first allowed value; an endpoint without one is not called. Endpoints that can change data (POST, PUT, PATCH, DELETE) and endpoints that need sign-in are never called; the list under the results says why each one was left out. A run calls at most 30 endpoints, public addresses only, and uses one crawl credit on the Free and Starter plans. Swagger 2 specs work too.

To check endpoints that need sign-in, open Sign-in for endpoints that need it and enter one header (for example Authorization with Bearer …, or your API key header). Use a test account's credential. It needs an https:// API address that you type, is sent only to that address (dropped if the API redirects anywhere else), and is never saved or logged. Endpoints still answer only to GET. A 401 or 403 then fails the check.Download JUnit XML saves the results for CI dashboards.

Every finished run is saved: Past runs under the panel lists the newest runs of the spec, from the app and from CI, with the endpoints that failed. GoQA keeps your newest 200 runs. The credential header is never part of the saved run.

From CI: with a GoQA API key (Settings → API keys), POST /api/v1/api-checks runs the same checks and answers when they finish (within about a minute). The body is the same as in the app: specUrl, optionally baseUrl and auth. Add ?format=junit for JUnit XML that test reporters fail on; the JSON answer has result "pass" or "fail" (a check that failed or never ran is a fail). A CI run is charged like one in the app.

curl -sS -X POST "https://goqa.ai/api/v1/api-checks?format=junit" \
  -H "Authorization: Bearer $GOQA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"specUrl":"https://api.example.com/openapi.json"}' \
  -o goqa-api-checks.xml

Or use the ready-made script goqa-api-checks.mjs (Node 18+, no dependencies): node goqa-api-checks.mjs --spec https://api.example.com/openapi.json --junit results.xml. It prints each endpoint, exits 1 when a check fails or does not run (--strict also fails on "to check" results), and on GitHub Actions writes a job summary. For endpoints that need sign-in, set GOQA_API_CHECK_AUTH to one header (for example Authorization: Bearer … of a test account) and pass --base https://….

Response times: under Response times, choose up to 5 requests per endpoint and optionally a time budget in milliseconds. Each endpoint is called that many times, one request after another (at most 60 requests a run, so large specs get fewer), and judged on its typical (median) time: over the budget fails, and without a budget over 3 s is marked to check. The results show the typical and the slowest time. Every endpoint is checked once first, then the extra requests use the time left. Only the first request is checked against the spec; later ones must get the same status (a 429 fails: the API refused repeated requests). A timed run counts as two runs toward the hourly limit. This measures response times; it is not a load test. From CI, send "timing": { "samples": 5, "budgetMs": 800 } or pass --samples 5 --budget-ms 800 to the script.

Breaking changes between versions: under the checks, Compare with an earlier version takes the address of the older spec and lists what a client written for it would trip over: endpoints removed, answer fields removed, changed in type or no longer required, parameters or a request body that became required, request values no longer accepted, endpoints that now need sign-in, success statuses or answer bodies no longer documented. Added endpoints and fields, optional parameters, deprecations and a changed declared API address are listed apart. readOnly fields count only in answers and writeOnly ones only in requests; a change of sign-in scheme is not compared. Nothing is called on the API and no credit is used.

From CI, POST /api/v1/api-checks/compare takes oldUrl or oldSpec and newUrl or newSpec (a *Spec is the JSON itself, for example the file in your repository; up to 2 MB each) and answers result "fail" when there is a breaking change. With the script, add --compare-to the earlier version (an address, such as production's spec, or a file); --spec may then be a file, in which case only the comparison runs. Breaking changes fail the build unless you pass --allow-breaking: node goqa-api-checks.mjs --spec openapi.json --compare-to https://api.example.com/openapi.json.

Test case runs from CI

A pipeline can run a saved test case set in a browser and fail the build when a case fails. The set needs a schedule (Run on a schedule on /test-cases, any frequency): a CI run is that scheduled run started now, against the schedule's site, in its browser, with the same credits, Run history and notifications. The schedule keeps its own days and times. The panel shows the set's id once it has a schedule.

With a GoQA API key (Settings → API keys), POST /api/v1/test-runs with {"setId":"…"} starts the run and answers 202 with previousRunAt. A run takes minutes, so poll GET /api/v1/test-runs?setId=… until lastRunAt differs from previousRunAt and state is not "running"; then lastStatus is pass, fail, error, no_credits or interrupted, and summary.cases lists each case run with the step that failed. A set that is running already answers 409 (running), and so does a paused schedule (paused); a set that ran less than 2 minutes ago answers 429. The run starts within seconds, or after the scheduled runs GoQA is busy with.

GOQA_API_KEY=goqa_… node goqa-test-runs.mjs --set <set id> --junit goqa-cases.xml

The script goqa-test-runs.mjs (Node 18+, no dependencies) starts the run, waits for it (--timeout minutes, default 45; if the set is running already it waits for that run first) and prints each case. It exits 1 when a case failed or could not run, or nothing was checked; 2 when the run could not be done (no credits, interrupted, timed out); 3 for setup errors (no schedule, paused, no case with steps, bad key). Up to 10 case runs per run, as for scheduled runs: cases left out are listed with a warning, and --fail-on-not-run fails the build on them. On GitHub Actions it writes a job summary and error annotations.

Notification channels

Configure notifications in /settings. Every channel has a “Send test ping” button; a URL that does not belong to its platform is refused on save.

Issue trackers: Jira, Azure DevOps, GitHub, Linear

Connect a tracker in Settings → Integrations, then use Create ticket on a security finding, an accessibility violation, a broken link or a generated test case. The ticket gets the finding's details and the page it was found on, and GoQA shows a link to it. Available on every plan.

Tokens are encrypted (AES-256-GCM) before they are stored, are never shown again after saving (only their last four characters), and are sent only to that tracker's own API. “Test connection” makes a read-only call; “Disconnect” deletes the token. Tickets are one-way: GoQA does not sync status back. To move many test cases at once, export Excel or JSON and use the tool's import.

Amazon Web Services: S3, EventBridge and SNS

In Settings → Integrations, connect AWS with a region and an IAM user's access key (long-term AKIA… keys; the secret is stored encrypted). Fill in only what you want to use:

Events go out for every outcome, whatever the chat “notify on” switches say. Each delivery is recorded, and the latest show under “Recent notification events” on Test Website. “Test connection” calls STS GetCallerIdentity and shows the account id. A minimal IAM policy:

{
  "Version": "2012-10-17",
  "Statement": [
    { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-qa-reports/goqa/*" },
    { "Effect": "Allow", "Action": "events:PutEvents", "Resource": "arn:aws:events:us-east-1:123456789012:event-bus/default" },
    { "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-1:123456789012:goqa" }
  ]
}

Settings — scheduled audits

Settings → Scheduled Audits lists your schedules with their frequency, next run time and last run outcome. You can create a schedule, pause or re-enable it, and delete it. Pausing or deleting a schedule stops an audit that has not finished; audit results already saved stay in your Dashboard. See Scheduled audits.

Notification webhooks

Webhook configuration lives at /settings. Two notification triggers are available — Notify on fail and Notify on complete — for every configured channel. Settings are stored server-side and synced across all devices on your account.

A notification has a title and a short message: the audited URL and page count for a crawl, the reason for a skipped or failed scheduled audit, or the number of generated cases. It does not include grades or finding counts. A schedule's own webhook is notified of every completed, skipped or failed run.

Onboarding tour

The Dashboard shows a five-step tour until you finish or skip it: Welcome, Generate your first test case (link to the workbench), Try the Test Repository, Run an AI site audit, and a final step linking back to the Dashboard. Skip closes it. It cannot be restarted.

Billing & plan

Compare plans and, on the retired Pro plan, manage your subscription at /pricing. Payments are processed by Stripe; card details are never stored by GoQA.

Usage dashboard

The top of the Dashboard shows:

Free-tier credit usage is tracked server-side and persists across devices. Enterprise is unlimited (so is the retired Pro plan) — the gauge is hidden for those accounts. See Free-tier credits for the full breakdown.

Free-tier credits

Starter accounts get free credits every calendar month to use the platform on real work — no credit card required.

Credit typeFree allocation per monthWhat it covers
AI generations10Each “Generate” click in the Test Case workbench.
Website crawls5AI website audit runs, up to 5 pages each.

Report viewer

When you select a saved result in the Dashboard detail panel, GoQA renders a formatted report instead of raw JSON. Two view modes are available:

Mobile navigation

On small screens the Dashboard, Test Cases, AI Testing and Settings pages show a fixed bottom bar with Overview, Tests, AI, Automation and Billing. More opens a sheet with all destinations, your account name and Sign out; it closes when you tap a link or the backdrop.

Community Discover feed

The Discover page lists crawl results that signed-in users chose to publish. It is public: anyone can read it without signing in.

API access

The public API is /api/v1, authenticated with an API key from Settings → API keys in an Authorization: Bearer goqa_… header. It starts website audits and reads their results; see CI/CD pipelines. Other endpoints under /api/ serve the GoQA app itself, accept only a signed-in browser session, and can change without notice, so do not build integrations on them.

Public links

The only resources meant to be opened without signing in are the ones you choose to share: a shareable report URL and its embeddable badge. See Sharing reports and Embeddable badge.

FAQ

1. Can I test a site I don't own?

No. Our Terms of Service allow testing only of websites you own or have explicit written permission to test. Unauthorized testing of third-party infrastructure may be illegal under the Computer Fraud and Abuse Act (USA), Computer Misuse Act (UK), and similar laws in other jurisdictions.

2. Does the security scan modify the target site?

No. All probes are non-destructive read-only HTTP requests. The scanner does not attempt to exploit found vulnerabilities, write data, or modify state.

3. Can I use GoQA from GitHub Actions or another CI system?

Yes, for website audits: a pipeline step can start an audit with an API key and fail the build on security, accessibility or broken-link thresholds (see CI/CD pipelines). Generated test cases are not run by GoQA; export them and run the suite you build from them in your own pipeline.

4. What happens to my data when I move from a paid plan to Starter?

Your saved test cases and audit results stay in your account. From then on Starter's monthly limits apply: 10 AI generations and 5 website crawls of up to 5 pages each. Moving back to a paid plan lifts those limits once your plan is updated.

5. Does the Test Repository keep my suites and runs?

Not yet. The Test Repository is a preview: suites, statuses and cycles stay in the open browser tab and are lost on reload, cycle runs are simulated, and GoQA does not compute flakiness. Export to Excel to keep a copy.

6. What does a shared report show?

A summary: the site, counts of pages, security findings, accessibility issues and broken links, the first findings in each category and a few screenshots. For everything, export the audit and share the file instead.

7. When do scheduled audits run?

After their due time, when GoQA's scheduler next runs. A run uses your plan's crawl limits; if a limit is reached the run is skipped, and Settings → Scheduled Audits shows why.

8. Can I restart the onboarding tour?

No. Once you finish or skip it, it does not appear again.

9. Does the AI Test Coverage Score count other panels or the repository?

No. Each result panel scores only its own cases. See AI Test Coverage Score.

10. Does the badge update after a new audit?

No. A badge belongs to the one shared audit. Share the new audit to get a badge for it.

Design patterns (POM + Factory)

The GoQA codebase deliberately uses two simple, beginner-friendly design patterns so a developer joining the team can read the project on day one. Both patterns live under tests/ and are documented in tests/README.md.

We resist clever abstractions on purpose. No DI containers, no deep inheritance trees, no decorator magic. If a new contributor cannot understand a page object or factory in under two minutes, we simplify it.

Page Object Model

Page objects live in tests/e2e/pages/. Each route gets one class extending a tiny BasePage shared parent. The class exposes verbs (loginAs, submit) and locator getters (emailInput, errorBanner). Specs do the asserting; pages never call expect().

Currently shipped page objects:

See tests/e2e/login.pom.spec.ts for a worked example combining POM + factory patterns in a single test.

Factories

Factories live in tests/factories/. Each exposes build(overrides?) returning a deterministic object — same input, same output, every run. No randomness, no Faker.

Convention: every test calls factory.build({...overrides}) rather than constructing objects inline. This keeps test intent legible and absorbs schema changes in a single file.

Test suite layout

tests/
├── e2e/                   Playwright end-to-end tests
│   ├── pages/             Page Object Model — one class per route
│   └── *.spec.ts          Specs that use page objects + factories
├── factories/             Factory pattern — deterministic test data
├── integration/           API integration tests (Jest + supertest)
└── unit/                  Pure-function unit tests (Jest)

Run all three layers from the project root:

Automation agent roster

GoQA ships with seven specialized automation agents under .github/agents/. Each agent definition is a Markdown spec a contributor (or another LLM) can read and execute. The roster is tuned for the QA / AI tooling market — every agent has a single, narrow responsibility:

Design patterns agent

.github/agents/design-patterns-agent.agent.md enforces the POM + Factory conventions described above. Its job is to:

The agent explicitly refuses to introduce DI containers, base-class hierarchies, or decorator magic — readability for new developers is the win condition.

SEO agent

.github/agents/seo-agent.agent.md audits and improves how GoQA is discovered by both classical search engines and AI crawlers. It covers:

Success criterion: every primary keyword has a page on SERP page 1 within three months and the home page Lighthouse SEO score is ≥ 95.

App analysis agent

.github/agents/app-analysis-agent.agent.md runs a holistic, end-to-end health check on demand and returns a single verdict — GREEN, YELLOW, or RED — with evidence. It exercises:

Rule: the agent refuses to issue a GREEN verdict if it skipped any section. Skipped sections must be listed explicitly with a reason.

Feature suggestion agent

.github/agents/feature-suggestion-agent.agent.md takes a fresh look at the live app and proposes the top ten unshipped features that would make GoQA the obvious leader in its category. Suggestions are ranked across five vectors:

Output is structured as one-pagers with effort, impact, why-us, risks, and the smallest shippable v0 — enough for a PM to triage and a senior engineer to scope.

Where to go next