CONNECT APP
Build with Smartsheet
Productivity
- OAuth
MCP
Give your agent Smartsheet tools
Every Smartsheet action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Smartsheet account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "smartsheet",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Add Column:
const result = await mcp.callTool({
name: "smartsheet-add-column",
arguments: {
sheetId: "Sheet ID or URL",
title: "Column Title",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "smartsheet",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Add Column:
result = await session.call_tool("smartsheet-add-column", {
"sheetId": "Sheet ID or URL",
"title": "Column Title",
})API PROXY
Call the Smartsheet API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Smartsheet API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://api.smartsheet.com/2.0/users/me",
})
// Any allowed Smartsheet endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://api.smartsheet.com/2.0/users/me
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcGkuc21hcnRzaGVldC5jb20vMi4wL3VzZXJzL21l?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Smartsheet actions from your backend
Connect a user's Smartsheet account once, then run Add Column on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "smartsheet-add-column",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
smartsheet: { authProvisionId: "apn_xxxxxxx" },
sheetId: "Sheet ID or URL",
title: "Column Title",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="smartsheet-add-column",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"smartsheet": {"authProvisionId": "apn_xxxxxxx"},
"sheetId": "Sheet ID or URL",
"title": "Column Title",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "smartsheet-add-column",
"configured_props": {
"smartsheet": { "authProvisionId": "apn_xxxxxxx" },
"sheetId": "Sheet ID or URL",
"title": "Column Title"
}
}'TOOLS
Smartsheet actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Add Column
actionAdd a single column to an existing sheet, at the end or at a chosen position. Returns the created column underresult, including its ID. Use List Columns to see the existing columns and their positions first. To change a column that already exists, use Update Column. See the documentationWritev1.0.1 -
Add Comment
actionAdds a comment to an existing discussion on a Smartsheet sheet (POST /sheets/{sheetId}/discussions/{discussionId}/comments). Use List Discussions to find a Discussion ID. See the documentation.Writev0.0.1 -
Add Row to Sheet
actionAdd one or more rows to a sheet, addressing cells by column NAME rather than column ID. Returns the created rows underresult, each with its new row ID. Call Get Sheet or List Columns first to learn the column names. To change rows that already exist, use Update Row. See the documentationWritev1.1.1 -
Copy Rows
actionCopy rows from one sheet to another. The rows stay in the source sheet and are duplicated in the destination. Cell values and formatting always come across; attachments and comments only if you ask for them via Include. Columns the destination sheet is missing are created automatically, so it does not have to match the source first. ReturnsrowMappingspairing each source row ID with its new ID in the destination. To move rows instead, removing them from the source, use Move Rows. See the documentationWritev0.1.1 -
Copy Sheet
actionCopy an existing sheet to a new location. Creates a complete duplicate including all rows, columns, formatting, and attachments. Specify a destination workspace or folder, or omit both to copy to the user's home (Sheets folder). Returns the new sheet's ID and permalink. Use List Sheets to find the source sheet ID. To move a sheet instead (removing it from the original location), use Move Sheet. See the documentationWritev0.1.1 -
Create Discussion
actionCreates a discussion on a Smartsheet sheet. If a Row ID is provided the discussion is attached to that row (POST /sheets/{sheetId}/rows/{rowId}/discussions); otherwise it is created at the sheet level (POST /sheets/{sheetId}/discussions). Use List Sheets to find a Sheet ID, and Get Sheet or Search to find a Row ID. The discussion title is auto-generated by Smartsheet from the first 100 characters of the initial comment and cannot be set directly. See the documentation.Writev0.0.1 -
Create Sheet
actionCreate a new blank sheet with its column schema defined up front, inside a workspace or a folder. Returns the new sheet underresult, including its ID and permalink. To create a sheet from an existing template instead of defining columns, use New Sheet From Template. To load a sheet from a CSV or XLSX file, use Import Sheet. See the documentationWritev1.0.1 -
Delete Column
actionPermanently delete a column from a sheet. WARNING: This is irreversible - all cell data in the column is permanently destroyed. Use List Columns to find the column ID before deleting. Consider using Get Sheet to review the column's data before deletion. See the documentationWritev0.1.1 -
Delete Comment
actionPermanently deletes a comment from a Smartsheet sheet (DELETE /sheets/{sheetId}/comments/{commentId}). This action is irreversible. Use Get Discussion to find a Comment ID. Example:{sheetId: "1234567890123456", commentId: "4068136276365188"}deletes that comment and returns a confirmation. See the documentation.Writev0.0.1 -
Delete Discussion
actionPermanently deletes a discussion (and its comments) from a Smartsheet sheet. This action is irreversible. Use List Discussions to find a Discussion ID. Example:{sheetId: "1234567890123456", discussionId: "3728427551461252"}deletes that discussion (and all its comments) and returns a confirmation. See the documentation.Writev0.0.1 -
Delete Rows
actionDelete one or more rows from a sheet by row ID. This is permanent and cannot be undone. Use Get Sheet or Search to find row IDs first. See the documentationWritev0.1.0 -
Delete Sheet
actionPermanently delete a sheet. This is irreversible - all data, rows, and columns are destroyed. Use List Sheets to find the sheet ID first. See the documentationWritev0.1.1 -
Email Sheet
actionSend a sheet as an email attachment to one or more recipients. The sheet can be sent as PDF, Excel, or PDF Gantt format. Use List Sheets to find the sheet ID. See the documentationWritev0.1.1 -
Get Comment
actionRetrieves a single comment from a Smartsheet sheet (GET /sheets/{sheetId}/comments/{commentId}), returning fields such as text, createdAt, and createdBy. Use List Discussions or Get Discussion to find a Comment ID. Example:{sheetId: "1234567890123456", commentId: "4068136276365188"}returns{"text": "Security team has been notified", "createdBy": {"name": "..."}, "createdAt": "..."}. See the documentation.Read-onlyv0.0.1 -
Get Current User
actionGet the authenticated user's identity - returns user ID, email, first/last name, and account details. Use this when the user says 'my sheets' or 'my account' to identify the owner. See the documentationRead-onlyv0.0.4 -
Get Discussion
actionRetrieves a single discussion from a Smartsheet sheet, including its embedded comments array (requested viainclude=comments). Use List Discussions to find a Discussion ID. Example:{sheetId: "1234567890123456", discussionId: "3728427551461252"}returns{"title": "Velociraptor containment breach", "comments": [{"id": ..., "text": "..."}]}. See the documentation.Read-onlyv0.0.1 -
Get Row
actionRetrieve a single row from a sheet by row ID, with cell values keyed by column name instead of column ID. Returns a human-readable object like{"Species": "Velociraptor", "Status": "Monitoring"}plus row metadata. When a cell has a displayValue (formatted date, contact name), that is returned instead of the raw value. Use Get Sheet or Search to find row IDs. To update a row after reading it, use Update Row. See the documentationRead-onlyv0.1.1 -
Get Sheet
actionGet a sheet's full structure: column definitions (name, type, options, ID), all rows with cell values, and sheet metadata. This is the primary schema discovery tool - call it BEFORE Add Row to Sheet or Update Row to learn column names, types, and IDs. Returns rows with cell values keyed by column name for readability. For a lightweight column-only view, use List Columns instead. See the documentationRead-onlyv1.0.1 -
Import Sheet
actionImport a CSV or XLSX file as a brand new Smartsheet sheet inside a workspace or a folder. Returns the new sheet underresult, including its ID and permalink. To create a sheet by defining columns yourself instead, use Create Sheet. See the documentationWritev0.0.4 -
List Columns
actionList all columns in a sheet, returning each column's ID, title, type, options (for PICKLIST/CONTACT_LIST), validation, and position index. This is lighter-weight than Get Sheet when you only need the column schema and not row data. Use this before Add Row to Sheet or Update Row to discover column names and types. For full sheet data including rows, use Get Sheet instead. See the documentationRead-onlyv0.1.1 -
List Discussions
actionLists discussions on a Smartsheet sheet (GET /sheets/{sheetId}/discussions). If a Row ID is supplied, lists discussions scoped to that row instead (GET /sheets/{sheetId}/rows/{rowId}/discussions), since the sheet-level endpoint does not accept a row filter. Supports pagination and optional inclusion of comments/attachments. The response includespageNumberandtotalPages— to fetch more, call again withpageincremented by 1 whilepageNumberis less thantotalPages. Requesting a page beyondtotalPagesreturns the last page again rather than an empty result, so do not use a shorter or empty page as a stop signal. Passfields(comma-separated, e.g.id,title,commentCount) to get back only those top-level fields per discussion instead of the full object — useful when you just need titles/counts, not full comment threads. Use List Sheets to find a Sheet ID. Example:{sheetId: "1234567890123456", include: ["comments"]}returns discussions with their full comment threads embedded. See the documentation.Read-onlyv0.0.1 -
List Folder Options
actionRetrieves{ label, value }pairs for populating a Folder dropdown, for one workspace. This is a form helper, not a Smartsheet capability: it returns only folder names and IDs. Requires a Workspace ID - use List Workspace Options to find one first. Use the folder IDs it returns with Create Sheet, Import Sheet, Copy Sheet or Move Sheet. See the documentationRead-onlyv1.1.2 -
List Sheet Options
actionRetrieves a single page of label/value pairs used to populate a Sheet dropdown field. This is a form helper, not a Smartsheet capability: it returns only names and IDs, one page at a time. Prefer List Sheets, which returns the same sheets with full metadata (owner, permalink, modified date) and can fetch them all at once, or Search to find a sheet by name. See the documentationRead-onlyv0.0.5 -
List Sheets
actionList all sheets the authenticated user can access, with name, ID, creation/modification dates, owner, and permalink. Always returns the complete list in a single call (no pagination to manage). Use this to find sheet IDs before calling Get Sheet, Add Row to Sheet, Update Row, Delete Rows, Copy Sheet, or Move Sheet. To search sheets by content rather than listing them, use Search instead. Example:{modifiedSince: "2024-01-01T00:00:00Z"}returns only sheets modified since that date, e.g.{"data": [{"id": "1234567890123456", "name": "Jurassic Park Operations", ...}]}. See the documentationRead-onlyv1.0.0 -
List Template ID Options
actionRetrieves{ label, value }pairs for populating a Template dropdown, across every workspace. This is a form helper, not a Smartsheet capability: each label istemplate name (workspace name)and each value is the template ID. Prefer List Workspace Templates, which returns the same templates with their workspace context. Note this walks every workspace's children, so it is slow on large accounts, and a workspace that fails to traverse is skipped rather than failing the call - a successful response can be incomplete. See the documentationRead-onlyv0.0.5 -
List Workspace Options
actionRetrieves{ label, value }pairs for populating a Workspace dropdown, following token-based pagination to the end. This is a form helper, not a Smartsheet capability: it returns only workspace names and IDs. Use the workspace IDs it returns with Create Sheet, Import Sheet, Copy Sheet, Move Sheet, or with List Folder Options to drill into a workspace's folders. See the documentationRead-onlyv0.1.1 -
List Workspace Templates
actionLists the templates available across your workspaces, returning each template ID, name, and workspace. Use this to find a template ID for New Sheet From Template. When no workspace is set, a workspace that fails to traverse is skipped rather than failing the call, so a successful response can be incomplete. See the documentationRead-onlyv0.0.5 -
Move Rows
actionMove rows from one sheet to another. WARNING: the rows are permanently removed from the source sheet. Cell values and formatting always come across; attachments and comments only if you ask for them via Include. Columns the destination sheet is missing are created automatically, so it does not have to match the source first. ReturnsrowMappingspairing each source row ID with its new ID in the destination. To keep the originals, use Copy Rows. See the documentationWritev0.1.1 -
Move Sheet
actionMove a sheet to a different workspace, folder, or home. The sheet is removed from its current location. Use List Sheets to find the sheet ID. To copy a sheet instead (keeping the original), use Copy Sheet. See the documentationWritev0.1.1 -
New Sheet From Template
actionCreates a new sheet from a template. Requires either a workspace or folder destination. Use List Workspace Templates to find template IDs. Use List Workspace Options to find workspace IDs. Use List Folder Options to find folder IDs. See the documentation: Create in folder, Create in workspaceWritev2.0.1 -
Search
actionFull-text search across everything the account can see, or within a single sheet. This is the fastest way to find a sheet by name: results include whole objects, not just cell contents - each result carries anobjectTypeofsheet,row,folder,workspace,report,template,attachment,discussion,sightorsummaryField, and itsobjectIdis that object's ID. So a result withobjectType: "sheet"gives you the sheet ID directly in one call. Prefer this over List Sheets when you know part of a name; use List Sheets to enumerate everything or when you need each sheet's permalink. Searching by a sheet URL does not work - the URL token is not indexed text; pass the URL to Get Sheet instead, which resolves it for you. See the documentationRead-onlyv0.1.0 -
Update Column
actionUpdate a column's title, type, or position in a sheet. Use List Columns to find the column ID and current properties before updating. Note: some type conversions may cause data loss. See the documentationWritev0.1.1 -
Update Comment
actionUpdates the text of an existing comment on a Smartsheet sheet (PUT /sheets/{sheetId}/comments/{commentId}). Use Get Discussion to find a Comment ID. See the documentation.Writev0.0.1 -
Update Row
actionUpdate one or more rows in a sheet by row ID, addressing cells by column NAME rather than column ID. Returns the updated rows underresult. Call Get Sheet to find row IDs and column names first. To add new rows instead of changing existing ones, use Add Row to Sheet. See the documentationWritev1.1.2 -
Update Sheet
actionRename an existing sheet, leaving its rows, columns, attachments, and sharing untouched. Only the properties you supply are changed, and at least one must be supplied. Returns the updated sheet underresult. To change a sheet's location instead, use Move Sheet; to change its columns, use Update Column. Use Search or List Sheets to find the sheet ID first. See the documentationWritev0.1.1
EVENTS
Smartsheet triggers
Event sources your backend can deploy for users and receive through a webhook.
-
New Comment Added (Instant)
triggerEmit new event when a comment is added in a sheet.Instantv0.0.6 -
New Row Added (Instant)
triggerEmit new event when a row is added to a sheet.Instantv0.0.6 -
New Row Deleted (Instant)
triggerEmit new event when a row is deleted from a sheet.Instantv0.0.5 -
New Row Updated (Instant)
triggerEmit new event when a row is updated in a sheet.Instantv0.0.7
MULTI-APP
Use Smartsheet with other popular apps
Most products don't stop at one integration. Pair Smartsheet with the other apps your users rely on, and ship use cases that span both.
- App slug
- smartsheet
- Authentication
- OAuth
- Categories
- Productivity
- Actions
- 35
- Triggers
- 4
- API proxy
- Available
OAuth scopes
These are the scopes Pipedream's managed Smartsheet OAuth client requests when one of your users connects an account. Supply your own OAuth client to request a different set.
- ADMIN_SHEETS
- ADMIN_SIGHTS
- ADMIN_USERS
- ADMIN_WEBHOOKS
- ADMIN_WORKSPACES
- CREATE_SHEETS
- CREATE_SIGHTS
- DELETE_SHEETS
- DELETE_SIGHTS
- READ_CONTACTS
- READ_SHEETS
- READ_SIGHTS
- READ_USERS
- SHARE_SHEETS
- SHARE_SIGHTS
- WRITE_SHEETS