maeve-cli 0.9.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/LICENSE +21 -0
- package/README.md +547 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +2328 -0
- package/examples/create-content.json +13 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 LILY DIA PTY LTD
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
# Maeve CLI
|
|
2
|
+
|
|
3
|
+
A command-line tool for the Maeve public API. Schedule posts, manage media, run analytics, and send client reviews from a terminal or a script.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/maeve-cli)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
[](./LICENSE)
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
Run without installing:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx maeve-cli auth:status
|
|
15
|
+
pnpm dlx maeve-cli auth:status
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Install globally:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g maeve-cli
|
|
22
|
+
maeve auth:status
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or with pnpm:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pnpm add -g maeve-cli
|
|
29
|
+
maeve auth:status
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Node 22 or newer is required.
|
|
33
|
+
|
|
34
|
+
## Quick start
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
maeve auth:login
|
|
38
|
+
maeve workspaces:list
|
|
39
|
+
maeve integrations:list --workspace <id>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Authentication
|
|
43
|
+
|
|
44
|
+
There are two ways to sign in. Pick one.
|
|
45
|
+
|
|
46
|
+
### API key (for CI, servers, scripts)
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
export MAEVE_API_KEY="ezb_live_..."
|
|
50
|
+
export MAEVE_API_URL="https://api.maevesocial.com"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
PowerShell:
|
|
54
|
+
|
|
55
|
+
```powershell
|
|
56
|
+
$env:MAEVE_API_KEY="ezb_live_..."
|
|
57
|
+
$env:MAEVE_API_URL="https://api.maevesocial.com"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Prefer the env var over `--api-key`. Flags can leak into shell history and process lists.
|
|
61
|
+
|
|
62
|
+
For scoped keys stored under a named environment variable, pass the variable name instead of the secret value:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
maeve --api-key-env MAEVE_API_KEY_LILY_DIA_JEWELLERY_DEMO_KEY auth:status
|
|
66
|
+
maeve --api-key-env MAEVE_API_KEY_LILY_DIA_JEWELLERY_DEMO_KEY media:labels:list --workspace <id>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
When `--api-key-env` is provided, that named variable must exist; the CLI will not silently fall back to `MAEVE_API_KEY`.
|
|
70
|
+
|
|
71
|
+
### Browser login (for humans on a laptop)
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
maeve auth:login # opens a browser, prints a short code
|
|
75
|
+
maeve auth:whoami # shows the signed-in user and workspaces
|
|
76
|
+
maeve auth:logout # revokes the local token
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`auth:login` stores a revocable `ezb_cli_...` token for the API URL. Tokens expire after 7 days. They are never permanent API keys.
|
|
80
|
+
|
|
81
|
+
Use `--no-browser` if you want the URL printed instead of opened.
|
|
82
|
+
|
|
83
|
+
### Credential precedence
|
|
84
|
+
|
|
85
|
+
The CLI uses the first credential it finds:
|
|
86
|
+
|
|
87
|
+
1. `--api-key`
|
|
88
|
+
2. `--api-key-env <name>`
|
|
89
|
+
3. `MAEVE_API_KEY`
|
|
90
|
+
4. Stored CLI login token
|
|
91
|
+
|
|
92
|
+
### Where the token is stored
|
|
93
|
+
|
|
94
|
+
| Platform | Path |
|
|
95
|
+
| -------- | --------------------------------------------------- |
|
|
96
|
+
| Windows | `%APPDATA%\Maeve\cli-auth.json` |
|
|
97
|
+
| macOS | `~/Library/Application Support/Maeve/cli-auth.json` |
|
|
98
|
+
| Linux | `${XDG_CONFIG_HOME:-~/.config}/maeve/cli-auth.json` |
|
|
99
|
+
|
|
100
|
+
The file holds one credential per API URL. Token values are never printed by `auth:status` or any other command.
|
|
101
|
+
|
|
102
|
+
## Output
|
|
103
|
+
|
|
104
|
+
Successful commands write JSON to stdout. Errors write structured JSON to stderr and exit non-zero. Pipe to `jq`:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
maeve workspaces:list | jq -r '.data[].id'
|
|
108
|
+
maeve content:list --workspace "$WORKSPACE_ID" --status scheduled | jq '.data | length'
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Commands
|
|
112
|
+
|
|
113
|
+
### Auth
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
maeve auth:status
|
|
117
|
+
maeve auth:login
|
|
118
|
+
maeve auth:logout
|
|
119
|
+
maeve auth:whoami
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Workspaces
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
maeve workspaces:list
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Integrations
|
|
129
|
+
|
|
130
|
+
`integrations:capabilities` returns safe publishing metadata for a connected account: post types, media types, setting field names, dynamic option keys, and capability flags. It does not expose tokens, scopes, or raw provider payloads. Use `integrations:options` with a key from that response to fetch read-only provider data such as Pinterest boards or YouTube categories.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
maeve integrations:list --workspace <id>
|
|
134
|
+
maeve integrations:capabilities --workspace <id> --integration <id>
|
|
135
|
+
maeve integrations:options --workspace <id> --integration <id> --key pinterest-boards
|
|
136
|
+
maeve integrations:options --workspace <id> --integration <id> --key youtube-video-categories --json options.json
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Example option body:
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{ "regionCode": "AU" }
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Media
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
maeve media:list --workspace <id>
|
|
149
|
+
maeve media:list --workspace <id> --type image --label-ids <id,id> --favorite
|
|
150
|
+
maeve media:list --workspace <id> --state deleted
|
|
151
|
+
maeve media:upload ./image.png --workspace <id>
|
|
152
|
+
maeve media:get --workspace <id> --id <mediaId>
|
|
153
|
+
maeve media:update --workspace <id> --id <mediaId> --json media-update.json
|
|
154
|
+
maeve media:download-url --workspace <id> --id <mediaId>
|
|
155
|
+
maeve media:view-url --workspace <id> --id <mediaId>
|
|
156
|
+
maeve media:archive --workspace <id> --id <mediaId>
|
|
157
|
+
maeve media:delete --workspace <id> --id <mediaId>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`media:delete` and `media:bulk-delete` move active media to the Bin. The API returns `deleteAfter`; media attached to scheduled posts is blocked with `MEDIA_ATTACHED_TO_SCHEDULED_POST`.
|
|
161
|
+
|
|
162
|
+
Folders and labels:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
maeve media:folders:list --workspace <id> --parent-id root
|
|
166
|
+
maeve media:folders:get --workspace <id> --id <folderId>
|
|
167
|
+
maeve media:folders:path --workspace <id> --id <folderId>
|
|
168
|
+
maeve media:folders:create --workspace <id> --json media-folder.json
|
|
169
|
+
maeve media:folders:update --workspace <id> --id <folderId> --json media-folder.json
|
|
170
|
+
maeve media:folders:move --workspace <id> --id <folderId> --json media-folder-move.json
|
|
171
|
+
maeve media:folders:delete --workspace <id> --id <folderId>
|
|
172
|
+
maeve media:labels:list --workspace <id> --search approved
|
|
173
|
+
maeve media:labels:create --workspace <id> --json media-label.json
|
|
174
|
+
maeve media:labels:update --workspace <id> --id <labelId> --json media-label.json
|
|
175
|
+
maeve media:labels:delete --workspace <id> --id <labelId>
|
|
176
|
+
maeve media:labels:attach --workspace <id> --id <mediaId> --json media-label-ids.json
|
|
177
|
+
maeve media:labels:detach --workspace <id> --id <mediaId> --json media-label-ids.json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
`media:labels:*` is the canonical Media Room organization command family. If a global install still shows `media:tags:*`, upgrade `maeve-cli`.
|
|
181
|
+
|
|
182
|
+
Bulk operations:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
maeve media:bulk-archive --workspace <id> --json media-ids.json
|
|
186
|
+
maeve media:bulk-move --workspace <id> --json media-bulk-move.json
|
|
187
|
+
maeve media:bulk-label --workspace <id> --json media-bulk-labels.json
|
|
188
|
+
maeve media:bulk-unlabel --workspace <id> --json media-bulk-labels.json
|
|
189
|
+
maeve media:bulk-delete --workspace <id> --json media-ids.json --yes
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Content
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
maeve content:create --workspace <id> --json examples/create-content.json
|
|
196
|
+
maeve content:update --workspace <id> --id <contentId> --json update-content.json
|
|
197
|
+
maeve content:list --workspace <id> --status scheduled
|
|
198
|
+
maeve content:list --workspace <id> --workflow-statuses approved,needs_changes
|
|
199
|
+
maeve content:get --workspace <id> --id <contentId>
|
|
200
|
+
maeve content:schedule --workspace <id> --id <contentId> --scheduled-at "2026-05-01T10:00:00+10:00"
|
|
201
|
+
maeve content:intended-time --workspace <id> --id <contentId> --scheduled-at "2026-05-01T10:00:00+10:00"
|
|
202
|
+
maeve content:notes --workspace <id> --id <contentId> --notes "<p>Planning notes</p>"
|
|
203
|
+
maeve content:notes --workspace <id> --id <contentId> --json notes.json
|
|
204
|
+
maeve content:workflow --workspace <id> --id <contentId> --status drafting
|
|
205
|
+
maeve content:publish --workspace <id> --id <contentId> --yes
|
|
206
|
+
maeve content:published-caption --workspace <id> --id <contentId> --json published-caption.json --yes
|
|
207
|
+
maeve content:archive --workspace <id> --id <contentId>
|
|
208
|
+
maeve content:restore --workspace <id> --id <contentId>
|
|
209
|
+
maeve content:retry --workspace <id> --id <contentId>
|
|
210
|
+
maeve content:delete --workspace <id> --id <contentId>
|
|
211
|
+
maeve content:failed-count --workspace <id>
|
|
212
|
+
maeve content:pending-approval-count --workspace <id>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Approvals, comments, and activity:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
maeve content:approval-history --workspace <id>
|
|
219
|
+
maeve content:approval-history:client-batch --workspace <id> --batch <batchId>
|
|
220
|
+
maeve content:approval-history:internal --workspace <id> --record <recordId>
|
|
221
|
+
maeve content:comment --workspace <id> --id <contentId> --json comment.json
|
|
222
|
+
maeve content:comment-attachments:init --workspace <id> --json attachment.json
|
|
223
|
+
maeve content:comment-attachments:complete --workspace <id> --attachment <attachmentId>
|
|
224
|
+
maeve content:comment-attachments:abort --workspace <id> --attachment <attachmentId>
|
|
225
|
+
maeve content:activity:react --workspace <id> --activity <activityId> --json reaction.json
|
|
226
|
+
maeve content:activity:unreact --workspace <id> --activity <activityId> --emoji thumbs-up
|
|
227
|
+
maeve content:request-approval --workspace <id> --id <contentId> --json approval.json --yes
|
|
228
|
+
maeve content:decision --workspace <id> --id <contentId> --json decision.json
|
|
229
|
+
maeve content:withdraw --workspace <id> --id <contentId>
|
|
230
|
+
maeve content:resubmit --workspace <id> --id <contentId> --json approval.json --yes
|
|
231
|
+
maeve content:history --workspace <id> --id <contentId>
|
|
232
|
+
maeve content:reopen-client-review --workspace <id> --id <contentId>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Client reviews
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
maeve client-reviews:create --workspace <id> --json client-review.json
|
|
239
|
+
maeve client-reviews:open --workspace <id>
|
|
240
|
+
maeve client-reviews:get --workspace <id> --batch <batchId>
|
|
241
|
+
maeve client-reviews:add-post --workspace <id> --batch <batchId> --json post-id.json
|
|
242
|
+
maeve client-reviews:remove-post --workspace <id> --batch <batchId> --json post-id.json
|
|
243
|
+
maeve client-reviews:send --workspace <id> --batch <batchId> --yes
|
|
244
|
+
maeve client-reviews:resend --workspace <id> --batch <batchId> --yes
|
|
245
|
+
maeve client-reviews:cancel --workspace <id> --batch <batchId>
|
|
246
|
+
maeve client-reviews:override --workspace <id> --batch <batchId> --json override.json
|
|
247
|
+
maeve client-reviews:update-participant --workspace <id> --batch <batchId> --json participant.json
|
|
248
|
+
maeve client-reviews:comment --workspace <id> --batch <batchId> --json comment.json
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Taxonomy and hashtags
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
maeve taxonomy:labels --workspace <id>
|
|
255
|
+
maeve taxonomy:pillars --workspace <id>
|
|
256
|
+
maeve taxonomy:formats --workspace <id>
|
|
257
|
+
maeve hashtags:list --workspace <id>
|
|
258
|
+
maeve hashtags:create --workspace <id> --json hashtags.json
|
|
259
|
+
maeve hashtags:update --workspace <id> --id <hashtagGroupId> --json hashtags.json
|
|
260
|
+
maeve hashtags:delete --workspace <id> --id <hashtagGroupId>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Analytics
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
maeve analytics:summary --workspace <id> --days 30
|
|
267
|
+
maeve analytics:summary --workspace <id> --integration <id> --days all
|
|
268
|
+
maeve analytics:summary --workspace <id> --integration-ids <id,id>
|
|
269
|
+
maeve analytics:health --workspace <id> --integration <id>
|
|
270
|
+
maeve analytics:posts --workspace <id> --integration <id> --limit 12 --offset 0
|
|
271
|
+
maeve analytics:posts-aggregate --workspace <id> --integration-ids <id,id> --sort-by views --days 30
|
|
272
|
+
maeve analytics:post --workspace <id> --id <contentId>
|
|
273
|
+
maeve analytics:demographics --workspace <id> --integration <id>
|
|
274
|
+
maeve analytics:report --workspace <id> --provider instagram --json analytics-report.json --output report.pdf --yes
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
`analytics:summary` works on one integration or aggregates across many. Use `--integration-ids` to pick a set, or omit it for all accessible integrations. `--days` accepts `1` to `90` or `all`.
|
|
278
|
+
|
|
279
|
+
`analytics:posts` is single-integration. `analytics:posts-aggregate` accepts `--integration-ids` and `--sort-by recent|engagement|views`.
|
|
280
|
+
|
|
281
|
+
`analytics:report` is agency-plan only. It saves the PDF to `--output`. Stdout stays JSON metadata.
|
|
282
|
+
|
|
283
|
+
### Inbox
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
maeve inbox:threads --workspace <id> --read unread
|
|
287
|
+
maeve inbox:messages --workspace <id> --thread <threadId>
|
|
288
|
+
maeve inbox:stats --workspace <id>
|
|
289
|
+
maeve inbox:read --workspace <id> --thread <threadId>
|
|
290
|
+
maeve inbox:unread --workspace <id> --thread <threadId>
|
|
291
|
+
maeve inbox:read-all --workspace <id> --json inbox-read-all.json --yes
|
|
292
|
+
maeve inbox:reply --workspace <id> --thread <threadId> --json inbox-reply.json --yes
|
|
293
|
+
maeve inbox:note --workspace <id> --thread <threadId> --json inbox-note.json
|
|
294
|
+
maeve inbox:moderate --workspace <id> --message <messageId> --json inbox-moderate.json --yes
|
|
295
|
+
maeve inbox:retry-message --workspace <id> --message <messageId> --yes
|
|
296
|
+
maeve inbox:delete-failed --workspace <id> --message <messageId> --yes
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Grid planner
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
maeve grid:list --workspace <id> --integration <integrationId>
|
|
303
|
+
maeve grid:create --workspace <id> --json grid-item.json
|
|
304
|
+
maeve grid:update --workspace <id> --item <itemId> --json grid-update.json
|
|
305
|
+
maeve grid:delete --workspace <id> --item <itemId> --yes
|
|
306
|
+
maeve grid:reorder --workspace <id> --json grid-reorder.json
|
|
307
|
+
maeve grid:replace-media --workspace <id> --item <itemId> --json grid-media.json
|
|
308
|
+
maeve grid:set-cover --workspace <id> --item <itemId> --json grid-cover.json
|
|
309
|
+
maeve grid:remove-cover --workspace <id> --item <itemId>
|
|
310
|
+
maeve grid:promote --workspace <id> --item <itemId> --json grid-promote.json --yes
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Payloads
|
|
314
|
+
|
|
315
|
+
### Content
|
|
316
|
+
|
|
317
|
+
`content:create` reads a JSON file and sends an `Idempotency-Key` header for safe retries. Pass `--idempotency-key <key>` to reuse a known key, or omit it to let the CLI generate one. Omitted `intent` defaults to `draft`; use `schedule` with `scheduledAt`, or `publish_now` plus CLI `--yes` for explicit immediate publishing. `content:update` uses the same shape except `intent`, but every accepted field is optional and at least one must be present.
|
|
318
|
+
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"integrationId": "00000000-0000-4000-8000-000000000001",
|
|
322
|
+
"intent": "draft",
|
|
323
|
+
"internalTitle": "Launch planning card",
|
|
324
|
+
"captions": {
|
|
325
|
+
"canonical": "Launch post copy"
|
|
326
|
+
},
|
|
327
|
+
"contentMedia": [
|
|
328
|
+
{
|
|
329
|
+
"mediaId": "00000000-0000-4000-8000-000000000007",
|
|
330
|
+
"order": 0,
|
|
331
|
+
"cover": {
|
|
332
|
+
"thumbOffsetMs": 2500
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
],
|
|
336
|
+
"pillarIds": ["00000000-0000-4000-8000-000000000002"],
|
|
337
|
+
"formatIds": ["00000000-0000-4000-8000-000000000003"],
|
|
338
|
+
"labelIds": ["00000000-0000-4000-8000-000000000004"],
|
|
339
|
+
"campaignId": "00000000-0000-4000-8000-000000000005",
|
|
340
|
+
"campaignPhaseId": "00000000-0000-4000-8000-000000000006"
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Common fields:
|
|
345
|
+
|
|
346
|
+
- `integrationId`: integration to post to.
|
|
347
|
+
- `intent`: `draft`, `schedule`, or `publish_now`. Omitted intent defaults to `draft`.
|
|
348
|
+
- `internalTitle`: internal planning title. Never published.
|
|
349
|
+
- `publishTitle`: provider-facing title for platforms that support or require one.
|
|
350
|
+
- `captions`: canonical publish text and optional platform overrides.
|
|
351
|
+
- `notes`: internal rich-text notes. Never published. Max 100000 characters.
|
|
352
|
+
- `contentMedia`: array of uploaded media relationships, with optional per-media crops, tags, and cover metadata.
|
|
353
|
+
- `scheduledAt`: ISO 8601 with timezone, e.g. `2026-05-01T10:00:00+10:00`. Required only with `intent: "schedule"`.
|
|
354
|
+
- `postType`: `post`, `reel`, `story`, or `thread`.
|
|
355
|
+
- `settings`: provider settings from integration capabilities only. Media metadata belongs in `contentMedia`.
|
|
356
|
+
- `firstComment`, `shareToFeed`: optional publish behavior fields.
|
|
357
|
+
- `pillarIds`, `formatIds`, `labelIds`: arrays of workspace taxonomy UUIDs.
|
|
358
|
+
- `campaignId`, `campaignPhaseId`: optional campaign links. Use `null` to clear when updating.
|
|
359
|
+
- `priority`: `urgent`, `high`, `medium`, or `low`.
|
|
360
|
+
- `threadMessages`: items for thread-style content using `captions` and optional `contentMedia`.
|
|
361
|
+
|
|
362
|
+
`content:workflow` accepts only the user-mutable workflow statuses: `idea` or `drafting`.
|
|
363
|
+
|
|
364
|
+
`content:published-caption` edits the provider caption for an already-published Facebook item and requires `--yes`.
|
|
365
|
+
|
|
366
|
+
```json
|
|
367
|
+
{
|
|
368
|
+
"message": "Updated Facebook caption"
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Approvals and client reviews
|
|
373
|
+
|
|
374
|
+
Approval and client review commands need an agency workspace plan and the role shown in each command's `--help`. Payloads mirror the public API DTOs.
|
|
375
|
+
|
|
376
|
+
Internal approval request:
|
|
377
|
+
|
|
378
|
+
```json
|
|
379
|
+
{
|
|
380
|
+
"approverIds": ["00000000-0000-4000-8000-000000000001"],
|
|
381
|
+
"policy": "any"
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
Client review batch:
|
|
386
|
+
|
|
387
|
+
```json
|
|
388
|
+
{
|
|
389
|
+
"contentIds": ["00000000-0000-4000-8000-000000000001"],
|
|
390
|
+
"workflowMode": "client",
|
|
391
|
+
"client": {
|
|
392
|
+
"reviewers": [{ "name": "Client Reviewer", "email": "reviewer@example.com" }],
|
|
393
|
+
"policy": "all",
|
|
394
|
+
"inviteNote": "Please review when you have a moment.",
|
|
395
|
+
"batchLabel": "May launch"
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Use `workflowMode: "internal_client"` with an `internal` object containing `approverIds` and `policy` when internal approval is required before client review.
|
|
401
|
+
|
|
402
|
+
`content:create` requires `--yes` when the payload has `intent: "publish_now"`, `content:publish` requires `--yes` because it queues external publishing, and `content:published-caption` requires `--yes` because it edits already-published provider content. `content:request-approval`, `content:resubmit`, `client-reviews:send`, and `client-reviews:resend` all require `--yes` because they may notify people.
|
|
403
|
+
|
|
404
|
+
### Inbox
|
|
405
|
+
|
|
406
|
+
Inbox commands take explicit thread or message IDs. Public replies, moderation, retries, deletes, and `read-all` require `--yes`.
|
|
407
|
+
|
|
408
|
+
Reply:
|
|
409
|
+
|
|
410
|
+
```json
|
|
411
|
+
{
|
|
412
|
+
"content": "Thanks for reaching out.",
|
|
413
|
+
"parentMessageId": "00000000-0000-4000-8000-000000000001"
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
`content` is optional when an `attachment` is provided:
|
|
418
|
+
|
|
419
|
+
```json
|
|
420
|
+
{
|
|
421
|
+
"attachment": {
|
|
422
|
+
"type": "image",
|
|
423
|
+
"url": "https://cdn.example.com/reply.png"
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
Internal note:
|
|
429
|
+
|
|
430
|
+
```json
|
|
431
|
+
{ "content": "Follow up with the team before replying." }
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Moderation. Allowed actions: `hide`, `unhide`, `delete`.
|
|
435
|
+
|
|
436
|
+
```json
|
|
437
|
+
{ "action": "hide" }
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
Read-all takes the same filter shape as listing threads. Use `{}` only when you want all matching threads marked read.
|
|
441
|
+
|
|
442
|
+
```json
|
|
443
|
+
{
|
|
444
|
+
"platform": "instagram",
|
|
445
|
+
"status": "open",
|
|
446
|
+
"integrationId": "00000000-0000-4000-8000-000000000001",
|
|
447
|
+
"messageType": "comment"
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Grid planner
|
|
452
|
+
|
|
453
|
+
Visual-only item:
|
|
454
|
+
|
|
455
|
+
```json
|
|
456
|
+
{
|
|
457
|
+
"integrationId": "00000000-0000-4000-8000-000000000001",
|
|
458
|
+
"kind": "visual_only",
|
|
459
|
+
"mediaIds": ["00000000-0000-4000-8000-000000000002"],
|
|
460
|
+
"note": "Plan this visual",
|
|
461
|
+
"settings": { "aspectRatio": 1 }
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
Linked content item:
|
|
466
|
+
|
|
467
|
+
```json
|
|
468
|
+
{
|
|
469
|
+
"integrationId": "00000000-0000-4000-8000-000000000001",
|
|
470
|
+
"kind": "linked_post",
|
|
471
|
+
"linkedContentId": "00000000-0000-4000-8000-000000000003"
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
Reorder needs the full item ID order for the integration:
|
|
476
|
+
|
|
477
|
+
```json
|
|
478
|
+
{
|
|
479
|
+
"integrationId": "00000000-0000-4000-8000-000000000001",
|
|
480
|
+
"itemIds": ["00000000-0000-4000-8000-000000000004"]
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
Media, cover, and promote payloads:
|
|
485
|
+
|
|
486
|
+
```json
|
|
487
|
+
{ "integrationId": "00000000-0000-4000-8000-000000000001", "mediaIds": ["00000000-0000-4000-8000-000000000002"] }
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
```json
|
|
491
|
+
{ "integrationId": "00000000-0000-4000-8000-000000000001", "mediaId": "00000000-0000-4000-8000-000000000005" }
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
```json
|
|
495
|
+
{ "integrationId": "00000000-0000-4000-8000-000000000001" }
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
`grid:delete` and `grid:promote` require `--yes`.
|
|
499
|
+
|
|
500
|
+
### Media
|
|
501
|
+
|
|
502
|
+
Supported upload extensions:
|
|
503
|
+
|
|
504
|
+
- `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.avif`
|
|
505
|
+
- `.mp4`, `.mov`
|
|
506
|
+
|
|
507
|
+
Images cap at 50 MB, videos at 512 MB.
|
|
508
|
+
|
|
509
|
+
Update payload:
|
|
510
|
+
|
|
511
|
+
```json
|
|
512
|
+
{
|
|
513
|
+
"filename": "campaign-hero.png",
|
|
514
|
+
"altText": "Campaign hero image",
|
|
515
|
+
"isFavorite": true,
|
|
516
|
+
"folderId": null
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
Folder and label:
|
|
521
|
+
|
|
522
|
+
```json
|
|
523
|
+
{ "name": "Launch assets" }
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
```json
|
|
527
|
+
{ "name": "Approved", "color": "#22cc88" }
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
Bulk payloads are explicit ID lists:
|
|
531
|
+
|
|
532
|
+
```json
|
|
533
|
+
{ "mediaIds": ["00000000-0000-4000-8000-000000000001"] }
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
```json
|
|
537
|
+
{
|
|
538
|
+
"mediaIds": ["00000000-0000-4000-8000-000000000001"],
|
|
539
|
+
"labelIds": ["00000000-0000-4000-8000-000000000002"]
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
`media:bulk-delete` moves active media to the Bin and requires `--yes`. Use `media:list --state deleted` to inspect Bin items.
|
|
544
|
+
|
|
545
|
+
## License
|
|
546
|
+
|
|
547
|
+
MIT (c) 2026 LILY DIA PTY LTD.
|