MOLTED EMAIL
CLI Reference

molted lists

Manage email lists and send broadcasts

CommandDescription
molted lists createCreate a new email list
molted lists listList email lists (archived lists are left out), most recently updated first
molted lists getGet an email list by ID
molted lists updateUpdate an email list
molted lists archiveArchive (soft-delete) an email list
molted lists subscribeSubscribe a contact to a list
molted lists unsubscribeUnsubscribe a contact from a list
molted lists subscribersList subscribers of an email list, newest first, any status (alias: members)
molted lists importBulk subscribe contacts from a JSON or CSV file
molted lists sendSend a template to all active subscribers
molted lists sendsView send history for a list: the latest 50 broadcasts with delivery counts
molted lists statsView list statistics (subscriber counts). Use --growth or --sends for time-series breakdowns.

Agent context

Lists are named groups of subscribers for newsletters, announcements, and marketing broadcasts. Unlike segments (dynamic filter-based), lists use explicit subscribe/unsubscribe membership.

Create a list and add subscribers

molted lists create --name "Weekly Digest" --type newsletter --double-opt-in
# -> {"id":"<listId>","name":"Weekly Digest","type":"newsletter","doubleOptIn":true,"subscriberCount":0,...}

molted lists subscribe <listId> --email alice@example.com --name "Alice"
# -> {"id":"...","listId":"<listId>","contactId":"...","status":"pending","source":"api",...}
# "active" on a single opt-in list. On a double opt-in list the subscriber
# stays "pending": the API emits a list.subscribe.pending event with a
# confirmationUrl but sends no email itself, so a journey triggered on that
# event must send the confirmation. A suppressed address is refused (400);
# an address that unsubscribed earlier comes back "unsubscribed".

molted lists import <listId> --file contacts.csv
# -> {"total":153,"subscribed":150,"pending":0,"skipped":3,"failed":0,
#     "skippedReasons":{"previously_unsubscribed":3}}

Send to all subscribers

molted lists send <listId> --template welcome --yes
# -> {"id":"...","status":"completed","subscriberCount":153,"sent":150,
#     "blocked":2,"failed":1,"blockedReasons":{"suppressed":2},...}
# status becomes "failed" when sent === 0 (every attempt was blocked or failed).
# Inspect blockedReasons to see why (e.g. trial_not_activated,
# suppressed, hourly_limit_exceeded).
# The list must be active with 1 to 500 active subscribers (400 otherwise).
# A broadcast is always exempt from requireConsentForMarketing (settings):
# the active subscription itself is the consent, so it never blocks with
# no_consent, whatever that tenant setting is set to. A double opt-in
# confirmation email is exempt the same way.

Check send history

molted lists sends <listId>
# -> [{"sendId":"...","sentAt":"...","subscriberCount":153,"status":"completed",
#      "templateId":"welcome","delivered":148,"bounced":2,"opened":60,"clicked":12}]
# The latest 50 broadcasts, newest first.

View stats

molted lists stats <listId>
# -> {"subscriberCount":153,"pendingCount":2,"unsubscribedCount":5,"totalSends":12,"lastSentAt":"..."}

Responses return the API object directly (consistent with all other commands). Errors go to stderr as { "error": "message", "detail": ... }.

Related: molted contacts sync, molted segments, molted templates, molted suppressions

Commands

molted lists create

Create a new email list

molted lists create [options]
OptionDescriptionDefault
--name <name>List name (required; 409 if an unarchived list already has it) (required)
--type <type>List type: newsletter, announcement, marketing (default newsletter)
--double-opt-inEnable double opt-in confirmation
--description <text>List description
--metadata <json>Additional metadata as JSON

molted lists list

List email lists (archived lists are left out), most recently updated first

molted lists list [options]
OptionDescriptionDefault
--status <status>Currently ignored: the API has no status filter
--limit <n>Max results, 0-200 (default 50)
--offset <n>Offset for pagination (default 0)

molted lists get

Get an email list by ID

molted lists get <id>
ArgumentDescriptionRequired
<id>List IDyes

molted lists update

Update an email list

molted lists update [options] <id>
ArgumentDescriptionRequired
<id>List IDyes
OptionDescriptionDefault
--name <name>List name
--description <text>List description
--type <type>List type: newsletter, announcement, marketing
--status <status>List status: active, paused, archived (an archived list cannot be reactivated: 409)
--double-opt-inEnable double opt-in
--no-double-opt-inDisable double opt-in

molted lists archive

Archive (soft-delete) an email list

molted lists archive <id>
ArgumentDescriptionRequired
<id>List IDyes

molted lists subscribe

Subscribe a contact to a list

molted lists subscribe [options] <listId>
ArgumentDescriptionRequired
<listId>List IDyes
OptionDescriptionDefault
--email <email>Subscriber email address (required) (required)
--name <name>Subscriber name
--source <source>Subscription source: api, import, form, manual (default api)
--metadata <json>Currently ignored: the subscribe endpoint does not store metadata

molted lists unsubscribe

Unsubscribe a contact from a list

molted lists unsubscribe [options] <listId>
ArgumentDescriptionRequired
<listId>List IDyes
OptionDescriptionDefault
--email <email>Subscriber email address (required) (required)

molted lists subscribers

List subscribers of an email list, newest first, any status (alias: members)

molted lists subscribers [options] <listId>
ArgumentDescriptionRequired
<listId>List IDyes
OptionDescriptionDefault
--limit <n>Max results, 0-200 (default 50)
--offset <n>Offset for pagination (default 0)

molted lists import

Bulk subscribe contacts from a JSON or CSV file

molted lists import [options] <listId>
ArgumentDescriptionRequired
<listId>List IDyes
OptionDescriptionDefault
--file <path>Path to a .csv or .json file of subscribers (required) (required)

File format reference

CSV First row must be headers. An "email" column is required.
Only the email is sent: name and any extra columns are ignored.

email
alice@example.com
bob@example.com

JSON Top-level array of objects with an "email" field.

[
  {"email": "alice@example.com"},
  {"email": "bob@example.com"}
]

Rows with an empty email are dropped before sending. Every other row is sent and counted by the API as subscribed, pending, skipped (suppressed or previously unsubscribed) or failed, with source "import". Subscribers are sent in batches of 500; the list must be active.

Examples

molted lists import <listId> --file contacts.csv
molted lists import <listId> --file subscribers.json

molted lists send

Send a template to all active subscribers

molted lists send [options] <listId>
ArgumentDescriptionRequired
<listId>List IDyes
OptionDescriptionDefault
--template <slug>Template slug (required) (required)
--payload <json>Template payload as JSON
--mailbox <id>Mailbox ID to send from
--yesSkip the confirmation prompt (it only appears on an interactive TTY without CI or MOLTED_NONINTERACTIVE set)

molted lists sends

View send history for a list: the latest 50 broadcasts with delivery counts

molted lists sends [options] <listId>
ArgumentDescriptionRequired
<listId>List IDyes
OptionDescriptionDefault
--limit <n>Currently ignored: the API always returns the latest 50
--offset <n>Currently ignored: the API does not page send history

molted lists stats

View list statistics (subscriber counts). Use --growth or --sends for time-series breakdowns.

molted lists stats [options] <listId>
ArgumentDescriptionRequired
<listId>List IDyes
OptionDescriptionDefault
--growthGrowth over time instead of the summary (calls .../stats/growth)
--period <period>Time period for --growth (default 30d) (one of: 7d, 30d, 90d, all)
--sendsSend performance instead of the summary (calls .../stats/sends)

See CLI overview for global options, credentials and output format.