API Documentation

Build powerful integrations with our RESTful API

30 Requests/min
14 API Categories
5 Code Examples

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 In

Authentication

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.

Response Headers
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 Response Example
{
    "error": 1,
    "message": "An error occurred"
}

Account

GET 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());
Server Response
{
    "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
        }
    }
}
PUT 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "Account has been successfully updated."
}
POST 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "API key has been regenerated. Save it now \u2014 it is not retrievable later.",
    "data": {
        "api_key": "a1b2c3d4..."
    }
}
POST 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());
Server Response
{
    "error": 0,
    "data": {
        "secret": "JBSWY3DPEHPK3PXP",
        "otpauth_url": "otpauth:\/\/totp\/Linko:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Linko",
        "expires_in": 120
    }
}
POST 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "2FA has been enabled. Back up the secret in case you lose access to your authenticator."
}
POST 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.

Parameter Description
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());
Server Response
{
    "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.

GET 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).

Parameter Description
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());
Server Response
{
    "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
            }
        ]
    }
}
GET 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());
Server Response
{
    "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
    }
}
POST 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.

Parameter Description
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());
Server Response
{
    "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"
    }
}
PUT 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "Domain has been updated successfully.",
    "data": {
        "id": 1,
        "domain": "https:\/\/domain1.com",
        "redirectroot": "https:\/\/rootdomain-new.com"
    }
}
POST 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());
Server Response
{
    "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"
    }
}
DELETE 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());
Server Response
{
    "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.

GET 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.

Parameter Description
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());
Server Response
{
    "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.

GET 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.

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
GET 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.

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
POST https://linko.me/api/campaign/add

Create a Campaign

A campaign can be added using this endpoint.

Parameter Description
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());
Server Response
{
    "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
    }
}
PUT 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.

Parameter Description
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());
Server Response
{
    "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
    }
}
DELETE 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());
Server Response
{
    "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.

GET 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.

Parameter Description
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());
Server Response
{
    "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
            }
        ]
    }
}
GET 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.

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
POST https://linko.me/api/channel/add

Create a Channel

A channel can be added using this endpoint.

Parameter Description
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());
Server Response
{
    "error": 0,
    "id": 3,
    "name": "New Channel",
    "description": "my new channel",
    "color": "#000000",
    "starred": true
}
POST 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.

Parameter Description
: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());
Server Response
{
    "error": 0,
    "message": "Link successfully added to the channel."
}
POST 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.

Parameter Description
: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());
Server Response
{
    "error": 0,
    "message": "Item removed from the channel."
}
PUT 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "id": 3,
    "name": "Acme Corp",
    "description": "channel for items for Acme Corp",
    "color": "#FFFFFF",
    "starred": false
}
DELETE 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());
Server Response
{
    "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.

GET 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.

Parameter Description
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());
Server Response
{
    "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

GET https://linko.me/api/files?limit=2&page=1

List Files

Get all of your files. You can also search by name.

Parameter Description
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());
Server Response
{
    "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"
        }
    ]
}
POST 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "id": 1,
    "shorturl": "https:\/\/linko.me\/SVPnM"
}

Pixels

Manage tracking pixels (Facebook, GTM, Google Analytics, TikTok, etc.). Pixels are attached to short links via the pixels array on POST /url/add.

GET 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.

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
GET 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());
Server Response
{
    "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"
            }
        ]
    }
}
POST 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "id": 1
}
PUT 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).

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "Pixel has been updated successfully."
}
DELETE 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());
Server Response
{
    "error": 0,
    "message": "Pixel has been deleted successfully."
}

QR Codes

GET 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).

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
GET 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());
Server Response
{
    "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
        }
    }
}
POST 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).

Parameter Description
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());
Server Response
{
    "error": 0,
    "id": 3,
    "link": "https:\/\/linko.me\/qr\/a58f79"
}
PUT 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "QR has been updated successfully."
}
DELETE 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());
Server Response
{
    "error": 0,
    "message": "QR Code has been deleted successfully."
}
GET 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.

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
GET 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.

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
GET 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());
Server Response
{
    "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.

GET 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.

Parameter Description
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());
Server Response
{
    "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"
            }
        ]
    }
}
GET 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());
Server Response
{
    "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"
    }
}

Plans

Admin

This endpoint is only accessible by users with admin privileges.

GET 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());
Server Response
{
    "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"
                }
            }
        }
    ]
}
PUT 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.

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "User has been subscribed to this plan."
}

Users

Admin

This endpoint is only accessible by users with admin privileges.

GET 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.

Parameter Description
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());
Server Response
{
    "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"
        }
    ]
}
GET 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());
Server Response
{
    "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"
    }
}
POST https://linko.me/api/user/add

Create User

To create a user, use this endpoint and send the following information as JSON.

Parameter Description
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());
Server Response
{
    "error": 0,
    "message": "User has been registered.",
    "data": {
        "id": 3,
        "email": "demo@yourwebsite.com",
        "username": "user"
    }
}
DELETE 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());
Server Response
{
    "error": 0,
    "message": "User has been deleted."
}
GET 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());
Server Response
{
    "error": 0,
    "url": "https:\/\/linko.me\/user\/login\/sso\/whxktjixxzuwdychfhlttqrqvzcwbqcq"
}