API Testing
petrkindlmann/qa-skills
Test REST and GraphQL APIs with Playwright APIRequestContext, Supertest, or standalone HTTP clients.
API testing patterns for Playwright -- apiRequest fixture usage, Zod response schema creation and validation, test.step wrapping for multi-call tests, per-field negative/validation testing, path…
$ npx skills add idavidov13/agentic-playwright --skill api-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install idavidov13/agentic-playwright api-testing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/idavidov13/agentic-playwright.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/api-testing .claude/skills/api-testing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "api-testing" agent skill from https://github.com/idavidov13/agentic-playwright/tree/main/.claude/skills/api-testing into .claude/skills/api-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "api-testing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/idavidov13/agentic-playwright/tree/main/.claude/skills/api-testingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add idavidov13/agentic-playwright --skill api-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install idavidov13/agentic-playwright api-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idavidov13/agentic-playwright.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/api-testing .agents/skills/api-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "api-testing" agent skill from https://github.com/idavidov13/agentic-playwright/tree/main/.claude/skills/api-testing into .agents/skills/api-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "api-testing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add idavidov13/agentic-playwright --skill api-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install idavidov13/agentic-playwright api-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idavidov13/agentic-playwright.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/api-testing .cursor/skills/api-testing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "api-testing" agent skill from https://github.com/idavidov13/agentic-playwright/tree/main/.claude/skills/api-testing into .cursor/skills/api-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "api-testing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/idavidov13/agentic-playwright.git --path .claude/skills/api-testing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add idavidov13/agentic-playwright --skill api-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install idavidov13/agentic-playwright api-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idavidov13/agentic-playwright.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/api-testing .gemini/skills/api-testing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "api-testing" agent skill from https://github.com/idavidov13/agentic-playwright/tree/main/.claude/skills/api-testing into .gemini/skills/api-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "api-testing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install idavidov13/agentic-playwright api-testingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add idavidov13/agentic-playwright --skill api-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/idavidov13/agentic-playwright.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/api-testing .github/skills/api-testing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "api-testing" agent skill from https://github.com/idavidov13/agentic-playwright/tree/main/.claude/skills/api-testing into .github/skills/api-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "api-testing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add idavidov13/agentic-playwright --skill api-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install idavidov13/agentic-playwright api-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/idavidov13/agentic-playwright.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/api-testing .opencode/skills/api-testing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "api-testing" agent skill from https://github.com/idavidov13/agentic-playwright/tree/main/.claude/skills/api-testing into .opencode/skills/api-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "api-testing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
api-testingAPI testing patterns for Playwright -- apiRequest fixture usage, Zod response schema creation and validation, test.step wrapping for multi-call tests, per-field negative/validation testing, path…
API Testing is an agent skill from idavidov13/agentic-playwright. API testing patterns for Playwright -- apiRequest fixture usage, Zod response schema creation and validation, test.step wrapping for multi-call tests, per-field negative/validation testing, path parameter fuzzing, and helper fixtures for shared setup/teardown. Use when writing or updating API test specs, adding tests for a new endpoint, creating Zod schemas for responses, wiring apiRequest or helper fixtures, or investigating API behavior mismatches vs the OpenAPI spec. Do NOT use for UI selectors (use the…
Its SKILL.md is about 5.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/examples.md`, `references/helper-fixture-example.md` and `references/negative-testing.md`).
It sits in Testing & QA, covering API testing, OpenAPI specifications and Forms and validation. It works with Zod, Playwright and OpenAPI. The repository describes itself as: Production-grade Playwright + TypeScript Scaffold for Agentic Testing. Harness for all major AI coding agents baked in. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f6cbf35. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
ACCESS_TOKENAPP_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
API Testing loads about 5.7k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 165 tokens; SKILL.md has 1,900 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from idavidov13/agentic-playwright at commit f6cbf35, republished under its MIT licence (© idavidov13). 1,900 words, ~5,669 tokens.
.claude/skills/api-testing/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.These rules are non-negotiable. Violating any of them breaks the scaffold's contract.
process.env.* (for URLs and credentials) and the enums/{area}/* enums (for endpoint paths, e.g. ApiEndpoints.LOGIN).expect(SchemaName.parse(body)).toBeTruthy();. Type generics alone are not enough, and schema.parse(body) without the expect(...).toBeTruthy() wrapper is not enough.test.step() when a test contains more than one API call.test.skip, and add a // FIXME: <ticket-url> comment.{} empty-body validation. Every request-body endpoint requires per-field omission and per-field invalid-type tests.apiRequest fixture directly in tests. Only promote to a helper fixture when the same setup/teardown is reused across 3+ test files.The API contract — not observed behavior — is the source of truth for schemas and tests.
If OpenAPI / Swagger / equivalent documentation exists (the normal case):
test.skip + // FIXME: <ticket-url>).Only if no documentation is provided (legacy endpoint, undocumented service, etc.):
Schemas live under fixtures/api/schemas/.
{area}is a placeholder. Runls fixtures/api/schemas/to discover the real subdirectory names in this repo (e.g.,front-office,back-office) and use those instead.
fixtures/api/schemas/
├── {area}/ ← App-specific response/request schemas
│ └── userSchema.ts
└── util/ ← Shared error response schemas
└── errorResponseSchema.tsBuild the schema directly from the OpenAPI / Swagger contract — including the response envelope (success / message / data / errors or whatever the spec describes). Spell every field out per endpoint; do not invent a factory helper. If the same envelope repeats across many endpoints in one domain, extract a per-domain _envelope.ts (z.strictObject) and compose via .extend(...) — only after the repetition is real:
// fixtures/api/schemas/{area}/productSchema.ts
import { z } from 'zod/v4';
import type { output as zOutput } from 'zod/v4';
export const ProductSchema = z.strictObject({
id: z.uuid(),
name: z.string().min(1),
price: z.number().positive(),
category: z.enum(['electronics', 'clothing', 'food']),
inStock: z.boolean(),
});
// Response envelope is spelled out per the OpenAPI contract -- 1:1 mirror.
export const CreateProductResponseSchema = z.strictObject({
success: z.boolean(),
message: z.string(),
data: ProductSchema,
errors: z.unknown().nullable(),
});
export type Product = zOutput<typeof ProductSchema>;
export type CreateProductResponse = zOutput<typeof CreateProductResponseSchema>;Error response schemas already exist in fixtures/api/schemas/util/errorResponseSchema.ts:
BadRequestResponseSchema (400)UnauthorizedResponseSchema (401)ForbiddenResponseSchema (403)NotFoundResponseSchema (404)import {
UnauthorizedResponse,
UnauthorizedResponseSchema,
} from '../../../fixtures/api/schemas/util/errorResponseSchema';
const { status, body } = await apiRequest<UnauthorizedResponse>({
method: 'POST',
url: '/api/login',
baseUrl: process.env.API_URL,
body: { email: 'bad@email.com', password: 'wrong' },
});
expect(status).toBe(401);
expect(UnauthorizedResponseSchema.parse(body)).toBeTruthy();For 401 and 403 responses that return a null body, assert expect(body).toBeNull() directly — no schema needed.
apiRequest fixtureUse the apiRequest fixture for all API calls in tests. It provides type-safe requests with automatic response parsing via Playwright's dependency injection:
import { expect, test } from '../../../fixtures/pom/test-options';
import {
UserResponse,
UserResponseSchema,
} from '../../../fixtures/api/schemas/app/userSchema';
test('should return user data', { tag: '@api' }, async ({ apiRequest }) => {
const { status, body } = await apiRequest<UserResponse>({
method: 'GET',
url: '/api/users/me',
baseUrl: process.env.API_URL,
headers: process.env.ACCESS_TOKEN,
});
expect(status).toBe(200);
expect(UserResponseSchema.parse(body)).toBeTruthy();
});Use the apiRequest fixture directly for all API work in tests — assertions, setup calls in beforeEach, teardown calls in afterEach, and one-off requests. Do not create a separate helper fixture for every endpoint.
Request parameters:
| Option | Type | Required | Description |
|---|---|---|---|
method | 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | Yes | HTTP method |
url | string | Yes | Endpoint path |
baseUrl | string | No | Base URL to prepend |
body | Record<string, unknown> | No | Request payload |
headers | string | No | Auth token for Authorization header |
authType | 'Bearer' | 'Token' | 'Basic' | No | Auth scheme (default: 'Bearer') |
Response validation — combine compile-time and runtime safety:
const { status, body } = await apiRequest<UserResponse>({ ... });
expect(UserResponseSchema.parse(body)).toBeTruthy();The generic <UserResponse> gives you compile-time type safety on body, while UserResponseSchema.parse() gives you runtime validation. Always use both.
Credentials and URLs — pull from env, never inline:
// CORRECT
baseUrl: process.env.API_URL,
headers: process.env.ACCESS_TOKEN,
body: { email: process.env.APP_EMAIL, password: process.env.APP_PASSWORD },
// FORBIDDEN
baseUrl: 'https://api.example.com',
headers: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',Use enums for endpoint paths:
import { ApiEndpoints } from '../../../enums/app/app';
url: ApiEndpoints.LOGIN,test.stepMANDATORY: When a test contains more than one API call, each call MUST be wrapped in a dedicated test.step() with:
This improves:
Correct pattern:
test(
'should create and verify user workflow',
{ tag: '@api' },
async ({ apiRequest }) => {
const userData = generateUser();
let userId: string;
await test.step('Create user via POST /api/users', async () => {
const { status, body } = await apiRequest<UserResponse>({
method: 'POST',
url: '/api/users',
baseUrl: process.env.API_URL,
headers: process.env.ACCESS_TOKEN,
body: userData,
});
expect(status).toBe(201);
expect(UserResponseSchema.parse(body)).toBeTruthy();
userId = body.id;
});
await test.step('Retrieve user via GET /api/users/:id', async () => {
const { status, body } = await apiRequest<UserResponse>({
method: 'GET',
url: `/api/users/${userId}`,
baseUrl: process.env.API_URL,
headers: process.env.ACCESS_TOKEN,
});
expect(status).toBe(200);
expect(UserResponseSchema.parse(body)).toBeTruthy();
expect(body.id).toBe(userId);
expect(body.email).toBe(userData.email);
});
await test.step('Delete user via DELETE /api/users/:id', async () => {
const { status, body } = await apiRequest<null>({
method: 'DELETE',
url: `/api/users/${userId}`,
baseUrl: process.env.API_URL,
headers: process.env.ACCESS_TOKEN,
});
expect(status).toBe(204);
expect(body).toBeNull();
});
}
);Forbidden pattern: multiple API calls inside a single test body without test.step wrappers — the trace shows one big test, debugging which call failed requires reading the assertions, and reporting can't surface create-vs-get-vs-delete structure. For the full anti-pattern code block see references/test-step-patterns.md.
Single API call exception: If a test contains only one API call, test.step is optional but recommended for consistency.
For every endpoint × HTTP method combination, tests MUST cover every status code listed in the OpenAPI spec plus the baseline scenarios below. If the OpenAPI spec lists a status code not in this table, it still requires a test.
| Scenario | Status | What to assert |
|---|---|---|
| Happy path (valid auth + valid body) | 200/201 | Schema parse passes + key fields match sent data |
| Missing Authorization header | 401 | status === 401, validate body with schema or expect(body).toBeNull() |
| Insufficient permissions (wrong-role token) | 403 | status === 403, validate body with schema or expect(body).toBeNull() |
| Empty body (for POST/PUT/PATCH) | 400/422 | Error schema parse passes — single test with {} body |
| Each required field omitted individually | 400/422 | One test per field via destructure + rest — see Phase 6 |
| Each field with type-inappropriate values | 400/422 | for...of loop per field — see Phase 6 |
| Non-existent resource ID | 404 | status === 404 (use test.skip with // FIXME comment if backend bug exists) |
| Invalid path parameter formats | 404 | Data-driven loop: numeric string, boolean-like, special chars, injection attempts |
| Unsupported HTTP method | 405 | At least one test with a method the endpoint does not support |
| Conflict (if listed in OpenAPI) | 409 | Test the conflicting condition or test.skip with // FIXME if not reproducible |
| Validation errors (if listed in OpenAPI) | 422 | Covered by per-field validation tests above |
| No content (for DELETE) | 204 | status === 204, expect(body).toBeNull() |
Structure: One test.describe per HTTP method + path. Use beforeAll/afterAll (not beforeEach/afterEach) to create/delete shared resources needed by multiple tests in the same describe block.
Key conventions from real tests:
process.env.ACCESS_TOKEN (full permissions), process.env.ACCESS_TOKEN_ZERO (zero permissions)process.env.API_URL + /api/X — never bare process.env.API_URLafterAll in POST describes (holds resourceId from the happy-path test); afterAll in GET/PUT/DELETE describes (resource created in beforeAll)test.skip is needed due to a backend bug: add // FIXME: <ticket-url> comment + /* eslint-disable playwright/no-skipped-test */ above it@api for API tests (check real tag in existing spec files for other areas)Testing only with an empty body ({}) is never sufficient. Every endpoint that accepts a request body (POST, PUT, PATCH) requires systematic per-field validation testing.
Coverage checklist for endpoints with a body:
{}for...of loop per field using contextually appropriate invalid valuesUniversal invalid arrays live as as const exports in test-data/static/util/invalid-values.ts — INVALID_STRING_VALUES, INVALID_UUID_VALUES, INVALID_NUMBER_VALUES, INVALID_BOOLEAN_VALUES, INVALID_ENUM_VALUES, INVALID_ARRAY_VALUES, INVALID_OBJECT_VALUES. Always import; never redefine inline.
Patterns to use (full code in references/negative-testing.md):
for...of spread-and-override — base valid payload, override one field at a time with INVALID_* values, assert 400 + BadRequestResponseSchema.parse(body).const { [field]: _, ...rest } = validPayload) per required field.[{ description, value }] with numeric strings, boolean-likes, special chars, injection attempts. Mandatory regardless of OpenAPI mention.Three-tier rule for where invalid-value arrays live:
test-data/static/util/invalid-values.ts (INVALID_* as const tuples). Import; never redefine.test-data/static/{area}/*.ts (as const). Import; never inline. Never .json.A typical validation describe combines tier 1 and tier 3 in separate for...of loops. For full code blocks, the INVALID_* constants table, and the email-field type-vs-format combination rule, see references/negative-testing.md.
Forbidden: empty-body-only validation. A single body: {} test asserting 400 is not sufficient. Per-field omission and per-field invalid-type loops are mandatory. Full anti-pattern in references/test-step-patterns.md.
When the API's actual behavior differs from the OpenAPI spec or from the expected status code in the Phase 5 coverage matrix:
test.skip and add a // FIXME: comment explaining the discrepancy:/* eslint-disable playwright/no-skipped-test */
// FIXME: API returns 500 instead of 422 for invalid price on PUT. Backend bug.
test.skip(
'should return 422 when price is a non-numeric string',
{ tag: '@api' },
async ({ apiRequest }) => {
// ... test body as it SHOULD work per spec ...
}
);For critical, recurring setup/teardown operations that multiple tests depend on (e.g., creating a user account that several test files need as a precondition, or seeding complex data that must be cleaned up), use helper fixtures in fixtures/helper/helper-fixture.ts.
Helper fixtures wrap the apiRequest plain function with Playwright's fixture lifecycle: setup before await use(...), yield via use(data), teardown after — runs even if the test fails. For the full code pattern see references/helper-fixture-example.md.
When to use apiRequest fixture vs. helper fixture:
| Approach | Use Case | Example |
|---|---|---|
apiRequest fixture (primary) | All API calls in tests — assertions, beforeEach/afterEach, one-off calls | Validate status codes, response schemas, teardown in hooks |
| Helper fixture (important ops only) | Critical setup/teardown reused across many test files with guaranteed lifecycle | Seed a user account that 10+ test files depend on |
| Factory function | Generate dynamic test data (no API call) | generateUser() from test-data/factories/ |
Rule of thumb: Use apiRequest directly unless you find yourself copy-pasting the same multi-step setup/teardown into 3+ test files.
fixtures/
├── api/
│ ├── api-request-fixture.ts ← Playwright fixture providing apiRequest (used in tests via DI)
│ ├── plain-function.ts ← Core HTTP function (internal implementation, used by fixture and helpers)
│ ├── api-types.ts ← TypeScript types (ApiRequestParams, ApiRequestResponse, etc.)
│ └── schemas/ ← Zod schemas for validation
│ ├── app/ ← App-specific schemas
│ └── util/ ← Shared error response schemas
└── helper/
└── helper-fixture.ts ← Setup/teardown fixtures for important recurring operationsapi-request-fixture.ts — Playwright fixture wrapping the plain function. Provides apiRequest via DI with generics for type-safe responses. Primary tool for API calls in tests.plain-function.ts — Core HTTP function. Handles method routing, auth headers, response parsing. Used internally by the fixture and by helper fixtures.api-types.ts — Shared types: ApiRequestParams, ApiRequestResponse<T>, ApiRequestFn.helper-fixture.ts — Setup/teardown fixtures for important, recurring preconditions. Uses plain-function.ts internally.type-safety skill — Zod 4 schemas, z.strictObject(), the mandatory expect(SchemaName.parse(body)).toBeTruthy(); pattern, zOutput / zInput inference.data-strategy skill — Faker + Zod factories for happy-path payloads, the three-tier rule for negative testing (universal INVALID_* arrays + domain-specific sets + inline boundary values).enums skill — ApiEndpoints.* for endpoint paths and error message constants used in assertions.fixtures skill — the apiRequest fixture itself, helper fixtures for setup/teardown, and the 3+ files rule of thumb for promotion (Phase 8).helpers skill — auth bootstrap (createAppStorageState, setUserAccessToken) that publishes process.env.ACCESS_TOKEN consumed by API tests.test-standards skill — @api tag, test.step requirements for multi-call tests, single-tag rule.refactor-values skill — when an endpoint enum value or a Zod literal needs to change, the impact-analysis workflow.references/examples.md — three end-to-end walkthroughs (new endpoint, multi-step workflow, validation lockdown).references/troubleshooting.md — common API-testing pitfalls (ZodError, 401/null body, status-code drift, empty-body-only coverage, hardcoded URLs/tokens).references/negative-testing.md — full Phase 6 code blocks (per-field invalid-type, omitting required fields, path-parameter validation), the INVALID_* constants table, and the three-tier rule.references/test-step-patterns.md — full anti-pattern code blocks for Phase 4 (multi-call without test.step) and Phase 6 (empty-body-only validation).references/helper-fixture-example.md — full lifecycle-wired helper-fixture code pattern from Phase 8.© idavidov13, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in .claude/skills/api-testing of idavidov13/agentic-playwright.
Open the folder on GitHubat commit f6cbf35
API Testing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| API Testing this skillidavidov13/agentic-playwright | 223 | — | ~5.7k | Automated safety check: Pass | MIT | |
| API Testingpetrkindlmann/qa-skills | 163 | — | ~2.7k | Automated safety check: Pass | MIT | |
| API Testingfugazi/test-automation-skills-agents | 247 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Zodjasonjgardner/blockbench-mcp-plugin | 488 | 3 repos | ~1.4k | Automated safety check: Pass | GPL-3.0 | |
| REST API Designcuriositech/some_claude_skills | 243 | 1 repos | ~3.1k | Automated safety check: Pass | MIT | |
| Manage Dashboard WidgetsPostHog/posthog-foss | 721 | — | ~2.3k | Automated safety check: Pass | MIT |
petrkindlmann/qa-skills
Test REST and GraphQL APIs with Playwright APIRequestContext, Supertest, or standalone HTTP clients.
fugazi/test-automation-skills-agents
Test REST and GraphQL endpoint contracts using Playwright request fixture (TypeScript) or REST Assured (Java).
jasonjgardner/blockbench-mcp-plugin
Zod schema validation best practices for type safety, parsing, and error handling.
curiositech/some_claude_skills
Design REST API endpoints with Zod validation and OpenAPI documentation.
PostHog/posthog-foss
Guides PostHog engineers through dashboard widget platform work — ship a new widgettype (WIDGETREGISTRY, catalog, runwidgets, WidgetCard) or update a shipped type (config, query, layout, RBAC, tile…
scalar/scalar
Minimal starter runbook for cloud agents to install dependencies, run packages, execute tests, and troubleshoot the Scalar monorepo quickly.
idavidov13/agentic-playwright
Sole entry-point router for AI-assisted work on this Playwright scaffold — owns the 8-phase main workflow (classify → route → explore → plan+confidence → human gate → apply → verify → report), the…
idavidov13/agentic-playwright
Copy-paste AI prompt templates for common Playwright scaffold development tasks — adding page objects, functional/E2E/API tests, Zod schemas, factories, fixtures, and components.
idavidov13/agentic-playwright
Test data strategy for the Playwright scaffold — Faker + Zod factories for dynamic happy-path data, static TS files (.ts with as const exports — never .json) for domain-specific curated invalid…
idavidov13/agentic-playwright
Page Object Model pattern for the Playwright scaffold — class structure, get-accessor locator pattern, action-method conventions, component composition, registration via the page-object fixture, and…
idavidov13/agentic-playwright
Selector strategy, exploration-first workflow, locator priority order (getByRole then getByLabel then getByPlaceholder then getByText then getByTestId), and feedback/validation-message selector…
idavidov13/agentic-playwright
Spec file conventions for the Playwright scaffold — imports from test-options.ts, test file structure (describe / beforeEach / test / test.step), single-tag rule, functional vs E2E vs API vs setup…
Works with
Categories
API testing patterns for Playwright -- apiRequest fixture usage, Zod response schema creation and validation, test.step wrapping for multi-call tests, per-field negative/validation testing, path…. API Testing is an agent skill from idavidov13/agentic-playwright.step wrapping for multi-call tests, per-field negative/validation testing, path parameter fuzzing, and helper fixtures for shared setup/teardown.
API Testing fits situations like: updating API test specs; adding tests for a new endpoint; creating Zod schemas for responses; wiring apiRequest.
Run `npx skills add idavidov13/agentic-playwright --skill api-testing -a claude-code`. Or copy the skill folder (.claude/skills/api-testing in idavidov13/agentic-playwright) into .claude/skills/api-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add idavidov13/agentic-playwright --skill api-testing -a codex`. Or copy the skill folder (.claude/skills/api-testing in idavidov13/agentic-playwright) into .agents/skills/api-testing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add idavidov13/agentic-playwright --skill api-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/api-testing, .gemini/skills/api-testing, .github/skills/api-testing and .opencode/skills/api-testing in your project.
Going by SKILL.md and its folder, API Testing needs credentials named ACCESS_TOKEN and APP_PASSWORD. Our summary lists: A credential in ACCESS_TOKEN.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
API Testing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.7k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with API Testing: API Testing (petrkindlmann/qa-skills, 163 stars), API Testing (fugazi/test-automation-skills-agents, 247 stars), Zod (jasonjgardner/blockbench-mcp-plugin, 488 stars) and REST API Design (curiositech/some_claude_skills, 243 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
idavidov13 (a GitHub user) maintains it in idavidov13/agentic-playwright, which has 223 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 1, 2026.
Source: idavidov13/agentic-playwright on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.