# Generate inbox reply

Generate a draft reply from the visible inbox conversation and its instructions. Nothing is sent until a person reviews and sends it. Uses workspace credits.

POST https://api.brigg.app/v1/operations/support.GenerateInboxReply

## Access & visibility

Allow `support.GenerateInboxReply` on your API key.

**Acting member required.** Send `Brigg-Act-As` with an [approved member account ID](https://developer.brigg.app/authentication#member-delegation). The key supplies permissions; the member selects whose data is used.

The selected member must be active and approved by the credential. This selects whose private data is used; the credential supplies permissions. Private ownership and project boundaries still apply.

[Set up authentication](https://developer.brigg.app/authentication) · [Choose permissions](https://developer.brigg.app/permissions)

## Request fields

Send a JSON object with the following fields. Required fields must be included; omit optional fields you do not need.
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `conversation_id` | string | Yes | Conversation record ID from ListConversations. Use the same approved member who can read its inbox and messages; an inbox ID is not a conversation ID. At least 1 character. |

## Generate a draft, then review it

Find a visible conversation with [List conversations](https://developer.brigg.app/reference/support/ListConversations). This call waits for generation and returns the reply body directly; there is no job ID to poll. It uses the visible recent conversation and inbox instructions, excludes internal notes, and charges AI usage to the workspace. Very long threads use the latest 100 messages.

Display the returned text in an editable draft and review facts, promises and tone. No message, saved draft or customer notification is created by this call. A person can continue the reply in Brigg. A later generation may return different wording; use the same idempotency key to recover a lost response, and a new key only for a deliberate new generation.

## Response

Returns **200 OK** with a JSON body.
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `suggestion` | string | Yes | Generated reply body as a text string, in the customer's language. It is neither saved nor sent. Review and edit it before presenting or sending it to the customer; treat generated text as untrusted content, not HTML. |

## Errors & retries

Set `BRIGG_REQUEST_ID` once for each logical action. The samples send it as `Idempotency-Key`. Reuse the same value and body on retries, including after a timeout; a missing response does not prove the action failed.

For rate limits, follow the server’s retry guidance and back off. See [HTTP errors](https://developer.brigg.app/http#errors) and [safe retries and limits](https://developer.brigg.app/reliability).

| HTTP status | Code | What to do |
| --- | --- | --- |
| 400 | `invalid_json` | Send a JSON object with Content-Type: application/json. |
| 400 | `invalid_input` | Check the request fields and types. Supply a stable Idempotency-Key containing 1–200 characters. |
| 401 | `invalid_key` | The workspace API key is missing, invalid or revoked. |
| 403 | `forbidden` | Check the key’s operation and resource grants. Supply Brigg-Act-As with a member authorized by the key’s delegation grant. The selected member must be active and approved by the credential. This selects whose private data is used; the credential supplies permissions. Private ownership and project boundaries still apply. |
| 404 | `not_found` | The requested operation or resource is not available to this credential. |
| 429 | `rate_limited` | This member has reached the reply-generation rate limit. Honor Retry-After before retrying. |
| 422 | `empty_thread` | The visible conversation has no customer or support message to draft from. Internal notes alone are not enough. |
| 503 | `llm_unavailable` | No usable draft was generated. Wait before retrying; no reply was saved or sent. |

## Next steps

- [List conversations](https://developer.brigg.app/reference/support/ListConversations)
- [List inbox messages](https://developer.brigg.app/reference/support/ListInboxMessages)

[Download OpenAPI](https://developer.brigg.app/openapi.json) · [Versioning & retirement](https://developer.brigg.app/versioning)

## Examples

### Draft a customer reply

The customer asked how to prepare a contacts import. The response is suggested text for review, not a sent message.
#### cURL


```sh
curl 'https://api.brigg.app/v1/operations/support.GenerateInboxReply' \
  -H "Authorization: Bearer $BRIGG_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Brigg-Act-As: $BRIGG_ACT_AS" \
  -H "Idempotency-Key: $BRIGG_REQUEST_ID" \
  --data-raw '{
  "conversation_id": "e_conversation_contacts"
}'
```

#### TypeScript


```typescript
const actAs = process.env.BRIGG_ACT_AS;
if (!actAs) throw new Error("Set BRIGG_ACT_AS to an approved member account ID.");

const requestId = process.env.BRIGG_REQUEST_ID;
if (!requestId) throw new Error("Set BRIGG_REQUEST_ID once per action and reuse it on retries.");

const response = await fetch("https://api.brigg.app/v1/operations/support.GenerateInboxReply", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BRIGG_API_KEY}`,
    "Content-Type": "application/json",
    "Brigg-Act-As": actAs,
    "Idempotency-Key": requestId, // Create once per action; reuse on retries.
  },
  body: JSON.stringify({
    "conversation_id": "e_conversation_contacts"
  }),
});
const result = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${result.error} — ${result.message}`);
console.log(result);
```

#### Python


```python
import json
import os
from urllib.request import Request, urlopen
from urllib.error import HTTPError

request_id = os.environ["BRIGG_REQUEST_ID"]  # Reuse for retries of this action.
payload = {
  "conversation_id": "e_conversation_contacts"
}
request = Request(
    "https://api.brigg.app/v1/operations/support.GenerateInboxReply",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['BRIGG_API_KEY']}",
        "Content-Type": "application/json",
        "Brigg-Act-As": os.environ["BRIGG_ACT_AS"],
        "Idempotency-Key": request_id,  # Create once per action; reuse on retries.
    },
    method="POST",
)
try:
    with urlopen(request) as response:
        print(json.load(response))
except HTTPError as error:
    print(error.code, json.load(error))
    raise
```

#### Response example


```json
{
  "suggestion": "You can upload a CSV with a header row and one contact per row. Include name and email columns. If you share the column names you use, I can help you check the mapping before importing."
}
```

## JSON schemas


```json-schema-request
{
  "type": "object",
  "properties": {
    "conversation_id": {
      "type": "string",
      "minLength": 1,
      "description": "Conversation record ID from ListConversations. Use the same approved member who can read its inbox and messages; an inbox ID is not a conversation ID."
    }
  },
  "required": [
    "conversation_id"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "conversation_id": "e_conversation_contacts"
    }
  ]
}
```


```json-schema-response
{
  "type": "object",
  "properties": {
    "suggestion": {
      "type": "string",
      "description": "Generated reply body as a text string, in the customer's language. It is neither saved nor sent. Review and edit it before presenting or sending it to the customer; treat generated text as untrusted content, not HTML."
    }
  },
  "required": [
    "suggestion"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "suggestion": "You can upload a CSV with a header row and one contact per row. Include name and email columns. If you share the column names you use, I can help you check the mapping before importing."
    }
  ]
}
```

