Short Links (Slugs) and Redirects
Create branded short URLs that redirect visitors to any destination — and update them any time without changing the link you already shared.
Tip
Every link you create generates a public URL: https://{handle}.{PUBLIC_DOMAIN}/{slug}.
Key concepts
| Concept | What it means |
|---|---|
| Slug | The path after your handle in the URL. Must be 4-24 characters, alphanumeric with hyphens and underscores (^[A-Za-z0-9_-]{4,24}$) |
| Destination URL | Where the visitor lands after clicking. Must be a valid HTTP(S) URL |
| Redirect type | 302 (temporary, default) or 307 (temporary, preserves HTTP method). Use 302 for most cases |
| Enabled | A boolean toggle. Disabled links return 404 |
Link lifecycle
Create
Set a slug, destination URL, and optional metadata (title, tags, description).
Share
Distribute the public URL anywhere: email, social media, print.
Update
Change the destination, title, or metadata at any time. The short URL stays the same.
Disable or delete
Set
enabled: falseto temporarily stop redirects (returns 404), or delete the link permanently.
Create and manage links
Open your handle
Go to
https://app.{PUBLIC_DOMAIN}and navigate to your handle's Links section.Create or edit
Click Create Link to add a new link, or click an existing link to edit it.
Configure
Set the destination URL, slug, and optional fields (title, tags, categories, description).
Save and test
Save the link. It is immediately live. Test by visiting
https://{handle}.{PUBLIC_DOMAIN}/{slug}in an incognito window.
Create or update a link
This is an upsert — if the slug does not exist, it creates the link; if it does, it updates it.
Request
curl -sS -X PUT "https://api.10x.in/v2/handles/{handle}/links/{slug}" \
-H "Authorization: Bearer <access-token>" \
-H "Content-Type: application/json" \
-d '{"destinationUrl": "https://example.com/product", "title": "Product Page", "tags": ["product", "q2"], "categories": ["marketing"], "enabled": true}'Body
{
"destinationUrl": "https://example.com/product",
"title": "Product Page",
"tags": ["product", "q2"],
"categories": ["marketing"],
"enabled": true
}Returns 200 with the full link object.
List all links
curl -sS "https://api.10x.in/v2/handles/{handle}/links" \
-H "Authorization: Bearer <access-token>"
Returns all links for the handle, sorted by creation date (newest first). Supports pagination.
Get a single link
curl -sS "https://api.10x.in/v2/handles/{handle}/links/{slug}" \
-H "Authorization: Bearer <access-token>"
Returns the full link object including metadata, routing rules, tracking policy, and version history.
Delete a link
Warning
Permanently removes the link and its analytics. This cannot be undone.
curl -sS -X DELETE "https://api.10x.in/v2/handles/{handle}/links/{slug}" \
-H "Authorization: Bearer <access-token>"
PAT endpoints
The same operations are available via PAT at /v2/public/handles/{handle}/links and /v2/public/handles/{handle}/links/{slug}. Requires links.read or links.write scope.
Required auth
| Auth mode | Use case |
|---|---|
CREATOR-level JWT or above | Control-plane link management |
PAT with links.read or links.write | Automation on /v2/public/handles/{handle}/* routes |
| None | Visitors clicking links |
Common errors
| Code | Error | Cause |
|---|---|---|
| 400 | invalid_slug | Slug does not match ^[A-Za-z0-9_-]{4,24}$ |
| 400 | invalid_destination_url | URL is not a valid HTTP(S) URL or is on the blocked domain list |
| 404 | not_found | Link does not exist |
| 409 | conflict | Slug already exists (only on strict-create flows) |
| 403 | insufficient_role | Caller does not have CREATOR or higher role on this handle |
Next steps
Advanced Link Controls
Scheduling, expiry, click caps, password protection, routing rules, and social preview
Smart Link Personalization
Route visitors to different destinations based on location, device, or behavior
Campaign Funnel Workflow
Group links into campaigns for conversion tracking
Vector Embedding Targeting
Automatic content-aware link reranking