Back to Docs

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 yapi: v1. This is required.

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/)

FileRead this when you need to...
config.mdKnow all available YAML fields (full schema reference)
chain.mdChain multiple requests, pass data between steps
assert.mdWrite assertions on status, body, or headers
variables.mdUnderstand ${VAR} interpolation and resolution order
environments.mdSet up dev/staging/prod environments
jq.mdFilter or transform response bodies with JQ
testing.mdUse the built-in test runner (yapi test)
polling.mdPoll an endpoint until a condition is met (wait_for)
send.mdUse yapi send for quick curl-like requests
protocols.mdUse gRPC, GraphQL, or TCP (not just HTTP)

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

  • yapi: v1 at the top of every file — missing it is the most common error
  • Variables are ${VAR}, not $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://, tcp://, or HTTP by default