plugins/twilio-developer-kit/skills/twilio-sendgrid-suppressions/SKILL.md
Manage SendGrid email suppressions: bounces, blocks, spam reports, invalid emails, global unsubscribes, and ASM suppression groups. Covers when and how to remove suppressions, reputation impact, and category-based unsubscribe management. Use when debugging SendGrid delivery issues or building unsubscribe flows. Requires a SendGrid API key (SG.-prefix) — not applicable to the Twilio Email API (comms.twilio.com).
npx skillsauth add openai/plugins twilio-sendgrid-suppressionsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Suppressions prevent SendGrid from sending to addresses that have bounced, reported spam, or unsubscribed. They protect your sender reputation but can also block legitimate re-sends if not managed correctly.
| Type | Endpoint | What triggers it | Auto-added? |
|------|----------|-----------------|-------------|
| Hard Bounces | /v3/suppression/bounces | Permanent delivery failure (invalid mailbox, domain doesn't exist) | Yes |
| Soft Bounces | No management API — automatic retry only | Temporary failure (mailbox full, server down) — SendGrid auto-retries before suppressing | Yes, after repeated failures |
| Blocks | /v3/suppression/blocks | Temporary rejection by receiving server (reputation, policy, content) | Yes |
| Spam Reports | /v3/suppression/spam_reports | Recipient marks email as spam | Yes |
| Invalid Emails | /v3/suppression/invalid_emails | Malformed email address | Yes |
| Global Unsubscribes | /v3/suppression/unsubscribes | Recipient unsubscribes from all email | Yes |
| Group Unsubscribes (ASM) | /v3/asm/groups/{id}/suppressions | Recipient unsubscribes from a category | Yes |
Hard vs Soft bounces: Hard bounces (permanent) immediately suppress the address. Soft bounces (temporary) trigger retries — SendGrid will retry delivery before eventually suppressing if the issue persists.
List bounces (Python)
import os, requests
headers = {"Authorization": f"Bearer {os.environ['SENDGRID_API_KEY']}"}
response = requests.get("https://api.sendgrid.com/v3/suppression/bounces", headers=headers)
for bounce in response.json():
print(f"{bounce['email']}: {bounce.get('reason', 'unknown')}")
Remove a bounce (Python)
requests.delete(f"https://api.sendgrid.com/v3/suppression/bounces/{email}", headers=headers)
Caution: Deleting suppression records (especially spam reports) allows re-sending to addresses that previously complained. Always confirm with the user before removal and document the business reason.
Use suppression groups for category-based unsubscribes (e.g., "Marketing", "Transactional", "Product Updates"). Recipients can unsubscribe from one category without being suppressed from all email.
Create a group:
requests.post("https://api.sendgrid.com/v3/asm/groups",
headers={**headers, "Content-Type": "application/json"},
json={"name": "Marketing Emails", "description": "Promotional offers and updates"})
Send with a suppression group:
Include asm.group_id in your Mail Send request. Recipients see a "manage preferences" link instead of a global unsubscribe.
Configure automatic purge schedules in Console > Settings > Mail Settings > Purge Bounces & Blocks:
Caution: Enabling auto-purge without a business reason allows re-sending to previously bounced addresses, which damages sender reputation. Do not use as a workaround to force delivery.
Console > Settings > Mail Settings > Address Allow List allows specific email addresses or domains to bypass all suppressions. Useful for internal testing addresses.
Use with extreme caution — never allowlist domains you don't control (e.g., gmail.com), and never use to bypass spam report suppressions.
twilio-sendgrid-email-sendtwilio-sendgrid-webhookstwilio-sendgrid-account-setupdevelopment
Use when the user wants to spin up / create / launch / provision a DigitalOcean droplet (or "a remote dev box on DO") and connect to it from Codex as a remote SSH workspace.
data-ai
Search through Microsoft Teams chats or channels, triage unread or recent activity, draft follow-ups, and manage Planner tasks through connected Teams data.
tools
Motion / animation context for the `use_figma` MCP tool — animating Figma nodes via manual keyframes, animation styles, easing, and timeline duration. Load alongside figma-use whenever a task involves adding, editing, or inspecting animation on a node.
development
SwiftUI ↔ Figma translation. Use whenever the user mentions Swift, SwiftUI, iOS, iPhone, or iPad — in EITHER direction — translating a Figma design into SwiftUI (design → code), or pushing SwiftUI views / screens / tokens back into a Figma file (code → design). Triggers on phrases like 'implement this Figma design in SwiftUI', 'build this screen in Swift', 'push this SwiftUI view to Figma', 'mirror my Swift code in a Figma file', or whenever a Figma URL appears alongside `.swift` files / an `.xcodeproj`. Routes to a direction-specific reference doc; loads alongside `figma-use` for the code → design path.