Guides

Message activity

Look up delivery status per message, filter by tags, and read events.

Message activity is the read-only log of everything you've sent: status, recipients, tags, and timing — newest first.

Listing

curl "https://api.emitd.com/v1/messages?limit=25" \
  -H "Authorization: Bearer $EMITD_API_KEY"
  • ?limit= — default 25, max 100
  • ?cursor= — a bare epoch-millisecond created_at from the previous page; returns rows strictly older
  • ?tag_key=campaign&tag_value=welcome — filter on the tags JSON column (tag_value alone is ignored). There is no status filter on this endpoint.
{
  "data": [
    {
      "id": "msg_2h8Kd0Rk9Qa",
      "from_addr": "hello@yourdomain.com",
      "to_addr": "ada@lovelace.io",
      "subject": "Your receipt #4021",
      "status": "sent",
      "ses_message_id": "0100018f...",
      "error": null,
      "created_at": 1783386190000,
      "updated_at": 1783386190864
    }
  ],
  "next_cursor": 1783386190000
}

Status is one of queued, sent, failed, suppressed, scheduled, cancelled. Note to_addr is the primary recipient only — the full recipient set isn't stored on this row.

Detail

GET /v1/messages/{id} returns the full record for one message (404 if it doesn't exist or isn't yours — the API never distinguishes the two).

Events

Delivery, bounce, complaint, open, and click events are joined to messages and streamed to your webhooks. Simulated events from test mode live at GET /v1/email/test-events.

Filtering patterns

# all messages tagged campaign=welcome, one page
curl "https://api.emitd.com/v1/messages?tag_key=campaign&tag_value=welcome&limit=100" \
  -H "Authorization: Bearer $EMITD_API_KEY"

Tag every send at the source (tags: { "campaign": "welcome" }) — tags are written once at send time and are what both activity filtering and analytics hang off.

On this page