ToolAssay

Writes up to 1,000 JSON rows to a Google Sheet (append, replace, or update rows

Writes up to 1,000 JSON rows to a Google Sheet (append, replace, or update rows matched on keyColumn, adding new keys) or reads a tab back as JSON (mode import). No OAuth: share the sheet with nerolabs-sheets@nero-labs-sheets.iam.gserviceaccount.com as Editor. Keeps column order, adds new fields on the right, waits out Google rate limits. $0.005 per call plus $0.0002 per row sent, or $0.0001 per row allowed on import. Runs nerolabs/google-sheets-export.

Answeringour last check, 2026-10-31
2 of 2checks answered this week
319 msmedian answer time
$0.0052listed price per call
$0.0052price it asked us

Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.

Endpoint

POST https://x402-agent-tools.nerolabs.workers.dev/google-sheets

CategoryEverything else
Provider hostx402-agent-tools.nerolabs.workers.dev
Networkseip155:8453
Payment schemesexact
Self-reported calls, 30 days1 from 1 payers (the provider's figure, not ours)

Our checks, last 30 days

DayResultHTTPAskedTime
2026-10-31 valid payment request 402$0.0052 587 ms
2026-10-29 valid payment request 402$0.0052 51 ms

Example input (from the provider)

{
  "body": {
    "mode": "append",
    "rows": [
      {
        "city": "London",
        "company": "Northwind Traders",
        "rating": 4.6
      }
    ],
    "sheetName": "Leads",
    "spreadsheet": "https://docs.google.com/spreadsheets/d/1gV5ZFKQsKgake9aKTTQRaPRwmA7yS4BZySrmzGqNVAg/edit"
  },
  "bodyType": "json",
  "method": "POST",
  "type": "http"
}

Promised output schema (from the provider)

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "input": {
      "additionalProperties": false,
      "properties": {
        "body": {
          "additionalProperties": false,
          "properties": {
            "addNewRows": {
              "default": true,
              "description": "Update mode: add rows for keys not yet in the sheet (default true).",
              "type": "boolean"
            },
            "columns": {
              "description": "Optional: only these fields, in this order.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "keyColumn": {
              "description": "Update mode: the field that identifies a row, such as id, url, sku or email.",
              "type": "string"
            },
            "limit": {
              "default": 200,
              "description": "Import mode: rows to read (default 200, at most 1,000).",
              "maximum": 1000,
              "minimum": 1,
              "type": "integer"
            },
            "mode": {
              "default": "append",
              "description": "append: add rows after the last row with data. replace: overwrite the tab, then remove old rows left below. update: match rows on keyColumn and change only the fields sent, adding rows for new keys. import: read the tab back as JSON rows (first row = column names).",
              "enum": [
                "append",
                "replace",
                "update",
                "import"
              ],
              "type": "string"
            },
            "offset": {
              "description": "Import mode: rows to skip first.",
              "minimum": 0,
              "type": "integer"
            },
            "parseValues": {
              "default": false,
              "description": "true: values are entered as if typed (dates, numbers, =formulas). false (default): written exactly as sent.",
              "type": "boolean"
            },
            "rows": {
              "description": "Rows to write (append, replace, update), as JSON objects; keys become columns. Up to 1,000 per call. Nested objects become parent/child columns.",
              "items": {
                "type": "object"
              },
              "type": "array"
            },
            "sheetName": {
              "description": "Tab name. Created if missing. Default: the tab in the link, or the first tab.",
              "type": "string"
            },
            "spreadsheet": {
              "description": "Google Sheet link or ID. The sheet must be shared with nerolabs-sheets@nero-labs-sheets.iam.gserviceaccount.com as an Editor (no OAuth).",
              "type": "string"
            }
          },
          "required": [
            "spreadsheet"
          ],
          "type": "object"
        },
        "bodyType": {
          "enum": [
            "json",
            "form-data",
            "text"
          ],
          "type": "string"
        },
        "method": {
          "enum": [
            "POST"
          ],
          "type": "string"
        },
        "type": {
          "const": "http",
          "type": "string"
        }
      },
      "required": [
        "type",
        "method",
        "bodyType",
        "body"
      ],
      "type": "object"
    },
    "output": {
      "properties": {
        "example": {
          "properties": {
            "count": {
              "type": "integer"
            },
            "rows": {
              "items": {
                "properties": {
                  "columnsAdded": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "finishedAt": {
                    "type": "string"
                  },
                  "googleRequests": {
                    "type": "integer"
                  },
                  "message": {
                    "type": "string"
                  },
                  "mode": {
                    "type": "string"
                  },
                  "rateLimitHits": {
                    "type": "integer"
                  },
                  "retries": {
                    "type": "integer"
                  },
                  "rolledOverTo": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "rowsAppended": {
                    "type": "integer"
                  },
                  "rowsImported": {
                    "type": "integer"
                  },
                  "rowsNotWritten": {
                    "type": "integer"
                  },
                  "rowsRead": {
                    "type": "integer"
                  },
                  "rowsSkippedNoKey": {
                    "type": "integer"
                  },
                  "rowsUpdated": {
                    "type": "integer"
                  },
                  "rowsWritten": {
                    "type": "integer"
                  },
                  "secondsWaitedForGoogle": {
                    "type": "integer"
                  },
                  "spreadsheetTitle": {
                    "type": "string"
                  },
                  "spreadsheetUrl": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string"
                  },
                  "tabs": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "totalColumns": {
                    "type": "integer"
                  },
                  "truncatedCells": {
                    "type": "integer"
                  },
                  "unwr

This page as JSON