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 loginsevk login --key sevk_full_xxxxxxxxsevk login --key sevk_full_prodxxxx --profile production
sevk logout
Remove a saved profile (defaults to default) or wipe them all with --all.
sevk logoutsevk logout --profile productionsevk 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 listsevk auth switch # interactivesevk auth switch productionsevk auth rename old-name new-namesevk auth remove stagingsevk 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 textsevk emails send \--from "Name <[email protected]>" \--to [email protected] \--subject "Subject line" \--text "Body"# HTML from a filesevk emails send \--from "[email protected]" \--to [email protected] \--subject "Newsletter" \--html-file ./newsletter.html# sevk Markup from a filesevk emails send \--from "[email protected]" \--to [email protected] \--subject "Welcome" \--markup-file ./welcome.sevk# Multiple recipients, CC, BCC, reply-tosevk emails send \--from "[email protected]" \--cc [email protected] \--bcc [email protected] \--reply-to [email protected] \--subject "Update" \--text "Hello everyone"# Attach files (max 10 files, 10MB total)sevk emails send \--from "[email protected]" \--to [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
[{ "from": "[email protected]", "to": "[email protected]", "subject": "Hi Alice", "text": "Hi Alice!" },]
sevk domains
Create, inspect, verify, and delete sending domains.
sevk domains listsevk 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 listsevk contacts list --search [email protected]sevk contacts create --email [email protected]sevk contacts create --email [email protected] --audience-id 9e7a3b5c-1234-4567-89ab-cdef01234567sevk contacts get <contact-id>sevk contacts update <contact-id> --first-name Janesevk 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 listsevk 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,c3sevk 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 listsevk broadcasts list --status DRAFT# Create against an audiencesevk 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.sevksevk 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 listsevk templates create --title "Welcome Email" --content-file welcome.sevksevk templates create --title "Reset Password" --content-file reset.html --style HTMLsevk templates get <template-id>sevk templates update <template-id> --content-file updated.sevksevk 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-cdef01234567sevk topics list --audience-id <audience-id> --search updates --limit 50sevk 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,id2sevk 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 ANDsevk segments get <segment-id>sevk segments update <segment-id> --name "Renamed"sevk segments delete <segment-id># Recompute the matched contact setsevk segments calculate <segment-id># Dry-run a rules file to see how many contacts it matchessevk 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 metadatasevk 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 idsevk 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 listsevk webhooks create --url https://example.com/hooks/sevk \--events email.sent,email.delivered,broadcast.started,broadcast.finishedsevk webhooks get <webhook-id>sevk webhooks update <webhook-id> --url https://example.com/hooks/v2sevk webhooks update <webhook-id> --enabled falsesevk webhooks delete <webhook-id>sevk webhooks test <webhook-id>sevk webhooks rotate <webhook-id>sevk webhooks rotate <webhook-id> --yes --jsonsevk 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 listsevk inbound list --status PROCESSED --search "support@"sevk inbound list --domain-id <domain-id>sevk inbound list --broadcast-id <broadcast-id> # replies to one broadcastsevk inbound get <inbound-email-id>sevk inbound delete <inbound-email-id>sevk inbound statssevk 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 20sevk inbound routes create --name "Support" --pattern "support@*" --target [email protected]sevk inbound routes get <route-id>sevk inbound routes update <route-id> --enabled falsesevk 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 20sevk 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 getsevk inbound quota update --monthly-limit 10000sevk inbound quota update --monthly-limit nullsevk 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 truesevk 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 getsevk outbound quota update --monthly-limit 50000sevk outbound quota update --monthly-limit nullsevk outbound quota pausesevk 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 listsevk activity list --category EMAIL --type DELIVERED --days 7sevk 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.sevksevk generate "make the header bigger" --current-content-file newsletter.sevk --output newsletter.sevksevk 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 showsevk config show --profile productionsevk config set-url https://api.sevk.internalsevk config set-url https://api.staging.sevk.internal --profile stagingsevk config remove-urlsevk config remove-url --profile staging
sevk markup
Render sevk Markup to HTML without hitting the API.
# Render to stdoutsevk markup render template.sevk# Render to a filesevk markup render template.sevk -o output.html# Render from stdincat template.sevk | sevk markup render# Extract {{variables}} the template usessevk 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 doctorsevk doctor --json