/v1/ai/askAsk PropZolo: a question in plain words → a validated query, the result and a grounded answer
The model sees the caller’s field catalogue only (no records) and returns a plan in the query language; the server validates it against the caller’s whitelist and field rules, runs it with their view scope, and the model writes the answer from the result alone (an unsourced figure replaces it with the server’s own answer).
Access: Signed-in members only (web or Android session) — not for API keys. Permission ai.copilot.
Request body
questionrequired- string
previous_id- Id or null
The previous question, for follow-ups.
Response · 200
datarequired- AskAnswer
metarequired- object
curl -X POST 'https://api.propzolo.com/v1/ai/ask' \
-H 'Authorization: Bearer pz_live_…' \
-H 'Content-Type: application/json' \
-d '{"question":"string","previous_id":"cmusrceel0000q7kaafxqi1om"}'{
"data": {
"id": "cmusrceel0000q7kaafxqi1om",
"status": "answered",
"explanation": "string",
"clarifying_question": "string",
"reason": "string",
"plan": {
"kind": "query",
"query": {
"entity": "string",
"filter": null,
"range": {
"field": "string",
"preset": "today",
"from": "string",
"to": "string"
},
"measures": [
{
"fn": null,
"field": null
}
],
"group_by": {
"field": "string",
"bucket": "day"
},
"sort": {
"by": "value",
"field": "string",
"dir": "asc"
},
"limit": 1
}
},
"description": "string",
"result": {
"mode": "list",
"entity": "string",
"title": "string",
"columns": [
{
"key": "string",
"label": "string",
"kind": "text"
}
],
"rows": [
{
"key": "string",
"label": "string",
"name": "string",
"cells": {},
"link": "string",
"filter": null
}
],
"totals": {},
"matched": 0,
"truncated": true,
"range": {
"label": "string",
"from_day": "string",
"to_day": "string"
},
"notes": [
"string"
]
},
"labels": {},
"answer": {
"text": "string",
"source": "ai",
"citations": [
"string"
],
"follow_ups": [
"string"
]
},
"findings": [
{
"validator": "grounding",
"code": "string",
"severity": "info",
"message": "string",
"path": "string",
"match": "string",
"action": "flagged"
}
],
"blocked": true,
"credits": 0,
"request_id": "string"
},
"meta": {}
}Errors
401No valid session or API key (missing, expired or revoked).402CREDITS_EXHAUSTED — the AI wallet is empty or the monthly AI limit is reached.403The caller lacks the permission, API-key scope or support grant this operation needs.409A unique value already exists, a concurrent change won, or the Idempotency-Key is still in use or was sent with a different request.422Invalid input; `error.fields` maps field paths to messages.429Too many requests; retry after the Retry-After header.500Unexpected error; quote `error.request_id` to support.503NOT_CONFIGURED — AI is not set up on this PropZolo deployment (ask your PropZolo admin).

