A URL redirect is considered only after the requested storefront route or resource returns not found, so it cannot replace a live product, page, policy, collection, or other route. Merchant-managed rows use manual for one path or prefix for a /* path family. auto_slug and system_prefix rows are generated by catalog and permalink changes; reads expose them for diagnosis, but write endpoints do not change or delete them.
Store logical paths whenever one redirect should apply across public addresses. Shared domains use /{locale}-{country} for non-primary countries; country-pinned domains use only /{locale} for secondary languages. Resolution checks the addressed path first and then the logical path with that recognized address prefix removed. External targets must use HTTPS.
Endpoints#
URL Redirect limits
Get redirect limits and current usage.
Returns live list, search, bulk-delete, merchant redirect, and prefix-rule limits. Automatic redirects are reported separately and do not consume the merchant redirect limit.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
List URL redirects
List URL redirects for the store.
Search paths and targets or filter by kind. manual and prefix rows are merchant-managed. auto_slug and system_prefix rows explain platform-generated routing history and are read-only.
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size, bounded by the limits response. |
search
|
string |
Search path or target. |
kind
|
string |
Filter by manual, prefix, auto_slug, or system_prefix. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400REDIRECT_SEARCH_TOO_LONGThe search exceeds the live maximum.
-
400REDIRECT_KIND_INVALIDThe kind filter is not recognized.
Get a URL redirect
Get one store-scoped URL redirect.
Returns the redirect only when it belongs to the token's store.
Path parameters
| Name | Type | Description |
|---|---|---|
redirectId
required
|
string |
Redirect id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
404REDIRECT_NOT_FOUNDThe redirect does not exist in this store.
-
400REDIRECT_ID_INVALIDThe redirect id is malformed.
Create a URL redirect
Create a manual redirect or prefix rule.
Redirects are evaluated only after a storefront route returns not found, so they cannot shadow live content. Paths use the logical storefront path. On shared domains, regional addresses use /{locale}-{country}; country-pinned domains use /{locale} for non-default languages. The runtime checks both the addressed path and its logical path. External targets must use HTTPS without URL credentials. Internal targets start with a single slash; network-path URLs and backslashes are rejected. Exact redirect chains are collapsed to their final target when saved, and cycles are rejected. Prefix rules may use a fixed target or a trailing /* target that preserves the unmatched suffix. Exact addressed and logical matches are checked before prefixes; the longest matching prefix wins and includes its base path. Paths are lowercased, repeated slashes collapsed, trailing slash removed, and query/fragment ignored. Source limits count UTF-8 bytes. Incoming query parameters survive only when the target does not specify a query; they precede any target fragment. Prefix and mixed exact/prefix loops are checked on writes, including CSV imports. The separate prefix usage count includes system prefixes.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
kind
|
string |
manual (default) or prefix. |
path
required
|
string |
Dead logical path. Prefix rules must end in /*. |
target
required
|
string |
Internal path or full HTTPS URL. Prefix targets may end in /*. |
redirect_type
|
integer |
301 for permanent or 302 for temporary. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe request body or pagination values are invalid.
-
400REDIRECT_PATH_REQUIREDA non-empty path is required.
-
400REDIRECT_PATH_TOO_LONGThe path exceeds path_max_length from the limits response.
-
400REDIRECT_TARGET_REQUIREDA non-empty target is required.
-
400REDIRECT_TARGET_TOO_LONGThe target exceeds target_max_length from the limits response.
-
400REDIRECT_TYPE_INVALIDredirect_type must be 301 or 302.
-
400REDIRECT_KIND_INVALIDOnly manual and prefix redirects can be created.
-
400REDIRECT_PREFIX_INVALIDA prefix path must end with /* and contain no other wildcards.
-
400REDIRECT_PATH_INVALIDThe path is empty, root, contains unsupported characters, or has an invalid wildcard.
-
400REDIRECT_TARGET_INVALIDThe target is not an internal path or full HTTPS URL.
-
400REDIRECT_SELF_TARGETThe redirect points to itself.
-
400REDIRECT_LOOP_DETECTEDThe change would create a redirect loop.
-
400REDIRECT_LIMIT_REACHEDThe merchant redirect or bulk request limit was reached.
-
400REDIRECT_PREFIX_LIMIT_REACHEDThe prefix-rule limit was reached.
-
409REDIRECT_DUPLICATE_PATHThe store already has a redirect for this locale and path.
Update a URL redirect
Update a merchant-managed redirect.
Omitted fields stay unchanged. Platform-generated auto_slug and system_prefix rows cannot be changed.
Path parameters
| Name | Type | Description |
|---|---|---|
redirectId
required
|
string |
Redirect id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
path
|
string |
Dead logical path. Prefix rules must end in /*. |
target
|
string |
Internal path or full HTTPS URL. Prefix targets may end in /*. |
redirect_type
|
integer |
301 for permanent or 302 for temporary. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
404REDIRECT_NOT_FOUNDThe redirect does not exist in this store.
-
400REDIRECT_ID_INVALIDThe redirect id is malformed.
-
400REDIRECT_GENERATED_IMMUTABLEA platform-generated redirect was selected for mutation.
-
400INVALID_INPUTThe request body or pagination values are invalid.
-
400REDIRECT_PATH_REQUIREDA non-empty path is required.
-
400REDIRECT_PATH_TOO_LONGThe path exceeds path_max_length from the limits response.
-
400REDIRECT_TARGET_REQUIREDA non-empty target is required.
-
400REDIRECT_TARGET_TOO_LONGThe target exceeds target_max_length from the limits response.
-
400REDIRECT_TYPE_INVALIDredirect_type must be 301 or 302.
-
400REDIRECT_KIND_INVALIDOnly manual and prefix redirects can be created.
-
400REDIRECT_PREFIX_INVALIDA prefix path must end with /* and contain no other wildcards.
-
400REDIRECT_PATH_INVALIDThe path is empty, root, contains unsupported characters, or has an invalid wildcard.
-
400REDIRECT_TARGET_INVALIDThe target is not an internal path or full HTTPS URL.
-
400REDIRECT_SELF_TARGETThe redirect points to itself.
-
400REDIRECT_LOOP_DETECTEDThe change would create a redirect loop.
-
409REDIRECT_DUPLICATE_PATHThe store already has a redirect for this locale and path.
Delete a URL redirect
Delete a merchant-managed redirect.
Platform-generated auto_slug and system_prefix rows cannot be deleted.
Path parameters
| Name | Type | Description |
|---|---|---|
redirectId
required
|
string |
Redirect id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
404REDIRECT_NOT_FOUNDThe redirect does not exist in this store.
-
400REDIRECT_ID_INVALIDThe redirect id is malformed.
-
400REDIRECT_GENERATED_IMMUTABLEA platform-generated redirect was selected for mutation.
Bulk delete URL redirects
Delete several merchant-managed redirects in one request.
The configured bulk cap is returned by the limits endpoint. The request is atomic: an invalid or platform-generated id rejects the selection without deleting the other rows. Unknown ids are ignored, duplicate ids are deleted once, and deleted reports the actual count.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
ids
required
|
array<string> |
Redirect ids to delete. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
404REDIRECT_NOT_FOUNDThe redirect does not exist in this store.
-
400REDIRECT_ID_INVALIDThe redirect id is malformed.
-
400REDIRECT_GENERATED_IMMUTABLEA platform-generated redirect was selected for mutation.
-
400INVALID_INPUTSend a non-empty ids array in a valid JSON body.
-
400REDIRECT_LIMIT_REACHEDThe request exceeds the bulk-delete limit.
Webhook events#
Subscribe to redirect events to mirror every committed create, update, and delete, including automatic chain-collapse side effects.
Redirect created
Fired when a URL redirect is created — manually, by a slug change, or by a permalink rename.
Payload fields
| Field | Type | Description |
|---|---|---|
redirect.id |
string |
Always present |
redirect.kind |
string |
Selectable in the Payload builder |
redirect.locale |
string |
Selectable in the Payload builder |
redirect.path |
string |
Selectable in the Payload builder |
redirect.target |
string |
Selectable in the Payload builder |
redirect.redirect_type |
integer |
Selectable in the Payload builder |
redirect.created_at |
string |
Selectable in the Payload builder |
redirect.updated_at |
string |
Selectable in the Payload builder |
Redirect updated
Fired when a URL redirect is updated.
Payload fields
| Field | Type | Description |
|---|---|---|
redirect.id |
string |
Always present |
redirect.kind |
string |
Selectable in the Payload builder |
redirect.locale |
string |
Selectable in the Payload builder |
redirect.path |
string |
Selectable in the Payload builder |
redirect.target |
string |
Selectable in the Payload builder |
redirect.redirect_type |
integer |
Selectable in the Payload builder |
redirect.created_at |
string |
Selectable in the Payload builder |
redirect.updated_at |
string |
Selectable in the Payload builder |
Redirect deleted
Fired when a URL redirect is deleted.
Payload fields
| Field | Type | Description |
|---|---|---|
redirect.id |
string |
Always present |
redirect.path |
string |
Selectable in the Payload builder |