# SignUpGenius API and MCP server

> SignUpGenius has an official API only for paid Premium (Pro) subscribers, and it almost only reads: your sign-ups, report data and group members, plus adding a member to a group (checked 11 Oct 2026). It cannot create or edit sign-ups, change slots, move participants or send messages.

Online sign-up sheets for volunteers, potlucks, school conferences and events: you create slots, people pick one, and confirmation and reminder emails go out.

## What is the SignUpGenius API?

Cotlet's SignUpGenius API exposes 15 endpoints for your own SignUpGenius account: list sign-ups, get sign-up, list participants, list groups, list group members, create sign-up, add slots, update slot, duplicate sign-up, publish sign-up, add participant, move participant, remove participant, send message and add group member. The list_signups endpoint returns sign-ups you created, with title, group, dates and how many slots are filled. Each endpoint takes simple JSON inputs like signup_id, group_id or title and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Creators & communities](https://cotlet.dev/integrations/category/creators-communities)
- **Endpoints:** 15 (5 read, 10 write)
- **Updated:** 2026-10-11

SignUpGenius has an official API only for paid Premium (Pro) subscribers, and it almost only reads: your sign-ups, report data and group members, plus adding a member to a group (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for SignUpGenius with 15 endpoints (5 read, 10 write): your AI agent signs in as you and does the work.

## Does SignUpGenius have an official API?

SignUpGenius has an official API only for paid Premium (Pro) subscribers, and it almost only reads: your sign-ups, report data and group members, plus adding a member to a group (checked 11 Oct 2026). It cannot create or edit sign-ups, change slots, move participants or send messages.

| Task | SignUpGenius official | Cotlet |
|---|---|---|
| List your sign-ups | Partly: Premium key, one call per list | Yes |
| See who signed up and which slots are open | Partly: Premium key, report data per sign-up | Yes |
| Create, copy and publish sign-ups | No | Yes |
| Add or edit slots | No | Yes |
| Sign someone up, move or remove a participant | No | Yes |
| Email the group | No | Yes |
| Add people to a group | Partly: Premium key, one member per call | Yes |

Sources: [SignUpGenius API portal](https://developer.signupgenius.com/), [SignUpGenius API docs (v2.0, key-based)](https://developer.signupgenius.com/developer/keybaseddocs), [Help Center: Explore API Integration](https://support.signupgenius.com/hc/en-us/articles/29746032337431-Explore-API-Integration), [SignUpGenius features](https://www.signupgenius.com/features), [SignUpGenius on Zapier (triggers and actions)](https://zapier.com/apps/signupgenius/integrations)

## For AI agents

```text
SignUpGenius has an official API only for paid Premium (Pro) subscribers, and it almost only reads: your sign-ups, report data and group members, plus adding a member to a group (checked 11 Oct 2026). It cannot create or edit sign-ups, change slots, move participants or send messages.
Cotlet provides a hosted MCP server and REST API for SignUpGenius: 15 tools (5 read, 10 write).
Access       Request access at https://cotlet.dev/app/signup?app=signupgenius; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/signupgenius
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_signups, get_signup, list_participants, list_groups, list_group_members, create_signup, add_slots, update_slot, duplicate_signup, publish_signup, add_participant, move_participant, remove_participant, send_message, add_group_member
Confirm      publish_signup, add_participant, move_participant, remove_participant, send_message (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/signupgenius-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=signupgenius (SignUpGenius is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to SignUpGenius once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted SignUpGenius server that someone else maintains, including non-developers. Developers who prefer to run and fix code on their own computer can use an open-source SignUpGenius MCP server instead.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to SignUpGenius in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following SignUpGenius's terms; Cotlet is not affiliated with SignUpGenius.
```

## What can an AI agent do in SignUpGenius?

Cotlet is best for organizers of schools, clubs and events who want their AI agent to build sign-ups, fill slots and message the group without running or fixing a server.

- **[Create sign-ups with an AI agent](https://cotlet.dev/integrations/signupgenius-api-mcp-server/create-signups-from-a-prompt)**: "Make a sign-up for the spring bake sale on May 9: three two-hour shifts from 9:00, four volunteers each, plus two people for setup at 8:00. Assign it to the PTA group and leave it as a draft." → `list_groups`, `list_signups`, `get_signup`, `create_signup`, `add_slots`
- **Weekly report of open slots** (runs: weekly): "Which slots on my active sign-ups are still empty in the next two weeks?" → `list_signups`, `get_signup`
- **[Remind people to fill open slots](https://cotlet.dev/integrations/signupgenius-api-mcp-server/remind-people-to-sign-up)** (runs: weekly): "Every Monday, check my active PTA sign-ups for empty slots in the next 14 days and email the group members who have not signed up, listing the open shifts." → `list_signups`, `get_signup`, `send_message`
- **Move a participant to another slot**: "Jordan can't make Saturday. Move them to the Sunday 10:00 shift and let them know." → `list_participants`, `get_signup`, `move_participant`
- **Copy last year's sign-up and publish it**: "Copy last year's teacher conference sign-up, rename it for 2027 and publish it." → `list_signups`, `duplicate_signup`, `publish_signup`

## Can SignUpGenius automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a SignUpGenius connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to weekly report of open slots, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/signupgenius/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/signupgenius/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/signupgenius/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/signupgenius/{tool} with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 15 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 403 until the account has an API key with access to SignUpGenius.

### list_signups

Sign-ups you created, with title, group, dates and how many slots are filled. Access: read. REST: `POST /api/v1/signupgenius/list_signups`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | active, past or drafts. Default: active. |
| `limit` | integer | no | 1 to 100. Default: 25. |
| `cursor` | string | no | Next page cursor from the previous call. |

Returns your sign-ups, newest first, with the group each one is assigned to and the count of filled and wanted spots. Use signup_id from each item in the other endpoints. Drafts are included only when status is drafts.

Example response:

```json
{
  "signups": [
    {
      "signup_id": "50463821",
      "title": "Spring bake sale",
      "status": "active",
      "group": "PTA",
      "filled": 9,
      "wanted": 12,
      "next_date": "2027-05-09"
    },
    {
      "signup_id": "50471160",
      "title": "Book fair volunteers",
      "status": "active",
      "group": "PTA",
      "filled": 4,
      "wanted": 8,
      "next_date": "2027-03-12"
    }
  ],
  "next_cursor": null
}
```

### get_signup

One sign-up with its description, link and every slot: title, date, time, location, wanted and filled. Access: read. REST: `POST /api/v1/signupgenius/get_signup`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `open_only` | boolean | no | Only slots that still have spots. |

Returns the sign-up and its slots in date order. Each slot has the ID other endpoints need and the number of people wanted and filled. Set open_only to get only slots that still have spots.

Example response:

```json
{
  "signup_id": "50463821",
  "title": "Spring bake sale",
  "status": "active",
  "url": "https://www.signupgenius.com/go/50463821",
  "slots": [
    {
      "slot_id": "3381902441",
      "title": "Bake sale shift",
      "start": "2027-05-09T09:00:00-04:00",
      "location": "School lobby",
      "wanted": 4,
      "filled": 4
    },
    {
      "slot_id": "3381902442",
      "title": "Bake sale shift",
      "start": "2027-05-09T11:00:00-04:00",
      "location": "School lobby",
      "wanted": 4,
      "filled": 2
    }
  ]
}
```

### list_participants

Who signed up for which slot, with name, email, quantity and answers to custom questions. Access: read. REST: `POST /api/v1/signupgenius/list_participants`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `from` | date | no | Only slots on or after this date. |
| `to` | date | no | Only slots on or before this date. |

Returns one row per participant, in slot order. Email is empty when the person did not give one. Answers to custom questions come as question and answer pairs. Use from and to to limit the slot dates.

Example response:

```json
{
  "signup_id": "50463821",
  "participants": [
    {
      "participant_id": "771204518",
      "first_name": "Jordan",
      "last_name": "Reyes",
      "email": "jordan@example.com",
      "slot_id": "3381902441",
      "quantity": 1,
      "answers": [
        {
          "question": "Dietary notes",
          "answer": "Nut free"
        }
      ]
    },
    {
      "participant_id": "771204533",
      "first_name": "Sam",
      "last_name": "Ortiz",
      "email": null,
      "slot_id": "3381902442",
      "quantity": 2,
      "answers": []
    }
  ]
}
```

### list_groups

Your groups (the people you invite) with member counts. Access: read. REST: `POST /api/v1/signupgenius/list_groups`.

No parameters.

Returns every group in your account with its ID and member count. Use group_id from each item in create_signup, list_group_members and add_group_member.

Example response:

```json
{
  "groups": [
    {
      "group_id": "9120334",
      "name": "PTA",
      "members": 86
    },
    {
      "group_id": "9120571",
      "name": "Class 3B",
      "members": 24
    }
  ]
}
```

### list_group_members

Members of a group with name and email. Access: read. REST: `POST /api/v1/signupgenius/list_group_members`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `group_id` | string | yes | Group ID from list_groups. |

Returns the people in one group, with name and email, so your agent can compare them with a sign-up. Members without an email have it empty.

Example response:

```json
{
  "group_id": "9120571",
  "members": [
    {
      "member_id": "6610021",
      "first_name": "Maya",
      "last_name": "Chen",
      "email": "maya@example.com"
    },
    {
      "member_id": "6610022",
      "first_name": "Leo",
      "last_name": "Park",
      "email": "leo@example.com"
    }
  ]
}
```

### create_signup

New sign-up saved as a draft. Nothing is visible or sent until you publish it. Access: write. REST: `POST /api/v1/signupgenius/create_signup`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `title` | string | yes | Sign-up title. |
| `description` | string | no | Text shown at the top of the sign-up. |
| `group_id` | string | no | Group to assign, from list_groups. |

Creates an empty sign-up as a draft and returns its ID. Nobody can see it and no email goes out until publish_signup. It reaches no one and you can delete the draft, so it runs without asking first. Add slots next with add_slots.

Example response:

```json
{
  "signup_id": "50463821",
  "title": "Spring bake sale",
  "status": "draft",
  "group_id": "9120334"
}
```

### add_slots

Add slots (roles or tasks) to a sign-up, on one or more dates and times. Access: write. REST: `POST /api/v1/signupgenius/add_slots`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `title` | string | yes | Slot name, e.g. "Main dish" or "Setup crew". |
| `quantity` | integer | yes | Number of people wanted per date. |
| `dates` | string[] | no | ISO date-times the slot applies to, with time zone. Empty: slot without a date. |
| `location` | string | no | Where the slot takes place. |
| `help_comment` | string | no | Short note that explains the slot. |

Adds one slot per date-time you pass, all with the same title and quantity, and returns each new slot ID. The sign-up keeps its status, so slots added to a draft stay hidden. It reaches no one, so it runs without asking first.

Example response:

```json
{
  "signup_id": "50463821",
  "status": "draft",
  "slots_added": 3,
  "slots": [
    {
      "slot_id": "3381902441",
      "start": "2027-05-09T09:00:00-04:00",
      "title": "Bake sale shift",
      "wanted": 4,
      "filled": 0
    },
    {
      "slot_id": "3381902442",
      "start": "2027-05-09T11:00:00-04:00",
      "title": "Bake sale shift",
      "wanted": 4,
      "filled": 0
    },
    {
      "slot_id": "3381902443",
      "start": "2027-05-09T13:00:00-04:00",
      "title": "Bake sale shift",
      "wanted": 4,
      "filled": 0
    }
  ]
}
```

### update_slot

Change a slot's title, quantity, location or help comment. Quantity cannot go below the people already signed up. Access: write. REST: `POST /api/v1/signupgenius/update_slot`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `slot_id` | string | yes | Slot ID from get_signup. |
| `fields` | object | yes | Any of title, quantity, location, help_comment. |

Changes the fields you pass and returns the slot as it is now. A quantity lower than the people already signed up is refused. On a published sign-up the change is visible at once, but no one is told, so it runs without asking first.

Example response:

```json
{
  "slot_id": "3381902442",
  "title": "Bake sale shift",
  "start": "2027-05-09T11:00:00-04:00",
  "location": "Gym entrance",
  "wanted": 5,
  "filled": 2
}
```

### duplicate_signup

Copy a sign-up with a new title. The copy is an unpublished draft. Access: write. REST: `POST /api/v1/signupgenius/duplicate_signup`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `title` | string | yes | Title of the copy. |
| `group_id` | string | no | Assign the copy to another group. |

Copies a sign-up, past or active, with its slots, and saves the copy as an unpublished draft under the new title. Nobody sees it and no one is told, so it runs without asking first. Check the dates on the copy before you publish it.

Example response:

```json
{
  "signup_id": "52014408",
  "title": "Teacher conferences 2027",
  "status": "draft",
  "copied_from": "48820917",
  "slots": 18
}
```

### publish_signup

Make a draft sign-up live and return its public link. Does not send invites. Access: write, asks the user first. REST: `POST /api/v1/signupgenius/publish_signup`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |

Makes a draft visible to anyone with the link and returns that link. It does not email the group; use send_message for that. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "signup_id": "52014408",
  "status": "active",
  "url": "https://www.signupgenius.com/go/52014408"
}
```

### add_participant

Sign someone up for a slot as the organizer, from a group or as a new person. Access: write, asks the user first. REST: `POST /api/v1/signupgenius/add_participant`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `slot_id` | string | yes | Slot ID from get_signup. |
| `first_name` | string | yes | First name. |
| `last_name` | string | yes | Last name. |
| `email` | string | no | Email; leave out if the person has none. |
| `send_confirmation` | boolean | no | Send them a confirmation email. Default: true. |

Signs a person up for a slot and returns the new participant ID. With send_confirmation on, they get a confirmation email. A full slot is refused. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "participant_id": "771204601",
  "signup_id": "50463821",
  "slot_id": "3381902442",
  "first_name": "Maya",
  "last_name": "Chen",
  "confirmation_sent": true
}
```

### move_participant

Move a participant from their slot to another open slot on the same sign-up. Access: write, asks the user first. REST: `POST /api/v1/signupgenius/move_participant`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `participant_id` | string | yes | Participant ID from list_participants. |
| `to_slot_id` | string | yes | Target slot ID from get_signup. |
| `notify` | boolean | no | Email the participant about the change. Default: true. |

Moves one participant to a slot that still has room, on the same sign-up, and returns both slot IDs. With notify on, the participant gets an email about the change. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "participant_id": "771204518",
  "from_slot_id": "3381902441",
  "to_slot_id": "3381902442",
  "notified": true
}
```

### remove_participant

Delete a participant from a slot. Access: write, asks the user first. REST: `POST /api/v1/signupgenius/remove_participant`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `participant_id` | string | yes | Participant ID from list_participants. |
| `notify` | boolean | no | Email the participant about the change. Default: true. |

Removes one participant from their slot, which frees the spot. With notify on, the participant gets an email. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "participant_id": "771204533",
  "slot_id": "3381902442",
  "removed": true,
  "notified": false
}
```

### send_message

Email the people on a sign-up: everyone, those who signed up, or those who have not. Access: write, asks the user first. REST: `POST /api/v1/signupgenius/send_message`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `signup_id` | string | yes | Sign-up ID from list_signups. |
| `recipients` | enum | yes | all, signed_up or not_signed_up. |
| `subject` | string | yes | Email subject. |
| `body` | string | yes | Message text. |

Sends one email from your SignUpGenius account and returns how many people it went to. People without an email are skipped and counted. Assign the sign-up to a group so not_signed_up has a list to compare with. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "signup_id": "50463821",
  "recipients": "not_signed_up",
  "sent": 14,
  "skipped_no_email": 1
}
```

### add_group_member

Add a person to one of your groups so you can invite them later. Sends nothing. Access: write. REST: `POST /api/v1/signupgenius/add_group_member`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `group_id` | string | yes | Group ID from list_groups. |
| `email` | string | yes | Member email. |
| `first_name` | string | no | First name. |
| `last_name` | string | no | Last name. |

Adds one person to a group and returns the member ID. Nothing is sent to them, and you can remove them from the group in SignUpGenius, so it runs without asking first. One person per call.

Example response:

```json
{
  "member_id": "6610090",
  "group_id": "9120571",
  "email": "ana@example.com",
  "added": true
}
```

## How do I connect SignUpGenius to Claude Code, Codex or Cursor?

Connecting SignUpGenius takes three steps: request access, sign in to SignUpGenius once, then add one MCP server or call the REST API with the same key.

### Connect SignUpGenius to your agent.

1. **Create an account** Sign up and add SignUpGenius in the console. Your API key is there too.

2. **Sign in to SignUpGenius once** Open the connect page from the console and sign in to SignUpGenius the way you always do. We keep the session, never your password, and you can revoke it anytime.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the SignUpGenius tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
Make a sign-up for the spring bake sale on May 9: three two-hour shifts from 9:00, four volunteers each, plus two people for setup at 8:00. Assign it to the PTA group and leave it as a draft.
```

### Call SignUpGenius from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is a POST endpoint at /api/v1/signupgenius/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/signupgenius/add_slots \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"signup_id":"50463821","title":"Bake sale shift","quantity":4,"dates":["2027-05-09T09:00:00-04:00","2027-05-09T11:00:00-04:00","2027-05-09T13:00:00-04:00"],"location":"School lobby","help_comment":"Bring a float of small bills."}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "signup_id": "50463821",
  "status": "draft",
  "slots_added": 3,
  "slots": [
    {
      "slot_id": "3381902441",
      "start": "2027-05-09T09:00:00-04:00",
      "title": "Bake sale shift",
      "wanted": 4,
      "filled": 0
    },
    {
      "slot_id": "3381902442",
      "start": "2027-05-09T11:00:00-04:00",
      "title": "Bake sale shift",
      "wanted": 4,
      "filled": 0
    },
    {
      "slot_id": "3381902443",
      "start": "2027-05-09T13:00:00-04:00",
      "title": "Bake sale shift",
      "wanted": 4,
      "filled": 0
    }
  ]
}
```

## Why use Cotlet for SignUpGenius?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to SignUpGenius yourself. We keep only the session, encrypted with AES-256.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Pick read only, or read and write.
- Anything that reaches other people waits for your OK, unless you switch it off per tool.
- Revoke access in one click.

**Kept working for you**

- We test every integration daily.
- When SignUpGenius changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a SignUpGenius MCP server on GitHub?

Yes. A community MCP server exists on GitHub, maintained by one person. You install it on your own computer, give it your login, and fix it yourself when SignUpGenius changes. It reads sign-ups and can claim a slot or RSVP as you, but it does not build sign-ups or message people. Cotlet hosts a server for the organizer side, and our team keeps it working.

|  | GitHub MCP server | Cotlet |
|---|---|---|
| Setup | Clone the repo, put your email and password in a .env file, add it to each MCP client | Request access, sign in to SignUpGenius once in your browser, add one MCP server or API key |
| When SignUpGenius changes | It breaks until you or the maintainer fix it | Our team tests it daily and fixes it for you; failed calls are free |
| Your session | Your password in a file on your computer, readable by any program you run | Only the session, encrypted in an EU vault; we never keep your password |
| When the session expires | Tools fail until you sign in again by hand | We keep it alive; if SignUpGenius logs you out, your agent gets a link to sign in again |
| Organizer actions | Read sign-ups, claim or release a slot, RSVP, add a group member | Create sign-ups and slots, move or remove participants, message the group, each send confirmed by you |
| Where it runs | Your computer, while it is on | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Free, paid for with your time | Free 7-day trial with 5,000 credits, then credits per call |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when SignUpGenius changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want the session to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the SignUpGenius API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the SignUpGenius API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

| Size | Price | Credits / month | Per credit |
|---|---|---|---|
| Solo | $29/mo | 3,000 | about $0.0097 |
| Pro | $99/mo | 12,000 | about $0.0083 |
| Agency | $299/mo | 40,000 | $0.0075 |

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own SignUpGenius account.

- **Company details:** The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. [Terms](https://cotlet.dev/terms)
- **Your session:** You sign in to SignUpGenius yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a SignUpGenius tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect SignUpGenius in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **SignUpGenius's terms:** You use your own SignUpGenius account and stay responsible for following SignUpGenius's terms. Cotlet is independent and not affiliated with SignUpGenius. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Request access and pick SignUpGenius. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to SignUpGenius once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is a hosted server safe? My SignUpGenius session would leave my computer.**

Cotlet keeps your SignUpGenius session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

**Do I need a Premium plan?**

No. Cotlet works in your own organizer account and does not use the Premium API key, which SignUpGenius limits to paid plans (Silver gets a handful of calls a day, Gold and Platinum up to 5,000). Features your plan lacks stay unavailable, as in the web app.

**Can my agent post or send messages in SignUpGenius without asking me?**

No. Every call to publish_signup, add_participant, move_participant, remove_participant or send_message waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals. create_signup, add_slots, update_slot, duplicate_signup, add_group_member runs without asking, because it sends nothing to anyone and one call undoes it.

**Can I use the SignUpGenius API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/signupgenius/{tool} from the HTTP Request node.
