Developers

MCP reference

Connect an assistant to Hollis. It gets the tools a person has, and the same approvals.

Overview

Hollis runs a Model Context Protocol server. Connect it to your assistant and the assistant can read and change your organization with the same roles and approvals you have. It has 241 tools; 71 of them only read. This page is generated from the server, so the list is the one your assistant sees.

Connect

SettingValue
Server URLhttps://hollisapp.com/mcp/hollis
TransportStreamable HTTP
AuthOAuth 2.1 with PKCE, with dynamic client registration
Protocol version2026-07-28
Serverhollis 0.0.1

Sign in with OAuth only. An API token from the Tokens page works on the REST API, not here: sent to the server URL, it gets 401.

The server speaks protocol revision 2026-07-28 and no other. A client built for an earlier revision opens with initialize, which that revision removed, and cannot connect until it is updated. The server says so instead of failing quietly: a call with no sign-in gets 401 whose body lists the revision as supported_protocol_versions; once signed in, initialize gets 404 and a request naming another revision gets 400, and both answers list the revision in error.data.supported.

tools/list answers 15 tools a page. While the result carries a nextCursor, send it back as cursor for the next page. Most clients do this for you.

Client setup

Claude

Settings, Connectors, Add custom connector. Paste the server URL and sign in to Hollis when asked.

Claude Code

claude mcp add --transport http hollis https://hollisapp.com/mcp/hollis

Cursor

Add this to ~/.cursor/mcp.json, or to a project's .cursor/mcp.json, and sign in to Hollis when Cursor asks.

{
  "mcpServers": {
    "hollis": {
      "url": "https://hollisapp.com/mcp/hollis"
    }
  }
}

Other clients

{
  "mcpServers": {
    "hollis": {
      "url": "https://hollisapp.com/mcp/hollis"
    }
  }
}

Any client that speaks streamable HTTP, OAuth and the protocol revision above can connect the same way.

Authorization

Connecting opens a Hollis page where you sign in, pick which of your organizations the assistant works in, and choose what it may do. A connection acts as you, in that one organization.

AccessWhat it allows
Read onlyThe 71 tools that only read. The others are not offered to the assistant at all.
Read and changeEvery tool your role allows. Some still wait for a person, see Approvals.

Read and change is selected unless you pick Read only. A connection's access token lasts 30 days and the assistant renews it with its refresh token, which lapses after 90 days unused; then connect again.

To change the organization or the access, connect again; the new choice replaces the old one.

Approvals

Tools marked "approval" never finish on the assistant's word alone. The first call previews what would happen and changes nothing. Depending on the action and your organization's settings, the request then waits on the Approvals page until a person signed in to Hollis approves it, and only then can the assistant complete it.

Tools marked "confirm" ask the assistant to call again with the confirmation token from the preview. Nothing else in Hollis can approve a request: there is deliberately no tool for it.

Tools

241 tools in 35 groups. Each takes JSON arguments; the fields are listed with each tool.

Allocation

CHANGEallocate-location-time

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

FieldTypeRequiredDescription
location_idintegeryesThe id of the location to allocate time on.
permit_idintegeryesThe id of the permit covering this block, either directly on the location or on one of its fields.
program_idintegeryesThe id of the program this time is allocated to.
datestringyesThe date this block occurs on (date string).
start_timestringyesThe block start time, in H:i (24-hour) format.
end_timestringyesThe block end time, in H:i (24-hour) format, strictly after start_time.
cost_centsintegeryesThe cost of this block, in integer cents.
held_for_makeupbooleannoWhether this block is being held in reserve for a makeup game.
CHANGEdelete-allocation

Removes an allocated block of location time from the organization. Destroys data: the first call previews what would happen, including how many scheduled games would lose their allocated location, and writes nothing; call again with the returned confirmation_token to actually remove it.

Gate confirm
FieldTypeRequiredDescription
allocation_idintegeryesThe id of the allocation block to remove.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READlist-location-allocations

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

FieldTypeRequiredDescription
location_idintegeryesThe id of the location whose allocated blocks to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-program-inventory

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

FieldTypeRequiredDescription
program_idintegeryesThe id of the program whose allocated inventory to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEupdate-allocation

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

FieldTypeRequiredDescription
allocation_idintegeryesThe id of the allocation block to correct.
start_timestringnoThe corrected block start time, in H:i (24-hour) format. State this together with end_time or not at all.
end_timestringnoThe 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_centsintegernoThe 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.

Area

CHANGEassign-location-area

Hand-assigns a location to an area, or clears its assignment. Never derived from the location's geo. Calls the same underlying write path as PATCH /api/locations/{location}.

FieldTypeRequiredDescription
location_idintegeryesThe id of the location to assign.
area_idinteger | nullnoThe id of the area to assign the location to. Pass null to clear the location's area assignment; omit this field entirely to leave the current assignment unchanged.
CHANGEcreate-area

Creates an area (up to two levels, org-defined labels) in the connected organization. Never derived from a location's geo — hand-created only.

FieldTypeRequiredDescription
namestringyesThe name of the area to create.
labelstringyesThe organization's own name for this level, e.g. 'Borough'.
levelintegeryes1 or 2. A level-2 area must name a level-1 parent_area_id.
parent_area_idintegernoRequired when level is 2; must not be supplied when level is 1.
CHANGEdelete-area

Deletes an area from the organization. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually delete it. Refused if the area still has a child area or an assigned location.

Gate confirm
FieldTypeRequiredDescription
area_idintegeryesThe id of the area to delete.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READget-area

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

FieldTypeRequiredDescription
area_idintegeryesThe id of the area to retrieve.
READlist-areas

Lists areas in the connected organization.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEupdate-area

Renames an area, changes its label, or moves a second-level area under another top-level area. Only the fields supplied are changed. An area's level is permanent; a top-level area has no parent.

FieldTypeRequiredDescription
area_idintegeryesThe id of the area to update.
namestringnoThe new name of the area.
labelstringnoThe new label of the area.
parent_area_idintegernoMoves 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.

Area alert

CHANGEsubscribe-to-updates

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. Sends one confirmation email; nothing else is sent until the address's owner confirms. The answer is the same whether or not the address was already subscribed.

FieldTypeRequiredDescription
emailstringyesThe address to email. Its owner must confirm before anything but the confirmation is sent.
area_idintegernoAn 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.

Billing

CHANGEconnect-payments

Starts connecting the organization's own Stripe account so it can take payments. Returns a Stripe link for the organizer to open in a browser; Stripe asks them to create an account or sign in. Nothing is charged. Call it again once they have finished: payments_connected is Stripe's answer at that moment.

CHANGEdisconnect-payments

Disconnects the organization's Stripe account so it can be connected again from scratch (for example after signing in to the wrong Stripe login). New payments stop until connect-payments is called again, which then creates a new account. Past payments, refunds and payouts stay with the old account. The first call previews, with how many payments the account took and how many checkouts are open on it; call again with the returned confirmation_token to disconnect.

Gate confirm
FieldTypeRequiredDescription
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.

Blackout

CHANGEcreate-blackout

Records a blackout (date + reason) on a field, in the connected organization. Draft games already on that field and date move to Held; committed games stay where they are and are listed in the result.

FieldTypeRequiredDescription
sub_location_idintegeryesThe id of the field.
datestringyesThe blacked-out date.
reasonstringyesWhy this date is blacked out.
READlist-blackouts

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

FieldTypeRequiredDescription
sub_location_idintegeryesThe id of the field.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).

Contact

CHANGEadd-contact

Adds a contact by email to a contact list in the connected organization. Idempotent — adding an already-present email changes nothing.

FieldTypeRequiredDescription
contact_list_idintegeryesThe id of the contact list to add the contact to.
emailstringyesThe contact's email address.
contact_namestringnoThe contact's display name, if known.
CHANGEcreate-contact-list

Creates a named contact list in the connected organization.

FieldTypeRequiredDescription
namestringyesThe name of the new contact list.
CHANGEdelete-contact-list

Deletes a contact list and its memberships. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually delete it. Contact records and suppression (unsubscribe/bounce) state are unaffected, and there is no undo.

Gate confirm
FieldTypeRequiredDescription
contact_list_idintegeryesThe id of the contact list to delete.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READget-contact-list

Returns one contact list in the connected organization, including its contacts.

FieldTypeRequiredDescription
contact_list_idintegeryesThe id of the contact list to retrieve.
CHANGEimport-contacts

Imports contacts into a contact list from an existing source (division registrants, a team roster, or organization members). This is a one-time snapshot — the list does not stay in sync with the source afterward.

FieldTypeRequiredDescription
contact_list_idintegeryesThe id of the contact list to import into.
sourcestringyesThe source to import from: division_registrants, program_team_roster, or organization_members.
source_idintegeryesThe id of the division, program-team instance, or 0 for organization_members (which has no source id).
READlist-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. The "opted out" count on a new announcement counts these. Needs the right to send announcements.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-announcements

Lists the announcements the connected organization has sent, each with when it went out, how many it was enqueued to, and how many contacts were suppressed.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-contact-lists

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

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEremove-contact

Removes a contact from one contact list. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually remove it. The contact is NOT unsubscribed and stays on any other list — this only removes one list membership.

Gate confirm
FieldTypeRequiredDescription
contact_list_idintegeryesThe id of the contact list to remove the contact from.
contact_idintegeryesThe id of the contact to remove.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEresend-announcement-to-contact

Sends one already-sent announcement to ONE of its recipients again — the retry for a soft bounce such as a full mailbox. Sends real mail, which cannot be unsent: the first call previews what would happen and sends nothing; call again with the returned confirmation_token to actually send. Refuses outright for a hard-bounced, complained-about or unsubscribed address, naming which.

Gate confirm
FieldTypeRequiredDescription
announcement_idintegeryesThe id of the announcement to send again.
recipient_idintegeryesThe id of the recipient row on that announcement to send to. One recipient only.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEsend-announcement

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. Replies go to the organization's announcements address, not to Messages. A real, external, hard-to-fully-undo mail delivery under the organization's own sending domain — there is no unsend. This action destroys nothing directly but cannot be reversed once sent: it takes effect only after a human signed in to Hollis has reviewed and approved it, and cannot be redeemed a second time for a different message or a different list.

Gate approval
FieldTypeRequiredDescription
tostring: "organization", "program", "division", "list"noWho 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.
idintegernoThe id of the program, division or contact list. Not used for the organization.
contact_list_idintegernoThe id of the contact list to send to — the same as to=list with this id.
subjectstringyesThe email subject line.
bodystringyesThe message body, written as Markdown — **bold**, _italic_, and [links](url) are supported.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEstop-announcements-to-person

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. Every announcement audience leaves them out from then on, and the "opted out" count includes them. Only the person can turn announcements back on: an organizer cannot undo this, and there is no tool to. Idempotent; an address that already stopped, for any reason, is left exactly as it was. Needs the right to send announcements.

FieldTypeRequiredDescription
emailstringyesThe person's address: a contact or a member of this organization.
notestringnoWhy, in your words — "asked by phone". Up to 255 characters; kept with the stop.
CHANGEupdate-contact-email

Corrects one contact's email address on a contact list. Overwrites the stored address: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually change it. IMPORTANT to relay: bounce and complaint suppressions are recorded against an ADDRESS, so changing it stops this contact being suppressed and mail will be sent to them again.

Gate confirm
FieldTypeRequiredDescription
contact_list_idintegeryesThe id of the contact list the contact is on.
contact_idintegeryesThe id of the contact whose address is being corrected.
emailstringyesThe corrected email address. Stored lowercased.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.

Credit

READget-member-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). Read only: credit cannot be voided or paid out as cash, and only the holder can give it to someone else. Needs payments.view.

FieldTypeRequiredDescription
member_idintegeryesThe id of the member whose credit to read.
READmy-credit

Returns the caller's own credit balance with this organization and each unexpired part of it with its expiry date. Credit comes off the next registration the caller pays for; it cannot be turned into cash, except a captain's credit from free agents placed on a team they paid for in full (withdraw-credit), and can be given to another person in the organization with transfer-credit. held_cents is that captain credit still held until its season ends: not in the balance, and neither spent nor withdrawn before then.

CHANGEtransfer-credit

Gives part or all of the caller's own credit with this organization to another member of it. The credit keeps its expiry dates and cannot come back unless they give it back. The first call previews what would happen and writes nothing; repeat it with the confirmation_token it returns.

Gate confirm
FieldTypeRequiredDescription
to_user_idintegeryesThe id of the member of this organization to give the credit to.
amount_centsintegeryesHow much, in cents; at most the caller's balance.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEwithdraw-credit

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. That credit is held until the season ends and cannot be withdrawn before. registration_id is the caller's own registration on that team; amount_cents defaults to all of it. Other credit cannot be withdrawn. The first call previews what would happen and writes nothing; repeat it with the confirmation_token it returns.

Gate confirm
FieldTypeRequiredDescription
registration_idintegeryesThe caller's own registration on the team they paid for in full.
amount_centsintegernoHow much, in cents; at most the credit and what the card paid. Left out: all of it.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.

Discount

CHANGEapply-discount-code

Applies a shared discount code to the caller's own unpaid registration (design-v2 D-103), lowering what pay-registration will charge. One code per registration; a second replaces the first. An open checkout for it is closed first.

FieldTypeRequiredDescription
registration_idintegeryesThe caller's own registration.
codestringyesThe code, as given by the organizer.
CHANGEcreate-discount-code

Makes a shared discount code for one program (design-v2 D-103), e.g. SIBLING10: a percentage OR an amount off, with an optional cap on uses and an expiry, and optionally for first-time players only, once per person, or for one person only (only_for_email: anyone else is told the code is not valid, as for an unknown code; such a code is used once unless max_uses says otherwise). A code always covers the whole program, never one division. Payers apply it to their own unpaid registration before paying. Anyone holding the code can use it, so give it a cap or an expiry when it should not spread.

FieldTypeRequiredDescription
program_idintegeryesThe program the code is for.
codestringyes3 to 32 letters, digits, dashes or underscores; stored upper-case.
percent_offintegerno1 to 100. Give this or amount_off_cents, not both.
amount_off_centsintegernoAn amount off in cents. Give this or percent_off, not both.
descriptionstringnoWhy it exists, shown on the invoice (e.g. "sibling discount").
max_usesintegernoHow many registrations may use it. Left out: no limit, or 1 when only_for_email is given.
expires_atstringnoISO 8601; after this it cannot be applied.
first_time_onlybooleannoOnly for players who have never held a place in another program of this organization.
once_per_personbooleannoEach person may use it on one registration only.
only_for_emailstringnoOnly the person signed in with this email may use it, once unless max_uses says otherwise; leave it out for anyone holding the code.
READlist-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. Needs the right to edit the program.

FieldTypeRequiredDescription
program_idintegeryesThe program whose codes to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGErestore-discount-code

Brings back a withdrawn shared discount code, so payers can apply it again under its own limits. Its uses so far still count against its cap.

FieldTypeRequiredDescription
discount_code_idintegeryesThe withdrawn code to bring back (from list-discount-codes).
CHANGErevoke-discount-code

Withdraws a shared discount code (design-v2 D-103). Nobody can apply it again; registrations that already used it keep their price.

FieldTypeRequiredDescription
discount_code_idintegeryesThe code to withdraw (from list-discount-codes).

Division

CHANGEcreate-division

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

FieldTypeRequiredDescription
program_idintegeryesThe id of the program to add this division to.
namestringyesThe name of the division to create.
typestringyesEither "age_group" or "skill_tier".
max_teamsintegernoMaximum 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_allowedbooleannoWhether 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_allowedbooleannoWhether women may play in this division. Omit or null to follow the program's rule.
players_on_fieldintegernoPlayers a side in this division (D-31). Omit or null to follow the program.
women_min_on_fieldintegernoWomen required on field at once in this division. Omit or null to follow the program.
men_min_on_fieldintegernoMen required on field at once in this division. Omit or null to follow the program.
roster_minintegernoFewest 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_teamintegernoMost players on a team's roster in this division. Omit or null to follow the program.
accepts_teamsbooleannoWhether teams can sign up for this division (D-42). Defaults to true.
accepts_free_agentsbooleannoWhether free agents (individual players with no team) can sign up for this division (D-42). Defaults to true.
opens_atstringnoWhen 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_atstringnoWhen 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_orderintegernoDisplay order among the program's divisions. Defaults to 0.
CHANGEdelete-division

Removes a division from a program. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually remove it. The removal is a soft delete — nothing is permanently destroyed by this tool.

Gate confirm
FieldTypeRequiredDescription
division_idintegeryesThe id of the division to remove.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READget-division

Returns full detail for one division in the connected organization.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division to retrieve.
READlist-division-seeds

Lists a division's seed proposal: the order its teams would be paired in. Each position is marked "stored" (a saved seeding) or "default" (the fall-back order the division has when nothing has been saved). A position with no team is a HELD (deliberately empty) position and comes back with a null program_team_id.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division whose seed proposal to read.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-divisions

Lists divisions within a program in the connected organization.

FieldTypeRequiredDescription
program_idintegeryesThe id of the program whose divisions to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEsave-division-seeds

Replaces a division's ENTIRE seed order in one call. `seeds` is the whole ordered list, position 1 first: send every position you want the division to have, not just the ones you are changing. A null program_team_id is a HELD (deliberately empty) position; to release a held position, leave it out of the next call; to reset the division to its default order, send an empty list. Teams entered in the division that the list does not name keep their default order after the ones it does. Every id is re-checked against the teams actually entered in this division, and a team entered in a different division is refused. This overwrites any order saved by someone else since you read it.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division whose seed order to replace.
seedsarray of objectyesThe 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.
CHANGEupdate-division

Updates a division's name, type, maximum number of teams, gender, who can sign up, sort order, or window override. Only the fields supplied are changed; omitted fields are left as they are.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division to update.
namestringnoThe new name of the division.
typestringnoEither "age_group" or "skill_tier".
max_teamsintegernoMaximum 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_allowedbooleannoWhether 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_allowedbooleannoWhether women may play in this division. Omit or null to follow the program's rule.
players_on_fieldintegernoPlayers a side in this division (D-31). Omit or null to follow the program.
women_min_on_fieldintegernoWomen required on field at once in this division. Omit or null to follow the program.
men_min_on_fieldintegernoMen required on field at once in this division. Omit or null to follow the program.
roster_minintegernoFewest 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_teamintegernoMost players on a team's roster in this division. Omit or null to follow the program.
accepts_teamsbooleannoWhether teams can sign up for this division (D-42). Defaults to true.
accepts_free_agentsbooleannoWhether free agents (individual players with no team) can sign up for this division (D-42). Defaults to true.
opens_atstringnoWhen 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_atstringnoWhen 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_orderintegernoDisplay order among the program's divisions.
fee_centsintegernoRegistration fee in cents. Omit to leave unchanged; pass null to clear an override and fall back to the program's own fee.

Export

READexport-data

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. Format csv, xlsx (Excel), json or pdf (up to 2,000 rows). The file holds the rows the matching screen lists for the same filters, and needs the permission to view that screen; every export is recorded in the access log. Give the person the link; do not read the file out.

FieldTypeRequiredDescription
datasetstring: "members", "teams", "rosters", "registrations", "schedule", "standings", "payments"yesWhich table: members (Members), teams (Teams), rosters (Rosters), registrations (Registrations), schedule (Schedule), standings (Standings), payments (Payments).
formatstring: "csv", "xlsx", "json", "pdf"nocsv (default), xlsx for Excel, json, or pdf (at most 2,000 rows).
qstringnoSearch text, as the table's search box (members, teams, rosters, payments).
program_idintegernoOnly this program. Required for standings.
division_idintegernoOnly this division (registrations, standings).
location_idintegernoOnly games at this location (schedule).
statusstringnoPayments: the Status filter (e.g. Paid, Unpaid, Refunded). Teams and rosters: readiness (e.g. Payments due, Ready). Registrations: registered, waitlisted, pending_waiver or cancelled.
typestringnoPayments: All, Payments, Refunds or Charges.
whenstringnoPayments: All time, Last 7 days, Last 30 days or Last 90 days. Schedule: all, upcoming, staff or held.
rolestringnoMembers: only people holding this role.
programstringnoMembers: only people in the program of this name.
historystringnoMembers: anyone, returning, first or idle.
owesstringnoMembers: unpaid, waiver, unregistered or noteam.
showstringnoTeams and rosters: current (teams in a program now, the default) or all.
viewstringnoStandings: official (default) or live.
sortstringnoSort column key, as the table's own sort (e.g. name, date, amt).
dirstringnoasc or desc.

Field

CHANGEcreate-sub-location

Creates a field under a location in the connected organization.

FieldTypeRequiredDescription
location_idintegeryesThe id of the location to add this field to.
namestringyesThe name of the field to create.
READget-sub-location-availability

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

FieldTypeRequiredDescription
sub_location_idintegeryesThe id of the field.
fromstringyesThe start of the date range (date string).
tostringyesThe end of the date range (date string), strictly after from and within one year of it.
READlist-sub-locations

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

FieldTypeRequiredDescription
location_idintegeryesThe id of the location whose fields to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEremove-sub-location

Removes a field from a location. The first call previews and writes nothing; call again with the returned confirmation_token to remove it. Refused while games are still to be played there: move them first. Games already played keep it.

Gate confirm
FieldTypeRequiredDescription
sub_location_idintegeryesThe id of the field to remove.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEupdate-sub-location

Renames a field of a location in the connected organization. Two fields of one location cannot share a name.

FieldTypeRequiredDescription
sub_location_idintegeryesThe id of the field to rename.
namestringyesThe field's new name.

Game staff

CHANGEassign-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. Name the person by user_id or by organization_official_id, not both. The person must hold the organization's "Can be assigned as referee" or "Can be assigned as crew" permission for the role. Someone already assigned to that role on a game is released. Published games email the person once with every game; draft games wait until they are published. A person who already works a game that overlaps one of these (45 minutes between different locations) is named in a validation error and nothing is assigned until you send the same call again with confirm_overlap true.

FieldTypeRequiredDescription
program_idintegeryesThe program the games belong to.
game_idsarray of integeryesThe games to staff (1-500), all in this program.
rolestringyesofficial or crew.
user_idintegernoThe member to assign; they must hold "Can be assigned as referee" (official) or "Can be assigned as crew" (crew).
organization_official_idintegernoInstead of user_id: the official row of the member to assign. Give neither to clear the role on those games.
confirm_overlapbooleannoSend true to assign anyway after a validation error said the person already works an overlapping game.
CHANGEreply-to-game-assignment

Accepts or declines a game you were assigned to as an official or crew member, or undoes your decline. answer is accept, decline or undo. Only the assigned person can answer; declining frees the game for someone else (a game you already accepted can be given back until 6 hours before it starts; add an optional reason only the organizer reads), accepting a game that overlaps one you already accepted is refused with a warning until you send the same call again with confirm_overlap true; and undo puts it back to waiting for your answer while nobody else has been assigned.

FieldTypeRequiredDescription
assignment_idintegeryesThe assignment to answer.
answerstringyesaccept, decline or undo (a decline, while nobody else has been assigned).
reasonstringnoOptional, with a decline: why you cannot make it. Only the organization reads it. 500 characters at most.
confirm_overlapbooleannoSend true to accept anyway after a validation error said the game overlaps one you already accepted.
CHANGEset-game-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. The position must be on the same side as the place: a Referee-side position for the referee, a Crew-side one for crew. Positions are listed by list-official-fees. Requires permission to assign referees and crew.

FieldTypeRequiredDescription
assignment_idintegeryesThe assignment: one person’s place on one game.
position_idintegeryesThe position, from list-official-fees.

General

READwho-am-i

Returns the connected user's identity and the bounds of their own access: their acting organization, their role, the scope and expiry of each grant they hold, and the atoms they can actually reach, in sentences.

Import

CHANGEcommit-staged-import

Writes a reviewed staged import into a contact list, one contact per row. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually import. It writes CONTACTS ONLY — a column read as the paid/unpaid state is read and staged; no payment is written, and no registration is created. Rows with no email address are skipped and recorded as skipped. An import can only be committed once. Ask the person, in their own words, what they told these people their email is for and where the list came from, and ask them to confirm each of the three statements; never answer these for them. A commit without all five is refused.

Gate confirm
FieldTypeRequiredDescription
staged_import_idintegeryesThe id returned by stage-import. Review its rows and column mapping before calling this.
contact_list_idintegeryesThe 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.
purposestringyesWhat 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_sourcestringyesWhere the list came from, in the person's words (for example "our spring sign-up sheet"). Ask them.
confirms_not_boughtbooleanyestrue only when the person confirms, themselves: "No address on this list was bought, rented or scraped."
confirms_relationshipbooleanyestrue only when the person confirms, themselves: "Everyone on it already has a relationship with {the organization's name}."
confirms_senderbooleanyestrue only when the person confirms, themselves: "I take responsibility for emailing them, as the sender."
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEstage-import

Stages a pasted roster or contact list for review in the connected organization. Nothing is imported by this call: it reads the text into rows and a proposed column mapping you can inspect and change, and writes no contacts. Accepted text is a CSV-like block with a header line, or a plain list of email addresses. There is no file upload on this surface — paste the file contents as text; an .xlsx sheet must be saved as .csv first. Call commit-staged-import to actually write the contacts.

FieldTypeRequiredDescription
payloadstringyesThe 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_kindstringnoHow 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_idintegernoOptional 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.
CHANGEupdate-staged-import-mapping

Changes what one column of a staged import reads as — both retargeting a column Hollis already placed and promoting one it left out. Writes no contacts and never rewrites the staged rows: the mapping is an interpretation laid over the data, so it can be changed as often as you like. Refused once the import has been committed, because its mapping is then the record of how those contacts were read.

FieldTypeRequiredDescription
staged_import_idintegeryesThe id returned by stage-import.
columnstringyesThe column to retarget, spelled exactly as it appears in the staged import's detected_headers.
fieldstringyesWhat 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.

Location

CHANGEadd-location-custom-field

Adds a custom field (name and value) to a location. Set secret to true for a value that must be masked and revealed only through a logged reveal, like a gate code.

FieldTypeRequiredDescription
location_idintegeryesThe id of the location.
namestringyesThe field name, e.g. "Gate code". Up to 100 characters.
valuestringnoThe value. Up to 1000 characters.
secretbooleannoMask the value and log every reveal.
CHANGEcreate-location

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

FieldTypeRequiredDescription
namestringyesThe name of the location to create.
addressstringnoThe location's street address. Optional: omit it if it is not known yet.
latitudenumbernoLatitude, between -90 and 90. Omit if unknown.
longitudenumbernoLongitude, between -180 and 180. Omit if unknown.
has_parkingbooleannoWhether the location has parking. Defaults to false.
has_lightsbooleannoWhether the location has lights for night play. Defaults to false.
is_indoorbooleannoWhether the location is indoor. Defaults to false.
surfacestringnoThe playing surface (e.g. "grass", "turf"). Omit if unknown.
area_idintegernoOptional. 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.
READget-location

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

FieldTypeRequiredDescription
location_idintegeryesThe id of the location to retrieve.
READlist-location-custom-fields

Lists a location's custom fields (name and value). A secret field shows no value, and no tool reveals it: a person reveals it in Hollis, where the reveal is logged.

FieldTypeRequiredDescription
location_idintegeryesThe id of the location.
READlist-locations

Lists locations in the connected organization.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEremove-location-custom-field

Removes a custom field from a location. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually remove it.

Gate confirm
FieldTypeRequiredDescription
field_idintegeryesThe id of the custom field to remove.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEset-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.

FieldTypeRequiredDescription
location_idintegeryesThe id of the location whose access block to set.
permit_or_booking_referencestringnoThe permit or booking reference for this location. Omit to leave unset.
site_contactstringnoThe site or city contact for this location. Omit to leave unset.
after_hours_numberstringnoAn after-hours contact number for this location. Omit to leave unset.
gate_codestringnoThe gate access code for this location. Omit to leave unset.
light_panel_codestringnoThe light-panel access code for this location. Omit to leave unset.
keyholderstringnoThe name of the person who holds keys for this location. Omit to leave unset.
CHANGEupdate-location

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

FieldTypeRequiredDescription
location_idintegeryesThe id of the location to change.
namestringnoThe location's new name. Omit to keep it.
addressstringnoThe location's street address. Omit to keep it; pass an empty string to clear it.
is_indoorbooleannoWhether the location is indoor. Omit to keep it.
surfacestringnoThe playing surface (e.g. "grass", "turf"). Omit to keep it; pass an empty string to clear it.
area_idintegernoThe id of the area to assign the location to. Omit to keep it.
CHANGEupdate-location-custom-field

Changes a location custom field's name, value or secret flag. Only the keys you pass change.

FieldTypeRequiredDescription
field_idintegeryesThe id of the custom field.
namestringnoA new name.
valuestringnoA new value.
secretbooleannoMask the value and log every reveal, or stop doing so.

Message

CHANGEhide-message

Hides a player’s or captain’s message written to the organizers (from organizer-messages), or shows it again with hidden false. Hidden, it is gone from everyone’s Messages but its writer’s, who sees “Removed by the organizer”; emails already sent stay sent. Needs the right to send announcements.

FieldTypeRequiredDescription
message_idintegeryesThe message to hide or show.
hiddenbooleannotrue (default) hides it; false shows it again.
READmy-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. Each says who it went to, its conversation’s topic, whether it is new, and whether you can reply.

READorganizer-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. Needs the right to send announcements.

FieldTypeRequiredDescription
boxstringnoinbox (default) or sent. Any other value is refused.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEreply-to-message

Answers a message from my-messages. The reply reaches the same people as the message it answers, except an answer to an organizer’s message sent to many, which goes to the organizers only as its own conversation; an answer to an organizer’s message to one person stays in that conversation. Only someone the message was for, or who wrote it, can reply.

FieldTypeRequiredDescription
message_idintegeryesThe message to answer.
bodystringyesThe reply, up to 2000 characters.
CHANGEsend-organizer-message

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). Or pass targets — a list of {to, id} — for one message to several at once; each person is emailed once. It shows in their Messages and is emailed. Needs the right to send announcements; a person or the organization needs it org-wide. Recipients may answer, and an answer goes to the organizers only; to one person alone, their answer stays in the same conversation. For a whole program use send-program-message.

FieldTypeRequiredDescription
tostringnoteam, division, game, person or organization. Omit when sending targets.
idintegernoThe program team id (to team), division id (to division), game id (to game) or user id (to person); none for organization.
targetsarray of objectnoSeveral recipients for one message, up to 50. Use instead of to and id.
bodystringyesThe message, up to 2000 characters.
CHANGEsend-program-message

Writes a message to everyone on a program’s teams: it shows in each player’s Messages under Program and is emailed. Needs the right to send announcements. Recipients may answer, and an answer goes to the organizers only. A program of more than 50 people asks for a confirmation first.

Gate confirm
FieldTypeRequiredDescription
program_idintegeryesThe program whose teams receive it.
bodystringyesThe message, up to 2000 characters.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEsend-team-message

Writes a message for one of YOUR teams. audience is team (everyone on it), captains (its captain), player (one player: captains only, with recipient_user_id) or organizers (the organization’s organizers; share=true lets the rest of the team see it). It shows on Home and is emailed.

FieldTypeRequiredDescription
program_team_idintegeryesOne of your teams.
audiencestringyesteam, captains, player or organizers.
bodystringyesThe message, up to 2000 characters.
recipient_user_idintegernoFor audience player: the player on your team.
sharebooleannoFor audience organizers: let the rest of the team see it.

Official

CHANGEadd-my-away-window

Records an absolute away window — a start date and an end date — for the connected user, for dates they will be unavailable to officiate. Both bounds are required and the end may not precede the start; a single-day window is allowed. This is for an absolute absence such as being out of the country, never for a standing preference. Refuses if the connected user is not an official here.

FieldTypeRequiredDescription
starts_onstringyesThe first day of the absence, as YYYY-MM-DD. Required — an away window with one bound missing is refused, never stored half-open.
ends_onstringyesThe 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.
reasonstringnoOptional 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.
CHANGEadd-official-position

Adds a position for referees and crew, such as Line judge, on the Referee side or the Crew side. The side decides who may hold it: people who can be assigned as referee, or as crew. Refuses a name already in use. Requires the Pay referees and crew permission.

FieldTypeRequiredDescription
namestringyesThe position, at most 60 characters.
sidestring: "official", "crew"yesofficial for the Referee side, crew for the Crew side.
CHANGEconnect-my-bank-account

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. Returns a Stripe link for them to open in a browser. Only for referees and crew of this organization; moves no money.

READget-official-agreement

Reads the organization’s agreement for referees and crew: whether officials are asked to sign it (asks), whether they must sign before accepting a game (sign_first), the current version and its text, and each referee or crew member with the version they signed, if any. Requires permission to change the organization’s settings.

READlist-official-fees

Lists the organization’s positions for referees and crew and the fee per game for each: the organization default per position, each program’s own fee, and each game that has its own fee, and each game that pays a percentage above or below (percents). A game’s fee is its own, else its program’s, else the default, moved by the game’s percentage unless it is the game’s own; a changed fee applies to every game not yet paid. Requires the Pay referees and crew permission.

READlist-official-pay

Lists what each referee and crew member is owed, game by game: the game, its date, the position they held and its current fee, for games they accepted and worked. Requires the Pay referees and crew permission.

READmy-bank-account

Shows the connected user’s own bank account for getting paid as a referee or crew member: whether it is connected, and the bank’s name and last four digits. Only their own.

READmy-coverage

Lists the areas the connected user has declared they will officiate in, for this organization. Refuses if the connected user is not an official here.

READmy-pay

Lists the connected user’s own fees as a referee or crew member, game by game: the game, its date, the position they held, the fee and whether it is owed. Only their own; nobody else’s pay.

CHANGEpay-officials

Pays referees and crew what they are owed for games they worked: one debit from the organization’s bank account for the total plus Stripe’s fee, and each official’s share deposited once the debit clears (a few business days). Pass the official_id of each official to pay (from list-official-pay). Only games with a fee and officials with a bank account connected are paid. Requires the Pay referees and crew permission, and a human signed in to Hollis must approve it first: the first call returns an approval reference and URL; call again with approval_reference after a human has approved.

Gate approval
FieldTypeRequiredDescription
official_idsarray of integeryesThe official_id of each official to pay, from list-official-pay.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEremove-my-away-window

Removes one of the connected user's own absolute away windows, by its id. Refuses if the window belongs to another official, if it does not exist, or if the connected user is not an official here. Use my-coverage or add-my-away-window to see the current windows and their ids.

FieldTypeRequiredDescription
away_window_idintegeryesThe id of the away window to remove. It must belong to the connected user; any other id is refused rather than ignored.
CHANGEremove-official-position

Removes a position for referees and crew. People who held it keep their games and their fee. Refuses the last position on the Referee side or the Crew side. Requires the Pay referees and crew permission.

FieldTypeRequiredDescription
position_idintegeryesThe position, from list-official-fees.
CHANGEset-game-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. The percentage moves the program’s fee for the position, else its default; a fee set for that one game with set-official-fee is a price and is not moved. percent null (or 0) clears it. -100 to 500. A new percentage applies to every game not yet paid, and every referee or crew member with an unpaid place on the game whose fee changes is emailed the old and new amount a few minutes later (edits made close together are one email); notified_officials says how many. A game already paid keeps what it paid. Requires the Pay referees and crew permission.

FieldTypeRequiredDescription
game_idintegeryesThe game, from list-games.
percentinteger | nullyesWhole percent above (+) or below (-) the usual fee, -100 to 500; null or 0 clears it.
CHANGEset-my-coverage

Declares which areas the connected user will officiate in, replacing their current declaration. Pass an empty list to declare that they will work nowhere. Refuses if the connected user is not an official here, or if an area belongs to another organization.

FieldTypeRequiredDescription
area_idsarray of integeryesThe 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.
CHANGEset-official-fee

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). fee_cents null clears it, so a program or game falls back to the level above. A new fee applies to every game not yet paid. Requires the Pay referees and crew permission.

FieldTypeRequiredDescription
position_idintegeryesThe position, from list-official-fees.
program_idintegernoSet this program’s own fee. Omit for the organization default.
game_idintegernoSet one game’s own fee. Never with program_id.
fee_centsinteger | nullyesThe fee per game in cents, 0 to 1000000; null clears it.
CHANGEupdate-official-agreement

Changes the organization’s agreement for referees and crew. body: the organization’s own text; a changed text saves a new version, and everyone who signed an earlier version is asked to sign again. asks: whether officials are asked to sign it. sign_first: whether an official must sign the current version before accepting a game (off by default; needs asks on and a saved version). Send only what changes. Hollis supplies no wording. Requires permission to change the organization’s settings.

FieldTypeRequiredDescription
bodystringnoThe agreement’s full text, in the organization’s own words. A change saves a new version.
asksbooleannoAsk officials to sign the agreement.
sign_firstbooleannoAn official must sign the current version before accepting a game.

Organization

CHANGEcancel-invitation

Cancels an invitation to join the organization that has not been accepted; its link stops working. The first call previews and writes nothing; call again with the returned confirmation_token to cancel.

Gate confirm
FieldTypeRequiredDescription
invitation_idintegeryesThe id of the invitation, as list-invitations returns it.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEchange-member-role

Changes a member's role within the connected organization. `user_id` must be the exact numeric id of an existing member and `role_name` must be an exact, existing role name — never resolve an ambiguous or free-text reference (a person's name, or a role name you are inferring or inventing) yourself; if either is ambiguous, call `list-members` to confirm the member and ask the user for the exact role name. This action can remove authority as easily as grant it and takes effect only after a human signed in to Hollis has reviewed and approved it.

Gate approval
FieldTypeRequiredDescription
user_idintegeryesThe member's user id.
role_namestringyesThe role to assign.
scope_typestringnoOptional. 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_idintegernoRequired 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_atstringnoOptional 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.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEcreate-custom-role

Creates a new role in the connected organization from a set of permission atoms. The role grants nothing until it is assigned to a member. A role with only player, captain, guardian, referee or crew permissions is one call; a role with any organizer permission needs a confirmation and then a human signed in to Hollis to approve it.

Gate approval
FieldTypeRequiredDescription
namestringyesThe name of the role to create.
permission_atomsarray of stringyesThe permission atoms this role grants. Must be drawn from the organization's known permission vocabulary, and only ones you hold yourself.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEcreate-organization

Creates a new organization owned by the connected user.

FieldTypeRequiredDescription
namestringyesThe name of the organization to create.
timezonestringnoIANA timezone identifier for the organization, e.g. "America/New_York". Every program and division registration window is interpreted in this zone. Defaults to UTC.
CHANGEdelete-custom-role

Deletes an org-defined role in the connected organization. A role that somebody currently holds is REFUSED, naming how many people hold it — reassign them first. Built-in roles cannot be deleted. `role_id` must be the exact numeric id of an existing role; call `list-roles` to confirm it rather than inferring one.

Gate confirm
FieldTypeRequiredDescription
role_idintegeryesThe exact numeric id of the role to delete.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READget-mail-domain

Reads the connected organization's sending identity: hostname, verification status, and (while pending) the DNS records still to add. Returns a null mail_domain if nothing has been provisioned yet, which is a normal state, not an error.

CHANGEinvite-member

Invites a user to join the connected organization under a named role. Inviting someone to a player, captain, guardian, referee or crew role is one call. A role with organizer access (admin, staff, or a custom role with any organizer permission) needs a confirmation and then a human signed in to Hollis to approve it before the invitation is sent.

Gate approval
FieldTypeRequiredDescription
emailstringyesThe email address to invite.
role_namestringyesThe role to assign the invitee.
namestringnoOptional. 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_typestringnoOptional. 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_idintegernoRequired 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_atstringnoOptional 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.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
READlist-invitations

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

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-members

Lists members of the connected organization.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-roles

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

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEprovision-mail-domain

Provisions the connected organization's default sending subdomain, or (with custom_hostname) upgrades to a custom domain. Idempotent: re-running with no custom_hostname when a domain already exists is a no-op.

FieldTypeRequiredDescription
custom_hostnamestringnoAn 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.
CHANGErevoke-member

Revokes a member's access to the connected organization. `user_id` must be the exact numeric id of an existing member — never resolve an ambiguous or free-text reference (a name, an initial, "the new player") to a person yourself; if the reference is ambiguous, call `list-members` first and ask the user which member they mean. This action destroys data: it takes effect only after a human signed in to Hollis has reviewed and approved it, and cannot be undone by calling this tool again.

Gate approval
FieldTypeRequiredDescription
user_idintegeryesThe member's user id.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEupdate-custom-role

Replaces an org-defined role's name and permission atoms in the connected organization. `permission_atoms` REPLACES the role's whole set — atoms you omit are removed from the role, and every member holding it loses them immediately. Send the complete intended set, not a delta; call `list-roles` first if you are unsure what the role carries. Built-in roles cannot be changed — copy one instead with `create-custom-role`. Every change needs a confirmation; a role that carries organizer permissions after the change also needs a human signed in to Hollis to approve it.

Gate approval
FieldTypeRequiredDescription
role_idintegeryesThe exact numeric id of the role to change.
namestringyesThe role's name. Send the existing name unchanged to edit atoms only.
permission_atomsarray of stringyesThe 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.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEupdate-organization-mail-settings

Updates the bound organization's mail settings. Sets the physical postal address that United States CAN-SPAM law requires in every bulk announcement footer, and the address announcements are sent as on the organization's own domain.

FieldTypeRequiredDescription
postal_addressstringnoThe 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_senderstringnoThe 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.
CHANGEupdate-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). Only the fields supplied are changed; omitted fields are left as they are.

FieldTypeRequiredDescription
refund_requires_approvalbooleannoWhether a refund must be approved by a second organizer before it is sent. Defaults to true for every organization.
payment_hold_minutesintegernoHow many minutes an unpaid registration holds its slot before the hold lapses. Must be at least 1.
refund_keeps_feesbooleannoWhether 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_processingbooleannoDefault 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_gameintegernoDefault 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_windowstring: "unplayed_share", "none"noDefault 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.
CHANGEupdate-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). Send only the fields to change.

FieldTypeRequiredDescription
namestringnoAt most 60 characters.
slugstringnoLowercase letters, numbers and hyphens, 3–30 characters.
timezonestringnoAn IANA time zone, e.g. America/New_York.
sportsarray of stringnoFrom: Soccer, Basketball, Volleyball, Softball, Hockey, Pickleball, Tennis, Flag football, Ultimate, Kickball, Other.
multi_sportbooleannotrue for several sports; false (the default) for exactly one.
CHANGEupdate-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). Every organization takes players 18 and over only for now (adults_only, returned; it cannot be changed yet).

FieldTypeRequiredDescription
asks_genderbooleannotrue asks players their gender once and keeps it; false never collects it.
subs_multiple_teamsbooleannotrue lets a sub play for several teams in a program; false limits a sub to the one team they play or first subbed for.
CHANGEverify-mail-domain

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.

Payment

CHANGEcancel-charge

Cancels an unpaid charge in the connected organization: its payment link stops working. The first call previews; call again with the returned confirmation_token to cancel.

Gate confirm
FieldTypeRequiredDescription
payment_idintegeryesThe charge to cancel.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEcreate-charge

Asks a member of the connected organization to pay an amount for something outside registration: emails them a payment link. The first call previews and writes nothing; call again with the returned confirmation_token to send it.

Gate confirm
FieldTypeRequiredDescription
payer_user_idintegeryesWho pays: a member of this organization.
descriptionstringyesWhat it is for, as the payer will read it (80 characters at most).
amount_centsintegeryesThe amount, in cents (50 to 200000).
program_idintegernoOptional: the program it is for.
program_team_idintegernoOptional: the program team it is for (implies its program).
due_onstringnoOptional: the date it is due, YYYY-MM-DD in the organization's time zone, today or later. It stays payable after it.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READlist-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.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEpay-charge

Starts payment of a charge the connected organization asked you to pay, via a Stripe-hosted Checkout Session. The first call previews; call again with the returned confirmation_token to get the checkout link.

Gate confirm
FieldTypeRequiredDescription
payment_idintegeryesThe charge you were asked to pay.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEpay-registration

Starts payment for your own registration via a Stripe-hosted Checkout Session. The first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually start the checkout.

Gate confirm
FieldTypeRequiredDescription
registration_idintegeryesThe id of the registration to pay for.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEpay-team-registrations

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. The first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually start the checkout.

Gate confirm
FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance whose payable registrations should be paid.
division_idintegeryesThe id of the division these registrations belong to.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGErefund-registration

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. A real, external, hard-to-fully-undo financial transfer. Depending on this organization's settings, this either requires a single confirmation or a second human's approval before it happens. The first call moves no money: it returns a confirmation_token to repeat the call with, or opens an approval request (approval_reference) that a person must approve on the web before a repeat call refunds.

Gate approval
FieldTypeRequiredDescription
registration_idintegeryesThe id of the registration to refund.
kindstring: "withdrawal", "partial", "credit"noOmit 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_centsintegernoFor 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.
reasonstring: "Injury", "Moved away", "Duplicate payment", "Program change", "Game cancelled", "Other"noRequired with kind.
notestringnoRequired when reason is "Other". At most 140 characters; shown on the invoice and in history.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.

Permit

CHANGEcreate-permit

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

FieldTypeRequiredDescription
location_idintegernoThe id of the location this permit is for. Provide location_id or sub_location_id, not both.
sub_location_idsarray of integernoWith location_id: the ids of the location's fields this permit covers. Omit for the whole location.
sub_location_idintegernoShorthand for a permit covering just this one field, at its location. Provide location_id or sub_location_id, not both.
valid_fromstringyesThe date this permit becomes valid (date string).
valid_tostringyesThe date this permit expires, strictly after valid_from.
daysarray of integeryesThe 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_timestringyesThe daily start time, in H:i (24-hour) format.
end_timestringyesThe daily end time, in H:i (24-hour) format, strictly after start_time.
reference_numberstringyesThe permit or booking reference number.
statusstringnoThe 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.
READget-permit

Returns full detail for one permit in the connected organization.

FieldTypeRequiredDescription
permit_idintegeryesThe id of the permit to retrieve.
READlist-permit-change-events

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

FieldTypeRequiredDescription
permit_idintegeryesThe id of the permit.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-permits

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

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEupdate-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.

FieldTypeRequiredDescription
sub_location_idsarray of integernoWhich of the location's fields the permit covers; an empty list = the whole location. Dropping a field is recorded as a narrowing.
permit_idintegeryesThe id of the permit to update.
valid_tostringnoThe new expiry date (date string), strictly after valid_from.
daysarray of integernoThe new set of weekdays this permit covers, as ISO weekday numbers: 1 is Monday through 7 is Sunday. English names are accepted too.
start_timestringnoThe new daily start time, in H:i (24-hour) format.
end_timestringnoThe new daily end time, in H:i (24-hour) format, strictly after start_time.
statusstringnoThe 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.

Playoffs

READget-playoff-seeds

Reads a division's playoff seeds: the official standings order within the playoff cut, the seeds (that order unless an organizer reordered it), who changed what, and whether the playoffs have started. Program team ids, first seed first.

FieldTypeRequiredDescription
division_idintegeryesThe division whose playoff seeds to read.
CHANGEmove-playoff-seed

Moves a team up or down one playoff seed in its division (swapping with its neighbour). Recorded with who made it. Refused once the playoffs have started.

FieldTypeRequiredDescription
division_idintegeryesThe division.
program_team_idintegeryesThe team to move, as get-playoff-seeds names it.
directionstring: "up", "down"yesup: one seed better; down: one seed worse.
CHANGEreset-playoff-seeds

Puts a division's playoff seeds back in the official standings order. Recorded with who made it. Refused once the playoffs have started.

FieldTypeRequiredDescription
division_idintegeryesThe division.
CHANGEstart-playoffs

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. Needs the schedule published. Asks for confirmation first.

Gate confirm
FieldTypeRequiredDescription
division_idintegeryesThe division whose playoffs to start.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.

Program

CHANGEarchive-program

Archives a program, hiding it from default lists and closing its registration gate. Destroys nothing (unarchive-program brings it back, as a draft) but is treated as destructive: the first call previews what would happen and writes nothing. If the program has divisions, this action also requires a human signed in to Hollis to review and approve it before it takes effect — call again with the returned confirmation_token, then again with the approval_reference that call returns, once a human has approved the request on the web. A program with no divisions only needs the confirmation step.

Gate approval
FieldTypeRequiredDescription
program_idintegeryesThe id of the program to archive.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEcopy-program

Copies an existing program in the connected organization into a new one, carrying its season shape, divisions structure, fee and roster rules. The copy is ALWAYS created as a DRAFT, whatever the source program's visibility was — publish it separately once it is ready. Registrants, teams, schedules and results are never copied.

FieldTypeRequiredDescription
source_program_idintegeryesThe id of the program to copy. It must belong to the connected organization.
namestringnoThe name of the new program. Omit to have one composed from the source program's name.
descriptionstringnoA description for the new program. Omit to carry the source program's own description.
first_game_onstringnoThe 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_beforeintegernoOverrides 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_beforeintegernoOverrides 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.
partsarray of string: "format", "divisions", "game_days", "fees", "questions"noWhich 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.
CHANGEcreate-program

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

FieldTypeRequiredDescription
namestringyesThe name of the program to create.
descriptionstringnoAn optional description of the program.
opens_atstringnoWhen 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_atstringnoWhen 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_onstringnoThe 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_playintegernoHow 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_weeksintegernoHow 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_beforeintegernoHow 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_beforeintegernoHow 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_daysarray of integernoThe 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_hoursobjectnoThe 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_fieldintegernoHow many players each side fields at once: the 7 in "7v7".
roster_minintegernoThe minimum number of players on a team roster. Defaults to players_on_field plus two when omitted.
max_players_per_teamintegernoThe maximum roster size. Omit for no maximum; do not send 0 to mean that.
max_teamsintegernoThe 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_periodsintegernoHow many periods a game is played in.
game_period_minutesintegernoHow many minutes each period lasts.
game_break_minutesintegernoHow many minutes of break sit between periods.
men_allowedbooleannoWhether men may play. Defaults to true.
men_min_on_fieldintegernoThe minimum number of men required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule.
women_allowedbooleannoWhether women may play. Defaults to true.
women_min_on_fieldintegernoThe minimum number of women required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule.
CHANGEcreate-program-from-template

Creates a new program from a program template in the connected organization. The template is COPIED, never linked: the new program keeps no reference to it, and editing either one afterwards does not affect the other. Any field you send overrides the template's value for that field.

FieldTypeRequiredDescription
program_template_idintegeryesThe id of the template to create this program from.
namestringyesThe name of the program to create. Required: a template states a shape, not a season, so the new program is never named for you.
descriptionstringnoAn optional description of the program. A template carries none — it is prose about one season.
first_game_onstringnoThe 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_atstringnoWhen 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_atstringnoWhen 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_daysarray of integernoThe 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_centsintegernoThe registration fee in CENTS, not in currency units. Omit to keep the template's fee.
weeks_of_playintegernoOverrides the template's weeks of regular season.
playoff_weeksintegernoOverrides the template's weeks of playoffs.
registration_opens_weeks_beforeintegernoOverrides 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_beforeintegernoOverrides 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_fieldintegernoOverrides how many players each side fields at once: the 7 in "7v7".
roster_minintegernoOverrides the minimum number of players on a team roster.
max_players_per_teamintegernoOverrides the maximum roster size.
max_teamsintegernoOverrides 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_periodsintegernoOverrides how many periods a game is played in.
game_period_minutesintegernoOverrides how many minutes each period lasts.
game_break_minutesintegernoOverrides how many minutes of break sit between periods.
men_allowedbooleannoOverrides whether men may play.
men_min_on_fieldintegernoOverrides 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_allowedbooleannoOverrides whether women may play.
women_min_on_fieldintegernoOverrides 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.
CHANGEdelete-program

Deletes a program (soft delete — nothing is permanently destroyed by this tool, but no restore surface exists in this phase). The first call previews what would happen and writes nothing. If the program has divisions, this action also requires a human signed in to Hollis to review and approve it before it takes effect — call again with the returned confirmation_token, then again with the approval_reference that call returns, once a human has approved the request on the web. A program with no divisions only needs the confirmation step.

Gate approval
FieldTypeRequiredDescription
program_idintegeryesThe id of the program to delete.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
READget-program

Returns full detail for one program in the connected organization.

FieldTypeRequiredDescription
program_idintegeryesThe id of the program to retrieve.
CHANGEinvite-to-program

Invites email addresses to register for an invite-only program; each gets an email with their own link, and only invited addresses can register. Already-invited addresses are skipped. The program must be invite only (set-program-visibility with invite_only), unless division_id is given: then each address is invited to join that division as a free agent, on an open or invite-only published program alike. Nobody is registered by being invited: they open the link, sign in and register themselves, and the division's capacity of teams never refuses a number of people. With division_id, addresses already registered in the program, already invited, unsubscribed or undeliverable are skipped, each reported with its reason. Up to 200 at a time; more than 50 asks for a confirmation first, and an organization sends at most 500 emails an hour and 2000 a day across invitations and messages.

Gate confirm
FieldTypeRequiredDescription
program_idintegeryesThe invite-only program.
emailsarray of stringyesEmail addresses to invite.
division_idintegernoOptional. 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.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READlist-program-invitations

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

FieldTypeRequiredDescription
program_idintegeryesThe invite-only program.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-programs

Lists programs in the connected organization.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
archivedbooleannotrue lists the archived programs instead of the others, so one can be brought back with unarchive-program.
CHANGEmark-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. Not for drafts or archived programs.

FieldTypeRequiredDescription
program_idintegeryesThe id of the program.
completebooleanyestrue marks it Complete by hand; false clears the mark.
CHANGEpublish-program

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

FieldTypeRequiredDescription
program_idintegeryesThe id of the program to publish.
visibilitystringyesEither "public" (listed and open to anyone) or "unlisted" (fully live and accepts registration, but omitted from listings — reachable only by direct link).
CHANGEremove-program-invitation

Removes an invited email from an invite-only program: their link stops working and they can no longer register. Someone already registered cannot be removed this way.

FieldTypeRequiredDescription
program_invitation_idintegeryesThe invitation to remove.
CHANGEset-program-visibility

Sets who can see a program's page: "public" (listed on the organization's page) or "unlisted" (anyone with the link). On a draft it sets what the program will be published as; on a published program it changes it at once.

FieldTypeRequiredDescription
program_idintegeryesThe id of the program.
visibilitystringyes"public", "unlisted", or "invite_only" (only invited emails may register; invite them with invite-to-program).
CHANGEunarchive-program

Brings an archived program back as a draft: nothing is open to players until it is published again. Registrations, teams, games and staff are untouched. Refused for a program that is not archived.

FieldTypeRequiredDescription
program_idintegeryesThe id of the archived program.
CHANGEupdate-program

Updates a program's name, description, registration window or season shape, or flips its early-close switch. Only the fields supplied are changed; omitted fields are left as they are. Every field stays editable after publish. When a change leaves committed games that no longer fit (a game on a day, hour or field the program no longer plays, or outside its dates), nothing is refused and no game moves: the program is flagged and a task asks for the schedule to be regenerated. On a program with one game day, moving first_game_on to another weekday moves the game day with it.

FieldTypeRequiredDescription
program_idintegeryesThe id of the program to update.
namestringnoThe new name of the program.
descriptionstringnoThe new description of the program.
opens_atstringnoWhen 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_atstringnoWhen 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_closedbooleannoSet true to close registration early without changing the program's visibility or dates — set back to false to reopen it just as cheaply.
fee_centsintegernoRegistration fee in cents. Omit to leave unchanged; pass null to clear the fee.
full_refund_days_before_first_gameintegernoHow 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_windowstringnoWhat 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_minutesintegernoMinutes 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_cutstringnoWho reaches the playoffs. Exactly one of: top_4, top_2, all. Unset reads as top_4. Editable after publish.
early_bird_fee_centsintegernoThe 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_weeksintegernoHow many weeks after registration opens the early-bird price lasts (1-52). Pass null to clear.
rsvp_remindersbooleannoWhether 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_remindersbooleannoWhether 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_remindersbooleannoWhether 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_remindersbooleannoWhether 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_remindersbooleannoWhether 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_centsintegernoWhat 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_processingbooleannoWhether 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_allowedbooleannoResults: 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.
questionsarray of objectnoThe 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_idintegernoThe 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_daysarray of objectnoThe 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_onstringnoThe 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_playintegernoHow many weeks of regular season are played. Editable after publish.
playoff_weeksintegernoHow 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_beforeintegernoHow many weeks before the first game registration opens; may be negative. Changing it re-derives opens_at. Editable after publish.
registration_closes_days_beforeintegernoHow many days before the first game registration closes; may be negative. Changing it re-derives closes_at. Editable after publish.
game_daysarray of integernoThe days of the week games are played on, as ISO weekday numbers: 1 is Monday through 7 is Sunday.
game_day_hoursobjectnoThe 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_idsarray of integernoThe 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_fieldintegernoHow many players each side fields at once: the 7 in "7v7".
roster_minintegernoThe minimum number of players on a team roster.
max_players_per_teamintegernoThe maximum roster size; omit for no maximum rather than sending 0.
game_periodsintegernoHow many periods a game is played in.
game_period_minutesintegernoHow many minutes each period lasts.
game_break_minutesintegernoHow many minutes of break sit between periods.
men_allowedbooleannoWhether men may play.
men_min_on_fieldintegernoThe minimum number of men required on the field; 0 is a requirement of none, which is a different rule from having no requirement.
women_allowedbooleannoWhether women may play.
women_min_on_fieldintegernoThe minimum number of women required on the field; 0 is a requirement of none, which is a different rule from having no requirement.

Program team

CHANGEadd-team

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. The team shows as awaiting captain until they do. Never discloses the invitation link.

FieldTypeRequiredDescription
division_idintegeryesThe division to add the team to.
namestringnoThe new team's name. Required unless team_id is given.
captain_emailstringnoThe 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_idintegernoA team of this organization that played before, to add again with its own name instead of typing one. Not already in the program.
placementstring: "division", "waitlist"no"division" takes one of its spots (refused when full); "waitlist" joins its wait list. Defaults to division.
CHANGEassign-captain

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

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the per-program team instance to assign a captain for.
captain_user_idintegernoThe id of the organization member to make captain. Omit this field entirely to clear the current captaincy.
CHANGEassign-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. Exactly one per team; naming another replaces the current one.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the per-program team instance.
co_captain_user_idintegernoThe id of the organization member to make co-captain. Omit this field entirely to clear the co-captaincy.
CHANGEchoose-team-payment

Chooses who pays for one team's entry. captain_pays true: the captain pays for the whole team (the division's roster minimum times the per-player price), which covers that many places, the captain's included; players who join after those pay their own share; a free agent placed on the team pays as usual and that money becomes the captain's credit, held until the season ends. false: each player pays their share (the default). Only the team's captain or co-captain, or someone who manages its roster, and only before anyone on the team has paid.

FieldTypeRequiredDescription
program_team_idintegeryesThe per-program team instance.
captain_paysbooleanyestrue: the captain pays for the whole team; false: each player pays their share.
CHANGEcreate-team-from-free-agents

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. Nobody is put on the roster by this call. Refused, with nothing sent, when the selection misses the division's roster minimum or maximum or a gender minimum. Never discloses a link.

FieldTypeRequiredDescription
division_idintegeryesThe division the free agents are registered in; the team is added to it.
namestringyesThe new team's name.
registration_idsarray of integeryesThe selected free agents' registrations, captain included.
captain_registration_idintegernoOne of registration_ids, to invite as captain. Give this or captain_email.
captain_emailstringnoSomeone else to invite as captain, when none of the free agents is. Give this or captain_registration_id.
CHANGEenter-program

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

FieldTypeRequiredDescription
program_idintegeryesThe id of the program to enter the team into.
team_idintegeryesThe id of the persisted team to enter.
READget-program-team

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

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the per-program team instance to retrieve.
READlist-program-teams

Lists teams entered into a program in the connected organization.

FieldTypeRequiredDescription
program_idintegeryesThe id of the program whose entered teams to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READmy-teams

Lists the teams the connected user is on in this organization, and flags which ones they captain. Use this first to find a program_team_id for roster tools.

FieldTypeRequiredDescription
captain_onlybooleannoWhen true, returns only the teams the connected user captains.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEremove-program-team

Removes a team's per-program instance from a program. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually remove it. The removal is a soft delete of the instance and a hard delete of its roster entries — the underlying team and program rows are untouched. Registrations on the team with nothing paid, signed or not, are cancelled; each paid player becomes a task to refund or credit them (no money moves here; to settle one now, call refund-registration for their registration, under its own approval). Games not yet played keep their slot with a stand-in side, "Pending Team #N"; games already played keep the team's name and score.

Gate confirm
FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance to remove.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEresend-captain-invitation

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). Never discloses the link.

FieldTypeRequiredDescription
captain_invitation_idintegeryesThe captain invitation to re-send.
captain_emailstringnoOptional. Invite this address instead (design-v2 D-117). Required when the invited captain declined.
CHANGEresign-captaincy

Resigns the caller's own captaincy (or co-captaincy) of a per-program team instance; they stay on the roster as a player. A captain with a co-captain hands over to them at once; a captain with none stays captain until the organizer names a new one, and the organizer is given a task.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the per-program team instance whose captaincy the caller resigns.

Program template

CHANGEcreate-program-template

Creates a reusable program template in the connected organization. A template holds a program's SHAPE only — no dates, no season, no people — and is copied into a new program at create time, never linked to one.

FieldTypeRequiredDescription
namestringyesThe name of the template to create, as an organizer would recognise it — for example "7v7 Coed".
players_on_fieldintegernoHow many players each side fields at once: the 7 in "7v7".
max_teamsintegernoThe 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_minintegernoThe 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_teamintegernoThe maximum roster size. Omit for no maximum; do not send 0 to mean that.
game_periodsintegernoHow many periods a game is played in.
game_period_minutesintegernoHow many minutes each period lasts.
game_break_minutesintegernoHow many minutes of break sit between periods.
men_allowedbooleannoWhether men may play. Defaults to true.
men_min_on_fieldintegernoThe minimum number of men required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule.
women_allowedbooleannoWhether women may play. Defaults to true.
women_min_on_fieldintegernoThe minimum number of women required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule.
fee_centsintegernoThe registration fee in CENTS, not in currency units — 5000 is fifty dollars.
registration_opens_weeks_beforeintegernoHow 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_beforeintegernoHow 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_playintegernoHow many weeks of regular season are played.
playoff_weeksintegernoHow 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.
settingsobjectnoThe 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.
CHANGEdelete-program-template

Removes a program template from the connected organization. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually remove it. Programs already created from the template are NOT affected in any way — a program is a copy, never a link. The removal is a soft delete.

Gate confirm
FieldTypeRequiredDescription
program_template_idintegeryesThe id of the program template to remove.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READlist-program-templates

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

FieldTypeRequiredDescription
formatintegernoKeep only templates whose players_on_field equals this exactly — the 7 in "7v7". Omit for any format.
genderstringnoOne of "coed", "mens" or "womens". Reads the two allowed-to-play booleans; omit for any gender.
lengthintegernoKeep only templates whose weeks_of_play equals this exactly. Omit for any length.
sortstringnoOne 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.
CHANGEsave-program-as-template

Saves an existing program's shape as a reusable program template. Carries the game shape, gender rules, fee, team maximum and relative registration offsets — never the dates, the registration window, the visibility, or anyone registered. The program itself is unchanged and is not linked to the template afterwards.

FieldTypeRequiredDescription
program_idintegeryesThe id of the program whose shape to save.
namestringnoA name for the new template. Omit to reuse the program's own name.
CHANGEupdate-program-template

Edits an existing program template in the connected organization. Only the fields you send are changed; everything else is left exactly as it was.

FieldTypeRequiredDescription
program_template_idintegeryesThe id of the program template to edit.
namestringnoA new name for the template. Renaming does NOT change the template's slug, which stays the durable public identifier.
players_on_fieldintegernoHow many players each side fields at once: the 7 in "7v7".
max_teamsintegernoThe 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_minintegernoThe 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_teamintegernoThe maximum roster size. Omit for no maximum; do not send 0 to mean that.
game_periodsintegernoHow many periods a game is played in.
game_period_minutesintegernoHow many minutes each period lasts.
game_break_minutesintegernoHow many minutes of break sit between periods.
men_allowedbooleannoWhether men may play. Defaults to true.
men_min_on_fieldintegernoThe minimum number of men required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule.
women_allowedbooleannoWhether women may play. Defaults to true.
women_min_on_fieldintegernoThe minimum number of women required on the field. Omit for no requirement; 0 is a requirement of none, which is a different rule.
fee_centsintegernoThe registration fee in CENTS, not in currency units — 5000 is fifty dollars.
registration_opens_weeks_beforeintegernoHow 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_beforeintegernoHow 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_playintegernoHow many weeks of regular season are played.
playoff_weeksintegernoHow 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.
settingsobjectnoThe 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.

Registration

CHANGEaccept-waiver

Accepts the connected user's own waiver for one of their pending registrations, completing it. The first call previews the waiver text and writes nothing; call again with the returned confirmation_token to actually accept it.

Gate confirm
FieldTypeRequiredDescription
registration_idintegeryesThe id of your own pending registration to accept the waiver for.
signed_namestringyesThe 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.
answersarray of objectnoYour answers to the program's registration questions. Questions you leave out keep your most recent earlier answer.
genderstringnowoman, 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.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEcancel-registration

Cancels a registration. Destroys nothing irreversibly (the row remains as a historical record): the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually cancel it.

Gate confirm
FieldTypeRequiredDescription
registration_idintegeryesThe id of the registration to cancel.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEextend-payment-hold

Gives an unpaid registration more time to pay: its payment hold runs for the organization's hold length from now. A lapsed hold keeps its spot until an organizer extends it or releases the spot with cancel-registration.

FieldTypeRequiredDescription
registration_idintegeryesThe id of the registration whose payment hold to extend.
READget-registration

Returns full detail for one registration in the connected organization.

FieldTypeRequiredDescription
registration_idintegeryesThe id of the registration to retrieve.
READlist-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. A player's email is included only if you can view members. Use offer-placement to place one on a team.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division whose free agents to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-registrations

Lists registrations in the connected organization, optionally filtered by program_id, division_id, or status.

FieldTypeRequiredDescription
program_idintegernoNarrow to registrations in this program.
division_idintegernoNarrow to registrations in this division.
statusstringnoNarrow to registrations with this status (pending_waiver, registered, waitlisted, cancelled). Any other value is refused.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEmove-registration

Moves the connected caller's own registration — or, for an organizer, any registration in this organization — to a different division of the SAME program. Does not require confirmation: it changes an existing row's division, never creating or cancelling one.

FieldTypeRequiredDescription
registration_idintegeryesThe id of the registration to move — your own, or any you hold registrations.manage for.
division_idintegeryesThe id of the target division, within the same program as the registration.
CHANGEmove-team-registrations

Moves every active registration on a program-team instance's roster to a different division of the SAME program, in one call. Does not require confirmation: it changes existing rows' division, never creating or cancelling one.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance whose roster registrations should be moved.
division_idintegeryesThe id of the target division, within the same program as the roster's registrations.
CHANGEmove-team-to-waitlist

Moves a team off its spot in a division and back onto that division's wait list, freeing the spot. Anyone on the team who has paid is refunded what is left of their payment in the same act. Refused once the season has started. The first call moves nothing: it returns a confirmation_token, or, when it refunds and the organization requires approval for refunds, opens an approval request (approval_reference) that a second person must approve on the web before a repeat call goes ahead.

Gate approval
FieldTypeRequiredDescription
program_team_idintegeryesThe team (program team id) to move.
division_idintegeryesThe division whose spot it gives up.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
READmy-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. Where a place has a price, accepting it means paying it by that same time (expires_at): there is one deadline to accept and pay. A move to a team in another division carries price_difference_cents, what accepting changes in your price (positive costs more, negative costs less and is given as credit if you have paid, 0 nothing); null on a place offered to a free agent.

READmy-registrations

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

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEoffer-placement

Offers a free agent (a registration with no team) a place on a team in their division. The player is emailed and has 24 hours to accept or decline; nothing changes on the roster until they accept. Never discloses the offer link.

FieldTypeRequiredDescription
registration_idintegeryesThe free agent's registration.
program_team_idintegeryesThe team to offer them a place on.
CHANGEoffer-team-move

Offers a player who is on a team a move to another team of the program, in their division or another. The player is emailed and has 24 hours to accept or decline; they stay on their current team until they accept, and accepting moves them in one step. A move to a team in another division can change what they owe, and the offer states the amount before they accept (price_difference_cents: positive costs more, negative costs less, 0 nothing; it also says source_team_left_empty: true when nobody else would stay on the team they leave, the move still going through): an unpaid place is re-priced and paid the usual way, a paid place that costs more is charged the difference with a pay link, and either way the player has seven days from accepting to pay, while one that costs less is given the difference as credit, never to the card. A move to or from a team that pays its whole entry is refused, as is moving a captain or co-captain. Never discloses the offer link.

FieldTypeRequiredDescription
registration_idintegeryesThe registration of the player who is on a team.
program_team_idintegeryesThe team to offer to move them to, in their division or another.
CHANGEpromote-registration

Promotes a waitlisted registration into its division. Destroys nothing: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually promote it.

Gate confirm
FieldTypeRequiredDescription
registration_idintegeryesThe id of the registration to promote.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEregister-for-division

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

FieldTypeRequiredDescription
division_idintegeryesThe id of the division to register for.
waiver_acceptedbooleanyesMust be true — confirms the connected user accepts the organization's current waiver.
signed_namestringyesThe 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_idintegernoOptional. Joins this existing team instance of the same program. Mutually exclusive with team_name.
team_namestringnoOptional. Creates a new team with this name and joins it. Mutually exclusive with program_team_id. Does not confer captaincy.
bring_back_program_team_idintegernoOptional. 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_keeparray of integernoOptional, 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_addarray of stringnoOptional, with bring_back_program_team_id. New email addresses to invite to the team.
answersarray of objectnoYour answers to the program's registration questions. Questions you leave out keep your most recent earlier answer.
genderstringnowoman, 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.
CHANGEregister-team

Registers every player on a program-team instance's roster into a division of the connected organization. Each player enters a pending-waiver state and must accept their own waiver individually (see accept-waiver) before their registration is confirmed.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance whose roster should be registered.
division_idintegeryesThe id of the division to register the roster into.
CHANGErespond-to-placement-offer

Accepts or declines one of YOUR OWN placement offers (see my-placement-offers). Accepting puts you on the team's roster; where the place has a price, you pay it by the offer's own expiry (pay_by), the same deadline you had to accept, and the place is held for you until then. Declining keeps you in the free-agent pool, and that team cannot offer again this program.

FieldTypeRequiredDescription
placement_offer_idintegeryesThe offer to answer.
answerstring: "accept", "decline"yesaccept or decline.
CHANGEupdate-my-registration-answers

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

FieldTypeRequiredDescription
registration_idintegeryesThe id of one of your own registrations (my-registrations).
answersarray of objectnoYour answers to the program's registration questions. Questions you leave out keep your most recent earlier answer.
genderstringnowoman, 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.
CHANGEwithdraw-my-registration

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. What was paid is refunded in full: refund_to card sends it back to the card that paid, less the processing charge where the league keeps it on refunds; credit gives all of it as credit for a later registration, nothing kept back (only when the caller paid it themselves). A place someone else covered, or one not paid yet, is released and nothing is refunded. The first call previews what would happen and writes nothing; repeat it with the confirmation_token it returns.

Gate confirm
FieldTypeRequiredDescription
registration_idintegeryesThe caller's own registration.
refund_tostring: "card", "credit"noWhere 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.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.

Registration question

CHANGEcreate-registration-question

Adds a question to the organization's registration library. answer_type is choice (pick one), several (pick several), text, long_text, number, phone, email, yes_no or date; choice and several take two or more options, the others none. Left out, options make it a choice and no options make it text. A program then asks it through update-program's `questions`.

FieldTypeRequiredDescription
labelstringyesThe question as players read it, unique in the organization.
answer_typestringnochoice (pick one), several (pick several), text, long_text, number, phone, email, yes_no or date.
optionsarray of stringnoTwo or more answers to pick from (choice or several only); null otherwise.
READlist-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). A program asks some of them — set with update-program's `questions`.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEupdate-registration-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). Every program asking it asks the new wording from the next registration; earlier answers keep pre-filling because the question keeps its identity. A retired question cannot be picked by a program; programs already asking it keep asking it. Position and Skill level are always choice.

FieldTypeRequiredDescription
question_idintegeryesThe id of the library question (list-registration-questions).
labelstringnoNew wording, unique in the organization.
answer_typestringnochoice (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.
optionsarray of stringnoA choice's or several's answers, two or more; null otherwise.
retiredbooleannotrue retires it, false brings it back.

Roster

CHANGEadd-roster-player

Adds a player to one program-team instance's roster in the connected organization. The player must already be a member of this organization.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance to add the player to.
user_idintegeryesThe id of the user to add. Must already be a member of this organization.
CHANGEbring-back-players

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. Pass user_ids from list-bring-back-players, or none to invite everyone offered. Captain only. Never discloses the invitation links.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the team you captain, as entered in this program.
user_idsarray of integernoThe 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.
CHANGEcancel-team-invitation

Takes back an invitation to a program-team instance's roster that nobody has accepted; its link stops working. The first call previews and writes nothing; call again with the returned confirmation_token to cancel.

Gate confirm
FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance the invitation is to.
invitation_idintegeryesThe id of the team invitation to take back (from invite-to-team).
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEinvite-to-team

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

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance to invite to.
emailstringyesThe email address to invite.
namestringnoOptional. 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).
READlist-bring-back-players

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. Each row carries the user_id bring-back-players takes. Captain only; empty when nobody is left to offer.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the team you captain, as entered in this program.
READlist-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.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance to list candidate members for.
players_onlybooleannoOptional. 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.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-organization-rosters

Lists every program-team instance with a roster in the connected organization. An atom holder (rosters.view) sees every instance; an attached-only caller (captain or rostered player) sees only the instance(s) they are attached to.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-roster

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

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance whose roster to list.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-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. Optionally narrow by status. Each row carries the invitation_id cancel-team-invitation takes.

FieldTypeRequiredDescription
program_idintegernoList the invitations of every team you may manage in this program.
program_team_idintegernoList the invitations of this one team instance. Wins over program_id.
statusstringnoNarrow to one status: pending, accepted, cancelled, expired.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEput-back-roster-player

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). Refused while the player is on another of the program's teams.

FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance the player was removed from.
user_idintegeryesThe id of the removed player.
CHANGEremove-roster-player

Removes a player from a program-team instance's roster. Their registration on that team is cancelled with it when nothing is paid, signed or not; a paid registration, or one with a checkout in progress, is left for the organizer. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually remove the player.

Gate confirm
FieldTypeRequiredDescription
program_team_idintegeryesThe id of the program-team instance to remove the player from.
user_idintegeryesThe id of the user to remove from the roster.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.

Rsvp

CHANGEanswer-rsvp

Says whether you are playing a game: answer is yes or no, with an optional reason on a no. Only a player on one of the game’s two rosters can answer, only for themselves, and only before kickoff. Answers can be changed. No answer counts as not playing.

FieldTypeRequiredDescription
game_idintegeryesThe game.
answerstringyesyes or no.
reasonstringnoOptional, on a no: why (up to 120 characters).
READlist-game-rsvps

Lists who is playing a game: per team, how many said yes, no, or have not answered (which counts as no), whether the team is at forfeit risk, and each player’s answer and check-in. You see only the teams whose roster you may read.

FieldTypeRequiredDescription
game_idintegeryesThe game.
CHANGEremind-rsvp

Emails the RSVP ask again to players on one team of a game who have not answered. Without user_ids, everyone on the team who has not answered is asked. Needs the team’s captain or permission to manage rosters.

FieldTypeRequiredDescription
game_idintegeryesThe game.
program_team_idintegeryesWhich of the two teams.
user_idsarray of integernoOptional: only these players (each must be on the team and not have answered).

Schedule

CHANGEcommit-schedule

Promotes a division's draft games to committed, making the schedule visible to players and ready to distribute. The first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually commit it. You can still edit, add, or remove individual games afterward. Refused while the program is still draft: publish the program first.

Gate confirm
FieldTypeRequiredDescription
division_idintegeryesThe id of the division whose draft schedule to commit.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEcreate-game

Adds one game to a division's schedule. Both teams must already be entered in that division.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division to add this game to.
round_numberintegeryesWhich round of the schedule this game belongs to.
scheduled_atstringyesWhen 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_idintegeryesThe id of the home team's entry in this program. Must already be entered in this division.
away_program_team_idintegeryesThe 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_idintegernoThe 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_minutesintegernoHow long this game runs, in minutes. Required if sub_location_id is set.
CHANGEdecide-makeup

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. Depending on this organization's settings it needs a single confirmation or a second person's approval; the first call changes nothing: it returns a confirmation_token, or opens an approval request (approval_reference) that a person must approve on the web before a repeat call goes ahead. A refund cannot be decided here: a person decides it on the Schedule tab, or you use refund-registration per player.

Gate approval
FieldTypeRequiredDescription
division_idintegeryesThe id of the division the cancelled game belongs to.
game_idintegeryesThe id of the cancelled game in the make-up queue.
decisionstring: "credit"yescredit — each paid player's share of the fee, as credit.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEdelete-game

Removes a game from a division's schedule. A published game is cancelled with a reason (Location, Team, Officials, Weather, or Other with a note) and goes to the make-up queue; make it up with schedule-makeup. Destroys nothing outside Hollis: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually remove it. Cancelling a game is recoverable by adding it back — it is a status flip, not a permanent delete.

Gate confirm
FieldTypeRequiredDescription
division_idintegeryesThe id of the division this game belongs to.
game_idintegeryesThe id of the game to remove.
reasonstring: "Location", "Team", "Officials", "Weather", "Other"noFor a published game: why it is cancelled. It goes to the make-up queue.
notestringnoWhat happened, up to 140 characters; required when the reason is Other.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEdistribute-schedule

Distributes a division's committed schedule by emailing it to every non-suppressed contact on one of the connected organization's contact lists. A real, external, hard-to-fully-undo mail delivery under the organization's own sending domain — there is no unsend. The division must already have a committed schedule (generate and commit one first). This action takes effect only after a human signed in to Hollis has reviewed and approved it, and cannot be redeemed a second time for a different division, a different list, or a schedule that has since changed.

Gate approval
FieldTypeRequiredDescription
division_idintegeryesThe id of the division whose committed schedule to distribute.
contact_list_idintegeryesThe id of the contact list to send the schedule to.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
CHANGEemail-schedule

Emails each registered player in a division their own team's published games (one email per person, transactional). Use after publishing the schedule; returns how many people were emailed. Refused while the program is still draft.

Gate confirm
FieldTypeRequiredDescription
division_idintegeryesThe division whose published schedule to email.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEgenerate-schedule

Generates or regenerates a round-robin schedule for a division. Refused, with nothing written, when the rounds need more weeks than a weeks_of_play a person set; the refusal says by how much and what to change. While weeks_of_play follows the published schedule, a regenerate that makes the season longer is not refused and its confirmation says how many weeks longer and the new end. Never places a game today or earlier: placing starts on the first game day after today, games already played (today and before, not cancelled or held) are kept and count toward the round robin, and the confirmation says how many stay and where placing starts. A first generation (no existing games) writes immediately. Regenerating replaces every generated game with a newly generated set, but preserves games you added or edited by hand and cancelled games, so it needs a confirmation round-trip first; with only_missing every placed game stays and only the games without a slot are placed again. The confirmation lists the games the run writes, and a plan the run would refuse is refused before a confirmation token is issued. Regenerating a schedule already sent to registrants additionally needs a human signed in to Hollis to approve it — call again with the returned confirmation_token, then again with the approval_reference that call returns, once a human has approved the request on the web.

Gate approval
FieldTypeRequiredDescription
division_idintegeryesThe id of the division to generate a schedule for.
season_startstringyesISO date the first round is scheduled on.
interval_daysintegernoNumber of days between rounds. Defaults to 7.
pairingstring: "seeded", "random"noSeeded: 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_teamintegernoGames 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_weekintegernoRounds per week (1-3). Defaults to 1.
only_missingbooleannoKeep every placed game and give slots only to games that have none. Defaults to false (replace every generated game).
slot_orderstring: "ordered", "random"noordered: first free field and time; random: any free field and time. Defaults to ordered.
expected_program_team_idsarray of integernoOptional 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.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
approval_referencestringnoThe reference Hollis returned with approval_required when this request was opened. Send it back on a repeat call: it does nothing until a human has approved this exact request at the approval URL, and you cannot approve it yourself. A value you make up matches no request.
READget-game

Returns full detail for one game in a division's schedule.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division this game belongs to.
game_idintegeryesThe id of the game to retrieve.
READlist-games

Lists a division's games, ordered by round then scheduled time. Optionally filter by status (draft, committed, or cancelled).

FieldTypeRequiredDescription
division_idintegeryesThe id of the division whose games to list.
statusstringnoFilter by status: draft, committed, or cancelled. Omit to list every non-cancelled game.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READlist-organization-schedule

Lists every fixture in the connected organization, ordered by date then round. An atom holder (divisions.view) sees every non-cancelled game; an attached-only caller (captain or rostered player) sees only their own team's committed fixtures.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
READmy-schedule

Lists the upcoming committed games for the teams the connected user is on in this organization. Shows nothing for someone not on a roster.

CHANGEpin-game

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). A game added or edited by hand is already pinned. Held and cancelled games are refused.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division this game belongs to.
game_idintegeryesThe id of the game.
pinnedbooleanyestrue keeps the game where it is when the schedule is regenerated; false releases it to the generator.
CHANGEschedule-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. The cancelled game stays, marked made up. Refused for a game not in the queue.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division the cancelled game belongs to.
game_idintegeryesThe id of the cancelled game in the make-up queue.
scheduled_atstringyesWhen 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_idintegeryesThe field it is played on.
duration_minutesintegernoIts length; defaults to the cancelled game's.
CHANGEupdate-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. Only the fields supplied are changed; omitted fields are left as they are. Both teams must already be entered in the division. Moving a game onto a day an assigned referee or crew member is away takes them off it: that first call previews who comes off and writes nothing; call again with the returned confirmation_token to move it. A game that needs a place (status held) is placed by giving it sub_location_id, scheduled_at and duration_minutes together, and nothing else about it can be changed until then; once placed it is a draft until the schedule is published again, and teams who had it keep seeing Time TBD until then.

Gate confirm
FieldTypeRequiredDescription
division_idintegeryesThe id of the division this game belongs to.
game_idintegeryesThe id of the game to update.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
round_numberintegernoWhich round of the schedule this game belongs to.
scheduled_atstringnoWhen 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_idintegernoThe id of the home team's entry in this program. Must already be entered in this division.
away_program_team_idintegernoThe 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_idintegernoThe id of the field to place this game on. Two games may never occupy the same field at overlapping times.
duration_minutesintegernoHow long this game runs, in minutes. Required if sub_location_id is set.
keep_herebooleannotrue 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.

Scoring

CHANGEask-official-for-score

Emails the official assigned to a game that has started and has no score, asking for the score with a link to enter it. Recorded in the program history. At most once an hour per game.

FieldTypeRequiredDescription
game_idintegeryesThe id of the game that has no score.
CHANGEconfirm-game-result

Confirms a score the other team's captain entered, so it counts in the official standings. Only the opposing captain or organization staff may confirm; a disputed result is settled by the organizer instead. Unanswered results confirm themselves after 24 hours.

FieldTypeRequiredDescription
game_result_idintegeryesThe result to confirm.
READget-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. Three points for a win, one for a draw. A fixture that was cancelled or not played contributes nothing and is not counted as missing. Nothing is assumed for a game with no result — it is listed, never scored as a nil-nil.

FieldTypeRequiredDescription
division_idintegeryesThe id of the division whose table and missing fixtures to return.
viewstring: "live", "official"nolive (default) counts every entered score; official counts confirmed, undisputed results only — the table that decides anything.
READlist-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". Ordered by kickoff, earliest first. A fixture that was cancelled, or that already carries a terminal disposition (forfeit, abandoned, not played), is RESOLVED and does not appear here. Use record-game-result or record-game-disposition to clear one.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEraise-result-dispute

Raises a dispute against a RECORDED result, stating what is being disputed. The result itself is NOT changed and stays live in the standings until somebody settles the dispute and separately re-records the score. A result may carry only ONE open dispute at a time — settle the open one before raising another. A dispute with no stated reason is refused, because it cannot resolve to an outcome.

FieldTypeRequiredDescription
game_result_idintegeryesThe id of the recorded result being disputed. Returned by record-game-result and record-game-disposition.
reasonstringyesWhat 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.
CHANGErecord-game-disposition

Records what happened to a fixture that produced NO played score: forfeit, abandoned, not_played or cancelled. There is no default — name one. Use record-game-result for a game that was played; this tool refuses `played`. A forfeit needs forfeit_winner (home or away) and the score is decided by Hollis, not by you. Only an abandoned game may carry scores. Recording a second time OVERWRITES the stored result and keeps the previous one in the revision history, attributed to you.

FieldTypeRequiredDescription
game_idintegeryesThe id of the fixture whose disposition to record.
result_typestringyesWhat happened instead of a played result: forfeit, abandoned, not_played, cancelled. There is no default — omitting this is refused rather than guessed.
forfeit_winnerstringnohome 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_scoreintegernoGoals the HOME team had scored when the game was abandoned. Accepted only for an abandoned game; omit it and nothing is assumed.
away_scoreintegernoGoals the AWAY team had scored when the game was abandoned. Accepted only for an abandoned game.
reasonstringnoWhy the result is being changed. Recorded on the revision when this overwrites an existing result.
CHANGErecord-game-result

Records the PLAYED score for a fixture — the two teams turned up and the game finished. If the game did not produce a score (forfeit, abandoned, not played, cancelled) use record-game-disposition instead; this tool refuses a disposition and that tool refuses a score. Recording a second time OVERWRITES the stored result and keeps the previous one in the revision history, attributed to you; pass `reason` to say why. A cancelled fixture has no played result.

FieldTypeRequiredDescription
game_idintegeryesThe id of the fixture whose played result to record.
home_scoreintegeryesGoals scored by the HOME team. Required — there is no default, and a missing score is refused rather than treated as nil.
away_scoreintegeryesGoals scored by the AWAY team. Required, for the same reason as home_score.
reasonstringnoWhy the result is being changed. Recorded on the revision when this overwrites an existing result; ignored on a first recording.
CHANGEremove-game-result

Removes a game's recorded result, so the game reads as unscored again in standings and the unscored queue. Its history is kept. The first call previews what would happen and writes nothing; call again with the returned confirmation_token to remove it. Refused while the result is disputed.

Gate confirm
FieldTypeRequiredDescription
game_idintegeryesThe id of the game whose result to remove.
reasonstringnoWhy, kept in the result's history. Optional.
confirmation_tokenstringnoThe token the first call returned; send it to actually remove the result.
CHANGEsettle-result-dispute

Settles an OPEN dispute to a stated outcome: upheld, rejected or withdrawn. A settlement is FINAL — it cannot be revised, and settling an already-settled dispute is refused. Upholding a dispute does NOT change the score: if the result is wrong, record it again with record-game-result, which is a separate act with its own attribution and its own revision entry. A settlement with no stated outcome is refused.

FieldTypeRequiredDescription
dispute_idintegeryesThe id of the OPEN dispute to settle. Returned by raise-result-dispute.
statusstringyesHow the dispute resolves: upheld, rejected, withdrawn. `open` is refused — it is where a dispute starts, not somewhere it can be settled to.
outcomestringyesWhat 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.

Sub

CHANGEaccept-sub-call

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. They are recorded as a sub for that game and team, and the team's captain and co-captain are emailed. Use pay-sub-fee to pay now, or they pay the referee at kickoff.

FieldTypeRequiredDescription
sub_call_idintegeryesThe sub call to take a place in.
CHANGEcall-subs

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. Only the team's captain or co-captain, or someone who manages its roster. Each person on the bench is emailed, in the order they joined, with the per-game fee and a one-tap link; the first to accept fill the places.

FieldTypeRequiredDescription
game_idintegeryesThe game the team is short for.
program_team_idintegeryesThe per-program team instance that is short.
CHANGEjoin-bench

Puts the caller on a division's on-call bench of substitutes. They accept the program's waiver and that a sub pays the per-game fee, now or to the referee at kickoff. When a team is short for a game, its captain can call the bench, earliest joiner first.

FieldTypeRequiredDescription
division_idintegeryesThe division whose bench to join.
waiver_acceptedbooleanyesThe caller accepts the program's waiver. Must be true.
signed_namestringyesThe 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_understoodbooleanyesThe caller understands a sub pays the per-game fee. Must be true.
CHANGEleave-bench

Takes the caller off a division's on-call bench. A game they already agreed to sub in is unchanged.

FieldTypeRequiredDescription
division_idintegeryesThe division whose bench to leave.
READmy-sub-calls

Returns the divisions whose bench the caller is on, the open sub calls to those benches for games not yet started, and the games the caller is subbing in with whether their fee is paid.

CHANGEpay-sub-fee

Starts paying the caller's own per-game sub fee online and returns a checkout_url to send them to. A second call returns the same checkout while it is open. Paying the referee at kickoff is also allowed.

FieldTypeRequiredDescription
game_substitute_idintegeryesThe caller's own sub record (from accept-sub-call or my-sub-calls).
CHANGEset-auto-call-subs

Switches automatic sub calls on or off for one team. When on, if the team is short of the game-ready minimum by yes RSVPs 48 hours before a game, the division's bench is called in the captain's name, as if the captain had pressed Call subs. Off by default. Only the team's captain or co-captain, or someone who manages its roster.

FieldTypeRequiredDescription
program_team_idintegeryesThe per-program team instance.
onbooleanyestrue to call the bench automatically at T-48h when short; false for the captain's tap only.

Task

CHANGEclose-task

Closes a task. The first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually close it.

Gate confirm
FieldTypeRequiredDescription
feeder_keystringyesThe registry key of the task type to close.
subject_keystringyesThe stable subject identifier for this task instance.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEcreate-ad-hoc-task

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

FieldTypeRequiredDescription
titlestringyesThe title of the ad-hoc task.
descriptionstring | nullnoAn optional description of the ad-hoc task.
remind_onstring | nullnoAn optional reminder date, YYYY-MM-DD.
assigned_user_idinteger | nullnoAn optional member who works the task list, to put it on their list.
categorystring | nullnoOptional; one of: Payments, Locations, Referees, Teams, Player questions.
CHANGEdelete-ad-hoc-task

Deletes a task a person added. Tasks from Hollis cannot be deleted; they clear themselves when fixed. The first call previews and writes nothing; call again with the returned confirmation_token to delete.

Gate confirm
FieldTypeRequiredDescription
task_idintegeryesThe id of the task to delete.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEdismiss-task

Dismisses a task. The first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually dismiss it.

Gate confirm
FieldTypeRequiredDescription
feeder_keystringyesThe registry key of the task type to dismiss.
subject_keystringyesThe stable subject identifier for this task instance.
reasonstringyesWhy this task is being dismissed.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READlist-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). Each row carries the feeder_key and subject_key that close-task, dismiss-task and snooze-task take. Optionally narrow by tab (open, mine, hollis, done) or category.

FieldTypeRequiredDescription
tabstringnoWhich tasks: open, mine, hollis, done. Defaults to open.
categorystringnoNarrow to one category: Payments, Locations, Referees, Teams, Player questions.
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEreopen-task

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. Who closed it stays on record. A task raised by Hollis stays closed once closed, and a dismissed task stays dismissed.

FieldTypeRequiredDescription
feeder_keystringyesThe registry key of the task type.
subject_keystringyesThe stable subject identifier for this task instance.
CHANGEsnooze-task

Snoozes a task until a date or event. The first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually snooze it.

Gate confirm
FieldTypeRequiredDescription
feeder_keystringyesThe registry key of the task type to snooze.
subject_keystringyesThe stable subject identifier for this task instance.
snooze_untilstring | nullnoAn ISO date to snooze until. Provide exactly one of snooze_until or snooze_event.
snooze_eventstring | nullnoA declared event name to snooze until. Provide exactly one of snooze_until or snooze_event.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
CHANGEupdate-ad-hoc-task

Changes a task a person added: its title, note, reminder date, who it is assigned to, or its category. Only the fields you send change; send null to clear one.

FieldTypeRequiredDescription
task_idintegeryesThe id of the task, as create-ad-hoc-task returned it.
titlestringnoWhat needs doing.
descriptionstring | nullnoA note.
remind_onstring | nullnoThe reminder date, YYYY-MM-DD, or null for none.
assigned_user_idinteger | nullnoA member who works the task list, or null for nobody.
categorystring | nullnoOne of: Payments, Locations, Referees, Teams, Player questions; or null.

Team

CHANGEcreate-team

Creates a persisted team in the connected organization. A team belongs to no program until entered into one.

FieldTypeRequiredDescription
namestringyesThe name of the team to create.
CHANGEdelete-team

Retires a team from the organization. Destroys data: the first call previews what would happen and writes nothing; call again with the returned confirmation_token to actually retire it. The retirement is a soft delete — nothing is permanently destroyed by this tool, and its per-program history rows are soft-deleted along with it. Registrations on those with nothing paid, signed or not, are cancelled; each paid player becomes a task to refund or credit them (no money moves here; to settle one now, call refund-registration for their registration, under its own approval). Games not yet played keep their slot with a stand-in side, "Pending Team #N"; games already played keep the team's name and score.

Gate confirm
FieldTypeRequiredDescription
team_idintegeryesThe id of the team to retire.
confirmation_tokenstringnoToken returned by a prior call to confirm this exact action.
READget-team

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

FieldTypeRequiredDescription
team_idintegeryesThe id of the team to retrieve.
READlist-teams

Lists persisted teams in the connected organization.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEupdate-team

Renames a team. Only the fields supplied are changed; omitted fields are left as they are. The team's slug never changes as a result of this call.

FieldTypeRequiredDescription
team_idintegeryesThe id of the team to update.
namestringnoThe new name of the team.

Utilisation

READget-utilisation-ledger

Computes the classified, priced location-hour utilisation ledger (booked/empty/blacked-out/wasted-in-prime), rolled up by area, in the connected organization. A draft game books its hour (draft: true on the segment), so a schedule read before publish shows the plan.

FieldTypeRequiredDescription
location_idintegernoOptional location filter.
program_idintegernoOptional program filter.
area_idintegernoOptional area filter. A level-1 area includes its level-2 areas.
fromstringyesStart of the date range.
tostringyesEnd of the date range, within one year of from.

Waiver

CHANGEcreate-waiver

Adds a waiver to the organization at version 1. With is_default true it becomes the default, which every program without an assigned waiver asks registrants to accept. Hollis records acceptance of the text; it is not an e-signature product.

FieldTypeRequiredDescription
namestringyesThe waiver's name, unique in the organization, e.g. "Indoor facilities waiver".
bodystringyesThe 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_defaultbooleannoMake this the organization's default waiver. Defaults to false.
READget-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).

FieldTypeRequiredDescription
waiver_idintegeryesThe id of the waiver (list-waivers).
READlist-waivers

Lists the organization's waivers, the default first: id, name, current version and whether it is the default. A program uses its assigned waiver, or the default when none is assigned. Use get-waiver for the text.

FieldTypeRequiredDescription
cursorstringnoOpaque pagination cursor returned by a previous call.
limitintegernoMaximum number of items to return (capped at 100).
CHANGEupdate-waiver

Renames a waiver, changes its text, or makes it the default. A changed text is a NEW VERSION: earlier versions and the acceptances recorded against them are kept, and registrants accept the new version from their next registration. The default cannot be un-set directly; make another waiver the default instead.

FieldTypeRequiredDescription
waiver_idintegeryesThe id of the waiver (list-waivers).
namestringnoA new name, unique in the organization.
bodystringnoThe 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_defaultbooleannotrue makes this the organization's default waiver.