Skip to main content
Example IDs are placeholders. Use IDs returned for your selected workspace, and keep the channel alongside campaign and conversation IDs. Inspect any command with --help.

Read

Lists return one page. Pass --cursor with next_cursor and unchanged filters to continue. Contact lists also accept --unsubscribed true or false. Sender data is stored metadata, inbox history is incomplete and analytics are all-time. Outcomes may return feature_unavailable.

Create or update

Contact create requires email; update cannot change it. Suppression sets unsubscribed=true and cannot undo an opt-out. A LinkedIn prospect file needs a resolved provider_id; an email audience file uses {"contact_ids":[789]}. Both attach only to inactive drafts and perform no provider lookup or send.

Pause

Pause requires explicit intent. An interactive shell prompts; noninteractive scripts must supply --yes or fail before HTTP. It cannot recall in-flight activity. Pausing a draft leaves it a draft. No resume command exists.

Templates and LinkedIn imports

Package 0.5.0 adds commands for saved template settings and bounded LinkedIn profile URL imports. Template reads require templates:read; template creation and updates require templates:write. Saving template fields does not run prompts or approve generated content.
For LinkedIn, first read the latest campaign configuration and copy its revision into import.json. Include the selected Emailx sender ID and 1 to 100 canonical HTTPS profile URLs. Configuration reads require campaigns:read; the import requires campaigns:import. The execution feature is disabled by default, and lookups can consume provider quota. The import itself does not activate or send.
Operation reads require operations:read and campaigns:read. Cancellation also requires operations:write and the original command grant: campaigns:import for an import or campaigns:launch for an activation. --yes makes the intent explicit in scripts. If a response is uncertain, inspect the operation and import row results when available. The CLI does not retry commands automatically. See templates and LinkedIn imports for JSON input shape and recovery rules.

Review and activate a LinkedIn campaign

Package 0.6.0 adds People eligibility preview and explicit activation for reviewed manual LinkedIn drafts. The People preview is read-only and does not enroll contacts. Review and launch writes require campaigns:launch and a ready unexpired review. Reading configuration and campaign progress requires campaigns:read; operation polling requires operations:read and campaigns:read. Check workspace capabilities; handle feature_unavailable as not enabled.
Package 0.9.0 adds review-linkedin-resume and resume-linkedin for paused, previously launched manual campaigns. Resume needs its own review: a launch review is rejected. It keeps saved progress, runs no launch batch and never retries uncertain attempts. Scripts require --yes. Use the latest configuration revision for the review. The command prompts before launch in an interactive shell; scripts require --yes. A successful operation receipt means local activation for the ordinary scheduled dispatcher, not delivery. If the launch outcome is uncertain, read the original operation and do not resubmit automatically. For stale or expired reviews, reconcile current state and request a fresh review. See review and launch for the complete workflow. Draft preparation covers input and dry-run behavior. Scripting covers output and exit codes.

Email execution and People import

Package 0.8.0 adds separate preparation, generation, exact-message review, approval, and reviewed email launch commands, plus bounded CSV/XLSX People import. Use a matching API host and verify workspace capabilities. campaigns:generate, messages:write, messages:approve, and campaigns:launch-email are separate scopes. campaigns:launch-email is for email; LinkedIn activation still uses campaigns:launch.
Generation accepts 1–10 prepared task IDs and consumes AI credits. Review and launch are separate; the ready review expires after five minutes (expires_at is authoritative). A 202 operation schedules approved messages within configured windows and does not prove delivery. Poll the original operation; stop at awaiting_user_action, needs_reconciliation, or a terminal state. Unknown outcomes are never retried automatically. See email execution. For People, use emailx contacts preview-import first with --file, --mapping or --mapping-file, and --channel email|linkedin. Confirm the exact preview fingerprint before calling emailx contacts import --expected-fingerprint ... --yes; inspect IDs with emailx contacts import-rows. Files are limited to 64 KiB and 1,000 rows. Import saves contacts only; it does not enroll them. LinkedIn-only rows may lack email, but direct contacts create still requires email. See People import.