---
title: "One Q&A ask turn (async)"
method: POST
path: "/dashboards/{dashboard_id}/qa/sessions/{session_id}/ask"
tags: ["Dashboard v3 Q&A"]
---

# One Q&A ask turn (async)

`POST /dashboards/{dashboard_id}/qa/sessions/{session_id}/ask`

## Request

- Base URL: `https://app.mammoth.io/api/v2`
- URL: `https://app.mammoth.io/api/v2/dashboards/{dashboard_id}/qa/sessions/{session_id}/ask`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-KEY` and API key in header `X-API-SECRET` and API key in header `X-WORKSPACE-ID`

Runs one agentic ask turn: the engine emits a constrained query plan, the descriptor executor computes RLS-scoped numbers, and each answer block is baked to SVG. Returns a job_id; poll /jobs/{id} for {answer}. Editors always ask; viewers ask unless allow_viewer_qa was switched off or the dashboard is shared by public link, and are capped per day.

## Path parameters

- `dashboard_id` integer, required
- `session_id` integer, required

## Request body

- AskSpec: One Q&A ask turn
  - `params` AskParams, required
    - `question` string, required: The viewer's question
    - `ask_id` string, nullable: The client's per-intent token. A retry of an ask whose response was lost carries the SAME token and is answered from the original job rather than starting a second one; a genuinely new question carries a new one. Optional — an ask without it is never deduped.
    - `filter_state` object: Interactive filter deltas keyed by field — every field must be a declared canvas filter (validated server-side), same shape as /data's filter_state. Applied to the scoped CTE this ask reads so Q&A agrees with whatever the viewer currently has the board filtered to.
    - `conversation_history` object[], nullable: The client-held session transcript — wins over the persisted transcript when provided (mockup parity)

## Response `201`

Document created, URL follows

- ObjectJobSchema
  - `status_code` integer, nullable
  - `job_id` integer, nullable: Created job id
  - `failure_reason` string, nullable: Failure reason if status is failure

## Other responses

- `202`: Successfully Submitted
- `400`: Bad request syntax or unsupported method
- `403`: Request forbidden -- authorization will not help

---

[API](https://skmtc.dev/mammoth/apis/mammoth-analytics.md) · [All operations](https://skmtc.dev/mammoth/apis/mammoth-analytics/llms.txt) · [OpenAPI document](https://skmtc.dev/mammoth/apis/mammoth-analytics/revisions/fe078afe239b?raw)
