Swagger parameters aren’t just metadata; they’re the vital conduits through which your API receives and understands requests.

Let’s look at a simple API that fetches user data.

openapi: 3.0.0
info:
  title: User API
  version: 1.0.0
paths:
  /users/{userId}:
    get:
      summary: Get user by ID
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: string
          description: The ID of the user to retrieve.
        - name: includeDetails
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: Whether to include detailed user information.
        - name: api_key
          in: header
          required: true
          schema:
            type: string
          description: Your API key for authentication.
        - name: session_id
          in: cookie
          required: false
          schema:
            type: string
          description: The session identifier.
      responses:
        '200':
          description: User found
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  name:
                    type: string
                  email:
                    type: string
        '404':
          description: User not found

Here, /users/{userId} is a path parameter. The {userId} part tells the server that this segment of the URL is a placeholder for a specific user identifier. When a client requests /users/12345, the userId parameter’s value becomes "12345". This is crucial for routing requests to the correct resource.

Query parameters, like includeDetails in the example, are appended to the URL after a question mark (?). For instance, a request might look like /users/12345?includeDetails=true. These are excellent for filtering, sorting, or providing optional context for a resource. They don’t change which resource is being accessed, but rather how that resource is presented or what related data is included.

Header parameters, such as api_key, are sent in the HTTP headers of the request. A client would typically include this as X-API-Key: your_secret_key or simply api_key: your_secret_key depending on conventions. Headers are commonly used for metadata that doesn’t fit neatly into the URL structure, like authentication tokens, content negotiation (e.g., Accept header), or custom request identifiers.

Cookie parameters, like session_id, are also part of the HTTP headers but are specifically managed by the browser or client. They are sent automatically by the client if the server previously set them using a Set-Cookie header. This is often used for maintaining session state between requests without requiring explicit inclusion in every API call.

The in keyword in Swagger/OpenAPI is the critical differentiator. It explicitly tells you where the parameter is expected to be found: path, query, header, or cookie. The required field then dictates whether a client must provide this parameter for the request to be considered valid. For path parameters, required is always implicitly true because the path segment must be present.

What most developers don’t immediately grasp is how schema interacts with in. For a query parameter, the schema defines how that query string value should be interpreted. A type: array with collectionFormat: multi on a query parameter like tags would allow a request like /items?tags=electronics&tags=books, where the server receives tags: ["electronics", "books"]. Without collectionFormat or with a different one (like csv), it might expect /items?tags=electronics,books. This subtle difference in how collections are represented in query strings is a frequent source of integration issues.

When defining parameters, especially headers and cookies, remember that names are case-sensitive according to HTTP specifications, though many servers might normalize them. It’s best practice to match the case used in common standards (e.g., Content-Type, Authorization).

If you’re debugging why a parameter isn’t being received correctly, the first place to check is the in field in your OpenAPI definition and then verify the corresponding location in the actual HTTP request.

The next logical step after defining parameters is understanding how to model the data returned by your API using the responses and content sections.

Want structured learning?

Take the full Swagger course →