Update sheet content#

Deprecated

This endpoint is deprecated and may be removed in a future release.

This endpoint was deprecated on 2026-02-12.

It is scheduled for sunset on 2029-01-31.

Description#

Asynchronously submits a SheetUpdate to a sheet. Each SheetUpdate can have only one update field set per request.

Understanding “one update field per request”: This means each request body can include only one top-level field from the SheetUpdate object — for example, applyFormats or editCells, but not both in the same request. It does not mean you can only perform one operation per request. The value inside each top-level field is an array that can contain many operations, all executed in a single API call.

Wrong approach — sending one request per format, per range:
Request 1: applyFormats bold header row
Request 2: applyFormats currency format column B
Request 3: applyFormats currency format column C
...
Request 40: applyBorders border under totals

Right approach — batch everything into the array:
Request 1: applyFormats formats: [ bold header, currency col B-K, shading rows 2/4/6/... ]
Request 2: applyBorders borders: [ bottom border on totals row ]

Two requests instead of 40+. The formats array and borders array each accept multiple objects, and each object can target multiple ranges.

Note: This endpoint is rate-limited to as low as 60 requests per minute, shared across your entire workspace. Every unnecessary request counts against that limit for all users and integrations in the workspace. Always batch operations into arrays rather than sending one-operation-per-request. When you encounter a 429, examine the Retry-After header and retry after that many seconds.

Refer to the Spreadsheet Data Guide for comprehensive guidance on this functionality.

POST /platform/v1/spreadsheets/{spreadsheetId}/sheets/{sheetId}/update

Required OAuth Scopes

file:write

Parameters#

Parameter

In

Type

Required

Description

X-Version

header

string

false

Version of the API (2022-01-01)

spreadsheetId

path

string

true

The unique identifier of the spreadsheet

sheetId

path

string

true

The unique identifier of the sheet

body

body

SheetUpdate

true

A SheetUpdate

Body parameter example#

{
  "applyBorders": {
    "borders": [
      {
        "bottom": {
          "color": "#000000",
          "style": "SINGLE",
          "weight": 2
        },
        "innerHorizontal": {
          "color": "#808080",
          "style": "DASHED1",
          "weight": 1
        },
        "innerVertical": {
          "color": "#808080",
          "style": "DASHED1",
          "weight": 1
        },
        "left": {
          "color": "#000000",
          "style": "SINGLE",
          "weight": 2
        },
        "ranges": [
          {
            "startColumn": 0,
            "startRow": 0,
            "stopColumn": 3,
            "stopRow": 3
          }
        ],
        "right": {
          "color": "#000000",
          "style": "SINGLE",
          "weight": 2
        },
        "top": {
          "color": "#000000",
          "style": "SINGLE",
          "weight": 2
        }
      }
    ]
  },
  "applyFormats": {
    "formats": [
      {
        "cellFormat": {
          "backgroundColor": "#d0e0f0"
        },
        "ranges": [
          {
            "startColumn": 0,
            "startRow": 0,
            "stopColumn": null,
            "stopRow": 0
          }
        ],
        "textFormat": {
          "bold": true
        },
        "valueFormat": {
          "valueFormatType": "TEXT"
        }
      }
    ]
  },
  "clearBorders": {
    "ranges": [
      {
        "startColumn": 0,
        "startRow": 0,
        "stopColumn": 3,
        "stopRow": 3
      }
    ]
  },
  "clearFormats": {
    "cellFormatFields": [
      "*"
    ],
    "ranges": [
      {
        "startColumn": 0,
        "startRow": 0,
        "stopColumn": null,
        "stopRow": 0
      }
    ],
    "textFormatFields": [
      "*"
    ],
    "valueFormatFields": [
      "*"
    ]
  },
  "deleteColumns": {
    "force": true,
    "intervals": [
      {
        "end": 3,
        "start": 2
      }
    ]
  },
  "deleteRows": {
    "force": true,
    "intervals": [
      {
        "end": 7,
        "start": 5
      }
    ]
  },
  "editCells": {
    "cells": [
      {
        "column": 0,
        "row": 0,
        "value": "Alpha One"
      },
      {
        "column": 1,
        "row": 0,
        "value": "Bravo One"
      },
      {
        "column": 0,
        "row": 1,
        "value": "Alpha Two"
      },
      {
        "column": 1,
        "row": 1,
        "value": "Bravo Two"
      }
    ]
  },
  "editRange": {
    "range": {
      "startColumn": 0,
      "startRow": 0,
      "stopColumn": 1,
      "stopRow": 1
    },
    "values": [
      [
        "Alpha One",
        "Bravo One"
      ],
      [
        "Alpha Two",
        "Bravo Two"
      ]
    ]
  },
  "hideColumns": {
    "force": true,
    "intervals": [
      {
        "end": 5,
        "start": 4
      }
    ]
  },
  "hideRows": {
    "force": true,
    "intervals": [
      {
        "end": 9,
        "start": 7
      }
    ]
  },
  "insertColumns": {
    "inheritFrom": "BEFORE",
    "insertions": [
      {
        "count": 1,
        "index": 3
      }
    ]
  },
  "insertRows": {
    "inheritFrom": "BEFORE",
    "insertions": [
      {
        "count": 2,
        "index": 6
      }
    ]
  },
  "mergeRanges": {
    "force": true,
    "mergeType": "HORIZONTAL",
    "ranges": [
      {
        "startColumn": 0,
        "startRow": 4,
        "stopColumn": 1,
        "stopRow": 7
      }
    ]
  },
  "resizeColumns": {
    "resizeIntervals": [
      {
        "intervals": [
          {
            "end": 3,
            "start": 0
          }
        ],
        "size": 96
      }
    ]
  },
  "resizeColumnsToFit": {
    "intervals": [
      {
        "end": 3,
        "start": 0
      }
    ]
  },
  "resizeRows": {
    "resizeIntervals": [
      {
        "intervals": [
          {
            "end": 3,
            "start": 0
          }
        ],
        "size": 24
      }
    ]
  },
  "resizeRowsToFit": {
    "intervals": [
      {
        "end": 3,
        "start": 0
      }
    ]
  },
  "unhideColumns": {
    "intervals": [
      {
        "end": 5,
        "start": 4
      }
    ]
  },
  "unhideRows": {
    "intervals": [
      {
        "end": 9,
        "start": 7
      }
    ]
  },
  "unmergeRanges": {
    "ranges": [
      {
        "startColumn": 0,
        "startRow": 4,
        "stopColumn": 1,
        "stopRow": 7
      }
    ]
  }
}

Code Samples#

curl -X POST https://api.app.wdesk.com/platform/v1/spreadsheets/{spreadsheetId}/sheets/{sheetId}/update \
    -H 'Content-Type: application/json' \
    -H 'Accept: application/json' \
    -H 'Authorization: Bearer {access-token}' \
    -H 'X-Version: 2022-01-01'
http POST https://api.app.wdesk.com/platform/v1/spreadsheets/{spreadsheetId}/sheets/{sheetId}/update \
    X-Version:2022-01-01 \
    Content-Type:application/json \
    Accept:application/json \
    Authorization:"Bearer {access-token}"
wget --method=POST "https://api.app.wdesk.com/platform/v1/spreadsheets/{spreadsheetId}/sheets/{sheetId}/update" \
    --output-document -  \ 
    --header 'Content-Type: application/json' \ 
    --header 'Accept: application/json' \ 
    --header 'Authorization: Bearer {access-token}' \
    --header 'X-Version: 2022-01-01'
import requests

headers = {
  'X-Version': '2022-01-01',
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'Authorization': 'Bearer {access-token}'
}

r = requests.post('https://api.app.wdesk.com/platform/v1/spreadsheets/{spreadsheetId}/sheets/{sheetId}/update', headers = headers)

print(r.headers['Location'])

Returns#

202 - Accepted#

Header

Description

Location

The location to poll for the operation result.

Retry-After

The number of seconds to wait before polling for a result and between polling attempts.

400 - Bad Request#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

401 - Unauthorized#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

403 - Forbidden#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

404 - Not Found#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

409 - Conflict#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

429 - Too Many Requests#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

500 - Internal Server Error#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

503 - Service Unavailable#

Error response that indicates that the service is not able to process the incoming request. The reason is provided in the error message.

Example Responses#

{
  "code": "400BadRequest",
  "message": "The request was unacceptable, often due to a missing or invalid parameter"
}
{
  "code": "401Unauthorized",
  "message": "No valid API token provided"
}
{
  "code": "403Forbidden",
  "message": "The API token does not have permissions to perform the request"
}
{
  "code": "404NotFound",
  "message": "The requested resource could not be found"
}
{
  "code": "409Conflict",
  "message": "The request conflicts with another request"
}
{
  "code": "429TooManyRequests",
  "message": "Too many requests have been made against the API in too short a time"
}
{
  "code": "500InternalServerError",
  "message": "The server encountered an unexpected condition that prevented it from fulfilling the request"
}
{
  "code": "503ServiceUnavailable",
  "message": "The server cannot handle the request due to a temporary overload or scheduled maintenance"
}