Getting Started
An API key is required for requests to be processed by the system. Once a user registers, an API key is automatically generated for this user. The API key must be sent with each request (see full example below). If the API key is not sent or is expired, there will be an error. Please make sure to keep your API key secret to prevent abuse.
Sign in to view your API key
Sign InAuthentication
To authenticate with the API system, you need to send your API key as an authorization token with each request. You can see sample code below.
curl --location --request POST 'https://linko.me/api/account' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/account",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/account',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: ''
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/account"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/account");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
Rate Limit
Our API has a rate limiter to safeguard against spike in requests to maximize its stability. Our rate limiter is currently caped at 30 requests per 1 minute.
Several headers will be sent alongside the response and these can be examined to determine various information about the request.
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: TIMESTAMP
Response Handling
All API response are returned in JSON format by default. To convert this into usable data, the appropriate function will need to be used according to the language. In PHP, the function json_decode() can be used to convert the data to either an object (default) or an array (set the second parameter to true). It is very important to check the error key as that provides information on whether there was an error or not. You can also check the header code.
{
"error": 1,
"message": "An error occurred"
}
Account
https://linko.me/api/account
Get Account
Returns information on the authenticated account, including preferences, the parsed billing address, 2FA status, and a permissions map mirroring the dashboard's plan gating.
curl --location --request GET 'https://linko.me/api/account' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/account",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/account',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/account"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/account");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"id": 1,
"email": "sample@domain.com",
"username": "sampleuser",
"name": "Sample User",
"avatar": "https:\/\/domain.com\/content\/avatar.png",
"status": "pro",
"planid": 7,
"expires": "2026-11-15 15:00:00",
"registered": "2020-11-10 18:01:43",
"verified": true,
"active": true,
"timezone": "America\/New_York",
"perpage": 50,
"newsletter": true,
"brokenlinks_email": true,
"media": false,
"public": false,
"defaulttype": "direct",
"domain": "https:\/\/l.example.com",
"has_2fa": false,
"address": {
"name": "Sample User",
"company": "Acme",
"type": "business",
"taxid": "",
"address": "1 Example St",
"city": "NYC",
"state": "NY",
"zip": "10001",
"country": "US"
},
"permissions": {
"alias": true,
"password": true,
"qrlogo": true,
"qrframes": true,
"utmtemplates": true
}
}
}
https://linko.me/api/account/update
Update Account
Partial update — every field is optional, only the keys you send are modified. Password changes require current_password for safety. Pro-only fields (defaulttype, domain) are silently ignored on free accounts. Avatar can be set via remote URL or cleared with null.
email
(optional) New email — must be unique.
username
(optional) New username — must be unique.
name
(optional) Display name.
password
(optional) New password (min 5 chars). Requires current_password.
current_password
(required when changing password) Your existing password, for confirmation.
timezone
(optional) IANA timezone string, e.g. "America/New_York".
perpage
(optional) Default rows per page in dashboard listings: 15, 50, or 100.
newsletter
(optional) Boolean — receive product newsletter.
brokenlinks_email
(optional) Boolean — receive broken-link digest emails.
media
(optional) Boolean — public profile photo / consent toggle.
public
(optional) Boolean — make profile page public.
defaulttype
(optional, pro) Default redirect type: direct | frame | splash.
domain
(optional, pro) Default branded domain to use when shortening.
mailchimpapikey
(optional) Mailchimp API key for newsletter widgets.
address
(optional) Billing address object: { name, company, type (personal|business), taxid, address, city, state, zip, country }.
avatar
(optional) Remote URL of a PNG/JPEG (resized server-side to 500x500). Send null to clear.
curl --location --request PUT 'https://linko.me/api/account/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "newemail@example.com",
"name": "Milad",
"timezone": "America\/New_York",
"perpage": 50,
"newsletter": true,
"brokenlinks_email": true,
"address": {
"name": "Milad",
"company": "Acme",
"type": "business",
"taxid": "",
"address": "1 Example St",
"city": "NYC",
"state": "NY",
"zip": "10001",
"country": "US"
},
"avatar": "https:\/\/example.com\/me.jpg"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/account/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"email": "newemail@example.com",
"name": "Milad",
"timezone": "America\/New_York",
"perpage": 50,
"newsletter": true,
"brokenlinks_email": true,
"address": {
"name": "Milad",
"company": "Acme",
"type": "business",
"taxid": "",
"address": "1 Example St",
"city": "NYC",
"state": "NY",
"zip": "10001",
"country": "US"
},
"avatar": "https:\/\/example.com\/me.jpg"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/account/update',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"email": "newemail@example.com",
"name": "Milad",
"timezone": "America\/New_York",
"perpage": 50,
"newsletter": true,
"brokenlinks_email": true,
"address": {
"name": "Milad",
"company": "Acme",
"type": "business",
"taxid": "",
"address": "1 Example St",
"city": "NYC",
"state": "NY",
"zip": "10001",
"country": "US"
},
"avatar": "https:\/\/example.com\/me.jpg"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/account/update"
payload = {
"email": "newemail@example.com",
"name": "Milad",
"timezone": "America/New_York",
"perpage": 50,
"newsletter": true,
"brokenlinks_email": true,
"address": {
"name": "Milad",
"company": "Acme",
"type": "business",
"taxid": "",
"address": "1 Example St",
"city": "NYC",
"state": "NY",
"zip": "10001",
"country": "US"
},
"avatar": "https://example.com/me.jpg"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/account/update");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"email\":\"newemail@example.com\",\"name\":\"Milad\",\"timezone\":\"America\\/New_York\",\"perpage\":50,\"newsletter\":true,\"brokenlinks_email\":true,\"address\":{\"name\":\"Milad\",\"company\":\"Acme\",\"type\":\"business\",\"taxid\":\"\",\"address\":\"1 Example St\",\"city\":\"NYC\",\"state\":\"NY\",\"zip\":\"10001\",\"country\":\"US\"},\"avatar\":\"https:\\/\\/example.com\\/me.jpg\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Account has been successfully updated."
}
https://linko.me/api/account/api/regenerate
Regenerate API Key
Rotates your primary API key. Custom API keys (managed under /developers/apikeys) are not affected. If you call this with the primary key itself, your next request will fail with the old key — pass {"force": true} to confirm.
force
(required when calling with the primary key) Boolean — confirm you want to rotate the key you are using.
curl --location --request POST 'https://linko.me/api/account/api/regenerate' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"force": true
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/account/api/regenerate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"force": true
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/account/api/regenerate',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"force": true
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/account/api/regenerate"
payload = {
"force": true
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/account/api/regenerate");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"force\":true}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "API key has been regenerated. Save it now \u2014 it is not retrievable later.",
"data": {
"api_key": "a1b2c3d4..."
}
}
https://linko.me/api/account/2fa/setup
Set up 2FA
Generates a fresh TOTP secret and otpauth URL. The secret is cached for 2 minutes — confirm it via /account/2fa/enable with the matching code from your authenticator app. Calling this endpoint does NOT enable 2FA.
curl --location --request POST 'https://linko.me/api/account/2fa/setup' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/account/2fa/setup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/account/2fa/setup',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/account/2fa/setup"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/account/2fa/setup");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"secret": "JBSWY3DPEHPK3PXP",
"otpauth_url": "otpauth:\/\/totp\/Linko:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Linko",
"expires_in": 120
}
}
https://linko.me/api/account/2fa/enable
Enable 2FA
Confirms the secret returned by /account/2fa/setup using the current code from your authenticator app.
code
(required) 6-digit TOTP code from your authenticator app.
curl --location --request POST 'https://linko.me/api/account/2fa/enable' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"code": "123456"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/account/2fa/enable",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"code": "123456"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/account/2fa/enable',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"code": "123456"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/account/2fa/enable"
payload = {
"code": "123456"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/account/2fa/enable");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"code\":\"123456\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "2FA has been enabled. Back up the secret in case you lose access to your authenticator."
}
https://linko.me/api/account/2fa/disable
Disable 2FA
Turns off 2FA. Requires either a current TOTP code OR your current_password — this prevents a stolen API key from silently disabling 2FA.
code
(optional) 6-digit TOTP code from your authenticator app.
current_password
(optional) Your current account password. Either code or current_password is required.
curl --location --request POST 'https://linko.me/api/account/2fa/disable' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"code": "123456"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/account/2fa/disable",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"code": "123456"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/account/2fa/disable',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"code": "123456"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/account/2fa/disable"
payload = {
"code": "123456"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/account/2fa/disable");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"code\":\"123456\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "2FA has been disabled."
}
Branded Domains
Manage custom branded domains. Domains are validated against DNS at creation time and are then automatically activated on our servers and provisioned with SSL by a 10-minute background job.
https://linko.me/api/domains?limit=2&page=1
List Branded Domains
Returns the user's branded domains, plus any platform domains they're entitled to use (these have id=null and platform=true).
limit
(optional) Per page data result
page
(optional) Current page request
curl --location --request GET 'https://linko.me/api/domains?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/domains?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/domains?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/domains?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/domains?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"domains": [
{
"id": 1,
"domain": "https:\/\/domain1.com",
"redirectroot": "https:\/\/rootdomain.com",
"redirect404": "https:\/\/rootdomain.com\/404",
"bioid": null,
"logo": null,
"favicon": null,
"status": 1,
"dns_type": "direct",
"dns_status": 1,
"ssl_status": 1,
"server_synced": 1,
"resolved_ip": "3.213.147.88",
"dns_checked_at": "2026-05-26 04:00:00",
"dns_failure_count": 0
},
{
"id": 2,
"domain": "https:\/\/domain2.com",
"redirectroot": null,
"redirect404": null,
"bioid": 7,
"logo": "\/content\/images\/logo.png",
"favicon": "\/content\/images\/icon.png",
"status": 1,
"dns_type": "cloudflare",
"dns_status": 1,
"ssl_status": 0,
"server_synced": 1,
"resolved_ip": "104.21.0.1",
"dns_checked_at": "2026-05-26 04:05:00",
"dns_failure_count": 0
}
]
}
}
https://linko.me/api/domain/:id
Get a Single Domain
Returns full details for one domain, including DNS, SSL, and server-sync status.
curl --location --request GET 'https://linko.me/api/domain/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/domain/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/domain/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/domain/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/domain/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"id": 1,
"domain": "https:\/\/domain1.com",
"redirectroot": "https:\/\/rootdomain.com",
"redirect404": "https:\/\/rootdomain.com\/404",
"bioid": null,
"logo": null,
"favicon": null,
"status": 1,
"dns_type": "direct",
"dns_status": 1,
"ssl_status": 1,
"server_synced": 1,
"resolved_ip": "3.213.147.88",
"dns_checked_at": "2026-05-26 04:00:00",
"dns_failure_count": 0
}
}
https://linko.me/api/domain/add
Create a Branded Domain
Register a new branded domain. The endpoint runs an instant DNS check — if your domain doesn't resolve to Linko's server (or to Cloudflare in front of Linko) the request is rejected with the resolved IP. On success, a 10-minute background job activates the domain on our servers and provisions SSL.
domain
(required) Hostname (with or without https://). Stored as https://<host>.
redirectroot
(optional) Where the bare domain should redirect to. Mutually exclusive with bioid.
redirect404
(optional) Where unknown short links on this domain should redirect.
bioid
(optional) Bind the domain to a bio profile. Mutually exclusive with redirectroot. Plan-gated by bio.
logo
(optional) URL of a remote PNG/JPEG logo (max 500KB).
favicon
(optional) URL of a remote PNG/JPEG favicon (max 100KB).
curl --location --request POST 'https://linko.me/api/domain/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"domain": "https:\/\/domain1.com",
"redirectroot": "https:\/\/rootdomain.com",
"redirect404": "https:\/\/rootdomain.com\/404",
"logo": "https:\/\/site.com\/logo.png",
"favicon": "https:\/\/site.com\/favicon.png"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/domain/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"domain": "https:\/\/domain1.com",
"redirectroot": "https:\/\/rootdomain.com",
"redirect404": "https:\/\/rootdomain.com\/404",
"logo": "https:\/\/site.com\/logo.png",
"favicon": "https:\/\/site.com\/favicon.png"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/domain/add',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"domain": "https:\/\/domain1.com",
"redirectroot": "https:\/\/rootdomain.com",
"redirect404": "https:\/\/rootdomain.com\/404",
"logo": "https:\/\/site.com\/logo.png",
"favicon": "https:\/\/site.com\/favicon.png"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/domain/add"
payload = {
"domain": "https://domain1.com",
"redirectroot": "https://rootdomain.com",
"redirect404": "https://rootdomain.com/404",
"logo": "https://site.com/logo.png",
"favicon": "https://site.com/favicon.png"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/domain/add");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"domain\":\"https:\\/\\/domain1.com\",\"redirectroot\":\"https:\\/\\/rootdomain.com\",\"redirect404\":\"https:\\/\\/rootdomain.com\\/404\",\"logo\":\"https:\\/\\/site.com\\/logo.png\",\"favicon\":\"https:\\/\\/site.com\\/favicon.png\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 1,
"message": "Domain added. SSL certificate will be issued within 10 minutes.",
"data": {
"id": 1,
"domain": "https:\/\/domain1.com",
"redirectroot": "https:\/\/rootdomain.com",
"dns_type": "direct",
"dns_status": 1,
"server_synced": 0,
"resolved_ip": "3.213.147.88"
}
}
https://linko.me/api/domain/:id/update
Update Domain
Partial update — every field is optional, only the keys you send are modified. The hostname itself is immutable; create a new domain to change it.
redirectroot
(optional) Root redirect URL.
redirect404
(optional) 404 redirect URL.
bioid
(optional) Bio profile to bind. Send 0 or null to clear and revert to redirectroot. Plan-gated by bio.
logo
(optional) New logo URL — replaces the existing logo file.
favicon
(optional) New favicon URL — replaces the existing favicon file.
curl --location --request PUT 'https://linko.me/api/domain/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"redirectroot": "https:\/\/rootdomain-new.com",
"redirect404": "https:\/\/rootdomain-new.com\/404"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/domain/:id/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"redirectroot": "https:\/\/rootdomain-new.com",
"redirect404": "https:\/\/rootdomain-new.com\/404"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/domain/:id/update',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"redirectroot": "https:\/\/rootdomain-new.com",
"redirect404": "https:\/\/rootdomain-new.com\/404"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/domain/:id/update"
payload = {
"redirectroot": "https://rootdomain-new.com",
"redirect404": "https://rootdomain-new.com/404"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/domain/:id/update");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"redirectroot\":\"https:\\/\\/rootdomain-new.com\",\"redirect404\":\"https:\\/\\/rootdomain-new.com\\/404\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Domain has been updated successfully.",
"data": {
"id": 1,
"domain": "https:\/\/domain1.com",
"redirectroot": "https:\/\/rootdomain-new.com"
}
}
https://linko.me/api/domain/:id/check
Re-check DNS
Force a fresh DNS check immediately instead of waiting for the 10-minute background job. Updates dns_type, dns_status, resolved_ip, and dns_checked_at on the domain row.
curl --location --request POST 'https://linko.me/api/domain/:id/check' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/domain/:id/check",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/domain/:id/check',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/domain/:id/check"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/domain/:id/check");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "DNS is valid.",
"data": {
"id": 1,
"dns_type": "direct",
"dns_status": 1,
"resolved_ip": "3.213.147.88",
"dns_checked_at": "2026-05-26 04:30:00"
}
}
https://linko.me/api/domain/:id/delete
Delete Domain
Removes the domain from our servers (if synced), unbinds short links pointing at this domain, then deletes the row.
curl --location --request DELETE 'https://linko.me/api/domain/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/domain/:id/delete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'DELETE',
'url': 'https://linko.me/api/domain/:id/delete',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/domain/:id/delete"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://linko.me/api/domain/:id/delete");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Domain has been deleted successfully."
}
CTA Overlays
List the user's saved CTA overlays. Read-only — overlays themselves are created and edited from the dashboard. The list is what you select from when assigning an overlay-{id} to a short link via the type field on POST /url/add.
https://linko.me/api/overlay?limit=2&page=1
List CTA Overlays
Returns the user's overlays, newest first, with a friendly type label and the count of short links currently using each overlay.
limit
(optional) Per page data result
page
(optional) Current page request
curl --location --request GET 'https://linko.me/api/overlay?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/overlay?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/overlay?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/overlay?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/overlay?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"overlay": [
{
"id": 2,
"type": "contact",
"type_label": "CTA Contact",
"name": "Contact Page",
"urlcount": 3,
"date": "2020-11-10 18:10:00"
},
{
"id": 1,
"type": "message",
"type_label": "CTA Message",
"name": "Product 1 Promo",
"urlcount": 14,
"date": "2020-11-10 18:00:00"
}
]
}
}
Campaigns
Campaigns group short links for aggregate stats and rotator pages. Each campaign can have a public list and a rotator slug, and optionally a custom branded domain.
https://linko.me/api/campaigns?limit=2&page=1
List Campaigns
Returns the user's campaigns alphabetically, with the count of links assigned to each.
limit
(optional) Per page data result
page
(optional) Current page request
q
(optional) Filter by name (LIKE %q%, min 2 chars).
curl --location --request GET 'https://linko.me/api/campaigns?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/campaigns?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/campaigns?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/campaigns?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/campaigns?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"campaigns": [
{
"id": 1,
"name": "Sample Campaign",
"slug": "sample",
"public": false,
"domain": null,
"rotator": false,
"list": "https:\/\/domain.com\/u\/admin\/sample-1",
"views": 0,
"urlcount": 14,
"date": "2020-11-10 18:00:00"
},
{
"id": 2,
"name": "Facebook Campaign",
"slug": "fb",
"public": true,
"domain": "https:\/\/l.example.com",
"rotator": "https:\/\/domain.com\/r\/fb",
"list": "https:\/\/domain.com\/u\/admin\/fb-2",
"views": 187,
"urlcount": 3,
"date": "2020-11-12 09:00:00"
}
]
}
}
https://linko.me/api/campaign/:id
Get a Single Campaign
Returns the campaign metadata plus a paginated list of links assigned to it (newest-clicked first). Each link includes its click count so a client can render a campaign stats table without N round-trips.
limit
(optional) Per page data result
page
(optional) Current page request
curl --location --request GET 'https://linko.me/api/campaign/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/campaign/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/campaign/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/campaign/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/campaign/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"campaign": {
"id": 2,
"name": "Facebook Campaign",
"slug": "fb",
"public": true,
"domain": "https:\/\/l.example.com",
"rotator": "https:\/\/domain.com\/r\/fb",
"list": "https:\/\/domain.com\/u\/admin\/fb-2",
"views": 187,
"urlcount": 3,
"date": "2020-11-12 09:00:00"
},
"result": 3,
"perpage": 15,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"links": [
{
"id": 17,
"title": "Promo page",
"longurl": "https:\/\/example.com\/promo",
"shorturl": "https:\/\/l.example.com\/promo",
"clicks": 142,
"uniqueclicks": 98,
"date": "2020-11-12 09:30:00"
}
]
}
}
https://linko.me/api/campaign/add
Create a Campaign
A campaign can be added using this endpoint.
name
(required) Campaign name (min 2 chars)
slug
(optional) Rotator slug. Defaults to a random 6-char string.
public
(optional) Whether the campaign list page is public (true / false).
domain
(optional) Custom domain for the campaign rotator. Must be one of your branded domains or a platform domain you're entitled to.
curl --location --request POST 'https://linko.me/api/campaign/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "New Campaign",
"slug": "new-campaign",
"public": true,
"domain": "https:\/\/l.example.com"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/campaign/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"name": "New Campaign",
"slug": "new-campaign",
"public": true,
"domain": "https:\/\/l.example.com"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/campaign/add',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"name": "New Campaign",
"slug": "new-campaign",
"public": true,
"domain": "https:\/\/l.example.com"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/campaign/add"
payload = {
"name": "New Campaign",
"slug": "new-campaign",
"public": true,
"domain": "https://l.example.com"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/campaign/add");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"name\":\"New Campaign\",\"slug\":\"new-campaign\",\"public\":true,\"domain\":\"https:\\/\\/l.example.com\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 3,
"data": {
"id": 3,
"name": "New Campaign",
"slug": "new-campaign",
"public": true,
"domain": "https:\/\/l.example.com",
"rotator": "https:\/\/l.example.com\/r\/new-campaign",
"list": "https:\/\/domain.com\/u\/admin\/new-campaign-3",
"views": 0,
"urlcount": 0
}
}
https://linko.me/api/campaign/:campaignid/assign/:linkid
Assign a Link to a Campaign
A short link can be assigned to a campaign using this endpoint. The endpoint requires the campaign ID and the short link ID.
curl --location --request POST 'https://linko.me/api/campaign/:campaignid/assign/:linkid' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/campaign/:campaignid/assign/:linkid",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/campaign/:campaignid/assign/:linkid',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/campaign/:campaignid/assign/:linkid"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/campaign/:campaignid/assign/:linkid");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Link successfully added to the campaign."
}
https://linko.me/api/campaign/:campaignid/unassign/:linkid
Remove a Link from a Campaign
Detaches a link from a campaign without deleting the link itself.
curl --location --request POST 'https://linko.me/api/campaign/:campaignid/unassign/:linkid' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/campaign/:campaignid/unassign/:linkid",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/campaign/:campaignid/unassign/:linkid',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/campaign/:campaignid/unassign/:linkid"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/campaign/:campaignid/unassign/:linkid");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Link removed from the campaign."
}
https://linko.me/api/campaign/:id/update
Update Campaign
Partial update — every field is optional, only the keys you send are modified. Send domain="" or domain=null to clear it.
name
(optional) Campaign name (min 2 chars when sent)
slug
(optional) Rotator slug. Cannot collide with another user's slug.
public
(optional) Public access (true / false)
domain
(optional) Custom domain. Send empty to clear.
curl --location --request PUT 'https://linko.me/api/campaign/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": true,
"domain": "https:\/\/l.example.com"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/campaign/:id/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": true,
"domain": "https:\/\/l.example.com"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/campaign/:id/update',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": true,
"domain": "https:\/\/l.example.com"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/campaign/:id/update"
payload = {
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": true,
"domain": "https://l.example.com"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/campaign/:id/update");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"name\":\"Twitter Campaign\",\"slug\":\"twitter-campaign\",\"public\":true,\"domain\":\"https:\\/\\/l.example.com\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 3,
"data": {
"id": 3,
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": true,
"domain": "https:\/\/l.example.com",
"rotator": "https:\/\/l.example.com\/r\/twitter-campaign",
"list": "https:\/\/domain.com\/u\/admin\/twitter-campaign-3",
"views": 0,
"urlcount": 12
}
}
https://linko.me/api/campaign/:id/delete
Delete Campaign
Detaches every link from the campaign (so they don't carry a stale bundle id) and then deletes the campaign row. The links themselves are not deleted.
curl --location --request DELETE 'https://linko.me/api/campaign/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/campaign/:id/delete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'DELETE',
'url': 'https://linko.me/api/campaign/:id/delete',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/campaign/:id/delete"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://linko.me/api/campaign/:id/delete");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Campaign has been deleted successfully."
}
Channels
Channels group short links, bio pages, and QR codes for organization. Counterpart of Campaigns; channels are mostly used for "by source" categorization.
https://linko.me/api/channels?limit=2&page=1
List Channels
Returns the user's channels alphabetically, with a count of items currently assigned to each.
limit
(optional) Per page data result
page
(optional) Current page request
q
(optional) Filter by name (LIKE %q%, min 2 chars).
filter
(optional) Set to "starred" to return only starred channels.
curl --location --request GET 'https://linko.me/api/channels?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/channels?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/channels?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/channels?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/channels?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"channels": [
{
"id": 1,
"name": "Channel 1",
"description": "Description of channel 1",
"color": "#000000",
"starred": true,
"count": 14
},
{
"id": 2,
"name": "Channel 2",
"description": "Description of channel 2",
"color": "#FF0000",
"starred": false,
"count": 0
}
]
}
}
https://linko.me/api/channel/:id?limit=1&page=1
List Channel Items
Returns the items currently assigned to a channel, newest first. Each item includes a preview link, click count (views), and a representative icon.
limit
(optional) Per page data result
page
(optional) Current page request
type
(optional) Filter by item type — "links", "bio", or "qr".
curl --location --request GET 'https://linko.me/api/channel/:id?limit=1&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/channel/:id?limit=1&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/channel/:id?limit=1&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/channel/:id?limit=1&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/channel/:id?limit=1&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"items": [
{
"type": "links",
"id": 1,
"title": "My Sample Link",
"preview": "https:\/\/google.com",
"link": "https:\/\/linko.me\/google",
"icon": "https:\/\/linko.me\/google\/i",
"views": 142,
"date": "2022-05-12"
},
{
"type": "bio",
"id": 1,
"title": "My Sample Bio",
"preview": "https:\/\/linko.me\/mybio",
"link": "https:\/\/linko.me\/mybio",
"icon": "\/content\/profile\/me.png",
"views": 98,
"date": "2022-06-01"
}
]
}
}
https://linko.me/api/channel/add
Create a Channel
A channel can be added using this endpoint.
name
(required) Channel name (min 2 chars)
description
(optional) Channel description
color
(optional) Channel badge color (HEX)
starred
(optional) Star the channel or not (true or false)
curl --location --request POST 'https://linko.me/api/channel/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/channel/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/channel/add',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/channel/add"
payload = {
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/channel/add");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"name\":\"New Channel\",\"description\":\"my new channel\",\"color\":\"#000000\",\"starred\":true}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 3,
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}
https://linko.me/api/channel/:channelid/assign/:type/:itemid
Assign an Item to a Channel
Assign a link, bio page, or QR code to a channel.
:channelid
(required) Channel ID
:type
(required) links | bio | qr
:itemid
(required) Item ID
curl --location --request POST 'https://linko.me/api/channel/:channelid/assign/:type/:itemid' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/channel/:channelid/assign/:type/:itemid",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/channel/:channelid/assign/:type/:itemid',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/channel/:channelid/assign/:type/:itemid"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/channel/:channelid/assign/:type/:itemid");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Link successfully added to the channel."
}
https://linko.me/api/channel/:channelid/remove/:type/:itemid
Remove an Item from a Channel
Detaches an item from a channel without deleting the underlying item.
:channelid
(required) Channel ID
:type
(required) links | bio | qr
:itemid
(required) Item ID
curl --location --request POST 'https://linko.me/api/channel/:channelid/remove/:type/:itemid' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/channel/:channelid/remove/:type/:itemid",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/channel/:channelid/remove/:type/:itemid',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/channel/:channelid/remove/:type/:itemid"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/channel/:channelid/remove/:type/:itemid");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Item removed from the channel."
}
https://linko.me/api/channel/:id/update
Update Channel
Partial update — every field is optional. Description accepts an empty string to clear it; name still requires min 2 characters when sent.
name
(optional) Channel name (min 2 chars when sent)
description
(optional) Channel description; send "" to clear
color
(optional) Channel badge color (HEX)
starred
(optional) Star the channel or not (true or false)
curl --location --request PUT 'https://linko.me/api/channel/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Acme Corp",
"description": "channel for items for Acme Corp",
"color": "#FFFFFF",
"starred": false
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/channel/:id/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"name": "Acme Corp",
"description": "channel for items for Acme Corp",
"color": "#FFFFFF",
"starred": false
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/channel/:id/update',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"name": "Acme Corp",
"description": "channel for items for Acme Corp",
"color": "#FFFFFF",
"starred": false
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/channel/:id/update"
payload = {
"name": "Acme Corp",
"description": "channel for items for Acme Corp",
"color": "#FFFFFF",
"starred": false
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/channel/:id/update");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"name\":\"Acme Corp\",\"description\":\"channel for items for Acme Corp\",\"color\":\"#FFFFFF\",\"starred\":false}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 3,
"name": "Acme Corp",
"description": "channel for items for Acme Corp",
"color": "#FFFFFF",
"starred": false
}
https://linko.me/api/channel/:id/delete
Delete Channel
Deletes the channel and unassigns every item from it. The underlying links / bios / qrs are not deleted.
curl --location --request DELETE 'https://linko.me/api/channel/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/channel/:id/delete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'DELETE',
'url': 'https://linko.me/api/channel/:id/delete',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/channel/:id/delete"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://linko.me/api/channel/:id/delete");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Channel has been deleted successfully."
}
Custom Splash
List the user's saved custom splash pages. Read-only — splash pages are created and edited from the dashboard. The list is what you select from when setting type to a numeric splash id on POST /url/add.
https://linko.me/api/splash?limit=2&page=1
List Custom Splash
Returns the user's splash pages, newest first, with the count of short links currently using each splash. Supports a name search filter.
limit
(optional) Per page data result
page
(optional) Current page request
q
(optional) Filter by name (LIKE %q%).
curl --location --request GET 'https://linko.me/api/splash?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/splash?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/splash?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/splash?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/splash?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"splash": [
{
"id": 2,
"name": "Product 2 Promo",
"urlcount": 0,
"date": "2020-11-10 18:10:00"
},
{
"id": 1,
"name": "Product 1 Promo",
"urlcount": 5,
"date": "2020-11-10 18:00:00"
}
]
}
}
Files
https://linko.me/api/files?limit=2&page=1
List Files
Get all of your files. You can also search by name.
name
(optional) Search for a file by name
limit
(optional) Per page data result
page
(optional) Current page request
curl --location --request GET 'https://linko.me/api/files?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/files?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/files?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/files?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/files?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"result": 3,
"perpage": 15,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"list": [
{
"id": 1,
"name": "My Photo",
"downloads": 10,
"shorturl": "https:\/\/linko.me\/Kdbyz",
"date": "2022-08-09 17:00:00"
},
{
"id": 2,
"name": "My Documents",
"downloads": 15,
"shorturl": "https:\/\/linko.me\/GLpZy",
"date": "2022-08-10 17:01:00"
},
{
"id": 3,
"name": "My Files",
"downloads": 5,
"shorturl": "https:\/\/linko.me\/puyuh",
"date": "2022-08-11 19:01:00"
}
]
}
https://linko.me/api/files/upload/:filename?name=My+File
Upload a file
Upload a file by sending the binary data as the post body. You need to send the file name including the extension instead of :filename in the url (e.g. brandkit.zip). You can set options by sending the following parameters.
name
(optional) File name
custom
(optional) Custom alias instead of random alias.
domain
(optional) Custom Domain
password
(optional) Password protection
expiry
(optional) Expiration for the download example 2021-09-28
maxdownloads
(optional) Maximum number of downloads
curl --location --request POST 'https://linko.me/api/files/upload/:filename?name=My+File' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '"BINARY DATA"'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/files/upload/:filename?name=My+File",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '"BINARY DATA"',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/files/upload/:filename?name=My+File',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify("BINARY DATA"),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/files/upload/:filename?name=My+File"
payload = "BINARY DATA"
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/files/upload/:filename?name=My+File");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("\"BINARY DATA\"", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 1,
"shorturl": "https:\/\/linko.me\/SVPnM"
}
Links
https://linko.me/api/urls?limit=2&page=1&order=date
List Links
To get your links via the API, you can use this endpoint. You can also filter data (See table for more info).
limit
(optional) Per page data result
page
(optional) Current page request
order
(optional) Sort data between date or click
short
(optional) Search using the short url. Note that when you use the short parameter, all other parameters are ignored and if there is a match a Single Link response will be returned.
q
(optional) Search for links using a keyword
curl --location --request GET 'https://linko.me/api/urls?limit=2&page=1&order=date' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/urls?limit=2&page=1&order=date",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/urls?limit=2&page=1&order=date',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/urls?limit=2&page=1&order=date"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/urls?limit=2&page=1&order=date");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": 1,
"maxpage": 1,
"urls": [
{
"id": 2,
"alias": "google",
"shorturl": "https:\/\/linko.me\/google",
"longurl": "https:\/\/google.com",
"clicks": 0,
"title": "Google",
"description": "",
"date": "2020-11-10 18:01:43"
},
{
"id": 1,
"alias": "googlecanada",
"shorturl": "https:\/\/linko.me\/googlecanada",
"longurl": "https:\/\/google.ca",
"clicks": 0,
"title": "Google Canada",
"description": "",
"date": "2020-11-10 18:00:25"
}
]
}
}
https://linko.me/api/url/:id
Get a Single Link
To get details for a single link via the API, you can use this endpoint.
curl --location --request GET 'https://linko.me/api/url/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/url/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/url/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/url/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/url/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 1,
"details": {
"id": 1,
"shorturl": "https:\/\/linko.me\/googlecanada",
"longurl": "https:\/\/google.com",
"title": "Google",
"description": "",
"location": {
"canada": "https:\/\/google.ca",
"united states": "https:\/\/google.us"
},
"device": {
"iphone": "https:\/\/google.com",
"android": "https:\/\/google.com"
},
"expiry": null,
"date": "2020-11-10 18:01:43"
},
"data": {
"clicks": 0,
"uniqueClicks": 0,
"topCountries": 0,
"topReferrers": 0,
"topBrowsers": 0,
"topOs": 0,
"socialCount": {
"facebook": 0,
"twitter": 0,
"google": 0
}
}
}
https://linko.me/api/url/add
Shorten a Link
To shorten a link, you need to send a valid data in JSON via a POST request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).
url
(required) Long URL to shorten.
urls
(optional) Array of long URLs for bulk shortening (max 10). When set, all other fields apply to every URL and the response is an array of results.
custom
(optional) Custom alias instead of random alias.
type
(optional) Redirection type [direct, frame, splash], only id for custom splash page or overlay-id for cta pages
password
(optional) Password protection
domain
(optional) Custom Domain
expiry
(optional) Expiration for the link example 2021-09-28 23:11:16
startdate
(optional) Schedule the link to activate at a future datetime, format YYYY-MM-DD HH:MM:SS.
clicklimit
(optional) Maximum number of clicks before the link expires.
expirationredirect
(optional) URL to redirect users to once the link expires.
codes
(optional) HTTP redirect status code [301, 302, 307]. Defaults to 301.
hidereferrer
(optional) Hide the referrer header (true / false).
geotarget
(optional) Geo targeting data
devicetarget
(optional) Device targeting data
languagetarget
(optional) Language targeting data
parameters
(optional) Array of custom URL parameters appended on redirect.
utmtemplate
(optional) ID of a saved UTM template (see /utm-templates). Pre-fills UTM and custom parameters; any explicit parameters[] override template values for the same key.
abtesting
(optional) Array of rotator links for A/B testing. Each item: { link, percent, description }.
ips
(optional) IP whitelist / blacklist. Object with keys: list (newline-separated whitelist), banlist (newline-separated blacklist), link (fallback URL).
metatitle
(optional) Meta title
metadescription
(optional) Meta description
metaimage
(optional) Link to a jpg or png image
description
(optional) Note or description
pixels
(optional) Array of pixel ids
channel
(optional) Channel ID
campaign
(optional) Campaign ID
deeplink
(optional) Object containing app store links. When using this, it is important to set device targeting as well. (New) You can now set the parameter "auto" to true to automatically generate the deep links from provided long link.
status
(optional) public or private (default)
curl --location --request POST 'https://linko.me/api/url/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https:\/\/google.com",
"status": "private",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https:\/\/example.com\/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"metatitle": "Not Google",
"metadescription": "Not Google description",
"metaimage": "https:\/\/www.mozilla.org\/media\/protocol\/img\/logos\/firefox\/browser\/og.4ad05d4125a5.png",
"description": "For facebook",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"campaign": 1,
"deeplink": {
"auto": true,
"apple": "https:\/\/apps.apple.com\/us\/app\/google\/id284815942",
"google": "https:\/\/play.google.com\/store\/apps\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https:\/\/google.ca"
},
{
"location": "United States",
"link": "https:\/\/google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https:\/\/google.com"
},
{
"device": "Android",
"link": "https:\/\/google.com"
}
],
"languagetarget": [
{
"language": "en",
"link": "https:\/\/google.com"
},
{
"language": "fr",
"link": "https:\/\/google.ca"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https:\/\/google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https:\/\/google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https:\/\/example.com\/blocked"
}
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/url/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"url": "https:\/\/google.com",
"status": "private",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https:\/\/example.com\/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"metatitle": "Not Google",
"metadescription": "Not Google description",
"metaimage": "https:\/\/www.mozilla.org\/media\/protocol\/img\/logos\/firefox\/browser\/og.4ad05d4125a5.png",
"description": "For facebook",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"campaign": 1,
"deeplink": {
"auto": true,
"apple": "https:\/\/apps.apple.com\/us\/app\/google\/id284815942",
"google": "https:\/\/play.google.com\/store\/apps\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https:\/\/google.ca"
},
{
"location": "United States",
"link": "https:\/\/google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https:\/\/google.com"
},
{
"device": "Android",
"link": "https:\/\/google.com"
}
],
"languagetarget": [
{
"language": "en",
"link": "https:\/\/google.com"
},
{
"language": "fr",
"link": "https:\/\/google.ca"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https:\/\/google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https:\/\/google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https:\/\/example.com\/blocked"
}
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/url/add',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"url": "https:\/\/google.com",
"status": "private",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https:\/\/example.com\/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"metatitle": "Not Google",
"metadescription": "Not Google description",
"metaimage": "https:\/\/www.mozilla.org\/media\/protocol\/img\/logos\/firefox\/browser\/og.4ad05d4125a5.png",
"description": "For facebook",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"campaign": 1,
"deeplink": {
"auto": true,
"apple": "https:\/\/apps.apple.com\/us\/app\/google\/id284815942",
"google": "https:\/\/play.google.com\/store\/apps\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https:\/\/google.ca"
},
{
"location": "United States",
"link": "https:\/\/google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https:\/\/google.com"
},
{
"device": "Android",
"link": "https:\/\/google.com"
}
],
"languagetarget": [
{
"language": "en",
"link": "https:\/\/google.com"
},
{
"language": "fr",
"link": "https:\/\/google.ca"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https:\/\/google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https:\/\/google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https:\/\/example.com\/blocked"
}
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/url/add"
payload = {
"url": "https://google.com",
"status": "private",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https://example.com/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"metatitle": "Not Google",
"metadescription": "Not Google description",
"metaimage": "https://www.mozilla.org/media/protocol/img/logos/firefox/browser/og.4ad05d4125a5.png",
"description": "For facebook",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"campaign": 1,
"deeplink": {
"auto": true,
"apple": "https://apps.apple.com/us/app/google/id284815942",
"google": "https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https://google.ca"
},
{
"location": "United States",
"link": "https://google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https://google.com"
},
{
"device": "Android",
"link": "https://google.com"
}
],
"languagetarget": [
{
"language": "en",
"link": "https://google.com"
},
{
"language": "fr",
"link": "https://google.ca"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https://google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https://google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https://example.com/blocked"
}
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/url/add");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"url\":\"https:\\/\\/google.com\",\"status\":\"private\",\"custom\":\"google\",\"password\":\"mypass\",\"expiry\":\"2020-11-11 12:00:00\",\"startdate\":\"2020-11-01 09:00:00\",\"clicklimit\":1000,\"expirationredirect\":\"https:\\/\\/example.com\\/expired\",\"codes\":302,\"hidereferrer\":true,\"type\":\"splash\",\"metatitle\":\"Not Google\",\"metadescription\":\"Not Google description\",\"metaimage\":\"https:\\/\\/www.mozilla.org\\/media\\/protocol\\/img\\/logos\\/firefox\\/browser\\/og.4ad05d4125a5.png\",\"description\":\"For facebook\",\"pixels\":[1,2,3,4],\"channel\":1,\"campaign\":1,\"deeplink\":{\"auto\":true,\"apple\":\"https:\\/\\/apps.apple.com\\/us\\/app\\/google\\/id284815942\",\"google\":\"https:\\/\\/play.google.com\\/store\\/apps\\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US\"},\"geotarget\":[{\"location\":\"Canada\",\"link\":\"https:\\/\\/google.ca\"},{\"location\":\"United States\",\"link\":\"https:\\/\\/google.us\"}],\"devicetarget\":[{\"device\":\"iPhone\",\"link\":\"https:\\/\\/google.com\"},{\"device\":\"Android\",\"link\":\"https:\\/\\/google.com\"}],\"languagetarget\":[{\"language\":\"en\",\"link\":\"https:\\/\\/google.com\"},{\"language\":\"fr\",\"link\":\"https:\\/\\/google.ca\"}],\"parameters\":[{\"name\":\"utm_source\",\"value\":\"newsletter\"},{\"name\":\"utm_medium\",\"value\":\"email\"}],\"utmtemplate\":3,\"abtesting\":[{\"link\":\"https:\\/\\/google.com\",\"percent\":50,\"description\":\"Variant A\"},{\"link\":\"https:\\/\\/google.ca\",\"percent\":50,\"description\":\"Variant B\"}],\"ips\":{\"list\":\"1.2.3.4\\n5.6.7.8\",\"banlist\":\"9.10.11.12\",\"link\":\"https:\\/\\/example.com\\/blocked\"}}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 3,
"shorturl": "https:\/\/linko.me\/google"
}
https://linko.me/api/url/:id/update
Update Link
To update a link, you need to send a valid data in JSON via a PUT request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).
url
(required) Long URL to shorten.
custom
(optional) Custom alias instead of random alias.
type
(optional) Redirection type [direct, frame, splash]
password
(optional) Password protection
domain
(optional) Custom Domain
expiry
(optional) Expiration for the link example 2021-09-28 23:11:16
startdate
(optional) Schedule the link to activate at a future datetime, format YYYY-MM-DD HH:MM:SS.
clicklimit
(optional) Maximum number of clicks before the link expires.
expirationredirect
(optional) URL to redirect users to once the link expires.
codes
(optional) HTTP redirect status code [301, 302, 307].
hidereferrer
(optional) Hide the referrer header (true / false).
geotarget
(optional) Geo targeting data
devicetarget
(optional) Device targeting data
languagetarget
(optional) Language targeting data
parameters
(optional) Array of custom URL parameters appended on redirect.
utmtemplate
(optional) ID of a saved UTM template (see /utm-templates). Pre-fills UTM and custom parameters; any explicit parameters[] override template values for the same key.
abtesting
(optional) Array of rotator links for A/B testing. Each item: { link, percent, description }.
ips
(optional) IP whitelist / blacklist. Object with keys: list, banlist, link.
metatitle
(optional) Meta title
metadescription
(optional) Meta description
metaimage
(optional) Link to a jpg or png image
pixels
(optional) Array of pixel ids
channel
(optional) Channel ID
campaign
(optional) Campaign ID
deeplink
(optional) Object containing app store links. When using this, it is important to set device targeting as well.
curl --location --request PUT 'https://linko.me/api/url/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https:\/\/google.com",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https:\/\/example.com\/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"deeplink": {
"apple": "https:\/\/apps.apple.com\/us\/app\/google\/id284815942",
"google": "https:\/\/play.google.com\/store\/apps\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https:\/\/google.ca"
},
{
"location": "United States",
"link": "https:\/\/google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https:\/\/google.com"
},
{
"device": "Android",
"link": "https:\/\/google.com"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https:\/\/google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https:\/\/google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https:\/\/example.com\/blocked"
}
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/url/:id/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"url": "https:\/\/google.com",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https:\/\/example.com\/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"deeplink": {
"apple": "https:\/\/apps.apple.com\/us\/app\/google\/id284815942",
"google": "https:\/\/play.google.com\/store\/apps\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https:\/\/google.ca"
},
{
"location": "United States",
"link": "https:\/\/google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https:\/\/google.com"
},
{
"device": "Android",
"link": "https:\/\/google.com"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https:\/\/google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https:\/\/google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https:\/\/example.com\/blocked"
}
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/url/:id/update',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"url": "https:\/\/google.com",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https:\/\/example.com\/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"deeplink": {
"apple": "https:\/\/apps.apple.com\/us\/app\/google\/id284815942",
"google": "https:\/\/play.google.com\/store\/apps\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https:\/\/google.ca"
},
{
"location": "United States",
"link": "https:\/\/google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https:\/\/google.com"
},
{
"device": "Android",
"link": "https:\/\/google.com"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https:\/\/google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https:\/\/google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https:\/\/example.com\/blocked"
}
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/url/:id/update"
payload = {
"url": "https://google.com",
"custom": "google",
"password": "mypass",
"expiry": "2020-11-11 12:00:00",
"startdate": "2020-11-01 09:00:00",
"clicklimit": 1000,
"expirationredirect": "https://example.com/expired",
"codes": 302,
"hidereferrer": true,
"type": "splash",
"pixels": [
1,
2,
3,
4
],
"channel": 1,
"deeplink": {
"apple": "https://apps.apple.com/us/app/google/id284815942",
"google": "https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US"
},
"geotarget": [
{
"location": "Canada",
"link": "https://google.ca"
},
{
"location": "United States",
"link": "https://google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https://google.com"
},
{
"device": "Android",
"link": "https://google.com"
}
],
"parameters": [
{
"name": "utm_source",
"value": "newsletter"
},
{
"name": "utm_medium",
"value": "email"
}
],
"utmtemplate": 3,
"abtesting": [
{
"link": "https://google.com",
"percent": 50,
"description": "Variant A"
},
{
"link": "https://google.ca",
"percent": 50,
"description": "Variant B"
}
],
"ips": {
"list": "1.2.3.4\n5.6.7.8",
"banlist": "9.10.11.12",
"link": "https://example.com/blocked"
}
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/url/:id/update");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"url\":\"https:\\/\\/google.com\",\"custom\":\"google\",\"password\":\"mypass\",\"expiry\":\"2020-11-11 12:00:00\",\"startdate\":\"2020-11-01 09:00:00\",\"clicklimit\":1000,\"expirationredirect\":\"https:\\/\\/example.com\\/expired\",\"codes\":302,\"hidereferrer\":true,\"type\":\"splash\",\"pixels\":[1,2,3,4],\"channel\":1,\"deeplink\":{\"apple\":\"https:\\/\\/apps.apple.com\\/us\\/app\\/google\\/id284815942\",\"google\":\"https:\\/\\/play.google.com\\/store\\/apps\\/details?id=com.google.android.googlequicksearchbox&hl=en_CA&gl=US\"},\"geotarget\":[{\"location\":\"Canada\",\"link\":\"https:\\/\\/google.ca\"},{\"location\":\"United States\",\"link\":\"https:\\/\\/google.us\"}],\"devicetarget\":[{\"device\":\"iPhone\",\"link\":\"https:\\/\\/google.com\"},{\"device\":\"Android\",\"link\":\"https:\\/\\/google.com\"}],\"parameters\":[{\"name\":\"utm_source\",\"value\":\"newsletter\"},{\"name\":\"utm_medium\",\"value\":\"email\"}],\"utmtemplate\":3,\"abtesting\":[{\"link\":\"https:\\/\\/google.com\",\"percent\":50,\"description\":\"Variant A\"},{\"link\":\"https:\\/\\/google.ca\",\"percent\":50,\"description\":\"Variant B\"}],\"ips\":{\"list\":\"1.2.3.4\\n5.6.7.8\",\"banlist\":\"9.10.11.12\",\"link\":\"https:\\/\\/example.com\\/blocked\"}}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 3,
"short": "https:\/\/linko.me\/google"
}
https://linko.me/api/url/:id/delete
Delete a Link
To delete a link, you need to send a DELETE request.
curl --location --request DELETE 'https://linko.me/api/url/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/url/:id/delete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'DELETE',
'url': 'https://linko.me/api/url/:id/delete',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/url/:id/delete"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://linko.me/api/url/:id/delete");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Link has been deleted successfully"
}
Pixels
Manage tracking pixels (Facebook, GTM, Google Analytics, TikTok, etc.). Pixels are attached to short links via the pixels array on POST /url/add.
https://linko.me/api/pixels?limit=2&page=1
List Pixels
Returns the user's pixels, newest first, with the count of short links currently using each pixel. Supports name and type filters.
limit
(optional) Per page data result
page
(optional) Current page request
q
(optional) Filter by name (LIKE %q%).
type
(optional) Filter by provider type (e.g. fbpixel, gtmpixel). See /pixels/types.
curl --location --request GET 'https://linko.me/api/pixels?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/pixels?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/pixels?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/pixels?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/pixels?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"pixels": [
{
"id": 2,
"type": "twitterpixel",
"name": "Twitter Pixel",
"tag": "1234567",
"urlcount": 0,
"date": "2020-11-10 18:10:00"
},
{
"id": 1,
"type": "gtmpixel",
"name": "GTM Pixel",
"tag": "GTM-ABCDE",
"urlcount": 12,
"date": "2020-11-10 18:00:00"
}
]
}
}
https://linko.me/api/pixels/types
List Pixel Providers
Returns the list of available pixel provider types your account can create. Useful for populating a "choose pixel type" dropdown without hard-coding the list (which can change as the platform adds providers).
curl --location --request GET 'https://linko.me/api/pixels/types' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/pixels/types",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/pixels/types',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/pixels/types"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/pixels/types");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"providers": [
{
"type": "gtmpixel",
"name": "Google Tag Manager",
"icon": "gtm.svg"
},
{
"type": "gapixel",
"name": "Google Analytics",
"icon": "ga.svg"
},
{
"type": "fbpixel",
"name": "Facebook",
"icon": "facebook.svg"
},
{
"type": "tiktok",
"name": "TikTok",
"icon": "tiktok.svg"
}
]
}
}
https://linko.me/api/pixel/add
Create a Pixel
A pixel can be created using this endpoint. You need to send the pixel type and the tag.
type
(required) gtmpixel | gapixel | fbpixel | adwordspixel | linkedinpixel | twitterpixel | adrollpixel | quorapixel | pinterest | bing | snapchat | reddit | tiktok
name
(required) Custom name for your pixel
tag
(required) The tag for the pixel
curl --location --request POST 'https://linko.me/api/pixel/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"type": "gtmpixel",
"name": "My GTM",
"tag": "GTM-ABCDE"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/pixel/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"type": "gtmpixel",
"name": "My GTM",
"tag": "GTM-ABCDE"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/pixel/add',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"type": "gtmpixel",
"name": "My GTM",
"tag": "GTM-ABCDE"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/pixel/add"
payload = {
"type": "gtmpixel",
"name": "My GTM",
"tag": "GTM-ABCDE"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/pixel/add");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"type\":\"gtmpixel\",\"name\":\"My GTM\",\"tag\":\"GTM-ABCDE\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 1
}
https://linko.me/api/pixel/:id/update
Update Pixel
To update a pixel, you need to send a valid data in JSON via a PUT request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).
name
(optional) Custom name for your pixel
tag
(required) The tag for the pixel
curl --location --request PUT 'https://linko.me/api/pixel/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "My GTM",
"tag": "GTM-ABCDE"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/pixel/:id/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"name": "My GTM",
"tag": "GTM-ABCDE"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/pixel/:id/update',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"name": "My GTM",
"tag": "GTM-ABCDE"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/pixel/:id/update"
payload = {
"name": "My GTM",
"tag": "GTM-ABCDE"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/pixel/:id/update");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"name\":\"My GTM\",\"tag\":\"GTM-ABCDE\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Pixel has been updated successfully."
}
https://linko.me/api/pixel/:id/delete
Delete Pixel
Deletes the pixel and unbinds it from every short link that had it attached. Mirrors the dashboard cleanup so you don't leave orphan references in url.pixels.
curl --location --request DELETE 'https://linko.me/api/pixel/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/pixel/:id/delete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'DELETE',
'url': 'https://linko.me/api/pixel/:id/delete',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/pixel/:id/delete"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://linko.me/api/pixel/:id/delete");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Pixel has been deleted successfully."
}
QR Codes
https://linko.me/api/qr?limit=2&page=1
List QR codes
To get your QR codes via the API, you can use this endpoint. You can also filter data (See table for more info).
limit
(optional) Per page data result
page
(optional) Current page request
curl --location --request GET 'https://linko.me/api/qr?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/qr?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/qr?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": "0",
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": 1,
"maxpage": 1,
"qrs": [
{
"id": 2,
"link": "https:\/\/linko.me\/qr\/a2d5e",
"scans": 0,
"name": "Google",
"date": "2020-11-10 18:01:43"
},
{
"id": 1,
"link": "https:\/\/linko.me\/qr\/b9edfe",
"scans": 5,
"name": "Google Canada",
"date": "2020-11-10 18:00:25"
}
]
}
}
https://linko.me/api/qr/:id
Get a single QR Code
To get details for a single QR code via the API, you can use this endpoint.
curl --location --request GET 'https://linko.me/api/qr/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/qr/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/qr/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"details": {
"id": 1,
"link": "https:\/\/linko.me\/qr\/b9edfe",
"scans": 5,
"name": "Google Canada",
"date": "2020-11-10 18:00:25"
},
"data": {
"clicks": 1,
"uniqueClicks": 1,
"topCountries": {
"Unknown": "1"
},
"topReferrers": {
"Direct, email and other": "1"
},
"topBrowsers": {
"Chrome": "1"
},
"topOs": {
"Windows 10": "1"
},
"socialCount": {
"facebook": 0,
"twitter": 0,
"instagram": 0
}
}
}
https://linko.me/api/qr/add
Create a QR Code
To create a QR Code, you need to send a valid data in JSON via a POST request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).
type
(required) text | link | email | phone | sms | smsonly | wifi | staticvcard | event | vcard | application | file | whatsapp | crypto | geolocation
data
(required) Data to be embedded inside the QR code. The data can be string or array depending on the type. For vcard / staticvcard, you can pass a remote image URL in data.image and it will be downloaded and embedded as the contact photo (max 1MB, PNG/JPEG).
name
(optional) Display name for this QR code (defaults to "Via API").
domain
(optional) Custom branded domain for the QR redirect URL (dynamic types only).
custom
(optional) Custom alias for the QR redirect URL (dynamic types only). Plan-gated by alias feature.
background
(optional) RGB color e.g. rgb(255,255,255)
foreground
(optional) RGB color e.g. rgb(0,0,0)
mode
(optional) "simple" or "gradient". Default "simple".
gradient
(optional) Gradient object: { start, stop, bg, direction }. direction = vertical | horizontal | radial | diagonal.
eyecolor
(optional) RGB color for the inner eye dot.
eyeframecolor
(optional) RGB color for the outer eye frame.
matrix
(optional) Module / dot style: square | circle | splash | dot | diamond | heart | hexagon | squarespace | longrounded | tallrounded | distorted | threed.
eye
(optional) Eye style: square | rounded | circle | eye | eyeinverted | butterfly | bubble | diamond | hexagon.
eyeframe
(optional) Eye frame shape: square | rounded | circle | eye | eyeinverted | bubble | hexagon.
frame
(optional) Frame object: { type, text, font, color, textcolor }. type = none | window | popup | camera | phone | arrow | labeled | roundedlines. Plan-gated by qrframes.
margin
(optional) Quiet-zone margin, integer 0–10. Default 0.
error
(optional) Error correction level: l (7%) | m (15%, default) | q (25%) | h (30%).
logo
(optional) URL of a remote PNG/JPEG logo. Max 2MB. Plan-gated by qrlogo.
selectlogo
(optional) Predefined logo: none | instagram | facebook | youtube | twitter | tiktok | linkedin. Plan-gated by qrlogo.
logosize
(optional) Logo size in px, 50–500. Plan-gated by qrlogo.
punched
(optional) Boolean — embed (cut out) the logo into the QR matrix. Plan-gated by qrlogo.
qrtemplate
(optional) Saved template ID to apply: numeric ID for a pre-made template, or "user_{id}" for one of your custom templates (see /qr-templates and /qr-templates/user). Template values pre-fill style fields; any explicit style fields you also send override the same key.
curl --location --request POST 'https://linko.me/api/qr/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"type": "link",
"data": "https:\/\/google.com",
"name": "Marketing QR",
"domain": "https:\/\/l.example.com",
"custom": "sale",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"mode": "gradient",
"gradient": {
"start": "rgb(0,0,0)",
"stop": "rgb(80,80,80)",
"bg": "rgb(255,255,255)",
"direction": "diagonal"
},
"eyecolor": "rgb(0,0,0)",
"eyeframecolor": "rgb(0,0,0)",
"matrix": "circle",
"eye": "rounded",
"eyeframe": "rounded",
"frame": {
"type": "labeled",
"text": "Scan me",
"font": "Arial",
"color": "#000000",
"textcolor": "#ffffff"
},
"margin": 2,
"error": "h",
"logo": "https:\/\/site.com\/logo.png",
"logosize": 150,
"punched": true,
"qrtemplate": 5
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"type": "link",
"data": "https:\/\/google.com",
"name": "Marketing QR",
"domain": "https:\/\/l.example.com",
"custom": "sale",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"mode": "gradient",
"gradient": {
"start": "rgb(0,0,0)",
"stop": "rgb(80,80,80)",
"bg": "rgb(255,255,255)",
"direction": "diagonal"
},
"eyecolor": "rgb(0,0,0)",
"eyeframecolor": "rgb(0,0,0)",
"matrix": "circle",
"eye": "rounded",
"eyeframe": "rounded",
"frame": {
"type": "labeled",
"text": "Scan me",
"font": "Arial",
"color": "#000000",
"textcolor": "#ffffff"
},
"margin": 2,
"error": "h",
"logo": "https:\/\/site.com\/logo.png",
"logosize": 150,
"punched": true,
"qrtemplate": 5
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/qr/add',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"type": "link",
"data": "https:\/\/google.com",
"name": "Marketing QR",
"domain": "https:\/\/l.example.com",
"custom": "sale",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"mode": "gradient",
"gradient": {
"start": "rgb(0,0,0)",
"stop": "rgb(80,80,80)",
"bg": "rgb(255,255,255)",
"direction": "diagonal"
},
"eyecolor": "rgb(0,0,0)",
"eyeframecolor": "rgb(0,0,0)",
"matrix": "circle",
"eye": "rounded",
"eyeframe": "rounded",
"frame": {
"type": "labeled",
"text": "Scan me",
"font": "Arial",
"color": "#000000",
"textcolor": "#ffffff"
},
"margin": 2,
"error": "h",
"logo": "https:\/\/site.com\/logo.png",
"logosize": 150,
"punched": true,
"qrtemplate": 5
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr/add"
payload = {
"type": "link",
"data": "https://google.com",
"name": "Marketing QR",
"domain": "https://l.example.com",
"custom": "sale",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"mode": "gradient",
"gradient": {
"start": "rgb(0,0,0)",
"stop": "rgb(80,80,80)",
"bg": "rgb(255,255,255)",
"direction": "diagonal"
},
"eyecolor": "rgb(0,0,0)",
"eyeframecolor": "rgb(0,0,0)",
"matrix": "circle",
"eye": "rounded",
"eyeframe": "rounded",
"frame": {
"type": "labeled",
"text": "Scan me",
"font": "Arial",
"color": "#000000",
"textcolor": "#ffffff"
},
"margin": 2,
"error": "h",
"logo": "https://site.com/logo.png",
"logosize": 150,
"punched": true,
"qrtemplate": 5
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/qr/add");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"type\":\"link\",\"data\":\"https:\\/\\/google.com\",\"name\":\"Marketing QR\",\"domain\":\"https:\\/\\/l.example.com\",\"custom\":\"sale\",\"background\":\"rgb(255,255,255)\",\"foreground\":\"rgb(0,0,0)\",\"mode\":\"gradient\",\"gradient\":{\"start\":\"rgb(0,0,0)\",\"stop\":\"rgb(80,80,80)\",\"bg\":\"rgb(255,255,255)\",\"direction\":\"diagonal\"},\"eyecolor\":\"rgb(0,0,0)\",\"eyeframecolor\":\"rgb(0,0,0)\",\"matrix\":\"circle\",\"eye\":\"rounded\",\"eyeframe\":\"rounded\",\"frame\":{\"type\":\"labeled\",\"text\":\"Scan me\",\"font\":\"Arial\",\"color\":\"#000000\",\"textcolor\":\"#ffffff\"},\"margin\":2,\"error\":\"h\",\"logo\":\"https:\\/\\/site.com\\/logo.png\",\"logosize\":150,\"punched\":true,\"qrtemplate\":5}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"id": 3,
"link": "https:\/\/linko.me\/qr\/a58f79"
}
https://linko.me/api/qr/:id/update
Update QR Code
To update a QR Code, you need to send a valid data in JSON via a PUT request. All fields are optional — only the keys you send will be modified.
data
(optional) New data to embed (must match the original type).
name
(optional) New display name.
background
(optional) RGB color e.g. rgb(255,255,255)
foreground
(optional) RGB color e.g. rgb(0,0,0)
mode
(optional) "simple" or "gradient".
gradient
(optional) { start, stop, bg, direction }.
eyecolor
(optional) RGB color.
eyeframecolor
(optional) RGB color.
matrix
(optional) Module / dot style.
eye
(optional) Eye style.
eyeframe
(optional) Eye frame shape.
frame
(optional) Frame object.
margin
(optional) 0–10.
error
(optional) l | m | q | h.
logo
(optional) URL of new PNG/JPEG logo.
selectlogo
(optional) Predefined logo or "none" to remove.
logosize
(optional) 50–500.
punched
(optional) Boolean.
qrtemplate
(optional) Saved template ID to apply (numeric for pre-made templates, "user_{id}" for user templates).
curl --location --request PUT 'https://linko.me/api/qr/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": "https:\/\/google.com",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"matrix": "dot",
"eye": "circle",
"eyeframe": "circle",
"error": "h",
"logo": "https:\/\/site.com\/logo.png"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr/:id/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"data": "https:\/\/google.com",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"matrix": "dot",
"eye": "circle",
"eyeframe": "circle",
"error": "h",
"logo": "https:\/\/site.com\/logo.png"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/qr/:id/update',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"data": "https:\/\/google.com",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"matrix": "dot",
"eye": "circle",
"eyeframe": "circle",
"error": "h",
"logo": "https:\/\/site.com\/logo.png"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr/:id/update"
payload = {
"data": "https://google.com",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)",
"matrix": "dot",
"eye": "circle",
"eyeframe": "circle",
"error": "h",
"logo": "https://site.com/logo.png"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/qr/:id/update");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"data\":\"https:\\/\\/google.com\",\"background\":\"rgb(255,255,255)\",\"foreground\":\"rgb(0,0,0)\",\"matrix\":\"dot\",\"eye\":\"circle\",\"eyeframe\":\"circle\",\"error\":\"h\",\"logo\":\"https:\\/\\/site.com\\/logo.png\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "QR has been updated successfully."
}
https://linko.me/api/qr/:id/delete
Delete a QR Code
To delete a QR code, you need to send a DELETE request.
curl --location --request DELETE 'https://linko.me/api/qr/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr/:id/delete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'DELETE',
'url': 'https://linko.me/api/qr/:id/delete',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr/:id/delete"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://linko.me/api/qr/:id/delete");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "QR Code has been deleted successfully."
}
https://linko.me/api/qr-templates?limit=10&page=1
List Pre-made QR Templates
Returns the pre-made QR templates the authenticated user is eligible for, based on their plan.
limit
(optional) Per page result count
page
(optional) Page number
curl --location --request GET 'https://linko.me/api/qr-templates?limit=10&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr-templates?limit=10&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/qr-templates?limit=10&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr-templates?limit=10&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/qr-templates?limit=10&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"result": 1,
"perpage": 50,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"templates": [
{
"id": 5,
"name": "Coral Brand",
"description": "Linko brand template",
"preview": "\/content\/qrtemplates\/preview.png",
"paidonly": -1,
"data": {
"mode": "simple",
"color": {
"bg": "rgb(255,255,255)",
"fg": "rgb(253,106,94)"
},
"matrix": "circle",
"eye": "rounded",
"eyeframe": "rounded",
"error": "h"
},
"created_at": "2026-05-01 12:00:00"
}
]
}
}
https://linko.me/api/qr-templates/user?limit=10&page=1
List Your QR Templates
Returns the authenticated user's saved QR templates. Requires the qrtemplates plan feature.
limit
(optional) Per page result count
page
(optional) Page number
curl --location --request GET 'https://linko.me/api/qr-templates/user?limit=10&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr-templates/user?limit=10&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/qr-templates/user?limit=10&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr-templates/user?limit=10&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/qr-templates/user?limit=10&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"result": 1,
"perpage": 15,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"templates": [
{
"id": 12,
"name": "Holiday Promo",
"description": "Red gradient with rounded eyes",
"preview": null,
"data": {
"mode": "gradient",
"gradient": [
[
"rgb(220,20,60)",
"rgb(255,140,0)"
],
"rgb(255,255,255)",
"diagonal"
],
"eye": "rounded",
"eyeframe": "rounded",
"error": "h",
"matrix": "splash"
},
"created_at": "2026-05-10 09:00:00"
}
]
}
}
https://linko.me/api/qr-template/:id
Get a Single QR Template
Pass a numeric id to fetch a pre-made template, or "user_{id}" to fetch one of your saved templates.
curl --location --request GET 'https://linko.me/api/qr-template/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/qr-template/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/qr-template/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/qr-template/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/qr-template/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"id": 5,
"name": "Coral Brand",
"description": "Linko brand template",
"preview": "\/content\/qrtemplates\/preview.png",
"paidonly": -1,
"data": {
"mode": "simple",
"color": {
"bg": "rgb(255,255,255)",
"fg": "rgb(253,106,94)"
},
"matrix": "circle",
"eye": "rounded",
"eyeframe": "rounded",
"error": "h"
},
"created_at": "2026-05-01 12:00:00"
}
}
UTM Templates
Manage UTM parameter templates and apply them to your links. Templates themselves are created and edited from the dashboard (Marketing → UTM Templates); over the API you can list them, fetch a single template, and apply one to an existing link or at link creation time.
https://linko.me/api/utm-templates?limit=2&page=1
List UTM Templates
Returns the authenticated user's UTM templates, ordered with the default template first.
limit
(optional) Per page result count
page
(optional) Page number
curl --location --request GET 'https://linko.me/api/utm-templates?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/utm-templates?limit=2&page=1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/utm-templates?limit=2&page=1',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/utm-templates?limit=2&page=1"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/utm-templates?limit=2&page=1");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"result": 1,
"perpage": 15,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"templates": [
{
"id": 3,
"name": "Linko Newsletter",
"description": "For internal newsletter",
"is_default": true,
"data": {
"utm_source": "linko",
"utm_medium": "newsletter",
"utm_campaign": "internal-email-clicks-view",
"utm_term": "",
"utm_content": "",
"utm_id": "",
"custom": []
},
"created_at": "2026-05-26 10:00:00"
}
]
}
}
https://linko.me/api/utm-template/:id
Get UTM Template
Returns a single UTM template by ID.
curl --location --request GET 'https://linko.me/api/utm-template/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/utm-template/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/utm-template/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/utm-template/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/utm-template/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"id": 3,
"name": "Linko Newsletter",
"description": "For internal newsletter",
"is_default": true,
"data": {
"utm_source": "linko",
"utm_medium": "newsletter",
"utm_campaign": "internal-email-clicks-view",
"utm_term": "",
"utm_content": "",
"utm_id": "",
"custom": [
{
"name": "aff",
"value": "3"
}
]
},
"created_at": "2026-05-26 10:00:00"
}
}
https://linko.me/api/utm-template/:id/assign/:link
Apply Template to Link
Merges the template's UTM keys and custom parameters into the existing link's parameters. Template values override existing values for the same key. Use the link ID returned by Shorten a Link.
curl --location --request POST 'https://linko.me/api/utm-template/:id/assign/:link' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/utm-template/:id/assign/:link",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/utm-template/:id/assign/:link',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/utm-template/:id/assign/:link"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/utm-template/:id/assign/:link");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "Template applied to link.",
"data": {
"id": 7,
"parameters": {
"utm_source": "linko",
"utm_medium": "newsletter",
"utm_campaign": "internal-email-clicks-view"
}
}
}
Plans
AdminThis endpoint is only accessible by users with admin privileges.
https://linko.me/api/plans
List Plans
Get a list of all plans on the platform.
curl --location --request GET 'https://linko.me/api/plans' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/plans',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/plans"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/plans");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": [
{
"id": 2,
"name": "Business",
"free": false,
"prices": {
"monthly": 9.99,
"yearly": 99.99,
"lifetime": 999.99
},
"limits": {
"links": 100,
"clicks": 100000,
"retention": 60,
"custom": {
"enabled": "0"
},
"team": {
"enabled": "0",
"count": "0"
},
"splash": {
"enabled": "1",
"count": "5"
},
"overlay": {
"enabled": "1",
"count": "10"
},
"pixels": {
"enabled": "1",
"count": "10"
},
"domain": {
"enabled": "1",
"count": "1"
},
"multiple": {
"enabled": "0"
},
"alias": {
"enabled": "1"
},
"device": {
"enabled": "0"
},
"geo": {
"enabled": "0"
},
"bundle": {
"enabled": "0"
},
"parameters": {
"enabled": "0"
},
"export": {
"enabled": "0"
},
"api": {
"enabled": "0"
}
}
},
{
"id": 1,
"name": "Starter",
"free": true,
"prices": null,
"limits": {
"links": 10,
"clicks": 1000,
"retention": 7,
"custom": {
"enabled": "0"
},
"team": {
"enabled": "0",
"count": "0"
},
"splash": {
"enabled": "0",
"count": "0"
},
"overlay": {
"enabled": "0",
"count": "10"
},
"pixels": {
"enabled": "0",
"count": "10"
},
"domain": {
"enabled": "0",
"count": "0"
},
"multiple": {
"enabled": "0"
},
"alias": {
"enabled": "0"
},
"device": {
"enabled": "0"
},
"geo": {
"enabled": "0"
},
"bundle": {
"enabled": "0"
},
"parameters": {
"enabled": "0"
},
"export": {
"enabled": "0"
},
"api": {
"enabled": "0"
}
}
}
]
}
https://linko.me/api/plan/:planid/user/:userid
Subscribe a User to a Plan
To subscribe a user to plan, send a PUT request to this endpoint with the plan id and user id. The type of subscription and the expiration date will need to be specified. If the expiration date is not specified, the date will be adjusted according to the type.
type
monthly | yearly | lifetime
expiration
(optional) Expiration date of the plan e.g. 2026-06-28 12:19:30
curl --location --request PUT 'https://linko.me/api/plan/:planid/user/:userid' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"type": "monthly",
"expiration": "2026-06-28 12:19:30"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/plan/:planid/user/:userid",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"type": "monthly",
"expiration": "2026-06-28 12:19:30"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://linko.me/api/plan/:planid/user/:userid',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"type": "monthly",
"expiration": "2026-06-28 12:19:30"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/plan/:planid/user/:userid"
payload = {
"type": "monthly",
"expiration": "2026-06-28 12:19:30"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://linko.me/api/plan/:planid/user/:userid");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"type\":\"monthly\",\"expiration\":\"2026-06-28 12:19:30\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "User has been subscribed to this plan."
}
Users
AdminThis endpoint is only accessible by users with admin privileges.
https://linko.me/api/users?filter=free
List Users
Get a list of all users on the platform. Data can be filtered by sending a filter parameter in the url.
filter
admin | free | pro
email
Search a user by email
curl --location --request GET 'https://linko.me/api/users?filter=free' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/users?filter=free",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/users?filter=free',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/users?filter=free"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/users?filter=free");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": [
{
"id": 2,
"email": "sample2@domain.com",
"username": "sample2user",
"avatar": "https:\\\/\\\/domain.com\/content\/avatar2.png",
"status": "free",
"planid": 1,
"expires": null,
"registered": "2020-11-10 18:01:43",
"apikey": "ABC123DEF456"
},
{
"id": 1,
"email": "sample@domain.com",
"username": "sampleuser",
"avatar": "https:\\\/\\\/domain.com\/content\/avatar.png",
"status": "pro",
"planid": 2,
"expires": "2022-11-15 15:00:00",
"registered": "2020-11-10 18:01:43",
"apikey": "ABC123DEF456"
}
]
}
https://linko.me/api/user/:id
List a Single User
Get data for a single user.
curl --location --request GET 'https://linko.me/api/user/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/user/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/user/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/user/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/user/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"data": {
"id": 2,
"email": "sample2@domain.com",
"username": "sample2user",
"avatar": "https:\\\/\\\/domain.com\/content\/avatar2.png",
"status": "free",
"planid": 1,
"expires": null,
"registered": "2020-11-10 18:01:43",
"apikey": "ABC123DEF456"
}
}
https://linko.me/api/user/add
Create User
To create a user, use this endpoint and send the following information as JSON.
username
(required) User's username. Needs to be valid.
email
(required) User's email. Needs to be valid.
password
(required) User's password. Minimum 5 characters.
planid
(optional) Premium plan. This can be found in the admin panel.
expiration
(optional) Membership expiration example 2020-12-26 12:00:00
curl --location --request POST 'https://linko.me/api/user/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "user",
"password": "1234567891011",
"email": "demo@yourwebsite.com",
"planid": 1,
"expiration": "2020-11-20 11:00:00"
}'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/user/add",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{
"username": "user",
"password": "1234567891011",
"email": "demo@yourwebsite.com",
"planid": 1,
"expiration": "2020-11-20 11:00:00"
}',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://linko.me/api/user/add',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"username": "user",
"password": "1234567891011",
"email": "demo@yourwebsite.com",
"planid": 1,
"expiration": "2020-11-20 11:00:00"
}),
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/user/add"
payload = {
"username": "user",
"password": "1234567891011",
"email": "demo@yourwebsite.com",
"planid": 1,
"expiration": "2020-11-20 11:00:00"
}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://linko.me/api/user/add");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{\"username\":\"user\",\"password\":\"1234567891011\",\"email\":\"demo@yourwebsite.com\",\"planid\":1,\"expiration\":\"2020-11-20 11:00:00\"}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "User has been registered.",
"data": {
"id": 3,
"email": "demo@yourwebsite.com",
"username": "user"
}
}
https://linko.me/api/user/:id/delete
Delete User
To delete a user, use this endpoint.
curl --location --request DELETE 'https://linko.me/api/user/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/user/:id/delete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'DELETE',
'url': 'https://linko.me/api/user/:id/delete',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/user/:id/delete"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://linko.me/api/user/:id/delete");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"message": "User has been deleted."
}
https://linko.me/api/user/login/:id
Login User
This endpoint will generate a unique link that will allow the user to automatically login to the platform. SSO login urls are valid for 1 hour and they can be used a single time.
curl --location --request GET 'https://linko.me/api/user/login/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json'
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://linko.me/api/user/login/:id",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOURAPIKEY",
"Content-Type: application/json",
],
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://linko.me/api/user/login/:id',
'headers': {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
},
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
url = "https://linko.me/api/user/login/:id"
payload = {}
headers = {
'Authorization': 'Bearer YOURAPIKEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, json=payload)
print(response.text)
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://linko.me/api/user/login/:id");
request.Headers.Add("Authorization", "Bearer YOURAPIKEY");
var content = new StringContent("{}", System.Text.Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
{
"error": 0,
"url": "https:\/\/linko.me\/user\/login\/sso\/whxktjixxzuwdychfhlttqrqvzcwbqcq"
}