List the sheets in a spreadsheet
Returns every sheet (tab) with its populated extent and merges, plus the workbook's named ranges, charts and validation. Read it first: it is where the sheet names and ids an A1 range needs come from.
Permission
The key must be granted sheets.values.read
A key without it gets 403 insufficient_scope, with the missing permission named in details.
This is how you list the sheets in a workbook: there is no separate call for tabs. Read it first to learn the sheet names and ids an A1 range needs, and the populated extent so you know where the data ends.
Path parameters
| Field | Type | Description |
|---|---|---|
id required |
string | The spreadsheet to describe. |
Request
curl https://api.veruapis.com/v1/spreadsheets/:id \
-H "Authorization: Bearer vak_live_..."
Response
| Field | Type | Description |
|---|---|---|
document_id |
string | |
sheets |
object[] | Every sheet (tab) in the workbook, in tab order. Its fields are below. |
Each item in sheets
| Field | Type | Description |
|---|---|---|
id |
string | Accepted anywhere a sheet name is, and stable when the tab is renamed. |
name |
string | The tab's name as it appears in the app. Use it as the prefix in an A1 range: 'Q1 2026'!A1:D20. |
index |
integer | Position among the tabs, from 0. |
max_row |
integer | The last populated row, zero-based. An empty sheet reports 0. |
max_column |
integer | The last populated column, zero-based. |
range |
A1 range | The populated extent, which is what an unbounded range like A:A is clamped to. |
merges |
object[] | Merged rectangles, zero-based and inclusive at both corners. Its fields are below. |
Each item in merges
| Field | Type | Description |
|---|---|---|
id |
string | |
c0 |
integer | First column. |
r0 |
integer | First row. |
c1 |
integer | Last column, inclusive. |
r1 |
integer | Last row, inclusive. |
{
"data": {
"document_id": "0199a1c2-6f3e-7a41-b8d2-5e9f0c3a7b41",
"sheets": [
{
"id": "s0199a1c2-6f3e-7a41-b8d2-5e9f0c3a7b42",
"name": "Sheet1",
"index": 0,
"max_row": 19,
"max_column": 3,
"range": "A1:D20",
"merges": [{ "id": "m0199a1c2...", "c0": 0, "r0": 0, "c1": 1, "r1": 1 }]
}
]
},
"meta": { "request_id": "req_01j8z9...", "timestamp": "2026-09-02T10:00:00Z" }
}
The workbook's shape, not its contents. max_row and max_column are the populated extent, which is what an unbounded range like A:A is clamped to.
Every failure uses the same shape, with a stable string code you can branch on. See the error reference.
Related
- POST Append rows
- POST Read several ranges
- POST Change a spreadsheet's structure
- POST Write several ranges
- POST Clear a range
- GET Get the current state
- GET Read a range
- PUT Write a range