Get unlisted link
curl --request GET \
--url https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link \
--header 'X-Api-Key: <x-api-key>'import requests
url = "https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link"
headers = {"X-Api-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<x-api-key>'}};
fetch('https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Api-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link")
.header("X-Api-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Api-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"unlisted_link": {
"url": "https://example.neetokb.com/public/p-1a2b3c4d5e",
"enabled": true,
"expiration_type": "never",
"expiration_date": "2026-08-21T10:00:00.000Z"
}
}{
"error": "Article must be published before an unlisted link can be generated."
}Articles
Get unlisted link
This API allows to fetch the article’s unlisted (secret) share link, creating a never-expiring one if none exists yet. An expired link is automatically replaced with a fresh one.
GET
/
articles
/
{article_id}
/
unlisted_link
Get unlisted link
curl --request GET \
--url https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link \
--header 'X-Api-Key: <x-api-key>'import requests
url = "https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link"
headers = {"X-Api-Key": "<x-api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<x-api-key>'}};
fetch('https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Api-Key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<x-api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link")
.header("X-Api-Key", "<x-api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{your-subdomain}.neetokb.com/api/external/v2/articles/{article_id}/unlisted_link")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Api-Key"] = '<x-api-key>'
response = http.request(request)
puts response.read_body{
"unlisted_link": {
"url": "https://example.neetokb.com/public/p-1a2b3c4d5e",
"enabled": true,
"expiration_type": "never",
"expiration_date": "2026-08-21T10:00:00.000Z"
}
}{
"error": "Article must be published before an unlisted link can be generated."
}Replace
Learn how to find your subdomain in Workspace subdomain.
{your-subdomain} with your workspace’s subdomain. Learn how to find your subdomain in Workspace subdomain.
Headers
Use the X-Api-Key header to provide your workspace API key. Refer to Authentication for more information.
Path Parameters
Unique identifier of the article. Can be the article's slug, permalink, or ID. Refer to Getting the Article ID section for detailed instructions.
Response
OK - Request succeeded
Hide child attributes
Hide child attributes
Example:
"https://example.neetokb.com/public/p-1a2b3c4d5e"
Example:
true
Available options:
never, one_day, seven_days, thirty_days, custom Example:
"never"
Example:
"2026-08-21T10:00:00.000Z"
⌘I