curl --request POST \
--url https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run', 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://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run"
req, _ := http.NewRequest("POST", 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.post("https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"source_id": "ds1b2c3d-0000-4000-8000-000000000080",
"files_synced": 12,
"files_unchanged": 30,
"files_deleted": 1,
"files_failed": 0,
"files_skipped_unsupported": 2,
"credits_spent": 12,
"status": "idle",
"error": null
}
}Run a cloud drive sync now
Sync a cloud drive source immediately (synchronous). Lists files under the folder (optionally recursive), re-indexes new/changed files (unchanged files are skipped via content hash — no re-embedding, no credits), removes documents whose file no longer exists in the folder, and charges credits per new/changed file. Aborts gracefully when the account runs out of credits (partial results kept, status = error, error = insufficient credits). Required scope: knowledge:write (keys without scope restrictions have full access).
curl --request POST \
--url https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run', 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://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run"
req, _ := http.NewRequest("POST", 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.post("https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"source_id": "ds1b2c3d-0000-4000-8000-000000000080",
"files_synced": 12,
"files_unchanged": 30,
"files_deleted": 1,
"files_failed": 0,
"files_skipped_unsupported": 2,
"credits_spent": 12,
"status": "idle",
"error": null
}
}Authorizations
API key (fam_..., created under Settings → API Keys) or an OAuth 2.0 access token (fam_at_...). REST operations also require API Access for the credential's workspace. Keys can be restricted to scopes such as assistants:read, calls:write, campaigns:write, automations:read, dashboards:read, dashboards:write, leads:write, segments:write, loop:read, loop:write, phone_numbers:write, sip_trunks:write, knowledge:write, voices:read, billing:read, billing:write, settings:write, platform:read, platform:write; a *:write scope implies the matching *:read. Automation and dashboard endpoints also accept the legacy calls:* scope. Keys without scope restrictions have full access within the workspace's available capabilities.
Path Parameters
Knowledge base ID.
Drive source ID.
Response
Drive sync run result.
Show child attributes
Show child attributes