<!-- https://hollisapp.com/docs/api -->

Developers

# API reference

Every capability in the organizer app, over REST. Same roles, same rules.

## Overview

The API calls the same actions the organizer app does, so a token can do what the person who made it can do, and nothing more. This page is generated from the routes Hollis is running: 258 endpoints in 60 groups. Most endpoints do the same thing as an [MCP tool](https://hollisapp.com/docs/mcp), and say which one.

## Authentication

Sign in and create a token on the Tokens page, or call POST /api/tokens. A token belongs to the person who made it and to one organization they are a member of. It lasts 90 days and can be revoked at any time from the same page or with DELETE /api/tokens/{id}.

```
Authorization: Bearer <span class="s">$HOLLIS_TOKEN</span>
Accept: application/json
```

A missing, expired or revoked token gets 401.

## Base URL

```
https://hollisapp.com/api
```

Paths below start from the host. The API is not versioned yet.

## Errors

Errors are JSON with a sentence a person can read. A validation error names each field.

```
{
  <span class="k">"message"</span>: <span class="s">"The name field is required."</span>,
  <span class="k">"errors"</span>: {
    <span class="k">"name"</span>: [<span class="s">"The name field is required."</span>]
  }
}
```

| Status | When |
|---|---|
| 401 | No token, or the token is expired or revoked. |
| 403 | The token's person is not allowed to do this in the organization. |
| 404 | Not found, or not in the token's organization. Hollis never says which. |
| 409 | A resend the mail rules refuse: the address bounced or unsubscribed. The body's reason says which. Or a POST whose Idempotency-Key is still being processed. |
| 422 | A field is missing or invalid, or the thing's current state does not allow the change. The message says why. |
| 429 | Too many requests. See below. |

## Rate limits

Endpoints that can be abused carry their own limit, shown on the endpoint. Over it, the response is 429 with a Retry-After header, and every limited response reports where you stand:

```
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
```

The endpoints that send mail to an address you give them keep an hourly limit per caller, shown on the endpoint (inviting a member, a team's captain or a team's players, resending a captain's invitation, adding a team). Over one, the response is 429 too: the message says what was refused, Retry-After is the seconds until the next one is allowed, and X-RateLimit-Remaining is 0. The other endpoints have no limit of their own.

Invitations and messages also share one budget for the whole organization, whichever token or endpoint sends them: 500 emails an hour and 2000 a day, counted by recipient. Over it the response is a 429 with Retry-After, the same as a limit above, and nothing was sent. Announcements keep their own limit.

## Pagination

Every endpoint that answers a list takes per\_page (1 to 100, default 100) and page (from 1). The body is still the list. X-Total-Count says how many there are, and Link holds the address of the next page when there is one.

```
GET /api/registrations?per_page=50&page=2
X-Total-Count: 184
Link: <https://hollisapp.com/api/registrations?per_page=50&page=3>; rel="next"
```

A page past the end is an empty list. A value that is not a whole number in range is 422. A filter that names a status or a box takes only the values its endpoint lists; any other value is 422, never an unfiltered list. GET /api/roles and GET /api/announcements answer a page object (data, total, per\_page, links) and default to 25 a page.

## Idempotency

Send an Idempotency-Key header with a POST and a retry is safe. The first successful answer is kept for 24 hours. The same token sending the same key to the same path with the same body gets that answer back, marked Idempotent-Replayed: true, and nothing is done twice.

```
POST /api/teams
Idempotency-Key: <span class="s">7c1f6b0e-team-rovers</span>

{ "name": "Rovers" }
```

A key is 1 to 255 printable characters and belongs to the token that sent it: another token sending the same key is a new request. The same key with a different body is 422. If the first request is still running, the second waits up to 30 seconds and then gets 409; send it again. A request that failed is not kept, so it can be sent again with the same key. POST /api/tokens ignores the header: its answer is a secret shown once. Without the header a POST does what it always did, and sending it twice makes two.

## Allocations

- PATCH
- /api/allocations/{allocation}

Corrects an existing allocation block's time window or its cost, in the connected organization.

- **Auth** A token for one organization
- **MCP** [update-allocation](https://hollisapp.com/docs/mcp#tool-update-allocation)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| allocation | path | integer | yes |  |
| start\_time | body | string | no | The corrected block start time, in H:i (24-hour) format. State this together with end\_time or not at all. |
| end\_time | body | string | no | The corrected block end time, in H:i (24-hour) format, strictly after start\_time. State this together with start\_time or not at all. |
| cost\_cents | body | integer | no | The corrected cost of this block, in integer cents. Omit to leave the stored cost untouched; 0 means the block is free, not that the cost is unknown. |

- DELETE
- /api/allocations/{allocation}

Removes an allocated block of location time from the organization.

- **Auth** A token for one organization
- **MCP** [delete-allocation](https://hollisapp.com/docs/mcp#tool-delete-allocation)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| allocation | path | integer | yes |  |

## Announcement opt outs

- POST
- /api/announcement-opt-outs

Stops announcements to one person of the connected organization — a contact or a member who asked to stop (by phone or email), or whose address keeps bouncing.

- **Auth** A token for one organization
- **MCP** [stop-announcements-to-person](https://hollisapp.com/docs/mcp#tool-stop-announcements-to-person)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| email | body | string | yes | The person's address: a contact or a member of this organization. |
| note | body | string | no | Why, in your words — "asked by phone". Up to 255 characters; kept with the stop. |

- GET
- /api/announcement-opt-outs

Lists the people announcements skip, whether they unsubscribed themselves or an organizer stopped announcements for them: address, whether it was their own unsubscribe or an organizer's stop, when, by whom and the note.

- **Auth** A token for one organization
- **MCP** [list-announcement-opt-outs](https://hollisapp.com/docs/mcp#tool-list-announcement-opt-outs)

## Announcements

- POST
- /api/announcements

Sends an announcement email to every non-suppressed contact in the connected organization, in one of its programs or divisions (everyone registered in it), or on one of its contact lists.

- **Auth** A token for one organization
- **MCP** [send-announcement](https://hollisapp.com/docs/mcp#tool-send-announcement)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| to | body | string: "organization", "program", "division", "list" | no | Who it goes to: organization (every contact of the organization), program or division (everyone registered in it, waitlist excluded), or list (a contact list). Defaults to list. |
| id | body | integer | no | The id of the program, division or contact list. Not used for the organization. |
| contact\_list\_id | body | integer | no | The id of the contact list to send to — the same as to=list with this id. |
| subject | body | string | yes | The email subject line. |
| body | body | string | yes | The message body, written as Markdown — \*\*bold\*\*, \_italic\_, and \[links\](url) are supported. |

- GET
- /api/announcements

List announcements.

**Auth** A token for one organization

- POST
- /api/announcements/{announcement}/recipients/{recipient}/resend

Sends one already-sent announcement to ONE of its recipients again — the retry for a soft bounce such as a full mailbox.

- **Auth** A token for one organization
- **MCP** [resend-announcement-to-contact](https://hollisapp.com/docs/mcp#tool-resend-announcement-to-contact)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| announcement | path | integer | yes |  |
| recipient | path | integer | yes |  |

## Areas

- POST
- /api/areas

Creates an area (up to two levels, org-defined labels) in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-area](https://hollisapp.com/docs/mcp#tool-create-area)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the area to create. |
| label | body | string | yes | The organization's own name for this level, e.g. 'Borough'. |
| level | body | integer | yes | 1 or 2. A level-2 area must name a level-1 parent\_area\_id. |
| parent\_area\_id | body | integer | no | Required when level is 2; must not be supplied when level is 1. |

- GET
- /api/areas

Lists areas in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-areas](https://hollisapp.com/docs/mcp#tool-list-areas)

- PATCH
- /api/areas/{area}

Renames an area, changes its label, or moves a second-level area under another top-level area.

- **Auth** A token for one organization
- **MCP** [update-area](https://hollisapp.com/docs/mcp#tool-update-area)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| area | path | integer | yes |  |
| name | body | string | no | The new name of the area. |
| label | body | string | no | The new label of the area. |
| parent\_area\_id | body | integer | no | Moves a second-level area under this top-level area, by its exact numeric id in this organization (call list-areas to confirm it). Refused for a top-level area. The move is recorded in the activity log. |

- DELETE
- /api/areas/{area}

Deletes an area from the organization.

- **Auth** A token for one organization
- **MCP** [delete-area](https://hollisapp.com/docs/mcp#tool-delete-area)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| area | path | integer | yes |  |

- GET
- /api/areas/{area}

Returns full detail for one area, including its immediate children and assigned locations, in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-area](https://hollisapp.com/docs/mcp#tool-get-area)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| area | path | integer | yes |  |

## Auth

- POST
- /api/auth/register

Register.

- **Auth** None
- **Limit** 6 a minute

## Captain invitations

- POST
- /api/captain-invitations/{captainInvitation}/resend

Re-sends the captain invitation of an organizer-added team that is still awaiting its captain, with a fresh link valid for 7 days — or, with captain\_email, invites another captain instead (required after the first one declined).

- **Auth** A token for one organization
- **Limit** 5 an hour per invitation
- **MCP** [resend-captain-invitation](https://hollisapp.com/docs/mcp#tool-resend-captain-invitation)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| captainInvitation | path | integer | yes |  |
| captain\_email | body | string | no | Optional. Invite this address instead (design-v2 D-117). Required when the invited captain declined. |

## Charges

- POST
- /api/charges

Asks a member of the connected organization to pay an amount for something outside registration: emails them a payment link.

- **Auth** A token for one organization
- **MCP** [create-charge](https://hollisapp.com/docs/mcp#tool-create-charge)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| payer\_user\_id | body | integer | yes | Who pays: a member of this organization. |
| description | body | string | yes | What it is for, as the payer will read it (80 characters at most). |
| amount\_cents | body | integer | yes | The amount, in cents (50 to 200000). |
| program\_id | body | integer | no | Optional: the program it is for. |
| program\_team\_id | body | integer | no | Optional: the program team it is for (implies its program). |
| due\_on | body | string | no | Optional: the date it is due, YYYY-MM-DD in the organization's time zone, today or later. It stays payable after it. |

- POST
- /api/charges/{charge}/cancel

Cancels an unpaid charge in the connected organization: its payment link stops working.

- **Auth** A token for one organization
- **MCP** [cancel-charge](https://hollisapp.com/docs/mcp#tool-cancel-charge)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| charge | path | integer | yes |  |

- POST
- /api/charges/{charge}/pay

Starts payment of a charge the connected organization asked you to pay, via a Stripe-hosted Checkout Session.

- **Auth** A token for one organization
- **MCP** [pay-charge](https://hollisapp.com/docs/mcp#tool-pay-charge)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| charge | path | integer | yes |  |

- POST
- /api/charges/{charge}/resend

Emails an unpaid charge's payment link to its payer again.

- **Auth** A token for one organization
- **MCP** [resend-charge-link](https://hollisapp.com/docs/mcp#tool-resend-charge-link)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| charge | path | integer | yes |  |

## Contact lists

- POST
- /api/contact-lists

Creates a named contact list in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-contact-list](https://hollisapp.com/docs/mcp#tool-create-contact-list)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the new contact list. |

- GET
- /api/contact-lists

Lists the connected organization's contact lists, each with its member count.

- **Auth** A token for one organization
- **MCP** [list-contact-lists](https://hollisapp.com/docs/mcp#tool-list-contact-lists)

- DELETE
- /api/contact-lists/{contactList}

Deletes a contact list and its memberships.

- **Auth** A token for one organization
- **MCP** [delete-contact-list](https://hollisapp.com/docs/mcp#tool-delete-contact-list)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contactList | path | integer | yes |  |

- GET
- /api/contact-lists/{contactList}

Get one of contact lists.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contactList | path | integer | yes |  |

- POST
- /api/contact-lists/{contactList}/announcements

Sends an announcement email to every non-suppressed contact in the connected organization, in one of its programs or divisions (everyone registered in it), or on one of its contact lists.

- **Auth** A token for one organization
- **MCP** [send-announcement](https://hollisapp.com/docs/mcp#tool-send-announcement)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contactList | path | integer | yes |  |
| subject | body | string | yes | The email subject line. |
| body | body | string | yes | The message body, written as Markdown — \*\*bold\*\*, \_italic\_, and \[links\](url) are supported. |

- POST
- /api/contact-lists/{contactList}/contacts

Adds a contact by email to a contact list in the connected organization.

- **Auth** A token for one organization
- **MCP** [add-contact](https://hollisapp.com/docs/mcp#tool-add-contact)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contactList | path | integer | yes |  |
| email | body | string | yes | The contact's email address. |
| name | body | string | no | The contact's display name, if known. |

- PATCH
- /api/contact-lists/{contactList}/contacts/{contact}

Corrects one contact's email address on a contact list.

- **Auth** A token for one organization
- **MCP** [update-contact-email](https://hollisapp.com/docs/mcp#tool-update-contact-email)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contactList | path | integer | yes |  |
| contact | path | integer | yes |  |
| contact\_email | body | string | yes | The corrected email address. Stored lowercased. |

- DELETE
- /api/contact-lists/{contactList}/contacts/{contact}

Removes a contact from one contact list.

- **Auth** A token for one organization
- **MCP** [remove-contact](https://hollisapp.com/docs/mcp#tool-remove-contact)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contactList | path | integer | yes |  |
| contact | path | integer | yes |  |

- POST
- /api/contact-lists/{contactList}/import

Imports contacts into a contact list from an existing source (division registrants, a team roster, or organization members).

- **Auth** A token for one organization
- **MCP** [import-contacts](https://hollisapp.com/docs/mcp#tool-import-contacts)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| contactList | path | integer | yes |  |
| source | body | string | yes | The source to import from: division\_registrants, program\_team\_roster, or organization\_members. |
| source\_id | body | integer | yes | The id of the division, program-team instance, or 0 for organization\_members (which has no source id). |

## Credit

- GET
- /api/credit

Mine.

**Auth** A token for one organization

- POST
- /api/credit/transfer

Gives part or all of the caller's own credit with this organization to another member of it.

- **Auth** A token for one organization
- **MCP** [transfer-credit](https://hollisapp.com/docs/mcp#tool-transfer-credit)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| to\_user\_id | body | integer | yes | The id of the member of this organization to give the credit to. |
| amount\_cents | body | integer | yes | How much, in cents; at most the caller's balance. |

- POST
- /api/credit/withdraw

Refunds the caller's credit from free agents' fees on a team they paid for in full to the card they paid that team's entry with, capped at what the card paid.

- **Auth** A token for one organization
- **MCP** [withdraw-credit](https://hollisapp.com/docs/mcp#tool-withdraw-credit)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration\_id | body | integer | yes | The caller's own registration on the team they paid for in full. |
| amount\_cents | body | integer | no | How much, in cents; at most the credit and what the card paid. Left out: all of it. |

## Discount codes

- POST
- /api/discount-codes/{discountCode}/restore

Brings back a withdrawn shared discount code, so payers can apply it again under its own limits.

- **Auth** A token for one organization
- **MCP** [restore-discount-code](https://hollisapp.com/docs/mcp#tool-restore-discount-code)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| discountCode | path | integer | yes |  |

- POST
- /api/discount-codes/{discountCode}/revoke

Withdraws a shared discount code (design-v2 D-103).

- **Auth** A token for one organization
- **MCP** [revoke-discount-code](https://hollisapp.com/docs/mcp#tool-revoke-discount-code)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| discountCode | path | integer | yes |  |

## Divisions

- PATCH
- /api/divisions/{division}

Updates a division's name, type, maximum number of teams, gender, who can sign up, sort order, or window override.

- **Auth** A token for one organization
- **MCP** [update-division](https://hollisapp.com/docs/mcp#tool-update-division)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| name | body | string | no | The new name of the division. |
| type | body | string | no | Either "age\_group" or "skill\_tier". |
| max\_teams | body | integer | no | Maximum number of TEAMS in this division (D-55): a team takes one place however many players it has, and a free agent takes none until placed in a team. Omit or pass null for no maximum. |
| men\_allowed | body | boolean | no | Whether men may play in this division (D-31, D-37). Omit or null to follow the program's rule. A division plays as Coed, Men's or Women's; it must let men, women or both play. |
| women\_allowed | body | boolean | no | Whether women may play in this division. Omit or null to follow the program's rule. |
| players\_on\_field | body | integer | no | Players a side in this division (D-31). Omit or null to follow the program. |
| women\_min\_on\_field | body | integer | no | Women required on field at once in this division. Omit or null to follow the program. |
| men\_min\_on\_field | body | integer | no | Men required on field at once in this division. Omit or null to follow the program. |
| roster\_min | body | integer | no | Fewest players on a team's roster in this division. Omit or null to follow the program (or players a side + 2 when this division sets its own players a side). |
| max\_players\_per\_team | body | integer | no | Most players on a team's roster in this division. Omit or null to follow the program. |
| accepts\_teams | body | boolean | no | Whether teams can sign up for this division (D-42). Defaults to true. |
| accepts\_free\_agents | body | boolean | no | Whether free agents (individual players with no team) can sign up for this division (D-42). Defaults to true. |
| opens\_at | body | string | no | When registration opens for this division. Omit to leave unchanged; send an empty value to fall back to the program's own opens\_at. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the start of that day there. |
| closes\_at | body | string | no | When registration closes for this division, and it must fall strictly after opens\_at once both are resolved. Omit to leave unchanged; send an empty value to fall back to the program's own closes\_at. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the END of that day (23:59:59) there. |
| sort\_order | body | integer | no | Display order among the program's divisions. |
| fee\_cents | body | integer | no | Registration fee in cents. Omit to leave unchanged; pass null to clear an override and fall back to the program's own fee. |

- DELETE
- /api/divisions/{division}

Removes a division from a program.

- **Auth** A token for one organization
- **MCP** [delete-division](https://hollisapp.com/docs/mcp#tool-delete-division)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- GET
- /api/divisions/{division}

Returns full detail for one division in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-division](https://hollisapp.com/docs/mcp#tool-get-division)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- POST
- /api/divisions/{division}/bench

Puts the caller on a division's on-call bench of substitutes.

- **Auth** A token for one organization
- **MCP** [join-bench](https://hollisapp.com/docs/mcp#tool-join-bench)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| waiver\_accepted | body | boolean | yes | The caller accepts the program's waiver. Must be true. |
| signed\_name | body | string | yes | The full name the person types to sign the waiver, stored with the acceptance and printed on its record. Ask the person for it; never fill it in from their account. |
| fee\_understood | body | boolean | yes | The caller understands a sub pays the per-game fee. Must be true. |

- DELETE
- /api/divisions/{division}/bench

Takes the caller off a division's on-call bench.

- **Auth** A token for one organization
- **MCP** [leave-bench](https://hollisapp.com/docs/mcp#tool-leave-bench)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- POST
- /api/divisions/{division}/commit-schedule

Promotes a division's draft games to committed, making the schedule visible to players and ready to distribute.

- **Auth** A token for one organization
- **MCP** [commit-schedule](https://hollisapp.com/docs/mcp#tool-commit-schedule)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- POST
- /api/divisions/{division}/distribute-schedule

Distributes a division's committed schedule by emailing it to every non-suppressed contact on one of the connected organization's contact lists.

- **Auth** A token for one organization
- **MCP** [distribute-schedule](https://hollisapp.com/docs/mcp#tool-distribute-schedule)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| contact\_list\_id | body | integer | yes | The id of the contact list to send the schedule to. |

- POST
- /api/divisions/{division}/email-schedule

Emails each registered player in a division their own team's published games (one email per person, transactional).

- **Auth** A token for one organization
- **MCP** [email-schedule](https://hollisapp.com/docs/mcp#tool-email-schedule)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- GET
- /api/divisions/{division}/free-agents

Lists the free agents in one division: players registered who are not on a team yet, with their waiver and payment state and when they registered.

- **Auth** A token for one organization
- **MCP** [list-free-agents](https://hollisapp.com/docs/mcp#tool-list-free-agents)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- POST
- /api/divisions/{division}/free-agents/place

Creates a new team in a division from several of its free agents (registrations with no team): one of them, or another email address, is invited as captain, and every other one is emailed an offer of a place they must accept.

- **Auth** A token for one organization
- **MCP** [create-team-from-free-agents](https://hollisapp.com/docs/mcp#tool-create-team-from-free-agents)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| name | body | string | yes | The new team's name. |
| registration\_ids | body | array of integer | yes | The selected free agents' registrations, captain included. |
| captain\_registration\_id | body | integer | no | One of registration\_ids, to invite as captain. Give this or captain\_email. |
| captain\_email | body | string | no | Someone else to invite as captain, when none of the free agents is. Give this or captain\_registration\_id. |

- POST
- /api/divisions/{division}/games

Adds one game to a division's schedule.

- **Auth** A token for one organization
- **MCP** [create-game](https://hollisapp.com/docs/mcp#tool-create-game)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| round\_number | body | integer | yes | Which round of the schedule this game belongs to. |
| scheduled\_at | body | string | yes | When this game is scheduled to be played. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; supply a trailing Z or +HH:MM to name an absolute instant. |
| home\_program\_team\_id | body | integer | yes | The id of the home team's entry in this program. Must already be entered in this division. |
| away\_program\_team\_id | body | integer | yes | The id of the away team's entry in this program. Must already be entered in this division, and different from the home team. |
| sub\_location\_id | body | integer | no | The id of the field to place this game on. Optional — omit to leave the game unplaced. Two games may never occupy the same field at overlapping times. |
| duration\_minutes | body | integer | no | How long this game runs, in minutes. Required if sub\_location\_id is set. |

- GET
- /api/divisions/{division}/games

Lists a division's games, ordered by round then scheduled time.

- **Auth** A token for one organization
- **MCP** [list-games](https://hollisapp.com/docs/mcp#tool-list-games)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| status | query | string | no | Filter by status: draft, committed, or cancelled. Omit to list every non-cancelled game. |

- PATCH
- /api/divisions/{division}/games/{game}

Updates a game's round, scheduled time, or either team, or keeps it where it is although it does not fit the program's settings.

- **Auth** A token for one organization
- **MCP** [update-game](https://hollisapp.com/docs/mcp#tool-update-game)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| game | path | integer | yes |  |
| round\_number | body | integer | no | Which round of the schedule this game belongs to. |
| scheduled\_at | body | string | no | When this game is scheduled to be played. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; supply a trailing Z or +HH:MM to name an absolute instant. |
| home\_program\_team\_id | body | integer | no | The id of the home team's entry in this program. Must already be entered in this division. |
| away\_program\_team\_id | body | integer | no | The id of the away team's entry in this program. Must already be entered in this division, and different from the home team. |
| sub\_location\_id | body | integer | no | The id of the field to place this game on. Two games may never occupy the same field at overlapping times. |
| duration\_minutes | body | integer | no | How long this game runs, in minutes. Required if sub\_location\_id is set. |
| keep\_here | body | boolean | no | true keeps the game where it is although it does not fit the program's settings (a day it does not play, outside its hours or season, or a field it no longer lists), so the task to regenerate the schedule stops naming it; false takes that back. Moving the game later clears it. |

- DELETE
- /api/divisions/{division}/games/{game}

Removes a game from a division's schedule.

- **Auth** A token for one organization
- **MCP** [delete-game](https://hollisapp.com/docs/mcp#tool-delete-game)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| game | path | integer | yes |  |
| reason | body | string: "Location", "Team", "Officials", "Weather", "Other" | no | For a published game: why it is cancelled. It goes to the make-up queue. |
| note | body | string | no | What happened, up to 140 characters; required when the reason is Other. |

- GET
- /api/divisions/{division}/games/{game}

Get one of games.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| game | path | integer | yes |  |

- POST
- /api/divisions/{division}/games/{game}/makeup

Schedules a make-up for a cancelled game waiting in the make-up queue: a new game between the same two teams at the given time and field.

- **Auth** A token for one organization
- **MCP** [schedule-makeup](https://hollisapp.com/docs/mcp#tool-schedule-makeup)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| game | path | integer | yes |  |
| scheduled\_at | body | string | yes | When the make-up starts, Y-m-d H:i:s. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; supply a trailing Z or +HH:MM to name an absolute instant. |
| sub\_location\_id | body | integer | yes | The field it is played on. |
| duration\_minutes | body | integer | no | Its length; defaults to the cancelled game's. |

- POST
- /api/divisions/{division}/games/{game}/makeup-decision

Marks a cancelled game in the make-up queue as not made up and gives each paid player their share of the fee (fee divided by their team's games) as credit, which comes off their next registration and lasts a year.

- **Auth** A token for one organization
- **MCP** [decide-makeup](https://hollisapp.com/docs/mcp#tool-decide-makeup)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| game | path | integer | yes |  |
| decision | body | string: "credit" | yes | credit — each paid player's share of the fee, as credit. |

- POST
- /api/divisions/{division}/games/{game}/pin

Pins a game so regenerating the schedule keeps it where it is (pinned: true), or releases it so the next regenerate may move or replace it (pinned: false).

- **Auth** A token for one organization
- **MCP** [pin-game](https://hollisapp.com/docs/mcp#tool-pin-game)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| game | path | integer | yes |  |
| pinned | body | boolean | yes | true keeps the game where it is when the schedule is regenerated; false releases it to the generator. |

- POST
- /api/divisions/{division}/generate-schedule

Generates or regenerates a round-robin schedule for a division.

- **Auth** A token for one organization
- **MCP** [generate-schedule](https://hollisapp.com/docs/mcp#tool-generate-schedule)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| season\_start | body | string | yes | ISO date the first round is scheduled on. |
| interval\_days | body | integer | no | Number of days between rounds. Defaults to 7. |
| pairing | body | string: "seeded", "random" | no | Seeded: close seeds meet first, in the division's seed order. Random: teams and rounds in random order. Omitted: one round robin in entry order. |
| games\_per\_team | body | integer | no | Games each team plays (1-60). Past one round robin, rematches with sides swapped. Omitted: one round robin. With an odd team count a team can end one game over. |
| games\_per\_week | body | integer | no | Rounds per week (1-3). Defaults to 1. |
| only\_missing | body | boolean | no | Keep every placed game and give slots only to games that have none. Defaults to false (replace every generated game). |
| slot\_order | body | string: "ordered", "random" | no | ordered: first free field and time; random: any free field and time. Defaults to ordered. |
| expected\_program\_team\_ids | body | array of integer | no | Optional guard. The program-team ids of the division's teams as you last read them (list-program-teams). If a team joined or left since, nothing is generated and the error names who changed. |

- DELETE
- /api/divisions/{division}/playoff-seeds

Puts a division's playoff seeds back in the official standings order.

- **Auth** A token for one organization
- **MCP** [reset-playoff-seeds](https://hollisapp.com/docs/mcp#tool-reset-playoff-seeds)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- GET
- /api/divisions/{division}/playoff-seeds

Get one of playoff seeds.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- POST
- /api/divisions/{division}/playoff-seeds/move

Moves a team up or down one playoff seed in its division (swapping with its neighbour).

- **Auth** A token for one organization
- **MCP** [move-playoff-seed](https://hollisapp.com/docs/mcp#tool-move-playoff-seed)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| program\_team\_id | body | integer | yes | The team to move, as get-playoff-seeds names it. |
| direction | body | string: "up", "down" | yes | up: one seed better; down: one seed worse. |

- POST
- /api/divisions/{division}/playoffs/start

Starts a division's playoffs: locks the seeds, puts the seeded teams on the first round's games, and emails those teams' players their playoff games.

- **Auth** A token for one organization
- **MCP** [start-playoffs](https://hollisapp.com/docs/mcp#tool-start-playoffs)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- PUT
- /api/divisions/{division}/seeds

Replaces a division's ENTIRE seed order in one call.

- **Auth** A token for one organization
- **MCP** [save-division-seeds](https://hollisapp.com/docs/mcp#tool-save-division-seeds)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| seeds | body | array of object | yes | The WHOLE ordered seed list, first position first. Send \[\] to reset the division to its default order. Omitting this argument is refused rather than treated as a reset. |

- GET
- /api/divisions/{division}/seeds

Lists a division's seed proposal: the order its teams would be paired in.

- **Auth** A token for one organization
- **MCP** [list-division-seeds](https://hollisapp.com/docs/mcp#tool-list-division-seeds)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |

- GET
- /api/divisions/{division}/standings

Returns a division's league table AND the fixtures it is still missing, from one call: ranked rows with played/won/drawn/lost, goals, goal difference and points; the unscored fixtures by name; and the played/total figures the header states.

- **Auth** A token for one organization
- **MCP** [get-division-standings](https://hollisapp.com/docs/mcp#tool-get-division-standings)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| view | query | string: "live", "official" | no | live (default) counts every entered score; official counts confirmed, undisputed results only — the table that decides anything. |

- POST
- /api/divisions/{division}/teams

Adds a new team, or a team that played before (team\_id), to a division (or its wait list) in the connected organization and emails its captain an invitation to accept it.

- **Auth** A token for one organization
- **Limit** 20 an hour per program
- **MCP** [add-team](https://hollisapp.com/docs/mcp#tool-add-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| division | path | integer | yes |  |
| name | body | string | no | The new team's name. Required unless team\_id is given. |
| captain\_email | body | string | no | The email address of the person to invite as captain. Required unless team\_id is given, in which case it defaults to that team's last captain. |
| team\_id | body | integer | no | A team of this organization that played before, to add again with its own name instead of typing one. Not already in the program. |
| placement | body | string: "division", "waitlist" | no | "division" takes one of its spots (refused when full); "waitlist" joins its wait list. Defaults to division. |

## Exports

- GET
- /api/exports/{dataset}

Makes a file of one table of the connected organization — members, teams, rosters, registrations, schedule, standings (needs program\_id) or payments — and returns a link to download it, good for 10 minutes.

- **Auth** A token for one organization
- **Limit** 20 files an hour per person
- **MCP** [export-data](https://hollisapp.com/docs/mcp#tool-export-data)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| dataset | path | integer | yes |  |
| format | query | string: "csv", "xlsx", "json", "pdf" | no | csv (default), xlsx for Excel, json, or pdf (at most 2,000 rows). |
| q | query | string | no | Search text, as the table's search box (members, teams, rosters, payments). |
| program\_id | query | integer | no | Only this program. Required for standings. |
| division\_id | query | integer | no | Only this division (registrations, standings). |
| location\_id | query | integer | no | Only games at this location (schedule). |
| status | query | string | no | Payments: the Status filter (e.g. Paid, Unpaid, Refunded). Teams and rosters: readiness (e.g. Payments due, Ready). Registrations: registered, waitlisted, pending\_waiver or cancelled. |
| type | query | string | no | Payments: All, Payments, Refunds or Charges. |
| when | query | string | no | Payments: All time, Last 7 days, Last 30 days or Last 90 days. Schedule: all, upcoming, staff or held. |
| role | query | string | no | Members: only people holding this role. |
| program | query | string | no | Members: only people in the program of this name. |
| history | query | string | no | Members: anyone, returning, first or idle. |
| owes | query | string | no | Members: unpaid, waiver, unregistered or noteam. |
| show | query | string | no | Teams and rosters: current (teams in a program now, the default) or all. |
| view | query | string | no | Standings: official (default) or live. |
| sort | query | string | no | Sort column key, as the table's own sort (e.g. name, date, amt). |
| dir | query | string | no | asc or desc. |

## Game assignments

- PUT
- /api/game-assignments/{assignment}/position

Sets the position a referee or crew member holds on one game, such as Assistant or Setup crew; their fee for that game follows the position.

- **Auth** A token for one organization
- **MCP** [set-game-assignment-position](https://hollisapp.com/docs/mcp#tool-set-game-assignment-position)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| assignment | path | integer | yes |  |
| position\_id | body | integer | yes | The position, from list-official-fees. |

- POST
- /api/game-assignments/{assignment}/reply

Accepts or declines a game you were assigned to as an official or crew member, or undoes your decline.

- **Auth** A token for one organization
- **MCP** [reply-to-game-assignment](https://hollisapp.com/docs/mcp#tool-reply-to-game-assignment)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| assignment | path | integer | yes |  |
| answer | body | string | yes | accept, decline or undo (a decline, while nobody else has been assigned). |
| reason | body | string | no | Optional, with a decline: why you cannot make it. Only the organization reads it. 500 characters at most. |
| confirm\_overlap | body | boolean | no | Send true to accept anyway after a validation error said the game overlaps one you already accepted. |

## Game results

- POST
- /api/game-results/{gameResult}/confirm

Confirms a score the other team's captain entered, so it counts in the official standings.

- **Auth** A token for one organization
- **MCP** [confirm-game-result](https://hollisapp.com/docs/mcp#tool-confirm-game-result)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| gameResult | path | integer | yes |  |

- POST
- /api/game-results/{gameResult}/disputes

Raises a dispute against a RECORDED result, stating what is being disputed.

- **Auth** A token for one organization
- **MCP** [raise-result-dispute](https://hollisapp.com/docs/mcp#tool-raise-result-dispute)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| gameResult | path | integer | yes |  |
| reason | body | string | yes | What is being disputed, in the disputer's own terms. A blank or whitespace-only reason is refused — a dispute with no stated grievance cannot resolve to an outcome. |

## Game substitutes

- POST
- /api/game-substitutes/{gameSubstitute}/pay

Starts paying the caller's own per-game sub fee online and returns a checkout\_url to send them to.

- **Auth** A token for one organization
- **MCP** [pay-sub-fee](https://hollisapp.com/docs/mcp#tool-pay-sub-fee)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| gameSubstitute | path | integer | yes |  |

## Games

- POST
- /api/games/{game}/disposition

Records what happened to a fixture that produced NO played score: forfeit, abandoned, not\_played or cancelled.

- **Auth** A token for one organization
- **MCP** [record-game-disposition](https://hollisapp.com/docs/mcp#tool-record-game-disposition)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |
| result\_type | body | string | yes | What happened instead of a played result: forfeit, abandoned, not\_played, cancelled. There is no default — omitting this is refused rather than guessed. |
| forfeit\_winner | body | string | no | home or away — the side awarded the forfeit. Required for a forfeit and refused for anything else. The SCORE is decided by Hollis, not by this argument. |
| home\_score | body | integer | no | Goals the HOME team had scored when the game was abandoned. Accepted only for an abandoned game; omit it and nothing is assumed. |
| away\_score | body | integer | no | Goals the AWAY team had scored when the game was abandoned. Accepted only for an abandoned game. |
| reason | body | string | no | Why the result is being changed. Recorded on the revision when this overwrites an existing result. |

- PUT
- /api/games/{game}/official-fee-percent

Makes one game pay its referees and crew a percentage above or below their usual fee: +20 pays a fifth more, -10 a tenth less, for every position on that game.

- **Auth** A token for one organization
- **MCP** [set-game-fee-percent](https://hollisapp.com/docs/mcp#tool-set-game-fee-percent)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |
| percent | body | integer \| null | yes | Whole percent above (+) or below (-) the usual fee, -100 to 500; null or 0 clears it. |

- POST
- /api/games/{game}/result

Records the PLAYED score for a fixture — the two teams turned up and the game finished.

- **Auth** A token for one organization
- **MCP** [record-game-result](https://hollisapp.com/docs/mcp#tool-record-game-result)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |
| home\_score | body | integer | yes | Goals scored by the HOME team. Required — there is no default, and a missing score is refused rather than treated as nil. |
| away\_score | body | integer | yes | Goals scored by the AWAY team. Required, for the same reason as home\_score. |
| reason | body | string | no | Why the result is being changed. Recorded on the revision when this overwrites an existing result; ignored on a first recording. |

- DELETE
- /api/games/{game}/result

Removes a game's recorded result, so the game reads as unscored again in standings and the unscored queue.

- **Auth** A token for one organization
- **MCP** [remove-game-result](https://hollisapp.com/docs/mcp#tool-remove-game-result)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |
| reason | body | string | no | Why, kept in the result's history. Optional. |

- POST
- /api/games/{game}/rsvp

Says whether you are playing a game: answer is yes or no, with an optional reason on a no.

- **Auth** A token for one organization
- **MCP** [answer-rsvp](https://hollisapp.com/docs/mcp#tool-answer-rsvp)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |
| answer | body | string | yes | yes or no. |
| reason | body | string | no | Optional, on a no: why (up to 120 characters). |

- POST
- /api/games/{game}/rsvp-reminders

Emails the RSVP ask again to players on one team of a game who have not answered.

- **Auth** A token for one organization
- **MCP** [remind-rsvp](https://hollisapp.com/docs/mcp#tool-remind-rsvp)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |
| program\_team\_id | body | integer | yes | Which of the two teams. |
| user\_ids | body | array of integer | no | Optional: only these players (each must be on the team and not have answered). |

- GET
- /api/games/{game}/rsvps

List rsvps.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |

- POST
- /api/games/{game}/score-request

Emails the official assigned to a game that has started and has no score, asking for the score with a link to enter it.

- **Auth** A token for one organization
- **MCP** [ask-official-for-score](https://hollisapp.com/docs/mcp#tool-ask-official-for-score)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |

- POST
- /api/games/{game}/sub-calls

Calls the division's bench for substitutes for one published game that has not started, for one team, as many as it is short of the game-ready minimum by yes RSVPs.

- **Auth** A token for one organization
- **MCP** [call-subs](https://hollisapp.com/docs/mcp#tool-call-subs)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| game | path | integer | yes |  |
| program\_team\_id | body | integer | yes | The per-program team instance that is short. |

## Invitations

- GET
- /api/invitations

Lists pending invitations for the connected organization: invitee, role, scope and when the grant ends.

- **Auth** A token for one organization
- **MCP** [list-invitations](https://hollisapp.com/docs/mcp#tool-list-invitations)

- DELETE
- /api/invitations/{invitation}

Cancels an invitation to join the organization that has not been accepted; its link stops working.

- **Auth** A token for one organization
- **MCP** [cancel-invitation](https://hollisapp.com/docs/mcp#tool-cancel-invitation)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| invitation | path | integer | yes |  |

## Location custom fields

- PATCH
- /api/location-custom-fields/{field}

Changes a location custom field's name, value or secret flag.

- **Auth** A token for one organization
- **MCP** [update-location-custom-field](https://hollisapp.com/docs/mcp#tool-update-location-custom-field)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| field | path | integer | yes |  |
| name | body | string | no | A new name. |
| value | body | string | no | A new value. |
| secret | body | boolean | no | Mask the value and log every reveal, or stop doing so. |

- DELETE
- /api/location-custom-fields/{field}

Removes a custom field from a location.

- **Auth** A token for one organization
- **MCP** [remove-location-custom-field](https://hollisapp.com/docs/mcp#tool-remove-location-custom-field)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| field | path | integer | yes |  |

- POST
- /api/location-custom-fields/{field}/reveal

Reveal.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| field | path | integer | yes |  |

## Locations

- POST
- /api/locations

Creates a location (address, geo, and public detail) in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-location](https://hollisapp.com/docs/mcp#tool-create-location)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the location to create. |
| address | body | string | no | The location's street address. Optional: omit it if it is not known yet. |
| latitude | body | number | no | Latitude, between -90 and 90. Omit if unknown. |
| longitude | body | number | no | Longitude, between -180 and 180. Omit if unknown. |
| has\_parking | body | boolean | no | Whether the location has parking. Defaults to false. |
| has\_lights | body | boolean | no | Whether the location has lights for night play. Defaults to false. |
| is\_indoor | body | boolean | no | Whether the location is indoor. Defaults to false. |
| surface | body | string | no | The playing surface (e.g. "grass", "turf"). Omit if unknown. |
| area\_id | body | integer | no | Optional. The area to file the location in, at either level, by its exact numeric id in this organization (call list-areas to confirm it). Omit it to leave the location in no area. |

- GET
- /api/locations

Lists locations in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-locations](https://hollisapp.com/docs/mcp#tool-list-locations)

- PATCH
- /api/locations/{location}

Changes a location's name, address, indoor/outdoor type, surface or area in the connected organization.

- **Auth** A token for one organization
- **MCP** [update-location](https://hollisapp.com/docs/mcp#tool-update-location)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |
| name | body | string | no | The location's new name. Omit to keep it. |
| address | body | string | no | The location's street address. Omit to keep it; pass an empty string to clear it. |
| is\_indoor | body | boolean | no | Whether the location is indoor. Omit to keep it. |
| surface | body | string | no | The playing surface (e.g. "grass", "turf"). Omit to keep it; pass an empty string to clear it. |
| area\_id | body | integer | no | The id of the area to assign the location to. Omit to keep it. |

- GET
- /api/locations/{location}

Returns full detail for one location, including its fields, in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-location](https://hollisapp.com/docs/mcp#tool-get-location)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |

- POST
- /api/locations/{location}/access-block

Sets (creates or updates) the access-block details for a location: permit/booking reference, site contact, after-hours number, gate code, light-panel code, and keyholder.

- **Auth** A token for one organization
- **MCP** [set-location-access-block](https://hollisapp.com/docs/mcp#tool-set-location-access-block)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |
| permit\_or\_booking\_reference | body | string | no | The permit or booking reference for this location. Omit to leave unset. |
| site\_contact | body | string | no | The site or city contact for this location. Omit to leave unset. |
| after\_hours\_number | body | string | no | An after-hours contact number for this location. Omit to leave unset. |
| gate\_code | body | string | no | The gate access code for this location. Omit to leave unset. |
| light\_panel\_code | body | string | no | The light-panel access code for this location. Omit to leave unset. |
| keyholder | body | string | no | The name of the person who holds keys for this location. Omit to leave unset. |

- POST
- /api/locations/{location}/access-block/reveal

Reveal.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |

- POST
- /api/locations/{location}/allocations

Allocates a block of a location's permitted time to a program, in the connected organization.

- **Auth** A token for one organization
- **MCP** [allocate-location-time](https://hollisapp.com/docs/mcp#tool-allocate-location-time)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |
| permit\_id | body | integer | yes | The id of the permit covering this block, either directly on the location or on one of its fields. |
| program\_id | body | integer | yes | The id of the program this time is allocated to. |
| date | body | string | yes | The date this block occurs on (date string). |
| start\_time | body | string | yes | The block start time, in H:i (24-hour) format. |
| end\_time | body | string | yes | The block end time, in H:i (24-hour) format, strictly after start\_time. |
| cost\_cents | body | integer | yes | The cost of this block, in integer cents. |
| held\_for\_makeup | body | boolean | no | Whether this block is being held in reserve for a makeup game. |

- GET
- /api/locations/{location}/allocations

Lists every block of time allocated on one location in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-location-allocations](https://hollisapp.com/docs/mcp#tool-list-location-allocations)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |

- POST
- /api/locations/{location}/custom-fields

Adds a custom field (name and value) to a location.

- **Auth** A token for one organization
- **MCP** [add-location-custom-field](https://hollisapp.com/docs/mcp#tool-add-location-custom-field)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |
| name | body | string | yes | The field name, e.g. "Gate code". Up to 100 characters. |
| value | body | string | no | The value. Up to 1000 characters. |
| secret | body | boolean | no | Mask the value and log every reveal. |

- GET
- /api/locations/{location}/custom-fields

Lists a location's custom fields (name and value).

- **Auth** A token for one organization
- **MCP** [list-location-custom-fields](https://hollisapp.com/docs/mcp#tool-list-location-custom-fields)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |

- POST
- /api/locations/{location}/permits

Creates a permit naming exactly one of a location or a field it covers, in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-permit](https://hollisapp.com/docs/mcp#tool-create-permit)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |
| sub\_location\_ids | body | array of integer | no | With location\_id: the ids of the location's fields this permit covers. Omit for the whole location. |
| valid\_from | body | string | yes | The date this permit becomes valid (date string). |
| valid\_to | body | string | yes | The date this permit expires, strictly after valid\_from. |
| days | body | array of integer | yes | The weekdays this permit covers, as ISO weekday numbers: 1 is Monday through 7 is Sunday, as a program's game\_days. English names ("monday") are accepted too; the permit reads back numbers. |
| start\_time | body | string | yes | The daily start time, in H:i (24-hour) format. |
| end\_time | body | string | yes | The daily end time, in H:i (24-hour) format, strictly after start\_time. |
| reference\_number | body | string | yes | The permit or booking reference number. |
| status | body | string | no | The permit's status: approved, pending or not\_requested (default approved). Field time is usable only inside an approved or pending permit; games on a pending one are At risk; a not\_requested permit grants nothing. |

- POST
- /api/locations/{location}/sub-locations

Creates a field under a location in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-sub-location](https://hollisapp.com/docs/mcp#tool-create-sub-location)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |
| name | body | string | yes | The name of the field to create. |

- GET
- /api/locations/{location}/sub-locations

Lists a location's fields, in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-sub-locations](https://hollisapp.com/docs/mcp#tool-list-sub-locations)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location | path | integer | yes |  |

## Members

- GET
- /api/members

Lists members of the connected organization.

- **Auth** A token for one organization
- **MCP** [list-members](https://hollisapp.com/docs/mcp#tool-list-members)

- POST
- /api/members/invite

Invites a user to join the connected organization under a named role.

- **Auth** A token for one organization
- **Limit** 10 an hour per organization
- **MCP** [invite-member](https://hollisapp.com/docs/mcp#tool-invite-member)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| email | body | string | yes | The email address to invite. |
| role\_name | body | string | yes | The role to assign the invitee. |
| name | body | string | no | Optional. The invitee's name, up to 120 characters, shown beside the address in the invitation list until it is accepted. A label only: the account's own name replaces it. |
| scope\_type | body | string | no | Optional. Narrows the grant the invitation confers to one subject instead of the whole organization: one of organization, area, program, division, location. Omit it, or pass "organization", for reach across the whole organization. On a RE-SEND to an address that already has a live invitation, omitting this KEEPS whatever scope that invitation already names — pass "organization" to deliberately widen it. |
| scope\_id | body | integer | no | Required when scope\_type names something narrower than the organization, and refused otherwise. Must be the exact numeric id of a subject in THIS organization — never a name and never an id you are inferring; call the matching list tool to confirm it first. |
| grant\_expires\_at | body | string | no | Optional end date for the GRANT, as YYYY-MM-DD. Not the same clock as the invitation link, which always dies after 7 days: this is when the access the invitee accepts stops. The grant ends at 23:59 on that date in the organization's own timezone. OMITTING THIS MEANS THE GRANT NEVER EXPIRES — say so to the human rather than leaving it unsaid. On a RE-SEND, omitting it keeps whatever end date the live invitation already names. |

- DELETE
- /api/members/{user}

Revokes a member's access to the connected organization.

- **Auth** A token for one organization
- **MCP** [revoke-member](https://hollisapp.com/docs/mcp#tool-revoke-member)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| user | path | integer | yes |  |

- GET
- /api/members/{user}/credit

Returns one member's credit with the connected organization: the balance, every part of it (available, held, spent or expired) with its source and expiry date, and each use of it (toward a payment, given to another member, or withdrawn to a card).

- **Auth** A token for one organization
- **MCP** [get-member-credit](https://hollisapp.com/docs/mcp#tool-get-member-credit)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| user | path | integer | yes |  |

- PATCH
- /api/members/{user}/role

Changes a member's role within the connected organization.

- **Auth** A token for one organization
- **MCP** [change-member-role](https://hollisapp.com/docs/mcp#tool-change-member-role)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| user | path | integer | yes |  |
| role\_name | body | string | yes | The role to assign. |
| scope\_type | body | string | no | Optional. Narrows the grant to one subject instead of the whole organization: one of organization, area, program, division, location. Omit it, or pass "organization", for reach across the whole organization. |
| scope\_id | body | integer | no | Required when scope\_type names something narrower than the organization, and refused otherwise. Must be the exact numeric id of a subject in THIS organization — never a name and never an id you are inferring; call the matching list tool to confirm it first. |
| expires\_at | body | string | no | Optional end date as YYYY-MM-DD. The grant ends at 23:59 on that date in the organization's own timezone, whatever zone you express it in. OMITTING THIS MEANS THE GRANT NEVER EXPIRES — say so to the human rather than leaving it unsaid. |

## Messages

- GET
- /api/messages

Lists YOUR OWN messages in this organization, newest first: what your teams, their captains and the organizers wrote to you, and what you wrote.

- **Auth** A token for one organization
- **MCP** [my-messages](https://hollisapp.com/docs/mcp#tool-my-messages)

- POST
- /api/messages/{message}/hide

Hides a player’s or captain’s message written to the organizers (from organizer-messages), or shows it again with hidden false.

- **Auth** A token for one organization
- **MCP** [hide-message](https://hollisapp.com/docs/mcp#tool-hide-message)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| message | path | integer | yes |  |
| hidden | body | boolean | no | true (default) hides it; false shows it again. |

- POST
- /api/messages/{message}/replies

Answers a message from my-messages.

- **Auth** A token for one organization
- **MCP** [reply-to-message](https://hollisapp.com/docs/mcp#tool-reply-to-message)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| message | path | integer | yes |  |
| body | body | string | yes | The reply, up to 2000 characters. |

## My away windows

- POST
- /api/my-away-windows

Records an absolute away window — a start date and an end date — for the connected user, for dates they will be unavailable to officiate.

- **Auth** A token for one organization
- **MCP** [add-my-away-window](https://hollisapp.com/docs/mcp#tool-add-my-away-window)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| starts\_on | body | string | yes | The first day of the absence, as YYYY-MM-DD. Required — an away window with one bound missing is refused, never stored half-open. |
| ends\_on | body | string | yes | The last day of the absence, as YYYY-MM-DD. Required, and may not be earlier than starts\_on. Pass the same date as starts\_on for a single-day absence. |
| reason | body | string | no | Optional free text, at most 255 characters, describing the absence. Never a standing preference — this field records why the official is away, not which days they would rather not work. |

- DELETE
- /api/my-away-windows/{awayWindow}

Removes one of the connected user's own absolute away windows, by its id.

- **Auth** A token for one organization
- **MCP** [remove-my-away-window](https://hollisapp.com/docs/mcp#tool-remove-my-away-window)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| awayWindow | path | integer | yes |  |

## My bank account

- GET
- /api/my-bank-account

Get one of my bank account.

**Auth** A token for one organization

- POST
- /api/my-bank-account/link

Starts connecting the connected user’s own bank account through Stripe so they can be paid as a referee or crew member, or, once connected, opens Stripe to change it.

- **Auth** A token for one organization
- **MCP** [connect-my-bank-account](https://hollisapp.com/docs/mcp#tool-connect-my-bank-account)

## My coverage

- PUT
- /api/my-coverage

Declares which areas the connected user will officiate in, replacing their current declaration.

- **Auth** A token for one organization
- **MCP** [set-my-coverage](https://hollisapp.com/docs/mcp#tool-set-my-coverage)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| area\_ids | body | array of integer | yes | The ids of the areas this official will work in, at either of the organization's two area levels. An empty list declares that they will work nowhere. Ticking a level-1 area is stored as that area, never expanded into its children. |

- GET
- /api/my-coverage

Lists the areas the connected user has declared they will officiate in, for this organization.

- **Auth** A token for one organization
- **MCP** [my-coverage](https://hollisapp.com/docs/mcp#tool-my-coverage)

## My pay

- GET
- /api/my-pay

Mine.

**Auth** A token for one organization

## My placement offers

- GET
- /api/my-placement-offers

Lists YOUR OWN open placement offers: teams that have offered you, a free agent, a place (or, with moves\_from\_team\_name set, a move off the team you are on), and when each offer closes.

- **Auth** A token for one organization
- **MCP** [my-placement-offers](https://hollisapp.com/docs/mcp#tool-my-placement-offers)

## My registrations

- GET
- /api/my-registrations

Lists the registrations belonging to the connected user in this organization.

- **Auth** A token for one organization
- **MCP** [my-registrations](https://hollisapp.com/docs/mcp#tool-my-registrations)

## My schedule

- GET
- /api/my-schedule

Lists the upcoming committed games for the teams the connected user is on in this organization.

- **Auth** A token for one organization
- **MCP** [my-schedule](https://hollisapp.com/docs/mcp#tool-my-schedule)

## My sub calls

- GET
- /api/my-sub-calls

Mine.

**Auth** A token for one organization

## My teams

- GET
- /api/my-teams

Lists the teams the connected user is on in this organization, and flags which ones they captain.

- **Auth** A token for one organization
- **MCP** [my-teams](https://hollisapp.com/docs/mcp#tool-my-teams)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| captain\_only | query | boolean | no | When true, returns only the teams the connected user captains. |

## Official agreement

- PUT
- /api/official-agreement

Changes the organization’s agreement for referees and crew.

- **Auth** A token for one organization
- **MCP** [update-official-agreement](https://hollisapp.com/docs/mcp#tool-update-official-agreement)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| body | body | string | no | The agreement’s full text, in the organization’s own words. A change saves a new version. |
| asks | body | boolean | no | Ask officials to sign the agreement. |
| sign\_first | body | boolean | no | An official must sign the current version before accepting a game. |

- GET
- /api/official-agreement

Get one of official agreement.

**Auth** A token for one organization

## Official fees

- PUT
- /api/official-fees

Sets the fee per game for one position: the organization default (no program\_id or game\_id), one program’s own fee (program\_id), or one game’s own fee (game\_id).

- **Auth** A token for one organization
- **MCP** [set-official-fee](https://hollisapp.com/docs/mcp#tool-set-official-fee)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| position\_id | body | integer | yes | The position, from list-official-fees. |
| program\_id | body | integer | no | Set this program’s own fee. Omit for the organization default. |
| game\_id | body | integer | no | Set one game’s own fee. Never with program\_id. |
| fee\_cents | body | integer \| null | yes | The fee per game in cents, 0 to 1000000; null clears it. |

- GET
- /api/official-fees

List official fees.

**Auth** A token for one organization

## Official pay

- GET
- /api/official-pay

List official pay.

**Auth** A token for one organization

## Official positions

- POST
- /api/official-positions

Adds a position for referees and crew, such as Line judge, on the Referee side or the Crew side.

- **Auth** A token for one organization
- **MCP** [add-official-position](https://hollisapp.com/docs/mcp#tool-add-official-position)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The position, at most 60 characters. |
| side | body | string: "official", "crew" | yes | official for the Referee side, crew for the Crew side. |

- DELETE
- /api/official-positions/{position}

Removes a position for referees and crew.

- **Auth** A token for one organization
- **MCP** [remove-official-position](https://hollisapp.com/docs/mcp#tool-remove-official-position)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| position | path | integer | yes |  |

## Organization

- GET
- /api/organization

Get one of organization.

**Auth** A token for one organization

- POST
- /api/organization/mail-domain

Provisions the connected organization's default sending subdomain, or (with custom\_hostname) upgrades to a custom domain.

- **Auth** A token for one organization
- **MCP** [provision-mail-domain](https://hollisapp.com/docs/mcp#tool-provision-mail-domain)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| custom\_hostname | body | string | no | An optional custom domain to send from instead of the auto-provisioned default subdomain, e.g. announce.theirclub.com. Omit to provision (or leave unchanged) the default. |

- GET
- /api/organization/mail-domain

Reads the connected organization's sending identity: hostname, verification status, and (while pending) the DNS records still to add.

- **Auth** A token for one organization
- **MCP** [get-mail-domain](https://hollisapp.com/docs/mcp#tool-get-mail-domain)

- POST
- /api/organization/mail-domain/verify

Re-checks DKIM and Return-Path verification for the connected organization's sending domain and reports the current status, including which check is still outstanding if verification has not completed.

- **Auth** A token for one organization
- **MCP** [verify-mail-domain](https://hollisapp.com/docs/mcp#tool-verify-mail-domain)

- PUT
- /api/organization/mail-settings

Updates the bound organization's mail settings.

- **Auth** A token for one organization
- **MCP** [update-organization-mail-settings](https://hollisapp.com/docs/mcp#tool-update-organization-mail-settings)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| postal\_address | body | string | no | The organization's physical postal address, shown in the footer of every announcement email as required by United States CAN-SPAM law. At least 10 characters. |
| announcement\_sender | body | string | no | The part before the @ that announcements are sent as, such as "info", on the organization's own sending domain (a full address on that domain is accepted). Only for an organization that set up its own domain; empty sends as "announcements". An address on any other domain is refused. |

- PUT
- /api/organization/payment-settings

Updates the bound organization's payment settings: refund approval, unpaid-registration hold duration, refund fees, the processing charge, and the default withdrawal terms (full-refund deadline and what is refunded after it).

- **Auth** A token for one organization
- **MCP** [update-organization-payment-settings](https://hollisapp.com/docs/mcp#tool-update-organization-payment-settings)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| refund\_requires\_approval | body | boolean | no | Whether a refund must be approved by a second organizer before it is sent. Defaults to true for every organization. |
| payment\_hold\_minutes | body | integer | no | How many minutes an unpaid registration holds its slot before the hold lapses. Must be at least 1. |
| refund\_keeps\_fees | body | boolean | no | Whether a refund keeps back Stripe's processing fee, so refunds never cost the organization money. On by default. Applies to payments made after the change; players are told before they pay. |
| pass\_on\_processing | body | boolean | no | Default for every program: whether the payer is charged Stripe's card processing fee as its own checkout line (true) or the organization absorbs it (false, the default). Stripe's full fee on the card total, so the organization receives the price. A program can differ. Applies to payments started from then on. |
| full\_refund\_days\_before\_first\_game | body | integer | no | Default for every program: a player may withdraw for a full refund, on their own, until this many days before the first game (0 to 365; 14 by default). After that only an organizer can withdraw them. A program can differ. Applies to registrations taken from then on; players are told before they pay. |
| after\_full\_refund\_window | body | string: "unplayed\_share", "none" | no | Default for every program: what a withdrawal after that deadline refunds — unplayed\_share (the share of the season not yet played, the default) or none. A program can differ. Applies to registrations taken from then on. |

- POST
- /api/organization/payments/connect

Starts connecting the organization's own Stripe account so it can take payments.

- **Auth** A token for one organization
- **MCP** [connect-payments](https://hollisapp.com/docs/mcp#tool-connect-payments)

- POST
- /api/organization/payments/disconnect

Disconnects the organization's Stripe account so it can be connected again from scratch (for example after signing in to the wrong Stripe login).

- **Auth** A token for one organization
- **MCP** [disconnect-payments](https://hollisapp.com/docs/mcp#tool-disconnect-payments)

- PUT
- /api/organization/profile

The organization's name, web address (slug — NAME.hollisapp.com; changeable only until its first program is published), sport (sports: a list from the fixed set; one unless multi\_sport is true — a label, it gates nothing) and time zone (an IANA name every game time is shown in).

- **Auth** A token for one organization
- **MCP** [update-organization-profile](https://hollisapp.com/docs/mcp#tool-update-organization-profile)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | no | At most 60 characters. |
| slug | body | string | no | Lowercase letters, numbers and hyphens, 3–30 characters. |
| timezone | body | string | no | An IANA time zone, e.g. America/New\_York. |
| sports | body | array of string | no | From: Soccer, Basketball, Volleyball, Softball, Hockey, Pickleball, Tennis, Flag football, Ultimate, Kickball, Other. |
| multi\_sport | body | boolean | no | true for several sports; false (the default) for exactly one. |

- PUT
- /api/organization/registration-settings

Whether the organization asks players their gender (asks\_gender; on by default, asked once and kept on the player, never collected when off), and whether a sub may play for more than one team in a program (subs\_multiple\_teams; on by default, one team only when off — never both sides of one game either way).

- **Auth** A token for one organization
- **MCP** [update-organization-registration-settings](https://hollisapp.com/docs/mcp#tool-update-organization-registration-settings)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| asks\_gender | body | boolean | no | true asks players their gender once and keeps it; false never collects it. |
| subs\_multiple\_teams | body | boolean | no | true lets a sub play for several teams in a program; false limits a sub to the one team they play or first subbed for. |

- GET
- /api/organization/tokens

Organization index.

**Auth** A token for one organization

- DELETE
- /api/organization/tokens/{id}

Organization destroy.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | integer | yes |  |

## Organizations

- POST
- /api/organizations

Creates a new organization owned by the connected user.

- **Auth** Any token of yours
- **MCP** [create-organization](https://hollisapp.com/docs/mcp#tool-create-organization)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the organization to create. |
| timezone | body | string | no | IANA timezone identifier for the organization, e.g. "America/New\_York". Every program and division registration window is interpreted in this zone. Defaults to UTC. |

- POST
- /api/organizations/{organization}/divisions/{division}/registrations

Registers the connected user for a division in the connected organization, accepting the current waiver.

- **Auth** Any token of yours
- **Limit** 10 a minute
- **MCP** [register-for-division](https://hollisapp.com/docs/mcp#tool-register-for-division)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| organization | path | string | yes | The organization's slug, as in its web address. |
| division | path | integer | yes |  |
| waiver\_accepted | body | boolean | yes | Must be true — confirms the connected user accepts the organization's current waiver. |
| signed\_name | body | string | yes | The full name the person types to sign the waiver, stored with the acceptance and printed on its record. Ask the person for it; never fill it in from their account. |
| program\_team\_id | body | integer | no | Optional. Joins this existing team instance of the same program. Mutually exclusive with team\_name. |
| team\_name | body | string | no | Optional. Creates a new team with this name and joins it. Mutually exclusive with program\_team\_id. Does not confer captaincy. |
| bring\_back\_program\_team\_id | body | integer | no | Optional. Bring back a team the connected user CAPTAINED in an earlier program here: the id of that earlier team instance. The team enters this program with them as captain (a different team\_name starts a new team instead). Refused for any team they did not captain. |
| bring\_back\_keep | body | array of integer | no | Optional, with bring\_back\_program\_team\_id. User ids of that earlier team's players to invite back; each gets their own invitation and joins only by accepting. Ids not on that team are ignored. |
| bring\_back\_add | body | array of string | no | Optional, with bring\_back\_program\_team\_id. New email addresses to invite to the team. |
| answers | body | array of object | no | Your answers to the program's registration questions. Questions you leave out keep your most recent earlier answer. |
| gender | body | string | no | woman, man, non\_binary or prefer\_not\_to\_say. Asked once and kept on your account; needed where the organization asks it and you have none on file. |

- POST
- /api/organizations/{organization}/subscriptions

Asks this organization to email an address when a program opens for registration in an area (a level-1 area includes its level-2 areas), or, with no area, when any of its programs opens.

- **Auth** None
- **Limit** 10 a minute
- **MCP** [subscribe-to-updates](https://hollisapp.com/docs/mcp#tool-subscribe-to-updates)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| organization | path | string | yes | The organization's slug, as in its web address. |
| email | body | string | yes | The address to email. Its owner must confirm before anything but the confirmation is sent. |
| area\_id | body | integer | no | An area of this organization (list-areas); a level-1 area includes its level-2 areas. Leave it out for any area: every program the organization opens is covered. |

## Organizer messages

- POST
- /api/organizer-messages

Writes a message to everyone on one team (to team), on every team in a division (to division), in a game (to game: both teams and its officials), to one member (to person), or to everyone in a current program plus staff (to organization).

- **Auth** A token for one organization
- **MCP** [send-organizer-message](https://hollisapp.com/docs/mcp#tool-send-organizer-message)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| to | body | string | no | team, division, game, person or organization. Omit when sending targets. |
| id | body | integer | no | The program team id (to team), division id (to division), game id (to game) or user id (to person); none for organization. |
| targets | body | array of object | no | Several recipients for one message, up to 50. Use instead of to and id. |
| body | body | string | yes | The message, up to 2000 characters. |

- GET
- /api/organizer-messages

Lists the organizers’ messages: box inbox (default) is what players and captains wrote to the organizers, each thread with its replies; box sent is what organizers wrote to a team, division or program.

- **Auth** A token for one organization
- **MCP** [organizer-messages](https://hollisapp.com/docs/mcp#tool-organizer-messages)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| box | query | string | no | inbox (default) or sent. Any other value is refused. |

## Payments

- GET
- /api/payments

Lists the connected organization's payments, newest first: invoice, payer, amount, status, what went back to a card (refunded\_cents) and as credit (credited\_cents), and what it was for.

- **Auth** A token for one organization
- **MCP** [list-payments](https://hollisapp.com/docs/mcp#tool-list-payments)

## Permits

- GET
- /api/permits

Lists permits in the connected organization, soonest to expire first.

- **Auth** A token for one organization
- **MCP** [list-permits](https://hollisapp.com/docs/mcp#tool-list-permits)

- PATCH
- /api/permits/{permit}

Sparse-updates a permit's valid\_to/days/start\_time/end\_time/status, and which of its location's fields it covers (sub\_location\_ids; an empty list = the whole location), in the connected organization.

- **Auth** A token for one organization
- **MCP** [update-permit](https://hollisapp.com/docs/mcp#tool-update-permit)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| permit | path | integer | yes |  |
| sub\_location\_ids | body | array of integer | no | Which of the location's fields the permit covers; an empty list = the whole location. Dropping a field is recorded as a narrowing. |
| valid\_to | body | string | no | The new expiry date (date string), strictly after valid\_from. |
| days | body | array of integer | no | The new set of weekdays this permit covers, as ISO weekday numbers: 1 is Monday through 7 is Sunday. English names are accepted too. |
| start\_time | body | string | no | The new daily start time, in H:i (24-hour) format. |
| end\_time | body | string | no | The new daily end time, in H:i (24-hour) format, strictly after start\_time. |
| status | body | string | no | The permit's status: approved, pending or not\_requested (default approved). Field time is usable only inside an approved or pending permit; games on a pending one are At risk; a not\_requested permit grants nothing. |

- GET
- /api/permits/{permit}

Returns full detail for one permit in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-permit](https://hollisapp.com/docs/mcp#tool-get-permit)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| permit | path | integer | yes |  |

- GET
- /api/permits/{permit}/change-events

Lists a permit's change events (edits that narrowed a previously-granted window), in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-permit-change-events](https://hollisapp.com/docs/mcp#tool-list-permit-change-events)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| permit | path | integer | yes |  |

## Placement offers

- POST
- /api/placement-offers/{placementOffer}/accept

Accepts or declines one of YOUR OWN placement offers (see my-placement-offers).

- **Auth** A token for one organization
- **MCP** [respond-to-placement-offer](https://hollisapp.com/docs/mcp#tool-respond-to-placement-offer)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| placementOffer | path | integer | yes |  |

- POST
- /api/placement-offers/{placementOffer}/decline

Accepts or declines one of YOUR OWN placement offers (see my-placement-offers).

- **Auth** A token for one organization
- **MCP** [respond-to-placement-offer](https://hollisapp.com/docs/mcp#tool-respond-to-placement-offer)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| placementOffer | path | integer | yes |  |

## Program invitations

- DELETE
- /api/program-invitations/{programInvitation}

Removes an invited email from an invite-only program: their link stops working and they can no longer register.

- **Auth** A token for one organization
- **MCP** [remove-program-invitation](https://hollisapp.com/docs/mcp#tool-remove-program-invitation)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programInvitation | path | integer | yes |  |

## Program teams

- DELETE
- /api/program-teams/{programTeam}

Removes a team's per-program instance from a program.

- **Auth** A token for one organization
- **MCP** [remove-program-team](https://hollisapp.com/docs/mcp#tool-remove-program-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |

- GET
- /api/program-teams/{programTeam}

Returns full detail for one per-program team instance in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-program-team](https://hollisapp.com/docs/mcp#tool-get-program-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |

- POST
- /api/program-teams/{programTeam}/auto-call-subs

Switches automatic sub calls on or off for one team.

- **Auth** A token for one organization
- **MCP** [set-auto-call-subs](https://hollisapp.com/docs/mcp#tool-set-auto-call-subs)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| on | body | boolean | yes | true to call the bench automatically at T-48h when short; false for the captain's tap only. |

- POST
- /api/program-teams/{programTeam}/bring-back

Invites players from last season's roster to the team you captain, each from you; every one answers for themselves and nobody is placed, paid or signed until they do.

- **Auth** A token for one organization
- **MCP** [bring-back-players](https://hollisapp.com/docs/mcp#tool-bring-back-players)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| user\_ids | body | array of integer | no | The players to invite, from list-bring-back-players. Omit to invite everyone offered. An id that is not offered is ignored and returned in not\_offered. |

- GET
- /api/program-teams/{programTeam}/bring-back

Lists the players the captain of a team could bring back from its last season: the people on the roster of the newest earlier season of the same team that this captain led, not already on a team in this program or invited to this one.

- **Auth** A token for one organization
- **MCP** [list-bring-back-players](https://hollisapp.com/docs/mcp#tool-list-bring-back-players)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |

- GET
- /api/program-teams/{programTeam}/candidate-members

Lists organization members who could be added to one program-team instance's roster in the connected organization — members not already rostered anywhere in that program.

- **Auth** A token for one organization
- **MCP** [list-candidate-members](https://hollisapp.com/docs/mcp#tool-list-candidate-members)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| players\_only | query | boolean | no | Optional. True leaves out members who hold the Owner, Admin or Staff role (you too, if you are one). Default false: organizers play, so they are listed, marked is\_staff. |

- POST
- /api/program-teams/{programTeam}/captain

Assigns or clears the captain of a per-program team instance in the connected organization.

- **Auth** A token for one organization
- **MCP** [assign-captain](https://hollisapp.com/docs/mcp#tool-assign-captain)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| captain\_user\_id | body | integer | no | The id of the organization member to make captain. Omit this field entirely to clear the current captaincy. |

- POST
- /api/program-teams/{programTeam}/co-captain

Names or clears the co-captain of a per-program team instance: a second full captain (roster, payment, results) for that one team.

- **Auth** A token for one organization
- **MCP** [assign-co-captain](https://hollisapp.com/docs/mcp#tool-assign-co-captain)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| co\_captain\_user\_id | body | integer | no | The id of the organization member to make co-captain. Omit this field entirely to clear the co-captaincy. |

- POST
- /api/program-teams/{programTeam}/messages

Writes a message for one of YOUR teams.

- **Auth** A token for one organization
- **MCP** [send-team-message](https://hollisapp.com/docs/mcp#tool-send-team-message)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| audience | body | string | yes | team, captains, player or organizers. |
| body | body | string | yes | The message, up to 2000 characters. |
| recipient\_user\_id | body | integer | no | For audience player: the player on your team. |
| share | body | boolean | no | For audience organizers: let the rest of the team see it. |

- POST
- /api/program-teams/{programTeam}/payment-choice

Chooses who pays for one team's entry.

- **Auth** A token for one organization
- **MCP** [choose-team-payment](https://hollisapp.com/docs/mcp#tool-choose-team-payment)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| captain\_pays | body | boolean | yes | true: the captain pays for the whole team; false: each player pays their share. |

- POST
- /api/program-teams/{programTeam}/registrations

Registers every player on a program-team instance's roster into a division of the connected organization.

- **Auth** A token for one organization
- **MCP** [register-team](https://hollisapp.com/docs/mcp#tool-register-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| division\_id | body | integer | yes | The id of the division to register the roster into. |

- POST
- /api/program-teams/{programTeam}/registrations/move

Moves every active registration on a program-team instance's roster to a different division of the SAME program, in one call.

- **Auth** A token for one organization
- **MCP** [move-team-registrations](https://hollisapp.com/docs/mcp#tool-move-team-registrations)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| division\_id | body | integer | yes | The id of the target division, within the same program as the roster's registrations. |

- POST
- /api/program-teams/{programTeam}/registrations/pay

Starts a bulk payment covering every payable registration on a program-team instance's roster, for one division, via a single Stripe-hosted Checkout Session.

- **Auth** A token for one organization
- **MCP** [pay-team-registrations](https://hollisapp.com/docs/mcp#tool-pay-team-registrations)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| division\_id | body | integer | yes | The id of the division these registrations belong to. |

- POST
- /api/program-teams/{programTeam}/resign

Resigns the caller's own captaincy (or co-captaincy) of a per-program team instance; they stay on the roster as a player.

- **Auth** A token for one organization
- **MCP** [resign-captaincy](https://hollisapp.com/docs/mcp#tool-resign-captaincy)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |

- POST
- /api/program-teams/{programTeam}/roster

Adds a player to one program-team instance's roster in the connected organization.

- **Auth** A token for one organization
- **MCP** [add-roster-player](https://hollisapp.com/docs/mcp#tool-add-roster-player)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| user\_id | body | integer | yes | The id of the user to add. Must already be a member of this organization. |

- GET
- /api/program-teams/{programTeam}/roster

Lists the players on one program-team instance's roster in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-roster](https://hollisapp.com/docs/mcp#tool-list-roster)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |

- DELETE
- /api/program-teams/{programTeam}/roster/{user}

Removes a player from a program-team instance's roster.

- **Auth** A token for one organization
- **MCP** [remove-roster-player](https://hollisapp.com/docs/mcp#tool-remove-roster-player)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| user | path | integer | yes |  |

- POST
- /api/program-teams/{programTeam}/roster/{user}/put-back

Puts a player who was removed from a team back on its roster, with the registration the removal cancelled (if it has not changed since) and the captain or co-captain role the removal cleared (if nobody holds it now).

- **Auth** A token for one organization
- **MCP** [put-back-roster-player](https://hollisapp.com/docs/mcp#tool-put-back-roster-player)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| user | path | integer | yes |  |

- POST
- /api/program-teams/{programTeam}/team-invitations

Issues a team invitation to one program-team instance's roster in the connected organization.

- **Auth** A token for one organization
- **Limit** 10 an hour per team
- **MCP** [invite-to-team](https://hollisapp.com/docs/mcp#tool-invite-to-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| email | body | string | yes | The email address to invite. |
| name | body | string | no | Optional. The invitee's name, up to 120 characters, kept with the invitation as a label until it is accepted. The roster still shows the address you invited (D-207). |

- GET
- /api/program-teams/{programTeam}/team-invitations

Lists the invitations sent to join a team, for one program (program\_id) or one team (program\_team\_id): who was invited, whether it is pending, accepted, cancelled or expired, and when.

- **Auth** A token for one organization
- **MCP** [list-team-invitations](https://hollisapp.com/docs/mcp#tool-list-team-invitations)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| status | query | string | no | Narrow to one status: pending, accepted, cancelled, expired. |

- DELETE
- /api/program-teams/{programTeam}/team-invitations/{teamInvitation}

Takes back an invitation to a program-team instance's roster that nobody has accepted; its link stops working.

- **Auth** A token for one organization
- **MCP** [cancel-team-invitation](https://hollisapp.com/docs/mcp#tool-cancel-team-invitation)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| teamInvitation | path | integer | yes |  |

- POST
- /api/program-teams/{programTeam}/waitlist

Moves a team off its spot in a division and back onto that division's wait list, freeing the spot.

- **Auth** A token for one organization
- **MCP** [move-team-to-waitlist](https://hollisapp.com/docs/mcp#tool-move-team-to-waitlist)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTeam | path | integer | yes |  |
| division\_id | body | integer | yes | The division whose spot it gives up. |

## Program templates

- POST
- /api/program-templates

Creates a reusable program template in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-program-template](https://hollisapp.com/docs/mcp#tool-create-program-template)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the template to create, as an organizer would recognise it — for example "7v7 Coed". |
| players\_on\_field | body | integer | no | How many players each side fields at once: the 7 in "7v7". |
| max\_teams | body | integer | no | The maximum number of TEAMS. It is a team count: a program created from this template stores it on that program's default division, beside the division's capacity, which counts player slots and is a different number. Omit for no team maximum. |
| roster\_min | body | integer | no | The minimum number of players on a team roster. A program created from this template derives it from players\_on\_field when the template names none. |
| max\_players\_per\_team | body | integer | no | The maximum roster size. Omit for no maximum; do not send 0 to mean that. |
| game\_periods | body | integer | no | How many periods a game is played in. |
| game\_period\_minutes | body | integer | no | How many minutes each period lasts. |
| game\_break\_minutes | body | integer | no | How many minutes of break sit between periods. |
| men\_allowed | body | boolean | no | Whether men may play. Defaults to true. |
| men\_min\_on\_field | body | integer | no | The minimum number of men required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule. |
| women\_allowed | body | boolean | no | Whether women may play. Defaults to true. |
| women\_min\_on\_field | body | integer | no | The minimum number of women required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule. |
| fee\_cents | body | integer | no | The registration fee in CENTS, not in currency units — 5000 is fifty dollars. |
| registration\_opens\_weeks\_before | body | integer | no | How many weeks BEFORE the first game registration opens. A template holds no dates at all, only this offset; the anchor date is supplied on the program at create time. May be negative, which means registration opens after the season has started. |
| registration\_closes\_days\_before | body | integer | no | How many days BEFORE the first game registration closes. A template holds no dates at all, only this offset; the anchor date is supplied on the program at create time. May be negative, which means late entry is accepted after the season has started. |
| weeks\_of\_play | body | integer | no | How many weeks of regular season are played. |
| playoff\_weeks | body | integer | no | How many weeks of playoffs are played. Omit for a season with no playoffs at all; 0 means a playoffs period of no length, which is a different fact. |
| settings | body | object | no | The long tail of authored settings that no screen renders — officials per kind and their rates, points and tiebreakers, custom-field ids. Nothing here is filterable or sortable; a fact that needs to be either is a column, not a settings key. |

- GET
- /api/program-templates

Lists the reusable program templates in the connected organization, optionally filtered by format, gender or length.

- **Auth** A token for one organization
- **MCP** [list-program-templates](https://hollisapp.com/docs/mcp#tool-list-program-templates)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| format | query | integer | no | Keep only templates whose players\_on\_field equals this exactly — the 7 in "7v7". Omit for any format. |
| gender | query | string | no | One of "coed", "mens" or "womens". Reads the two allowed-to-play booleans; omit for any gender. |
| length | query | integer | no | Keep only templates whose weeks\_of\_play equals this exactly. Omit for any length. |
| sort | query | string | no | One of "name", "players\_on\_field", "fee\_cents", "weeks\_of\_play" or "created\_at". Defaults to name. Gender is deliberately not sortable — it is two columns, not one. |

- PATCH
- /api/program-templates/{programTemplate}

Edits an existing program template in the connected organization.

- **Auth** A token for one organization
- **MCP** [update-program-template](https://hollisapp.com/docs/mcp#tool-update-program-template)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTemplate | path | integer | yes |  |
| name | body | string | no | A new name for the template. Renaming does NOT change the template's slug, which stays the durable public identifier. |
| players\_on\_field | body | integer | no | How many players each side fields at once: the 7 in "7v7". |
| max\_teams | body | integer | no | The maximum number of TEAMS. It is a team count: a program created from this template stores it on that program's default division, beside the division's capacity, which counts player slots and is a different number. Omit for no team maximum. |
| roster\_min | body | integer | no | The minimum number of players on a team roster. A program created from this template derives it from players\_on\_field when the template names none. |
| max\_players\_per\_team | body | integer | no | The maximum roster size. Omit for no maximum; do not send 0 to mean that. |
| game\_periods | body | integer | no | How many periods a game is played in. |
| game\_period\_minutes | body | integer | no | How many minutes each period lasts. |
| game\_break\_minutes | body | integer | no | How many minutes of break sit between periods. |
| men\_allowed | body | boolean | no | Whether men may play. Defaults to true. |
| men\_min\_on\_field | body | integer | no | The minimum number of men required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule. |
| women\_allowed | body | boolean | no | Whether women may play. Defaults to true. |
| women\_min\_on\_field | body | integer | no | The minimum number of women required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule. |
| fee\_cents | body | integer | no | The registration fee in CENTS, not in currency units — 5000 is fifty dollars. |
| registration\_opens\_weeks\_before | body | integer | no | How many weeks BEFORE the first game registration opens. A template holds no dates at all, only this offset; the anchor date is supplied on the program at create time. May be negative, which means registration opens after the season has started. |
| registration\_closes\_days\_before | body | integer | no | How many days BEFORE the first game registration closes. A template holds no dates at all, only this offset; the anchor date is supplied on the program at create time. May be negative, which means late entry is accepted after the season has started. |
| weeks\_of\_play | body | integer | no | How many weeks of regular season are played. |
| playoff\_weeks | body | integer | no | How many weeks of playoffs are played. Omit for a season with no playoffs at all; 0 means a playoffs period of no length, which is a different fact. |
| settings | body | object | no | The long tail of authored settings that no screen renders — officials per kind and their rates, points and tiebreakers, custom-field ids. Nothing here is filterable or sortable; a fact that needs to be either is a column, not a settings key. |

- DELETE
- /api/program-templates/{programTemplate}

Removes a program template from the connected organization.

- **Auth** A token for one organization
- **MCP** [delete-program-template](https://hollisapp.com/docs/mcp#tool-delete-program-template)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTemplate | path | integer | yes |  |

- GET
- /api/program-templates/{programTemplate}

Get one of program templates.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTemplate | path | integer | yes |  |

- POST
- /api/program-templates/{programTemplate}/programs

Creates a new program from a program template in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-program-from-template](https://hollisapp.com/docs/mcp#tool-create-program-from-template)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| programTemplate | path | integer | yes |  |
| name | body | string | yes | The name of the program to create. Required: a template states a shape, not a season, so the new program is never named for you. |
| description | body | string | no | An optional description of the program. A template carries none — it is prose about one season. |
| first\_game\_on | body | string | no | The date of the first game, as YYYY-MM-DD. This is the ANCHOR a template deliberately does not hold: supplying it together with the template's registration offsets DERIVES opens\_at and closes\_at, and the derived value wins over an opens\_at or closes\_at sent in the same call. |
| opens\_at | body | string | no | When registration opens. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the start of that day there. |
| closes\_at | body | string | no | When registration closes, and it must fall strictly after opens\_at once both are resolved. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the END of that day (23:59:59) there. |
| game\_days | body | array of integer | no | The days of the week games are played on, as ISO weekday numbers: 1 is Monday through 7 is Sunday. A template carries none — the weekday a season plays on is a fact about that season. |
| fee\_cents | body | integer | no | The registration fee in CENTS, not in currency units. Omit to keep the template's fee. |
| weeks\_of\_play | body | integer | no | Overrides the template's weeks of regular season. |
| playoff\_weeks | body | integer | no | Overrides the template's weeks of playoffs. |
| registration\_opens\_weeks\_before | body | integer | no | Overrides how many weeks before the first game registration opens. May be negative. Ignored when there is no first\_game\_on to measure from. |
| registration\_closes\_days\_before | body | integer | no | Overrides how many days before the first game registration closes. May be negative. Ignored when there is no first\_game\_on to measure from. |
| players\_on\_field | body | integer | no | Overrides how many players each side fields at once: the 7 in "7v7". |
| roster\_min | body | integer | no | Overrides the minimum number of players on a team roster. |
| max\_players\_per\_team | body | integer | no | Overrides the maximum roster size. |
| max\_teams | body | integer | no | Overrides the maximum number of TEAMS. Stored on the new program's default division, beside its capacity, which counts player slots and is a different number. |
| game\_periods | body | integer | no | Overrides how many periods a game is played in. |
| game\_period\_minutes | body | integer | no | Overrides how many minutes each period lasts. |
| game\_break\_minutes | body | integer | no | Overrides how many minutes of break sit between periods. |
| men\_allowed | body | boolean | no | Overrides whether men may play. |
| men\_min\_on\_field | body | integer | no | Overrides the minimum number of men required on the field. 0 is a requirement of none, which is a different rule from no requirement at all. |
| women\_allowed | body | boolean | no | Overrides whether women may play. |
| women\_min\_on\_field | body | integer | no | Overrides the minimum number of women required on the field. 0 is a requirement of none, which is a different rule from no requirement at all. |

## Programs

- POST
- /api/programs

Creates a new program (season) in the connected organization, starting in draft visibility.

- **Auth** A token for one organization
- **MCP** [create-program](https://hollisapp.com/docs/mcp#tool-create-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the program to create. |
| description | body | string | no | An optional description of the program. |
| opens\_at | body | string | no | When registration opens. Any value WITHOUT an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the start of that day there. Supply a trailing Z or +HH:MM to name an absolute instant instead. |
| closes\_at | body | string | no | When registration closes, and it must fall strictly after opens\_at once both are resolved. Any value WITHOUT an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the END of that day (23:59:59) there, not UTC midnight. Supply a trailing Z or +HH:MM to name an absolute instant instead. |
| first\_game\_on | body | string | no | The date of the first game, as YYYY-MM-DD. This is the ANCHOR: supplying it together with registration\_opens\_weeks\_before or registration\_closes\_days\_before DERIVES opens\_at / closes\_at from it, and the derived value wins over an opens\_at or closes\_at sent in the same call. |
| weeks\_of\_play | body | integer | no | How many weeks of regular season are played. Omitted, with max\_teams sent: the weeks a full round robin at max\_teams needs, one round a week. |
| playoff\_weeks | body | integer | no | How many weeks of playoffs are played. Omit for a season with no playoffs at all; 0 means a playoffs period of no length, which is a different fact. |
| registration\_opens\_weeks\_before | body | integer | no | How many weeks before the first game registration opens. May be negative, which means registration opens after the season has started. Ignored when there is no first\_game\_on to measure from. |
| registration\_closes\_days\_before | body | integer | no | How many days before the first game registration closes. May be negative, which means late entry is accepted after the season has started. Ignored when there is no first\_game\_on to measure from. |
| game\_days | body | array of integer | no | The days of the week games are played on, as ISO weekday numbers: 1 is Monday through 7 is Sunday. Every week is played on every day listed. |
| game\_day\_hours | body | object | no | The window games may be played in on each game day, keyed by ISO weekday (1 Monday .. 7 Sunday): {"2": {"from": "18:00", "to": "22:00"}}. Times are HH:MM, to after from. |
| players\_on\_field | body | integer | no | How many players each side fields at once: the 7 in "7v7". |
| roster\_min | body | integer | no | The minimum number of players on a team roster. Defaults to players\_on\_field plus two when omitted. |
| max\_players\_per\_team | body | integer | no | The maximum roster size. Omit for no maximum; do not send 0 to mean that. |
| max\_teams | body | integer | no | The maximum number of TEAMS. Stored on the program's default division, beside its capacity, which counts player slots and is a different number. Omit for no team maximum. |
| game\_periods | body | integer | no | How many periods a game is played in. |
| game\_period\_minutes | body | integer | no | How many minutes each period lasts. |
| game\_break\_minutes | body | integer | no | How many minutes of break sit between periods. |
| men\_allowed | body | boolean | no | Whether men may play. Defaults to true. |
| men\_min\_on\_field | body | integer | no | The minimum number of men required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule. |
| women\_allowed | body | boolean | no | Whether women may play. Defaults to true. |
| women\_min\_on\_field | body | integer | no | The minimum number of women required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule. |

- GET
- /api/programs

Lists programs in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-programs](https://hollisapp.com/docs/mcp#tool-list-programs)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| archived | query | boolean | no | true lists the archived programs instead of the others, so one can be brought back with unarchive-program. |

- PATCH
- /api/programs/{program}

Updates a program's name, description, registration window or season shape, or flips its early-close switch.

- **Auth** A token for one organization
- **MCP** [update-program](https://hollisapp.com/docs/mcp#tool-update-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| name | body | string | no | The new name of the program. |
| description | body | string | no | The new description of the program. |
| opens\_at | body | string | no | When registration opens. Any value WITHOUT an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the start of that day there. Supply a trailing Z or +HH:MM to name an absolute instant instead. To open registration now, ahead of its window, send the current time (the program page's "Open registration now"). |
| closes\_at | body | string | no | When registration closes, and it must fall strictly after opens\_at once both are resolved. Any value WITHOUT an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the END of that day (23:59:59) there, not UTC midnight. Supply a trailing Z or +HH:MM to name an absolute instant instead. |
| registration\_manually\_closed | body | boolean | no | Set true to close registration early without changing the program's visibility or dates — set back to false to reopen it just as cheaply. |
| fee\_cents | body | integer | no | Registration fee in cents. Omit to leave unchanged; pass null to clear the fee. |
| full\_refund\_days\_before\_first\_game | body | integer | no | How many days before the first game a registrant can still withdraw for a FULL refund. Until then the registrant can withdraw on their own; after it only an organizer can. 0 means a full refund right up to the first game; pass null to use the organization's default (14 days unless the organization changed it). Editable after publish, like every field — an organizer may extend a refund window mid-season, and a registrant is protected by the terms snapshotted onto their registration at hold. |
| after\_full\_refund\_window | body | string | no | What a registrant gets when they withdraw AFTER the full-refund window closes. Exactly one of: unplayed\_share (the share of the season not yet played) or none (no refund). Pass null to use the organization's default. Editable after publish, like every field. |
| game\_gap\_minutes | body | integer | no | Minutes between one game ending and the next starting on the same field. Field time for a game is its length plus this; the schedule assumes 15 until set. Pass null to go back to that default. Editable after publish. |
| playoff\_cut | body | string | no | Who reaches the playoffs. Exactly one of: top\_4, top\_2, all. Unset reads as top\_4. Editable after publish. |
| early\_bird\_fee\_cents | body | integer | no | The early-bird price per player, in cents; must be lower than fee\_cents. It applies to divisions that use the program fee, from registration opening until early\_bird\_weeks later. Pass null to remove it. Editable after publish. |
| early\_bird\_weeks | body | integer | no | How many weeks after registration opens the early-bird price lasts (1-52). Pass null to clear. |
| rsvp\_reminders | body | boolean | no | Whether Hollis sends RSVP asks: 96 hours before each published game, then chases at 48 and 24 hours to players who have not answered. On by default; false turns it off for this program. Editable after publish. |
| payment\_reminders | body | boolean | no | Whether Hollis sends payment reminders: weekly to a registrant while their price is above zero and unpaid. On by default; false turns it off for this program. Editable after publish. |
| waiver\_reminders | body | boolean | no | Whether Hollis sends waiver reminders: weekly to a registrant until the waiver is accepted. On by default; false turns it off for this program. Editable after publish. |
| roster\_reminders | body | boolean | no | Whether Hollis sends roster-short reminders: weekly to a captain whose roster is below the minimum, until the season starts. On by default; false turns it off for this program. Editable after publish. |
| game\_reminders | body | boolean | no | Whether Hollis sends a game reminder: an email to every rostered player the day before each published game. On by default; false turns it off for this program. Editable after publish. |
| sub\_fee\_cents | body | integer | no | What a substitute pays for one game, in cents, overriding the derived fee (half a player's fee divided by the weeks of play). 0 makes subs free. Pass null to go back to the derived fee. A sub call already made keeps the fee it was made with. |
| pass\_on\_processing | body | boolean | no | Whether the payer is charged Stripe's card processing fee as its own checkout line (true), or the organization absorbs it (false). Stripe's full fee on the card total, so the organization receives the price. null = the organization's default. Applies to payments started from then on. |
| draws\_allowed | body | boolean | no | Results: true for wins, draws and losses (3/1/0, the default); false for wins and losses only, which standings show as W / L / Pct. Editable after publish. |
| questions | body | array of object | no | The questions the program asks, as the WHOLE ordered list (it replaces what is stored; \[\] asks none). Editable after publish; whoever registers next is asked. |
| waiver\_id | body | integer | no | The id of one of the organization's waivers (list-waivers) that registrants accept. Pass null to use the organization's default waiver. Editable after publish; whoever registers next accepts it. |
| no\_game\_days | body | array of object | no | The weeks with no games, as the WHOLE list (it replaces what is stored; pass null or \[\] to clear). Each date must be a date the program plays on, and each pushes the season end out a week. Editable after publish. |
| first\_game\_on | body | string | no | The date of the first game, as YYYY-MM-DD. This is the ANCHOR: changing it RE-DERIVES opens\_at and closes\_at from the program's stored registration offsets. Editable after publish; a committed schedule that no longer fits is flagged, not moved. |
| weeks\_of\_play | body | integer | no | How many weeks of regular season are played. Editable after publish. |
| playoff\_weeks | body | integer | no | How many weeks of playoffs are played; 0 means a playoffs period of no length, which is a different fact from having none. |
| registration\_opens\_weeks\_before | body | integer | no | How many weeks before the first game registration opens; may be negative. Changing it re-derives opens\_at. Editable after publish. |
| registration\_closes\_days\_before | body | integer | no | How many days before the first game registration closes; may be negative. Changing it re-derives closes\_at. Editable after publish. |
| game\_days | body | array of integer | no | The days of the week games are played on, as ISO weekday numbers: 1 is Monday through 7 is Sunday. |
| game\_day\_hours | body | object | no | The window games may be played in on each game day, keyed by ISO weekday (1 Monday .. 7 Sunday): {"2": {"from": "18:00", "to": "22:00"}}. Times are HH:MM, to after from. Games go only where these hours overlap field time inside an Approved or Pending permit. |
| sub\_location\_ids | body | array of integer | no | The fields the program plays on, by id, as the WHOLE set — it replaces what is stored; \[\] clears it. Picked from the organization's existing fields; field time is booked when the schedule is generated. Editable after publish. |
| players\_on\_field | body | integer | no | How many players each side fields at once: the 7 in "7v7". |
| roster\_min | body | integer | no | The minimum number of players on a team roster. |
| max\_players\_per\_team | body | integer | no | The maximum roster size; omit for no maximum rather than sending 0. |
| game\_periods | body | integer | no | How many periods a game is played in. |
| game\_period\_minutes | body | integer | no | How many minutes each period lasts. |
| game\_break\_minutes | body | integer | no | How many minutes of break sit between periods. |
| men\_allowed | body | boolean | no | Whether men may play. |
| men\_min\_on\_field | body | integer | no | The minimum number of men required on the field; 0 is a requirement of none, which is a different rule from having no requirement. |
| women\_allowed | body | boolean | no | Whether women may play. |
| women\_min\_on\_field | body | integer | no | The minimum number of women required on the field; 0 is a requirement of none, which is a different rule from having no requirement. |

- DELETE
- /api/programs/{program}

Deletes a program (soft delete — nothing is permanently destroyed by this tool, but no restore surface exists in this phase).

- **Auth** A token for one organization
- **MCP** [delete-program](https://hollisapp.com/docs/mcp#tool-delete-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- GET
- /api/programs/{program}

Returns full detail for one program in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-program](https://hollisapp.com/docs/mcp#tool-get-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- GET
- /api/programs/{program}/allocations

Lists every block of location time allocated to a program, across every location in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-program-inventory](https://hollisapp.com/docs/mcp#tool-list-program-inventory)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- POST
- /api/programs/{program}/archive

Archives a program, hiding it from default lists and closing its registration gate.

- **Auth** A token for one organization
- **MCP** [archive-program](https://hollisapp.com/docs/mcp#tool-archive-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- PUT
- /api/programs/{program}/complete

Marks a published program Complete by hand (complete: true), overriding the status worked out from its games, or clears that mark (complete: false) so the status is worked out again.

- **Auth** A token for one organization
- **MCP** [mark-program-complete](https://hollisapp.com/docs/mcp#tool-mark-program-complete)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| complete | body | boolean | yes | true marks it Complete by hand; false clears the mark. |

- POST
- /api/programs/{program}/copies

Copies an existing program in the connected organization into a new one, carrying its season shape, divisions structure, fee and roster rules.

- **Auth** A token for one organization
- **MCP** [copy-program](https://hollisapp.com/docs/mcp#tool-copy-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| name | body | string | no | The name of the new program. Omit to have one composed from the source program's name. |
| description | body | string | no | A description for the new program. Omit to carry the source program's own description. |
| first\_game\_on | body | string | no | The date of the new season's first game, as YYYY-MM-DD. This is the ANCHOR a copy does not carry: registration opens\_at and closes\_at are DERIVED from it plus the carried registration offsets, never copied from the source season, whose instants are already in the past. |
| registration\_opens\_weeks\_before | body | integer | no | Overrides how many weeks before the first game registration opens. May be negative. Omit to carry the source program's own offset. Ignored when there is no first\_game\_on to measure from. |
| registration\_closes\_days\_before | body | integer | no | Overrides how many days before the first game registration closes. May be negative. Omit to carry the source program's own offset. Ignored when there is no first\_game\_on to measure from. |
| parts | body | array of string: "format", "divisions", "game\_days", "fees", "questions" | no | Which groups to bring over: any of format, divisions, game\_days, fees. Omit to bring all of them. The name, description, weeks of play and registration offsets always come; registrants, teams, games and results never do. Without divisions the copy gets one default division; without fees its divisions carry no price of their own. |

- POST
- /api/programs/{program}/discount-codes

Makes a shared discount code for one program (design-v2 D-103), e.g.

- **Auth** A token for one organization
- **MCP** [create-discount-code](https://hollisapp.com/docs/mcp#tool-create-discount-code)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| code | body | string | yes | 3 to 32 letters, digits, dashes or underscores; stored upper-case. |
| percent\_off | body | integer | no | 1 to 100. Give this or amount\_off\_cents, not both. |
| amount\_off\_cents | body | integer | no | An amount off in cents. Give this or percent\_off, not both. |
| description | body | string | no | Why it exists, shown on the invoice (e.g. "sibling discount"). |
| max\_uses | body | integer | no | How many registrations may use it. Left out: no limit, or 1 when only\_for\_email is given. |
| expires\_at | body | string | no | ISO 8601; after this it cannot be applied. |
| first\_time\_only | body | boolean | no | Only for players who have never held a place in another program of this organization. |
| once\_per\_person | body | boolean | no | Each person may use it on one registration only. |
| only\_for\_email | body | string | no | Only the person signed in with this email may use it, once unless max\_uses says otherwise; leave it out for anyone holding the code. |

- GET
- /api/programs/{program}/discount-codes

Lists a program's shared discount codes (design-v2 D-103): each code, what it takes off, how many times it has been used, its cap, expiry and whether it was withdrawn.

- **Auth** A token for one organization
- **MCP** [list-discount-codes](https://hollisapp.com/docs/mcp#tool-list-discount-codes)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- POST
- /api/programs/{program}/divisions

Creates a division (age group or skill tier) within a program in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-division](https://hollisapp.com/docs/mcp#tool-create-division)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| name | body | string | yes | The name of the division to create. |
| type | body | string | yes | Either "age\_group" or "skill\_tier". |
| max\_teams | body | integer | no | Maximum number of TEAMS in this division (D-55): a team takes one place however many players it has, and a free agent takes none until placed in a team. Omit or pass null for no maximum. |
| men\_allowed | body | boolean | no | Whether men may play in this division (D-31, D-37). Omit or null to follow the program's rule. A division plays as Coed, Men's or Women's; it must let men, women or both play. |
| women\_allowed | body | boolean | no | Whether women may play in this division. Omit or null to follow the program's rule. |
| players\_on\_field | body | integer | no | Players a side in this division (D-31). Omit or null to follow the program. |
| women\_min\_on\_field | body | integer | no | Women required on field at once in this division. Omit or null to follow the program. |
| men\_min\_on\_field | body | integer | no | Men required on field at once in this division. Omit or null to follow the program. |
| roster\_min | body | integer | no | Fewest players on a team's roster in this division. Omit or null to follow the program (or players a side + 2 when this division sets its own players a side). |
| max\_players\_per\_team | body | integer | no | Most players on a team's roster in this division. Omit or null to follow the program. |
| accepts\_teams | body | boolean | no | Whether teams can sign up for this division (D-42). Defaults to true. |
| accepts\_free\_agents | body | boolean | no | Whether free agents (individual players with no team) can sign up for this division (D-42). Defaults to true. |
| opens\_at | body | string | no | When registration opens for this division. Omit to fall back to the program's own opens\_at. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the start of that day there. |
| closes\_at | body | string | no | When registration closes for this division, and it must fall strictly after opens\_at once both are resolved. Omit to fall back to the program's own closes\_at. A value without an explicit UTC offset is read as a wall-clock time in the organization's own timezone; a bare YYYY-MM-DD date means the END of that day (23:59:59) there. |
| sort\_order | body | integer | no | Display order among the program's divisions. Defaults to 0. |

- GET
- /api/programs/{program}/divisions

Lists divisions within a program in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-divisions](https://hollisapp.com/docs/mcp#tool-list-divisions)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- POST
- /api/programs/{program}/game-staff

Assigns a referee (role official) or a crew member (role crew) to one or more games of a program, or clears that role when neither user\_id nor organization\_official\_id is given.

- **Auth** A token for one organization
- **MCP** [assign-game-staff](https://hollisapp.com/docs/mcp#tool-assign-game-staff)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| game\_ids | body | array of integer | yes | The games to staff (1-500), all in this program. |
| role | body | string | yes | official or crew. |
| user\_id | body | integer | no | The member to assign; they must hold "Can be assigned as referee" (official) or "Can be assigned as crew" (crew). |
| organization\_official\_id | body | integer | no | Instead of user\_id: the official row of the member to assign. Give neither to clear the role on those games. |
| confirm\_overlap | body | boolean | no | Send true to assign anyway after a validation error said the person already works an overlapping game. |

- POST
- /api/programs/{program}/invitations

Invites email addresses to register for an invite-only program; each gets an email with their own link, and only invited addresses can register.

- **Auth** A token for one organization
- **Limit** 500 invitations an hour per program
- **MCP** [invite-to-program](https://hollisapp.com/docs/mcp#tool-invite-to-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| emails | body | array of string | yes | Email addresses to invite. |
| division\_id | body | integer | no | Optional. Invite them to join this division of the program as free agents (works on an open program). Without it, the program must be invite only. |

- GET
- /api/programs/{program}/invitations

Lists who is invited to an invite-only program, and whether each has registered yet.

- **Auth** A token for one organization
- **MCP** [list-program-invitations](https://hollisapp.com/docs/mcp#tool-list-program-invitations)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- POST
- /api/programs/{program}/messages

Writes a message to everyone on a program’s teams: it shows in each player’s Messages under Program and is emailed.

- **Auth** A token for one organization
- **MCP** [send-program-message](https://hollisapp.com/docs/mcp#tool-send-program-message)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| body | body | string | yes | The message, up to 2000 characters. |

- POST
- /api/programs/{program}/program-templates

Saves an existing program's shape as a reusable program template.

- **Auth** A token for one organization
- **MCP** [save-program-as-template](https://hollisapp.com/docs/mcp#tool-save-program-as-template)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| name | body | string | no | A name for the new template. Omit to reuse the program's own name. |

- POST
- /api/programs/{program}/publish

Publishes a draft program to public or unlisted visibility, opening it up to accept registrations.

- **Auth** A token for one organization
- **MCP** [publish-program](https://hollisapp.com/docs/mcp#tool-publish-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| visibility | body | string | yes | Either "public" (listed and open to anyone) or "unlisted" (fully live and accepts registration, but omitted from listings — reachable only by direct link). |

- POST
- /api/programs/{program}/teams

Enters a persisted team into a program in the connected organization, creating a per-program team instance.

- **Auth** A token for one organization
- **MCP** [enter-program](https://hollisapp.com/docs/mcp#tool-enter-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| team\_id | body | integer | yes | The id of the persisted team to enter. |

- GET
- /api/programs/{program}/teams

Lists teams entered into a program in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-program-teams](https://hollisapp.com/docs/mcp#tool-list-program-teams)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- POST
- /api/programs/{program}/unarchive

Brings an archived program back as a draft: nothing is open to players until it is published again.

- **Auth** A token for one organization
- **MCP** [unarchive-program](https://hollisapp.com/docs/mcp#tool-unarchive-program)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |

- PUT
- /api/programs/{program}/visibility

Sets who can see a program's page: "public" (listed on the organization's page) or "unlisted" (anyone with the link).

- **Auth** A token for one organization
- **MCP** [set-program-visibility](https://hollisapp.com/docs/mcp#tool-set-program-visibility)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program | path | integer | yes |  |
| visibility | body | string | yes | "public", "unlisted", or "invite\_only" (only invited emails may register; invite them with invite-to-program). |

## Registration questions

- POST
- /api/registration-questions

Adds a question to the organization's registration library.

- **Auth** A token for one organization
- **MCP** [create-registration-question](https://hollisapp.com/docs/mcp#tool-create-registration-question)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| label | body | string | yes | The question as players read it, unique in the organization. |
| answer\_type | body | string | no | choice (pick one), several (pick several), text, long\_text, number, phone, email, yes\_no or date. |
| options | body | array of string | no | Two or more answers to pick from (choice or several only); null otherwise. |

- GET
- /api/registration-questions

Lists the organization's registration question library: id, label, answer\_type (choice (pick one), several (pick several), text, long\_text, number, phone, email, yes\_no or date), options (a choice's or several's answers; null otherwise) and retired (a program can't pick a retired question).

- **Auth** A token for one organization
- **MCP** [list-registration-questions](https://hollisapp.com/docs/mcp#tool-list-registration-questions)

- PATCH
- /api/registration-questions/{question}

Rewords a library question, changes its answer\_type (choice (pick one), several (pick several), text, long\_text, number, phone, email, yes\_no or date) or its options, or retires it (retired true) or brings it back (false).

- **Auth** A token for one organization
- **MCP** [update-registration-question](https://hollisapp.com/docs/mcp#tool-update-registration-question)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| question | path | integer | yes |  |
| label | body | string | no | New wording, unique in the organization. |
| answer\_type | body | string | no | choice (pick one), several (pick several), text, long\_text, number, phone, email, yes\_no or date. Moving to a type without options (anything but choice or several) drops its options. |
| options | body | array of string | no | A choice's or several's answers, two or more; null otherwise. |
| retired | body | boolean | no | true retires it, false brings it back. |

## Registrations

- GET
- /api/registrations

Lists registrations in the connected organization, optionally filtered by program\_id, division\_id, or status.

- **Auth** A token for one organization
- **MCP** [list-registrations](https://hollisapp.com/docs/mcp#tool-list-registrations)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| program\_id | query | integer | no | Narrow to registrations in this program. |
| division\_id | query | integer | no | Narrow to registrations in this division. |
| status | query | string | no | Narrow to registrations with this status (pending\_waiver, registered, waitlisted, cancelled). Any other value is refused. |

- DELETE
- /api/registrations/{registration}

Cancels a registration.

- **Auth** A token for one organization
- **MCP** [cancel-registration](https://hollisapp.com/docs/mcp#tool-cancel-registration)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |

- GET
- /api/registrations/{registration}

Returns full detail for one registration in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-registration](https://hollisapp.com/docs/mcp#tool-get-registration)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |

- POST
- /api/registrations/{registration}/accept-waiver

Accepts the connected user's own waiver for one of their pending registrations, completing it.

- **Auth** A token for one organization
- **MCP** [accept-waiver](https://hollisapp.com/docs/mcp#tool-accept-waiver)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| signed\_name | body | string | yes | The full name the person types to sign the waiver, stored with the acceptance and printed on its record. Ask the person for it; never fill it in from their account. |
| answers | body | array of object | no | Your answers to the program's registration questions. Questions you leave out keep your most recent earlier answer. |
| gender | body | string | no | woman, man, non\_binary or prefer\_not\_to\_say. Asked once and kept on your account; needed where the organization asks it and you have none on file. |

- PUT
- /api/registrations/{registration}/answers

Changes the connected user's own answers to a program's registration questions, and their gender, on one of their registrations.

- **Auth** A token for one organization
- **MCP** [update-my-registration-answers](https://hollisapp.com/docs/mcp#tool-update-my-registration-answers)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| answers | body | array of object | no | Your answers to the program's registration questions. Questions you leave out keep your most recent earlier answer. |
| gender | body | string | no | woman, man, non\_binary or prefer\_not\_to\_say. Asked once and kept on your account; needed where the organization asks it and you have none on file. |

- POST
- /api/registrations/{registration}/discount-code

Applies a shared discount code to the caller's own unpaid registration (design-v2 D-103), lowering what pay-registration will charge.

- **Auth** A token for one organization
- **MCP** [apply-discount-code](https://hollisapp.com/docs/mcp#tool-apply-discount-code)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| code | body | string | yes | The code, as given by the organizer. |

- POST
- /api/registrations/{registration}/move

Moves the connected caller's own registration — or, for an organizer, any registration in this organization — to a different division of the SAME program.

- **Auth** A token for one organization
- **MCP** [move-registration](https://hollisapp.com/docs/mcp#tool-move-registration)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| division\_id | body | integer | yes | The id of the target division, within the same program as the registration. |

- POST
- /api/registrations/{registration}/move-offers

Offers a player who is on a team a move to another team of the program, in their division or another.

- **Auth** A token for one organization
- **MCP** [offer-team-move](https://hollisapp.com/docs/mcp#tool-offer-team-move)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| program\_team\_id | body | integer | yes | The team to offer to move them to, in their division or another. |

- POST
- /api/registrations/{registration}/pay

Starts payment for your own registration via a Stripe-hosted Checkout Session.

- **Auth** A token for one organization
- **MCP** [pay-registration](https://hollisapp.com/docs/mcp#tool-pay-registration)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |

- POST
- /api/registrations/{registration}/payment-hold

Gives an unpaid registration more time to pay: its payment hold runs for the organization's hold length from now.

- **Auth** A token for one organization
- **MCP** [extend-payment-hold](https://hollisapp.com/docs/mcp#tool-extend-payment-hold)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |

- POST
- /api/registrations/{registration}/placement-offers

Offers a free agent (a registration with no team) a place on a team in their division.

- **Auth** A token for one organization
- **MCP** [offer-placement](https://hollisapp.com/docs/mcp#tool-offer-placement)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| program\_team\_id | body | integer | yes | The team to offer them a place on. |

- POST
- /api/registrations/{registration}/promote

Promotes a waitlisted registration into its division.

- **Auth** A token for one organization
- **MCP** [promote-registration](https://hollisapp.com/docs/mcp#tool-promote-registration)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |

- POST
- /api/registrations/{registration}/refund

Refunds a paid registration: by default a cancelled one for the whole of what is left; or, with kind, a withdrawal refund (the registration ends) or a partial refund.

- **Auth** A token for one organization
- **MCP** [refund-registration](https://hollisapp.com/docs/mcp#tool-refund-registration)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| kind | body | string: "withdrawal", "partial", "credit" | no | Omit to refund the whole of what is left on a cancelled registration. "withdrawal": the refund terms' amount, and the registration ends. "partial": amount\_cents, and the registration stays. "credit": amount\_cents given back as credit (one-way, a year) instead of to the card. Whatever part of any refund the payer's credit paid comes back as credit. |
| amount\_cents | body | integer | no | For kind "partial": cents to the card, at most what is left, less any processing charge the payment keeps back on refunds. For kind "credit": cents, at most everything paid less what already came back; credit keeps nothing back. |
| reason | body | string: "Injury", "Moved away", "Duplicate payment", "Program change", "Game cancelled", "Other" | no | Required with kind. |
| note | body | string | no | Required when reason is "Other". At most 140 characters; shown on the invoice and in history. |

- POST
- /api/registrations/{registration}/withdraw

Withdraws the caller from one of their own registrations, up to the full-refund deadline they were shown when they signed up; after it only an organizer can withdraw them.

- **Auth** A token for one organization
- **MCP** [withdraw-my-registration](https://hollisapp.com/docs/mcp#tool-withdraw-my-registration)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| registration | path | integer | yes |  |
| refund\_to | body | string: "card", "credit" | no | Where what was paid goes: card (back to the card that paid) or credit (credit for a later registration, only when the caller paid it). Required when there is a refund the caller paid; ignored when nothing was paid. |

## Result disputes

- POST
- /api/result-disputes/{dispute}/settle

Settles an OPEN dispute to a stated outcome: upheld, rejected or withdrawn.

- **Auth** A token for one organization
- **MCP** [settle-result-dispute](https://hollisapp.com/docs/mcp#tool-settle-result-dispute)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| dispute | path | integer | yes |  |
| status | body | string | yes | How the dispute resolves: upheld, rejected, withdrawn. &#96;open&#96; is refused — it is where a dispute starts, not somewhere it can be settled to. |
| outcome | body | string | yes | What was decided, in words a human can read back. A blank or whitespace-only outcome is refused — a dispute that resolves to nothing has not resolved. |

## Roles

- POST
- /api/roles

Creates a new role in the connected organization from a set of permission atoms.

- **Auth** A token for one organization
- **MCP** [create-custom-role](https://hollisapp.com/docs/mcp#tool-create-custom-role)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the role to create. |
| permission\_atoms | body | array of string | yes | The permission atoms this role grants. Must be drawn from the organization's known permission vocabulary, and only ones you hold yourself. |

- GET
- /api/roles

Lists the roles of the connected organization, with each role's permission-atom count and how many members hold it.

- **Auth** A token for one organization
- **MCP** [list-roles](https://hollisapp.com/docs/mcp#tool-list-roles)

- PATCH
- /api/roles/{role}

Replaces an org-defined role's name and permission atoms in the connected organization.

- **Auth** A token for one organization
- **MCP** [update-custom-role](https://hollisapp.com/docs/mcp#tool-update-custom-role)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| role | path | integer | yes |  |
| name | body | string | yes | The role's name. Send the existing name unchanged to edit atoms only. |
| permission\_atoms | body | array of string | yes | The COMPLETE set of permission atoms this role grants after the change. Anything omitted is removed. Must be drawn from the organization's known permission vocabulary. |

- DELETE
- /api/roles/{role}

Deletes an org-defined role in the connected organization.

- **Auth** A token for one organization
- **MCP** [delete-custom-role](https://hollisapp.com/docs/mcp#tool-delete-custom-role)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| role | path | integer | yes |  |

## Rosters

- GET
- /api/rosters

Lists every program-team instance with a roster in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-organization-rosters](https://hollisapp.com/docs/mcp#tool-list-organization-rosters)

## Schedule

- GET
- /api/schedule

Lists every fixture in the connected organization, ordered by date then round.

- **Auth** A token for one organization
- **MCP** [list-organization-schedule](https://hollisapp.com/docs/mcp#tool-list-organization-schedule)

## Staged imports

- POST
- /api/staged-imports

Stages a pasted roster or contact list for review in the connected organization.

- **Auth** A token for one organization
- **MCP** [stage-import](https://hollisapp.com/docs/mcp#tool-stage-import)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| payload | body | string | yes | The rows to stage, as text: a CSV-like block whose first line names the columns, or a plain list of email addresses with no header at all. Paste the contents of a file rather than the file — this surface has no upload. |
| source\_kind | body | string | no | How the text arrived: "csv" when it is the contents of a .csv file, "paste" when it was typed or copied from somewhere else. It is a label on the record only — the same text is read the same way either way. Defaults to "paste". |
| program\_id | body | integer | no | Optional id of the program this import belongs to. A staged import needs no program; omit it when the roster is not for one in particular. |

- GET
- /api/staged-imports

List staged imports.

**Auth** A token for one organization

- GET
- /api/staged-imports/{stagedImport}

Get one of staged imports.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| stagedImport | path | integer | yes |  |

- POST
- /api/staged-imports/{stagedImport}/commit

Writes a reviewed staged import into a contact list, one contact per row.

- **Auth** A token for one organization
- **MCP** [commit-staged-import](https://hollisapp.com/docs/mcp#tool-commit-staged-import)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| stagedImport | path | integer | yes |  |
| contact\_list\_id | body | integer | yes | The id of the contact list to write the contacts into. There is no default — a roster written into a list nobody named is not a choice anyone made. |
| purpose | body | string | yes | What the person told these people their email is for, in the person's words (for example "league news and schedules"). Ask them; never write it for them. Kept with the import and shown in Settings › Import. |
| list\_source | body | string | yes | Where the list came from, in the person's words (for example "our spring sign-up sheet"). Ask them. |
| confirms\_not\_bought | body | boolean | yes | true only when the person confirms, themselves: "No address on this list was bought, rented or scraped." |
| confirms\_relationship | body | boolean | yes | true only when the person confirms, themselves: "Everyone on it already has a relationship with {the organization's name}." |
| confirms\_sender | body | boolean | yes | true only when the person confirms, themselves: "I take responsibility for emailing them, as the sender." |

- PATCH
- /api/staged-imports/{stagedImport}/mapping

Changes what one column of a staged import reads as — both retargeting a column Hollis already placed and promoting one it left out.

- **Auth** A token for one organization
- **MCP** [update-staged-import-mapping](https://hollisapp.com/docs/mcp#tool-update-staged-import-mapping)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| stagedImport | path | integer | yes |  |
| column | body | string | yes | The column to retarget, spelled exactly as it appears in the staged import's detected\_headers. |
| field | body | string | yes | What this column should read as. One of: name, email, phone, team, payment\_state, not\_imported. These are READ AND STAGED BUT NEVER WRITTEN: team, payment\_state — the value is kept on the staged row and the commit writes neither, so mapping a column to one of them records what the file said without acting on it. A column left as not\_imported is left out rather than guessed at; it stays visible and can be promoted later with this same call. |

## Sub calls

- POST
- /api/sub-calls/{subCall}/accept

The caller takes a place a sub call offers, if they are on that division's bench, not on either team in the game, and the call is not yet filled.

- **Auth** A token for one organization
- **MCP** [accept-sub-call](https://hollisapp.com/docs/mcp#tool-accept-sub-call)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| subCall | path | integer | yes |  |

## Sub locations

- PATCH
- /api/sub-locations/{subLocation}

Renames a field of a location in the connected organization.

- **Auth** A token for one organization
- **MCP** [update-sub-location](https://hollisapp.com/docs/mcp#tool-update-sub-location)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| subLocation | path | integer | yes |  |
| name | body | string | yes | The field's new name. |

- DELETE
- /api/sub-locations/{subLocation}

Removes a field from a location.

- **Auth** A token for one organization
- **MCP** [remove-sub-location](https://hollisapp.com/docs/mcp#tool-remove-sub-location)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| subLocation | path | integer | yes |  |

- GET
- /api/sub-locations/{subLocation}/availability

Computes a field's available windows (union of permits minus blackouts) across a date range, in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-sub-location-availability](https://hollisapp.com/docs/mcp#tool-get-sub-location-availability)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| subLocation | path | integer | yes |  |
| from | query | string | yes | The start of the date range (date string). |
| to | query | string | yes | The end of the date range (date string), strictly after from and within one year of it. |

- POST
- /api/sub-locations/{subLocation}/blackouts

Records a blackout (date + reason) on a field, in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-blackout](https://hollisapp.com/docs/mcp#tool-create-blackout)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| subLocation | path | integer | yes |  |
| date | body | string | yes | The blacked-out date. |
| reason | body | string | yes | Why this date is blacked out. |

- GET
- /api/sub-locations/{subLocation}/blackouts

Lists blackouts recorded for a field, in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-blackouts](https://hollisapp.com/docs/mcp#tool-list-blackouts)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| subLocation | path | integer | yes |  |

- POST
- /api/sub-locations/{subLocation}/permits

Creates a permit naming exactly one of a location or a field it covers, in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-permit](https://hollisapp.com/docs/mcp#tool-create-permit)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| subLocation | path | integer | yes |  |
| valid\_from | body | string | yes | The date this permit becomes valid (date string). |
| valid\_to | body | string | yes | The date this permit expires, strictly after valid\_from. |
| days | body | array of integer | yes | The weekdays this permit covers, as ISO weekday numbers: 1 is Monday through 7 is Sunday, as a program's game\_days. English names ("monday") are accepted too; the permit reads back numbers. |
| start\_time | body | string | yes | The daily start time, in H:i (24-hour) format. |
| end\_time | body | string | yes | The daily end time, in H:i (24-hour) format, strictly after start\_time. |
| reference\_number | body | string | yes | The permit or booking reference number. |

## Tasks

- POST
- /api/tasks

Creates an ad-hoc task with no feeder behind it.

- **Auth** A token for one organization
- **MCP** [create-ad-hoc-task](https://hollisapp.com/docs/mcp#tool-create-ad-hoc-task)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| title | body | string | yes | The title of the ad-hoc task. |
| description | body | string \| null | no | An optional description of the ad-hoc task. |
| remind\_on | body | string \| null | no | An optional reminder date, YYYY-MM-DD. |
| assigned\_user\_id | body | integer \| null | no | An optional member who works the task list, to put it on their list. |
| category | body | string \| null | no | Optional; one of: Payments, Locations, Referees, Teams, Player questions. |

- GET
- /api/tasks

Lists the tasks you can act on in the connected organization: your own tasks and the ones Hollis raises (a lapsed payment hold, a team without a captain, a game with no result).

- **Auth** A token for one organization
- **MCP** [list-tasks](https://hollisapp.com/docs/mcp#tool-list-tasks)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| tab | query | string | no | Which tasks: open, mine, hollis, done. Defaults to open. |
| category | query | string | no | Narrow to one category: Payments, Locations, Referees, Teams, Player questions. |

- POST
- /api/tasks/{feederKey}/{subjectKey}/close

Closes a task.

- **Auth** A token for one organization
- **MCP** [close-task](https://hollisapp.com/docs/mcp#tool-close-task)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| feederKey | path | integer | yes |  |
| subjectKey | path | integer | yes |  |

- POST
- /api/tasks/{feederKey}/{subjectKey}/dismiss

Dismisses a task.

- **Auth** A token for one organization
- **MCP** [dismiss-task](https://hollisapp.com/docs/mcp#tool-dismiss-task)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| feederKey | path | integer | yes |  |
| subjectKey | path | integer | yes |  |
| reason | body | string | yes | Why this task is being dismissed. |

- POST
- /api/tasks/{feederKey}/{subjectKey}/reopen

Puts a task back on the open list: a snoozed task before its snooze ends, or a person's own (ad-hoc) task that was marked done.

- **Auth** A token for one organization
- **MCP** [reopen-task](https://hollisapp.com/docs/mcp#tool-reopen-task)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| feederKey | path | integer | yes |  |
| subjectKey | path | integer | yes |  |

- POST
- /api/tasks/{feederKey}/{subjectKey}/snooze

Snoozes a task until a date or event.

- **Auth** A token for one organization
- **MCP** [snooze-task](https://hollisapp.com/docs/mcp#tool-snooze-task)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| feederKey | path | integer | yes |  |
| subjectKey | path | integer | yes |  |
| snooze\_until | body | string \| null | no | An ISO date to snooze until. Provide exactly one of snooze\_until or snooze\_event. |
| snooze\_event | body | string \| null | no | A declared event name to snooze until. Provide exactly one of snooze\_until or snooze\_event. |

- PATCH
- /api/tasks/{task}

Changes a task a person added: its title, note, reminder date, who it is assigned to, or its category.

- **Auth** A token for one organization
- **MCP** [update-ad-hoc-task](https://hollisapp.com/docs/mcp#tool-update-ad-hoc-task)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| task | path | integer | yes |  |
| title | body | string | no | What needs doing. |
| description | body | string \| null | no | A note. |
| remind\_on | body | string \| null | no | The reminder date, YYYY-MM-DD, or null for none. |
| assigned\_user\_id | body | integer \| null | no | A member who works the task list, or null for nobody. |
| category | body | string \| null | no | One of: Payments, Locations, Referees, Teams, Player questions; or null. |

- DELETE
- /api/tasks/{task}

Deletes a task a person added.

- **Auth** A token for one organization
- **MCP** [delete-ad-hoc-task](https://hollisapp.com/docs/mcp#tool-delete-ad-hoc-task)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| task | path | integer | yes |  |

## Teams

- POST
- /api/teams

Creates a persisted team in the connected organization.

- **Auth** A token for one organization
- **MCP** [create-team](https://hollisapp.com/docs/mcp#tool-create-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The name of the team to create. |

- GET
- /api/teams

Lists persisted teams in the connected organization.

- **Auth** A token for one organization
- **MCP** [list-teams](https://hollisapp.com/docs/mcp#tool-list-teams)

- PATCH
- /api/teams/{team}

Renames a team.

- **Auth** A token for one organization
- **MCP** [update-team](https://hollisapp.com/docs/mcp#tool-update-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| team | path | integer | yes |  |
| name | body | string | no | The new name of the team. |

- DELETE
- /api/teams/{team}

Retires a team from the organization.

- **Auth** A token for one organization
- **MCP** [delete-team](https://hollisapp.com/docs/mcp#tool-delete-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| team | path | integer | yes |  |

- GET
- /api/teams/{team}

Returns full detail for one team in the connected organization, including every program it has entered.

- **Auth** A token for one organization
- **MCP** [get-team](https://hollisapp.com/docs/mcp#tool-get-team)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| team | path | integer | yes |  |

## Tokens

- POST
- /api/tokens

Create in tokens.

**Auth** Any token of yours

- GET
- /api/tokens

List tokens.

**Auth** Any token of yours

- DELETE
- /api/tokens/{id}

Delete one of tokens.

**Auth** Any token of yours

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | integer | yes |  |

## Unscored games

- GET
- /api/unscored-games

Lists every committed fixture in this organization whose kickoff has passed and which has no result recorded — the work queue behind "record the result".

- **Auth** A token for one organization
- **MCP** [list-unscored-games](https://hollisapp.com/docs/mcp#tool-list-unscored-games)

## Users

- GET
- /api/users

Lists members of the connected organization.

- **Auth** A token for one organization
- **MCP** [list-members](https://hollisapp.com/docs/mcp#tool-list-members)

- PUT
- /api/users/{user}

Change your own name, email or password; to add a person, invite them with POST /api/members/invite.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| user | path | integer | yes |  |

- PATCH
- /api/users/{user}

Change your own name, email or password; to add a person, invite them with POST /api/members/invite.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| user | path | integer | yes |  |

- DELETE
- /api/users/{user}

Revokes a member's access to the connected organization.

- **Auth** A token for one organization
- **MCP** [revoke-member](https://hollisapp.com/docs/mcp#tool-revoke-member)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| user | path | integer | yes |  |

- GET
- /api/users/{user}

Get one of users.

**Auth** A token for one organization

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| user | path | integer | yes |  |

## Utilisation

- GET
- /api/utilisation

Computes the classified, priced location-hour utilisation ledger (booked/empty/blacked-out/wasted-in-prime), rolled up by area, in the connected organization.

- **Auth** A token for one organization
- **MCP** [get-utilisation-ledger](https://hollisapp.com/docs/mcp#tool-get-utilisation-ledger)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| location\_id | query | integer | no | Optional location filter. |
| program\_id | query | integer | no | Optional program filter. |
| area\_id | query | integer | no | Optional area filter. A level-1 area includes its level-2 areas. |
| from | query | string | yes | Start of the date range. |
| to | query | string | yes | End of the date range, within one year of from. |

## Waivers

- POST
- /api/waivers

Adds a waiver to the organization at version 1.

- **Auth** A token for one organization
- **MCP** [create-waiver](https://hollisapp.com/docs/mcp#tool-create-waiver)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | The waiver's name, unique in the organization, e.g. "Indoor facilities waiver". |
| body | body | string | yes | The full text a registrant accepts, as Markdown: \*\*bold\*\*, \*italic\*, # headings, lists and links are shown formatted; a single newline is a line break. Stored and returned as typed. |
| is\_default | body | boolean | no | Make this the organization's default waiver. Defaults to false. |

- GET
- /api/waivers

Lists the organization's waivers, the default first: id, name, current version and whether it is the default.

- **Auth** A token for one organization
- **MCP** [list-waivers](https://hollisapp.com/docs/mcp#tool-list-waivers)

- PATCH
- /api/waivers/{waiver}

Renames a waiver, changes its text, or makes it the default.

- **Auth** A token for one organization
- **MCP** [update-waiver](https://hollisapp.com/docs/mcp#tool-update-waiver)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| waiver | path | integer | yes |  |
| name | body | string | no | A new name, unique in the organization. |
| body | body | string | no | The new full text, as Markdown (shown formatted; returned as typed). Moves the waiver to its next version when it differs from the current text. |
| is\_default | body | boolean | no | true makes this the organization's default waiver. |

- GET
- /api/waivers/{waiver}

One of the organization's waivers: its current text and version, and the text of every earlier version (an acceptance records the version it accepted).

- **Auth** A token for one organization
- **MCP** [get-waiver](https://hollisapp.com/docs/mcp#tool-get-waiver)

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| waiver | path | integer | yes |  |
