Skip to main content

Loading OpenAPI specs

Reqon can load OpenAPI specifications from files or URLs.

Local files​

YAML format​

source API from "./openapi.yaml" {
auth: bearer
}

JSON format​

source API from "./openapi.json" {
auth: bearer
}

Relative paths​

// Relative to mission file
source API from "./specs/api.yaml" {
auth: bearer
}

// Absolute path
source API from "/home/user/specs/api.yaml" {
auth: bearer
}

Remote URLs​

Public specs​

source Petstore from "https://petstore3.swagger.io/api/v3/openapi.json" {
auth: none
}

Private specs​

A spec served behind auth must be reachable by the loader at parse time. There's no separate spec-credential option (specAuth isn't supported); fetch or vendor the spec locally if it needs credentials to download.

Spec caching​

Reqon caches parsed specs in memory for the duration of a run, keyed by spec path, so the same spec isn't parsed twice. The cache is per process and isn't written to disk, so there's no cache directory to clear and no cache flag — each fresh run reparses the spec.

Spec structure​

Minimum required​

openapi: 3.0.0
info:
title: My API
version: 1.0.0
servers:
- url: https://api.example.com
paths:
/items:
get:
operationId: listItems
responses:
'200':
description: Success

Full example​

openapi: 3.0.0
info:
title: E-commerce API
version: 2.0.0
description: API for managing products and orders

servers:
- url: https://api.example.com/v2
description: Production
- url: https://staging.api.example.com/v2
description: Staging

paths:
/products:
get:
operationId: listProducts
summary: List all products
parameters:
- name: limit
in: query
schema:
type: integer
default: 20
- name: offset
in: query
schema:
type: integer
default: 0
responses:
'200':
description: Product list
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Product'

/products/{id}:
get:
operationId: getProduct
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Product details
content:
application/json:
schema:
$ref: '#/components/schemas/Product'

components:
schemas:
Product:
type: object
properties:
id:
type: string
name:
type: string
price:
type: number
required:
- id
- name

Server selection​

Default server​

Uses first server in spec:

servers:
- url: https://api.example.com # Used by default
- url: https://staging.example.com

Override Base URL​

source API from "./spec.yaml" {
auth: bearer,
base: "https://custom.example.com" // Overrides spec
}

The base value is a string literal.

Reference resolution​

Reqon resolves internal $ref references within the spec:

$ref: '#/components/schemas/Product'

External $ref pointers (to other files or remote URLs) are not resolved by default. Resolving untrusted external references is an SSRF and resource-exhaustion risk, so the loader only follows internal #/... references unless external resolution is explicitly enabled. Bundle external references into a single spec before loading.

Validation​

On load​

Reqon validates the spec structure:

[Reqon] Loading OpenAPI spec from ./api.yaml
[Reqon] Spec valid: 15 operations found

Invalid specs​

[Reqon] Error: Invalid OpenAPI spec
- Missing required field: info.version
- Invalid path: /items must start with /

Multiple specs​

Per-source​

mission MultiAPI {
source Products from "./products.yaml" { auth: bearer }
source Orders from "./orders.yaml" { auth: bearer }
source Users from "./users.yaml" { auth: oauth2 }

action SyncAll {
call Products.listProducts
call Orders.listOrders
call Users.listUsers
}
}

Shared components​

If specs share schemas, use a single bundled spec:

source API from "./bundled-api.yaml" { auth: bearer }

Troubleshooting​

"Spec not found"​

Check file path:

ls -la ./openapi.yaml

"Invalid spec"​

Validate externally:

npx swagger-cli validate ./openapi.yaml

"Operation not found"​

Check operation ID matches exactly:

paths:
/items:
get:
operationId: listItems # Must match call API.listItems

Network issues​

For remote specs:

# Test connectivity
curl -I https://api.example.com/openapi.json