curl --request GET \
--url https://core-api.getaptly.com/api/knowledge/{id} \
--header 'x-token: <api-key>'import requests
url = "https://core-api.getaptly.com/api/knowledge/{id}"
headers = {"x-token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-token': '<api-key>'}};
fetch('https://core-api.getaptly.com/api/knowledge/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-api.getaptly.com/api/knowledge/{id}",
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-token: <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://core-api.getaptly.com/api/knowledge/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-token", "<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://core-api.getaptly.com/api/knowledge/{id}")
.header("x-token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api.getaptly.com/api/knowledge/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"_id": "kdoc_abc123",
"name": "Lease Addendum Policy",
"emoji": null,
"iconUrl": null,
"coverUrl": null,
"accessType": "public",
"isPrivate": false,
"shares": [],
"parentId": null,
"path": [],
"children": [],
"childCount": 0,
"links": {
"aptletUuid": null,
"aptletInstanceId": null,
"streamId": null
},
"published": false,
"publishedAt": null,
"views": {
"internal": 0,
"public": 0
},
"archived": false,
"archivedAt": null,
"createdAt": "2026-01-05T12:00:00.000Z",
"createdBy": "user_123",
"updatedAt": "2026-01-05T12:00:00.000Z",
"updatedBy": "user_123",
"currentUser": null,
"html": "<p>This policy applies to all lease agreements...</p>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Get a knowledge document
Returns a knowledge document’s full detail — folder path, shares, direct children, links to any board/card/conversation, view counts, and content rendered as HTML.
currentUser is populated only when authenticated with a delegate token (its
userId is known); it is null for API keys and partner tokens, which are
company-wide credentials with no per-user permission check. A private document you
cannot view returns 404, the same as one that doesn’t exist. Unlike list/tree/
children, this is a direct by-id fetch, so an archived document is still
returned (with archived: true) rather than 404ing.
curl --request GET \
--url https://core-api.getaptly.com/api/knowledge/{id} \
--header 'x-token: <api-key>'import requests
url = "https://core-api.getaptly.com/api/knowledge/{id}"
headers = {"x-token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-token': '<api-key>'}};
fetch('https://core-api.getaptly.com/api/knowledge/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-api.getaptly.com/api/knowledge/{id}",
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-token: <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://core-api.getaptly.com/api/knowledge/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-token", "<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://core-api.getaptly.com/api/knowledge/{id}")
.header("x-token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api.getaptly.com/api/knowledge/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"_id": "kdoc_abc123",
"name": "Lease Addendum Policy",
"emoji": null,
"iconUrl": null,
"coverUrl": null,
"accessType": "public",
"isPrivate": false,
"shares": [],
"parentId": null,
"path": [],
"children": [],
"childCount": 0,
"links": {
"aptletUuid": null,
"aptletInstanceId": null,
"streamId": null
},
"published": false,
"publishedAt": null,
"views": {
"internal": 0,
"public": 0
},
"archived": false,
"archivedAt": null,
"createdAt": "2026-01-05T12:00:00.000Z",
"createdBy": "user_123",
"updatedAt": "2026-01-05T12:00:00.000Z",
"updatedBy": "user_123",
"currentUser": null,
"html": "<p>This policy applies to all lease agreements...</p>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
Path Parameters
The knowledge document ID.
Response
Knowledge document detail.
Full document detail returned by GET /api/knowledge/{id}.
Document ID.
Document title.
public, publicReadonly, private Show child attributes
Show child attributes
Root-first ancestor chain (folders above this document). Excludes this document.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Null for API key / partner token callers — those credentials are company-wide, so no per-user permission check is applied. Populated only for a delegate token, where the caller's own user identity is known.
Show child attributes
Show child attributes
Document body rendered as HTML.