curl --request PATCH \
--url https://api.teasy.link/v1/redirects/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Promo",
"target_url": "https://onlyfans.com/kate",
"slug": "promo",
"note": "<string>",
"domain": "teasy.link",
"group_id": "<string>",
"is_active": true,
"antibot_enabled": true,
"geo_blocklists": {
"countries": [
"RU",
"CN"
]
}
}
'import requests
url = "https://api.teasy.link/v1/redirects/{id}"
payload = {
"name": "Promo",
"target_url": "https://onlyfans.com/kate",
"slug": "promo",
"note": "<string>",
"domain": "teasy.link",
"group_id": "<string>",
"is_active": True,
"antibot_enabled": True,
"geo_blocklists": { "countries": ["RU", "CN"] }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Promo',
target_url: 'https://onlyfans.com/kate',
slug: 'promo',
note: '<string>',
domain: 'teasy.link',
group_id: '<string>',
is_active: true,
antibot_enabled: true,
geo_blocklists: {countries: ['RU', 'CN']}
})
};
fetch('https://api.teasy.link/v1/redirects/{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.teasy.link/v1/redirects/{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([
'name' => 'Promo',
'target_url' => 'https://onlyfans.com/kate',
'slug' => 'promo',
'note' => '<string>',
'domain' => 'teasy.link',
'group_id' => '<string>',
'is_active' => true,
'antibot_enabled' => true,
'geo_blocklists' => [
'countries' => [
'RU',
'CN'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.teasy.link/v1/redirects/{id}"
payload := strings.NewReader("{\n \"name\": \"Promo\",\n \"target_url\": \"https://onlyfans.com/kate\",\n \"slug\": \"promo\",\n \"note\": \"<string>\",\n \"domain\": \"teasy.link\",\n \"group_id\": \"<string>\",\n \"is_active\": true,\n \"antibot_enabled\": true,\n \"geo_blocklists\": {\n \"countries\": [\n \"RU\",\n \"CN\"\n ]\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.teasy.link/v1/redirects/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Promo\",\n \"target_url\": \"https://onlyfans.com/kate\",\n \"slug\": \"promo\",\n \"note\": \"<string>\",\n \"domain\": \"teasy.link\",\n \"group_id\": \"<string>\",\n \"is_active\": true,\n \"antibot_enabled\": true,\n \"geo_blocklists\": {\n \"countries\": [\n \"RU\",\n \"CN\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teasy.link/v1/redirects/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Promo\",\n \"target_url\": \"https://onlyfans.com/kate\",\n \"slug\": \"promo\",\n \"note\": \"<string>\",\n \"domain\": \"teasy.link\",\n \"group_id\": \"<string>\",\n \"is_active\": true,\n \"antibot_enabled\": true,\n \"geo_blocklists\": {\n \"countries\": [\n \"RU\",\n \"CN\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "rdr_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"object": "redirect",
"name": "Promo",
"url": "https://teasy.link/promo",
"target_url": "https://onlyfans.com/kate",
"slug": "promo",
"is_active": true,
"note": "Autumn mailing",
"antibot_enabled": false,
"group_id": "grp_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
"domain": "teasy.link",
"created_at": "2026-08-21T10:00:00Z",
"updated_at": "2026-08-21T10:00:00Z",
"pixels": [
{
"id": "pxl_2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a",
"object": "pixel",
"pixel_type": "google_tag",
"pixel_id": "123456789012345"
}
],
"geo_blocklists": {
"countries": [
"RU",
"CN"
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}Update Redirect
Only the fields you send are touched. Null clears: slug frees the address, domain moves the link back to the system domain, group_id ungroups it, geo_blocklists lifts all country blocks.
curl --request PATCH \
--url https://api.teasy.link/v1/redirects/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Promo",
"target_url": "https://onlyfans.com/kate",
"slug": "promo",
"note": "<string>",
"domain": "teasy.link",
"group_id": "<string>",
"is_active": true,
"antibot_enabled": true,
"geo_blocklists": {
"countries": [
"RU",
"CN"
]
}
}
'import requests
url = "https://api.teasy.link/v1/redirects/{id}"
payload = {
"name": "Promo",
"target_url": "https://onlyfans.com/kate",
"slug": "promo",
"note": "<string>",
"domain": "teasy.link",
"group_id": "<string>",
"is_active": True,
"antibot_enabled": True,
"geo_blocklists": { "countries": ["RU", "CN"] }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Promo',
target_url: 'https://onlyfans.com/kate',
slug: 'promo',
note: '<string>',
domain: 'teasy.link',
group_id: '<string>',
is_active: true,
antibot_enabled: true,
geo_blocklists: {countries: ['RU', 'CN']}
})
};
fetch('https://api.teasy.link/v1/redirects/{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.teasy.link/v1/redirects/{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([
'name' => 'Promo',
'target_url' => 'https://onlyfans.com/kate',
'slug' => 'promo',
'note' => '<string>',
'domain' => 'teasy.link',
'group_id' => '<string>',
'is_active' => true,
'antibot_enabled' => true,
'geo_blocklists' => [
'countries' => [
'RU',
'CN'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.teasy.link/v1/redirects/{id}"
payload := strings.NewReader("{\n \"name\": \"Promo\",\n \"target_url\": \"https://onlyfans.com/kate\",\n \"slug\": \"promo\",\n \"note\": \"<string>\",\n \"domain\": \"teasy.link\",\n \"group_id\": \"<string>\",\n \"is_active\": true,\n \"antibot_enabled\": true,\n \"geo_blocklists\": {\n \"countries\": [\n \"RU\",\n \"CN\"\n ]\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.teasy.link/v1/redirects/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Promo\",\n \"target_url\": \"https://onlyfans.com/kate\",\n \"slug\": \"promo\",\n \"note\": \"<string>\",\n \"domain\": \"teasy.link\",\n \"group_id\": \"<string>\",\n \"is_active\": true,\n \"antibot_enabled\": true,\n \"geo_blocklists\": {\n \"countries\": [\n \"RU\",\n \"CN\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teasy.link/v1/redirects/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Promo\",\n \"target_url\": \"https://onlyfans.com/kate\",\n \"slug\": \"promo\",\n \"note\": \"<string>\",\n \"domain\": \"teasy.link\",\n \"group_id\": \"<string>\",\n \"is_active\": true,\n \"antibot_enabled\": true,\n \"geo_blocklists\": {\n \"countries\": [\n \"RU\",\n \"CN\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "rdr_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"object": "redirect",
"name": "Promo",
"url": "https://teasy.link/promo",
"target_url": "https://onlyfans.com/kate",
"slug": "promo",
"is_active": true,
"note": "Autumn mailing",
"antibot_enabled": false,
"group_id": "grp_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
"domain": "teasy.link",
"created_at": "2026-08-21T10:00:00Z",
"updated_at": "2026-08-21T10:00:00Z",
"pixels": [
{
"id": "pxl_2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a",
"object": "pixel",
"pixel_type": "google_tag",
"pixel_id": "123456789012345"
}
],
"geo_blocklists": {
"countries": [
"RU",
"CN"
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "Redirect not found.",
"request_id": "req_9f2c5a4b7d4c31a2f86e0d91b3c7aa10",
"details": [
{
"field": "target_url",
"code": "invalid_value",
"message": "target_url must be a valid URL"
}
]
}
}Authorizations
API key issued in the dashboard. Server-side only: never ship it to a browser, and never pass it as a query parameter.
Path Parameters
"rdr_9f2c5a4b7d4c31a2f86e0d91b3c7aa10"
Body
1 - 100"Promo"
2048"https://onlyfans.com/kate"
Null moves the link to the root of its custom domain.
"promo"
Null clears the note.
256Null moves the link back to the system domain.
"teasy.link"
Null removes the link from its group.
Null clears all country blocks.
Show child attributes
Show child attributes
Response
"rdr_9f2c5a4b7d4c31a2f86e0d91b3c7aa10"
redirect "Promo"
Public address, assembled from the domain and the slug. Null only if the link lost its domain.
"https://teasy.link/promo"
"https://onlyfans.com/kate"
Null when the link occupies the root of a custom domain.
"promo"
Inactive links stop resolving but keep their statistics.
true
Private note, never shown to visitors.
"Autumn mailing"
false
"grp_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d"
Hostname as a plain string — the same value is passed when creating a link.
"teasy.link"
"2026-08-21T10:00:00Z"
"2026-08-21T10:00:00Z"
Show child attributes
Show child attributes
Show child attributes
Show child attributes