Skip to content

Workflow Syntax

YAML

We choose YAML as a primary configuration format, because YAML files can be read and written by humans and machines. This allows you to write workflows by hand or generate them with code

TIP

Learn more about YAML from "Learn YAML in Y minutes"

Spec

version

Required. Workflow file version

name

Required. Workflow name

env

Optional. Environment Variables

yaml
env:
  host: example.com

Example: Using environment variables in steps

yaml
env:
  host: example.com
steps:
  - name: GET request
    http:
      url: https://${{env.host}}
      method: GET

config

Optional. Workflow config

config.continueOnFail

Optional. Continue workflow after step failed

config.concurrency

Optional. Tests concurrency setting. The default amount is ∞

config.http

Optional. HTTP-Client config

config.http.rejectUnauthorized

Optional. Reject if SSL certificate is invalid

config.http.baseURL

Optional. Base URL

config.http.http2 New

Optional. Enable http2 support

config.grpc

Optional. gRPC-Client config

config.grpc.proto

Optional. Pre-load gRPC Protos into the workflow

config.loadTest Unstable

Optional. Load-Testing configuration

yaml
config:
  loadTest:
    phases:
    - duration: 10
      arrivalRate: 1
    - duration: 20
      arrivalRate: 100
    check:
      p99:
      - lte: 500

config.loadTest.phases Unstable

Required. Load-Testing phases

config.loadTest.phases.[phase] Unstable

Required. Load testing phase

config.loadTest.phases.[phase].duration Unstable

Required. Load testing phase duration

config.loadTest.phases.[phase].arrivalRate Unstable

Required. Load testing phase arrival rate (requests per second)

config.loadTest.check Unstable

Optional. Load testing checks

yaml
check:
  p99:
    - lte: 500

config.loadTest.check.avg Unstable

Optional

config.loadTest.check.min Unstable

Optional

config.loadTest.check.max Unstable

Optional

config.loadTest.check.med Unstable

Optional

config.loadTest.check.p95 Unstable

Optional

config.loadTest.check.p99 Unstable

Optional

components

Optional. OpenAPI components

components.schemas

Optional. OpenAPI schemas

components.schemas.<schema>

Optional. OpenAPI schema

yaml
components:
  schemas:
    Post:
      type: object
      properties:
        userId:
          type: integer
          required: true
        id:
          type: integer
          required: true
        title:
          type: string
          required: true
        body:
          type: string
          required: true

components.credentials New

Optional. Reusable components.credentials

yaml
components.credentials:
  example:
    basic:
      username: hello
      password: world

components.credentials.<credential> New

Required. Credential

components.credentials.<credential>.basic New

Optional. Basic Auth

yaml
basic:
  username: hello
  password: world

components.credentials.<credential>.basic.username New

Required. Basic Auth username

components.credentials.<credential>.basic.password New

Required. Basic Auth password

components.credentials.<credential>.bearer New

Optional. Bearer Auth

yaml
bearer:
  token: hello world

components.credentials.<credential>.bearer.token New

Required. Bearer Auth token

components.credentials.<credential>.oauth New

Optional. OAuth

yaml
oauth:
  endpoint: "https://stepci.eu.auth0.com/oauth/token"
  client_id: ""
  client_secret: ""
  audience: ""

components.credentials.<credential>.oauth.endpoint New

Required. OAuth endpoint

components.credentials.<credential>.oauth.client_id New

Required. OAuth Client ID

components.credentials.<credential>.oauth.client_secret New

Required. OAuth Client Secret

components.credentials.<credential>.oauth.audience New

Optional. OAuth Client Audience

components.credentials.<credential>.certificate New

Optional. Client Certificate auth

yaml
certificate:
  ca: |
    content
  cert: |
    content
  key: |
    content

Can be files

yaml
certificate:
  ca:
    file: file.cert
  cert:
    file: file.cert
  key:
    file: file.key

components.credentials.<credential>.certificate.ca New

Optional. Client Certificate authority

Can be a file

components.credentials.<credential>.certificate.cert New

Optional. Client Certificate

Can be a file

components.credentials.<credential>.certificate.key New

Optional. Client Certificate Key

Can be a file

components.credentials.<credential>.certificate.passphrase New

Optional. Client Certificate passphrase

components.credentials.<credential>.tls New

Optional. TLS config

yaml
tls:
  rootCerts: |
    content
  privateKey: |
    content
  certChain: |
    content

Can be files:

yaml
tls:
  rootCerts:
    file: root.cert
  privateKey:
    file: key.cert
  certChain:
    file: chain.cert

components.credentials.<credential>.tls.rootCerts New

Optional. TLS root certificate

Can be a file

components.credentials.<credential>.tls.privateKey New

Optional. TLS private key

Can be a file

components.credentials.<credential>.tls.certChain New

Optional. TLS certificate chain

Can be a file

before

Optional. A single test to be executed by the runner before tests. Has the same structure as tests.<test>.

**Example: **

yaml
version: "1.1"
name: "`before` section example"
before:
  name: Before all
  steps: []
tests:
  example1:
    name: Test 1
    steps: []
  example2:
    name: Test 2
    steps: []

after

Optional. A single test to be executed by the runner after tests. Has the same structure as tests.<test>.

**Example: **

yaml
version: "1.1"
name: "`after` section example"
tests:
  example1:
    name: Test 1
    steps: []
  example2:
    name: Test 2
    steps: []
after:
  name: After all
  steps: []

tests

Optional. A list of tests to be executed by the runner

tests.<test>

Required. A test

Example: Checking Response Status

yaml
tests:
  example:
    steps:
      - name: GET request
        http:
          url: https://example.com
          method: GET
          check:
            status: 200

tests.<test>.name

Optional. Test name

tests.<test>.env

Optional. Environment Variables

yaml
tests:
  example:
    env:
      host: example.com

tests.<test>.testdata

Optional. Provide test data

Example: From csv file

yaml
testdata:
  file: testdata.csv

Example: From csv string

yaml
testdata:
  content: |
    username,password
    mish,ushakov

tests.<test>.testdata.content

Optional. Test data content

tests.<test>.testdata.file

Optional. Test data file

tests.<test>.testdata.options

Optional. Test data parsing options

yaml
testdata:
  options:
    delimiter: ","
    quote: "'"
    escape: '"'
    headers:
      - one
      - two

tests.<test>.testdata.options.delimiter

Optional. The delimiter that will separate columns

tests.<test>.testdata.options.quote

Optional. The character to use to quote fields that contain a delimiter

tests.<test>.testdata.options.escape

The character to used to escape quotes inside of a quoted field

tests.<test>.testdata.options.headers

Optional. The first row is always treated as headers. Otherwise, you can provide a list of headers

tests.<test>.steps

Required. A list of steps to be executed by runner

tests.<test>.steps.[step]

Required. The step to be executed

Example: Checking Response Status

yaml
steps:
  - name: GET request
    url: https://example.com
    http:
      method: GET
      check:
        status: 200

tests.<test>.steps.[step].id

Optional. Step id

tests.<test>.steps.[step].name

Optional. Step name

tests.<test>.steps.[step].if

Optional. Condition. For Syntax, see Filtrex Documentation

yaml
if: captures.title == "Example Domain"

Available objects

  • captures
  • env

tests.<test>.steps.[step].retries

Optional. Retries config

yaml
retries:
  count: 1
  interval: 1s

tests.<test>.steps.[step].retries.count

Optional. Amount of retries

tests.<test>.steps.[step].retries.interval

Optional. Interval between the retries

tests.<test>.steps.[step].http

Optional. HTTP Step

tests.<test>.steps.[step].http.url

Required. Request URL

tests.<test>.steps.[step].http.method

Required. Request method

tests.<test>.steps.[step].http.headers

Optional. Request headers

yaml
headers:
  Content-Type: application/json

tests.<test>.steps.[step].http.body

Optional. Request Body

yaml
body: |
  {
    "title": "Hello Step CI!",
    "body": "This is the body",
    "userId": 1
  }

File as a body

yaml
body:
  file: README.md

tests.<test>.steps.[step].http.params

Optional. Query Params

yaml
params:
  hello: world
  world: hello

tests.<test>.steps.[step].http.auth

Optional. Auth configuration

tests.<test>.steps.[step].http.auth.$ref

Optional. A reference to a credential specified in components.credentials section

tests.<test>.steps.[step].http.auth.basic

Optional. Basic Auth

yaml
auth:
  basic:
    username: hello
    password: world

tests.<test>.steps.[step].http.auth.basic.username

Required. Basic Auth username

tests.<test>.steps.[step].http.auth.basic.password

Required. Basic Auth password

tests.<test>.steps.[step].http.auth.bearer

Optional. Bearer Auth

yaml
auth:
  bearer:
    token: hello world

tests.<test>.steps.[step].http.auth.bearer.token

Required. Bearer Auth token

tests.<test>.steps.[step].http.auth.oauth New

Optional. OAuth

yaml
auth:
  oauth:
    endpoint: "https://stepci.eu.auth0.com/oauth/token"
    client_id: ""
    client_secret: ""
    audience: ""

tests.<test>.steps.[step].http.auth.oauth.endpoint New

Required. OAuth endpoint

tests.<test>.steps.[step].http.auth.oauth.client_id New

Required. OAuth Client ID

tests.<test>.steps.[step].http.auth.oauth.client_secret New

Required. OAuth Client Secret

tests.<test>.steps.[step].http.auth.oauth.audience New

Optional. OAuth Client Audience

tests.<test>.steps.[step].http.auth.certificate New

Optional. Client Certificate auth

yaml
auth:
  certificate:
    ca: |
      content
    cert: |
      content
    key: |
      content

Can be files

yaml
auth:
  certificate:
    ca:
      file: file.cert
    cert:
      file: file.cert
    key:
      file: file.key

tests.<test>.steps.[step].http.auth.certificate.ca New

Optional. Client Certificate authority

Can be a file

tests.<test>.steps.[step].http.auth.certificate.cert New

Optional. Client Certificate

Can be a file

tests.<test>.steps.[step].http.auth.certificate.key New

Optional. Client Certificate Key

Can be a file

tests.<test>.steps.[step].http.auth.certificate.passphrase New

Optional. Client Certificate passphrase

tests.<test>.steps.[step].http.cookies

Optional. Set Cookies. Once set, the cookies will be sent in consequent requests

yaml
cookies:
  wows: world

tests.<test>.steps.[step].http.json

Optional. Request JSON

yaml
json:
  title: Hello Step CI!
  body: This is the body
  userId: 1

tests.<test>.steps.[step].http.form

Optional. Form submission

yaml
form:
  email: hello@stepci.com

tests.<test>.steps.[step].http.formData

Optional. Multipart Form submission

Fields can include a file

yaml
formData:
  email: hello@stepci.com       # simple field value
  readme:
    file: README.md             # file attachment
  idDocument:
    file: password.pdf          # file attachment with specific content-type
    type: application/pdf
  personInfo:
    value: '{ "name": "john" }' # form field with specific content-type
    type: application/json

tests.<test>.steps.[step].http.graphql

Optional. GraphQL Data

yaml
graphql:
  query: |
    query Request {
      method
      url
      headers {
        key
        value
      }
    }
  variables:
    id: 1

tests.<test>.steps.[step].http.graphql.query

Optional. GraphQL query

tests.<test>.steps.[step].http.graphql.variables

Optional. GraphQL variables

tests.<test>.steps.[step].http.trpc New

Optional. tRPC request

tests.<test>.steps.[step].http.trpc.query.<procedure> New

Optional. tRPC query

yaml
trpc:
  query:
    greet: Hello

Query will be sent as a batch if it is an array

yaml
trpc:
  query:
    - greet: Hello
    - greet: Hello

tests.<test>.steps.[step].http.trpc.mutation.<procedure> New

Optional. tRPC mutation

yaml
trpc:
  mutation:
    addUser:
      name: Mish

tests.<test>.steps.[step].http.captures

Optional. Capture response values into named variables

yaml
captures:
  id:
    jsonpath: $.id
  username:
    cookie: user

tests.<test>.steps.[step].http.captures.<capture>.jsonpath

Optional. Capture JSONPath

yaml
captures:
  id:
    jsonpath: $.id

tests.<test>.steps.[step].http.captures.<capture>.xpath

Optional. Capture XPath

yaml
captures:
  id:
    xpath: //ID

tests.<test>.steps.[step].http.captures.<capture>.header

Optional. Capture a response Header

yaml
captures:
  type:
    header: Content-Type

tests.<test>.steps.[step].http.captures.<capture>.selector

Optional. Capture a HTML selector

yaml
captures:
  title:
    selector: h1

Optional. Capture a cookie

yaml
captures:
  user:
    cookie: user

tests.<test>.steps.[step].http.captures.<capture>.regex

Optional. Capture a regex match

yaml
captures:
  title:
    regex: <title>(.*?)<\/title>

tests.<test>.steps.[step].http.captures.<capture>.body

Optional. Capture whole response body

yaml
captures:
  example:
    body: true

tests.<test>.steps.[step].http.check

Optional. Provide checks to validate responses

tests.<test>.steps.[step].http.check.status

Optional. Check status code

yaml
check:
  status: 200

tests.<test>.steps.[step].http.check.statusText

Optional. Check status text

yaml
check:
  statusText: OK

tests.<test>.steps.[step].http.check.redirected

Optional. Check redirection status

yaml
check:
  redirected: true

tests.<test>.steps.[step].http.check.redirects

Optional. Check redirects

yaml
check:
  redirects:
    - https://example.com/

tests.<test>.steps.[step].http.check.headers

Optional. Check headers

yaml
check:
  headers:
    Content-Type: application/json

tests.<test>.steps.[step].http.check.body

Optional. Check body

yaml
check:
  body: "Hello"

tests.<test>.steps.[step].http.check.json

Optional. Check JSON

yaml
check:
  json:
    hello: world

tests.<test>.steps.[step].http.check.schema

Optional. Check response against JSON Schema

yaml
check:
  schema:
    type: object
    properties:
      id:
        type: integer
        required: true

tests.<test>.steps.[step].http.check.jsonpath

Optional. Check JSONPath

yaml
check:
  jsonpath:
    $.id: 1

tests.<test>.steps.[step].http.check.xpath

Optional. Check XPath

yaml
check:
  xpath:
    //SUCCESS: false

tests.<test>.steps.[step].http.check.selectors

Optional. Check CSS selectors

yaml
check:
  selector:
    h1: "Example Domain"

tests.<test>.steps.[step].http.check.cookies

Optional. Check cookies

yaml
check:
  cookies:
    hello: world

tests.<test>.steps.[step].http.check.captures

Optional. Check captures

yaml
check:
  captures:
    id: 1

tests.<test>.steps.[step].http.check.sha256

Optional. Check SHA-256 Hash (response)

yaml
check:
  sha256: "567cfaf94ebaf279cea4eb0bc05c4655021fb4ee004aca52c096709d3ba87a63"

tests.<test>.steps.[step].http.check.md5

Optional. Check MD5 Hash (response)

yaml
check:
  md5: "567cfaf94ebaf279cea4eb0bc05c4655021fb4ee004aca52c096709d3ba87a63"

tests.<test>.steps.[step].http.check.size

Optional. Check response size (in bytes)

yaml
check:
  size: 1024

tests.<test>.steps.[step].http.check.requestSize

Optional. Check request size (in bytes)

yaml
check:
  requestSize: 1024

tests.<test>.steps.[step].http.check.bodySize

Optional. Check body size (in bytes)

yaml
check:
  bodySize: 1024

tests.<test>.steps.[step].http.check.performance

Optional. Performance Checking (in ms)

yaml
check:
  performance:
    firstByte:
      - lte: 200
    total:
      - lte: 500

tests.<test>.steps.[step].http.check.performance.wait

Optional

yaml
check:
  performance:
    wait: 20

tests.<test>.steps.[step].http.check.performance.dns

Optional

yaml
check:
  performance:
    dns: 20

tests.<test>.steps.[step].http.check.performance.tcp

Optional

yaml
check:
  performance:
    tcp: 20

tests.<test>.steps.[step].http.check.performance.tls

Optional

yaml
check:
  performance:
    tls: 20

tests.<test>.steps.[step].http.check.performance.request

Optional

yaml
check:
  performance:
    request: 20

tests.<test>.steps.[step].http.check.performance.firstByte

Optional

yaml
check:
  performance:
    firstByte: 20

tests.<test>.steps.[step].http.check.performance.download

Optional

yaml
check:
  performance:
    download: 20

tests.<test>.steps.[step].http.check.performance.total

Optional

yaml
check:
  performance:
    total: 20

tests.<test>.steps.[step].http.check.ssl

Optional. SSL Certificate Validation

yaml
check:
  ssl:
    valid: true
    signed: true
    daysUntilExpiration:
      - gte: 60

tests.<test>.steps.[step].http.check.ssl.valid

Optional

yaml
check:
  ssl:
    valid: true

tests.<test>.steps.[step].http.check.ssl.signed

Optional

yaml
check:
  ssl:
    signed: true

tests.<test>.steps.[step].http.check.ssl.daysUntilExpiration

Optional

yaml
check:
  ssl:
    daysUntilExpiration: 30

tests.<test>.steps.[step].http.check.co2

Optional. Check co2 emissions of the response in grams

yaml
check:
  co2:
    - lte: 1

tests.<test>.steps.[step].http.followRedirects

Optional. Follow redirects. Enabled by default

tests.<test>.steps.[step].http.timeout

Optional. Request Timeout

tests.<test>.steps.[step].http.retries

Optional. Number of times to retry request on failure or timeout, default 0.

tests.<test>.steps.[step].grpc

Optional. gRPC Step

yaml
grpc:
  proto:
    - public/helloworld.proto
  host: 0.0.0.0:50051
  service: helloworld.Greeter
  method: SayHello
  data:
    name: world!
  check:
    jsonpath:
      $.message: Hello world!

tests.<test>.steps.[step].grpc.proto

Required. gRPC protocol buffer file path

tests.<test>.steps.[step].grpc.host

Required. gRPC server

tests.<test>.steps.[step].grpc.service

Required. gRPC service

tests.<test>.steps.[step].grpc.method

Required. gRPC method

tests.<test>.steps.[step].grpc.data

Required. gRPC payload

tests.<test>.steps.[step].grpc.metadata

Optional. gRPC metadata

tests.<test>.steps.[step].grpc.auth

Optional. gRPC auth config

tests.<test>.steps.[step].grpc.auth.$ref

Optional. A reference to a credential specified in components.credentials section

tests.<test>.steps.[step].grpc.auth.tls

Optional. gRPC auth TLS config

yaml
auth:
  tls:
    rootCerts: |
      content
    privateKey: |
      content
    certChain: |
      content

Can be files:

yaml
auth:
  tls:
    rootCerts:
      file: root.cert
    privateKey:
      file: key.cert
    certChain:
      file: chain.cert

tests.<test>.steps.[step].grpc.auth.tls.rootCerts

Optional. gRPC TLS root certificate

Can be a file

tests.<test>.steps.[step].grpc.auth.tls.privateKey

Optional. gRPC TLS private key

Can be a file

tests.<test>.steps.[step].grpc.auth.tls.certChain

Optional. gRPC TLS certificate chain

Can be a file

tests.<test>.steps.[step].grpc.timeout

Optional. Connection timeout (deadline)

tests.<test>.steps.[step].grpc.captures

Optional. Capture response values into named variables

yaml
captures:
  id:
    jsonpath: $.id

tests.<test>.steps.[step].grpc.captures.<capture>.jsonpath

Optional. Capture JSONPath

yaml
captures:
  id:
    jsonpath: $.id

tests.<test>.steps.[step].grpc.check

Optional. Provide checks to validate responses

tests.<test>.steps.[step].grpc.check.json

Optional. Check JSON

yaml
check:
  json:
    hello: world

tests.<test>.steps.[step].grpc.check.schema

Optional. Check response against JSON Schema

yaml
check:
  schema:
    type: object
    properties:
      id:
        type: integer
        required: true

tests.<test>.steps.[step].grpc.check.jsonpath

Optional. Check JSONPath

yaml
check:
  jsonpath:
    $.id: 1

tests.<test>.steps.[step].grpc.check.captures

Optional. Check captures

yaml
check:
  captures:
    id: 1

tests.<test>.steps.[step].grpc.check.size

Optional. Check response size (in bytes)

yaml
check:
  size: 1024

tests.<test>.steps.[step].grpc.check.performance

Optional. Performance Checking (in ms)

yaml
check:
  performance:
    total:
      - lte: 500

tests.<test>.steps.[step].grpc.check.performance.total

Optional

yaml
check:
  performance:
    total: 20

tests.<test>.steps.[step].grpc.check.co2

Optional. Check co2 emissions of the response in grams

yaml
check:
  co2:
    - lte: 1

tests.<test>.steps.[step].sse

Optional. Server-Sent-Events step type

yaml
sse:
  url: http://localhost:8080
  timeout: 10000
  check:
    messages:
      - id: 'message1'
        jsonpath:
          $.hello: "world"
      - id: 'message2'
        body: "world"

tests.<test>.steps.[step].sse.url

Required. Server-Sent-Events URL

tests.<test>.steps.[step].sse.timeout

Optional. Server-Sent-Events connection timeout. Defaults to 10000

tests.<test>.steps.[step].sse.check

Optional. Server-Sent-Events checks

tests.<test>.steps.[step].sse.messages

Optional. Server-Sent-Events message checks

tests.<test>.steps.[step].sse.messages.[message]

Optional. Server-Sent-Events message check

tests.<test>.steps.[step].sse.messages.[message].jsonpath

Optional. Server-Sent-Events JSONPath message check

tests.<test>.steps.[step].sse.messages.[message].body

Optional. Server-Sent-Events JSON message check

tests.<test>.steps.[step].sse.messages.[message].body

Optional. Server-Sent-Events body message check

tests.<test>.steps.[step].sse.messages.[message].schema

Optional. Server-Sent-Events JSONSchema message check

tests.<test>.steps.[step].delay

Optional. Delay step type

yaml
- delay: 1s

tests.<test>.steps.[step].graphql

Optional. GraphQL step type

yaml
- graphql:
    url: https://echo.hoppscotch.io/graphql
    query: |
      query Request {
        method
      }
    variables:
      id: 1
    check:
      status: 200
      jsonpath:
        $.data.method: POST

Inherited from HTTP step type

tests.<test>.steps.[step].graphql.url

Optional. GraphQL URL

tests.<test>.steps.[step].graphql.query

Optional. GraphQL query string

tests.<test>.steps.[step].graphql.variables

Optional. GraphQL variables

tests.<test>.steps.[step].trpc

Optional. tRPC step type

yml
- name: Query
  trpc:
    url: http://localhost:2022/trpc
    query:
      - greet:
          json:
            name: Mish
      - greet:
          json:
            name: Mish
    check:
      status: /^20/

Inherited from HTTP Step type

tests.<test>.steps.[step].trpc.query.<procedure>

Optional. tRPC query

yaml
trpc:
  query:
    greet: Hello

Query will be sent as a batch if it is an array

yaml
trpc:
  query:
    - greet: Hello
    - greet: Hello

tests.<test>.steps.[step].trpc.mutation.<procedure>

Optional. tRPC mutation

yaml
trpc:
  mutation:
    addUser:
      name: Mish

tests.<test>.steps.[step].plugin

Optional. Plugin step type

yaml
- name: Plugin
  plugin:
    id: "@yourcompany/plugin"
    params:
      hello: world
    check:
      reply: world

tests.<test>.steps.[step].plugin.id

Optional. Plugin id (npm package or local file)

tests.<test>.steps.[step].plugin.params

Optional. Plugin params

tests.<test>.steps.[step].plugin.check

Optional. Plugin checks