Ask a natural-language question
Runs the full Shumi engine: classify, plan, execute tools, generate. Returns a streamed response.
This route does not use the standard envelope — it streams, and its errors are { "error": "..." }.
POST
/
api
/
cli
Ask a natural-language question
curl --request POST \
--url https://api.shumi.ai/api/cli \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"messages": [
{
"role": "user",
"content": "Is BTC funding crowded right now?"
}
]
}
'import requests
url = "https://api.shumi.ai/api/cli"
payload = { "messages": [
{
"role": "user",
"content": "Is BTC funding crowded right now?"
}
] }
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({messages: [{role: 'user', content: 'Is BTC funding crowded right now?'}]})
};
fetch('https://api.shumi.ai/api/cli', 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.shumi.ai/api/cli",
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([
'messages' => [
[
'role' => 'user',
'content' => 'Is BTC funding crowded right now?'
]
]
]),
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://api.shumi.ai/api/cli"
payload := strings.NewReader("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Is BTC funding crowded right now?\"\n }\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://api.shumi.ai/api/cli")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Is BTC funding crowded right now?\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shumi.ai/api/cli")
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 \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Is BTC funding crowded right now?\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body"<string>"{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
An API key (shumi_sk_…) or a session JWT. Create a key with shumi login and shumi keys create.
Body
application/json
Conversation history. The last message must have role user.
Show child attributes
Show child attributes
Optional EVM address, used for entitlement resolution.
Anonymous device identifier. Grants exactly one free query.
Return the unformatted engine payload.
Optional persona applied to the answer.
Prior CLI command context, folded into the prompt.
Response
Streamed answer.
The response is of type string.
⌘I
Ask a natural-language question
curl --request POST \
--url https://api.shumi.ai/api/cli \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"messages": [
{
"role": "user",
"content": "Is BTC funding crowded right now?"
}
]
}
'import requests
url = "https://api.shumi.ai/api/cli"
payload = { "messages": [
{
"role": "user",
"content": "Is BTC funding crowded right now?"
}
] }
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({messages: [{role: 'user', content: 'Is BTC funding crowded right now?'}]})
};
fetch('https://api.shumi.ai/api/cli', 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.shumi.ai/api/cli",
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([
'messages' => [
[
'role' => 'user',
'content' => 'Is BTC funding crowded right now?'
]
]
]),
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://api.shumi.ai/api/cli"
payload := strings.NewReader("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Is BTC funding crowded right now?\"\n }\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://api.shumi.ai/api/cli")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Is BTC funding crowded right now?\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shumi.ai/api/cli")
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 \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Is BTC funding crowded right now?\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body"<string>"{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}
