---
title: "Create a new Route"
method: POST
path: "/v2/control-planes/{controlPlaneId}/core-entities/routes#RouteExpression"
tags: ["Routes"]
---

# Create a new Route

`POST /v2/control-planes/{controlPlaneId}/core-entities/routes#RouteExpression`

Create a new Route

## Request body

- RouteExpression — Route entities define rules to match client requests. Each Route is associated with a Service, and a Service may have multiple Routes associated to it. Every request matching a given Route will be proxied to its associated Service. The combination of Routes and Services (and the separation of concerns between them) offers a powerful routing mechanism with which it is possible to define fine-grained entry-points in Kong leading to different upstream services of your infrastructure. You need at least one matching rule that applies to the protocol being matched by the Route.
  - `created_at` integer, nullable — Unix epoch when the resource was created.
  - `expression` string, nullable — Use Router Expression to perform route match. This option is only available when `router_flavor` is set to `expressions`.
  - `https_redirect_status_code` 301 | 302 | 307 | 308 | 426, nullable — The status code Kong responds with when all properties of a Route match except the protocol i.e. if the protocol of the request is `HTTP` instead of `HTTPS`. `Location` header is injected by Kong if the field is set to 301, 302, 307 or 308. Note: This config applies only if the Route is configured to only accept the `https` protocol.
  - `id` string, nullable — A string representing a UUID (universally unique identifier).
  - `name` string, nullable — The name of the Route. Route names must be unique, and they are case sensitive. For example, there can be two different Routes named "test" and "Test".
  - `path_handling` 'v0' | 'v1', nullable — Controls how the Service path, Route path and requested path are combined when sending a request to the upstream. See above for a detailed description of each behavior.
  - `preserve_host` boolean, nullable — When matching a Route via one of the `hosts` domain names, use the request `Host` header in the upstream request headers. If set to `false`, the upstream `Host` header will be that of the Service's `host`.
  - `priority` integer, nullable — A number used to specify the matching order for expression routes. The higher the `priority`, the sooner an route will be evaluated. This field is ignored unless `expression` field is set.
  - `protocols` string[], nullable — An array of the protocols this Route should allow. See the [Route Object](#route-object) section for a list of accepted protocols. When set to only `"https"`, HTTP requests are answered with an upgrade error. When set to only `"http"`, HTTPS requests are answered with an error.
  - `request_buffering` boolean, nullable — Whether to enable request body buffering or not. With HTTP 1.1, it may make sense to turn this off on services that receive data with chunked transfer encoding.
  - `response_buffering` boolean, nullable — Whether to enable response body buffering or not. With HTTP 1.1, it may make sense to turn this off on services that send data with chunked transfer encoding.
  - `service` object, nullable — The Service this Route is associated to. This is where the Route proxies traffic to.
    - `id` string
  - `strip_path` boolean, nullable — When matching a Route via one of the `paths`, strip the matching prefix from the upstream request URL.
  - `tags` string[], nullable — An optional set of strings associated with the Route for grouping and filtering.
  - `updated_at` integer, nullable — Unix epoch when the resource was last updated.

## Response `201`

Successfully created Route

- RouteExpression — Route entities define rules to match client requests. Each Route is associated with a Service, and a Service may have multiple Routes associated to it. Every request matching a given Route will be proxied to its associated Service. The combination of Routes and Services (and the separation of concerns between them) offers a powerful routing mechanism with which it is possible to define fine-grained entry-points in Kong leading to different upstream services of your infrastructure. You need at least one matching rule that applies to the protocol being matched by the Route.
  - `created_at` integer, nullable — Unix epoch when the resource was created.
  - `expression` string, nullable — Use Router Expression to perform route match. This option is only available when `router_flavor` is set to `expressions`.
  - `https_redirect_status_code` 301 | 302 | 307 | 308 | 426, nullable — The status code Kong responds with when all properties of a Route match except the protocol i.e. if the protocol of the request is `HTTP` instead of `HTTPS`. `Location` header is injected by Kong if the field is set to 301, 302, 307 or 308. Note: This config applies only if the Route is configured to only accept the `https` protocol.
  - `id` string, nullable — A string representing a UUID (universally unique identifier).
  - `name` string, nullable — The name of the Route. Route names must be unique, and they are case sensitive. For example, there can be two different Routes named "test" and "Test".
  - `path_handling` 'v0' | 'v1', nullable — Controls how the Service path, Route path and requested path are combined when sending a request to the upstream. See above for a detailed description of each behavior.
  - `preserve_host` boolean, nullable — When matching a Route via one of the `hosts` domain names, use the request `Host` header in the upstream request headers. If set to `false`, the upstream `Host` header will be that of the Service's `host`.
  - `priority` integer, nullable — A number used to specify the matching order for expression routes. The higher the `priority`, the sooner an route will be evaluated. This field is ignored unless `expression` field is set.
  - `protocols` string[], nullable — An array of the protocols this Route should allow. See the [Route Object](#route-object) section for a list of accepted protocols. When set to only `"https"`, HTTP requests are answered with an upgrade error. When set to only `"http"`, HTTPS requests are answered with an error.
  - `request_buffering` boolean, nullable — Whether to enable request body buffering or not. With HTTP 1.1, it may make sense to turn this off on services that receive data with chunked transfer encoding.
  - `response_buffering` boolean, nullable — Whether to enable response body buffering or not. With HTTP 1.1, it may make sense to turn this off on services that send data with chunked transfer encoding.
  - `service` object, nullable — The Service this Route is associated to. This is where the Route proxies traffic to.
    - `id` string
  - `strip_path` boolean, nullable — When matching a Route via one of the `paths`, strip the matching prefix from the upstream request URL.
  - `tags` string[], nullable — An optional set of strings associated with the Route for grouping and filtering.
  - `updated_at` integer, nullable — Unix epoch when the resource was last updated.

## Other responses

- `401` — Unauthorized

## Changes

- **2025-09-16** `f03059016622` — 1 breaking, 2 warning
  - the `protocols` request property's minLength was increased from `0` to `1`
  - the `priority` request property's max was set to `70368744177663.00`
  - the `priority` request property's min was set to `0.00`
- **2025-08-22** `96118a9cd7f4` — 14 info
  - the `https_redirect_status_code` request property default value `426` was added
  - the `path_handling` request property default value `v0` was added
  - the `preserve_host` request property default value `false` was added
  - the `priority` request property default value `0` was added
  - …10 more
- **2025-07-22** `2c77aeaee5fb` — 1 breaking, 1 info
  - the response property `tags` became nullable for the status `201`
  - the request property `tags` became nullable
- **2025-04-22** `8b14ad5a4677` — 2 info
  - the `protocols` request property default value `http, https` was added
  - the `protocols` response's property default value `http, https` was added for the status `201`
- **2025-04-15** `fc6abbc537f3` — 2 breaking, 6 info
  - the response property `created_at` became nullable for the status `201`
  - the response property `updated_at` became nullable for the status `201`
  - the request optional property `created_at` became not read-only
  - the request optional property `updated_at` became not read-only
  - …4 more

[Full history](https://skmtc.dev/kong/apis/konnect-api/changes/v2/control-planes/:controlPlaneId/core-entities/routes#RouteExpression/post.md)

---

[API](https://skmtc.dev/kong/apis/konnect-api.md) · [All operations](https://skmtc.dev/kong/apis/konnect-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kong/apis/konnect-api/revisions/4a02153f2e60?raw)
