SendGrid Management
Complete CLI for managing SendGrid email services - send emails, manage templates, contacts, domains, and more.
Quick Reference
| Task | Command |
|---|
| Send email | sendgrid mail send --to user@example.com --subject "Hello" --text "Body" |
| Send with template | sendgrid mail send --to user@example.com --template-id d-xxx --data '{"name":"John"}' |
| List templates | sendgrid template list |
| Add contact | sendgrid contact add --email user@example.com --first-name John |
| View stats | sendgrid stats global --days 7 |
| List bounces | sendgrid suppression bounces |
| Create API key | sendgrid apikey create --name "My Key" --scopes mail.send |
Installation
# Option 1: Run with Deno
deno run --allow-all ~/.claude/skills/sendgrid-management/cli/mod.ts [command]
# Option 2: Compile to binary
cd ~/.claude/skills/sendgrid-management/cli && deno task compile
./dist/sendgrid --help
# Option 3: Install globally
deno install --allow-all -n sendgrid ~/.claude/skills/sendgrid-management/cli/mod.ts
Authentication
# Set API key (saves to ~/.config/sendgrid/config.json)
sendgrid auth login --api-key SG.xxx
# Or use environment variable
export SENDGRID_API_KEY="SG.xxx"
# Check auth status
sendgrid auth status
Command Groups
| Group | Description |
|---|
auth | Authentication and config management |
mail | Send emails (transactional) |
template | Manage dynamic templates |
contact | Manage contacts |
list | Manage contact lists |
segment | Manage contact segments |
suppression | View/manage bounces, blocks, spam reports |
sender | Manage verified senders |
domain | Domain authentication (DKIM, SPF) |
stats | View email statistics |
webhook | Manage event webhooks |
apikey | Manage API keys |
validate | Validate email addresses |
Core Workflows
Workflow 1: Send Transactional Email
# Simple email
sendgrid mail send \
--to recipient@example.com \
--from sender@example.com \
--subject "Welcome!" \
--html "<h1>Hello</h1><p>Welcome to our service!</p>"
# With dynamic template
sendgrid mail send \
--to recipient@example.com \
--from sender@example.com \
--template-id d-f43daeeaef504760851f727007e0b5d0 \
--data '{"name": "John", "order_id": "12345"}'
# Multiple recipients
sendgrid mail send \
--to user1@example.com,user2@example.com \
--from sender@example.com \
--subject "Announcement" \
--text "Important update..."
# Schedule for later
sendgrid mail send \
--to recipient@example.com \
--from sender@example.com \
--subject "Scheduled" \
--text "This was scheduled" \
--send-at "2024-12-25T10:00:00Z"
Workflow 2: Manage Templates
# List all templates
sendgrid template list
# Get template details
sendgrid template get <template-id>
# Create template
sendgrid template create --name "Welcome Email" --generation dynamic
# Create/update version
sendgrid template version create <template-id> \
--name "v1" \
--subject "Welcome {{name}}!" \
--html-file welcome.html \
--active
Workflow 3: Contact Management
# Add single contact
sendgrid contact add \
--email user@example.com \
--first-name John \
--last-name Doe \
--list-ids abc123,def456
# Import from file
sendgrid contact import --file contacts.csv
# Search contacts
sendgrid contact search --query "email LIKE '%@example.com'"
# Export contacts
sendgrid contact export --list-id abc123 --output contacts.csv
# Get contact count
sendgrid contact count
Workflow 4: List Management
# Create list
sendgrid list create --name "Newsletter Subscribers"
# List all lists
sendgrid list all
# Add contacts to list
sendgrid list add-contacts <list-id> --emails user1@example.com,user2@example.com
# Remove contacts from list
sendgrid list remove-contacts <list-id> --contact-ids id1,id2
# Delete list
sendgrid list delete <list-id>
Workflow 5: Suppression Management
# View bounces
sendgrid suppression bounces [--start-time 2024-01-01] [--end-time 2024-12-31]
# View blocks
sendgrid suppression blocks
# View spam reports
sendgrid suppression spam-reports
# View unsubscribes
sendgrid suppression unsubscribes
# Delete specific bounce
sendgrid suppression delete bounce user@example.com
# Add to global unsubscribe
sendgrid suppression add unsubscribe user@example.com
Workflow 6: Domain Authentication
# List authenticated domains
sendgrid domain list
# Authenticate new domain
sendgrid domain create --domain example.com
# Get DNS records to add
sendgrid domain get <domain-id>
# Validate domain (after adding DNS)
sendgrid domain validate <domain-id>
# Set as default
sendgrid domain set-default <domain-id>
Workflow 7: Sender Verification
# List verified senders
sendgrid sender list
# Create sender identity
sendgrid sender create \
--from-email noreply@example.com \
--from-name "My Company" \
--reply-to support@example.com
# Resend verification
sendgrid sender resend <sender-id>
# Delete sender
sendgrid sender delete <sender-id>
Workflow 8: Statistics
# Global stats (last 7 days)
sendgrid stats global --days 7
# Stats by category
sendgrid stats category --categories transactional,marketing --days 30
# Stats by mailbox provider
sendgrid stats mailbox-providers --days 7
# Stats by browser
sendgrid stats browsers --days 7
# Stats by device
sendgrid stats devices --days 7
Workflow 9: Webhooks
# List webhooks
sendgrid webhook list
# Create webhook
sendgrid webhook create \
--url https://example.com/webhook \
--events delivered,opened,clicked,bounced
# Update webhook
sendgrid webhook update <webhook-id> --enabled false
# Test webhook
sendgrid webhook test <webhook-id>
# Delete webhook
sendgrid webhook delete <webhook-id>
Workflow 10: API Keys
# List API keys
sendgrid apikey list
# Create API key
sendgrid apikey create \
--name "Production API" \
--scopes mail.send,templates.read
# Create full access key
sendgrid apikey create --name "Admin Key" --full-access
# Update key name
sendgrid apikey update <key-id> --name "New Name"
# Delete key
sendgrid apikey delete <key-id>
JSON Output
All commands support --json for machine-readable output:
sendgrid template list --json | jq '.[].id'
sendgrid stats global --days 7 --json > stats.json
Environment Variables
| Variable | Description |
|---|
SENDGRID_API_KEY | API key (required) |
SENDGRID_FROM_EMAIL | Default from email |
SENDGRID_FROM_NAME | Default from name |
API Coverage
| Category | Endpoints | Status |
|---|
| Mail Send | send, schedule, batch | Complete |
| Templates | CRUD, versions | Complete |
| Contacts | add, import, search, export | Complete |
| Lists | CRUD, add/remove contacts | Complete |
| Segments | list, get | Partial |
| Suppressions | bounces, blocks, spam, unsubs | Complete |
| Senders | CRUD, verify | Complete |
| Domain Auth | CRUD, validate | Complete |
| Stats | global, category, geo, device | Complete |
| Webhooks | CRUD, test | Complete |
| API Keys | CRUD | Complete |
| Validation | single email | Complete |
Common Issues
| Error | Solution |
|---|
401 Unauthorized | Check API key is valid and has required scopes |
403 Forbidden | API key lacks permission for this action |
429 Rate Limited | Too many requests; wait and retry |
400 Bad Request | Check request parameters |
Resources