curl --request POST \
--url https://beta.getsales.io/unibox/v1/api/agent-sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Team-SID: <api-key>' \
--data '
{
"url": "<string>",
"agent_sid": "<string>",
"kind": "website",
"scope": "<string>",
"instruction": "<string>"
}
'import requests
url = "https://beta.getsales.io/unibox/v1/api/agent-sources"
payload = {
"url": "<string>",
"agent_sid": "<string>",
"kind": "website",
"scope": "<string>",
"instruction": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Team-SID": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Team-SID': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: '<string>',
agent_sid: '<string>',
kind: 'website',
scope: '<string>',
instruction: '<string>'
})
};
fetch('https://beta.getsales.io/unibox/v1/api/agent-sources', 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://beta.getsales.io/unibox/v1/api/agent-sources",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'agent_sid' => '<string>',
'kind' => 'website',
'scope' => '<string>',
'instruction' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Team-SID: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://beta.getsales.io/unibox/v1/api/agent-sources"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"agent_sid\": \"<string>\",\n \"kind\": \"website\",\n \"scope\": \"<string>\",\n \"instruction\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Team-SID", "<api-key>")
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.post("https://beta.getsales.io/unibox/v1/api/agent-sources")
.header("Authorization", "Bearer <token>")
.header("Team-SID", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"agent_sid\": \"<string>\",\n \"kind\": \"website\",\n \"scope\": \"<string>\",\n \"instruction\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://beta.getsales.io/unibox/v1/api/agent-sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Team-SID"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"agent_sid\": \"<string>\",\n \"kind\": \"website\",\n \"scope\": \"<string>\",\n \"instruction\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"operation": "create",
"item": {
"sid": "<string>",
"team_sid": "<string>",
"agent_sid": "<string>",
"kind": "file",
"title": "<string>",
"status": "reading",
"instruction": "<string>",
"file": {
"name": "<string>",
"format": "pdf",
"mime": "<string>",
"bytes": 1,
"pages": 1
},
"website": {
"url": "<string>",
"scope": "<string>",
"refresh": "weekly",
"pages": 1
},
"progress": {
"done": 1,
"total": 1
},
"failure": {
"reason": "unreadable",
"message": "<string>"
},
"read_at": "<string>",
"next_refresh_at": "<string>",
"created_by": {
"actor_type": "user",
"actor_sid": "<string>",
"team_sid": "<string>",
"permissions": {},
"actor_name": "<string>",
"oauth_client_sid": "<string>",
"reason": "<string>",
"cluster_id": 123,
"trace_id": "<string>"
},
"created_at": "<string>",
"updated_at": "<string>"
},
"already_exists": true,
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}Add a website to the Knowledge
Add a website to the Knowledge: its start address, the scope under it (the address’s own path unless given), how often it is read again (weekly unless said, or daily) and how to read it (instruction, up to 600 chars; suggest_agent_source_instruction writes one from its first pages). Nothing is read yet: parse_agent_source starts the read. A file is uploaded in the app.
Contract:
- MCP tool
create_agent_source, registry packagemcp.unibox/agent_sources, mountunibox.knowledge. - Operation
create, response envelopecreate. - Flags: none.
curl --request POST \
--url https://beta.getsales.io/unibox/v1/api/agent-sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Team-SID: <api-key>' \
--data '
{
"url": "<string>",
"agent_sid": "<string>",
"kind": "website",
"scope": "<string>",
"instruction": "<string>"
}
'import requests
url = "https://beta.getsales.io/unibox/v1/api/agent-sources"
payload = {
"url": "<string>",
"agent_sid": "<string>",
"kind": "website",
"scope": "<string>",
"instruction": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Team-SID": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Team-SID': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: '<string>',
agent_sid: '<string>',
kind: 'website',
scope: '<string>',
instruction: '<string>'
})
};
fetch('https://beta.getsales.io/unibox/v1/api/agent-sources', 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://beta.getsales.io/unibox/v1/api/agent-sources",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'agent_sid' => '<string>',
'kind' => 'website',
'scope' => '<string>',
'instruction' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Team-SID: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://beta.getsales.io/unibox/v1/api/agent-sources"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"agent_sid\": \"<string>\",\n \"kind\": \"website\",\n \"scope\": \"<string>\",\n \"instruction\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Team-SID", "<api-key>")
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.post("https://beta.getsales.io/unibox/v1/api/agent-sources")
.header("Authorization", "Bearer <token>")
.header("Team-SID", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"agent_sid\": \"<string>\",\n \"kind\": \"website\",\n \"scope\": \"<string>\",\n \"instruction\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://beta.getsales.io/unibox/v1/api/agent-sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Team-SID"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"agent_sid\": \"<string>\",\n \"kind\": \"website\",\n \"scope\": \"<string>\",\n \"instruction\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"operation": "create",
"item": {
"sid": "<string>",
"team_sid": "<string>",
"agent_sid": "<string>",
"kind": "file",
"title": "<string>",
"status": "reading",
"instruction": "<string>",
"file": {
"name": "<string>",
"format": "pdf",
"mime": "<string>",
"bytes": 1,
"pages": 1
},
"website": {
"url": "<string>",
"scope": "<string>",
"refresh": "weekly",
"pages": 1
},
"progress": {
"done": 1,
"total": 1
},
"failure": {
"reason": "unreadable",
"message": "<string>"
},
"read_at": "<string>",
"next_refresh_at": "<string>",
"created_by": {
"actor_type": "user",
"actor_sid": "<string>",
"team_sid": "<string>",
"permissions": {},
"actor_name": "<string>",
"oauth_client_sid": "<string>",
"reason": "<string>",
"cluster_id": 123,
"trace_id": "<string>"
},
"created_at": "<string>",
"updated_at": "<string>"
},
"already_exists": true,
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}{
"success": false,
"error": {
"code": "validation_failed",
"message": "<string>",
"recoverable": true,
"suggestion": "<string>",
"field_errors": {},
"blockers": [
{
"type": "<string>",
"severity": "hard",
"description": "<string>",
"entity_sid": "<string>",
"resolution": "<string>",
"resolution_hint": "<string>",
"count": 123
}
],
"context": {}
},
"meta": {
"trace_id": "<string>",
"span_id": "<string>",
"timestamp": "<string>",
"duration_ms": 1,
"team_sid": "<string>",
"actor_type": "<string>"
}
}Authorizations
Access token issued by gs.service.id. Its access_identity claim carries team_sid, actor_sid and actor_type, and that team scope is authoritative.
Team scope for tokens that do not carry one. Ignored when the token already names a team.
Body
Request body of create_agent_source.
The start address (https when no scheme is given; a public host). The pages under it are read.
4 - 2048The AI SDR it is made for (ub_ag_…, block 10, 2026-10-30); left out, the team's default agent.
18^ub_ag_website, the only kind a call adds (a file is uploaded in the app); may be left out.
website The path the pages are read under ("/docs"); the address's own path unless given, / for the whole site.
1024How often it is read again by itself: weekly unless said, or daily.
weekly, daily How to read it, in plain words: what the document is, what to read out (the questions a lead would ask), what to skip, how exact. Up to 600 chars.
600