> ## Documentation Index
> Fetch the complete documentation index at: https://velt.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Ask Memory

Use this API to ask a natural-language question over your Memory. The answer is grounded in your judgments and ingested knowledge, and comes with citations and a confidence score. When retrieval finds no relevant context, `answer` is an empty string with `confidence: 0` rather than an invented answer; treat that as "Memory has nothing to say about this yet."

# Endpoint

`POST https://api.velt.dev/v2/memory/ask`

# Headers

<ParamField header="x-velt-api-key" type="string" required>
  Your API key.
</ParamField>

<ParamField header="x-velt-auth-token" type="string" required>
  Your [Auth Token](/docs/security/auth-tokens).
</ParamField>

# Body

#### Params

<ParamField body="data" type="object" required>
  <Expandable title="properties">
    <ParamField body="question" type="string" required>
      Non-empty natural-language question.
    </ParamField>

    <ParamField body="organizationId" type="string">
      Narrow to one organization. `orgId` is accepted as an alias.
    </ParamField>

    <ParamField body="documentId" type="string">
      Narrow to one document. Only applied when `organizationId` is also set. Without `organizationId`, `documentId` is ignored and the question runs across the whole workspace. `docId` is accepted as an alias.
    </ParamField>

    <ParamField body="filters" type="object">
      Same shape as the [Search Judgments](/docs/api-reference/rest-apis/v2/memory/search) filters, including the `decision` values and the `dateRange` bounds. `annotationId` requires `organizationId`.
    </ParamField>

    <ParamField body="filters.excludeDocumentIds" type="string[]">
      Leave out judgments belonging to specific documents. 1 to 20 ids, each non-empty. An empty array is rejected. Pass either the document id you sent to Velt or the id a Memory response returned; both forms match.

      This narrows the judgments the answer is built from. It does not narrow the workspace-level context `ask` also reads, because reviewer profiles, detected patterns, and alerts are aggregates that carry no per-document origin. An answer can still reflect an excluded document through those aggregates.
    </ParamField>

    <ParamField body="recencyDays" type="integer">
      1 to 365. Recency-true retrieval instead of vector search. Returns activity from the last `recencyDays` complete UTC days. The window ends at the start of the current UTC day, so activity later in the current UTC day is not returned. Overrides `filters.dateRange`. If `filters.annotationId` is also set, the annotation shortcut wins and `recencyDays` is ignored.
    </ParamField>
  </Expandable>
</ParamField>

## **Example Requests**

#### Ask a policy question

```JSON theme={null}
{
  "data": {
    "question": "How do we handle marketing copy that makes medical claims?"
  }
}
```

# Response

`answer` is the grounded answer (an empty string when there is no grounding context). `citations` are the records the model reports it drew on. They are returned as-is and are not verified against the retrieved set, so treat a `recordId` as a hint and handle the case where it does not resolve. `confidence` is `0` when the answer is empty. `recordsSearched` is the number of judgment records put in front of the model.

#### Success Response

```JSON theme={null}
{
  "result": {
    "answer": "Reviewers consistently reject copy that makes medical claims without a citation...",
    "citations": [
      { "recordId": "act_8f3...", "snippet": "Claim 'clinically proven' lacks a citation." }
    ],
    "confidence": 0.74,
    "recordsSearched": 18
  }
}
```

#### Failure Response

On a validation error, `details.issues` lists every failing field, not just the one in `message`.

```JSON theme={null}
{
  "error": {
    "message": "ERROR_MESSAGE",
    "status": "INVALID_ARGUMENT",
    "details": {
      "issues": [
        { "code": "invalid_type", "path": ["question"], "message": "question is required" }
      ]
    }
  }
}
```

<ResponseExample>
  ```js theme={null}
  {
    "result": {
      "answer": "Reviewers consistently reject copy that makes medical claims without a citation...",
      "citations": [
        { "recordId": "act_8f3...", "snippet": "Claim 'clinically proven' lacks a citation." }
      ],
      "confidence": 0.74,
      "recordsSearched": 18
    }
  }
  ```
</ResponseExample>
