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.

GET /api/v1/links?limit=20&cursor=1720000000000

Query parameters:

ParameterTypeNotes
limitnumberOptional. Defaults to 20. Minimum 1, maximum 100.
cursornumberOptional. 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
}
POST /api/v1/links

Body fields:

FieldTypeRequiredNotes
urlstringYesDestination URL. Must start with http:// or https://.
slugstringNoCustom slug. Maximum 100 characters.
titlestringNoPrivate label. Maximum 500 characters.
domainIdstringNoVerified custom domain ID.
expiresAtstring or numberNoISO date string or timestamp accepted by JavaScript date parsing.
ogTitlestringNoSocial preview title. Maximum 500 characters.
ogDescriptionstringNoSocial preview description. Maximum 1,000 characters.
ogImagestringNoSocial 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 /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.

PATCH /api/v1/links/{id}

Editable fields:

FieldTypeNotes
urlstringNew destination URL.
titlestringNew private label.
expiresAtstring, number, or nullSet a new expiration or send null to clear it.
ogTitlestringNew social preview title.
ogDescriptionstringNew social preview description.
ogImagestringNew 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 /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"
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"
      }
    }
  ]
}