curl --request GET \
--url https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.exec.com/rest/v1/knowledge-hub/sources/{source_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 => [
"Authorization: Bearer <token>"
],
]);
$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://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "s1a2b3c4d5e6",
"title": "Q2 pricing deck.pdf",
"source_type": "upload",
"status": "ready",
"content_format": "plain_text",
"token_count": 5234,
"has_images": false,
"external_url": null,
"summary": "Quarterly pricing and packaging overview.",
"cover": "",
"folders": [
{
"id": "f9a8b7c6d5e4",
"name": "File Attachments",
"emoji": "📎"
}
],
"created_by": {
"id": "u1a2b3c4d5e6",
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith"
},
"created_at": "2026-05-01T09:00:00Z",
"updated_at": "2026-05-01T09:05:00Z",
"processed_at": "2026-05-01T09:05:00Z",
"content": "…extracted text… (only when ?include=content)"
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or inactive API key"
}
}{
"error": {
"type": "not_found",
"message": "Scenario not found: abc123"
}
}Get source
Returns a single source by its UUID. Use ?include=content to fetch the
extracted text (read from object storage — heavier, so opt-in).
curl --request GET \
--url https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.exec.com/rest/v1/knowledge-hub/sources/{source_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 => [
"Authorization: Bearer <token>"
],
]);
$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://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exec.com/rest/v1/knowledge-hub/sources/{source_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "s1a2b3c4d5e6",
"title": "Q2 pricing deck.pdf",
"source_type": "upload",
"status": "ready",
"content_format": "plain_text",
"token_count": 5234,
"has_images": false,
"external_url": null,
"summary": "Quarterly pricing and packaging overview.",
"cover": "",
"folders": [
{
"id": "f9a8b7c6d5e4",
"name": "File Attachments",
"emoji": "📎"
}
],
"created_by": {
"id": "u1a2b3c4d5e6",
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith"
},
"created_at": "2026-05-01T09:00:00Z",
"updated_at": "2026-05-01T09:05:00Z",
"processed_at": "2026-05-01T09:05:00Z",
"content": "…extracted text… (only when ?include=content)"
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or inactive API key"
}
}{
"error": {
"type": "not_found",
"message": "Scenario not found: abc123"
}
}Authorizations
API key created in Settings > API.
Format: exec_live_ followed by 40 alphanumeric characters.
Path Parameters
The source's unique identifier (UUID)
Query Parameters
Comma-separated list of optional sections to include.
Available values: content (the extracted text).
"content"
Response
Source detail
A Knowledge Hub source — an uploaded file or ingested URL whose text is extracted and indexed.
Unique source identifier (UUID)
Source title
Where the source came from
upload, url, notion, google_drive, guru, page, integration Text-extraction status
pending, processing, ready, failed Format of the extracted content
markdown, plain_text, image, video Number of tokens in the extracted text
Whether the source contains images
Original URL for url/notion/guru/google_drive sources (null otherwise)
AI-generated summary of the source
Cover image reference (empty string if none)
Folders the source belongs to
Show child attributes
Show child attributes
User who added the source
Show child attributes
Show child attributes
When extraction finished
Extracted text (only included when requested via ?include=content)