Commands

Every sevk CLI command, grouped by resource. Flags on a command map 1:1 to the SDK parameters.

sevk login

Save an API key to the local config. Interactive by default; pass --key for scripts.

sevk login
sevk login --key sevk_full_xxxxxxxx
sevk login --key sevk_full_prodxxxx --profile production

sevk logout

Remove a saved profile (defaults to default) or wipe them all with --all.

sevk logout
sevk logout --profile production
sevk logout --all

sevk whoami

Show the resolved API key (masked), where it was loaded from, and the API base URL.

sevk whoami

sevk auth

Manage saved profiles. switch changes the active profile; list, rename, and remove round out the set.

sevk auth list
sevk auth switch # interactive
sevk auth switch production
sevk auth rename old-name new-name
sevk auth remove staging
sevk domains list --profile production

sevk emails send

Send a single email. In a terminal, missing required flags prompt interactively. Piped or in CI, missing flags are errors.

# Plain text
sevk emails send \
--from "Name <[email protected]>" \
--subject "Subject line" \
--text "Body"
# HTML from a file
sevk emails send \
--from "[email protected]" \
--subject "Newsletter" \
--html-file ./newsletter.html
# sevk Markup from a file
sevk emails send \
--from "[email protected]" \
--subject "Welcome" \
--markup-file ./welcome.sevk
# Multiple recipients, CC, BCC, reply-to
sevk emails send \
--from "[email protected]" \
--reply-to [email protected] \
--subject "Update" \
--text "Hello everyone"
# Attach files (max 10 files, 10MB total)
sevk emails send \
--from "[email protected]" \
--subject "Invoice" \
--text "See attached." \
--attach ./invoice.pdf,./terms.pdf

sevk emails get

Fetch a single sent email by id.

sevk emails get b8c9d0e1-2345-4f01-2345-789012345f01

sevk emails bulk

Send many emails from a JSON array in one call.

sevk emails bulk emails.json
emails.json
[
{ "from": "[email protected]", "to": "[email protected]", "subject": "Hi Alice", "text": "Hi Alice!" },
{ "from": "[email protected]", "to": "[email protected]", "subject": "Hi Bob", "text": "Hi Bob!" }
]

sevk domains

Create, inspect, verify, and delete sending domains.

sevk domains list
sevk domains create --name mail.sevk.io --email [email protected]
sevk domains get <domain-id>
sevk domains verify <domain-id>
sevk domains delete <domain-id>

sevk domains update

Use --inbound-prefix gelen to receive at gelen.example.com, or --inbound-prefix="" to receive directly at example.com. Changing this address pauses receiving until the new MX record is verified. Add the updated record at your DNS provider and update forwarding rules that match the old address.

Change domain defaults and flags. --email takes the full default sender address. Use --no-click-tracking / --no-open-tracking to disable tracking, --tls-policy (OPTIONAL or REQUIRE), and --inbound-enabled true|false to toggle inbound.

sevk domains update <domain-id> \
--email "[email protected]" \
--sender-name "My App" \
--click-tracking \
--open-tracking

sevk domains regions

List sending regions you can assign to a domain.

sevk domains regions

sevk domains dns-records

Print the DNS records you need to add at your registrar for a domain.

sevk domains dns-records <domain-id>

sevk domains verify-inbound

Check the inbound MX records for a domain and mark it as inbound-verified when they match.

sevk domains verify-inbound <domain-id>

sevk contacts

Manage contacts. Contacts live at the project level; --audience-id on create/import attaches them to an audience.

sevk contacts list
sevk contacts list --search [email protected]
sevk contacts create --email [email protected]
sevk contacts create --email [email protected] --audience-id 9e7a3b5c-1234-4567-89ab-cdef01234567
sevk contacts get <contact-id>
sevk contacts update <contact-id> --first-name Jane
sevk contacts delete <contact-id>
# CSV import (file must include an "email" column)
sevk contacts bulk-import contacts.csv --audience-id 9e7a3b5c-1234-4567-89ab-cdef01234567
# Bulk update from JSON: { "contacts": [{ "email": "...", "subscribed": true, "data": { ... } }] }
sevk contacts bulk-update updates.json

sevk contacts activity

Show every activity entry recorded for a contact: sends, opens, clicks, bounces.

sevk contacts activity <contact-id>

sevk audiences

Work with audiences and their contacts. Membership is managed by contact id, not by email.

sevk audiences list
sevk audiences create --name "Newsletter"
sevk audiences get <audience-id>
sevk audiences update <audience-id> --name "Updated Name"
sevk audiences delete <audience-id>
# Membership (use contact ids, comma-separated for add)
sevk audiences add-contact <audience-id> --contact-ids c1,c2,c3
sevk audiences list-contacts <audience-id>
sevk audiences remove-contact <audience-id> --contact-id <contact-id>

sevk broadcasts

Create and manage broadcasts. A broadcast is always tied to a verified domain and a target (audience, topic, segment, or all subscribed contacts).

sevk broadcasts list
sevk broadcasts list --status DRAFT
# Create against an audience
sevk broadcasts create \
--name "December Newsletter" \
--subject "December Updates" \
--domain-id <domain-id> \
--sender-email [email protected] \
--sender-name "Your App" \
--audience-id <audience-id> \
--body-file ./newsletter.sevk
sevk broadcasts get <broadcast-id>
sevk broadcasts update <broadcast-id> --subject "New Subject"
sevk broadcasts delete <broadcast-id>

sevk broadcasts send

Ship a broadcast to its audience. Prompts for confirmation unless you pass --yes.

sevk broadcasts send <broadcast-id>
sevk broadcasts send <broadcast-id> --yes

sevk broadcasts test

Send the broadcast to a handful of test recipients before firing the real thing. Up to 10 addresses, comma-separated.

sevk broadcasts test <broadcast-id> --to [email protected]
sevk broadcasts test <broadcast-id> --to [email protected],[email protected]

sevk broadcasts cancel

Halt a broadcast that is scheduled or mid-send.

sevk broadcasts cancel <broadcast-id>

sevk broadcasts analytics

Pull delivered / opened / clicked / bounced counts.

sevk broadcasts analytics <broadcast-id>

sevk broadcasts status

Show the current state machine position for a broadcast.

sevk broadcasts status <broadcast-id>

sevk broadcasts emails

List every individual email a broadcast produced.

sevk broadcasts emails <broadcast-id>

sevk broadcasts estimate-cost

Preview the recipient count and billing impact before sending.

sevk broadcasts estimate-cost <broadcast-id>

sevk broadcasts active

Show broadcasts that are currently sending.

sevk broadcasts active

sevk templates

Manage reusable templates. --style is MARKUP (default) or HTML.

sevk templates list
sevk templates create --title "Welcome Email" --content-file welcome.sevk
sevk templates create --title "Reset Password" --content-file reset.html --style HTML
sevk templates get <template-id>
sevk templates update <template-id> --content-file updated.sevk
sevk templates duplicate <template-id>
sevk templates delete <template-id>

sevk topics

Topics live inside an audience and let contacts opt into specific content streams. list and create require --audience-id; the other subcommands take just the topic id.

sevk topics list --audience-id 9e7a3b5c-1234-4567-89ab-cdef01234567
sevk topics list --audience-id <audience-id> --search updates --limit 50
sevk topics create --audience-id <audience-id> --name "Product Updates"
sevk topics get <topic-id>
sevk topics update <topic-id> --name "New Name"
sevk topics delete <topic-id>
sevk topics add-contact <topic-id> --contacts id1,id2
sevk topics remove-contact <topic-id> --contact-id b2c3d4e5-f678-4901-abcd-ef1234567890

sevk topics list-contacts

List every contact subscribed to a topic. Supports pagination flags and --search across contact email and data.

sevk topics list-contacts <topic-id>
sevk topics list-contacts <topic-id> --search @example.com --limit 50

sevk segments

Segments are rule-based slices of an audience. list, create, and preview require --audience-id; get, update, delete, and calculate take just the segment id. Pass a JSON rules file via --file when creating or previewing.

sevk segments list --audience-id 9e7a3b5c-1234-4567-89ab-cdef01234567
# Create from a rules file: { "rules": [...], "operator": "AND" }
sevk segments create --audience-id <audience-id> --name "Active Users" --file rules.json
# Or create an empty segment (rules can be edited later via the API)
sevk segments create --audience-id <audience-id> --name "Active Users" --operator AND
sevk segments get <segment-id>
sevk segments update <segment-id> --name "Renamed"
sevk segments delete <segment-id>
# Recompute the matched contact set
sevk segments calculate <segment-id>
# Dry-run a rules file to see how many contacts it matches
sevk segments preview --audience-id <audience-id> --file rules.json

sevk subscriptions

Subscribe a contact, optionally attach them to an audience, or unsubscribe globally without deleting them. Topic membership is managed with the topic contact commands. Unsubscribe accepts --email or --contact-id.

# Subscribe and optionally attach to an audience with metadata
sevk subscriptions subscribe --email [email protected]
sevk subscriptions subscribe --email [email protected] \
--audience-id 9e7a3b5c-1234-4567-89ab-cdef01234567 \
--data '{"plan":"pro"}'
# Unsubscribe globally (no audience scope) by email or contact id
sevk subscriptions unsubscribe --email [email protected]
sevk subscriptions unsubscribe --contact-id 0e2a4c7d-bb8b-4f3a-9c2f-aa11bb22cc33

sevk webhooks

Register endpoints that receive delivery and engagement events. sevk webhooks events prints the live event catalog from the API (email.*, broadcast.started, broadcast.finished, contact.*, etc.) so you never have to guess the exact event name.

sevk webhooks list
sevk webhooks create --url https://example.com/hooks/sevk \
--events email.sent,email.delivered,broadcast.started,broadcast.finished
sevk webhooks get <webhook-id>
sevk webhooks update <webhook-id> --url https://example.com/hooks/v2
sevk webhooks update <webhook-id> --enabled false
sevk webhooks delete <webhook-id>
sevk webhooks test <webhook-id>
sevk webhooks rotate <webhook-id>
sevk webhooks rotate <webhook-id> --yes --json
sevk webhooks events

Rotating immediately invalidates the old signing secret. Confirm the warning when prompted, or use --yes for scripts and JSON output. The command returns the new secret once; save it securely and update your webhook verifier immediately. See Rotate Webhook Secret.

sevk inbound

Browse incoming email. list filters by status (RECEIVED, PROCESSED, BOUNCED, BLOCKED, FAILED), domain, or a search across from, to, and subject. download prints a short-lived download URL for an attachment.

sevk inbound list
sevk inbound list --status PROCESSED --search "support@"
sevk inbound list --domain-id <domain-id>
sevk inbound list --broadcast-id <broadcast-id> # replies to one broadcast
sevk inbound get <inbound-email-id>
sevk inbound delete <inbound-email-id>
sevk inbound stats
sevk inbound stats --domain-id <domain-id>
sevk inbound download <inbound-email-id> <attachment-id>

sevk inbound routes

Forward routes match the recipient address (patterns like support@*) and forward to a target email. Higher --priority (0-1000) runs first. Listing supports the standard --page, --limit, --after, and --before pagination flags.

sevk inbound routes list --page 1 --limit 20
sevk inbound routes create --name "Support" --pattern "support@*" --target [email protected]
sevk inbound routes get <route-id>
sevk inbound routes update <route-id> --enabled false
sevk inbound routes delete <route-id>

sevk inbound blocklist

Block senders by email address, domain, or IP. Listing supports the standard --page, --limit, --after, and --before pagination flags. --type is EMAIL, DOMAIN, or IP.

sevk inbound blocklist list --page 1 --limit 20
sevk inbound blocklist add --type DOMAIN --value spam.example --reason "Spam source"
sevk inbound blocklist remove <entry-id>

sevk inbound quota

Show or change the monthly inbound email cap. update --monthly-limit null removes the cap; reset clears the monthly-cap pause and resumes processing (current-period counters are preserved).

sevk inbound quota get
sevk inbound quota update --monthly-limit 10000
sevk inbound quota update --monthly-limit null
sevk inbound quota reset

sevk inbound security

Per-domain inbound security config: DMARC and SPF enforcement, catch-all, and attachment size/MIME limits. Boolean flags take true or false.

sevk inbound security get <domain-id>
sevk inbound security update <domain-id> --dmarc-strict true --spf-required true
sevk inbound security update <domain-id> --catch-all false --accepted-recipients "[email protected],[email protected]"
sevk inbound security update <domain-id> \
--max-attachment-size 10485760 \
--allowed-mime-types "application/pdf,image/png"

sevk outbound quota

Show or change the user-set monthly outbound cap, pause transactional sending manually, or reset the counter. pause does not affect broadcasts; reset also clears any pause, including a manual one.

sevk outbound quota get
sevk outbound quota update --monthly-limit 50000
sevk outbound quota update --monthly-limit null
sevk outbound quota pause
sevk outbound quota reset

sevk activity list

Search account activity. Combine filters to narrow down. Categories are uppercase (EMAIL, SUBSCRIPTION); action names accept any case.

sevk activity list
sevk activity list --category EMAIL --type DELIVERED --days 7
sevk activity list --search "[email protected]"

sevk activity stats

Aggregate counts for the current billing period.

sevk activity stats

sevk usage

Current balance, billing period email totals, and project caps. Resource limits printed as ∞ mean unlimited (the API encodes unlimited caps as null). Free-tier counters print as used / None when the project has no free allowance.

sevk usage

sevk generate

Generate sevk Markup from a prompt. Handy for scaffolding a first draft. Pass --current-content-file (or --current-content) to edit an existing document and --image-url to reference an image. The command prints and returns its chat and request IDs. When retrying after an uncertain network result, reuse both IDs and the exact same prompt, image URL, and current content.

sevk generate "a welcome email for new users"
sevk generate "monthly changelog newsletter" --output newsletter.sevk
sevk generate "make the header bigger" --current-content-file newsletter.sevk --output newsletter.sevk
sevk generate "a welcome email for new users" --chat-id CHAT_ID --request-id UUID

sevk credits

Show the project's monthly credits: used, allowance, remaining, usage percentage, and reset time.

sevk credits

sevk config

Inspect or edit per-profile settings, including a custom API base URL.

sevk config show
sevk config show --profile production
sevk config set-url https://api.sevk.internal
sevk config set-url https://api.staging.sevk.internal --profile staging
sevk config remove-url
sevk config remove-url --profile staging

sevk markup

Render sevk Markup to HTML without hitting the API.

# Render to stdout
sevk markup render template.sevk
# Render to a file
sevk markup render template.sevk -o output.html
# Render from stdin
cat template.sevk | sevk markup render
# Extract {{variables}} the template uses
sevk markup variables template.sevk

sevk doctor

Run diagnostic checks: CLI version, runtime, API key resolution, API connectivity, and the config file (including its permissions).

sevk doctor
sevk doctor --json