curl --request PATCH \
--url https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Developer documentation",
"root_url": "<string>",
"include_paths": [
"<string>"
],
"exclude_paths": [
"<string>"
],
"max_pages": 250,
"auto_sync": true,
"sync_interval_hours": 2
}
'import requests
url = "https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}"
payload = {
"name": "Developer documentation",
"root_url": "<string>",
"include_paths": ["<string>"],
"exclude_paths": ["<string>"],
"max_pages": 250,
"auto_sync": True,
"sync_interval_hours": 2
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Developer documentation',
root_url: '<string>',
include_paths: ['<string>'],
exclude_paths: ['<string>'],
max_pages: 250,
auto_sync: true,
sync_interval_hours: 2
})
};
fetch('https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}', 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}/crawl-sources/{sourceId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Developer documentation',
'root_url' => '<string>',
'include_paths' => [
'<string>'
],
'exclude_paths' => [
'<string>'
],
'max_pages' => 250,
'auto_sync' => true,
'sync_interval_hours' => 2
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}"
payload := strings.NewReader("{\n \"name\": \"Developer documentation\",\n \"root_url\": \"<string>\",\n \"include_paths\": [\n \"<string>\"\n ],\n \"exclude_paths\": [\n \"<string>\"\n ],\n \"max_pages\": 250,\n \"auto_sync\": true,\n \"sync_interval_hours\": 2\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Developer documentation\",\n \"root_url\": \"<string>\",\n \"include_paths\": [\n \"<string>\"\n ],\n \"exclude_paths\": [\n \"<string>\"\n ],\n \"max_pages\": 250,\n \"auto_sync\": true,\n \"sync_interval_hours\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Developer documentation\",\n \"root_url\": \"<string>\",\n \"include_paths\": [\n \"<string>\"\n ],\n \"exclude_paths\": [\n \"<string>\"\n ],\n \"max_pages\": 250,\n \"auto_sync\": true,\n \"sync_interval_hours\": 2\n}"
response = http.request(request)
puts response.read_body{
"data": {
"source": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Help center",
"root_url": "<string>",
"include_paths": [
"<string>"
],
"exclude_paths": [
"<string>"
],
"max_pages": 50,
"auto_sync": true,
"sync_interval_hours": 24,
"status": "idle",
"last_error": "<string>",
"last_crawled_at": "2023-11-07T05:31:56Z",
"pages_crawled": 123,
"credits_spent": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}
}Update a crawl source
Update a website crawl source (custom display name, root URL, include paths, page limit, or auto-sync settings). Required scope: knowledge:write (keys without scope restrictions have full access).
curl --request PATCH \
--url https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Developer documentation",
"root_url": "<string>",
"include_paths": [
"<string>"
],
"exclude_paths": [
"<string>"
],
"max_pages": 250,
"auto_sync": true,
"sync_interval_hours": 2
}
'import requests
url = "https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}"
payload = {
"name": "Developer documentation",
"root_url": "<string>",
"include_paths": ["<string>"],
"exclude_paths": ["<string>"],
"max_pages": 250,
"auto_sync": True,
"sync_interval_hours": 2
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Developer documentation',
root_url: '<string>',
include_paths: ['<string>'],
exclude_paths: ['<string>'],
max_pages: 250,
auto_sync: true,
sync_interval_hours: 2
})
};
fetch('https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}', 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}/crawl-sources/{sourceId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Developer documentation',
'root_url' => '<string>',
'include_paths' => [
'<string>'
],
'exclude_paths' => [
'<string>'
],
'max_pages' => 250,
'auto_sync' => true,
'sync_interval_hours' => 2
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}"
payload := strings.NewReader("{\n \"name\": \"Developer documentation\",\n \"root_url\": \"<string>\",\n \"include_paths\": [\n \"<string>\"\n ],\n \"exclude_paths\": [\n \"<string>\"\n ],\n \"max_pages\": 250,\n \"auto_sync\": true,\n \"sync_interval_hours\": 2\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Developer documentation\",\n \"root_url\": \"<string>\",\n \"include_paths\": [\n \"<string>\"\n ],\n \"exclude_paths\": [\n \"<string>\"\n ],\n \"max_pages\": 250,\n \"auto_sync\": true,\n \"sync_interval_hours\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/knowledge-bases/{id}/crawl-sources/{sourceId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Developer documentation\",\n \"root_url\": \"<string>\",\n \"include_paths\": [\n \"<string>\"\n ],\n \"exclude_paths\": [\n \"<string>\"\n ],\n \"max_pages\": 250,\n \"auto_sync\": true,\n \"sync_interval_hours\": 2\n}"
response = http.request(request)
puts response.read_body{
"data": {
"source": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Help center",
"root_url": "<string>",
"include_paths": [
"<string>"
],
"exclude_paths": [
"<string>"
],
"max_pages": 50,
"auto_sync": true,
"sync_interval_hours": 24,
"status": "idle",
"last_error": "<string>",
"last_crawled_at": "2023-11-07T05:31:56Z",
"pages_crawled": 123,
"credits_spent": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}
}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, 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.
Crawl source ID.
Body
Any subset of the create fields. Only provided fields are changed.
Response
The updated crawl source.
Show child attributes
Show child attributes