# Getting help

Something fails, a result looks wrong, or you have a question: ask the CallQA team. A person
of the team reads every ticket and answers, usually within a few hours on business days. The
answer reaches you in the app, by email, and through your coding agent if it opened the
ticket.

There are three ways to open a ticket. They all lead to the same conversation.

## From your coding agent (MCP)

If your agent uses the [MCP server](mcp.md), it can contact us itself, for example when a
tool fails in a way the error and its hint do not explain. Four tools:

| Tool | What it does | Scope |
|---|---|---|
| `contact_support` | Opens a ticket: `subject`, `message`, `kind`, optional `call_id`, `run_id`, `scenario_id`, `client` and `context` | `read` |
| `list_support_tickets` | The organization's tickets, with their status and unread answers | `read` |
| `get_support_ticket` | One ticket and every message: our answers have `author` `staff` | `read` |
| `reply_support_ticket` | Adds a message (and reopens the ticket) | `read` |

Any key can open a ticket, even a `read` only one, so an agent stuck on an error can always
reach us. A good ticket says what the agent was doing, the exact tool calls and error codes,
what it already tried, what it expected, and the ids involved. You can simply tell your
agent "report this to CallQA support".

When we answer, the agent reads it with `get_support_ticket`, and `get_setup_status` lists
answers not read yet. We also email the answer to the admins of your organization (and to
the person who created the key), since an agent cannot read email.

## From the app

**Support** in the sidebar lists your organization's tickets. **+ New ticket** opens one;
the thread page shows the conversation, a reply box and **Close ticket**. A badge on
**Support** counts our answers nobody of your organization has opened yet. Admins and
members open and reply; guests read.

## From the API

The same tickets under `/api/v1/support/tickets` (see the
[API reference](api-reference.md#support)):

```bash
curl -X POST https://app.callqa.dev/api/v1/support/tickets \
  -H "Authorization: Bearer $CALLQA_API_KEY" -H "Content-Type: application/json" \
  -d '{"kind": "bug", "subject": "Run stays queued",
       "body": "Run 3f0c... has been queued for 20 minutes.", "run_id": "3f0c..."}'
```

`GET /support/tickets/{id}` returns the messages; `POST /support/tickets/{id}/messages`
replies; `POST /support/tickets/{id}/close` closes.

## Kinds and statuses

Kinds: `bug`, `question`, `feedback`, `billing`, `abuse_report` (a call you think breaks the
[Acceptable Use Policy](/legal/aup/); these reach the team first).

| Status | Meaning |
|---|---|
| `open` | The team has to answer |
| `waiting_customer` | The team needs something from you |
| `answered` | The team answered |
| `closed` | Solved. A new reply reopens it |

## Good to know

- **Never send secrets.** API keys, passwords, tokens and webhook secrets do not belong in a
  ticket. Anything that looks like one is replaced by `[redacted secret]` before it is
  stored, and the answer says how many were removed (`secrets_redacted`).
- **Limits.** At most 20 new tickets and 200 messages a day per organization (`429
  rate_limited` beyond). Subject up to 200 characters, message up to 20,000, `context` up to
  8 KB of JSON.
- **Ids help.** A `call_id`, `run_id` or `scenario_id` of your organization is linked to the
  ticket, so we see the call, the run or the scenario at once.
- **Response time.** We aim to answer within a few hours on business days (Europe/Paris).
  This is not a contractual service level.
- **Email.** You can also write to hello@callqa.dev.
