API
Links API
List, create, update, delete, and bulk-create Qorlivo short links through the public API.
Use the Links API to create and manage short links from your own app, CMS, campaign tools, or reporting workflow.
List links
GET /api/v1/links?limit=20&cursor=1720000000000
Query parameters:
| Parameter | Type | Notes |
|---|---|---|
limit | number | Optional. Defaults to 20. Minimum 1, maximum 100. |
cursor | number | Optional. Use nextCursor from the previous response. |
Example:
curl "https://www.qorlivo.com/api/v1/links?limit=50" \
-H "Authorization: Bearer $QORLIVO_API_KEY"
Response:
{
"data": [
{
"_id": "j97xxxxxxxxxxxxxxxxxxxxxxxxx",
"slug": "spring-launch",
"destinationUrl": "https://example.com/spring",
"title": "Spring launch",
"clicks": 128,
"createdAt": 1783027439000
}
],
"hasMore": false,
"nextCursor": null
}
Create a link
POST /api/v1/links
Body fields:
| Field | Type | Required | Notes |
|---|---|---|---|
url | string | Yes | Destination URL. Must start with http:// or https://. |
slug | string | No | Custom slug. Maximum 100 characters. |
title | string | No | Private label. Maximum 500 characters. |
domainId | string | No | Verified custom domain ID. |
expiresAt | string or number | No | ISO date string or timestamp accepted by JavaScript date parsing. |
ogTitle | string | No | Social preview title. Maximum 500 characters. |
ogDescription | string | No | Social preview description. Maximum 1,000 characters. |
ogImage | string | No | Social preview image URL. Maximum 2,048 characters. |
Example:
curl https://www.qorlivo.com/api/v1/links \
-X POST \
-H "Authorization: Bearer $QORLIVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/spring",
"slug": "spring-launch",
"title": "Spring launch",
"ogTitle": "Spring launch",
"ogDescription": "See what is new this season"
}'
Response:
{
"id": "j97xxxxxxxxxxxxxxxxxxxxxxxxx",
"shortUrl": "https://qorlivo.com/spring-launch",
"slug": "spring-launch",
"destinationUrl": "https://example.com/spring",
"createdAt": "2026-07-02T14:10:00.000Z"
}
Write access requires Creator or higher.
Get a link
GET /api/v1/links/{id}
Example:
curl https://www.qorlivo.com/api/v1/links/j97xxxxxxxxxxxxxxxxxxxxxxxxx \
-H "Authorization: Bearer $QORLIVO_API_KEY"
If the link does not belong to the authenticated account, Qorlivo returns 404.
Update a link
PATCH /api/v1/links/{id}
Editable fields:
| Field | Type | Notes |
|---|---|---|
url | string | New destination URL. |
title | string | New private label. |
expiresAt | string, number, or null | Set a new expiration or send null to clear it. |
ogTitle | string | New social preview title. |
ogDescription | string | New social preview description. |
ogImage | string | New social preview image URL. |
Example:
curl https://www.qorlivo.com/api/v1/links/j97xxxxxxxxxxxxxxxxxxxxxxxxx \
-X PATCH \
-H "Authorization: Bearer $QORLIVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/spring-updated",
"title": "Spring launch updated",
"expiresAt": null
}'
Response:
{
"success": true,
"slug": "spring-launch"
}
Delete a link
DELETE /api/v1/links/{id}
Successful deletion returns 204 No Content.
curl https://www.qorlivo.com/api/v1/links/j97xxxxxxxxxxxxxxxxxxxxxxxxx \
-X DELETE \
-H "Authorization: Bearer $QORLIVO_API_KEY"
Bulk-create links
POST /api/v1/links/bulk
Bulk creation supports up to 100 URLs per request and requires Business or Enterprise.
Body:
{
"urls": [
{
"url": "https://example.com/a",
"slug": "campaign-a",
"title": "Campaign A"
},
{
"url": "https://example.com/b",
"title": "Campaign B"
}
]
}
Response when all links succeed:
{
"results": [
{
"status": 201,
"data": {
"id": "j97xxxxxxxxxxxxxxxxxxxxxxxxx",
"shortUrl": "https://qorlivo.com/campaign-a",
"slug": "campaign-a",
"destinationUrl": "https://example.com/a"
}
}
]
}
If one or more items fail, Qorlivo returns 207 Multi-Status and includes both successes and item-level errors.
{
"results": [
{
"status": 201,
"data": {
"id": "j97xxxxxxxxxxxxxxxxxxxxxxxxx",
"shortUrl": "https://qorlivo.com/campaign-a",
"slug": "campaign-a",
"destinationUrl": "https://example.com/a"
}
},
{
"status": 409,
"error": {
"code": "SLUG_TAKEN",
"message": "Slug is already taken",
"url": "https://example.com/b"
}
}
]
}