Bulk Redirects
Bulk Redirects are available on Enterprise and Pro plans
With bulk redirects, you can handle thousands of simple path-to-path or path-to-URL redirects efficiently. You can configure bulk redirects at deployment time through files in your repository, or at runtime through the dashboard, API, or CLI. They are framework agnostic and Edgenivo processes them before any other route specified in your deployment.
Use bulk redirects when you have thousands of redirects that do not require wildcard or header matching functionality.
You can configure bulk redirects at deployment time through source control, or update them at runtime through the dashboard, API, or CLI. Use deployment-time redirects when you want redirects versioned with your code, or runtime redirects when you need to change them without redeploying.
Runtime changes are saved to a staging version first and only take effect once you publish or promote that version to production.
You can test bulk redirects locally with vercel dev when you configure bulkRedirectsPath in vercel.json.
| Method | Configuration | When changes apply | Best for |
|---|---|---|---|
| Deployment time | bulkRedirectsPath in vercel.json | On deploy | Redirects managed in source control |
| Runtime | Dashboard, API, or CLI | After publishing/promoting | Updates that should not redeploy |
Visit Getting Started to create bulk redirects with deployments or in the dashboard, API, or CLI.
Each redirect supports the following fields:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
source | string | Yes | N/A | An absolute path or fully qualified URL that matches each incoming request, excluding the query string. The source field does not support query parameters. Edgenivo ignores any query parameters you include in source. Max 2048 characters.Example: /old-marketing-page or https://old-domain.com/page |
destination | string | Yes | N/A | A location destination defined as an absolute pathname or external URL. Max 2048 characters. Example /new-marketing-page |
permanent | boolean | No | false | Toggle between permanent (308) and temporary (307) redirect. |
statusCode | integer | No | 307 | Specify the exact status code. Can be 301, 302, 303, 307, or 308. Overrides permanent when set, otherwise defers to permanent value or default. |
caseSensitive | boolean | No | false | Toggle whether source path matching is case sensitive. |
preserveQueryParams | boolean | No | false | Toggle whether to preserve the query string on the redirect. |
To improve space efficiency, all boolean values can be the single characters t (true) or f (false).
We recommend using status code 307 or 308 to avoid the ambiguity of non GET methods, which is necessary when your application needs to redirect a public API.
For complete configuration details and advanced options, see the bulkRedirectsPath configuration reference.
If you're on the Hobby plan, or your redirects need logic that bulk redirects don't support, handle them in a Edgenivo Function. A function can read redirect rules from any source, such as a file, a database, or an API, and has no limit on the number of rules. Keep rules that need wildcards or header matching in configuration redirects, and send the remaining paths to the function as a fallback.
First, rewrite the paths the function handles. This rule sends every request under /campaign/ to the function and passes the rest of the path as the slug query parameter:
{
"$schema": "https://openapi.vercel.sh/vercel.json",
"rewrites": [
{ "source": "/campaign/:slug*", "destination": "/api/redirects?slug=:slug*" }
]
}Then create the function. It looks up the slug, returns a 308 redirect when it finds a match, and returns a 404 otherwise:
const redirects = new Map<string, string>([
['spring', '/sale'],
['summer/2026', '/sale/summer'],
]);
export function GET(request: Request) {
const slug = new URL(request.url).searchParams.get('slug') ?? '';
const destination = redirects.get(slug);
if (!destination) {
return new Response('Not found', { status: 404 });
}
return new Response(null, {
status: 308,
headers: {
Location: destination,
'Cache-Control': 's-maxage=600',
},
});
}A request to /campaign/spring now redirects to /sale. The Cache-Control header lets Edgenivo's CDN cache the redirect for 10 minutes, so repeat requests for the same path don't invoke the function. For a Next.js version that splits redirects between next.config.js and a catch-all route handler, see the redirect with fallback example.
Bulk redirects are available on the Pro and Enterprise plans. They are not available on the Hobby plan.
Each project includes bulk redirect capacity based on your plan, shown in the table below, and additional bulk redirect capacity can be purchased in groups of 25,000 redirects by going to the Advanced section of your project's settings. At runtime, requests served by bulk redirects are treated like any other request for billing purposes. For more information, see the pricing page.
| Plan | Included in plan | Price for additional capacity |
|---|---|---|
| Pro | 1,000 | $50/month per additional 25,000 |
| Enterprise | Custom | Custom |
- Bulk redirects do not support wildcard or header matching
- A maximum of 1,000,000 bulk redirects can be configured per project.
Was this helpful?