List questions
Returns the clarifying questions the caller's own recent GL raises — the unusual postings a founder should look at (outliers, reversals, round-offs, uncosted revenue, an overdrawn wallet), sharpest first.
GET /v1/books/questions
| Address | https://api.hanzo.ai/v1/books/questions |
| Method | GET |
| Operation | get_books_questions |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Returns the clarifying questions the caller's own recent GL raises — the unusual postings a founder should look at (outliers, reversals, round-offs, uncosted revenue, an overdrawn wallet), sharpest first. An empty list means the books look clean; the detector is deterministic over the ledger and invents nothing.
Request
1 field.
| Field | In | Type | Required | Description |
|---|---|---|---|---|
sandbox | query | string | — | Sandbox reads the org's SANDBOX ledger when it is exactly "true"; anything else reads the live one. |
Response
| Status | Body | Meaning |
|---|---|---|
200 | books.QuestionsResponse | ok |
default | problem-details | refused |
200 body — 7 fields.
| Field | In | Type | Always | Description |
|---|---|---|---|---|
questions | body | books.Question[] | — | Questions are what the books want explained, SHARPEST FIRST — largest amounts ahead of smaller ones, and capped, so this is the top of the list rather than everything. |
questions[].account | body | string | — | Account is the chart number the questioned entry posted to, where one applies. |
questions[].amount | body | string | — | Amount is the figure that makes the question concrete, already FORMATTED for display with its currency symbol — a string, not cents, and not for arithmetic. |
questions[].id | body | string | — | ID is the source transaction the question is about, so answering it leads straight back to the entry that raised it. |
questions[].kind | body | string | — | Kind is what looked wrong: outlier (a charge far above the usual), reversal (a posting undone), roundoff (a balancing plug big enough to be worth explaining), uncosted (revenue booked with no cost matched to it), or overdrawn (a wallet spent past its balance). |
questions[].postedAt | body | string | — | PostedAt anchors the question in time — when the entry it concerns posted. |
questions[].text | body | string | — | Text is the question itself, written for a founder to answer directly. |
Failure carries the platform error shape — see Errors.
Examples
hanzo books questionsimport { Configuration, BooksApi } from 'hanzoai';
const api = new BooksApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getBooksQuestions();from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import BooksApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = BooksApi(client).get_books_questions()cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)
resp, _, err := client.BooksAPI.GetBooksQuestions(context.Background()).Execute()
if err != nil {
return err
}use hanzo_client::apis::{configuration::Configuration, books_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = books_api::get_books_questions(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.BooksApi;
ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));
var result = new BooksApi(client).getBooksQuestions();curl https://api.hanzo.ai/v1/books/questions \
-H "Authorization: Bearer $HANZO_API_KEY"MCP reaches books through the books tool, which names its 20 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:
curl -X POST https://api.hanzo.ai/v1/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "describe",
"arguments": {
"op": "list_book_accounts"
}
}
}'