> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://agentinbox.space/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://agentinbox.space/_mcp/server.

# Как избежать повторной отправки?

Ретраи из-за сети или багов могут отправить одно письмо дважды. Ниже — как это предотвратить.

## Создание ресурсов: `clientId`

Для **create** (ящики, pod, webhook, черновики) передайте `clientId`: если ресурс уже есть, API вернёт его, а не создаст дубликат.

**`TypeScript`**

```typescript title="TypeScript"
import { AgentinboxClient } from "agentinbox";

const client = new AgentinboxClient({ apiKey: "am_..." });

const inbox = await client.inboxes.create({
  username: "support",
  clientId: "support-inbox-v1",
});

const sameInbox = await client.inboxes.create({
  username: "support",
  clientId: "support-inbox-v1",
});
```

## Отправка писем: не через `clientId` на send

`messages.send` без встроенной идемпотентности ключа — логика в приложении.

### Метки как состояние

**`TypeScript`**

```typescript title="TypeScript"
const threads = await client.inboxes.threads.list(inbox.inboxId, {
  labels: ["unreplied"],
});

for (const thread of threads.threads) {
  const detail = await client.threads.get(thread.threadId);
  const lastMessage = detail.messages[detail.messages.length - 1];

  await client.inboxes.messages.reply(inbox.inboxId, lastMessage.messageId, {
    text: "Thanks for reaching out!",
  });

  await client.inboxes.messages.update(inbox.inboxId, lastMessage.messageId, {
    addLabels: ["replied"],
    removeLabels: ["unreplied"],
  });
}
```

### Черновики для критичных писем

**`TypeScript`**

```typescript title="TypeScript"
const draft = await client.inboxes.drafts.create(inbox.inboxId, {
  to: ["customer@example.com"],
  subject: "Order confirmation",
  text: "Your order has been confirmed.",
  html: "<p>Your order has been confirmed.</p>",
  clientId: "order-123-confirmation",
});

const sent = await client.inboxes.drafts.send(inbox.inboxId, draft.draftId);
```

После отправки черновик удаляется — повторный `send` не продублирует письмо.

## Практика

* `clientId` на всех create из бизнес-логики (`order-${id}-...`), не случайный UUID
* Метки против двойной обработки одного сообщения
* Черновики там, где дубликат недопустим

Подробнее: [Идемпотентность](/idempotency).