← Back to SheetAPI.pro

📚 API Documentation

Transform your Google Sheets into a powerful REST API — no coding required!

🚀 Quick Start

  1. Get your API key: Go to Dashboard → API Keys and create a new key. This is like a password for your API — keep it secret!
  2. Connect a sheet: In Dashboard → Sheets, click "Connect New Sheet" and paste your Google Sheet URL. A sheet ID is the long random string in your spreadsheet's URL.
  3. Make your first request: Use the Playground to test fetching rows, or copy one of the examples below!

Base URL

https://sheetapi.pro/api/v1

🔑 Authentication

All API requests require an API key sent in the Authorization header:

Authorization: Bearer YOUR_API_KEY
What's an API key? It's like a password that identifies your app and lets you access your sheets. Create one in your Dashboard → API Keys.

📊 Data Endpoints

Work with your Google Sheet data. Replace {sheet_id} with your sheet's unique ID (found in your dashboard).

GET /api/v1/data/{sheet_id}/rows

Fetch rows from your sheet. Returns data as JSON objects with column headers as keys.

What's a sheet ID? It's the unique identifier for your connected sheet. You'll find it in your dashboard — it looks like a1b2c3d4-e5f6...

Query Parameters (all optional):

ParameterTypeDefaultDescription
limitint100Maximum number of rows to return
offsetint0Number of rows to skip (for pagination)
qstringSearch text across all columns (case insensitive)
sortstringColumn name to sort by
orderstringascSort direction: asc or desc
columnstringComma-separated column names to return (e.g., Name,Email)

Combine multiple params:

?q=john&sort=Date&order=desc&limit=10&column=Name,Email

Examples:

cURL:

curl "https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows?limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"

JavaScript:

fetch('https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows?limit=10', {
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
})
.then(res => res.json())
.then(data => console.log(data));

Python:

import requests

url = "https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {"limit": 10}

response = requests.get(url, headers=headers, params=params)
print(response.json())

Response:

{
  "success": true,
  "data": [
    {"Date": "2026-02-07", "Name": "Alice", "Email": "alice@test.com"},
    {"Date": "2026-02-06", "Name": "Bob", "Email": "bob@test.com"}
  ],
  "sheet_id": "a1b2c3d4...",
  "count": 2
}

POST /api/v1/data/{sheet_id}/rows

Add a new row to your sheet. You can send data in two formats:

Format 1: Column Names (Recommended)

Use your actual column headers as keys. Easy for no-coders!

{
  "Date": "2026-02-07",
  "Name": "John",
  "Email": "john@test.com"
}

Format 2: Array of Values

Send values in the same order as your sheet columns:

{
  "data": ["2026-02-07", "John", "john@test.com"]
}

Examples:

cURL:

curl -X POST "https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"Date": "2026-02-07", "Name": "John", "Email": "john@test.com"}'

JavaScript:

fetch('https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "Date": "2026-02-07",
    "Name": "John",
    "Email": "john@test.com"
  })
})
.then(res => res.json())
.then(data => console.log(data));

Python:

import requests

url = "https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}
data = {
    "Date": "2026-02-07",
    "Name": "John",
    "Email": "john@test.com"
}

response = requests.post(url, headers=headers, json=data)
print(response.json())

PUT /api/v1/data/{sheet_id}/rows/{index}

Update an existing row. Index is 1-based — row 1 is the first data row (after the header).

Row numbering: Index 1 = first data row. The header row is not counted. So if you want to update the second row of data in your sheet, use index 2.

Accepts the same two body formats as POST (column names or array).

Example:

curl -X PUT "https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows/1" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"Date": "2026-02-08", "Name": "Jane", "Email": "jane@test.com"}'

DELETE /api/v1/data/{sheet_id}/rows/{index}

Delete a row from your sheet. Index is 1-based. This actually removes the row, not just clears the cells.

Example:

curl -X DELETE "https://sheetapi.pro/api/v1/data/YOUR_SHEET_ID/rows/1" \
  -H "Authorization: Bearer YOUR_API_KEY"

🔍 Query Parameters Deep Dive

Pagination

Get the first 20 rows, then the next 20:

GET /data/{sheet_id}/rows?limit=20&offset=0   # Page 1
GET /data/{sheet_id}/rows?limit=20&offset=20  # Page 2

Search

Find all rows containing "john" in any column:

GET /data/{sheet_id}/rows?q=john

Sorting

Sort by "Date" column, newest first:

GET /data/{sheet_id}/rows?sort=Date&order=desc

Select Specific Columns

Only return "Name" and "Email" columns:

GET /data/{sheet_id}/rows?column=Name,Email

Combine Everything

GET /data/{sheet_id}/rows?q=test&sort=Date&order=desc&limit=10&column=Name,Email

📤 Response Headers

Every response includes useful metadata headers:

HeaderDescription
X-RateLimit-LimitYour per-minute request limit
X-RateLimit-Daily-LimitYour daily request limit
X-RateLimit-Daily-RemainingRemaining requests today
X-CacheHIT (from cache) or MISS (fresh data)

❌ Error Codes

When something goes wrong, you'll get a JSON response with an error code and message:

Status CodeError CodeMeaning
400INVALID_DATABad request body or parameters
401MISSING_API_KEYNo Authorization header provided
403FORBIDDENThis isn't your sheet, or your key is invalid
404SHEET_NOT_FOUNDSheet ID doesn't exist
429Rate limit exceeded (check Retry-After header)
500FETCH_ERRORFailed to read from Google Sheets
500CREATE_ERRORFailed to create row
500UPDATE_ERRORFailed to update row
500DELETE_ERRORFailed to delete row

Example Error Response:

{
  "success": false,
  "error": "MISSING_API_KEY",
  "message": "Authorization header is required"
}

⚡ Rate Limits

Rate limits prevent abuse and ensure fair usage. Your plan determines your limits:

PlanPriceRequests/MinRequests/Day
Free€060100
Starter€9/mo1201,000
Pro€29/mo24010,000
Pro+€49/mo50016,667
Enterprise€99/mo70033,333

When you exceed your limit, you'll get a 429 Too Many Requests response with a Retry-After header telling you when to try again.

Caching helps! Responses are cached for faster performance and to reduce your quota usage. Check the X-Cache header — a HIT means you got cached data without using a quota.

❓ Frequently Asked Questions

What's the difference between a Google Sheet ID and a SheetAPI sheet ID?
The Google Sheet ID is the long string in your spreadsheet's URL (between /d/ and /edit). The SheetAPI sheet ID is a unique ID we generate when you connect a sheet — you'll find it in your dashboard and use it in API requests.
How do I keep my API key secure?
Never expose your API key in client-side code (like JavaScript on a public website). Use it only on your backend server or in trusted environments. If your key is leaked, delete it immediately in your dashboard and create a new one.
What happens if I exceed my rate limit?
You'll receive a 429 Too Many Requests response. Wait for the time specified in the Retry-After header before making more requests, or upgrade to a higher plan for more capacity.
Can I update multiple rows at once?
Not directly, but you can make multiple PUT requests in sequence. If you need bulk updates frequently, consider upgrading to a higher plan for more requests per minute.
How do row indexes work?
Row indexes are 1-based and exclude the header row. So index 1 = your first data row, 2 = second data row, etc. The header row is never counted.
Does SheetAPI work with private Google Sheets?
Yes! When you connect a sheet, you authorize SheetAPI to access it on your behalf. The sheet doesn't need to be public — only you (and your API keys) can access your data.
What's the column parameter for?
It lets you fetch only specific columns instead of all data. For example, ?column=Name,Email returns only those two columns. Great for reducing payload size and improving performance.
Can I use SheetAPI with Webflow, Bubble, or Zapier?
Absolutely! SheetAPI is a standard REST API, so it works with any platform that supports HTTP requests. Check out the code examples above — they work in any environment.

SheetAPI.pro — Built with ❤️ | Dashboard | Playground | Home