Call as soon as the user has told you the event and registration type (registerForRace/findRaces's AWAITING_EVENT_SELECTION step asks for exactly those two, nothing else) — do NOT wait for first name, last name, email, or phone, and do NOT call this right after registerForRace before a registration type is known. Call it right after the user replies with event + registration type, and before completeRaceRegistration. Do NOT ask the user for first name/last name/email/phone/age/DOB/address/etc. yourself before calling this — that field list only comes from here; inventing it yourself causes duplicate questions once you do call this tool. Individual registration only — this app does not support group/family registration. Pass the raceId from registerForRace's structuredContent.raceId or findRaces' structuredContent.resolvedRace.raceId if you have it. If you don't have it in your current context (e.g. it was resolved in an earlier turn you can't see), OMIT raceId entirely rather than inventing one, refusing, or asking the user for it — the server automatically falls back to the most recently resolved race for this conversation. Pass the exact registrationType name the user selected (e.g. 'Runner') — some fields (like shirt size) depend on which registration type was chosen. Shirt styles, add-on products, and team eligibility are ALSO specific to the registration type — a different type for the same race can have a completely different shirt/add-on catalog. If you already called this tool earlier in the conversation for a DIFFERENT registration type, that response's catalog is now stale and does NOT apply — never merge, carry over, or reuse a shirt/add-on item from a prior call into this one; use only what THIS call's content[0].text/structuredContent actually returned. Looks up whether this race's director enabled extra fields beyond first name, last name, email, event, and registration type — possible fields are age, date of birth, gender, expected pace, shirt size, address, emergency contact, and disclaimer agreement. AFTER TOOL RETURNS: content[0].text is pre-split into paragraphs (separated by a blank line) — one paragraph per conversational step, entirely dynamic on what THIS race actually has configured (a race with no shirts/add-ons/donation/teams still ends with the coupon paragraph, so there are always at least 2). Send ONLY ONE paragraph per chat message, in order, and WAIT for the user's reply before sending the next one — never send two or more of these paragraphs together in the same turn, even if they seem short or related (e.g. the team paragraph and the coupon paragraph are two separate asks — finish one, get their answer, then move to the next). Copy each paragraph verbatim when you send it (don't rewrite, reformat, or merge it with another). Order: STEP 1 — the required-fields paragraph (and, right after the user answers it, the disclaimer paragraph too if this race has one — that's its own follow-up message, then wait again for their yes/no before moving on): already written as one flowing sentence covering first name, last name, email, phone number, and every extra field this race's director requires (age, DOB, address, gender, pace, emergency contact, etc. — whichever this specific race actually enabled). Send it and WAIT — do NOT also send any later paragraph yet. IF you're calling this tool late — the user already volunteered some or all of this info earlier in the conversation, e.g. as a catch-up right before completeRaceRegistration — do NOT resend this paragraph as a new question; read it silently, match it against what the user already told you, and only ask about anything genuinely still missing (or nothing, and skip straight to STEP 2, if you already have it all). STEP 2 — every remaining paragraph, one topic per turn: this race's own optional catalog extras (if any — shirt, then add-ons, then donation, then team, in that order, whichever this race actually has), and finally the coupon-code question, which always comes last. Send the next paragraph, wait for the user's reply, then send the following one — repeat until the coupon paragraph has been sent and answered. Never invent a shirt style/size, add-on product, or any other line not actually in one of these paragraphs — including one you remember from an earlier getRaceRegistrationFields call for a DIFFERENT registration type this same conversation; that catalog is stale and doesn't carry over, always use only what THIS call actually returned. As each reply comes in: when a shirt catalog (style + sizes) was shown, collect BOTH shirtStyle and shirtSize for completeRaceRegistration instead of a free-text guess; when only a plain shirt-size ask was shown (no catalog for this registration type), just take shirtSize as plain text — shirt STYLE is always optional even when size is required. Pass chosen add-ons as addOnSelections. Treat the donation paragraph as optional — pass an amount as donationAmount only if the user wants one. If a team paragraph was shown, it offers both joining an existing team and creating a new one — find out which the user wants; if joining, call getRaceTeams next to get the real team list/ids (never invent a team id); if creating, just take their chosen team name and pass teamChoice 'create' with it as teamName directly to completeRaceRegistration (no need to call getRaceTeams first for that path); otherwise leave teamChoice as 'none'. Read their answer to the coupon paragraph and pass it as couponCode to completeRaceRegistration (empty if they said no) — do NOT ask the coupon question again separately, it was already asked here. Never insist on anything from STEP 2, all of it is optional. Then call completeRaceRegistration — never skip this tool call before it.
getRaceRegistrationFields