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.
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
| Category | Everything else |
|---|---|
| Provider host | x402-agent-tools.nerolabs.workers.dev |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 1 from 1 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 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