---
title: "Stage routing rules"
method: PUT
path: "/v1/projects/{projectId}/routes"
tags: ["project-routes"]
---

# Stage routing rules

`PUT /v1/projects/{projectId}/routes`

## Request

- Base URL: `https://api.vercel.com`
- URL: `https://api.vercel.com/v1/projects/{projectId}/routes`
- Auth: HTTP bearer

Stage routing rules for a project. Set `overwrite` to true to replace all existing rules, or omit it to merge with existing rules by ID. Returns the new staged version.

## Path parameters

- `projectId` string, required

## Query parameters

- `teamId` string
- `slug` string

## Request body

- object
  - `overwrite` boolean
  - `routes` object[]
    - `id` string, required
    - `name` string, required
    - `description` string
    - `enabled` boolean
    - `route` object, required
      - `src` string, required
      - `dest` string
      - `headers` object
      - `caseSensitive` boolean
      - `status` integer
      - `has` object[]
        - `type` 'host' | 'header' | 'cookie' | 'query'
        - `key` string
        - `value` string
      - `missing` object[]
        - `type` 'host' | 'header' | 'cookie' | 'query'
        - `key` string
        - `value` string
      - `transforms` object[]
        - `type` 'request.headers' | 'request.query' | 'response.headers'
        - `op` 'append' | 'set' | 'delete'
        - `target` object
        - `args` unknown
        - `env` string[]
      - `respectOriginCacheControl` boolean

## Response `200`

- object
  - `version` object, required: A version of routing rules stored in S3.
    - `alias` string: The staging alias for previewing this version.
    - `createdBy` string, required: The user who created this version.
    - `id` string, required: Unique identifier for the version.
    - `isLive` false | true: Whether this version is currently live in production.
    - `isStaging` false | true: Whether this version is staged and not yet promoted to production.
    - `lastModified` number, required: Timestamp of when this version was last modified.
    - `ruleCount` number: The number of routing rules in this version.
    - `s3Key` string, required: The S3 key where the routing rules are stored.

## Other responses

- `400`: One of the provided values in the request body is invalid. One of the provided values in the request query is invalid.
- `401`: The request is not authorized.
- `403`: You do not have permission to access this resource.
- `404`
- `409`
- `410`
- `500`

## Changes

- **2026-09-30** `099fbe1f521c`: 1 info
  - added the non-success response with the status `404`
- **2026-07-21** `2ae10ee9d21c`: 1 info
  - added the non-success response with the status `410`
- **2026-06-11** `14b4658f819e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/vercel/apis/vercel-api/changes/v1/projects/:projectId/routes/put.md)

---

[API](https://skmtc.dev/vercel/apis/vercel-api.md) - [All operations](https://skmtc.dev/vercel/apis/vercel-api/llms.txt) - [OpenAPI document](https://skmtc.dev/vercel/apis/vercel-api/revisions/60686c0e1f6a?raw)
