---
title: "Create a new link"
method: POST
path: "/links"
tags: ["Link Management"]
---

# Create a new link

`POST /links`

This method creates a new link. If parameter "path" is omitted, it
generates path by algorithm, chosen in domain settings.

Notes:

1. If URL with a given path already exists and originalURL of the URL in database is equal to originalURL argument, it returns information about existing URL
2. If URL with a given path already exists and originalURL is different from originalURL in database, it returns error with a status `409`
3. If URL with a given originalURL exists, and no path is given, it returns information about existing URL and does not create anything
4. If URL with a given originalURL exists, and custom path is given, it creates a new short URL

**Rate limit**: 50/s

## Request body

- object
  - `originalURL` string, required — Original URL
  - `cloaking` boolean — Cloaking
  - `password` string — Link password
  - `redirectType` 301 | 302 | 307 | 308, nullable — HTTP code for redirect
  - `expiresAt` union — Link expiration date in milliseconds or ISO string
    - integer, nullable
    - string, iso-date-time, nullable
  - `expiredURL` string, nullable — Expired URL
  - `title` string — Link title
  - `tags` string[] — Array of link tags
  - `utmSource` string — set utm_source parameter to destination link
  - `utmMedium` string — set utm_medium parameter to destination link
  - `utmCampaign` string — set utm_campaign parameter to destination link
  - `utmTerm` string — set utm_term parameter to destination link
  - `utmContent` string — set utm_content parameter to destination link
  - `ttl` union — Time to live in milliseconds or ISO string
    - string, iso-date-time, nullable
    - integer, nullable
  - `path` string, nullable — Link slug
  - `androidURL` string, nullable — Android URL
  - `iphoneURL` string, nullable — iPhone URL
  - `createdAt` union — Link creation date in milliseconds
    - integer, nullable
    - string, iso-date-time, nullable
  - `clicksLimit` integer, nullable — disable link after specified number of clicks
  - `passwordContact` boolean, nullable — Provide your email to users to get a password
  - `skipQS` boolean — Skip query string merging
  - `archived` boolean — Link is archived
  - `splitURL` string, nullable — Split URL
  - `splitPercent` integer, nullable — Split URL percentage
  - `integrationAdroll` string, nullable — Adroll integration
  - `integrationFB` string, nullable — Facebook integration
  - `integrationGA` string, nullable — Google Analytics integration
  - `integrationGTM` string, nullable — Google Tag Manager integration
  - `domain` string, hostname, required — Domain hostname
  - `allowDuplicates` boolean — Allow duplicates
  - `folderId` string — Folder ID

## Response `200`

Default Response

- object
  - `originalURL` string, required — Original URL
  - `cloaking` boolean — Cloaking
  - `password` string — Link password
  - `expiresAt` union — Link expiration date in milliseconds or ISO string
    - integer, nullable
    - string, iso-date-time, nullable
  - `expiredURL` string, nullable — Expired URL
  - `title` string — Link title
  - `tags` string[] — Array of link tags
  - `utmSource` string — set utm_source parameter to destination link
  - `utmMedium` string — set utm_medium parameter to destination link
  - `utmCampaign` string — set utm_campaign parameter to destination link
  - `utmTerm` string — set utm_term parameter to destination link
  - `utmContent` string — set utm_content parameter to destination link
  - `ttl` union — Time to live in milliseconds or ISO string
    - string, iso-date-time, nullable
    - integer, nullable
  - `path` string, nullable, required — Link slug
  - `androidURL` string, nullable — Android URL
  - `iphoneURL` string, nullable — iPhone URL
  - `createdAt` union — Link creation date in milliseconds
    - integer, nullable
    - string, iso-date-time, nullable
  - `clicksLimit` integer, nullable — disable link after specified number of clicks
  - `passwordContact` boolean, nullable — Provide your email to users to get a password
  - `skipQS` boolean — Skip query string merging
  - `archived` boolean — Link is archived
  - `splitURL` string, nullable — Split URL
  - `splitPercent` integer, nullable — Split URL percentage
  - `integrationAdroll` string, nullable — Adroll integration
  - `integrationFB` string, nullable — Facebook integration
  - `integrationGA` string, nullable — Google Analytics integration
  - `integrationGTM` string, nullable — Google Tag Manager integration
  - `idString` string, required — Link ID
  - `id` string, required — Link ID
  - `shortURL` string, required — Short URL
  - `secureShortURL` string, required — Secure short URL
  - `redirectType` '301' | '302' | '307' | '308' — HTTP code for redirect
  - `FolderId` string, nullable — Folder ID
  - `DomainId` integer — Domain ID
  - `OwnerId` integer — Owner ID
  - `hasPassword` boolean — Link has password
  - `User` object
    - `id` integer, required — Creator user ID
    - `name` string, nullable, required — Creator name
    - `email` string, required — Creator email
    - `photoURL` string, nullable, required — User photo URL
  - `success` boolean
  - `duplicate` boolean

## Other responses

- `400` — Default Response

---

[API](https://skmtc.net/short/apis/short-io-api.md) · [All operations](https://skmtc.net/short/apis/short-io-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/short/short-io-api/versions/288b112e7951/schema)
