Documentation
Help & Documentation
Everything you need to connect Google Sheets, send data to your sheet, and troubleshoot common issues.
1. Getting started
RowSink gives you a direct URL for sending rows to a Google Sheet. Add a sheet, get a unique URL, and send JSON to write rows without building a backend.
- Sign up and complete account setup. Go to Get Started or Sign In.
- Share your Google Sheet with the RowSink service account as Editor. The email is:
rowsink@gserviceaccount.com. Copy it from the add-spreadsheet form or spreadsheet settings. Without this, we cannot write to your sheet. - Add a spreadsheet from My Spreadsheets: paste the full Google Sheets URL and click "Check connection". RowSink will automatically verify that you have Editor access. In most cases this happens instantly; if we can't confirm your access automatically, you'll be asked to create a temporary tab with a specific name to prove you can edit the sheet (it's deleted automatically afterward). Once verified, choose the sheet tab and save.
- Get your endpoint. Each configuration has a unique URL:
https://api.rowsink.com/v1/spreadsheets/:uuid/rowsThe:uuidis shown on the spreadsheet detail page.
2. Sending data (API reference)
Endpoint: POST https://api.rowsink.com/v1/spreadsheets/:uuid/rows
Headers: Content-Type: application/json. If the configuration has API key protection enabled on a Pro or Business plan, also send Authorization: Bearer YOUR_KEY_SECRET or Authorization: RowsinkKey YOUR_KEY_SECRET.
Body: A JSON object or array of objects. Keys become column headers; values become cell values. Empty body or non‑JSON returns 400.
Success response (200): { "success": true, "data": { "rowsQueued": N } }. Rows are queued and written to the sheet asynchronously. "Queued" means accepted; they are processed shortly after.
Error responses: 400 (invalid format / no data), 401 (missing or invalid API key when required), 404 (unknown UUID), 413 (body too large), 429 (rate limit exceeded). Response body includes an error message.
3. Rate limits & body size
Rate limits: Free includes 100 requests per minute per user, Pro includes 200, and Business includes 400. The limit is shared across all spreadsheet configurations for that account (sliding window). Exceeding this shared limit returns 429 with Retry-After (seconds). Responses also include X-RateLimit-Limit and X-RateLimit-Remaining.
Requests to existing configurations without API key protection count immediately. For configurations with API key protection, only requests that include a valid API key count toward the shared limit.
Request body: Free allows up to 50 KB, Pro up to 200 KB, and Business up to 400 KB per request. Larger payloads return 413with a message showing your current plan's limit.
4. How data is written to your sheet
- Columns: JSON keys are collected from your payload to form column headers. We use the union of all keys across all objects in the request.See why this matters vs other tools →
- Nested Objects: Nested objects are automatically flattened using dot notation. For example,
{"user": {"name": "Alice"}}becomes a column nameduser.name. - Expand Nested Arrays: When enabled in settings, we create additional rows when your data contains arrays nested inside objects. A top-level list of records already appears as one row per item. However, if an object has a nested list (e.g., individual items in an order), this setting expands them into multiple rows.
- Timestamp column (optional): When enabled, RowSink writes an automatic timestamp to column A for every row.
- Smart Mode (Default):Writes high-precision numeric values synced to your spreadsheet's timezone. Recommended for easy sorting and filtering.
- ISO 8601 Strings:Writes timestamps as plain text (e.g., "2026-02-16T18:00:00Z"). Enable this in settings if you need strict machine-readable strings for external processing.
- Header row: Automatically managed. Rowsink writes a header row the very first time you send data. If you later send data with a different schema (new keys or different order), we automatically write a new header row before appending that data. This ensures your data always stays aligned with its corresponding headers without manual configuration.
- Values:
null/undefined→ empty cell. Objects and arrays (if not expanded) are stringified as JSON. - Formula Escaping: Values starting with
+,=,-, or@are prefixed with a single quote (') so Google Sheets treats them as plain text instead of formulas.
5. API key protection
API key protection is available on Pro and Business plans. When enabled for a spreadsheet, each request to send data must include a valid API key in the Authorization header.
Free plans do not include API key protection. Free endpoints stay public and continue accepting requests without an API key.
Use API keys only on the server
Keys cannot stay hidden in browser or mobile app code. Enable API key protection only when sending data from your own backend, serverless function, or trusted environment.
Create a key:On a Pro or Business plan, open the spreadsheet configuration, go to the API Key section, and click "Create API Key". The secret is shown only once. Copy and store it securely. You can regenerate (revokes the old key) or revoke keys at any time.
Authorization: Use Bearer <secret> or RowsinkKey <secret>. Keep the space after "Bearer" or "RowsinkKey". The secret is the value you received when creating the key (it starts with rk_live_).
6. Spreadsheet settings
- Header row: Automatically managed based on your data schema. No manual reset is required.
- Add timestamp column (column A):When on, each new row gets an automatic timestamp in column A. By default, these are "Smart" numeric values that respect your spreadsheet's timezone for perfect sorting.
- Expand Nested Arrays: When on, nested arrays in your JSON objects are expanded into additional rows. See section 4 for details.
- API key protection: Available on Pro and Business plans. Toggle whether an API key is required to send data to this endpoint.
- Edit configuration: You can change the Google Sheets URL or sheet tab. Re-check the connection after changing the URL, then save. Changing to a different spreadsheet will require access verification again.
7. Tools: Tester, Queue Monitor & Capacity Checker
Endpoint Tester (/tester): Select a configuration, optionally add an API key when the configuration is protected, edit a JSON payload, and send a test request. Use the load test to fire repeated requests at a chosen rate (0.1–100 req/s, 1–300 seconds) to verify behavior under load.
Queue Monitor (/queue-monitor): Live stream of Enqueued (rows added to the queue) and Processed (rows written to the sheet) events. Only events received while the page is open are shown. Useful to confirm that data is being accepted and written.
Spreadsheet Capacity Checker (/spreadsheet-capacity): Check how full your Google Spreadsheet is. Google Sheets limits each spreadsheet to 10 million cells total (across all tabs). This tool shows your current usage and breakdown by tab.
8. Google Sheets limits
Google Sheets has a limit of 10 million cells per spreadsheet. This limit applies to the entire spreadsheet file, not per individual tab. All tabs within a spreadsheet share this 10 million cell budget.
Important: Spreadsheet-wide limit
The 10 million cell limit counts all cells across all tabs in your spreadsheet, including blank cells. When you create a new tab, it starts with 1,000 rows × 26 columns (26,000 cells) even if empty. Use the Spreadsheet Capacity Checker to monitor your usage.
If you try to append data that would exceed this limit, Google Sheets returns a 400 Bad Requesterror: "This action would increase the number of cells in the workbook above the limit of 10000000 cells." The entire append operation fails—no partial writes occur.
What counts toward the limit: Every cell in the allocated grid space, including blank cells. Google Sheets counts cells based on the grid dimensions (rows × columns), not just cells with data.
If you approach the limit: Consider archiving old data, splitting data across multiple spreadsheets, or reducing the number of columns in your sheets. Each spreadsheet file gets its own 10 million cell budget.
9. Account limits
Free plans can have up to 10 spreadsheet configurations. Pro can have up to 30. Business includes unlimited spreadsheet configurations.
API key protection is not included on Free. It is available on Pro and Business.
10. Troubleshooting
"Permission denied" or connection check fails
Share the Google Sheet with rowsink@gserviceaccount.com as Editor. RowSink uses this service account to add rows to your sheet. Without access, we cannot read metadata or write data.
"You have read-only access"
You can only create a configuration for a spreadsheet you can edit. If the sheet is shared with you as Viewer, ask the owner to grant you Editor access.
"Verification Required" when adding a spreadsheet
RowSink automatically verifies that you have Editor access to the spreadsheet. If your access can't be confirmed automatically (for example, the sheet is shared via a link or through a Google Group), you'll be asked to create a temporary tab with a specific name in your spreadsheet to prove you can edit it. Add a new tab using the + button at the bottom of the sheet, rename it to the name shown, and click Verify. The tab is deleted automatically once verified.
"API key required", "Invalid API key", or a 403 plan error
If the configuration has API key protection enabled, send Authorization: Bearer YOUR_KEY_SECRET. The secret is shown only when you create a key. If you lost it, regenerate the key in spreadsheet settings and update your client. If you see a 403 stating that API key protection is only available on Pro and Business plans, upgrade the account or disable protection on that configuration.
"Rate limit exceeded" (429)
You exceeded your plan's per-user limit for spreadsheet appends. Free is 100 requests per minute, Pro is 200, and Business is 400, shared across all spreadsheet configurations. Wait for the duration given in the Retry-After header, then retry. Requests to existing unprotected configurations count immediately; protected configurations count only after a valid API key is provided.
"Request body must not exceed [plan limit] KB" (413)
The JSON body is too large. Free is limited to 50 KB, Pro to 200 KB, and Business to 400 KB per request. Split into smaller requests or reduce payload size.
"Spreadsheet config not found" (404)
The UUID in the URL is wrong or the configuration was deleted. Check the endpoint URL on the spreadsheet detail page. Ensure you're using the correct environment (production vs. local).
Data queued but not appearing in the sheet
Rows are processed asynchronously. Check the Queue Monitor for "Processed" events. If you see "Enqueued" but not "Processed", there may be a temporary backlog or a permissions issue writing to the sheet. Confirm the sheet is shared with the service account and the tab name matches.
"This action would increase the number of cells in the workbook above the limit of 10000000 cells" (400)
Your spreadsheet has reached Google's 10 million cell limit. This limit applies to the entire spreadsheet (all tabs), not per tab. Use the Spreadsheet Capacity Checker to see your current usage. Consider archiving old data, splitting into multiple spreadsheets, or reducing columns to free up space.
Need more help? Open the setup flow or contact support.