curl --request PATCH \
--url https://api.h0p.co/short-link/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"domain": "links.example.com",
"slug": "summer-sale",
"destination": {
"type": "link",
"value": "https://example.com/products/summer-sale",
"threatTypes": null
},
"tags": [
"marketing",
"sale"
],
"folderId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"maxClicks": 1000,
"expiresAt": "2024-12-31T23:59:59Z"
}
'import requests
url = "https://api.h0p.co/short-link/{id}"
payload = {
"domain": "links.example.com",
"slug": "summer-sale",
"destination": {
"type": "link",
"value": "https://example.com/products/summer-sale",
"threatTypes": None
},
"tags": ["marketing", "sale"],
"folderId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"maxClicks": 1000,
"expiresAt": "2024-12-31T23:59:59Z"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
domain: 'links.example.com',
slug: 'summer-sale',
destination: {
type: 'link',
value: 'https://example.com/products/summer-sale',
threatTypes: null
},
tags: ['marketing', 'sale'],
folderId: '01933eb8-541f-7000-a9f4-e4eee80ff04e',
maxClicks: 1000,
expiresAt: '2024-12-31T23:59:59Z'
})
};
fetch('https://api.h0p.co/short-link/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.h0p.co/short-link/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'domain' => 'links.example.com',
'slug' => 'summer-sale',
'destination' => [
'type' => 'link',
'value' => 'https://example.com/products/summer-sale',
'threatTypes' => null
],
'tags' => [
'marketing',
'sale'
],
'folderId' => '01933eb8-541f-7000-a9f4-e4eee80ff04e',
'maxClicks' => 1000,
'expiresAt' => '2024-12-31T23:59:59Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.h0p.co/short-link/{id}"
payload := strings.NewReader("{\n \"domain\": \"links.example.com\",\n \"slug\": \"summer-sale\",\n \"destination\": {\n \"type\": \"link\",\n \"value\": \"https://example.com/products/summer-sale\",\n \"threatTypes\": null\n },\n \"tags\": [\n \"marketing\",\n \"sale\"\n ],\n \"folderId\": \"01933eb8-541f-7000-a9f4-e4eee80ff04e\",\n \"maxClicks\": 1000,\n \"expiresAt\": \"2024-12-31T23:59:59Z\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.h0p.co/short-link/{id}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"domain\": \"links.example.com\",\n \"slug\": \"summer-sale\",\n \"destination\": {\n \"type\": \"link\",\n \"value\": \"https://example.com/products/summer-sale\",\n \"threatTypes\": null\n },\n \"tags\": [\n \"marketing\",\n \"sale\"\n ],\n \"folderId\": \"01933eb8-541f-7000-a9f4-e4eee80ff04e\",\n \"maxClicks\": 1000,\n \"expiresAt\": \"2024-12-31T23:59:59Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.h0p.co/short-link/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"domain\": \"links.example.com\",\n \"slug\": \"summer-sale\",\n \"destination\": {\n \"type\": \"link\",\n \"value\": \"https://example.com/products/summer-sale\",\n \"threatTypes\": null\n },\n \"tags\": [\n \"marketing\",\n \"sale\"\n ],\n \"folderId\": \"01933eb8-541f-7000-a9f4-e4eee80ff04e\",\n \"maxClicks\": 1000,\n \"expiresAt\": \"2024-12-31T23:59:59Z\"\n}"
response = http.request(request)
puts response.read_body{
"domain": {
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"domain": "links.example.com",
"isPrimary": true,
"isVerified": true,
"createdAt": "2024-01-15T10:30:00Z"
},
"rules": [
{
"priority": 0,
"destination": {
"type": "link",
"value": "https://example.com",
"threatTypes": null
},
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"countries": [
"US",
"CA",
"GB"
],
"languages": [
"en",
"fr",
"es-MX"
],
"osTypes": [
"ios",
"android"
]
}
],
"qrCode": {
"options": {
"data": "https://example.com/abc123",
"type": "svg",
"width": 300,
"height": 300,
"margin": 4,
"image": "https://example.com/logo.png",
"imageOptions": {
"hideBackgroundDots": true,
"imageSize": 0.4,
"crossOrigin": "anonymous",
"margin": 10
},
"dotsOptions": {
"type": "rounded",
"color": "#000000",
"gradient": {
"type": "linear",
"colorStops": [
{
"offset": 0,
"color": "#3B82F6"
},
{
"offset": 1,
"color": "#8B5CF6"
}
],
"rotation": 45
},
"roundSize": true
},
"cornersSquareOptions": {
"type": "square",
"color": "#3B82F6",
"gradient": {
"type": "linear",
"colorStops": [
{
"offset": 0,
"color": "#3B82F6"
},
{
"offset": 1,
"color": "#8B5CF6"
}
],
"rotation": 45
}
},
"cornersDotOptions": {
"type": "dot",
"color": "#8B5CF6",
"gradient": {
"type": "linear",
"colorStops": [
{
"offset": 0,
"color": "#3B82F6"
},
{
"offset": 1,
"color": "#8B5CF6"
}
],
"rotation": 45
}
},
"backgroundOptions": {
"round": 0.1,
"color": "#FFFFFF"
}
},
"imageId": "01933eb8-541f-7000-a9f4-e4eee80ff04e"
},
"destination": {
"type": "link",
"value": "https://example.com",
"threatTypes": null
},
"metaTags": {
"title": "Amazing Product Launch 2024",
"description": "Be the first to discover our revolutionary new product.",
"imageId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"image": {
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"key": "meta-tag/01933eb8-541f-7000-a9f4-e4eee80ff04e.png"
}
},
"tags": [
{
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"name": "social-media",
"color": "#10B981"
}
],
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"organizationId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"isActive": true,
"qrCodeId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"domainId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"folderId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"slug": "summer-sale",
"originUrl": "https://links.example.com/summer-sale",
"expiresAt": "2024-12-31T23:59:59Z",
"maxClicks": 1000,
"currentClicks": 247,
"hasPassword": false,
"cloaking": false,
"destinationId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-16T14:20:00Z"
}{
"code": "PLAN_LIMIT_REACHED",
"message": "You have reached the maximum number of domains for your plan."
}{
"code": "VALIDATION_ERROR",
"message": "The provided slug is already in use"
}{
"code": "VALIDATION_ERROR",
"message": "The provided slug is already in use"
}Update short link
Update an existing short link’s configuration.
Updatable: Domain, slug, destination, folder, tags, routing rules, QR code, password, max clicks, expiration, cloaking, meta tags Automatic: URL threat recheck, QR code template sync if domain changed, tag/folder count updates Note: All fields optional - only send fields to update
curl --request PATCH \
--url https://api.h0p.co/short-link/{id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"domain": "links.example.com",
"slug": "summer-sale",
"destination": {
"type": "link",
"value": "https://example.com/products/summer-sale",
"threatTypes": null
},
"tags": [
"marketing",
"sale"
],
"folderId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"maxClicks": 1000,
"expiresAt": "2024-12-31T23:59:59Z"
}
'import requests
url = "https://api.h0p.co/short-link/{id}"
payload = {
"domain": "links.example.com",
"slug": "summer-sale",
"destination": {
"type": "link",
"value": "https://example.com/products/summer-sale",
"threatTypes": None
},
"tags": ["marketing", "sale"],
"folderId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"maxClicks": 1000,
"expiresAt": "2024-12-31T23:59:59Z"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
domain: 'links.example.com',
slug: 'summer-sale',
destination: {
type: 'link',
value: 'https://example.com/products/summer-sale',
threatTypes: null
},
tags: ['marketing', 'sale'],
folderId: '01933eb8-541f-7000-a9f4-e4eee80ff04e',
maxClicks: 1000,
expiresAt: '2024-12-31T23:59:59Z'
})
};
fetch('https://api.h0p.co/short-link/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.h0p.co/short-link/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'domain' => 'links.example.com',
'slug' => 'summer-sale',
'destination' => [
'type' => 'link',
'value' => 'https://example.com/products/summer-sale',
'threatTypes' => null
],
'tags' => [
'marketing',
'sale'
],
'folderId' => '01933eb8-541f-7000-a9f4-e4eee80ff04e',
'maxClicks' => 1000,
'expiresAt' => '2024-12-31T23:59:59Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.h0p.co/short-link/{id}"
payload := strings.NewReader("{\n \"domain\": \"links.example.com\",\n \"slug\": \"summer-sale\",\n \"destination\": {\n \"type\": \"link\",\n \"value\": \"https://example.com/products/summer-sale\",\n \"threatTypes\": null\n },\n \"tags\": [\n \"marketing\",\n \"sale\"\n ],\n \"folderId\": \"01933eb8-541f-7000-a9f4-e4eee80ff04e\",\n \"maxClicks\": 1000,\n \"expiresAt\": \"2024-12-31T23:59:59Z\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.h0p.co/short-link/{id}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"domain\": \"links.example.com\",\n \"slug\": \"summer-sale\",\n \"destination\": {\n \"type\": \"link\",\n \"value\": \"https://example.com/products/summer-sale\",\n \"threatTypes\": null\n },\n \"tags\": [\n \"marketing\",\n \"sale\"\n ],\n \"folderId\": \"01933eb8-541f-7000-a9f4-e4eee80ff04e\",\n \"maxClicks\": 1000,\n \"expiresAt\": \"2024-12-31T23:59:59Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.h0p.co/short-link/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"domain\": \"links.example.com\",\n \"slug\": \"summer-sale\",\n \"destination\": {\n \"type\": \"link\",\n \"value\": \"https://example.com/products/summer-sale\",\n \"threatTypes\": null\n },\n \"tags\": [\n \"marketing\",\n \"sale\"\n ],\n \"folderId\": \"01933eb8-541f-7000-a9f4-e4eee80ff04e\",\n \"maxClicks\": 1000,\n \"expiresAt\": \"2024-12-31T23:59:59Z\"\n}"
response = http.request(request)
puts response.read_body{
"domain": {
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"domain": "links.example.com",
"isPrimary": true,
"isVerified": true,
"createdAt": "2024-01-15T10:30:00Z"
},
"rules": [
{
"priority": 0,
"destination": {
"type": "link",
"value": "https://example.com",
"threatTypes": null
},
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"countries": [
"US",
"CA",
"GB"
],
"languages": [
"en",
"fr",
"es-MX"
],
"osTypes": [
"ios",
"android"
]
}
],
"qrCode": {
"options": {
"data": "https://example.com/abc123",
"type": "svg",
"width": 300,
"height": 300,
"margin": 4,
"image": "https://example.com/logo.png",
"imageOptions": {
"hideBackgroundDots": true,
"imageSize": 0.4,
"crossOrigin": "anonymous",
"margin": 10
},
"dotsOptions": {
"type": "rounded",
"color": "#000000",
"gradient": {
"type": "linear",
"colorStops": [
{
"offset": 0,
"color": "#3B82F6"
},
{
"offset": 1,
"color": "#8B5CF6"
}
],
"rotation": 45
},
"roundSize": true
},
"cornersSquareOptions": {
"type": "square",
"color": "#3B82F6",
"gradient": {
"type": "linear",
"colorStops": [
{
"offset": 0,
"color": "#3B82F6"
},
{
"offset": 1,
"color": "#8B5CF6"
}
],
"rotation": 45
}
},
"cornersDotOptions": {
"type": "dot",
"color": "#8B5CF6",
"gradient": {
"type": "linear",
"colorStops": [
{
"offset": 0,
"color": "#3B82F6"
},
{
"offset": 1,
"color": "#8B5CF6"
}
],
"rotation": 45
}
},
"backgroundOptions": {
"round": 0.1,
"color": "#FFFFFF"
}
},
"imageId": "01933eb8-541f-7000-a9f4-e4eee80ff04e"
},
"destination": {
"type": "link",
"value": "https://example.com",
"threatTypes": null
},
"metaTags": {
"title": "Amazing Product Launch 2024",
"description": "Be the first to discover our revolutionary new product.",
"imageId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"image": {
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"key": "meta-tag/01933eb8-541f-7000-a9f4-e4eee80ff04e.png"
}
},
"tags": [
{
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"name": "social-media",
"color": "#10B981"
}
],
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"organizationId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"isActive": true,
"qrCodeId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"domainId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"folderId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"slug": "summer-sale",
"originUrl": "https://links.example.com/summer-sale",
"expiresAt": "2024-12-31T23:59:59Z",
"maxClicks": 1000,
"currentClicks": 247,
"hasPassword": false,
"cloaking": false,
"destinationId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-16T14:20:00Z"
}{
"code": "PLAN_LIMIT_REACHED",
"message": "You have reached the maximum number of domains for your plan."
}{
"code": "VALIDATION_ERROR",
"message": "The provided slug is already in use"
}{
"code": "VALIDATION_ERROR",
"message": "The provided slug is already in use"
}Authorizations
API Key authentication for programmatic access.
How to use:
- Create an API key from your dashboard settings
- Include the key in the
x-api-keyheader with each request - API keys have granular permissions (domains, shortLinks, files, stats, apiKeys)
Example:
curl -H "x-api-key: your-api-key-here" https://api.h0p.co/short-link/list
Types of API keys:
- User keys: Linked to your user account (one per organization)
- Bot keys: Autonomous machine users (one per organization)
Security notes:
- Keep your API keys secure and never commit them to version control
- API keys cannot access authentication endpoints (/auth/*)
- Keys can be revoked at any time from the dashboard
Path Parameters
Unique identifier in UUID v7 format
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Body
Fields to update (partial update supported)
Short link creation/update request
Main destination URL/email/phone
Show child attributes
Show child attributes
{
"type": "link",
"value": "https://example.com",
"threatTypes": null
}
UUID of the domain to use
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Domain name to use (alternative to domainId)
"links.example.com"
UUID of folder to organize link
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Array of tag names to associate
101 - 30[
"marketing",
"campaign-2024",
"social-media"
]
Custom slug for the short link
1 - 50^(?![-_])[A-Za-z0-9-_]{1,50}(?<![-_])$"summer-sale"
Maximum number of clicks before link expires
x > 11000
Link expiration date/time
"2024-12-31T23:59:59Z"
Password to protect link access
5 - 25"secretpass123"
Hide destination URL in browser
false
Enable automatic deep linking to mobile apps
true
Smart routing rules array
Show child attributes
Show child attributes
Custom QR code configuration for this link
Show child attributes
Show child attributes
Custom Open Graph meta tags
Show child attributes
Show child attributes
{
"title": "Amazing Product Launch 2024",
"description": "Be the first to discover our revolutionary new product with exclusive early access.",
"imageId": "01933eb8-541f-7000-a9f4-e4eee80ff04e"
}
Response
Short link updated successfully
Complete short link with all nested objects
Domain details
Show child attributes
Show child attributes
Smart routing rules with IDs
Show child attributes
Show child attributes
QR code configuration
Show child attributes
Show child attributes
Main destination configuration
Show child attributes
Show child attributes
{
"type": "link",
"value": "https://example.com",
"threatTypes": null
}
Meta tags configuration
Show child attributes
Show child attributes
{
"title": "Amazing Product Launch 2024",
"description": "Be the first to discover our revolutionary new product.",
"imageId": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"image": {
"id": "01933eb8-541f-7000-a9f4-e4eee80ff04e",
"key": "meta-tag/01933eb8-541f-7000-a9f4-e4eee80ff04e.png"
}
}
Associated tags
Show child attributes
Show child attributes
Short link UUID
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Organization UUID
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Whether link is active
true
QR code configuration UUID
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Domain UUID
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Folder UUID
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Short link slug
"summer-sale"
Complete short URL
"https://links.example.com/summer-sale"
Expiration timestamp
"2024-12-31T23:59:59Z"
Maximum click limit
1000
Current click count
x >= 0247
Whether link is password protected
false
Whether destination is hidden
false
Destination configuration UUID
"01933eb8-541f-7000-a9f4-e4eee80ff04e"
Creation timestamp
"2024-01-15T10:30:00Z"
Last update timestamp
"2024-01-16T14:20:00Z"