Ask a natural-language question
Answers a question in plain words. Shumi picks the data the question needs, fetches it and writes the answer. Paid per call, it costs 0.05 USDC.
The answer comes back as one JSON object with text and steps. This route does not use the standard envelope: its errors are a bare { "error": "..." } object.
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{
"text": "<string>",
"steps": [
"<unknown>"
]
}{
"error": "<string>"
}{
"x402Version": 1,
"accepts": [
{
"scheme": "exact",
"network": "base",
"maxAmountRequired": "5000",
"resource": "https://api.shumi.ai/api/cli/coin/risk/DOGE",
"payTo": "0x...",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"maxTimeoutSeconds": 60,
"extra": {
"name": "USD Coin",
"version": "2"
}
}
]
}{
"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
⌘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{
"text": "<string>",
"steps": [
"<unknown>"
]
}{
"error": "<string>"
}{
"x402Version": 1,
"accepts": [
{
"scheme": "exact",
"network": "base",
"maxAmountRequired": "5000",
"resource": "https://api.shumi.ai/api/cli/coin/risk/DOGE",
"payTo": "0x...",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"maxTimeoutSeconds": 60,
"extra": {
"name": "USD Coin",
"version": "2"
}
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}
