resend-cli 2.20.1 → 2.22.0-preview-inboxes.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resend-cli",
3
- "version": "2.20.1",
3
+ "version": "2.22.0-preview-inboxes.0",
4
4
  "description": "The official CLI for Resend",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -46,7 +46,7 @@
46
46
  "esbuild": "0.28.1",
47
47
  "esbuild-wasm": "0.28.0",
48
48
  "picocolors": "1.1.1",
49
- "resend": "6.27.0"
49
+ "resend": "6.28.1-preview-inboxes.0"
50
50
  },
51
51
  "pkg": {
52
52
  "scripts": [
@@ -13,7 +13,7 @@ metadata:
13
13
  author: resend
14
14
  # Skill version is independent from the CLI/package.json version —
15
15
  # bump it on skill content changes, not CLI releases.
16
- version: "2.12.1"
16
+ version: "2.17.0"
17
17
  homepage: https://resend.com/docs/cli-agents
18
18
  source: https://github.com/resend/resend-cli
19
19
  openclaw:
@@ -59,6 +59,7 @@ references:
59
59
  - references/logs.md
60
60
  - references/careers.md
61
61
  - references/suppressions.md
62
+ - references/inboxes.md
62
63
  - references/webhooks.md
63
64
  - references/auth.md
64
65
  - references/workflows.md
@@ -136,10 +137,11 @@ Auth resolves: `RESEND_API_KEY` env > config file (`resend login --key`). Use `-
136
137
  | `logs` | list, get, open |
137
138
  | `careers` | list, apply — browse open positions at Resend and apply |
138
139
  | `suppressions` _(beta)_ | list, add, get, delete, batch — requires account enrollment |
140
+ | `inboxes` _(beta)_ | create, list, get, update, delete, threads (list, get, update, delete, emails get/reply/forward), labels, drafts — requires account enrollment |
139
141
  | `api-keys` | create, list, update, delete |
140
142
  | `automations` | create, get, list, update, delete, duplicate, stop, open, runs |
141
143
  | `events` | create, get, list, update, delete, send, open |
142
- | `broadcasts` | create, send, get, update, delete, list, cancel, open, clicked-links, recipients |
144
+ | `broadcasts` | create, send, get, update, delete, list, cancel, duplicate, open, clicked-links, recipients |
143
145
  | `contacts` | create, update, delete, segments, topics, imports |
144
146
  | `contact-properties` | create, update, delete, list |
145
147
  | `segments` | create, get, list, update, delete, contacts |
@@ -221,6 +223,7 @@ resend doctor -q
221
223
  - **Viewing API request logs** → [references/logs.md](references/logs.md)
222
224
  - **Browsing or applying to jobs at Resend** → [references/careers.md](references/careers.md)
223
225
  - **Managing the suppression list** (beta) → [references/suppressions.md](references/suppressions.md)
226
+ - **Managing inboxes and received email** (beta) → [references/inboxes.md](references/inboxes.md)
224
227
  - **Creating automations or sending events** → [references/automations.md](references/automations.md)
225
228
  - **Setting up webhooks or listening for events** → [references/webhooks.md](references/webhooks.md)
226
229
  - **Auth, profiles, or health checks** → [references/auth.md](references/auth.md)
@@ -102,6 +102,14 @@ Cancelling a queued broadcast stops it mid-send — emails already sent are not
102
102
 
103
103
  ---
104
104
 
105
+ ## broadcasts duplicate
106
+
107
+ **Argument:** `<id>` — Broadcast ID
108
+
109
+ The copy is a draft named `<name> (copy)`, truncated to 70 characters, with the same segment, topic, from, subject, reply-to, preview text, and content. Any broadcast can be duplicated, including sent ones.
110
+
111
+ ---
112
+
105
113
  ## broadcasts delete
106
114
 
107
115
  **Argument:** `<id>` — Broadcast ID
@@ -0,0 +1,343 @@
1
+ # inboxes
2
+
3
+ Detailed flag specifications for `resend inboxes` commands.
4
+
5
+ > **Beta:** Inboxes is a pre-GA feature gated per account. Commands appear in
6
+ > `--help` but return an API error unless inboxes is enabled for your account.
7
+ > Reach out to Resend to join the beta.
8
+
9
+ An inbox is an email address at one of your verified domains (with receiving
10
+ enabled) that can receive email. Received messages are grouped into threads
11
+ inside the inbox. Inboxes require a **full-access** API key — sending-only keys
12
+ are rejected.
13
+
14
+ ---
15
+
16
+ ## inboxes create
17
+
18
+ Create a new inbox at one of your verified domains.
19
+
20
+ | Flag | Type | Required | Description |
21
+ |------|------|----------|-------------|
22
+ | `--email-address <address>` | string | Yes (non-interactive) | Address for the inbox, e.g. `support@yourdomain.com` |
23
+ | `--name <name>` | string | No | Inbox name shown in the dashboard (max 64 chars) |
24
+ | `--forwarding` | boolean | No | Enable forwarding — received emails are also forwarded to a generated forwarding address |
25
+
26
+ **Output:** `{"object":"inbox","id":"<uuid>","name":"<name>","email_address":"<address>","domain_id":"<uuid>","forwarding_address":"<address>"|null,"unread":0,"created_at":"<date>"}`
27
+
28
+ ---
29
+
30
+ ## inboxes list
31
+
32
+ List all inboxes (default subcommand — `resend inboxes` alone runs it).
33
+
34
+ | Flag | Type | Default | Description |
35
+ |------|------|---------|-------------|
36
+ | `--limit <n>` | number | 10 | Max results, 1-100 |
37
+ | `--after <cursor>` | string | — | Forward pagination cursor (an inbox ID) |
38
+ | `--before <cursor>` | string | — | Backward pagination cursor (an inbox ID) |
39
+
40
+ **Alias:** `ls`
41
+
42
+ **Output:** `{"object":"list","has_more":false,"data":[{"id":"<uuid>","name":"<name>"|null,"email_address":"<address>","unread":0,"last_received":"<date>"|null}]}`
43
+
44
+ ---
45
+
46
+ ## inboxes get
47
+
48
+ Retrieve a single inbox.
49
+
50
+ **Argument:** `<id>` — inbox UUID (required in non-interactive mode)
51
+
52
+ **Output:** `{"object":"inbox","id":"<uuid>","name":"<name>"|null,"email_address":"<address>","forwarding_address":"<address>"|null,"unread":0,"drafts":0,"last_received":"<date>"|null}`
53
+
54
+ ---
55
+
56
+ ## inboxes update
57
+
58
+ Update an inbox's name. The email address cannot be changed after creation.
59
+
60
+ **Argument:** `<id>` — inbox UUID
61
+
62
+ | Flag | Type | Required | Description |
63
+ |------|------|----------|-------------|
64
+ | `--name <name>` | string | Yes | New inbox name (max 64 chars) |
65
+
66
+ **Output:** `{"object":"inbox","id":"<uuid>"}`
67
+
68
+ ---
69
+
70
+ ## inboxes threads list
71
+
72
+ List threads in an inbox (default subcommand of `resend inboxes threads`).
73
+ Pages are fixed at 50 threads, newest activity first — there is no `--limit`.
74
+
75
+ **Flags:** `--inbox-id <id>` — required in non-interactive mode
76
+
77
+ | Flag | Type | Default | Description |
78
+ |------|------|---------|-------------|
79
+ | `--folder <folder>` | string | `inbox` | One of `inbox`, `archive`, `spam`, `sent`, `trash` |
80
+ | `--query <text>` | string | — | Search subject, sender, and label names |
81
+ | `--from <sender>` | string | — | Filter by sender address or name |
82
+ | `--label <labelId>` | string | — | Filter by label **UUID** (not name); repeat for multiple |
83
+ | `--cursor <cursor>` | string | — | `next_cursor` from a previous response |
84
+
85
+ **Alias:** `ls`
86
+
87
+ **Output:** `{"object":"list","has_more":false,"next_cursor":"<cursor>"|null,"data":[{"id":"<uuid>","subject":"<subject>"|null,"from":"<sender>"|null,"to":[],"cc":[],"bcc":[],"labels":[],"message_count":1,"has_attachment":false,"has_draft":false,"read":false,"received_at":"<date>"}]}`
88
+
89
+ ---
90
+
91
+ ## inboxes threads get
92
+
93
+ Retrieve a thread with every message inline, including `html` and `text`
94
+ bodies. Use the message `id` values as the email ID for replies.
95
+
96
+ **Flags:** `--inbox-id <id> --thread-id <id>` — required in non-interactive mode
97
+
98
+ **Output:** `{"object":"inbox_thread","id":"<uuid>","subject":"<subject>"|null,"folder":"inbox","labels":[],"read":true,"messages":{"has_more":false,"data":[{"id":"<uuid>","direction":"inbound|outbound","from":"<sender>","to":[],"subject":"<subject>"|null,"html":"<html>"|null,"text":"<text>"|null,"attachments":[],"read":true,"received_at":"<date>"}]}}`
99
+
100
+ ---
101
+
102
+ ## inboxes threads update
103
+
104
+ Mark a thread read/unread, move it, or apply a label. At least one option is
105
+ required.
106
+
107
+ **Flags:** `--inbox-id <id> --thread-id <id>` — required in non-interactive mode
108
+
109
+ | Flag | Type | Description |
110
+ |------|------|-------------|
111
+ | `--read` | boolean | Mark every message in the thread as read |
112
+ | `--unread` | boolean | Mark every message in the thread as unread |
113
+ | `--folder <folder>` | string | Move to one of `inbox`, `archive`, `spam`, `trash` (`sent` is not a valid target) |
114
+ | `--label-id <labelId>` | string | Apply this label (UUID) to the thread |
115
+
116
+ **Output:** `{"object":"inbox_thread","id":"<uuid>","subject":"<subject>"|null,"folder":"<folder>","labels":[],"read":true}`
117
+
118
+ ---
119
+
120
+ ## inboxes threads delete
121
+
122
+ Delete a thread and all of its messages.
123
+
124
+ **Flags:** `--inbox-id <id> --thread-id <id>` — required in non-interactive mode
125
+
126
+ | Flag | Type | Required | Description |
127
+ |------|------|----------|-------------|
128
+ | `--yes` | boolean | Yes (non-interactive) | Skip confirmation |
129
+
130
+ **Alias:** `rm`
131
+
132
+ **Output:** `{"object":"inbox_thread","id":"<uuid>","deleted":true}`
133
+
134
+ ---
135
+
136
+ ## inboxes threads emails get
137
+
138
+ Retrieve a single email from a thread.
139
+
140
+ **Flags:** `--inbox-id <id> --thread-id <id> --email-id <id>` — required in non-interactive mode
141
+
142
+ **Output:** `{"id":"<uuid>","direction":"inbound|outbound","from":"<sender>","to":[],"cc":[],"bcc":[],"reply_to":[],"subject":"<subject>"|null,"html":"<html>"|null,"text":"<text>"|null,"attachments":[{"id":"<id>","filename":"<name>"|null,"size":123}],"read":true,"received_at":"<date>"}`
143
+
144
+ ---
145
+
146
+ ## inboxes threads emails reply
147
+
148
+ Reply to a specific email in a thread. The reply is sent from the inbox
149
+ address to the sender of the original email.
150
+
151
+ **Flags:** `--inbox-id <id> --thread-id <id> --email-id <id>` — required in
152
+ non-interactive mode; the email ID comes from `inboxes threads get`
153
+
154
+ | Flag | Type | Required | Description |
155
+ |------|------|----------|-------------|
156
+ | `--text <text>` | string | One of text/html | Plain text reply body |
157
+ | `--html <html>` | string | One of text/html | HTML reply body |
158
+ | `--subject <subject>` | string | No | Override the reply subject |
159
+
160
+ **Output:** `{"id":"<uuid>","email_id":"<uuid>","direction":"outbound","from":"<inbox-address>","to":["<recipient>"],"text":"<text>"|null,"html":"<html>"|null,"read":true,"received_at":"<date>"}`
161
+
162
+ ---
163
+
164
+ ## inboxes threads emails forward
165
+
166
+ Forward an email to other recipients from the inbox address.
167
+
168
+ **Flags:** `--inbox-id <id> --thread-id <id> --email-id <id>` — required in non-interactive mode
169
+
170
+ | Flag | Type | Required | Description |
171
+ |------|------|----------|-------------|
172
+ | `--to <address>` | string | Yes | Recipient; repeat the flag for multiple |
173
+ | `--text <text>` | string | No | Plain text note to include |
174
+ | `--html <html>` | string | No | HTML note to include |
175
+ | `--subject <subject>` | string | No | Override the forwarded subject |
176
+
177
+ **Output:** `{"id":"<uuid>","email_id":"<uuid>","direction":"outbound","from":"<inbox-address>","to":["<recipient>"],"text":"<text>"|null,"html":"<html>"|null,"attachments":[],"read":true,"received_at":"<date>"}`
178
+
179
+ ---
180
+
181
+ ## inboxes labels list
182
+
183
+ List all labels in an inbox (not paginated; default subcommand of
184
+ `resend inboxes labels`). Use label IDs with `threads update --label-id` and
185
+ `threads list --label`.
186
+
187
+ **Flags:** `--inbox-id <id>` — required in non-interactive mode
188
+
189
+ **Alias:** `ls`
190
+
191
+ **Output:** `{"object":"list","has_more":false,"data":[{"id":"<uuid>","name":"<name>","color":"<color>","created_at":"<date>"}]}`
192
+
193
+ ---
194
+
195
+ ## inboxes labels create
196
+
197
+ Create a label. An inbox can have up to 100 labels.
198
+
199
+ **Flags:** `--inbox-id <id>` — required in non-interactive mode
200
+
201
+ | Flag | Type | Required | Description |
202
+ |------|------|----------|-------------|
203
+ | `--name <name>` | string | Yes (non-interactive) | Label name, max 64 characters |
204
+ | `--color <color>` | string | No | One of `cyan`, `teal`, `grass`, `lime`, `yellow`, `orange`, `iris`, `plum`, `crimson`, `bronze`, `mauve` (random when omitted) |
205
+
206
+ **Output:** `{"object":"inbox_label","id":"<uuid>","name":"<name>","color":"<color>","created_at":"<date>"}`
207
+
208
+ ---
209
+
210
+ ## inboxes labels update
211
+
212
+ Update a label's name or color. At least one option is required.
213
+
214
+ **Flags:** `--inbox-id <id> --label-id <id>` — required in non-interactive mode
215
+
216
+ | Flag | Type | Description |
217
+ |------|------|-------------|
218
+ | `--name <name>` | string | New label name |
219
+ | `--color <color>` | string | New label color (same choices as create) |
220
+
221
+ **Output:** `{"object":"inbox_label","id":"<uuid>"}`
222
+
223
+ ---
224
+
225
+ ## inboxes labels delete
226
+
227
+ Delete a label. It is removed from every thread that has it.
228
+
229
+ **Flags:** `--inbox-id <id> --label-id <id>` — required in non-interactive mode
230
+
231
+ | Flag | Type | Required | Description |
232
+ |------|------|----------|-------------|
233
+ | `--yes` | boolean | Yes (non-interactive) | Skip confirmation |
234
+
235
+ **Alias:** `rm`
236
+
237
+ **Output:** `{"object":"inbox_label","id":"<uuid>","deleted":true}`
238
+
239
+ ---
240
+
241
+ ## inboxes drafts list
242
+
243
+ List drafts in an inbox (default subcommand of `resend inboxes drafts`).
244
+ Opaque cursor pagination like threads — no `--limit`.
245
+
246
+ **Flags:** `--inbox-id <id>` — required in non-interactive mode
247
+
248
+ | Flag | Type | Description |
249
+ |------|------|-------------|
250
+ | `--cursor <cursor>` | string | `next_cursor` from a previous response |
251
+
252
+ **Alias:** `ls`
253
+
254
+ **Output:** `{"object":"list","has_more":false,"next_cursor":"<cursor>"|null,"data":[{"id":"<uuid>","type":"standalone|reply","to":["<address>"]|null,"cc":[],"bcc":[],"subject":"<subject>"|null,"snippet":"<text>"|null,"thread_id":"<uuid>"|null,"reply_to_email_id":"<uuid>"|null,"updated_at":"<date>"}]}`
255
+
256
+ ---
257
+
258
+ ## inboxes drafts create
259
+
260
+ Create a standalone draft, or a reply draft when `--thread-id` and
261
+ `--reply-to-email-id` are passed **together**. At least one content field is
262
+ required.
263
+
264
+ **Flags:** `--inbox-id <id>` — required in non-interactive mode
265
+
266
+ | Flag | Type | Description |
267
+ |------|------|-------------|
268
+ | `--to <address>` | string | Recipient; repeat for multiple |
269
+ | `--cc <address>` | string | Cc; repeat for multiple |
270
+ | `--bcc <address>` | string | Bcc; repeat for multiple |
271
+ | `--subject <subject>` | string | Draft subject |
272
+ | `--text <text>` | string | Plain text body |
273
+ | `--html <html>` | string | HTML body |
274
+ | `--thread-id <threadId>` | string | Thread to reply to (pairs with `--reply-to-email-id`) |
275
+ | `--reply-to-email-id <emailId>` | string | Email the draft replies to (pairs with `--thread-id`) |
276
+
277
+ **Output:** `{"object":"inbox_draft","id":"<uuid>","type":"standalone|reply","to":["<address>"]|null,"cc":[],"bcc":[],"subject":"<subject>"|null,"html":"<html>"|null,"text":"<text>"|null,"thread_id":"<uuid>"|null,"reply_to_email_id":"<uuid>"|null,"email_id":null,"created_at":"<date>","updated_at":"<date>"}`
278
+
279
+ ---
280
+
281
+ ## inboxes drafts get
282
+
283
+ Retrieve a draft, including its full body.
284
+
285
+ **Flags:** `--inbox-id <id> --draft-id <id>` — required in non-interactive mode
286
+
287
+ **Output:** same shape as `drafts create`.
288
+
289
+ ---
290
+
291
+ ## inboxes drafts update
292
+
293
+ Update a draft's recipients, subject, or body. At least one option is
294
+ required; provided fields replace existing values. Same flags as
295
+ `drafts create` minus `--thread-id`/`--reply-to-email-id`.
296
+
297
+ **Flags:** `--inbox-id <id> --draft-id <id>` — required in non-interactive mode
298
+
299
+ **Output:** same shape as `drafts create`.
300
+
301
+ ---
302
+
303
+ ## inboxes drafts delete
304
+
305
+ Delete a draft.
306
+
307
+ **Flags:** `--inbox-id <id> --draft-id <id>` — required in non-interactive mode
308
+
309
+ | Flag | Type | Required | Description |
310
+ |------|------|----------|-------------|
311
+ | `--yes` | boolean | Yes (non-interactive) | Skip confirmation |
312
+
313
+ **Alias:** `rm`
314
+
315
+ **Output:** `{"object":"inbox_draft","id":"<uuid>","deleted":true}`
316
+
317
+ ---
318
+
319
+ ## inboxes drafts send
320
+
321
+ Send a draft from the inbox address. The draft must have recipients and a
322
+ body.
323
+
324
+ **Flags:** `--inbox-id <id> --draft-id <id>` — required in non-interactive mode
325
+
326
+ **Output:** `{"object":"inbox_draft","id":"<uuid>","thread_id":"<uuid>","email_id":"<uuid>"}`
327
+
328
+ ---
329
+
330
+ ## inboxes delete
331
+
332
+ Delete an inbox. Its threads and messages are removed and the address stops
333
+ receiving email.
334
+
335
+ **Argument:** `<id>` — inbox UUID
336
+
337
+ | Flag | Type | Required | Description |
338
+ |------|------|----------|-------------|
339
+ | `--yes` | boolean | Yes (non-interactive) | Skip confirmation |
340
+
341
+ **Alias:** `rm`
342
+
343
+ **Output:** `{"object":"inbox","id":"<uuid>","deleted":true}`