Generate official sweepstakes rules via the 14-step wizard. BEFORE CALLING: 1) fetch_sweepstakes to get token, dates, name. 2) get_business + get_profile to pre-fill sponsor fields. 3) fetch_rules to check for existing primary rules — if primary exists, warn user new rules will be SECONDARY. Ask wizard questions in order (steps A-N), one at a time or in small groups. Only ask for data you cannot get from API calls. PRIMARY RULES LINK: If result is_primary=true, give user the URL: https://swpp.me/r/[handler] (handler in lowercase from fetch_sweepstakes). RULES LANGUAGE: Always set rules_language="en". The wizard generates ALL legal text server-side — NEVER compose rules language yourself. AMOE URL: The AMOE URL is NOT the entry page URL — the wizard handles AMOE language automatically based on method_of_entry. AGE GATE: Only activate Age Gate when min_age=2 (21+). NEVER for min_age=1 (18+) or min_age=3 (13+). AGE-RESTRICTED PRODUCTS: two independent 21+ triggers. Alcohol (alcohol_sweeps=1) applies only when the SPONSOR produces or manufactures alcohol — a retailer that merely sells it is 2. Tobacco, nicotine and vaping (nicotine_tobacco_sweeps=1) has NO such distinction: federal Tobacco 21 sets 21 for every tobacco and nicotine product, whoever sponsors it. Do not apply the producer/retailer reasoning to a vape or tobacco promotion — it is 21+ either way. Either trigger requires min_age=2. A nicotine promotion additionally needs states=4 with Massachusetts, Michigan and Virginia left out (those three prohibit tobacco sweepstakes), and the prize may never be the product itself — a discount or a coupon redeemed at a paid age-verified purchase is the permitted shape. SPONSOR DATA: every sponsor field is published verbatim in a public legal document. Take it from the user or from get_business for THIS promotion — never from an earlier conversation, another sweepstakes, or your own memory — show the complete block to the user, get their approval, and only then set sponsor_data_confirmed: true. If a value is missing, ask; never fill it with a plausible guess, and never use a placeholder domain (example.com, .example, .test) in any URL. REGISTRATION AND BONDING: prizes with an ARV over USD 5,000 require registration and a surety bond in Florida and New York (Rhode Island adds a registration requirement of its own for retail promotions). Always name the USD 5,000 threshold AND all three states when the prize value is near or above it, and offer the states values that exclude them: 5 (excl. FL, NY), 6 (excl. FL, NY, RI), 8 and 9 for the Canada variants. GEOLOCATION: Use the states parameter for geographic eligibility. NEVER use GeoLocation entry settings for state restrictions — GeoLocation is for GPS/IP boundaries only.
# create_rules_wizard
## When to use
Generate official sweepstakes rules via the 14-step wizard. BEFORE CALLING: 1) fetch_sweepstakes to get token, dates, name. 2) get_business + get_profile to pre-fill sponsor fields. 3) fetch_rules to check for existing primary rules — if primary exists, warn user new rules will be SECONDARY. Ask wizard questions in order (steps A-N), one at a time or in small groups. Only ask for data you cannot get from API calls. PRIMARY RULES LINK: If result is_primary=true, give user the URL: https://swpp.me/r/[handler] (handler in lowercase from fetch_sweepstakes). RULES LANGUAGE: Always set rules_language="en". The wizard generates ALL legal text server-side — NEVER compose rules language yourself. AMOE URL: The AMOE URL is NOT the entry page URL — the wizard handles AMOE language automatically based on method_of_entry. AGE GATE: Only activate Age Gate when min_age=2 (21+). NEVER for min_age=1 (18+) or min_age=3 (13+). GEOLOCATION: Use the states parameter for geographic eligibility. NEVER use GeoLocation entry settings for state restrictions — GeoLocation is for GPS/IP boundaries only.
## Pre-calls required
1. `fetch_sweepstakes` if the user gave you a sweepstakes name instead of a token
2. `fetch_rules(sweepstakes_token)` — if primary rules already exist, WARN that new rules will be SECONDARY (not published)
3. `get_business` — auto-populate sponsor info (legal name, address)
4. `get_entry_settings` — confirm AMOE state matches the entry method
## Parameters to validate before calling
- `sweepstakes_token` (string, required) — Sweepstakes token (UUID). Get via fetch_sweepstakes.
- `arv` (number, required) — one of: `1`, `2` — Approximate Retail Value threshold. 1 = ARV >= $5,000. 2 = ARV < $5,000.
- `alcohol_sweeps` (number, required) — one of: `1`, `2` — Does the SPONSOR produce or manufacture alcoholic products? 1 = Yes, 2 = No. Only producers/manufacturers count: a retailer, store, supermarket, bar or restaurant that merely sells alcohol is NOT an alcohol sponsor and should be 2. The trigger is who the sponsor is, not what the prize is — a brewery giving away concert tickets is 1. When 1, min_age must be 2 (21+).
- `sweepstakes_name` (string, required) — Official promotional name (6-60 characters).
- `start_date` (string, required) — Start date (YYYY-MM-DD).
- `start_time` (string, required) — Start time (e.g. "09:00 AM" or "14:00").
- `start_timezone` (string, required) — Start timezone (e.g. "US/Eastern", "EST", "CST").
- `end_date` (string, required) — End date (YYYY-MM-DD).
- `end_time` (string, required) — End time (e.g. "11:59 PM" or "23:59").
- `end_timezone` (string, required) — End timezone.
- `prize_description` (string, required) — Detailed prize description (max 5000 chars).
- `prize_include_travel` (boolean, required) — Does the prize include travel?
- `prize_is_vehicle` (boolean, required) — Is the prize a vehicle?
- `prize_value` (number, required) — Total prize value in USD. Must be > 0.
- `entry_period_selector` (number, required) — one of: `1`, `2` — 1 = single drawing period, 2 = multiple entry periods.
- `sponsor_name` (string, required) — Legal sponsor name. Pre-fill from get_business.
- `sponsor_address` (string, required) — Sponsor street address. Pre-fill from get_business.
- `sponsor_city` (string, required) — Sponsor city. Pre-fill from get_business.
- `sponsor_state` (string, required) — Sponsor state or abbreviation. Pre-fill from get_business.
- `sponsor_zip_code` (string, required) — Sponsor zip code (5 digits). Pre-fill from get_business.
- `method_of_entry` (number, required) — one of: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8` — Entry method: 1=Website, 2=SMS, 3=Social Media, 4=Other, 5=Purchase ($1=1 entry), 6=Purchase (1 order=1 entry), 7=Donation, 8=Subscription.
- `min_age` (number, required) — one of: `1`, `2`, `3` — Minimum age: 1=18+, 2=21+, 3=13+ with parental consent.
- `states` (number, required) — one of: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10` — Geographic eligibility. 1 = 48 contiguous US + DC. 2 = 50 US + DC. 3 = 50 US + DC + US Virgin Islands + Puerto Rico. 4 = specific states (requires list_of_states). 5 = 50 US + DC excluding FL and NY. 6 = 50 US + DC excluding FL, NY and RI. 7 = 50 US + DC + Canada. 8 = 50 US + DC + Canada excluding FL and NY. 9 = 50 US + DC + Canada excluding FL, NY and RI. 10 = Canada only. Values 5, 6, 8 and 9 exist to avoid the registration/bonding requirements of FL, NY and RI. Values 7-10 include Canada: the rules must state that Canadian winners answer a mathematical skill-testing question to receive the prize.
- `privacy_policy_url` (string, required) — Privacy policy URL (min 11 chars, must include http/https).
- `sweeppea_entry_page` (number, required) — one of: `1`, `2`, `3` — 1 = Sweeppea hosted page, 2 = custom URL, 3 = none.
- `winners_to_draw` (number, optional) — Number of winners to draw (>= 1). Required when entry_period_selector = 1.
- `winner_drawing_date` (string, optional) — Drawing date (YYYY-MM-DD). Required when entry_period_selector = 1.
- `winner_drawing_time` (string, optional) — Drawing time. Required when entry_period_selector = 1.
- `winner_drawing_timezone` (string, optional) — Drawing timezone. Required when entry_period_selector = 1.
- `winner_notification_date` (string, optional) — Winner notification date (YYYY-MM-DD). Required when entry_period_selector = 1.
- `winner_notification_time` (string, optional) — Winner notification time. Required when entry_period_selector = 1.
- `winner_notification_timezone` (string, optional) — Winner notification timezone. Required when entry_period_selector = 1.
- `entry_period_items` (array, optional) — Array of period objects. Required when entry_period_selector = 2. Each object: { start_date, start_time, end_date, end_time, drawing_date, winners_drawn, notification_date, prize_description, prize_value }.
- `sponsor_telephone` (string, optional) — Sponsor phone number (optional). Pre-fill from get_profile.
- `sponsor_email` (string, optional) — Sponsor email (optional). Pre-fill from get_profile.
- `social_media_entry_description` (string, optional) — Social media entry details. Required when method_of_entry = 3.
- `other_description` (string, optional) — Other entry method description. Required when method_of_entry = 4.
- `sponsor_ecommerce_store_url_a` (string, optional) — Ecommerce store URL. Required when method_of_entry = 5.
- `sponsor_ecommerce_store_url_b` (string, optional) — Ecommerce store URL. Required when method_of_entry = 6.
- `sponsor_donations_acceptance_page_url` (string, optional) — Donations acceptance page URL. Required when method_of_entry = 7.
- `sponsor_ecommerce_store_url_c` (string, optional) — Ecommerce/subscription store URL. Required when method_of_entry = 8.
- `total_number_of_entries_awarded_amoe` (number, optional) — Total entries awarded via AMOE (>= 1). Required when method_of_entry is 5, 6, 7, or 8.
- `limit_or_max_number_of_entries_amoe` (number, optional) — Max entries via AMOE (>= 1). Required when method_of_entry is 5, 6, 7, or 8.
- `list_of_states` (array, optional) — Array of state names. Required when states = 4.
- `custom_entry_page` (string, optional) — Custom entry page URL (min 11 chars). Required when sweeppea_entry_page = 2.
- `sponsor_offering_multiplier` (number, optional) — one of: `1`, `2` — Is sponsor offering entry multiplier? 1=Yes, 2=No. Default: 2.
- `sponsor_awarding_bonus_email_social` (number, optional) — one of: `1`, `2` — Awarding bonus for email/social? 1=Yes, 2=No. Default: 2.
- `sponsor_asking_to_submit_video` (number, optional) — one of: `1`, `2` — Asking for video submission? 1=Yes, 2=No. Default: 2.
- `rules_language` (string, optional) — Rules language code. MUST always be "en" (English). The wizard generates all legal text server-side using its own templates — NEVER compose or modify rules language yourself.
## Notes
- Compliance pre-checks: ARV > $5,000 + FL/NY not excluded → WARN about bonding/registration
- ARV > $500 + sponsor is an RI retailer + entry requires a store visit → WARN about RI registration (all three conditions must be met)
- Purchase/donation/subscription entry → VERIFY AMOE is configured
- alcohol_sweeps=1 ONLY when the SPONSOR produces/manufactures alcoholic products — a retailer, store, bar or restaurant that merely sells alcohol is 2; the prize is irrelevant (a brewery giving away concert tickets is 1)
- Alcohol = yes → VERIFY min_age=21 and Age Gate active; in AL, IN, ME, MD, NC, VT and WV, State Alcohol Board approval is required before launch — warn the user
- states 5/6/8/9 exist to exclude the FL/NY/RI registration-and-bonding states; 7-10 include Canada (10 is Canada ONLY)
- Open to Canada (states 7-10) → the rules must state the mathematical skill-testing question for Canadian winners; Quebec-only or Quebec-designated prizes → RACJ registration + French translation of the rules (Canada-wide needs neither)
- Age < 13 → REFUSE (COPPA violation)
- After creation: call `fetch_rules` to verify; use `update_rule` for corrections
- at the end of the Official Rules document always include a copyright notice that say "All rights reserved."