# List invite templates

Source: https://api-docs.magicdoor.com/api-reference/tenant-portal-invite-templates/list-invite-templates

Returns the company's tenant portal invite templates, seeding MagicDoor's built-in ones on first call so the list is never empty. Requires the `settings:read` permission.

`GET https://services.magicdoor.com/settings/company-portal/settings/tenant-portal-invite-templates`

**Authentication:** bearer token in the `Authorization` header, as `Bearer <token>`.

## Example request

```bash
curl --request GET \
  --url 'https://services.magicdoor.com/settings/company-portal/settings/tenant-portal-invite-templates' \
  --header 'Authorization: Bearer <token>'
```

## Responses

### 200 — The company's templates, in the order they are shown.

- `id` (string, required) — The template's Snowflake id, as a decimal string.
- `kind` (enum<string>, required) — Which message in the invite sequence this template is. Everything the company creates itself is `Custom`. One of: `Welcome`, `PortalInvite`, `Payment`, `PasswordChange`, `Custom`, `PostInviteMaintenance`, `PostInviteImportantDocuments`.
- `name` (string, required) — What the template is called in the settings screen.
- `isCustom` (boolean, required) — `true` for templates the company created, `false` for MagicDoor's built-in ones. Only custom templates can be deleted, and only built-in ones can be reset.
- `email` (object, required) — The email version of the message.
  - `subject` (string, required) — The email subject line.
  - `body` (string, required) — The email body, as HTML.
- `text` (object, required) — The text-message version of the message.
  - `body` (string, required) — The text message body, as plain text.
- `updatedAt` (string, required) — When the template was last saved, formatted as `yyyy-MM-dd HH:mm`. Unlike timestamps elsewhere in the API this is a display string, not an ISO 8601 value.
- `updatedByName` (string) — The property manager who last saved it, as a first name and last initial. Absent when the last save was not made by a property manager.

```json
[
  {
    "id": "1849037281920516096",
    "kind": "PortalInvite",
    "name": "Portal Invite",
    "isCustom": false,
    "email": {
      "subject": "Your tenant portal is ready",
      "body": "<p>Hi {TenantName}, your portal is ready. Sign in at {PortalLink}.</p>"
    },
    "text": {
      "body": "Hi {TenantName}, your {CompanyName} portal is ready: {PortalLink}"
    },
    "updatedAt": "2026-08-17 21:04",
    "updatedByName": "Dana K."
  },
  {
    "id": "1849037281920516097",
    "kind": "Custom",
    "name": "Renewal reminder",
    "isCustom": true,
    "email": {
      "subject": "A quick reminder from {CompanyName}",
      "body": "<p>Hi {TenantName}, sign in at {PortalLink} to review your lease.</p>"
    },
    "text": {
      "body": "Hi {TenantName}, review your lease at {PortalLink}"
    },
    "updatedAt": "2026-08-15 09:12",
    "updatedByName": "Dana K."
  }
]
```

### 401 — The access token is missing, expired, or invalid.

### 403 — The caller does not hold the `settings:read` permission.

The first call for a company creates any missing built-in templates — `Welcome`, `PortalInvite`, `Payment`, `PostInviteMaintenance` and `PostInviteImportantDocuments` — from MagicDoor's defaults, so the response always contains them.

Templates come back in sequence order: `Welcome`, `PortalInvite`, `Payment`, `PasswordChange`, then the company's own `Custom` templates oldest first, then anything else.
