Skip to content

Retrieve a topic

Fetch one topic by its id.

http
GET /v1/topics/{id}

Requires a Full access API key.

Path parameters

ParameterTypeRequiredDescription
idstringYesThe topic id. This is the id, not the key.

Example

bash
curl "https://api.sendgrail.com/v1/topics/$TOPIC_ID" \
  -H "Authorization: Bearer $SENDGRAIL_API_KEY"
js
const res = await fetch(`https://api.sendgrail.com/v1/topics/${id}`, {
  headers: { Authorization: `Bearer ${process.env.SENDGRAIL_API_KEY}` },
});

const topic = await res.json();

Response

json
{
  "object": "topic",
  "id": "7b2e6f90-3c11-4a5d-9b8e-1f0c4d6a2e59",
  "key": "product-updates",
  "name": "Product updates",
  "description": "New features and improvements, about once a month",
  "default_subscription": "opt_out",
  "visibility": "public",
  "created_at": "2026-07-14T19:44:32+00:00"
}

The topic object describes the category, not who is on it. A contact's subscription state lives on the contact — read it with GET /v1/contacts/{id}/topics. See Contact topics.

A topic belonging to another team answers 404, not 403 — an id that isn't yours is an id that doesn't exist, as far as your key is concerned.

json
{
  "message": "No topic with the id 7b2e6f90-3c11-4a5d-9b8e-1f0c4d6a2e59.",
  "code": "not_found",
  "request_id": "8f2c1e64-1b17-4f8c-9f0e-3b6c1e0f5c31"
}

A Sending-access key is a different failure: it is a real key, it just isn't allowed here, so it answers 403. See Errors.

Transactional email on your own domain.