install
source · Clone the upstream repo
git clone https://github.com/jamierpond/yapi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jamierpond/yapi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/docs/topics" ~/.claude/skills/jamierpond-yapi-topics && rm -rf "$T"
manifest:
docs/topics/skill.mdsafety · automated scan (low risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- references API keys
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
yapi — LLM Skill Guide
yapi is a CLI-first, git-friendly API client. You define requests in YAML files and run them from the terminal. No GUI, no accounts, no state — just files and a binary.
When to Use yapi
- Send HTTP, gRPC, GraphQL, or TCP requests
- Chain multiple requests together (auth flow, then use the token)
- Assert on responses (status codes, body content via JQ)
- Run API test suites with
yapi test - Poll endpoints until a condition is met
Core Concepts
Every request file starts with
. This is required.yapi: v1
File extension:
.yapi.yml (or .yapi.yaml). Test files use .test.yapi.yml.
Project config:
yapi.config.yml at the project root defines environments and base URLs. yapi walks up the directory tree to find it.
Variables: Use
${VAR} syntax. Resolved from: chain step outputs > environment vars > shell env > defaults. Default values: ${VAR:-fallback}.
Quick Reference
Run a request file
yapi run request.yapi.yml yapi run request.yapi.yml -e prod # with environment
Quick one-off request (no file needed)
yapi send https://api.example.com/users # GET yapi send https://api.example.com/users '{"name":"Alice"}' # POST (auto-detected) yapi send -X PUT https://api.example.com/users/1 '{"name":"Bob"}' -H 'Authorization: Bearer tok' yapi send https://api.example.com/users --jq '.[0].name'
Minimal request file
yapi: v1 url: https://api.example.com/users method: GET
POST with body
yapi: v1 url: https://api.example.com/users method: POST body: name: Alice role: admin
Chain requests (pass data between steps)
yapi: v1 chain: - name: login url: https://api.example.com/auth method: POST body: username: ${USERNAME} password: ${PASSWORD} expect: status: 200 - name: get_profile url: https://api.example.com/me method: GET headers: Authorization: Bearer ${login.token} expect: status: 200 assert: - .email != null
Assert on responses
expect: status: 200 assert: - . | length > 0 # JQ expression, must evaluate to true - .[0].id != null - .count >= 10
Run tests
yapi test ./tests # run all *.test.yapi.yml files yapi test ./tests -e staging # against a specific environment yapi test ./tests -p 8 # parallel execution
Environments
Define in
yapi.config.yml:
yapi: v1 default_environment: local environments: local: url: http://localhost:3000 vars: API_KEY: dev_key prod: url: https://api.example.com vars: API_KEY: ${PROD_API_KEY}
Then in request files, use
${url} and ${API_KEY} — they resolve from the active environment.
Documentation Map
The docs are split into topics (concepts/features) and commands (CLI reference). Read only what you need.
Topics (docs/topics/
)
docs/topics/| File | Read this when you need to... |
|---|---|
| Know all available YAML fields (full schema reference) |
| Chain multiple requests, pass data between steps |
| Write assertions on status, body, or headers |
| Understand interpolation and resolution order |
| Set up dev/staging/prod environments |
| Filter or transform response bodies with JQ |
| Use the built-in test runner () |
| Poll an endpoint until a condition is met () |
| Use for quick curl-like requests |
| Use gRPC, GraphQL, or TCP (not just HTTP) |
Commands (docs/commands/
)
docs/commands/Each file documents one CLI command:
yapi_run.md, yapi_send.md, yapi_test.md, yapi_stress.md, yapi_watch.md, etc. Refer to these for flag details and usage examples.
Common Patterns
Auth flow then use token: Chain with
${login.token} in the Authorization header of subsequent steps.
Validate an API contract: Use
expect.assert with JQ expressions. Chain variable assertions let you compare across steps: .id == ${create.id}.
Wait for async job: Use
wait_for.until with a period or backoff and timeout.
Filter noisy responses: Use
jq_filter in the YAML or --jq on the CLI.
Gotchas
at the top of every file — missing it is the most common erroryapi: v1- Variables are
, not${VAR}$VAR - Assertions are JQ expressions that must evaluate to
true - Chains stop on first failure (fail-fast)
- Protocol is auto-detected from URL scheme:
,grpc://
, or HTTP by defaulttcp://