# Retrieve Topic

`GET https://api.inboxjot.com/v1/topics/{topic_id}`

Retrieves one topic. Needs a Full key. A key limited to one domain answers 403.

## Path Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `topic_id` | string | Yes | The topic id. |

## Response

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | No | The topic id. |
| `name` | string | No | The topic name. |
| `description` | string \| null | No | Shown on the preference page. |
| `default_subscribed` | boolean | No | Whether a new contact is subscribed until they choose. |
| `visibility` | string | No | `public` or `private`. |
| `double_opt_in` | boolean | No | Whether a form sign-up must confirm by email. |
| `form_enabled` | boolean | No | Whether the hosted sign-up form is on. |
| `sender_name` | string \| null | No | The from name for confirmation emails. |
| `sender_email` | string \| null | No | The from address for confirmation emails. |
| `redirect_url` | string \| null | No | The page shown after someone signs up. |
| `is_default` | boolean | No | True for the default topic. Campaigns use it when no topic is set. |
| `counts` | object | No | How many contacts chose each status. |
| `counts.subscribed` | integer | No | Subscribed. |
| `counts.pending` | integer | No | Waiting to confirm. |
| `counts.unsubscribed` | integer | No | Unsubscribed. |
| `created_at` | string | No | When it was created. |
| `updated_at` | string | No | When it last changed. |

## Request

cURL:

```bash
curl -X GET https://api.inboxjot.com/v1/topics/top_06d2mfk8r6pn2tc8yw3hd \
  -H "Authorization: Bearer $INBOXJOT_API_KEY"
```

## Responses

| Status | Description |
| --- | --- |
| 200 | Returns the topic. |
| 400 | A path parameter is invalid. |
| 401 | The API key is missing, revoked or expired. |
| 403 | The key is a Sending key or is limited to one domain, or the request comes from outside its IP allowlist. |
| 404 | The topic does not exist in this workspace. |
| 429 | Too many requests for this key. Wait for the seconds in the Retry-After header. |
| 500 | Something failed on our side. Retry later. |

200:

```json
{
  "id": "top_06d2mfk8r6pn2tc8yw3hd",
  "name": "Product updates",
  "description": "New features, once a month.",
  "default_subscribed": true,
  "visibility": "public",
  "double_opt_in": false,
  "form_enabled": false,
  "sender_name": null,
  "sender_email": null,
  "redirect_url": null,
  "is_default": false,
  "counts": {
    "subscribed": 3120,
    "pending": 14,
    "unsubscribed": 96
  },
  "created_at": "2026-09-02T10:12:00.000Z",
  "updated_at": "2026-09-02T10:12:00.000Z"
}
```

400:

```json
{
  "name": "validation_error",
  "status": 400,
  "message": "length is greater than 100",
  "errors": [
    {
      "message": "length is greater than 100",
      "location": "topic_id"
    }
  ],
  "request_id": "5f0c6a2e-8d1b-4c7a-9e3f-2b6d4a1c8e90"
}
```

401:

```json
{
  "name": "unauthorized",
  "status": 401,
  "message": "Unauthorized",
  "errors": [],
  "request_id": "5f0c6a2e-8d1b-4c7a-9e3f-2b6d4a1c8e90"
}
```

403:

```json
{
  "name": "forbidden",
  "status": 403,
  "message": "This key cannot be used from 203.0.113.7",
  "errors": [],
  "request_id": "5f0c6a2e-8d1b-4c7a-9e3f-2b6d4a1c8e90"
}
```

404:

```json
{
  "name": "not_found",
  "status": 404,
  "message": "Topic not found",
  "errors": [],
  "request_id": "5f0c6a2e-8d1b-4c7a-9e3f-2b6d4a1c8e90"
}
```

429:

```json
{
  "name": "rate_limit_exceeded",
  "status": 429,
  "message": "Too many attempts. Try again later.",
  "errors": [],
  "request_id": "5f0c6a2e-8d1b-4c7a-9e3f-2b6d4a1c8e90"
}
```

500:

```json
{
  "name": "unknown_error",
  "status": 500,
  "message": "Something went wrong. Please try again later.",
  "errors": [],
  "request_id": "5f0c6a2e-8d1b-4c7a-9e3f-2b6d4a1c8e90"
}
```
