apitest — API QA (master)

SkillDev tools

Lets your agent test local HTTP APIs by running chained curl checks and splitting test suites across parallel workers.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the apitest — API QA (master) skill

About this capability

Master HTTP QA: chains devenv then interactive API key / X-Environment-ID then real curls. Shards suites to parallel workers. Trigger: apitest, api test, curl localhost, QA local API.

What this skill tells your AI

The instructions your AI receives, as published by flexprice/flexprice in .cursor/skills/apitest/SKILL.md and read by ahel’s review.

This skill acts as master in a master / worker pattern for large workloads: it plans, sequences, holds secrets policy, merges outcomes. Delegate narrow, independent slabs to worker runs (parallel Cursor agents or separate chat tasks) — never fork without a stable BASE_URL, mode, and credential contract.

Always compose devenv for infra + deployment mode before HTTP unless endpoints are confirmed up.


0. Prerequisites (delegation)

  1. devenv phase — user intent (host API / consumer / temporal_worker / local / full compose), .env* hygiene, MAX_ROUNDS verify loop GREEN.
  2. Base URL — default http://127.0.0.1:8080; path prefix /v1 (see CLAUDE.md/AGENTS.md — no trailing slash on base).
  3. Trust model — user runs commands on their machine only; orchestrator prefers stdin env injection for curls not logging raw secrets.

1. Interactive credential ritual (blocking questions)

Ask explicitly, one bundle at a time:

#PromptStored as (concept)
1API key value for x-api-key header (often local sk_local_flexprice_test_key)?$FLEXPRICE_TEST_API_KEY
2X-Environment-ID GUID if authenticated routes scope to an environment (internal/types/header.go)?$FLEXPRICE_TEST_ENV_ID
3Any bearer JWT flow instead/in addition? Rare for pure api-key dashboards.$AUTH_HEADER literal
4Alternate HOST (staging/tunnel)?$BASE_URL override

Operational rule: Prefer shell:

read -rs FLEXPRICE_TEST_API_KEY && export FLEXPRICE_TEST_API_KEY && export BASE_URL=http://127.0.0.1:8080 && …

Never paste full keys back in assistant prose — confirm present/absent/length fingerprint only.


2. Minimal curl toolchain

# Health (normally unauthenticated outer router — GET /health is root router; swagger says /v1 base for API)
curl -sfS "${BASE_URL:-http://127.0.0.1:8080}/health" | head -c 200 || echo FAIL

# Private v1 example skeleton
curl -sfS "${BASE_URL:-http://127.0.0.1:8080}/v1/some/route" \
  -H "x-api-key: ${FLEXPRICE_TEST_API_KEY}" \
  ${FLEXPRICE_TEST_ENV_ID:+-H "X-Environment-ID: ${FLEXPRICE_TEST_ENV_ID}" } \
  -H "Accept: application/json"

Adapt routes from docs/swagger/ (swagger-3-0.json / handler paths in internal/api/router.go).

Verb matrix: -f curls fail on 4xx/5xx — toggle -w '\n%{http_code}\n' when debugging semantics.

Large bodies: --data-binary @file.json plus -H 'Content-Type: application/json'.


3. Standard orchestration playbook (deterministic phases)

Tick mentally as Orchestrator:

[A] Requirement intake — verbs (GET invoice? POST event?), tenancy surface, destructive vs readonly
[B] Compose **devenv** — mode + infra + verify loop GREEN
[C] Credential interactive gather — §1 vars exported in user shell orchestrator echoes
[D] Smoke ladder — health → simplest GET → progressively complex POST
[E] Record actual HTTP codes + trimmed JSON excerpts (truncate >2KB bodies)
[F] Tear-down optional — advise user Ctrl-C server / docker stop if ephemeral

Consumer mode caveat: consumer / ingestion-only modes expose few/no HTTP tests meaningful — steer user to api or local for REST probes while consumer runs sibling process.


4. Master / worker decomposition (massive workflows)

When splitting is justified:

  • > ~8 independent endpoints without shared mutable side-effect ordering.
  • Geography across Swagger tags (Customers, Invoices, Events, …).

Orchestrator tasks:

TaskResponsibility
Publish immutable contract snippet snippet to workers: BASE_URL, header list (names only — keys via env mirror), forbid schema drift
Freeze ordering dependencies (eg create-customer-before-subscription DAG)
Merge JSON pass/fail report table

Worker tasks:

TaskResponsibility
Single tag / subdomain file list bounded
curls only — readonly repos if parallel (readonly Cursor agent mode preferred)
Return compact stdout block + stray stderr

Mechanism hints (implementation-agnostic wording for Cursor stacks):

  • Use multiple parallel agent runs (background tasks) when product UI supports partitioning — isolate promptsavoid shared file edits concurrently on identical paths.
  • If only single agent lane: sequential micro-batches respecting DAG.

Workers pull infra state from devenv completion note (BASE_URL GREEN).

Anti-pattern:** workers independently restart docker / rewrite .envOrchestrator only.


5. Automated depth tiers

TierScopeTypical duration cue
T0 Smoke/health, one cheap GET /v1/...minutes
T1 TaggedAll GET list endpoints user liststens of minutes sequential
T2 MutationCreates + compensating deletes/idempotencydocument cleanup
T3 ReplayEvent pipelines / delayed ClickHouse eventual — mark observe async

6. Failure triage playbook

ObservationHypothesis ladder
401 / 403key / rbac / missing env header / provider mismatch (.env docker vs host hosts)
404 routeForgot /v1 prefix vs mount
hangsinfra not READY — rerun devenv §Verification
5xxlogs docker compose logs flexprice-api hybrid OR stdout process

Attach Correlation: request IDs from logging middleware (internal/rest/middleware).


7. Combining with Temporal / queues

Pure HTTP probes cannot finalize Metering completeness — annotate defer validation (ClickHouse/dashboard) referencing docs/FLOWS/event-processing.md.

Temporal heavy flows: optionally poll Temporal UI human step — mark automate-later.


8. Forbidden actions

  • Storing echoed secrets in markdown docs / repo commits.
  • Production curls without explicit dual opt-in (user typed target twice).
  • Bypassing RBAC intentional brute force — escalate with user instead.

Cross-links

RoleSkill
Bring-up / envdevenv
go testgodev
Architecturearch + docs/FLOWS/*

The master orchestrator stance: keep this file thin on endpoint enumeration (Swagger is source) — prioritize interaction contract + safety + parallelism rules.

Signals

GitHub stars
5k
Forks
495
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
apitest
Source
github.com/flexprice/flexprice