# Migrate from `VIEWER` to `CONTRIBUTOR` seat type

The `CONTRIBUTOR` seat type provides internal, free-tier users with commenting and attachment capabilities at no additional cost. As part of this change, the `VIEWER` seat type is deprecated and is now replaced by the `CONTRIBUTOR` seat type.

**During the Deprecation Period** (Apr 30 – Oct 30, 2026), the API maintains full backward compatibility. This means that all integrations that use the `VIEWER` seat type continue to work normally. However, you should migrate your integrations to use the `CONTRIBUTOR` seat type as soon as possible.

**At Sunset** (October 30, 2026), the deprecation period ends. The following changes take effect:

- **`VIEWER` seat type is completely removed** from all API responses and operations
- **`CONTRIBUTOR` replaces `VIEWER`** in all API responses for all internal, free-tier users
- **`seatType=VIEWER` filter no longer works**
- **The `'seatType': 'VIEWER'` request body parameter in downgrade requests is no longer accepted** — requests using it will fail with an error


If you have not migrated by October 30, 2026:

- Filtering by `seatType=VIEWER` will fail or return no results
- Downgrade operations using `seatType=VIEWER` will fail with an error
- Any conditional logic checking for `VIEWER` seat type will never execute
- Your integration will be broken for free-tier user management


For the above reasons, you should update your code to use the `CONTRIBUTOR` seat type as soon as possible.

This article defines the migration steps and provides a migration checklist.

## Migration steps

Make the following changes.

1. **For filtering operations:** Replace `seatType=VIEWER` with `seatType=CONTRIBUTOR`.

```
GET /2.0/users?seatType=CONTRIBUTOR
```
Since you're filtering on the `CONTRIBUTOR` seat type, the operation returns internal, free-tier users with the seat type value `CONTRIBUTOR`. As such, a `displayContributorSeatType=true` request parameter is unnecessary.
2. **For list operations with `displayContributorSeatType` parameter:** Add the parameter to see the new seat type in responses.

```
GET /2.0/users?planId={planId}&displayContributorSeatType=true
GET /2.0/users/{userId}/plans?displayContributorSeatType=true
```
3. **In your response handling:** Update code that checks for seat type values.

```
// Old
if (user.seatType === SeatTypes.VIEWER) { ... }

// New
if (user.seatType === SeatTypes.CONTRIBUTOR) { ... }
```
4. **For downgrade operations:** Use `CONTRIBUTOR` in request bodies

```
POST /2.0/users/{userId}/plans/{planId}/downgrade
Body: { "seatType": "CONTRIBUTOR" }
```


## Migration checklist

Double-check your migration with the help of this checklist:

- [ ] Audit your codebase for all references to `VIEWER` seat type.
- [ ] Update filter parameters from `seatType=VIEWER` to `seatType=CONTRIBUTOR`.
- [ ] Add `displayContributorSeatType=true` to applicable `GET` requests.
- [ ] Update response handling to expect and process the `CONTRIBUTOR` seat type.
- [ ] Replace `VIEWER` with `CONTRIBUTOR` in downgrade request bodies.


You've migrated to using the `CONTRIBUTOR` Seat Type.

## Related content

Refer to the API documentation for affected operations:

- [`GET /2.0/users`](/api/smartsheet/openapi/users/list-users)
- [`GET /2.0/users/{userId}/plans`](/api/smartsheet/openapi/users/list-user-plans)
- [`POST /2.0/users/{userId}/plans/{planId}/downgrade`](/api/smartsheet/openapi/users/downgrade-user)