# SignupBetter: prepare an editable signup

SignupBetter helps people organize potlucks, volunteer shifts, and appointment slots. An agent can prepare a draft without an account, API key, or MCP connection. The user reviews the draft in the browser before deciding whether to publish it.

## Start here

1. Ask what the user is organizing and which slots or items people can claim. Clarify capacities and ask for the date, time, and IANA timezone when scheduling matters. Do not invent missing details.
2. Choose the browser-only GET flow or the HTTP JSON flow below, according to the tools your assistant actually has.
3. Return the exact `editUrl` or the page's “Review and edit this draft” link to the user. Do not manufacture its encoded draft fragment.
4. The human opens that link, reviews the details, and completes publication in SignupBetter. Production publication costs $2 when checkout is enabled; staging can provide free preview publication. The app shows current availability.

Preparing a draft creates no event record, publishes nothing, sends no email, and never charges money. There is no installation or connector setup for these flows. Do not include participant lists, contact details, passwords, tokens, or payment information in a draft.

## Browser-only agents: use an ordinary link

Open [the draft preparation form](https://staging.signupbetter.com/prepare). It is a server-rendered HTML form that works without JavaScript. Fill its fields and submit with GET. In the slots textarea, use one line per slot, with the label and quantity separated by a vertical bar:

```text
Main dish | 4
Dessert | 3
Drinks | 2
```

You can also open a preparation URL directly using repeated `slot` and matching `capacity` parameters. Optional fields include `description`, `location`, `date`, `time`, `timezone`, and `type`. This is an example, not the user's event:

https://staging.signupbetter.com/prepare?title=Neighborhood+potluck&type=potluck&timezone=America%2FLos_Angeles&slot=Main+dish&capacity=4&slot=Dessert&capacity=3&slot=Drinks&capacity=2

The response is readable HTML containing the validated draft and an actual review link. Give that link to the user. Add `format=json` to receive the same result as JSON if your web tool reads it more easily. Alternatively, `GET https://staging.signupbetter.com/prepare?draft=<URL-encoded JSON>` accepts a complete draft object. These GET requests are stateless preparation only.

## HTTP-capable agents: submit JSON

Read [the JSON schema](https://staging.signupbetter.com/signupbetter.schema.json) or [the endpoint description](https://staging.signupbetter.com/api/drafts). POST a raw draft object to `https://staging.signupbetter.com/api/drafts` with `Content-Type: application/json`:

```json
{
  "title": "Neighborhood potluck",
  "description": "Neighbors & friends bring something to share.",
  "location": "",
  "date": "",
  "time": "",
  "timezone": "America/Los_Angeles",
  "type": "potluck",
  "slots": [
    {
      "title": "Main dish",
      "capacity": 4
    },
    {
      "title": "Dessert",
      "capacity": 3
    },
    {
      "title": "Drinks",
      "capacity": 2
    }
  ]
}
```

For example:

```sh
curl 'https://staging.signupbetter.com/api/drafts' \
  -H 'Content-Type: application/json' \
  --data '{"title":"Neighborhood potluck","timezone":"America/Los_Angeles","type":"potluck","slots":[{"title":"Main dish","capacity":4},{"title":"Dessert","capacity":3}]}'
```

A successful response contains `draft`, `editUrl`, `schemaUrl`, `published: false`, and `requiresReview: true`. Return the `editUrl` to the user. The JSON request does not need an email address or any authorization header.

## Format and limits

- Required: a nonempty `title`, and `slots` containing objects with nonempty `title` and integer `capacity`.
- At most 40 slots; capacity 1–100 per slot. Title and slot labels: at most 150 characters. Description: at most 5,000 characters. Location: at most 300 characters.
- Use plain text, without HTML. `date` is a real YYYY-MM-DD date or empty; `time` is HH:mm in 24-hour format or empty; `timezone` is a valid IANA name.
- `type` is `potluck`, `volunteers`, `timeslots`, or `custom`. Unknown optional text/date/time fields may be empty. The schema defaults an omitted timezone to UTC: ask the user for their timezone before scheduling rather than silently treating UTC as their local time.
- Extra properties are rejected. Normalized draft JSON is limited to 12 KiB, and editable links to 16 KiB. If validation fails, correct the indicated fields and try again.
- Draft URLs contain encoded, not encrypted, event details. GET inputs and resulting links can appear in browser history or be shared. Keep private information out of them.

## Templates and other entry points

- [Template JSON](https://staging.signupbetter.com/api/drafts/templates): potluck, volunteer, and time-slot starting points.
- [Human editor](https://staging.signupbetter.com/new): review or create a draft directly.
- [Assistant launch links](https://staging.signupbetter.com/assistants): starter prompts and optional connector instructions.
- [Optional MCP server](https://staging.signupbetter.com/mcp): use only if the user has already connected an MCP-capable client. MCP is not required for the GET or JSON flows above.
- [Agent discovery file](https://staging.signupbetter.com/llms.txt).

Keep review links on this environment: https://staging.signupbetter.com. Respect the user's assistant permissions. A website cannot give a browsing-only assistant arbitrary HTTP POST access, install a connector, or bypass authentication requirements for existing organizer data. When your tools cannot follow the preparation flow, provide the validated JSON for the user to import in the editor.
