Short.io Link Duplication API
The Link Duplication API from Short.io — 1 operation(s) for link duplication.
The Link Duplication API from Short.io — 1 operation(s) for link duplication.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/short-io:short-io-link-duplication-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Short.io Link Duplication API
version: 1.0.0
x-scalar-sdk-installation:
- lang: Node
description: 'Install the official **Short.io Node.js SDK** from npm:'
source: npm install @short.io/client-node
servers:
- url: https://api.short.io
description: API server
security:
- apiKey: []
tags:
- name: Link Duplication
paths:
/links/duplicate/{linkId}:
post:
summary: Duplicate an existing link
tags:
- Link Duplication
description: 'Duplicates an existing link with all its properties, targeting rules, and settings.
The duplicated link will have a new random path (or custom if provided) and be fully independent.
**Rate limit**: 50/s'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
path:
type: string
description: Custom path for duplicated link
example: my-link-copy
parameters:
- schema:
type: string
pattern: (?:lnk|link)_\w+_\w+
example: lnk_1A2b_3Cd4Ef5Gh
in: path
name: linkId
required: true
description: Encoded link ID string of the source link
responses:
'200':
description: Default Response
content:
application/json:
schema:
allOf:
- allOf:
- allOf:
- type: object
required:
- originalURL
properties:
originalURL:
type: string
url: destination
description: Original URL
examples:
- https://example.com
cloaking:
type: boolean
description: Cloaking
password:
type: string
description: Link password
examples:
- s3cur3p@ssw0rd
expiresAt:
anyOf:
- type: integer
nullable: true
- type: string
format: iso-date-time
nullable: true
description: Link expiration date in milliseconds or ISO string
examples:
- '2026-10-26T11:51:52.472Z'
expiredURL:
type: string
nullable: true
url: destination
description: Expired URL
examples:
- https://example.com/expired
title:
type: string
description: Link title
tags:
type: array
items:
type: string
description: Array of link tags
utmSource:
type: string
description: set utm_source parameter to destination link
examples:
- cpc
- organic
utmMedium:
type: string
description: set utm_medium parameter to destination link
examples:
- banner
- email
utmCampaign:
type: string
description: set utm_campaign parameter to destination link
examples:
- summer_sale
utmTerm:
type: string
description: set utm_term parameter to destination link
examples:
- running_shoes
utmContent:
type: string
description: set utm_content parameter to destination link
examples:
- cta_button
ttl:
anyOf:
- type: string
format: iso-date-time
nullable: true
- type: integer
nullable: true
description: Time to live in milliseconds or ISO string
examples:
- '2026-10-26T11:51:52.472Z'
androidURL:
type: string
url: destination
description: Android URL
nullable: true
examples:
- https://play.google.com/store/apps/details?id=com.example.app
iphoneURL:
type: string
url: destination
description: iPhone URL
nullable: true
examples:
- https://apps.apple.com/us/app/example-app/id1234567890
clicksLimit:
type: integer
nullable: true
minimum: 1
description: disable link after specified number of clicks
examples:
- 100
passwordContact:
type: boolean
description: Provide your email to users to get a password
nullable: true
skipQS:
type: boolean
description: Skip query string merging
default: false
archived:
type: boolean
description: Link is archived
default: false
splitURL:
type: string
url: destination
description: Split URL
nullable: true
examples:
- https://example.com/split
splitPercent:
type: integer
nullable: true
minimum: 1
maximum: 100
description: Split URL percentage
examples:
- 50
splitURLV2:
type: array
items:
type: object
required:
- url
- percent
properties:
url:
type: string
url: destination
description: Split URL destination
percent:
type: integer
minimum: 1
maximum: 100
description: Traffic percentage
description: Split URL configurations for multi-way A/B testing
maxItems: 10
nullable: true
integrationAdroll:
type: string
description: Adroll integration
nullable: true
integrationFB:
type: string
description: Facebook integration
nullable: true
integrationTT:
type: string
description: TikTok integration
nullable: true
integrationGA:
type: string
description: Google Analytics integration
nullable: true
integrationGTM:
type: string
description: Google Tag Manager integration
nullable: true
- type: object
required:
- idString
- id
- shortURL
- secureShortURL
- path
- displayPath
- createdAt
- updatedAt
properties:
idString:
type: string
description: Link ID
id:
type: string
description: Link ID
shortURL:
type: string
url: short
description: Short URL
examples:
- https://short.gy/abc123
secureShortURL:
type: string
url: short
description: Secure short URL
examples:
- https://short.gy/abc123
path:
anyOf:
- type: string
description: Link slug. For case-insensitive domains, this is the normalized lowercase version of the path.
examples:
- my-link
- type: 'null'
displayPath:
anyOf:
- type: string
description: Original path preserving the case as provided during creation. Set only for case-insensitive domains when the path contains uppercase characters, otherwise null.
examples:
- My-Link
- type: 'null'
redirectType:
type: string
description: HTTP code for redirect
enum:
- '301'
- '302'
- '307'
- '308'
createdAt:
anyOf:
- type: string
format: iso-date-time
- type: 'null'
description: Link creation date in ISO format
updatedAt:
anyOf:
- type: string
format: iso-date-time
- type: 'null'
description: Link last update date in ISO format
FolderId:
anyOf:
- type: string
description: Folder ID
examples:
- abc123
- type: 'null'
DomainId:
type: integer
description: Domain ID
examples:
- 1
OwnerId:
type: integer
description: Owner ID
examples:
- 1
hasPassword:
type: boolean
description: Link has password
default: false
source:
enum:
- website
- api
- public
- spreadsheets
- slack
- telegram
- ''
description: Link source
examples:
- api
pageType:
type: integer
enum:
- 1
- 2
description: 'Special page type rendered at the short link: 1 = bundle, 2 = post. Absent for normal redirect links.'
examples:
- 2
User:
anyOf:
- type: object
required:
- id
- name
- email
- photoURL
properties:
id:
type: integer
description: Creator user ID
examples:
- 123
name:
anyOf:
- type: string
description: Creator name
examples:
- John Doe
- type: 'null'
email:
type: string
description: Creator email
examples:
- a@example.com
photoURL:
anyOf:
- type: string
description: User photo URL
examples:
- https://example.com/photo.jpg
- type: 'null'
- type: 'null'
- type: object
properties:
success:
type: boolean
default: true
duplicate:
type: boolean
default: false
- type: object
required:
- duplicatedFrom
properties:
duplicatedFrom:
type: string
description: Original link's idString
'400':
description: Default Response
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Bad request error message
field:
type: string
description: Field that failed validation
example: path
'401':
description: Default Response
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Unauthorized error message
'402':
description: Default Response
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Payment required error message
field:
type: string
description: Field that triggered the plan limit
example: path
'403':
description: Default Response
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Access denied error message
'404':
description: Default Response
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Not found error message
'409':
description: Default Response
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Conflict error message
field:
type: string
description: Field that triggered the conflict
example: path
'500':
description: Default Response
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Internal server error message
operationId: createDuplicate
x-codeSamples:
- lang: JavaScript
label: '@short.io/client-node'
source: "const { data } = await createDuplicate({\n \"path\": {\n \"linkId\": \"lnk_1A2b_3Cd4Ef5Gh\"\n },\n \"body\": {\n \"path\": \"my-link-copy\"\n }\n});\n"
components:
securitySchemes:
apiKey:
type: apiKey
name: Authorization
in: header