{"openapi":"3.1.0","info":{"title":"Ferrule Google Sheets API","version":"1.0.0","description":"REST API for Google Sheets via the Ferrule gateway.","contact":{"name":"Ferrule","url":"https://ferrule.io"}},"servers":[{"url":"https://0.0.0.0:3000","description":"Ferrule gateway"}],"paths":{"/api/v1/google-sheets/spreadsheets/{spreadsheetId}":{"get":{"operationId":"google-sheets.get_spreadsheet","description":"Get metadata for a spreadsheet including its sheets, properties, and URL. Use this to discover sheet names and IDs before reading or writing data.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to retrieve."},"required":true,"description":"The ID of the spreadsheet to retrieve."},{"in":"query","name":"includeGridData","schema":{"description":"Whether to include grid data (cell values). Default false. Use get_values for reading cell data instead.","type":"boolean"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/values":{"get":{"operationId":"google-sheets.get_values","description":"Read cell values from a range in a spreadsheet. Use A1 notation for the range (e.g. 'Sheet1!A1:D10', 'Sheet1', 'A1:B5'). Returns a 2D array of cell values.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to read from."},"required":true,"description":"The ID of the spreadsheet to read from."},{"in":"query","name":"range","schema":{"type":"string","description":"The A1 notation range to read (e.g. 'Sheet1!A1:D10', 'Sheet1', 'A:A')."}},{"in":"query","name":"majorDimension","schema":{"description":"The major dimension of the values: 'ROWS' (default) or 'COLUMNS'.","type":"string"}},{"in":"query","name":"valueRenderOption","schema":{"description":"How values should be rendered: 'FORMATTED_VALUE' (default), 'UNFORMATTED_VALUE', or 'FORMULA'.","type":"string"}},{"in":"query","name":"dateTimeRenderOption","schema":{"description":"How dates should be rendered: 'SERIAL_NUMBER' or 'FORMATTED_STRING' (default).","type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}},"patch":{"operationId":"google-sheets.update_values","description":"Write cell values to a range in a spreadsheet. Overwrites existing data in the specified range. Use A1 notation for the range.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to write to."},"required":true,"description":"The ID of the spreadsheet to write to."},{"in":"query","name":"range","schema":{"type":"string","description":"The A1 notation range to write to (e.g. 'Sheet1!A1:D10')."}},{"in":"query","name":"values","schema":{"type":"array","items":{"type":"array","items":{}},"description":"2D array of values to write. Each inner array is a row (e.g. [['Name', 'Age'], ['Alice', 30]])."}},{"in":"query","name":"valueInputOption","schema":{"description":"How input values should be interpreted: 'RAW' or 'USER_ENTERED' (default). USER_ENTERED parses formulas and formats.","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/values/batch-get":{"post":{"operationId":"google-sheets.batch_get_values","description":"Read cell values from multiple ranges in a spreadsheet in a single request. More efficient than multiple get_values calls.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to read from."},"required":true,"description":"The ID of the spreadsheet to read from."},{"in":"query","name":"ranges","schema":{"type":"array","items":{"type":"string"},"description":"Array of A1 notation ranges to read (e.g. ['Sheet1!A1:D10', 'Sheet2!A1:B5'])."}},{"in":"query","name":"majorDimension","schema":{"description":"The major dimension of the values: 'ROWS' (default) or 'COLUMNS'.","type":"string"}},{"in":"query","name":"valueRenderOption","schema":{"description":"How values should be rendered: 'FORMATTED_VALUE' (default), 'UNFORMATTED_VALUE', or 'FORMULA'.","type":"string"}},{"in":"query","name":"dateTimeRenderOption","schema":{"description":"How dates should be rendered: 'SERIAL_NUMBER' or 'FORMATTED_STRING' (default).","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/values/batch-update":{"post":{"operationId":"google-sheets.batch_update_values","description":"Write cell values to multiple ranges in a spreadsheet in a single request. More efficient than multiple update_values calls.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to write to."},"required":true,"description":"The ID of the spreadsheet to write to."},{"in":"query","name":"data","schema":{"type":"array","items":{"type":"object","properties":{"range":{"type":"string","description":"The A1 notation range to write to."},"values":{"type":"array","items":{"type":"array","items":{}},"description":"2D array of values to write."}},"required":["range","values"]},"description":"Array of range-value pairs to write."}},{"in":"query","name":"valueInputOption","schema":{"description":"How input values should be interpreted: 'RAW' or 'USER_ENTERED' (default).","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/values/append":{"post":{"operationId":"google-sheets.append_values","description":"Append rows of data after the last row with content in a range. Useful for adding new rows to a table without overwriting existing data.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to append to."},"required":true,"description":"The ID of the spreadsheet to append to."},{"in":"query","name":"range","schema":{"type":"string","description":"The A1 notation of the table range to append to (e.g. 'Sheet1!A:E'). Data is appended after the last row with content."}},{"in":"query","name":"values","schema":{"type":"array","items":{"type":"array","items":{}},"description":"2D array of values to append. Each inner array is a row (e.g. [['Alice', 30], ['Bob', 25]])."}},{"in":"query","name":"valueInputOption","schema":{"description":"How input values should be interpreted: 'RAW' or 'USER_ENTERED' (default).","type":"string"}},{"in":"query","name":"insertDataOption","schema":{"description":"How the data should be inserted: 'OVERWRITE' or 'INSERT_ROWS' (default). INSERT_ROWS adds new rows for the data.","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/values/clear":{"post":{"operationId":"google-sheets.clear_values","description":"Clear all values from a range in a spreadsheet. Only clears values, not formatting or other properties.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to clear values from."},"required":true,"description":"The ID of the spreadsheet to clear values from."},{"in":"query","name":"range","schema":{"type":"string","description":"The A1 notation range to clear (e.g. 'Sheet1!A1:D10', 'Sheet1')."}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/values/batch-clear":{"post":{"operationId":"google-sheets.batch_clear_values","description":"Clear values from multiple ranges in a spreadsheet in a single request. More efficient than multiple clear_values calls.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to clear values from."},"required":true,"description":"The ID of the spreadsheet to clear values from."},{"in":"query","name":"ranges","schema":{"type":"array","items":{"type":"string"},"description":"Array of A1 notation ranges to clear (e.g. ['Sheet1!A1:D10', 'Sheet2!A1:B5'])."}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets":{"post":{"operationId":"google-sheets.create_spreadsheet","description":"Create a new Google Sheets spreadsheet. Optionally specify a title and initial sheet names.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"query","name":"title","schema":{"description":"The title for the new spreadsheet (default 'Untitled').","type":"string"}},{"in":"query","name":"sheetTitles","schema":{"description":"Optional array of sheet names to create (e.g. ['Data', 'Summary']). If omitted, a single default sheet is created.","type":"array","items":{"type":"string"}}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/sheets":{"post":{"operationId":"google-sheets.add_sheet","description":"Add a new sheet (tab) to an existing spreadsheet. Returns the properties of the newly created sheet.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to add a sheet to."},"required":true,"description":"The ID of the spreadsheet to add a sheet to."},{"in":"query","name":"title","schema":{"type":"string","description":"The title for the new sheet."}},{"in":"query","name":"index","schema":{"description":"The zero-based index where the sheet should be inserted. If omitted, the sheet is added at the end.","type":"number"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}},"delete":{"operationId":"google-sheets.delete_sheet","description":"Delete a sheet (tab) from a spreadsheet by its sheet ID. Use get_spreadsheet to find sheet IDs first.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to delete a sheet from."},"required":true,"description":"The ID of the spreadsheet to delete a sheet from."},{"in":"query","name":"sheetId","schema":{"type":"number","description":"The numeric ID of the sheet to delete (not the sheet name). Use get_spreadsheet to find sheet IDs."}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/sheets/copy":{"post":{"operationId":"google-sheets.copy_sheet_to","description":"Copy a sheet from one spreadsheet to another. Returns the properties of the newly created sheet in the destination spreadsheet.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the source spreadsheet containing the sheet."},"required":true,"description":"The ID of the source spreadsheet containing the sheet."},{"in":"query","name":"sheetId","schema":{"type":"number","description":"The numeric ID of the sheet to copy (not the sheet name). Use get_spreadsheet to find sheet IDs."}},{"in":"query","name":"destinationSpreadsheetId","schema":{"type":"string","description":"The ID of the destination spreadsheet to copy the sheet to."}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-sheets/spreadsheets/{spreadsheetId}/batch-update":{"post":{"operationId":"google-sheets.batch_update_spreadsheet","description":"Execute one or more structured update requests against a spreadsheet. Supports a wide variety of operations: formatting, merging cells, adding/removing named ranges, creating charts, auto-resizing, sorting, and more. See the Google Sheets API batchUpdate documentation for the full list of request types.","tags":["google-sheets"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"spreadsheetId","schema":{"type":"string","description":"The ID of the spreadsheet to update."},"required":true,"description":"The ID of the spreadsheet to update."},{"in":"query","name":"requests","schema":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"description":"Array of request objects. Each object should have a single key matching the request type (e.g. 'repeatCell', 'mergeCells', 'autoResizeDimensions'). See Google Sheets API batchUpdate documentation for available request types and their parameters."}},{"in":"query","name":"includeSpreadsheetInResponse","schema":{"description":"Whether to include the full spreadsheet resource in the response (default false).","type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}}},"webhooks":{},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"/oauth/authorize","tokenUrl":"/oauth/token","scopes":{}}}},"bearerApiKey":{"type":"http","scheme":"bearer","description":"API key authentication. Pass a Ferrule API key as a Bearer token."}}}}