{"id":13880984,"url":"https://github.com/saasify-sh/sheetful","last_synced_at":"2025-05-06T01:32:50.382Z","repository":{"id":102981848,"uuid":"242915852","full_name":"saasify-sh/sheetful","owner":"saasify-sh","description":"The sheetiest REST API on the block.","archived":false,"fork":false,"pushed_at":"2020-07-11T23:25:06.000Z","size":376,"stargazers_count":70,"open_issues_count":0,"forks_count":11,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-09T06:51:11.859Z","etag":null,"topics":["api","google-sheets","google-sheets-api","google-sheets-api-v","json","low-code","no-code"],"latest_commit_sha":null,"homepage":"https://sheetful.saasify.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/saasify-sh.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-02-25T05:14:10.000Z","updated_at":"2024-10-24T10:19:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"bd536358-780a-451d-8f11-26dac041ad7a","html_url":"https://github.com/saasify-sh/sheetful","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saasify-sh%2Fsheetful","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saasify-sh%2Fsheetful/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saasify-sh%2Fsheetful/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saasify-sh%2Fsheetful/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/saasify-sh","download_url":"https://codeload.github.com/saasify-sh/sheetful/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252604585,"owners_count":21775117,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","google-sheets","google-sheets-api","google-sheets-api-v","json","low-code","no-code"],"created_at":"2024-08-06T08:03:44.086Z","updated_at":"2025-05-06T01:32:50.077Z","avatar_url":"https://github.com/saasify-sh.png","language":"TypeScript","readme":"# Sheetful\n\n\u003e The easiest way to turn your Google Sheet into a Restful API.\n\nThat means you can GET, POST, PUT and DELETE to any spreadsheet with just a few lines of code.\n\n[![Build Status](https://travis-ci.com/saasify-sh/sheetful.svg?branch=master)](https://travis-ci.com/saasify-sh/sheetful) [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)\n\n## Features\n\n- 💯 **Open source**\n- 💪 Use Google Sheets as a simple DB / CMS\n- ⚡ Perfect for low / no-code workflows\n- 🤖 An OpenAPI spec is auto-generated from the code\n- 💰 [Saasify](https://saasify.sh) makes it easy to monetize these types of APIs\n\n## Local Usage\n\n```bash\n# install dependencies\nyarn\n```\n\n```bash\n# configure your GOOGLE_API_KEY\necho GOOGLE_API_KEY='XXX' \u003e .env\n\n# run the development server\nyarn dev\n\n# or run the production server\nyarn build\nyarn start\n```\n\nNow you can access any of your Google Sheets via simple HTTP REST commands:\n\n```bash\ncurl localhost:4000/\u003cdocument-id\u003e/\u003csheet-id-or-index\u003e | jq .\n\n# for example\ncurl localhost:4000/1qoK-nrybNcgkrSiXPZd7bsZa-4KBuGUZx3WAfV_vnD0/0 | jq .\n```\n\nThis example returns all rows in a public [Google Sheet](https://docs.google.com/spreadsheets/d/1qoK-nrybNcgkrSiXPZd7bsZa-4KBuGUZx3WAfV_vnD0) as JSON. Note that it assumes you've provided a `GOOGLE_API_KEY` environment variable (see below for details).\n\nExample output:\n\n```json\n[\n  {\n    \"Price\": \"$300,000\",\n    \"Address\": \"45 Grace Ct # 3D, Brooklyn, NY 11201\",\n    \"Type\": \"Co-op for sale\",\n    \"Image\": \"https://photos.zillowstatic.com/p_e/ISble2jd41y6ry0000000000.jpg\"\n  },\n  {\n    \"Price\": \"\",\n    \"Address\": \"81 Pierrepont St, Brooklyn, NY 11201\",\n    \"Type\": \"Townhouse for sale\",\n    \"Image\": \"https://photos.zillowstatic.com/p_e/IS3r1ehrg64gph1000000000.jpg\"\n  },\n  {\n    \"Price\": \"$849,000\",\n    \"Address\": \"251 Pacific St APT 11, Brooklyn, NY 11201\",\n    \"Type\": \"Co-op for sale\",\n    \"Image\": \"https://photos.zillowstatic.com/p_e/ISzv6yuetksjfs0000000000.jpg\"\n  },\n  {\n    \"Price\": \"\",\n    \"Address\": \"360 Furman St APT 1216, Brooklyn, NY 11201\",\n    \"Type\": \"Condo for sale\",\n    \"Image\": \"https://photos.zillowstatic.com/p_e/ISadsnq9f2ahh51000000000.jpg\"\n  },\n  {\n    \"Price\": \"$999,000\",\n    \"Address\": \"114 Clinton St APT 5C, Brooklyn, NY 11201\",\n    \"Type\": \"Co-op for sale\",\n    \"Image\": \"https://photos.zillowstatic.com/p_e/IS7e2ppvpy2v7i0000000000.jpg\"\n  },\n  // redacted...\n  {\n    \"Price\": \"$4,750,000\",\n    \"Address\": \"169 Columbia Hts APT 5A, Brooklyn, NY 11201\",\n    \"Type\": \"Condo for sale\",\n    \"Image\": \"https://photos.zillowstatic.com/p_e/ISfob57za37h381000000000.jpg\"\n  }\n]\n```\n\n## Authentication\n\nAll endpoints support two forms of authentication depending on your use case.\n\nIf an oauth access token is provided for a given call, it will take precedence. Otherwise, the default is to use an API key if `process.env.GOOGLE_API_KEY` exists.\n\nIf neither form of authentication is provided, the server will return a `401 Unauthorized` error.\n\n#### API Key\n\nThis allows **read-only access to public Google Sheets** and is great for getting started.\n\nSee [this guide](https://theoephraim.github.io/node-google-spreadsheet/#/getting-started/authentication?id=api-key) for acquiring an API key.\n\nYou can then add your `GOOGLE_API_KEY` as an environment variable directly or via `.env` which will be loaded by the server.\n\nBe careful to never check your API key into version control.\n\n#### OAuth2\n\nThis is the most flexible and powerful form of authentication.\n\nIt allows your API to **read and write a user's private Google Sheets**.\n\n**OAuth access tokens take precedence over API keys**.\n\nAll endpoints accept an optional header `x-google-access-token` which takes a valid Google oauth2 access token that's been granted the granted the [https://www.googleapis.com/auth/spreadsheets](https://www.googleapis.com/auth/spreadsheets) scope.\n\nHere are the same examples as above only this time using oauth (replace XXX with your access token).\n\n```bash\ncurl localhost:4000/\u003cdocument-id\u003e/\u003csheet-id-or-index\u003e -H 'x-google-access-token: XXX' | jq .\n\n# for example\ncurl localhost:4000/1qoK-nrybNcgkrSiXPZd7bsZa-4KBuGUZx3WAfV_vnD0/0 -H 'x-google-access-token: XXX' | jq .\n```\n\nBe careful to never check your oauth access tokens into version control.\n\n## Deploying to ZEIT now\n\nThis project exposes a standard Koa server that's transpiled from `src/server.ts` to `build/server.js`.\n\nHere's an example of this service hosted as a ZEIT now lambda: `https://sheetful-transitive-bullshit.saasify.now.sh`.\n\nIn terms of best practices, it'd be nice to break up each endpoint into its own lambda, but the potential perf delta is likely negligible.\n\n## Why\n\nGoogle Sheets is a simple, familiar interface that allows anyone to easily manage their data and content.\n\nBy treating Google Sheets as a DB / CMS and providing a basic RESTful JSON API on top, we can build thousands of potential no-code workflows.\n\nThis results in a DB / CMS with the perfect blend of power and simplicity, enabling creative makers to build all sorts of dynamic websites and apps.\n\n## Commercial Products\n\nThese are all commercial versions of this project that are **not open source**.\n\n- [Sheetsu](https://sheetsu.com)\n- [Sheety](https://sheety.co)\n- [SheetAPI](https://sheetapi.co)\n- [SheetDB](https://sheetdb.io)\n\n## Inspiration\n\n- [table2site](https://table2site.com) - Build sites without coding, using an Airtable base as your CMS.\n- [sheet2site](https://sheet2site.com) - Create your own website without writing code using only Google Sheets.\n- [AwesomeTable](https://awesome-table.com) - Use spreadsheets to power dynamic views and apps.\n- [ActionDesk](https://www.actiondesk.io) - A spreadsheet natively connected with apps \u0026 data sources.\n\n## License\n\nMIT © [Saasify](https://saasify.sh)\n\nSupport my OSS work by \u003ca href=\"https://twitter.com/transitive_bs\"\u003efollowing me on twitter \u003cimg src=\"https://storage.googleapis.com/saasify-assets/twitter-logo.svg\" alt=\"twitter\" height=\"24px\" align=\"center\"\u003e\u003c/a\u003e\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaasify-sh%2Fsheetful","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsaasify-sh%2Fsheetful","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaasify-sh%2Fsheetful/lists"}