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

# Getting help

> What to check first, what to include in a report, and where to send it.

## Check these first

Most issues resolve in under a minute:

<Steps>
  <Step title="Is the credential valid?">
    ```bash theme={null}
    engini whoami          # exit code 3 means the credential is missing or invalid
    curl -s https://api.engini.io/v1/auth/whoami -H "x-api-key: $ENGINI_API_KEY"
    ```
  </Step>

  <Step title="Is the connection healthy?">
    ```bash theme={null}
    engini connections list | jq -r '.[] | select(.is_alive == false) | .connection_name'
    ```

    An expired OAuth grant is the single most common cause of a tool that "suddenly stopped working".
  </Step>

  <Step title="Did the call fail, or did the tool fail?">
    A `200` with `isSuccess: false` means Engini reached the app and the app refused. See [Debug a failed tool call](/examples/debug-failed-execution) - `executionInfo.statusCode` tells you what the downstream system said.
  </Step>

  <Step title="Are you on a current SDK?">
    ```bash theme={null}
    engini --version
    ```

    Compare against the [changelog](/changelog). A removed endpoint on an old client looks exactly like a broken endpoint.
  </Step>
</Steps>

## What to include in a report

Two identifiers turn a vague report into a five-minute fix:

| Include                | Where to find it                                                     |
| ---------------------- | -------------------------------------------------------------------- |
| **`requestId`**        | The `x-request-id` response header, echoed in every error body       |
| **`historyId`**        | On a tool-execute response, whenever an execution record was created |
| The `errorCode`        | In the error envelope - not the message text, which may be reworded  |
| SDK / CLI version      | `engini --version`                                                   |
| A minimal reproduction | `engini tools call <slug> --args '{...}' --dry-run` output is ideal  |

```bash theme={null}
# capture both ids in one go
curl -s -D headers.txt -X POST "https://api.engini.io/v1/tools/$SLUG/execute" \
  -H "x-api-key: $ENGINI_API_KEY" -H "Content-Type: application/json" \
  -d '{"fields":{}}' | jq '{isSuccess, errorMessage, historyId}'
grep -i x-request-id headers.txt
```

<Warning>
  Never paste an API key, an OAuth token, or a connection's credential fields into a report or an issue. If you think a key has leaked, rotate it in your account settings first, then tell us.
</Warning>

## Where to send it

* **Email** - [support@engini.io](mailto:support@engini.io), with the identifiers above
* **Docs feedback** - if a page here is wrong or unclear, say so; documentation errors are treated as bugs

## Known behaviours that surprise people

Worth reading before you file anything:

* **`200` doesn't mean success** on tool execution - always branch on `isSuccess`
* **Polling for an OAuth token returns an empty body** while the user is still authorizing, not a 404
* **`select-objects` replaces the whole selection**, it isn't additive
* **The SDKs don't retry automatically** - handle `EnginiRateLimitError` and honor `Retry-After` yourself
* **Result handles in the CLI are local and short-lived** - pruned to the 20 most recent, and anything past 24h
