Smartsheet

Smartsheet

Updated 2024-04-22





Introduction

Smartsheet API 2.0 allows you to programmatically access and manage your organization's Smartsheet data and account information. The API is restricted to users on a Business or Enterprise plan. The API allows you to do the following:

Once you scroll to the Developer Reference section, you can view code examples in the programming language of your choice by clicking the corresponding tab in the rightmost pane. Each tab corresponds to a Software Development Kit (SDK) that Smartsheet provides to make working in that programming language easier. See SDKs and Sample Code.

NOTES:

API Basics

Assume User

Allows an admin to act on behalf of, or impersonate, the user to make API calls. You might do this to troubleshoot a user problem or cover for vacations and sick time. As with cURL, the email address used to identify the user must be URI-encoded.

An admin cannot impersonate another admin.

NOTE: You must manually generate a token to assume user.

cURL example

curl https://api.smartsheet.com/2.0/sheets \
-H "Authorization: Bearer ll352u9jujauoqz4gstvsae05" \
-H "Assume-User: jane.doe%40smartsheet.com" \

C# example

SmartsheetClient smartsheet = new SmartsheetBuilder()
.SetAccessToken(accessToken)
.SetAssumedUser("jane.doe@smartsheet.com")
.Build();

Java example

smartsheet.setAssumedUser("jane.doe@smartsheet.com");

Node.js example

// Set options
var options = {
assumeUser: "jane.doe@smartsheet.com"
};
// List Sheets
smartsheet.sheets.listSheets(options)
.then(function(sheetList) {
console.log(sheetList);
})
.catch(function(error) {
console.log(error);
});

Python example

smartsheet_client.assume_user("jane.doe@smartsheet.com")

Ruby example

smartsheet.sheets.list(
header_override: {:'Assume-User' => CGI::escape('jane.doe@smartsheet.com')}
)

Authentication and Access Tokens

When choosing an authentication method, it’s important to consider your integration scenario. Do you want user consent and interaction or is your integration machine-to-machine?

When user consent and interaction are involved, we recommend OAuth 2.0 as a best practice. Note that the Smartsheet implementation of OAuth 2.0 is a 3-legged process, which requires human intervention. See the OAuth process for a code walkthrough.

When creating machine-to-machine integrations, making a raw token request is recommended. Raw API tokens provide a straightforward, yet secure, method of authentication without the need for human intervention.

In either scenario, an HTTP header containing an access token is required to authenticate each request.

WARNING: If an unauthorized user gets a copy of this token, they will be able to access all Smartsheet data that you have access to, both to read and modify on your behalf. You should keep your tokens secure and do not share them with anyone. See Security for best practices.

Dates and Times

The Smartsheet API returns all dates and times in the UTC time zone in ISO-8601 format, that is, YYYY-MM-DDTHH:MM:SSZ. If you are specifying a date and time, you should also send that information in ISO-8601 format. If a date/time needs to be displayed to an end-user in their local time zone, you must do the conversion using the user's time zone, which you can obtain by getting the current user.

You can optionally choose to receive and send dates/times in numeric format, as milliseconds since the UNIX epoch (midnight on January 1, 1970 in UTC time), using the query string parameter numericDates with a value of true. This query parameter works for any API request.

NOTE: Some SDK methods use language-specific Date objects, which require different date formats.

Filtering

You cannot create or update filters using the API; however, you can query which rows have been filtered out and you can get filter definitions.

For details, see Filters object.

Formatting

To set or read formatting programmatically, Smartsheet uses a compact format string, cell.format, which looks something like this: ",,1,1,,,,,,,,,,,,,". The position and sample values in this string are explained in the following format descriptor table:

Format Descriptor Table

PositionLookup PropertyExample ValueFormat String
0fontFamily0 = Arial, default"0,,,,,,,,,,,,,,,,"
1fontSize0 = 10 pt, default",0,,,,,,,,,,,,,,,"
2bold1 = on",,1,,,,,,,,,,,,,,"
3italic1 = on",,,1,,,,,,,,,,,,,"
4underline1 = on",,,,1,,,,,,,,,,,,"
5strikethrough1 = on",,,,,1,,,,,,,,,,,"
6horizontalAlign2 = center",,,,,,2,,,,,,,,,,"
7verticalAlign2 = middle",,,,,,,2,,,,,,,,,"
8color (text)4 = #FEEEF0",,,,,,,,4,,,,,,,,"
9color (background)8 = #E6F5FE",,,,,,,,,8,,,,,,,"
10color (taskbar)9 = #F3E5FA",,,,,,,,,,9,,,,,,"
11currency13 = USD",,,,,,,,,,,13,,,,,"
12decimalCount3 = three decimal places",,,,,,,,,,,,3,,,,"
13thousandsSeparator1 = on",,,,,,,,,,,,,1,,,"
14numberFormat2 = currency",,,,,,,,,,,,,,2,,"
15textWrap1 = on",,,,,,,,,,,,,,,1,"
16dateFormat1 = mmmm d yyyy (December 8, 1997)",,,,,,,,,,,,,,,,1"

NOTES:

Applying Formatting

Use the "include=format" query-string parameter on API operations that return detailed objects, such as GET /sheets/{sheetId} or GET sheets/{sheetId}/rows/{rowId}. If there is formatting other than default settings, the return includes a format property. If an object has conditional formatting, the format property returned will have a conditionalFormat value.

Setting the format of a row object or column object through the API simply sets the baseline format for new or blank cells in that row or column. It does not affect cells that already have a value.

If you want to change the formatting of cells that already have content, for instance you want to make a row bold, then you have to set the format for each cell individually.

Formulas

Formulas are processed per cell in the UI. Use the Cell object to manipulate formulas via the API.

For requests, use Update Rows to add or update the formula in a cell.

For response payloads, formulas (when present) are returned whenever the Cell object is returned, so for example, GET /sheets/(id) returns the Cell object for each cell and that object contains a formula value when the cell contains a formula.

HTTP and REST

The REST URL structure follows typical resource-oriented conventions.

To get a list of sheets, use the following:

GET https://api.smartsheet.com/2.0/sheets

This returns a list of Sheet objects, where each sheet has an id attribute.

To get details on the sheet with id 123456, use the following:

GET https://api.smartsheet.com/2.0/sheets/123456

This Id pattern is repeated throughout the API. Columns, rows, cells, comments, attachments, or any other data element have a unique Id.

If you don't want to make raw HTTP calls, Smartsheet also has several Software Development Kits (SDKs) that provide a higher level interface for popular programming languages. For more information, see SDKs and Sample Code.

HTTP Headers

Unless otherwise specified, all API endpoints expect request body data to be in JSON, and the response body data is returned as JSON.

The following HTTP request headers may be required, depending on the operation and endpoint being invoked:

HeaderDefinitionExample
AuthorizationRequired for all endpoints, except for POST /token. The access token.Bearer JKlMNOpQ12RStUVwxYZAbcde3F5g6hijklM789
Content-TypeRequired for POST and PUT requests. Defines the structure for the response.application/json
Assume-UserOptional. Allows an admin to act on behalf of, or impersonate, the user to make API calls. The email address used to identify the user must be URI-encoded.jane.doe%40smartsheet.com

HTTP Verbs

Call the API using the following standard HTTP methods:

HTTP Status Codes

Smartsheet uses a combination of HTTP status codes and custom error codes with a descriptive message in JSON-formatted Error objects to give you a more complete picture of what has happened with your request.

HTTP
status code
MeaningTo Retry or Not to Retry?
2xxRequest was successful.

Example: 200 Success
--
4xxA problem with request prevented it from executing successfully.Never automatically retry the request.

If the error code indicates a problem that can be fixed, fix the problem and retry the request.
5xxThe request was properly formatted, but the operation failed on Smartsheet's end.In some scenarios, requests should be automatically retried using exponential backoff.

For example, doing a GET on a non-existent sheet at https://api.smartsheet.com/2.0/sheets/123456 results in an HTTP status code of 404, indicating the resource was not found.

{
"errorCode": 1006,
"message": "Not Found"
}

Some errors may contain a detail attribute set to an object with additional error details that may be useful in programmatically handling the error. If so, it is noted in the specific API operation for which the error may occur.

NOTE: Smartsheet has custom error codes to help you troubleshoot issues. See the complete Error Code List.

Limitations

While Smartsheet is improving capacity frequently, there are some hard limits that might be helpful to know:

The following features aren't yet supported for sheets with more than 5000 rows, or more than 200 columns:

Looping

Looping is an expected action when working with the Smartsheet API. But when do you run the For Loop? Do you loop through multiple endpoint calls or is there a more efficient way?

For instance, if you're looking for multiple values on a given sheet, fetch the entire sheet. Do the searching on the return data in one single For Loop rather than calling the search endpoint multiple times with different values.

Multi-contact or Multi-picklist: Working with Complex Objects

New column types, such as MULTI_CONTACT_LIST and MULTI_PICKLIST, offer more complex ways to work with columns. Smartsheet has provided a backwards compatible way for these payloads to work with your existing integrations while also giving you a way to query for their content.

With either column type, there are two ways of receiving the response:

Smartsheet uses two indicators to help you discover changes in the return data for your API calls:

TextMulti-contactMulti-picklist
012

You must use the level query parameter, for example level=2, to return a complex object with the new column type. Without the query parameter, the response will be backwards-compatible, that is a string. The include=objectValue query parameter is necessary to see the return as a complex value, such as actual email addresses rather than display names.

Use the highest possible level for each endpoint, as in the following table:

Endpoint categoryLevel
Dashboards4
Reports3
Sheets2

Object Details vs List Summaries

Many of the List All commands, for example, GET /sheets, return only an abbreviated object for each object returned. For full details, read a single item, such as GET /sheets/{sheetId}. In many cases, you can refine the exact object properties to be returned by using include and exclude query parameters.

The JSON representation of the objects returned from the List All REST endpoints will only include a subset of the properties documented here. However, the objects returned from the Java and C# SDKs will represent the omitted properties with NULLs.

Query Strings

Many API calls can be modified by including one or more of these common query strings:

Query ParameterTypeDescriptionMore Info
accessApiLevelNumberAllows COMMENTER access for inputs and return values. For backwards-compatibility, VIEWER is the default. For example, to see whether a user has COMMENTER access for a sheet, use accessApiLevel=1.
allowPartialSuccessBooleanIf true, allows bulk operations to process even if one or more operations are invalid for some reason, for example, allowPartialSuccess=true.Bulk Operations
include or excludeStringWhen applicable for a specific object, various include or exclude parameters are available, for example, include=format.Object reference or Formatting
includeAllBooleanIf true, includes all results, for example, includeAll=true.Paging
levelNumberUse for complex objects.Working with Complex Objects
numericDatesBooleanIf true, allows you to input or receive dates in numeric format, for example, numericDates=true.Dates and Times
pageStringSpecifies which page to return, for example, page=4.Paging
pageSizeNumberSpecifies the maximum number of items to return per page, for example, pageSize=25.Paging

NOTE: Query strings are case sensitive. If you do not see the expected response, confirm that your query is formatted correctly.

Raw Token Requests

If you want to get started quickly, or are developing a standalone application that can run with your credentials, follow these instructions:

  1. Click the "Account" button in the lower-left corner of the Smartsheet screen, and then click "Personal Settings".
  2. Click the "API Access" tab.
  3. Click the "Generate new access token" button to obtain an access token.

The access token must be sent with every API call in an HTTP authorization header (except for the requests to Get Access Token or Refresh Access Token). Once you have an access token, include it in the Authorization header for every request you make:

Authorization: Bearer JKlMNOpQ12RStUVwxYZAbcde3F5g6hijklM789

The header name is Authorization and the value of the header is Bearer JKlMNOpQ12RStUVwxYZAbcde3F5g6hijklM789. Since the access token is being transmitted in clear text, all API calls are done over HTTPS.

NOTE: A best practice is to use a shared account, such as ticket-processor@example.com, rather than your individual work account.

SDKs and Sample Code

Smartsheet has Software Development Kits (SDKs) providing a higher level interface for several languages.

LanguageSDKSample application
C#smartsheet-csharp-sdkcsharp-read-write-sheet
Javasmartsheet-java-sdkjava-read-write-sheet
Node.jssmartsheet-javascript-sdknode-read-write-sheet
Pythonsmartsheet-python-sdkpython-read-write-sheet
Ruby*smartsheet-ruby-sdkruby-read-write-sheet

In addition to the sample application provided for each SDK, you can always view code examples in this document by clicking the corresponding tab in the dark-blue area in the rightmost pane.

The SDKs ease use of the Smartsheet APIs. Benefits include:

To use an SDK for development work, follow the instructions in the SDK readme to download and install the SDK. Then download the sample app and run it. Once you've run the sample application, you can clone it and use the structure it provides to start building your own applications.

*The Ruby SDK is no longer maintained. It is still usable, but new functionality may be missing.

Sheets/Columns/Rows/Cells

Sheets have a core hierarchy of Sheet > Column > Row > Cell. The strict hierarchy tells you how to associate the objectId with the object. For example, your return might include a Sheet object with many Row objects. Each object has an objectId. The strict hierarchy helps you map the objectId to the sheet or specific row.

Cells are a little different. You identify a cell by its location in the grid, so you need both a column Id and a row Id to pinpoint a specific cell. The following table defines these terms and points you to places in this documentation where you can find more information:

UI ElementDescriptionMore Info
sheetA sheet can exist in a user's Home folder, in a folder, or in a workspace. It is comprised of columns, rows, and cells, and may optionally contain attachments or discussions.Sheet object
columnA Column object defines the type of the column, but does not actually contain cells. The Column Id identifies the cells in a row.Column object, Column types
rowA row is a component of a sheet or report. Each row is composed of a collection of cells, and may optionally contain attachments or discussions.Row object
cellA cell is a location within a sheet that may contain a value. A collection of cells comprises each row in a sheet.Cell object, Cell reference

Versioning and Changes

Smartsheet will add new functionality and bug fixes to the API over time. Make sure that your code can handle new JSON properties gracefully. Also, make sure your code does not depend on the order in which JSON objects are returned, unless it is explicitly stated in this documentation.

When there is new functionality that is not compatible with existing code, say in the case of a new concept, Smartsheet increments the level to indicate the new feature can be ignored until you are ready to implement the code to work with the new level.

See also: Multi-contact or Multi-picklist: Working with Complex Objects

Code Walkthrough

Make Your First API Call

Before you write any code, try executing API requests using a tool like cURL or Postman. By taking your code out of the equation, you can isolate troubleshooting to the raw request and response.

You must use an access token. See instructions at Authentication and Access Tokens. In the examples below, replace this sample token, "JKlMNOpQ12RStUVwxYZAbcde3F5g6hijklM789", with your actual token value.

WARNING: If an unauthorized user gets a copy of this token, they will be able to access all Smartsheet data that you have access to, both to read and modify on your behalf. You should keep your tokens secure and do not share them with anyone. See Security for best practices.

To get a list of all your sheets, try the following command:

curl -X GET -H "Authorization: Bearer JKlMNOpQ12RStUVwxYZAbcde3F5g6hijklM789" "https://api.smartsheet.com/2.0/sheets"

In Postman, the request looks like this:

Postman screen shot

The JSON result should look something like this (after formatting):

{
"pageNumber": 1,
"pageSize": 100,
"totalPages": 1,
"totalCount": 2,
"data": [{
"id": 6141831453927300,
"name": "My first sheet",
"accessLevel": "ADMIN",
"permalink": "https://app.smartsheet.com/b/home?lx=8enlO7GkdYSz-cHHVus33A",
"createdAt": "2016-01-28T22:02:35Z",
"modifiedAt": "2016-08-09T17:50:06Z"
},
{
"id": 6141831453927300,
"name": "Sheet shared to me",
"accessLevel": "VIEWER",
"permalink": "https://app.smartsheet.com/b/home?lx=8enlO7GkdYSz-cHHVus33A",
"createdAt": "2016-01-28T22:02:35Z",
"modifiedAt": "2016-08-09T17:50:06Z"
}
]
}

How to Read a Sheet Response

Many Smartsheet API operations handle sheets, rows, columns, and cells. Each is identified by an Id and it is important to understand the relationship between these objects. Typically you loop through the columns to determine the Id of the columns you are interested in. Then you loop through the rows and contained cells to find actual values. The annotated sample response below illustrates these concepts by calling a very simple sheet called "Employee Roster".

Basic sheet with 2 rows and 2 columns

Before you begin, you should already have an access token, which you used in the exercise above. Use the same access token for this walkthrough.

Step 1: The first thing you must have is a sheetId. To find a sheetId through the UI, with the sheet open, click "Sheet Actions" in the left toolbar and select "Properties". NOTE: use List Sheets if you want to do this programmatically.

Image of the Sheet Properties window

Step 2: Copy the sheetId into the API call, GET /sheets, as below:

curl -X GET -H "Authorization: Bearer JKlMNOpQ12RStUVwxYZAbcde3F5g6hijklM789" "https://api.smartsheet.com/2.0/sheets/6141831453927300"

Step 3: The sample request and response are displayed below. NOTE: while JSON doesn't have a comment feature, this sample uses comments to help you identify the objects in the response.

{
"id": 6141831453927300, // Sheet Id
"name": "My first sheet",
"columns": [{ // Each Column object associates column Id
// to title and defines the
// column details
"id": 2517104256673668, // Column Id
"index": 0,
"title": "Name",
"type": "TEXT_NUMBER",
"primary": true,
"width": 150
},
{
"id": 7020703884044164, // Next column Id
"index": 1,
"title": "EmployeeId",
"type": "TEXT_NUMBER",
"width": 150
}
],
"rows": [{ // A Row object
"id": 564480076736388, // Row Id
"rowNumber": 1,
"expanded": true,
"createdAt": "2017-05-12T16:52:38Z",
"modifiedAt": "2017-05-22T20:40:14Z",
"cells": [{ // Each row contains an array of cells,
// which have the actual content
"columnId": 2517104256673668,
// The column Id can be interpreted by
// looking at the array of column
// definitions above. That tells you
// this is the "Name" column
"value": "John Doe",
"displayValue": "John Doe"
},
{
"columnId": 7020703884044164,
"value": 12345, // Actual cell value
"displayValue": "12,345"
// How the cell value is displayed in the UI
}
]},
{
"id": 5068079704106884,
"rowNumber": 2,
"siblingId": 564480076736388,
"expanded": true,
"createdAt": "2017-05-12T16:52:38Z",
"modifiedAt": "2017-05-22T20:40:14Z",
"cells": [{
"columnId": 2517104256673668,
"value": "Jane Roe",
"displayValue": "Jane Roe"
},
{
"columnId": 7020703884044164,
"value": 67890,
"displayValue": "67890"
}
]
}
]
}

This core hierarchy of Sheet > Column > Row > Cell is essential to working with the Smartsheet API. As your user's sheets grow in complexity, the responses do too. This walkthrough has given you some navigational aid in finding the right value to plug into your API calls. Use the API Reference and the example language tabs to learn more.

Error Code List

For an explanation of the logic behind Smartsheet error codes and error handling, see the HTTP and REST portion of the Introduction.

400-Level Error Codes

400-level error codes generally indicate that there is something you should fix or add to your request before you try the request again.

HTTP status codeSmartsheet errorCodeSmartsheet message
4011001An Access Token is required.
4011002Your Access Token is invalid.
4011003Your Access Token has expired.
4031004You are not authorized to perform this action.
4011005Single Sign-On is required for this account.
4041006Not Found.
4041007Version not supported.
4001008Unable to parse request. The following error occurred: {0}
4001009A required parameter is missing from your request: {0}.
4051010HTTP Method not supported.
4001011A required header was missing or invalid: {0}
4001012A required object attribute is missing from your request: {0}.
4031013The operation you are attempting to perform is not supported by your plan.
4031014There are no licenses available on your account.
4031015The user exists in another account. The user must be removed from that account before they can be added to yours.
4031016The user is already a member of your account.
4031017The user already has a paid account. The user must cancel that account before they can be added to yours.
4001018The value {0} was not valid for the parameter {1}.
4001019Cannot transfer to the user specified. User not found.
4041020User not found.
4031021Cannot transfer to the user specified. They are not a member of your account.
4031022Cannot delete the user specified. They are not a member of your account.
4001023The sheet specified is shared at the Workspace level.
4001024The HTTP request body is required for this Method.
4001025The share already exists.
4031026Transferring ownership is not currently supported.
4041027Share not found.
4001028You cannot edit the share of the owner.
4001029The parameter in the URI does not match the object in the request body.
4011030You are unable to assume the user specified.
4001031The value {0} was not valid for the attribute {1}.
4001032The attribute(s) {0} are not allowed for this operation.
4041033The template was not found.
4001034Invalid Row Id.
4001035Deprecated.
4001036The columnId {0} is invalid.
4001037The columnId {0} is included more than once in a single row.
4001038Invalid Cell value. Must be numeric or a string.
4031039Cannot edit a locked column {0}.
4001040Cannot edit your own share.
4001041The value for {0} must be {1} characters in length or less, but was {2}.
4001042The value for cell in column {0}, {1}, did not conform to the strict requirements for type {2}.
4041043The row number you requested is blank and cannot be retrieved.
4001044Assume-User header is required for your Access Token.
4031045The resource specified is read-only.
4001046Cells containing system values cannot be inserted or updated through the API, columnId : {0}.
4031047You cannot remove yourself from the account through the API.
4031048The user specified has declined the invitation to join your organization. You cannot modify declined invitations.
4031049You cannot remove admin permissions from yourself through the API.
4031050You cannot edit a locked row.
4001051Attachments of type FILE cannot be created using JSON.
4061052Invalid Accept header. Media type not supported.
4001053Unknown Paper size: {0}.
4001054The new sheet requires either a fromId or columns.
4001055One and only one column must be primary.
4001056Column titles must be unique.
4001057Primary columns must be of type TEXT_NUMBER.
4001058Column type of {1} does not support symbol of type {0}.
4001059Column options are not allowed when a symbol is specified.
4001060Column options are not allowed for column type {0}.
4001061Max count exceeded for field {0}.
4001062Invalid row location.
4001063Invalid parentId: {0}.
4001064Invalid siblingId: {0}.
4001065The column specified cannot be deleted.
4001066You can only share to {0} users at a time.
4011067Invalid client_id
4001068Unsupported grant type.
4001069Invalid Request. The authorization_code has expired.
4001070Invalid Request. Required parameter is missing: {0}.
4001071Invalid Grant. The authorization code or refresh token provided was invalid.
4001072Invalid hash value. The hash provided did not match the expected value.
4001073The redirect_uri did not match the expected value.
4001074You are trying to upload a file of {0}, but the API currently only supports {1}.
4001075The Content-Size provided did not match the file uploaded. This may be due to network issues or because the wrong Content-Size was specified.
4031076The user has created sheets and must be added as a licensed user.
4001077Duplicate system column type: {0}.
4001078System column type {0} not supported for {1} {2}.
4001079Column type {0} is not supported for system column type {1}.
4001080End Dates on dependency-enabled sheets cannot be created/updated. Please update either the Duration or Start Date column.
4031081You cannot delete or update another user's discussions, comments, or comment attachments.
4001082You cannot add options to the given column {0} because it is not a PICKLIST.
4001083Auto number formatting cannot be added to a column {0}.
4001084The auto number format is invalid.
4001085To change this column's type you must first disable Dependencies for this sheet.
4001086Google was not able to verify your access.
4001087The column specified is used in a conditional formatting rule, so the column cannot be deleted and its type cannot be changed.
4001088Invalid length for concatenated auto number format. Concatenated format is {0}, with a length of {1}. Must be less than or equal to 40.
4001089The type specified is only used with System Columns.
4001090Column.type is required when changing symbol, systemColumnType or options.
4001091Invalid Content-Type: {0}.
4031092You cannot delete this row. Either it or one or more of its children are locked.
4001093Apple verification not available.
4001094Can't set password without licensed account.
4001095The Excel file is invalid/corrupt. This may be due to an invalid file extension, an outdated Excel format, or an invalid Content-Length.
4031096This Apple payment receipt has already been applied to a user's payment profile.
4031097A user must be a licensed sheet creator to be a resource viewer.
4001098To delete this column you must first disable Dependencies for this sheet.
4001099To delete this column you must first disable Resource Management for this sheet.
4001100Uploading new versions of a discussion comment attachment is not supported.
4001101Uploading new versions of non-FILE type attachments is not supported.
4031102A user must be a licensed sheet creator to be a group administrator.
4001103A group with the same name already exists.
4031104You must be a group administrator to create a group.
4001105The operation failed because one or more group members were not members of your account: {0}.
4041106Group not found.
4001107User specified in transferGroupsTo must be a group admin.
4001108transferGroupsTo must be provided because user being deleted owns one or more groups.
4001109Only one of cell.hyperlink or cell.linkInFromCell may be non-null.
4001110cell.value must be null if cell.linkInFromCell is non-null.
4001111Only one of cell.hyperlink.sheetId and cell.hyperlink.reportId may be non-null.
4001112cell.hyperlink.url must be null for sheet or report hyperlinks.
4001113cell.value must be a string when the cell is a hyperlink.
4041114Invalid sheetId or reportId: {0}.
4001115Row must contain either cell link updates or row/cell value updates; mixing of both update types in one API call is not supported.
4001116You cannot link a cell to its own sheet.
4001117One of the following cell.hyperlink fields must be non-null: url, sheetId, or reportId.
4001118You cannot set the value of a Gantt allocation column (id {0}) in a row that has child rows.
4001120Too many sheets to copy.
NOTE: includes a "detail" object containing "maxSheetCount" which represents the server-side limit on the number of sheets allowed in a single folder/workspace copy operation.
4001121transferTo must be provided because user being deleted owns one or more groups.
4051122Requested URL does not support this method: {0}.
4001123Specifying multiple row locations is not yet supported. Each row must use the same row location attribute and value (toBottom, toTop, parentId, siblingId, above).
4151124Invalid Content-Type header. Media type not supported.
4001125Each part in a multipart payload must have a name.
4001126Multipart payload contained duplicate part names: {0}.
4001127Required multipart part was missing: '{0}'
4001128Multipart upload size limit exceeded.
4001129The resource you tried to create already exists.
4001130One of cell.value or objectValue may be set, but not both.
4001131cell.{0} for column {1} was of the wrong object type. Allowed types: {2}.
4001132The token provided has previously been revoked.
4001133Column titles are not unique among input columns.
4001134Duplicate system column type among input columns.
4001135Input column index {0} is different from the first input column index {1}.
4001136Cannot copy or move row(s) within the same sheet.
4001137Input collection contains multiple instances of the same element.
4031138The user is not eligible for a trial organization.
4031139The user is an admin in another organization. Add 'allowInviteAccountAdmin=true' to the query string to invite their entire organization.
4031140The user must be added as a licensed user.
4031141Inviting users from an enterprise organization is not supported.
4001142Column type {0} is reserved for project sheets and may not be manually set on a column.
4001143To set {0}, you must first enable dependencies on the sheet.
4001144The user owns one or more groups and must be added as a Group Admin.
4001145Multipart upload request was invalid. Please check your request headers and payload.
4001146Unsupported operation: {0}.
4001147Multipart request contained an invalid part name: '{0}'
4001148Numeric cell values must be between {0} and {1}.
4001149Not configured for Gantt.
4001150Invalide operation for shared.
4041151Scope object not found.
4001152URL must have HTTPS.
4031153Webhook app revoked.
4031154Webhook disabled by Smartsheet.
4001155You cannot set the '{0}' attribute for a cell in a 'Project Settings' column of a dependency-enabled sheet.
4001156Invalid email.
4001157This address is already associated with another Smartsheet account, so it cannot be added as an alternate address for this account.
4001158This address has not been confirmed yet, so it can't be set as the primary email address.
4001159The specified email address ({0}) is an alternate email address for a user with a primary email address of {1}.
4001160Invalid bulk request. See detail for more information.
4001161Cannot set altText for a cell that does not contain an image: row {0}, column {1}.
4001162A formula must always start with an equal sign (=).
4001163If cell.image is non-null then value, objectValue, hyperlink, and linkInFromCell must all be null.
4001164Cannot add image to cell because this feature has been disabled by the org administrator.
4001165Cannot add image to cell with alt text larger than 100 characters.
4001166You cannot share Sights as an Editor.
4001167The resource you are attempting to access has expired.
4001168objectValue's type is not valid for virtualColumnId {0}.
4001169All virtual columns in a group must be of the same type.
4031173You must be in a Team/Enterprise account to specify a {0} value of '{1}'.
4031174The value for {0} is invalid because this publish option is configured to be restricted to users in this account.
4031175One or more publish options which you attempted to enable are disabled for this account.
4001176Array attribute(s) may not contain null elements: {0}.
4001177Arrays may not contain null elements.
4001178The following combination of attributes is not allowed for this operation: {0}.
4001179The schedule specified is invalid because endAt is earlier than the next send date.
4031180We are unable to process this request because the email has been associated with a different Smartsheet account.
4031181Only admins can edit shared filters.
4001182The specified sheet filter {0} does not exist for sheet {1}.
4001183Sheet filters must define at least one detail entry.
4001184Sheet {0} already has a filter named '{1}' of type {2}.
4001185Cannot create a child of a parent row that has no data in it.
4031186User's primary email address must be a validated domain.
4031187User's alternate address selected to be made primary must be a validated domain.
4031188The account status of the user specified is not active.
4001189Only Enterprise or Team accounts with security controls are able to change primary emails.
4001190Only Enterprise or Team accounts with special permission granted are able to change primary emails.
4001191Summary field attribute is the wrong type.
4031192Can't edit locked summary field.
4001193Duplicate summary field title.
4001194Invalid summary field type for options.
4001195Duplicate summary field index.
4001196Summary field type required for change.
4001197Summary field options not allowed for symbols.
4001198Unsupported symbol for summary field type.
4001199Maximum number summary fields exceeded.
4001200Duplicate summary field Id.
4001201Summary field image only.
4001202Summary field hyperlink value must be string.
4001203Can't link summary field to same sheet.
4041204Invalid sheet report dashboard Id.
4001205Can't set summary field alt text.
4001206Unsupported summary field format type.
4001207Attribute value is empty.
4001208Duplicate summary field title in request.
4001209Can't set attribute on column type.
4001210Column validation is not supported for column type '{0}'.
4001211Not authorized.
4031212You must be a sheet admin to override validation.
4001213Deprecated.
4001214Invalid notification level '{0}'.
4001215Notification not supported by level.
4001216Notification rule not found.
4001217Exceeds allowed max date.
4001218The attributes recipientColumnIds, recipients and notifyAllSharedUsers are mutually exclusive. Only one may be set, not all.
4001218The attributes includeAllColumnIds and includedColumnIds are mutually exclusive. Only one may be set not all.
4001219The attributes {0} and {1} are mutually exclusive. Only one may be set.
4001220Automation action type cannot be changed.
4001221The value {0} is not valid for the attribute action.recipientColumnIds. Only Contact List columns may be used.
4001222Invalid attribute for operation.
4001223Sort sheet with locked row.
4001224Invalid parameter value.
4001225Problem processing row header.
4001226Personal workspace not found.
4001227The query parameters '{0}' and '{1}' are mutually exclusive. Only one may be set.
4001228You must specify one of the following query parameters: '{0}' or '{1}'.
4001229The value '{0}' was not valid for the parameter '{1}'. The value must be between '{2}' and '{3}'.
4001230Duplicate bot type.
4001231Invalid bot type.
4031232Bot not enabled.
4001233Required form field missing.
4001234Form data empty.
4001235Value not supported on column.
4001236OAuth missing client auth.
4001237OAuth redundant client auth.
4001238OAuth invalid secret.
4001239Client column version mismatch.
4001240Multi-contact list limit.
4001241Invalid mulcit-contact name.
4001242Too many display column Ids.
4001243Invalid view by Id.
4001244Uncardable view by Id.
4001245Invalid display column Id.
4001246Displaying primary column in card view.
4001247Card view level below minimum.
4001248Invalid subtask column Id.
4001249Uncheckable subtask column Id.
4001250Card view not configured.
4001251Duplicate display column Id.
4001252Inconsistent lane values.
4001253Move card adjacent to self.
4001254Invalid view by Id for card operation.
4001255Attachment type '{0}' is not supported.
4001256Individual accounts disabled.
4001257Form hyperlink is not URL.
4001258Cannot move folder under descendant.
4001259Uncardable view by Id for card operation.
4001260Cannot delete last visible column.
4001261Uncardable column for editing lanes.
4001262Invalid card lane name.
4001263Duplicate card lane name.
4001264Column fields not allowed for editing lanes.
4001265Card view was never configured for lanes.
4001266This rule is not accessible through the API. Only single-action notifications, approval requests, or update requests qualify.
4001267Web content widget disabled.
4001268Dashboard web content widget custom domain URL disabled.
4031269Removing group admin who owns groups.
4031270Forbidden impersonate object owner.
4031271Forbidden impersonate user.
4001272Invalid impersonate header value.
4001273Both impersonate and assume user provided.
4001274Impersonate object owner not supported.
4031275Impersonate feature not enabled.
4001276Column type not supported.
4001277Multi-picklist invalid size.
4001279Proofing setting error.
4001280Proofing duplicate record.
4001281Proofing invalid file extension.
4001282Invalid JSON.
4001283Unrecognized JSON property.
4001284Dashboard level below minimum.
4001286Proofing service row move invalid.
4031287Publish disabled by sheet sys admin.
4031288Sheet disabled by admin.
4001289Proofing cannot disable with proofs.
4001290The following users cannot be added to this group: {0}.
4001291Refreshing mobile access tokens is not yet enabled.
4001292The grant_type is inconsistent with the API request type for authentication.
4041293Subscope contains invalid ids.
4001294A proof cannot be retrieved.
4001295Proof requests cannot be created on an empty proof.
4001296Uploading new versions of a proof attachment is not supported.
4031297Upgrade to a business plan or higher to enable proofing.
4001298Proof version can only be created on an original version proof id. In addition, the proof must not be marked as complete and the current version must not be empty.
4001299Proof version cannot be deleted.
4001300Error creating proof request or sending the notification.
4031301No permissions for column formulas.
4001302Cannot edit column formula cells.
4001303Unsupported column type for column formulas.
4001304Maximum number of column formulas exceeded.
4001305Cannot set column formula on project column.
4001306An attachment can only be uploaded to a current version proof. In addition, the proof must not be marked as complete.
4001307A PDF cannot be included in a proof with multiple files. Only JPG, JPEG, PNG, GIF, and BMP files are supported in a proof with multiple files.
4001308Multi-image proofing is not enabled on this sheet. Please contact the sheet owner for assistance.
4001309An attachment can only be deleted from a current version proof. In addition, the proof must not be marked as complete.
4001310Column formula syntax not supported.
4041311Invalid Item ID provided.
4001312Invalid Item type provided.
4001313Since 'includeMessageOnly' is set to true, 'message' must not be blank.
4001314Plan type cannot use column formulas.
4001315Proof status can only be updated on a current version proof. In addition, the proof cannot be empty.
4001316A discussion, comment, or comment attachment can only be created or edited on a current version proof. In addition, the proof must not be marked as complete.
4031317This action can't be performed right now, as this report is using capabilities that haven't been released to the public yet. You'll be able to take this action later once the capabilities are released. Sorry for the inconvenience!
4001318Cannot delete baseline columns.
4001319Cannot update values in baseline columns.
4001320Cannot change a baseline column type.
4001321Cannot put a column formula in a baseline column.
4001322Cannot remove column formula from baseline variance column.
4001323Invalid column type for baseline column.
4001324Unsupported baseline type for column.
4001326Baselines API feature not enabled for sheet.
4001327Proof request cannot be deleted.
4001328Baselines requires existing start and end date columns.
4001329Invalid characters in first or last name.
4001330You have reached the limit of {0} alternate email addresses. To add {1}, first remove an existing alternate email address that you no longer need.
4031331Datatables feature is not enabled.
4001332Images not allowed in baseline columns.
4031334Shared publish option is not enabled.
4031335Cannot deactivate the user specified. They are not a member of your account.
4031336You cannot deactivate yourself from the account through the API.
4031337You must upgrade your organization to invite this user. Pro plans are only allowed to invite other pro plan users.
4001338Missing file name in request.
4001339Missing file size in request.
4001340Attachment ticket is invalid, is not found or access has been disabled for this account. Create a valid attachment ticket before finalizing.
4001341File uploaded to s3 is invalid or is missing.
4001342Attachment ticket is no longer pending. Create a new attachment ticket and try again.
4001343User movement policy planId and planName doesn't match.
4001344Duplicate user movement policy for the same planId.
4001345Unsupported user movement policy attribute.
4001346planId should be a managed plan.
4001347User movement policy list count is more than expected managed plan count.
4001348Empty user movement policy list.
4001349Input data is out of expected length boundary.
4001350Missing required property.
4001351Data value is not supported.
4001352Unexpected leading/trailing space in input data.
4031354Cannot reactivate the user specified. They are not a member of your account.
4031355You cannot reactivate yourself from the account through the API.
4031356The operation you are attempting to perform is not supported in Smartsheet Gov.
4001357Container type is invalid.
4031359User account with a common ISP domain email cannot be deactivated. You can only remove them from the Org.
4001360Please confirm all existing alternate email addresses before attempting to add another email address.
4031361This action is restricted by an SSO Policy. Please reach out to the workspace admin for any questions.
4031362This action is restricted by an MFA Policy. Please reach out to the workspace admin for any questions.
4031363This action is restricted by this organization's Data Egress Policy. Please reach out to this organization's system admin for any questions.
4294003Rate limit exceeded.
4104005API version retired.
4005xxxErrors in the 5xxx range represent conditions that a developer cannot reasonably prevent or handle, most typically related to account status. These error messages are localized and can be displayed to the end-user to inform them of the condition that caused the error to occur.

500-Level Error Codes

500-level error codes indicate there is some kind of permanent error.

HTTP status codeSmartsheet errorCodeSmartsheet message
5001119Failed to complete copy.
NOTE: may include a "detail" object containing "topContainerType" and "topContainerId" which represent the top-level folder or workspace that were partially copied.
5001170The sheet referenced by this widget is unavailable or deleted.
5001171The report referenced by this widget is unavailable or deleted.
5001172The referenced cell is unavailable or deleted.
5001278Proofing service error.
5001285Dashboard source profile field missing.
5001325Unable to create baseline column.
5011333The form service mobile API is not implemented for this environment.
5011353Work Insights Widget is currently not supported in Dashboard API.
5011358This operation has been deprecated. Smartsheet recommends to use the Deactivate User API endpoint. Contact Support for more information.
5004000An unexpected error has occurred. Please contact api@smartsheet.com for assistance.
5034001Smartsheet.com is currently offline for system maintenance. Please check back again shortly.
5004002Server timeout exceeded. Request has failed.
5004004An unexpected error has occurred. Please retry your request. If you encounter this error repeatedly, please contact api@smartsheet.com for assistance.

Or

Request failed because sheetId {0} is currently being updated by another request that uses the same access token. Please retry your request once the previous request has completed.
5005151The action could not be completed because the following people are outside of the approved domain sharing list:[email address]
5005502You must have sheet admin permission to save a notification with recipients other than yourself.

OAuth Walkthrough

Apps connect to Smartsheet using OAuth 2.0 to authenticate and authorize users. If you are building an app, this documentation will walk you through the steps you need to authenticate your users. The Smartsheet SDKs contain APIs for OAuth 2.0.

NOTE: For users of apps like AWS AppFabric, you will need a Tenant ID. You can find your Tenant ID in Admin Center under Security & Controls. There is a Smartsheet Tenant ID pane.

First Steps

Before you can start using OAuth 2.0 with your app, Smartsheet needs the following information:

  1. You must register with Smartsheet to get a developer account*. The developer account gives you access to "Developer Tools", which is where you manage your app.
  2. In "Developer Tools", complete any required fields in your developer profile.
  3. In "Developer Tools", register your app so Smartsheet can assign a client Id and a client secret to the app.
  4. Review the list of access scopes. You'll need to choose which ones your app needs to get to a user's Smartsheet data, and then ask the user to consent to that access.

After you've worked through these steps, you'll be ready to implement the OAuth Flow.

NOTE: Your use of the Smartsheet APIs and SDKs are governed by the Developer Agreement.

Open Developer Tools

  1. Log in to Smartsheet with your developer account.
  2. Click the "Account" button in the lower-left corner of your Smartsheet screen, and then click "Developer Tools".
  3. Do one of the following:

Register Your App Using Developer Tools

  1. Log in to Smartsheet with your developer account.
  2. Click the "Account" button in the upper-right corner of your Smartsheet screen, and then click "Developer Tools".
  3. In the "Create New App" form, provide the following information:

OAuth Flow

Your app must implement a 3-legged OAuth flow to retrieve an access token it can use to access Smartsheet data on behalf of an end user. The following diagram has an overview of the OAuth flow:

Simplified graphic showing what data is passed back and forth during OAuth flow

NOTE: App registration and OAuth flow require HTTPS.

Access Scopes

To access a user's Smartsheet data, your application must explicitly ask the user for permission. You do this by using access scopes, which enable your app to communicate to the user what type of operations it is performing. Access scopes do not override existing access-level restrictions. For example, having the access scope of WRITE_SHEETS does not allow your app to update a sheet on which the user has VIEWER access level.

The access scopes are as follows:

Access ScopeDescription
ADMIN_SHEETSModify sheet structure, including column definition, publish state, etc.
ADMIN_SIGHTSModify Sights/dashboards structure.
ADMIN_USERSAdd and remove users from your Smartsheet organization account; create groups and manage membership.
ADMIN_WEBHOOKSCreate, delete, and update webhooks; get all webhooks; reset shared secret.
ADMIN_WORKSPACESCreate and manage workspaces and folders, including sharing.
CREATE_SHEETSCreate new sheets.
CREATE_SIGHTSCreate new Sights/dashboards.
DELETE_SHEETSDelete sheets.
DELETE_SIGHTSDelete Sights/dashboards.
READ_CONTACTSRetrieve contacts.
READ_EVENTSRetrieve events.
READ_SHEETSRead all sheet data, including attachments, discussions, and cell data.
READ_SIGHTSRead all Sights/dashboards data.
READ_USERSRetrieve users and groups for your Smartsheet organization account.
SHARE_SHEETSShare sheets, including sending sheets as attachments.
SHARE_SIGHTSShare Sights/dashboards.
WRITE_SHEETSInsert and modify sheet data, including attachments, discussions, and cell data.

NOTE: Additional Info:

Request an Authorization Code

GET https://app.smartsheet.com/b/authorize

POST https://app.smartsheet.com/b/authorize

Initiates the process to get authorization from the user. Smartsheet will redirect this URL to display your app's consent page with an explanation of the data the app will need access to. This consent page is autogenerated by Smartsheet based on a combination of the information you registered for your app and the parameters you send with the request.

ValueDescription
client_idRequired. The client Id you obtained when you registered your app.
response_typeRequired. Indicates whether the endpoint returns an authorization code. Must be set to "code".
scopeRequired. Space-delimited list of access scopes to which you are asking the user to grant access. NOTE: No access scopes are necessary if you simply need to validate that the user has a Smartsheet account.
stateOptional. An arbitrary string of your choosing that is returned to your app; a successful roundtrip of this string helps ensure that your app initiated the request.

You can view code examples by clicking the corresponding tab in the rightmost pane. The cURL example shows a GET.

A correctly formatted Auth URL request looks like this: https://app.smartsheet.com/b/authorize?response_type=code&client_id=dheu3dmkd32fhxme&scope=READ_SHEETS%20WRITE_SHEETS&state=MY_STATE

NOTE: If the user has not yet logged into Smartsheet, the redirect will first take them to a login page, and then display the consent page.

At this point, the user can authorize your app to access their Smartsheet account, as in the following example:

Dialog box to allow or deny scopes

After the user clicks "Allow" or "Deny", you'll receive a response from Smartsheet outlined in the next sections.

If the User Clicks Allow

If the user clicks "Allow", Smartsheet redirects the user to the callback URL with the following parameters:

ValueDescription
codeAuthorization code required to obtain access token, such as 'sample6p9qisx6a'.
expires_inNumber of milliseconds code is valid once issued; this is currently 599135 milliseconds, or approx. 10 minutes--you must obtain an access token within that time.
stateThe same value for state that you sent when you requested the authorization code.

At this point, you should verify the state value matches what you sent to the user when you requested the authorization code. This helps you determine that the response came from the user and not a malicious script. If the values do not match, you should reject the response.

For other error conditions, see the list of OAuth Error Types.

If the User Clicks Deny

If the user clicks "Deny", Smartsheet redirects the user to the callback URL with the following parameters:

ValueDescription
error"access_denied".
stateThe same value for state that you sent when you requested the authorization code.

Get or Refresh an Access Token

Once you’ve successfully obtained an authorization code, the next step is to exchange the code for an access token. (Remember, the authorization code expires after 599135 milliseconds.)

Access tokens expire after 604799 seconds, which is approx 7 days. Use the refresh token to obtain a new access token and a new refresh token. Once you obtain the new tokens, you must use them in place of the old ones, which are no longer valid.

To get or refresh an access token, see Refresh Access Token.

OAuth Error Types

ValueDescription
invalid_clientThe client information is invalid. Ensure your client id is correct.
invalid_grantThe authorization code or refresh token is invalid or expired or the hash value does not match the app secret and/or code.
invalid_requestThe request parameters are invalid or missing.
invalid_scopeOne or more of the requested access scopes is invalid. Please check the list of access scopes.
unsupported_grant_typegrant_type must equal authorization_code or refresh_token.
unsupported_response_typeresponse_type must be set to code.

Resources

Please note the following resources:

NOTE: Your use of the Smartsheet APIs and SDKs are governed by the Developer Agreement.

Security

The following provides some best practices to consider when working with the Smartsheet API and any API keys, tokens, or other sensitive information.

Adding Security by Using OAuth

If your application requires users to be able to login with their own account, you must implement the full OAuth flow.

At a high level, this involves the following steps:

  1. Register as a Developer with Smartsheet so you can get access to the Developer Tools menu.
  2. Register your app to get both a clientId and client secret, which you'll need to store securely. Some best practices suggestions for security are below.
  3. Go through the steps in the OAuth Walkthrough once you are ready to request authorization.

NOTE: When using OAuth, be sure to review the Access Scopes needed for your app and only request the necessary scopes.

Access Levels

Sheets, templates, and workspaces have an accessLevel attribute that describes the current user's access level to that object. This corresponds directly to the sharing and access controls of Smartsheet that are available through the Smartsheet UI.

The accessLevel attribute has one of the following values:

ValueDescription
ADMINThe user can edit and share the resource, and can alter the structure of the resource as well.
EDITORThe user can edit the resource, but cannot alter the structure of, delete, or share the resource.
EDITOR_SHAREThe same as EDITOR, but with the ability to share the resource to other users.
OWNERThe user has complete control over the resource.
VIEWERThe user has read-only access to the resource.

NOTE: Smartsheet also uses access scopes. Access levels describe the actual permissions a specific user has for a specific sheet or other resource. Access scopes describe the general categories of access requested by a third-party app.

API Key Management

If you've committed code to a repository before implementing these security best practices, here are some steps to resecure your API keys.

For raw tokens:

  1. Revoke token
  2. Create a new token

If using OAuth for an integration:

Source Code and Version control

Never commit API keys to accessible version control systems like GitHub or BitBucket. Instead, you should:

If you have mistakenly deployed API keys to a publicly accessible location such as GitHub, then you should immediately revoke those API keys, revise your application to use a preferred method of key deployment, and then generate new keys.

If you need to store API keys in a database, consider the following protections:

NOTE: When using any Smartsheet SDK, you can use the environment variable of SMARTSHEET_ACCESS_TOKEN. If the access token is null on input to the client builder, the SDK will automatically pick up the value of that environment variable.

Smartsheet Gov

Smartsheet Gov has "FedRAMP Authorized" status as part of Federal Risk and Authorization Management Program (FedRAMP). As an API developer working on a Smartsheet Gov account, you should be aware of the following differences from the standard API:

If you use a Smartsheet SDK, you need to modify the standard config file to point to smartsheetgov.com. There are instructions specific to each SDK on how to modify the config file at the following locations:

Smartsheet Regions Europe

Smartsheet Regions Europe is a separate data island. As an API developer working on a Smartsheet Regions Europe account, you should be aware of the following differences from the standard API:

If you use a Smartsheet SDK, you need to modify the standard config file to point to smartsheet.eu. There are instructions specific to each SDK on how to modify the config file at the following locations:

Troubleshooting

Should you encounter issues with the Smartsheet API while building an integration using a particular programming language, for example C#, Java, Node.js, Python, or Ruby, keep the following troubleshooting techniques in mind.

Try executing the same API Request using a tool like cURL or Postman. By taking your code out of the equation, you can isolate troubleshooting to the raw Request / Response.

Examine the Request that your code is sending (including the HTTP verb, URI, headers, and Request body) and the Response that it's receiving back from Smartsheet (including the HTTP status code, headers, and response body).

Check for capitalization errors. NOTE: URL endpoints are all lower case, while object properties and query parameters are camelCase.

Work at Scale

Bulk Operations

The Smartsheet API supports a number of bulk operations that can operate on multiple objects. Unlike single-object operations, bulk operations allow you to create, update, or delete multiple objects in a single request. For example, if you want to update 10 rows within a sheet, do so using a single Update Rows request, rather than executing 10 separate requests - one for each row.

Optional Bulk Operations

Several endpoints support optional bulk POST operations which exist alongside the standard single-object POST. For these endpoints, you may pass in either a single object or an array of objects. Depending on what was passed in, the Result object returned contains either a single object or an array. An example optional bulk operation is POST /favorites: you can pass in a single Favorite object to create a single favorite, or an array of Favorite objects to create multiple favorites in a single request. Endpoints which support bulk operations are noted as such in the API reference documentation.

NOTE: Most POST operations fail when attempting to create a single object which already exists (for example, favorites, shares, group members). However, for the corresponding bulk operations, these endpoints do not return an error if one or more items in the array already exist. Existing items are simply ignored, and the Result object returned omits them.

Partial Success

In general, the default behavior for bulk operations is to fail outright if any of the objects in the request are invalid for some reason. If successful, Smartsheet creates/updates/deletes all objects in the request; if not, no objects are changed.

However, there are some operations that support partial success, which means the operation still succeeds even if one or more of the objects in the request fails for some reason (for example, an object is invalid). Here is another example: if you want to update more than one row, you send more than one row object in your request. If a row object is invalid, that row update will fail, but the other row updates will succeed. Partial success is not the default mode for an operation and you must explicitly enable it by using a query string parameter. This is noted in the documentation for operations that support partial success.

When partial success is enabled, and one or more of the objects in the request fail to be added/updated/deleted, a standard Result object is returned, but with a message of 'PARTIAL_SUCCESS' (instead of 'SUCCESS'), and a resultCode of 3. Additionally, the object contains a failedItems attribute -- an array of BulkItemFailure objects that contains an item for each object in the request that failed to be added/updated/deleted.

Paging

The Smartsheet API contains a number of index endpoints (typically denoted in the documentation with titles beginning with "Get All" or "List") which return arrays of objects. Examples include GET /users, /sheets, /sheets/{sheetId}/columns, and many others. These endpoints all support pagination, meaning you can retrieve paged subsets of results, enabling you to process potentially large result sets in smaller chunks.

Paging Query String Parameters

Index endpoints all support pagination via the following optional query string parameters:

ValueTypeDescription
includeAllBooleanIf true, include all results, that is, do not paginate. Mutually exclusive with page and pageSize (they are ignored if includeAll=true is specified).
pagenumberWhich page to return. Defaults to 1 if not specified. If you specify a value greater than the total number of pages, the last page of results is returned.
pageSizenumberThe maximum number of items to return per page. Unless otherwise stated for a specific endpoint, defaults to 100.

NOTE: Most index endpoints default to a page size of 100 results. If you want all results at once, you must specify the includeAll=true query string parameter.

Paged Responses

Index endpoints all return paged responses via an IndexResult object, which provides paging metadata that can be used to navigate the full set of pages in the result set:

ValueTypeDescription
dataarrayAn array of objects representing the current page of data in the result set.
pageNumbernumberThe current page in the full result set that the data array represents. NOTE: when a page number greater than totalPages is requested, the last page is instead returned.
pageSizenumberThe number of items in a page. Omitted if there is no limit to page size (and hence, all results are included). Unless otherwise specified, this defaults to 100 for most endpoints.
totalCountnumberThe total number of items in the full result set.
totalPagesnumberThe total number of pages in the full result set.

Rate Limiting

Handle "Rate limit exceeded" Error

To prevent abuse and undue stress on the Smartsheet servers, Smartsheet reserves the right to enforce some limits depending on the load on our systems. This reduction is sometimes called rate limiting or throttling. Certain operations, such as attaching a file and getting cell history, are resource intensive.

The Smartsheet API implements "rate limiting" to protect the system. When API calls exceed an acceptable load, an HTTP 429 status will be returned along with the following response body:

{
"errorCode": 4003,
"message": "Rate limit exceeded."
}

Smartsheet recommends that you design your integration to gracefully handle this rate limit error. One way of doing that would be to have your integration sleep for a minimum of 60 seconds when this error is encountered, and then subsequently retry the request.

Alternatively, you might choose to implement exponential backoff (an error handling strategy whereby you periodically retry a failed request with progressively longer wait times between retries, until either the request succeeds or the certain number of retry attempts is reached). Note that the SDKs implement this behavior.

Avoid Executing "Rapid Fire" Updates

If the only thing your integration does is execute an Update Rows request once every second for the same sheet, that would only amount to a total of 60 requests per minute -- well within rate limiting guidelines. However, updating the same object in such rapid succession could result in save errors that negatively impact both your integration as well as user experience within the Smartsheet app. To avoid this scenario, design your integration such that API requests are never executed with rapid-fire succession against the same Smartsheet object. For maximum efficiency, consider batching up changes and submitting them in a single request using a bulk operation (for example, Update Rows or Add Columns.

Execute Requests Serially

Executing multiple API requests in parallel to update a specific Smartsheet object results in reduced performance and often results in errors due to save collisions. To avoid this scenario, design your integration such that API requests to update a specific Smartsheet object are always executed serially (that is, execute one request at time, not beginning the next request until the previous request has completed).

NOTE: Attempts to perform multiple concurrent updates to a sheet may result in error code 4004.

Use the Smartsheet SDKs

The SDKs provide default backoff and retry to accommodate rate limiting responses from the API. Note that the default maximum retry duration is typically 30 seconds. You may wish to increase this if your application is making many API calls in quick succession. For specific instructions per language, see the Readme for the respective SDK.

Authentication

Operations

List Contacts
List Events
Delete Multiple Favorites
Get Favorites
Add Favorites
Update Folder
Import Sheet into Folder
Create Sheet in Folder
List Contents
List Org Groups
Add Group Members
Update Group
Add Group
List Folders in Home
Create Folder
List Image URLs
Get Reports
Send report via email
Gets a Report's publish settings
Set a Report's publish status
List Report Shares
Search Everything
Gets application constants.
List Sheets
Import Sheet from CSV / XLSX
Create Sheet in "Sheets" Folder
Attach File or URL to Sheet
List All Automation Rules
List Cross-sheet References
Create Cross-sheet References
Send Sheet via Email
Get Sheet Publish Status
Set Sheet Publish Status
Update Sheet
Copy Rows to Another Sheet
Move Rows to Another Sheet
List Sent Update Requests
List Sheet Shares
Sort Rows in Sheet
Update Summary Fields
Get Sheet Summary
Create an Update Request
Get Sheet Version
List Dashboards
Delete Dashboard
Get Dashboard
Get Dashboard Publish Status
Set Dashboard Publish Status
Update Dashboard
List Dashboard Shares
List User-Created Templates
List Public Templates
Revoke Access Token
Gets or Refreshes an Access Token
List Users
Get Current User
Add User
List Org Sheets
List Alternate Emails
Update User Profile Image
Update User
List Webhooks
Create Webhook
Update Webhook
List Workspaces
Create Workspace
List Workspace Shares
Import Sheet into Workspace
Create Sheet in Workspace