Call a tool
curl --request POST \
--url https://app.outlit.ai/api/tools/call \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tool": "outlit_list_customers",
"input": {
"activatedSince": "2023-11-07T05:31:56Z",
"mrrAbove": 1,
"mrrBelow": 1,
"traitFilters": {},
"search": "<string>",
"ownerId": "<string>",
"ownerEmail": "<string>",
"hasOwner": true,
"limit": 50,
"cursor": "<string>",
"orderBy": "last_activity_at",
"orderDirection": "desc"
}
}
'import requests
url = "https://app.outlit.ai/api/tools/call"
payload = {
"tool": "outlit_list_customers",
"input": {
"activatedSince": "2023-11-07T05:31:56Z",
"mrrAbove": 1,
"mrrBelow": 1,
"traitFilters": {},
"search": "<string>",
"ownerId": "<string>",
"ownerEmail": "<string>",
"hasOwner": True,
"limit": 50,
"cursor": "<string>",
"orderBy": "last_activity_at",
"orderDirection": "desc"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tool: 'outlit_list_customers',
input: {
activatedSince: '2023-11-07T05:31:56Z',
mrrAbove: 1,
mrrBelow: 1,
traitFilters: {},
search: '<string>',
ownerId: '<string>',
ownerEmail: '<string>',
hasOwner: true,
limit: 50,
cursor: '<string>',
orderBy: 'last_activity_at',
orderDirection: 'desc'
}
})
};
fetch('https://app.outlit.ai/api/tools/call', 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.outlit.ai/api/tools/call",
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([
'tool' => 'outlit_list_customers',
'input' => [
'activatedSince' => '2023-11-07T05:31:56Z',
'mrrAbove' => 1,
'mrrBelow' => 1,
'traitFilters' => [
],
'search' => '<string>',
'ownerId' => '<string>',
'ownerEmail' => '<string>',
'hasOwner' => true,
'limit' => 50,
'cursor' => '<string>',
'orderBy' => 'last_activity_at',
'orderDirection' => 'desc'
]
]),
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.outlit.ai/api/tools/call"
payload := strings.NewReader("{\n \"tool\": \"outlit_list_customers\",\n \"input\": {\n \"activatedSince\": \"2023-11-07T05:31:56Z\",\n \"mrrAbove\": 1,\n \"mrrBelow\": 1,\n \"traitFilters\": {},\n \"search\": \"<string>\",\n \"ownerId\": \"<string>\",\n \"ownerEmail\": \"<string>\",\n \"hasOwner\": true,\n \"limit\": 50,\n \"cursor\": \"<string>\",\n \"orderBy\": \"last_activity_at\",\n \"orderDirection\": \"desc\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.outlit.ai/api/tools/call")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tool\": \"outlit_list_customers\",\n \"input\": {\n \"activatedSince\": \"2023-11-07T05:31:56Z\",\n \"mrrAbove\": 1,\n \"mrrBelow\": 1,\n \"traitFilters\": {},\n \"search\": \"<string>\",\n \"ownerId\": \"<string>\",\n \"ownerEmail\": \"<string>\",\n \"hasOwner\": true,\n \"limit\": 50,\n \"cursor\": \"<string>\",\n \"orderBy\": \"last_activity_at\",\n \"orderDirection\": \"desc\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.outlit.ai/api/tools/call")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tool\": \"outlit_list_customers\",\n \"input\": {\n \"activatedSince\": \"2023-11-07T05:31:56Z\",\n \"mrrAbove\": 1,\n \"mrrBelow\": 1,\n \"traitFilters\": {},\n \"search\": \"<string>\",\n \"ownerId\": \"<string>\",\n \"ownerEmail\": \"<string>\",\n \"hasOwner\": true,\n \"limit\": 50,\n \"cursor\": \"<string>\",\n \"orderBy\": \"last_activity_at\",\n \"orderDirection\": \"desc\"\n }\n}"
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "<string>",
"name": "<string>",
"domain": "<string>",
"billingStatus": "NONE",
"activatedAt": "<string>",
"firstSeenAt": "<string>",
"lastActivityAt": "<string>",
"contactCount": 4503599627370495,
"currentMrr": 123,
"mrrCalculationStatus": "calculated",
"owner": {
"id": "<string>",
"email": "<string>",
"name": "<string>"
},
"daysSinceActivity": 4503599627370495
}
],
"pagination": {
"hasMore": true,
"nextCursor": "<string>",
"total": 4503599627370495
}
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}Call a tool
Call customer intelligence tools through the public tool gateway.
POST
/
api
/
tools
/
call
Call a tool
curl --request POST \
--url https://app.outlit.ai/api/tools/call \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tool": "outlit_list_customers",
"input": {
"activatedSince": "2023-11-07T05:31:56Z",
"mrrAbove": 1,
"mrrBelow": 1,
"traitFilters": {},
"search": "<string>",
"ownerId": "<string>",
"ownerEmail": "<string>",
"hasOwner": true,
"limit": 50,
"cursor": "<string>",
"orderBy": "last_activity_at",
"orderDirection": "desc"
}
}
'import requests
url = "https://app.outlit.ai/api/tools/call"
payload = {
"tool": "outlit_list_customers",
"input": {
"activatedSince": "2023-11-07T05:31:56Z",
"mrrAbove": 1,
"mrrBelow": 1,
"traitFilters": {},
"search": "<string>",
"ownerId": "<string>",
"ownerEmail": "<string>",
"hasOwner": True,
"limit": 50,
"cursor": "<string>",
"orderBy": "last_activity_at",
"orderDirection": "desc"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tool: 'outlit_list_customers',
input: {
activatedSince: '2023-11-07T05:31:56Z',
mrrAbove: 1,
mrrBelow: 1,
traitFilters: {},
search: '<string>',
ownerId: '<string>',
ownerEmail: '<string>',
hasOwner: true,
limit: 50,
cursor: '<string>',
orderBy: 'last_activity_at',
orderDirection: 'desc'
}
})
};
fetch('https://app.outlit.ai/api/tools/call', 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.outlit.ai/api/tools/call",
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([
'tool' => 'outlit_list_customers',
'input' => [
'activatedSince' => '2023-11-07T05:31:56Z',
'mrrAbove' => 1,
'mrrBelow' => 1,
'traitFilters' => [
],
'search' => '<string>',
'ownerId' => '<string>',
'ownerEmail' => '<string>',
'hasOwner' => true,
'limit' => 50,
'cursor' => '<string>',
'orderBy' => 'last_activity_at',
'orderDirection' => 'desc'
]
]),
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.outlit.ai/api/tools/call"
payload := strings.NewReader("{\n \"tool\": \"outlit_list_customers\",\n \"input\": {\n \"activatedSince\": \"2023-11-07T05:31:56Z\",\n \"mrrAbove\": 1,\n \"mrrBelow\": 1,\n \"traitFilters\": {},\n \"search\": \"<string>\",\n \"ownerId\": \"<string>\",\n \"ownerEmail\": \"<string>\",\n \"hasOwner\": true,\n \"limit\": 50,\n \"cursor\": \"<string>\",\n \"orderBy\": \"last_activity_at\",\n \"orderDirection\": \"desc\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.outlit.ai/api/tools/call")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tool\": \"outlit_list_customers\",\n \"input\": {\n \"activatedSince\": \"2023-11-07T05:31:56Z\",\n \"mrrAbove\": 1,\n \"mrrBelow\": 1,\n \"traitFilters\": {},\n \"search\": \"<string>\",\n \"ownerId\": \"<string>\",\n \"ownerEmail\": \"<string>\",\n \"hasOwner\": true,\n \"limit\": 50,\n \"cursor\": \"<string>\",\n \"orderBy\": \"last_activity_at\",\n \"orderDirection\": \"desc\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.outlit.ai/api/tools/call")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tool\": \"outlit_list_customers\",\n \"input\": {\n \"activatedSince\": \"2023-11-07T05:31:56Z\",\n \"mrrAbove\": 1,\n \"mrrBelow\": 1,\n \"traitFilters\": {},\n \"search\": \"<string>\",\n \"ownerId\": \"<string>\",\n \"ownerEmail\": \"<string>\",\n \"hasOwner\": true,\n \"limit\": 50,\n \"cursor\": \"<string>\",\n \"orderBy\": \"last_activity_at\",\n \"orderDirection\": \"desc\"\n }\n}"
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "<string>",
"name": "<string>",
"domain": "<string>",
"billingStatus": "NONE",
"activatedAt": "<string>",
"firstSeenAt": "<string>",
"lastActivityAt": "<string>",
"contactCount": 4503599627370495,
"currentMrr": 123,
"mrrCalculationStatus": "calculated",
"owner": {
"id": "<string>",
"email": "<string>",
"name": "<string>"
},
"daysSinceActivity": 4503599627370495
}
],
"pagination": {
"hasMore": true,
"nextCursor": "<string>",
"total": 4503599627370495
}
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}{
"code": "INVALID_JSON",
"message": "<string>",
"retryable": true,
"requestId": "<string>",
"plan": "<string>",
"feature": "<string>",
"resetAt": 123,
"limitBytes": 123,
"actualBytes": 123,
"validationIssues": [
{
"code": "<string>",
"path": "<string>"
}
]
}Authentication
Pass an Outlit API key in theAuthorization header as Bearer ok_....
Request body
{
"tool": "outlit_list_customers",
"input": {
"limit": 10,
"billingStatus": "PAYING"
}
}
tool is a public tool name. The table below lists the main tools; Integration tools
also documents two compatibility handoff tools. input is the tool-specific object, validated
against the shared @outlit/tools contract before the tool runs.
Supported tools
Customers and people
| Tool | Purpose |
|---|---|
outlit_list_customers | Browse and filter customers by billing status, activity recency, revenue, traits, or name |
outlit_list_users | Browse and filter users by journey stage, activity recency, customer, traits, email, or name |
outlit_get_customer | Get full details for one customer, with optional related sections |
outlit_get_customer_relationship | Bounded relationship read model: categorized statements with source labels (no raw fact IDs or quotes) |
outlit_get_customer_credits | Read imported credit pools, remaining credits, burn rate, and runway for one customer |
Identity
| Tool | Purpose |
|---|---|
outlit_get_customer_identity | Read a customer’s identity coverage and bounded possible-split records |
outlit_list_identity_merge_suggestions | Browse saved identity merge suggestions and history |
outlit_reject_identity_merge_suggestion | Reject one saved suggestion by exact ID |
outlit_merge_customers | Preview then execute a two-phase customer merge by exact UUIDs |
outlit_get_customer_merge_status | Track a merge operation by its operation ID |
Attention
| Tool | Purpose |
|---|---|
outlit_list_attention_items | List authorized open or resolved attention items (bounded fields, preparedActionUrl) |
outlit_get_attention_item | Retrieve one attention item by exact UUID |
Access
| Tool | Purpose |
|---|---|
outlit_list_workspace_users | Browse internal workspace users such as CSMs, managers, account owners, and admins |
outlit_assign_customer_owner | Assign an active workspace member as the customer’s primary owner |
outlit_grant_customer_access | Share a customer with an active workspace member as a Viewer or Editor |
outlit_update_customer_access | Change an existing customer collaborator between Viewer and Editor |
outlit_revoke_customer_access | Remove a collaborator’s explicit access to a customer |
Timeline and sources
| Tool | Purpose |
|---|---|
outlit_get_timeline | Get chronological customer activity across product, billing, support, and conversation channels |
outlit_list_facts | Browse stored customer facts and evidence |
outlit_get_fact | Retrieve one exact customer fact |
outlit_get_source | Retrieve one exact source record behind a fact or search result |
outlit_list_sources | List concrete source records such as calls, emails, calendar events, support tickets, Slack conversations, or opportunities |
outlit_search_customer_context | Search customer context semantically |
Analytics
| Tool | Purpose |
|---|---|
outlit_query | Run SQL against customer intelligence views |
outlit_schema | Inspect available analytics views |
Features
| Tool | Purpose |
|---|---|
outlit_list_features | Read configured Features, exact historical usage, eligible sources, and ready, partial, or unavailable candidate discovery |
outlit_create_feature | Create or idempotently return one Feature observed by one event rule |
outlit_archive_feature | Archive a Feature using its opaque id and current revision when another active feature remains |
outlit_get_customer_features | Read exact historical Feature usage for one authorized customer |
Configuration
| Tool | Purpose |
|---|---|
outlit_list_destinations | List destinations with masked configuration |
outlit_get_destination | Read one destination with masked configuration |
outlit_create_destination | Create a delivery destination |
outlit_update_destination | Update a destination |
outlit_enable_destination | Enable a destination |
outlit_disable_destination | Disable a destination |
outlit_archive_destination | Archive a destination |
outlit_get_integration_capabilities | Check supported setup steps without sending credentials |
outlit_setup_integration | Complete a supported credential, mapping, or browser handoff step |
outlit_get_integration_status | Read whether an integration is configured and ready |
outlit_begin_integration_setup | Start an older browser handoff without sending credentials |
outlit_get_integration_setup_status | Check the status of an older authentication handoff |
outlit_get_customer_activation | Read the configured activation event |
outlit_preview_customer_activation | Preview an event against past activity without changing activation |
outlit_update_customer_activation | Set the ordinary activation event |
outlit_get_workspace_settings | Read supported workspace settings |
outlit_update_workspace_settings | Update a supported workspace setting |
Feedback
| Tool | Purpose |
|---|---|
outlit_submit_feedback | Submit product feedback — bugs, ideas, or agent friction — to the Outlit team |
outlit_submit_feedback accepts body (required, trimmed, non-empty, at most 20,000
characters), optional area (trimmed, non-empty, at most 100 characters), and optional
context (a JSON object of at most 16 KiB serialized, for diagnostics such as the surface
or client version — never secrets or unnecessary customer data). It returns the recorded
feedback id and createdAt timestamp.
Submissions require authentication and are rate limited under a dedicated quota; they do not
consume paid plan API-call quota. Feedback is product intake, not a support ticket, and does
not guarantee a reply.
For schema-driven clients, @outlit/tools publishes tool input schemas as publicToolContracts.
TypeScript client
Use@outlit/tools when you want the same tool names and input contracts that power the CLI, Pi package, and public tool gateway:
npm install @outlit/tools
import { createOutlitClient, publicToolContracts } from "@outlit/tools"
const outlit = createOutlitClient({
apiKey: process.env.OUTLIT_API_KEY!,
})
const result = await outlit.callTool(
publicToolContracts.outlit_search_customer_context.toolName,
{
query: "What pricing concerns came up recently?",
customer: "acme.com",
sourceTypes: ["CALL", "EMAIL", "SUPPORT_TICKET", "OPPORTUNITY"],
topK: 5,
},
)
publicToolContracts, publicToolNames, server-defined consumerToolPolicies, defaultToolNames, analyticalToolNames, piToolNames, cliToolNames, allPublicToolNames, publicOpenApiTransports, toolGatewayTransport, apiKeyValidationTransport, toolGatewayErrorCodes, toolGatewayErrorSchema, ingestTransport, and enum lists such as customerSourceTypes. OPPORTUNITY is the canonical CRM opportunity source type; CRM and CRM_OPPORTUNITY are accepted input aliases.
Examples
List paying customers
curl -X POST https://app.outlit.ai/api/tools/call \
-H "Authorization: Bearer ok_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"tool": "outlit_list_customers",
"input": {
"billingStatus": "PAYING",
"limit": 10
}
}'
Get customer details
{
"tool": "outlit_get_customer",
"input": {
"customer": "acme.com",
"include": ["users", "revenue", "recentTimeline"],
"timeframe": "30d"
}
}
Search customer context
{
"tool": "outlit_search_customer_context",
"input": {
"customer": "acme.com",
"query": "What renewal concerns came up recently?",
"sourceTypes": ["EMAIL", "CALL", "SUPPORT_TICKET", "OPPORTUNITY"],
"after": "2026-01-01T00:00:00Z",
"topK": 5
}
}
customer to search across all customers. The top-level customer is the
customer you scoped to, or null for a search across customers. Each source and
fact result also carries a customer (id, name, domain) naming the customer
it belongs to. A result’s customer is null when it can’t be attributed to exactly
one customer you can read. Servers that predate the field omit it, so treat a missing
customer like null.
{
"tool": "outlit_search_customer_context",
"input": {
"query": "Who raised security concerns?",
"topK": 5
}
}
{
"customer": null,
"results": [
{
"kind": "source",
"score": 0.91,
"sourceType": "EMAIL",
"sourceId": "email_123",
"customer": { "id": "cust_123", "name": "Acme", "domain": "acme.com" },
"occurredAt": "2026-08-12T14:05:00Z",
"title": "Security review before renewal",
"permalink": null,
"matchCount": 1,
"matches": [{ "text": "Can you send your SOC 2 Type II report before we renew?" }]
},
{
"kind": "source",
"score": 0.87,
"sourceType": "CALL",
"sourceId": "call_456",
"customer": { "id": "cust_789", "name": "Globex", "domain": "globex.com" },
"occurredAt": "2026-08-20T16:00:00Z",
"title": "Q3 business review",
"permalink": null,
"matchCount": 2,
"matches": [{ "text": "Their CISO asked about data residency and SSO enforcement." }]
}
]
}
List active contact transition facts
{
"tool": "outlit_list_facts",
"input": {
"customer": "acme.com",
"status": ["ACTIVE"],
"sourceTypes": ["CALL", "OPPORTUNITY"],
"factTypes": ["CONTACT_DEPARTURE", "CONTACT_POSITION_CHANGE", "CONTACT_DISENGAGEMENT"],
"after": "2026-01-01T00:00:00Z",
"limit": 20
}
}
Open one source record
{
"tool": "outlit_get_source",
"input": {
"sourceType": "OPPORTUNITY",
"sourceId": "opp_123"
}
}
Read exact source content
Exact lookup can include acontentPage with bounded content segments. The default
page size is 10 segments, with a maximum of 100. Pass the returned
contentPage.page.nextCursor with the same source type and ID when
contentPage.page.hasMore is true. Check contentPage.completeness before treating
the content as complete.
{
"tool": "outlit_get_source",
"input": {
"sourceType": "CALL",
"sourceId": "call_123",
"limit": 10
}
}
{
"sourceType": "CALL",
"sourceId": "call_123",
"occurredAt": "2026-09-01T12:00:00Z",
"title": "Renewal discussion",
"summary": "The customer asked for a renewal proposal.",
"permalink": null,
"provider": "gong",
"customer": { "id": "cust_123", "name": "Acme", "domain": "acme.com" },
"participants": [],
"record": {},
"contentPage": {
"sourceType": "CALL",
"sourceId": "call_123",
"contentKind": "call_transcript",
"segments": [{ "id": "segment_1", "text": "Please send the renewal proposal." }],
"page": { "returned": 1, "hasMore": false, "nextCursor": null },
"completeness": { "status": "complete", "omittedFields": [] }
}
}
Follow person profile evidence
When a fact or search result references aPERSON_PROFILE source, use its source ID
for exact lookup. Replace the example ID with the ID from that reference.
{
"tool": "outlit_get_source",
"input": {
"sourceType": "PERSON_PROFILE",
"sourceId": "snapshot_123"
}
}
Read customer features
{
"tool": "outlit_get_customer_features",
"input": {
"customer": "acme.com",
"weeks": 12
}
}
Submit product feedback
{
"tool": "outlit_submit_feedback",
"input": {
"body": "The merge preview did not list the losing record's traits.",
"area": "customers",
"context": { "surface": "cli", "command": "customers merge" }
}
}
{ "id": "10000000-0000-4000-8000-000000000004", "createdAt": "2026-09-28T12:00:00.000Z" }. See
Feedback for input limits. Feedback is product intake, not a support ticket.
Response
The response is the selected tool’s JSON result. List tools return paginated collections; exact lookup tools return the matched record or an error when the record cannot be found. Search returns grouped artifact-levelsource and fact results, not raw vector chunks. Fact results include provenance fields such as sourceType, sourceId, sourceOccurredAt, sourceQuote, and permalink when available.
Money amounts such as currentMrr, lifetimeRevenue, and accountImportance.arrCents are in the billing provider’s units for the currency they were billed in. For USD, EUR, GBP, and CAD these are cents: divide by 100 (for example, 1234500 is 12,345inUSD).Othercurrenciesfollowtheprovider′samountrules(see[Stripe′scurrencydocs](https://docs.stripe.com/currencies)),sodon′tassumeadivisorforthem.Attentionitemsreturnthecurrencyalongside‘arrCents‘;customerresultsdon′tnameit.ARRis12בcurrentMrr‘inthesameunits.TheexamplebelowisforacustomerbilledinUSD,so‘"currentMrr":25000‘is250 MRR.
Example list response:
{
"items": [
{
"id": "cus_123",
"name": "Acme",
"domain": "acme.com",
"billingStatus": "PAYING",
"activatedAt": "2026-01-15T09:30:00.000Z",
"firstSeenAt": "2025-12-02T17:05:00.000Z",
"lastActivityAt": "2026-04-10T18:22:11.000Z",
"contactCount": 42,
"currentMrr": 25000,
"mrrCalculationStatus": "calculated",
"owner": null,
"daysSinceActivity": 3
}
],
"pagination": {
"hasMore": true,
"nextCursor": "cursor_abc",
"total": 128
}
}
Error responses
Invalid JSON, unknown tool names, or invalid tool inputs return400:
{
"code": "INVALID_TOOL_INPUT",
"message": "Invalid tool input",
"retryable": false,
"requestId": "req_123"
}
401. Plan API-call limits can return 402 or 429 with a stable billing code.Authorizations
Outlit API key (ok_...).
Body
application/json
- List customers
- List users
- List workspace users
- Get customer
- Get customer relationship
- Assign customer owner
- Grant customer access
- Update customer access
- Revoke customer access
- Get timeline
- List facts
- Get fact
- Get source
- List sources
- Search customer context
- Query analytics
- Inspect analytics schema
- List destinations
- Get destination
- Create destination
- Update destination
- Enable destination
- Disable destination
- Archive destination
- Submit feedback
- Get integration capabilities
- Begin integration setup
- Get integration setup status
- Get integration status
- Set up integration
- Get customer activation
- Preview customer activation
- Update customer activation
- Get workspace settings
- Update workspace settings
- List features
- Create feature
- Archive feature
- Get customer features
- Get customer credits
- List attention items
- Get attention item
- Get customer identity
- List identity merge suggestions
- Reject identity merge suggestion
- Merge customers
- Get customer merge status
- List scoped repairs
- Preview scoped repair
- Execute scoped repair
- Verify scoped repair
Response
Capability output
- List customers
- List users
- List workspace users
- Get customer
- Get customer relationship
- Assign customer owner
- Grant customer access
- Update customer access
- Revoke customer access
- Get timeline
- List facts
- Get fact
- Get source
- List sources
- Search customer context
- Query analytics
- Inspect analytics schema
- Inspect analytics schema
- List destinations
- Get destination
- Create destination
- Update destination
- Enable destination
- Disable destination
- Archive destination
- Submit feedback
- Get integration capabilities
- Begin integration setup
- Get integration setup status
- Get integration status
- Set up integration
- Get customer activation
- Preview customer activation
- Update customer activation
- Get workspace settings
- Update workspace settings
- List features
- Create feature
- Archive feature
- Get customer features
- Get customer credits
- List attention items
- Get attention item
- Get customer identity
- List identity merge suggestions
- Reject identity merge suggestion
- Merge customers
- Merge customers
- Get customer merge status
- List scoped repairs
- Preview scoped repair
- Execute scoped repair
- Verify scoped repair
Was this page helpful?
