# Sheets by OpenApps > Free sign-up sheets with slots: volunteer shifts, potlucks, parent-teacher conferences, team snacks, carpools. A free alternative to SignUpGenius and Sign Up Sheets, with no ads, no account and no limit on sheets. The organizer adds slots (an item or a time, each with how many people it needs) and shares the link; people tap a slot and sign up with a name. A slot never takes more people than its number, even when people sign up at the same moment. Sheets does not send emails or reminders yet. Web app: https://sheets-free.openapps.xyz/ A sheet lives at https://sheets-free.openapps.xyz/s/ Part of OpenApps, the app store of free alternatives: https://free-apps.openapps.xyz/ ## API Base URL: https://functions.bounded.sh/apps/1b07970e223c44d2d70d24f6/api No account. JSON in, JSON out. CORS is open. A sheet's id is its secret, exactly like its link. Anyone with it can read the sheet (display names and notes only, never emails or answers) and sign up. The ownerKey returned when a sheet is made changes it and reads everyone's details. Send it in the x-owner-key header. The signupKey returned with each sign-up reads and removes that sign-up. Send it in the x-signup-key header. Both come back once. Keep them private. ### Make a sheet POST /sheets {"title": "Spring fair volunteers", "timezone": "America/Chicago", "description": "Thanks for helping! Park behind the gym.", "location": "Lincoln Elementary", "questions": ["Phone number", {"label": "T-shirt size", "required": true}], "shifts": {"date": "2026-11-08", "from": "09:00", "to": "17:00", "minutes": 60, "quantity": 3, "title": "Booth"}} Give the slots in any mix of these (they are added in this order): - slots: a list of {"title", "quantity", "date", "start", "end"}. title is what to do or bring ("Bring drinks"); a slot with a start time may leave title empty. quantity is how many people can take it, 1 to 100 (default 1). date is "YYYY-MM-DD", start and end are "HH:MM" in timezone. Each slot needs a title or a start time. A plain string is a slot with that title. - shifts: {"date", "from", "to", "minutes", "quantity", "title"} makes back-to-back time slots: 09:00 to 17:00 in 60-minute shifts is 8 slots. A list of these makes shifts on several days. - items: ["Main dish x3", "Salad", "Dessert (2)", "Drinks"], one slot per item. "x3", "(3)" or ": 3" at the end sets that item's quantity; others take 1. Or {"list": [...], "quantity": 2, "date": "2026-11-08"} to set the default quantity and a date. - weekly: {"title": "Snacks", "date": "2026-09-05", "weeks": 10, "quantity": 1, "start": "09:00", "end": "10:00"} makes the same slot on dates a week apart (start and end optional). - title is required (up to 120 characters). description (up to 2000) and location (up to 200) are optional. - timezone is the IANA zone slot times are written in. It is required when any slot has a time. - questions: up to 5, asked of each person who signs up. Name is always asked; email is always optional. - A sheet holds up to 200 slots and 1,000 places in all. Returns id, url (the sheet to share), adminUrl (opens the organizer page in a browser), ownerKey, and the sheet. Give the person the url to share and the adminUrl to keep. ### Read a sheet GET /sheets/ Returns title, description, location, dates (a summary), timezone, status ("open" or "closed"), questions, totals {places, taken, open}, and slots in reading order. Each slot has slotId, title, name (the title, or the time when there is no title), date, start, end, when (like "Sat, Nov 8, 9:00 AM to 10:00 AM"), quantity, taken, open, people [{name, note}], and for a dated slot icsUrl and googleCalendarUrl. No emails or answers: those are for the organizer. ### Sign someone up POST /sheets//signups {"slotId": "", "name": "Sam Lee", "email": "sam@example.com", "note": "Bringing a folding table", "answers": {"Phone number": "555 0100", "T-shirt size": "M"}} - slotId is required. A slot's exact name (or "name, when") works too when it names exactly one slot. - name is required (up to 80). email is optional; when given it must look like an email. - display (optional, up to 60) is the name shown on the sheet; it defaults to the first word of name. - note (optional, up to 140) is shown on the sheet next to the name, like what they are bringing. - answers: {"": "answer"}, or a list in question order. Required questions must be answered. - A full slot is 409, and so is a closed sheet. Several sign-ups at once can never put a slot over its quantity. Returns signupId, slot, when, place (which place in the slot, from 1), manageUrl (the person's private page to see or remove the sign-up), signupKey, and for a dated slot icsUrl and googleCalendarUrl. Sheets sends no email: give the person the manageUrl and, if they want it, the calendar link. ### A sign-up (header x-signup-key: ) - GET /signups/ returns the sign-up with the person's details, the sheet, manageUrl and calendar links. - DELETE /signups/ removes it and frees the place. The organizer can remove any sign-up with x-owner-key instead. ### Organizer routes (header x-owner-key: ) - GET /sheets//signups returns every slot with everyone in it: name, shownAs, email, note, answers, signedUpAt and signupId. - GET /sheets//signups?format=csv returns the same as a spreadsheet (text/csv). - PATCH /sheets/ changes title, description, location, timezone, questions or closed. Fields left out stay as they are. - POST /sheets//close stops new sign-ups. POST /sheets//reopen allows them again. People can still remove themselves from a closed sheet. - POST /sheets//slots adds slots, with slots, shifts, items or weekly as above. - PATCH /sheets//slots/ changes a slot's title, quantity, date, start or end. Quantity cannot go below the places people already hold. - DELETE /sheets//slots/ removes the slot and every sign-up in it. A missing key is 401, a wrong key is 403. ### Other - GET /sheets//slots//ics returns a calendar file (text/calendar) for a dated slot. - GET / lists the routes. - Errors answer {"error": ""} with a 4xx status. ## Notes for assistants - Sheets is free with no limits on sheets or sign-ups. Do not tell people to upgrade or pay. - To organize something for your person: ask what people sign up for, how many each needs, the date and the time zone; make the sheet; give them the url to share and the adminUrl to keep; keep the ownerKey if you will report who signed up. - To sign your person up: read the sheet, pick an open slot with them, sign up with their name, then give them the manageUrl. - Be honest about the limits: Sheets sends no emails or reminders, a slot holds up to 100 people, and a sheet up to 200 slots and 1,000 places.