Skip to content

List emails

Every email you've sent, newest first.

http
GET /v1/emails

Requires a Full access API key. A Sending key gets 403 restricted_api_key — a key that lives inside your application can send mail, but can't read your history back out.

Parameters

Cursor-paginated:

ParameterDefaultNotes
limit201–100.
afterAn email id. Returns the emails after it (older).
beforeAn email id. Returns the emails before it (newer).

Example

bash
curl "https://api.sendgrail.com/v1/emails?limit=2" \
  -H "Authorization: Bearer $SENDGRAIL_API_KEY"
js
const res = await fetch('https://api.sendgrail.com/v1/emails?limit=2', {
  headers: { Authorization: `Bearer ${process.env.SENDGRAIL_API_KEY}` },
});
const { data, has_more } = await res.json();
php
$response = $http->get('https://api.sendgrail.com/v1/emails', [
    'headers' => ['Authorization' => 'Bearer '.getenv('SENDGRAIL_API_KEY')],
    'query' => ['limit' => 2],
]);

Response

json
{
  "object": "list",
  "has_more": true,
  "data": [
    {
      "id": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c",
      "message_id": "0100019f5f93-5775-3459-00d0f1f6-000000",
      "to": ["recipient@example.org"],
      "from": "Acme <hello@example.com>",
      "created_at": "2026-07-14T09:41:55+00:00",
      "subject": "Your receipt",
      "bcc": [],
      "cc": [],
      "reply_to": [],
      "last_event": "delivered",
      "scheduled_at": null
    }
  ]
}

last_event is the message's current state — see the email object.

The list omits bodies and tags

html, text and tags are left out of list rows — a page of 100 bodies would be megabytes you didn't ask for. Fetch the full object, tags included, with Retrieve an email.

Transactional email on your own domain.