plugins/replayio/skills/replay-qa-api/SKILL.md
Use when calling Replay QA's REST API directly from Codex. Covers bearer-token setup, Replay recording prerequisites, project creation from Replay recordings or target URLs, polling, bug retrieval, journeys, test runs, explorations, and fix workflow discipline.
npx skillsauth add openai/plugins replay-qa-apiInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use the Replay QA REST API directly when a task needs Replay QA analysis. This skill is instructions-only: do not use Replay MCP tools, Codex apps, or plugin hooks as substitutes for Replay QA REST API calls.
Before making any Replay QA API call, make sure the replayio skill in this same Codex plugin bundle has been loaded and applied for the current session.
If setup is unknown, load ../replayio/SKILL.md first and follow it before continuing. In particular, verify:
REPLAY_API_KEY is mapped from SECRET_REPLAY_API_KEY when available.REPLAY_QA_API_KEY is mapped from SECRET_REPLAY_QA_API_KEY.AGENT_BROWSER_EXECUTABLE_PATH points at Replay Chromium.RECORD_ALL_CONTENT and RECORD_REPLAY_VERBOSE are set.Do not proceed with project creation or polling if this prerequisite is unknown. Load and apply the replayio skill first, then return to this skill.
Replay QA API tokens are bearer tokens that start with lqa_. Generate one in Replay QA Settings and store it as SECRET_REPLAY_QA_API_KEY when the host supports project secrets. Map it before calling the API:
if [ -z "${REPLAY_QA_API_KEY:-}" ] && [ -n "${SECRET_REPLAY_QA_API_KEY:-}" ]; then
export REPLAY_QA_API_KEY="$SECRET_REPLAY_QA_API_KEY"
fi
test -n "${REPLAY_QA_API_KEY:-}"
Never print the token.
Use:
export REPLAY_QA_API_BASE="${REPLAY_QA_API_BASE:-https://qa.replay.io/api/v1}"
All requests need:
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
-H "Content-Type: application/json"
Use this when you already have an uploaded Replay recording UUID. When recording_id is present, target_url is not required.
Required input:
name: clear project or scenario name.recording_id: Replay recording UUID.instructions: include the raw test source URL when possible and the exact failure message or stack.webhook_url: optional.curl -sS -X POST "$REPLAY_QA_API_BASE/projects" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "S01 - checkout total does not update",
"recording_id": "00000000-0000-0000-0000-000000000000",
"instructions": "Analyze this Replay recording of a failing automated test.\n\nTest source:\nhttps://raw.githubusercontent.com/org/repo/refs/heads/branch/tests/checkout.spec.ts\n\nError:\nExpected checkout total to update after clicking Confirm Checkout.\n\nExplain the root cause and the code change that should fix it."
}'
Save the returned project id and project url if present. If only an id is returned, the overview URL is:
https://qa.replay.io/p/:projectId/overview
Use this when Replay QA should explore an app URL instead of analyzing one recording.
curl -sS -X POST "$REPLAY_QA_API_BASE/projects" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Todo app smoke exploration",
"target_url": "https://example.com",
"instructions": "Explore the main user flows and report correctness, polish, and UX bugs."
}'
Optional fields supported by the API include webhook_url, backend_recording_url, backend_log_url, logins, and design_document. Only include credentials when the user explicitly provided them for this app.
Poll every 30 seconds until the project reports completion. Status can be returned either at the top level or under project.status, so inspect the response shape instead of assuming one field.
PROJECT_ID="..."
curl -sS "$REPLAY_QA_API_BASE/projects/$PROJECT_ID/status" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
For long-running analysis, report that Replay QA is still processing rather than guessing from partial data.
List bugs:
curl -sS "$REPLAY_QA_API_BASE/projects/$PROJECT_ID/bugs?page_size=100" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
Filter open bugs:
curl -sS "$REPLAY_QA_API_BASE/projects/$PROJECT_ID/bugs?status=open&page_size=100" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
Fetch full bug detail:
BUG_ID="..."
curl -sS "$REPLAY_QA_API_BASE/bugs/$BUG_ID" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
Use bug detail as the source of truth for root cause, reproduction steps, expected behavior, actual behavior, severity, and Replay evidence.
List journeys:
curl -sS "$REPLAY_QA_API_BASE/projects/$PROJECT_ID/journeys?page_size=100" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
List test runs:
curl -sS "$REPLAY_QA_API_BASE/projects/$PROJECT_ID/test-runs?page_size=100" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
List explorations:
curl -sS "$REPLAY_QA_API_BASE/projects/$PROJECT_ID/explorations?page_size=100" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY"
Start another exploration:
curl -sS -X POST "$REPLAY_QA_API_BASE/projects/$PROJECT_ID/explorations" \
-H "Authorization: Bearer $REPLAY_QA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Re-test checkout, saved drafts, and navigation edge cases.",
"agent_count": 3
}'
agent_count must be between 1 and 10.
When Replay QA is used to guide fixes:
Do not infer a root cause from source reading while Replay QA analysis is still pending.
Key endpoints:
| Method | Path | Purpose |
|---|---|---|
| GET | /projects | List projects |
| POST | /projects | Create a recording-analysis or app-exploration project |
| GET | /projects/{project_id} | Get project details |
| GET | /projects/{project_id}/status | Get project summary/status |
| GET | /projects/{project_id}/bugs | List bugs |
| GET | /bugs/{bug_id} | Get bug detail |
| GET | /projects/{project_id}/journeys | List journeys |
| GET | /projects/{project_id}/test-runs | List test runs |
| GET | /projects/{project_id}/explorations | List explorations |
| POST | /projects/{project_id}/explorations | Start a new exploration |
OpenAPI spec:
https://qa.replay.io/api/v1/openapi.json
When reporting Replay QA API work, include:
development
Use when the user wants to spin up / create / launch / provision a DigitalOcean droplet (or "a remote dev box on DO") and connect to it from Codex as a remote SSH workspace.
data-ai
Search through Microsoft Teams chats or channels, triage unread or recent activity, draft follow-ups, and manage Planner tasks through connected Teams data.
tools
Motion / animation context for the `use_figma` MCP tool — animating Figma nodes via manual keyframes, animation styles, easing, and timeline duration. Load alongside figma-use whenever a task involves adding, editing, or inspecting animation on a node.
development
SwiftUI ↔ Figma translation. Use whenever the user mentions Swift, SwiftUI, iOS, iPhone, or iPad — in EITHER direction — translating a Figma design into SwiftUI (design → code), or pushing SwiftUI views / screens / tokens back into a Figma file (code → design). Triggers on phrases like 'implement this Figma design in SwiftUI', 'build this screen in Swift', 'push this SwiftUI view to Figma', 'mirror my Swift code in a Figma file', or whenever a Figma URL appears alongside `.swift` files / an `.xcodeproj`. Routes to a direction-specific reference doc; loads alongside `figma-use` for the code → design path.