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

# Troubleshooting: symptoms and fixes

> Why the assistant abstains on everything, why the model list is empty, why an ingestion job fails, and what a 401, 403 or 429 means, each with the fix to apply.

Symptoms, causes and fixes for the problems people meet most often, grouped by where they appear: answers, ingestion, API errors, the widget, and streaming and CORS. If an assistant is abstaining more than you expect, start with [Content best practices](/knowledge/content-best-practices) — the usual cause is that the answer is not in the ingested content, which is the system working rather than failing.

## Answers

<AccordionGroup>
  <Accordion title="Every question is answered with “I don't know based on the available knowledge.”">
    The assistant retrieves nothing it can answer from. Check, in order:

    1. **Ingestion finished.** Check the source's latest job on the **Knowledge** page, or with [Get a source's current job](/api-reference/knowledge/get-source-job). Questions asked before ingestion completes abstain.
    2. **Documents landed.** [List documents](/api-reference/knowledge/list-documents) for the collection. An empty list means the source produced nothing; check its URL, path filters and bounds.
    3. **The assistant uses the right collection.** Select **Knowledge** on the assistant's row on the **Assistants** page, or [get the assistant](/api-reference/assistants/get-assistant) and compare `knowledge_base_ids` with the collection you ingested into.
    4. **The content covers the question.** If it does not, abstaining is the correct answer. See [Content best practices](/knowledge/content-best-practices).
  </Accordion>

  <Accordion title="Asking a question returns 400 “This assistant is not available to answer questions”">
    The assistant has no knowledge attached, or its status is `disabled` or `archived`. On the
    **Assistants** page, select **Knowledge** on its row to attach a collection and **Activate** to
    set it live, or send `knowledge_base_ids` and `status` to [Update an
    assistant](/api-reference/assistants/update-assistant).
  </Accordion>

  <Accordion title="The model list is empty">
    Your deployment has no model provider configured, so it can neither answer nor ingest. Contact
    your MITHUNAI administrator.
  </Accordion>
</AccordionGroup>

## Ingestion

<AccordionGroup>
  <Accordion title="An ingestion job fails or ingests fewer pages than expected">
    * The site may be unreachable from MITHUNAI, or slower than the fetch timeouts allow.
    * The crawl may have reached its depth or page limit. Raise `max_depth` or `max_pages` within the allowed range, or use a sitemap.
    * Include and exclude patterns may be filtering out the pages you want.
    * URLs that resolve to private or internal network addresses are refused by design.

    See [Ingestion](/knowledge/ingestion).
  </Accordion>
</AccordionGroup>

## API errors

<AccordionGroup>
  <Accordion title="401 authentication_error with an API key">
    The key is missing, mistyped, revoked or expired, or was truncated when copied. The secret is
    shown only once, so if in doubt, create a new key and revoke the old one. Send it as
    `Authorization: Bearer arukz_sk_…`.
  </Accordion>

  <Accordion title="403 authorization_error">
    You are authenticated, but your role does not allow the action. Managing API keys always requires
    a signed-in Owner or Administrator; an API key is refused there whatever its role. See
    [Organisations and roles](/concepts/organizations-and-roles).
  </Accordion>

  <Accordion title="404 not_found for something that exists">
    The resource belongs to a different organisation from the one your credential acts in. Resources
    in other organisations are reported as not found by design.
  </Accordion>

  <Accordion title="409 conflict when asking a question">
    The conversation is still answering a previous question. A conversation handles one question at a
    time; wait for the first to finish, or start another conversation.
  </Accordion>

  <Accordion title="429 rate_limit_exceeded">
    Wait for the number of seconds in the `Retry-After` header, then retry. If many users share one
    office network, they share one budget before authentication; see [Rate
    limits](/api-reference/rate-limits).
  </Accordion>
</AccordionGroup>

## The widget

<AccordionGroup>
  <Accordion title="The widget does not appear on my page">
    Open the browser's developer console:

    * **A message from the widget** names the configuration problem, such as a missing `apiBaseUrl` or a key that does not start with `arukz_wk_`.
    * **A CORS error** means your page's origin is not allowed. It must be in **both** the embed's allowed origins and your deployment's allowlist, spelled exactly, for example `https://docs.example.com` with no trailing slash. `https://example.com` and `https://www.example.com` are different origins.
    * **No request at all** usually means the snippet is missing or was edited. Copy it again from **Operations → Widget embeds** and paste it unchanged; see the [widget guide](/channels/widget).
    * **The embed was revoked.** Revocation is permanent; create a new embed.
  </Accordion>

  <Accordion title="The widget appears, but every question fails with 400">
    The assistant the embed uses cannot answer: it is `disabled` or `archived`, or has no knowledge
    attached. On the **Assistants** page, select **Activate** and **Knowledge** on its row, or use
    [Update an assistant](/api-reference/assistants/update-assistant). An embed's assistant cannot be
    changed; to use a different one, create a new embed.
  </Accordion>

  <Accordion title="A widget conversation disappeared">
    Widget conversations belong to the browser tab that started them and end when the tab closes. This
    is deliberate, so shared computers do not reveal one visitor's questions to the next.
  </Accordion>
</AccordionGroup>

## Streaming and CORS

<AccordionGroup>
  <Accordion title="Streaming pauses, then shows the whole answer at once">
    A proxy between your client and MITHUNAI is buffering the response. Configure it not to buffer
    `text/event-stream` responses and to pass the `X-Accel-Buffering: no` header through.
  </Accordion>

  <Accordion title="A streamed request returned 200 but no answer">
    On a streaming request, `200` only means the stream opened. Read the final event:
    `answer.completed`, `answer.interrupted` or `answer.error`. See
    [Streaming](/api-reference/streaming).
  </Accordion>

  <Accordion title="Browser calls to the API fail with a CORS error">
    Expected. Apart from the widget endpoints, the API does not accept cross-origin browser requests. Call it from your backend. See [HTTP API](/channels/api).
  </Accordion>
</AccordionGroup>

## Still stuck?

Contact your MITHUNAI representative with the endpoint, the time, the error `code`, and the conversation or job ID involved. Never include API keys or other secrets.
