Spreadsheets

Append rows

Adds rows after the last populated row of a range, which is what a log or an export needs.

POST /v1/spreadsheets/:id/values/:range/append

Permission

The key must be granted sheets.values.write

A key without it gets 403 insufficient_scope, with the missing permission named in details.

Rows land after the last populated row of the range's own columns, not of the sheet, so an unrelated note in column Z does not push your table down. This is the call a log or a nightly export wants: it needs no read first, and two appends cannot overwrite each other.

Path parameters

Field Type Description
id required string The spreadsheet to append to.
range required A1 range The table to append to. Its columns decide where the new rows go.

Request body

One array per row. Appending three rows is one call, not three.

Field Type Description
values required array[][] Rows, each an array of cells. A cell is a string, a number or a boolean; a formula is a string beginning with =. An empty string DELETES a cell rather than storing a blank, because a stored blank would keep it inside the sheet's used extent and widen every unbounded range from then on.

Request

curl https://api.veruapis.com/v1/spreadsheets/:id/values/:range/append \
  -X POST \
  -H "Authorization: Bearer vak_live_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "values": [["2026-09-09", "North", 1200]]
}'

Idempotency-Key is required on every write. Retrying with the same key returns the original response rather than repeating the operation, so a timeout is something you retry rather than something you investigate.

Response

Field Type Description
range A1 range Where the rows landed.
state string The document's state after the write. Send it as If-Match on a structural change, or compare it with your last one to notice somebody else's edit.
changed boolean False when the write stored nothing new — writing a cell the value it already holds. Not an error and not worth retrying: no new state was produced and no collaborator was notified.
{
  "data": { "range": "Sheet1!A14:C14", "state": "c3d4e5f6a7b8c9d0", "changed": true },
  "meta": { "request_id": "req_01j8z9...", "timestamp": "2026-09-02T10:00:00Z" }
}
Worth knowing

Appends after the last populated row of the range's own columns, not of the sheet, so an unrelated note in column Z does not push your table down. This is the endpoint a log or a nightly export wants.

Errors

Every failure uses the same shape, with a stable string code you can branch on. See the error reference.

Related

POST /v1/spreadsheets/:id/values/:range/append

id
range
Sends this body to your own workspace, for real. Edit it before running.